commit
afa5e5025b
@ -1423,7 +1423,7 @@ namespace RMuseum.Controllers
|
|||||||
loggedOnUserId,
|
loggedOnUserId,
|
||||||
new Guid(User.Claims.FirstOrDefault(c => c.Type == "SessionId").Value),
|
new Guid(User.Claims.FirstOrDefault(c => c.Type == "SessionId").Value),
|
||||||
RMuseumSecurableItem.NoteEntityShortName,
|
RMuseumSecurableItem.NoteEntityShortName,
|
||||||
RMuseumSecurableItem.ModerateCommentsOperationShortName
|
RMuseumSecurableItem.ModerateOperationShortName
|
||||||
);
|
);
|
||||||
if (!string.IsNullOrEmpty(canModerate.ExceptionString))
|
if (!string.IsNullOrEmpty(canModerate.ExceptionString))
|
||||||
return BadRequest(canModerate.ExceptionString);
|
return BadRequest(canModerate.ExceptionString);
|
||||||
@ -1460,7 +1460,7 @@ namespace RMuseum.Controllers
|
|||||||
loggedOnUserId,
|
loggedOnUserId,
|
||||||
new Guid(User.Claims.FirstOrDefault(c => c.Type == "SessionId").Value),
|
new Guid(User.Claims.FirstOrDefault(c => c.Type == "SessionId").Value),
|
||||||
RMuseumSecurableItem.NoteEntityShortName,
|
RMuseumSecurableItem.NoteEntityShortName,
|
||||||
RMuseumSecurableItem.ModerateCommentsOperationShortName
|
RMuseumSecurableItem.ModerateOperationShortName
|
||||||
);
|
);
|
||||||
if (!string.IsNullOrEmpty(canModerate.ExceptionString))
|
if (!string.IsNullOrEmpty(canModerate.ExceptionString))
|
||||||
return BadRequest(canModerate.ExceptionString);
|
return BadRequest(canModerate.ExceptionString);
|
||||||
|
|||||||
@ -1,10 +1,14 @@
|
|||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using RMuseum.Models.Auth.Memory;
|
using RMuseum.Models.Auth.Memory;
|
||||||
|
using RMuseum.Models.GanjoorAudio;
|
||||||
|
using RMuseum.Models.GanjoorAudio.ViewModels;
|
||||||
using RMuseum.Services;
|
using RMuseum.Services;
|
||||||
using RSecurityBackend.Models.Generic;
|
using RSecurityBackend.Models.Generic;
|
||||||
using RSecurityBackend.Services;
|
using RSecurityBackend.Services;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
@ -16,6 +20,53 @@ namespace RMuseum.Controllers
|
|||||||
public class AudioNarrationController : Controller
|
public class AudioNarrationController : Controller
|
||||||
{
|
{
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets audio narrations, user must have narration::moderate permission to be able to see all users narrations
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="paging"></param>
|
||||||
|
/// <param name="allUsers">default: false, user must have narration::moderate permission to be able to see all users narrations</param>
|
||||||
|
/// <param name="status">default: -1, unfiltered</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpGet]
|
||||||
|
[Authorize]
|
||||||
|
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(IEnumerable<PoemNarrationViewModel>))]
|
||||||
|
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
|
||||||
|
[ProducesResponseType((int)HttpStatusCode.Forbidden, Type = typeof(string))]
|
||||||
|
|
||||||
|
public async Task<IActionResult> Get([FromQuery] PagingParameterModel paging, bool allUsers = false, AudioReviewStatus status = AudioReviewStatus.All )
|
||||||
|
{
|
||||||
|
Guid loggedOnUserId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
|
||||||
|
Guid sessionId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "SessionId").Value);
|
||||||
|
|
||||||
|
if (allUsers)
|
||||||
|
{
|
||||||
|
RServiceResult<bool>
|
||||||
|
canView =
|
||||||
|
await _userPermissionChecker.Check
|
||||||
|
(
|
||||||
|
loggedOnUserId,
|
||||||
|
sessionId,
|
||||||
|
RMuseumSecurableItem.AudioNarrationEntityShortName,
|
||||||
|
RMuseumSecurableItem.ModerateOperationShortName
|
||||||
|
);
|
||||||
|
if (!string.IsNullOrEmpty(canView.ExceptionString))
|
||||||
|
return BadRequest(canView.ExceptionString);
|
||||||
|
|
||||||
|
if (!canView.Result)
|
||||||
|
return StatusCode((int)HttpStatusCode.Forbidden);
|
||||||
|
}
|
||||||
|
|
||||||
|
var res = await _audioService.GetAll(paging, allUsers ? Guid.Empty : loggedOnUserId, status);
|
||||||
|
if(!string.IsNullOrEmpty(res.ExceptionString))
|
||||||
|
return BadRequest(res.ExceptionString);
|
||||||
|
|
||||||
|
// Paging Header
|
||||||
|
HttpContext.Response.Headers.Add("paging-headers", JsonConvert.SerializeObject(res.Result.PagingMeta));
|
||||||
|
|
||||||
|
return Ok(res.Result.Items);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// imports data from ganjoor MySql database
|
/// imports data from ganjoor MySql database
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -51,7 +51,7 @@ namespace RMuseum.Models.Auth.Memory
|
|||||||
///<summary>
|
///<summary>
|
||||||
/// moderate
|
/// moderate
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const string ModerateCommentsOperationShortName = "moderate";
|
public const string ModerateOperationShortName = "moderate";
|
||||||
|
|
||||||
///<summary>
|
///<summary>
|
||||||
/// review suggested ganjoor links
|
/// review suggested ganjoor links
|
||||||
@ -108,7 +108,7 @@ namespace RMuseum.Models.Auth.Memory
|
|||||||
Description = "یادداشتها",
|
Description = "یادداشتها",
|
||||||
Operations = new SecurableItemOperation[]
|
Operations = new SecurableItemOperation[]
|
||||||
{
|
{
|
||||||
new SecurableItemOperation(ModerateCommentsOperationShortName, "بررسی", false)
|
new SecurableItemOperation(ModerateOperationShortName, "بررسی", false)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
new SecurableItem()
|
new SecurableItem()
|
||||||
@ -118,7 +118,7 @@ namespace RMuseum.Models.Auth.Memory
|
|||||||
Operations = new SecurableItemOperation[]
|
Operations = new SecurableItemOperation[]
|
||||||
{
|
{
|
||||||
new SecurableItemOperation(ImportOperationShortName, "ورود اطلاعات", false),
|
new SecurableItemOperation(ImportOperationShortName, "ورود اطلاعات", false),
|
||||||
new SecurableItemOperation(ModerateCommentsOperationShortName, "بررسی", false)
|
new SecurableItemOperation(ModerateOperationShortName, "بررسی", false)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@ -5,19 +5,27 @@
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public enum AudioReviewStatus
|
public enum AudioReviewStatus
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// All / Unfiltered (for queris)
|
||||||
|
/// </summary>
|
||||||
|
All = -1,
|
||||||
|
/// <summary>
|
||||||
|
/// Draft
|
||||||
|
/// </summary>
|
||||||
|
Draft = 0,
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// pending for review
|
/// pending for review
|
||||||
/// </summary>
|
/// </summary>
|
||||||
Pending = 0,
|
Pending = 1,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// approved
|
/// approved
|
||||||
/// </summary>
|
/// </summary>
|
||||||
Approved = 1,
|
Approved = 2,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Rejected
|
/// Rejected
|
||||||
/// </summary>
|
/// </summary>
|
||||||
Rejected = 2
|
Rejected = 3
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -89,6 +89,11 @@ namespace RMuseum.Models.GanjoorAudio
|
|||||||
/// </remarks>
|
/// </remarks>
|
||||||
public string RemoteXMLFilePath { get { return $"/i/{SoundFilesFolder}/x/{FileNameWithoutExtension}.xml"; } }
|
public string RemoteXMLFilePath { get { return $"/i/{SoundFilesFolder}/x/{FileNameWithoutExtension}.xml"; } }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// XML url
|
||||||
|
/// </summary>
|
||||||
|
public string XMLUrl { get { return $"https://i.ganjoor.net/{SoundFilesFolder}/x/{FileNameWithoutExtension}.xml"; } }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Audio Title
|
/// Audio Title
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
216
RMuseum/Models/GanjoorAudio/ViewModels/PoemNarrationViewModel.cs
Normal file
216
RMuseum/Models/GanjoorAudio/ViewModels/PoemNarrationViewModel.cs
Normal file
@ -0,0 +1,216 @@
|
|||||||
|
using RSecurityBackend.Models.Auth.ViewModels;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace RMuseum.Models.GanjoorAudio.ViewModels
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Poem Narration view model
|
||||||
|
/// </summary>
|
||||||
|
public class PoemNarrationViewModel
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// constructor
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="src"></param>
|
||||||
|
public PoemNarrationViewModel(PoemNarration src)
|
||||||
|
{
|
||||||
|
Id = src.Id;
|
||||||
|
Owner = new PublicRAppUser(src.Owner);
|
||||||
|
GanjoorAudioId = src.GanjoorAudioId;
|
||||||
|
GanjoorPostId = src.GanjoorPostId;
|
||||||
|
AudioOrder = src.AudioOrder;
|
||||||
|
FileNameWithoutExtension = src.FileNameWithoutExtension;
|
||||||
|
SoundFilesFolder = src.SoundFilesFolder;
|
||||||
|
AudioTitle = src.AudioTitle;
|
||||||
|
AudioArtist = src.AudioArtist;
|
||||||
|
AudioArtistUrl = src.AudioArtistUrl;
|
||||||
|
AudioSrc = src.AudioSrc;
|
||||||
|
AudioSrcUrl = src.AudioSrcUrl;
|
||||||
|
LegacyAudioGuid = src.LegacyAudioGuid;
|
||||||
|
Mp3FileCheckSum = src.Mp3FileCheckSum;
|
||||||
|
Mp3SizeInBytes = src.Mp3SizeInBytes;
|
||||||
|
OggSizeInBytes = src.OggSizeInBytes;
|
||||||
|
LocalMp3FilePath = src.LocalMp3FilePath;
|
||||||
|
LocalXmlFilePath = src.LocalXmlFilePath;
|
||||||
|
ReviewStatus = src.ReviewStatus;
|
||||||
|
UploadDate = src.UploadDate;
|
||||||
|
ReviewDate = src.ReviewDate;
|
||||||
|
List<AudioSyncStatus> lst = new List<AudioSyncStatus>();
|
||||||
|
foreach(AudioSyncStatus status in
|
||||||
|
new AudioSyncStatus[]
|
||||||
|
{
|
||||||
|
AudioSyncStatus.SynchronizedOrRejected,
|
||||||
|
AudioSyncStatus.NewItem,
|
||||||
|
AudioSyncStatus.MetadataChanged,
|
||||||
|
AudioSyncStatus.SoundFilesChanged,
|
||||||
|
AudioSyncStatus.XmlFileChanged,
|
||||||
|
AudioSyncStatus.Deleted
|
||||||
|
})
|
||||||
|
{
|
||||||
|
if(
|
||||||
|
src.AudioSyncStatus == (( (int)status )| src.AudioSyncStatus)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
lst.Add(status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
AudioSyncStatusArray = lst.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Id
|
||||||
|
/// </summary>
|
||||||
|
public Guid Id { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Owner User
|
||||||
|
/// </summary>
|
||||||
|
public PublicRAppUser Owner { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Final data is actually exported to a MySQL database which this auto increment field is its key
|
||||||
|
/// </summary>
|
||||||
|
public int GanjoorAudioId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ganjoor Post Id
|
||||||
|
/// </summary>
|
||||||
|
public int GanjoorPostId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This determines where an audio is displayed between a list of sounds related to a specfic poem
|
||||||
|
/// </summary>
|
||||||
|
public int AudioOrder { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Using this field content you would determine xml, mp3 and ogg file names
|
||||||
|
/// </summary>
|
||||||
|
public string FileNameWithoutExtension { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// combining this with <see cref="FileNameWithoutExtension"/> + .ext would preduce relative path of sound files on our file server the full path would become [HOMEPath] + '/i/' + this value
|
||||||
|
/// </summary>
|
||||||
|
/// <sample>
|
||||||
|
/// "a2"
|
||||||
|
/// </sample>
|
||||||
|
/// <remarks>
|
||||||
|
/// We had previously used different pathes because when a directory became overcrowded our connection time would increase unbearably due to IRAN internet problems, so it is sensible to store it per record and not as a global option value
|
||||||
|
/// </remarks>
|
||||||
|
public string SoundFilesFolder { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// MP3 File Path
|
||||||
|
/// </summary>
|
||||||
|
public string RemoteMp3FilePath { get { return $"/i/{SoundFilesFolder}/{FileNameWithoutExtension}.mp3"; } }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// MP3 url
|
||||||
|
/// </summary>
|
||||||
|
public string Mp3Url { get { return $"https://i.ganjoor.net/{SoundFilesFolder}/{FileNameWithoutExtension}.mp3"; } }
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// OGG File Path
|
||||||
|
/// </summary>
|
||||||
|
public string RemoteOggFilePath { get { return $"/i/{SoundFilesFolder}/{FileNameWithoutExtension}.ogg"; } }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// OGG url
|
||||||
|
/// </summary>
|
||||||
|
public string OggUrl { get { return $"https://i.ganjoor.net/{SoundFilesFolder}/{FileNameWithoutExtension}.ogg"; } }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This is also a legacy field
|
||||||
|
/// </summary>
|
||||||
|
/// <sample>
|
||||||
|
/// "/i/a2/x"
|
||||||
|
/// </sample>
|
||||||
|
/// <remarks>
|
||||||
|
/// XML Schema is defined based on Desktop Ganjoor (https://github.com/ganjoor/ganjoor) code, for
|
||||||
|
/// more information take a look at this code:
|
||||||
|
/// https://github.com/ganjoor/ganjoor/blob/master/ganjoor/Audio%20Support/PoemAudioListProcessor.cs
|
||||||
|
/// </remarks>
|
||||||
|
public string RemoteXMLFilePath { get { return $"/i/{SoundFilesFolder}/x/{FileNameWithoutExtension}.xml"; } }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// XML url
|
||||||
|
/// </summary>
|
||||||
|
public string XMLUrl { get { return $"https://i.ganjoor.net/{SoundFilesFolder}/x/{FileNameWithoutExtension}.xml"; } }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Audio Title
|
||||||
|
/// </summary>
|
||||||
|
public string AudioTitle { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Audio Artist
|
||||||
|
/// </summary>
|
||||||
|
public string AudioArtist { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Audio Artist Url
|
||||||
|
/// </summary>
|
||||||
|
public string AudioArtistUrl { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Audio Source
|
||||||
|
/// </summary>
|
||||||
|
public string AudioSrc { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Audio Src Url
|
||||||
|
/// </summary>
|
||||||
|
public string AudioSrcUrl { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Legacy Audio Guid
|
||||||
|
/// </summary>
|
||||||
|
public Guid LegacyAudioGuid { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Audio File CheckSum
|
||||||
|
/// </summary>
|
||||||
|
public string Mp3FileCheckSum { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// mp3 size in bytes
|
||||||
|
/// </summary>
|
||||||
|
public int Mp3SizeInBytes { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ogg size in bytes
|
||||||
|
/// </summary>
|
||||||
|
public int OggSizeInBytes { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Upload Date
|
||||||
|
/// </summary>
|
||||||
|
public DateTime UploadDate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Review Date (Approve or Reject)
|
||||||
|
/// </summary>
|
||||||
|
public DateTime ReviewDate { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// MP3 File local path on Windows Server (if item is not rejected probably it is not valid and it is deleted)
|
||||||
|
/// </summary>
|
||||||
|
public string LocalMp3FilePath { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// XML File local path on Windows Server (if item is not rejected probably it is not valid and it is deleted)
|
||||||
|
/// </summary>
|
||||||
|
public string LocalXmlFilePath { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Value is one or a combination of <see cref="RMuseum.Models.GanjoorAudio.AudioSyncStatus"/>
|
||||||
|
/// </summary>
|
||||||
|
public AudioSyncStatus[] AudioSyncStatusArray { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Review Status
|
||||||
|
/// </summary>
|
||||||
|
public AudioReviewStatus ReviewStatus { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -620,6 +620,15 @@
|
|||||||
Captcha service
|
Captcha service
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:RMuseum.Controllers.AudioNarrationController.Get(RSecurityBackend.Models.Generic.PagingParameterModel,System.Boolean,RMuseum.Models.GanjoorAudio.AudioReviewStatus)">
|
||||||
|
<summary>
|
||||||
|
Gets audio narrations, user must have narration::moderate permission to be able to see all users narrations
|
||||||
|
</summary>
|
||||||
|
<param name="paging"></param>
|
||||||
|
<param name="allUsers">default: false, user must have narration::moderate permission to be able to see all users narrations</param>
|
||||||
|
<param name="status">default: -1, unfiltered</param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:RMuseum.Controllers.AudioNarrationController.MysqlonetimeImport">
|
<member name="M:RMuseum.Controllers.AudioNarrationController.MysqlonetimeImport">
|
||||||
<summary>
|
<summary>
|
||||||
imports data from ganjoor MySql database
|
imports data from ganjoor MySql database
|
||||||
@ -1404,7 +1413,7 @@
|
|||||||
import
|
import
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="F:RMuseum.Models.Auth.Memory.RMuseumSecurableItem.ModerateCommentsOperationShortName">
|
<member name="F:RMuseum.Models.Auth.Memory.RMuseumSecurableItem.ModerateOperationShortName">
|
||||||
<summary>
|
<summary>
|
||||||
moderate
|
moderate
|
||||||
</summary>
|
</summary>
|
||||||
@ -1534,6 +1543,16 @@
|
|||||||
Audio Review Status
|
Audio Review Status
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="F:RMuseum.Models.GanjoorAudio.AudioReviewStatus.All">
|
||||||
|
<summary>
|
||||||
|
All / Unfiltered (for queris)
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="F:RMuseum.Models.GanjoorAudio.AudioReviewStatus.Draft">
|
||||||
|
<summary>
|
||||||
|
Draft
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
<member name="F:RMuseum.Models.GanjoorAudio.AudioReviewStatus.Pending">
|
<member name="F:RMuseum.Models.GanjoorAudio.AudioReviewStatus.Pending">
|
||||||
<summary>
|
<summary>
|
||||||
pending for review
|
pending for review
|
||||||
@ -1668,6 +1687,11 @@
|
|||||||
https://github.com/ganjoor/ganjoor/blob/master/ganjoor/Audio%20Support/PoemAudioListProcessor.cs
|
https://github.com/ganjoor/ganjoor/blob/master/ganjoor/Audio%20Support/PoemAudioListProcessor.cs
|
||||||
</remarks>
|
</remarks>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.PoemNarration.XMLUrl">
|
||||||
|
<summary>
|
||||||
|
XML url
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
<member name="P:RMuseum.Models.GanjoorAudio.PoemNarration.AudioTitle">
|
<member name="P:RMuseum.Models.GanjoorAudio.PoemNarration.AudioTitle">
|
||||||
<summary>
|
<summary>
|
||||||
Audio Title
|
Audio Title
|
||||||
@ -1743,6 +1767,171 @@
|
|||||||
Review Status
|
Review Status
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="T:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel">
|
||||||
|
<summary>
|
||||||
|
Poem Narration view model
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="M:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.#ctor(RMuseum.Models.GanjoorAudio.PoemNarration)">
|
||||||
|
<summary>
|
||||||
|
constructor
|
||||||
|
</summary>
|
||||||
|
<param name="src"></param>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.Id">
|
||||||
|
<summary>
|
||||||
|
Id
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.Owner">
|
||||||
|
<summary>
|
||||||
|
Owner User
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.GanjoorAudioId">
|
||||||
|
<summary>
|
||||||
|
Final data is actually exported to a MySQL database which this auto increment field is its key
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.GanjoorPostId">
|
||||||
|
<summary>
|
||||||
|
Ganjoor Post Id
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.AudioOrder">
|
||||||
|
<summary>
|
||||||
|
This determines where an audio is displayed between a list of sounds related to a specfic poem
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.FileNameWithoutExtension">
|
||||||
|
<summary>
|
||||||
|
Using this field content you would determine xml, mp3 and ogg file names
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.SoundFilesFolder">
|
||||||
|
<summary>
|
||||||
|
combining this with <see cref="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.FileNameWithoutExtension"/> + .ext would preduce relative path of sound files on our file server the full path would become [HOMEPath] + '/i/' + this value
|
||||||
|
</summary>
|
||||||
|
<sample>
|
||||||
|
"a2"
|
||||||
|
</sample>
|
||||||
|
<remarks>
|
||||||
|
We had previously used different pathes because when a directory became overcrowded our connection time would increase unbearably due to IRAN internet problems, so it is sensible to store it per record and not as a global option value
|
||||||
|
</remarks>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.RemoteMp3FilePath">
|
||||||
|
<summary>
|
||||||
|
MP3 File Path
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.Mp3Url">
|
||||||
|
<summary>
|
||||||
|
MP3 url
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.RemoteOggFilePath">
|
||||||
|
<summary>
|
||||||
|
OGG File Path
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.OggUrl">
|
||||||
|
<summary>
|
||||||
|
OGG url
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.RemoteXMLFilePath">
|
||||||
|
<summary>
|
||||||
|
This is also a legacy field
|
||||||
|
</summary>
|
||||||
|
<sample>
|
||||||
|
"/i/a2/x"
|
||||||
|
</sample>
|
||||||
|
<remarks>
|
||||||
|
XML Schema is defined based on Desktop Ganjoor (https://github.com/ganjoor/ganjoor) code, for
|
||||||
|
more information take a look at this code:
|
||||||
|
https://github.com/ganjoor/ganjoor/blob/master/ganjoor/Audio%20Support/PoemAudioListProcessor.cs
|
||||||
|
</remarks>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.XMLUrl">
|
||||||
|
<summary>
|
||||||
|
XML url
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.AudioTitle">
|
||||||
|
<summary>
|
||||||
|
Audio Title
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.AudioArtist">
|
||||||
|
<summary>
|
||||||
|
Audio Artist
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.AudioArtistUrl">
|
||||||
|
<summary>
|
||||||
|
Audio Artist Url
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.AudioSrc">
|
||||||
|
<summary>
|
||||||
|
Audio Source
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.AudioSrcUrl">
|
||||||
|
<summary>
|
||||||
|
Audio Src Url
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.LegacyAudioGuid">
|
||||||
|
<summary>
|
||||||
|
Legacy Audio Guid
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.Mp3FileCheckSum">
|
||||||
|
<summary>
|
||||||
|
Audio File CheckSum
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.Mp3SizeInBytes">
|
||||||
|
<summary>
|
||||||
|
mp3 size in bytes
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.OggSizeInBytes">
|
||||||
|
<summary>
|
||||||
|
ogg size in bytes
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.UploadDate">
|
||||||
|
<summary>
|
||||||
|
Upload Date
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.ReviewDate">
|
||||||
|
<summary>
|
||||||
|
Review Date (Approve or Reject)
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.LocalMp3FilePath">
|
||||||
|
<summary>
|
||||||
|
MP3 File local path on Windows Server (if item is not rejected probably it is not valid and it is deleted)
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.LocalXmlFilePath">
|
||||||
|
<summary>
|
||||||
|
XML File local path on Windows Server (if item is not rejected probably it is not valid and it is deleted)
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.AudioSyncStatusArray">
|
||||||
|
<summary>
|
||||||
|
Value is one or a combination of <see cref="T:RMuseum.Models.GanjoorAudio.AudioSyncStatus"/>
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
|
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationViewModel.ReviewStatus">
|
||||||
|
<summary>
|
||||||
|
Review Status
|
||||||
|
</summary>
|
||||||
|
</member>
|
||||||
<member name="T:RMuseum.Models.GanjoorIntegration.GanjoorLink">
|
<member name="T:RMuseum.Models.GanjoorIntegration.GanjoorLink">
|
||||||
<summary>
|
<summary>
|
||||||
ganjoor link for artifacts and items
|
ganjoor link for artifacts and items
|
||||||
@ -3029,6 +3218,15 @@
|
|||||||
Audio Narration Service
|
Audio Narration Service
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:RMuseum.Services.IAudioNarrationService.GetAll(RSecurityBackend.Models.Generic.PagingParameterModel,System.Guid,RMuseum.Models.GanjoorAudio.AudioReviewStatus)">
|
||||||
|
<summary>
|
||||||
|
returns list of narrations
|
||||||
|
</summary>
|
||||||
|
<param name="paging"></param>
|
||||||
|
<param name="filteredUserId">send Guid.Empty if you want all narrations</param>
|
||||||
|
<param name="status"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:RMuseum.Services.IAudioNarrationService.OneTimeImport(System.Guid)">
|
<member name="M:RMuseum.Services.IAudioNarrationService.OneTimeImport(System.Guid)">
|
||||||
<summary>
|
<summary>
|
||||||
imports data from ganjoor MySql database
|
imports data from ganjoor MySql database
|
||||||
@ -3749,6 +3947,15 @@
|
|||||||
Audio Narration Service Implementation
|
Audio Narration Service Implementation
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:RMuseum.Services.Implementation.AudioNarrationService.GetAll(RSecurityBackend.Models.Generic.PagingParameterModel,System.Guid,RMuseum.Models.GanjoorAudio.AudioReviewStatus)">
|
||||||
|
<summary>
|
||||||
|
returns list of narrations
|
||||||
|
</summary>
|
||||||
|
<param name="paging"></param>
|
||||||
|
<param name="filteredUserId">send Guid.Empty if you want all narrations</param>
|
||||||
|
<param name="status"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:RMuseum.Services.Implementation.AudioNarrationService.OneTimeImport(System.Guid)">
|
<member name="M:RMuseum.Services.Implementation.AudioNarrationService.OneTimeImport(System.Guid)">
|
||||||
<summary>
|
<summary>
|
||||||
imports data from ganjoor MySql database
|
imports data from ganjoor MySql database
|
||||||
|
|||||||
@ -1,4 +1,6 @@
|
|||||||
using RSecurityBackend.Models.Generic;
|
using RMuseum.Models.GanjoorAudio;
|
||||||
|
using RMuseum.Models.GanjoorAudio.ViewModels;
|
||||||
|
using RSecurityBackend.Models.Generic;
|
||||||
using System;
|
using System;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
@ -9,6 +11,15 @@ namespace RMuseum.Services
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IAudioNarrationService
|
public interface IAudioNarrationService
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// returns list of narrations
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="paging"></param>
|
||||||
|
/// <param name="filteredUserId">send Guid.Empty if you want all narrations</param>
|
||||||
|
/// <param name="status"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public Task<RServiceResult<(PaginationMetadata PagingMeta, PoemNarrationViewModel[] Items)>> GetAll(PagingParameterModel paging, Guid filteredUserId, AudioReviewStatus status);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// imports data from ganjoor MySql database
|
/// imports data from ganjoor MySql database
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -3,21 +3,64 @@ using Microsoft.Extensions.Configuration;
|
|||||||
using MySql.Data.MySqlClient;
|
using MySql.Data.MySqlClient;
|
||||||
using RMuseum.DbContext;
|
using RMuseum.DbContext;
|
||||||
using RMuseum.Models.GanjoorAudio;
|
using RMuseum.Models.GanjoorAudio;
|
||||||
|
using RMuseum.Models.GanjoorAudio.ViewModels;
|
||||||
using RSecurityBackend.Models.Generic;
|
using RSecurityBackend.Models.Generic;
|
||||||
|
using RSecurityBackend.Services.Implementation;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Security.Policy;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace RMuseum.Services.Implementation
|
namespace RMuseum.Services.Implementation
|
||||||
{
|
{
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Audio Narration Service Implementation
|
/// Audio Narration Service Implementation
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class AudioNarrationService : IAudioNarrationService
|
public class AudioNarrationService : IAudioNarrationService
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// returns list of narrations
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="paging"></param>
|
||||||
|
/// <param name="filteredUserId">send Guid.Empty if you want all narrations</param>
|
||||||
|
/// <param name="status"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task<RServiceResult<(PaginationMetadata PagingMeta, PoemNarrationViewModel[] Items)>> GetAll(PagingParameterModel paging, Guid filteredUserId, AudioReviewStatus status)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var source =
|
||||||
|
|
||||||
|
_context.AudioFiles
|
||||||
|
.Include(a => a.Owner)
|
||||||
|
.Where(a =>
|
||||||
|
(filteredUserId == Guid.Empty || a.OwnerId == filteredUserId)
|
||||||
|
&&
|
||||||
|
(status == AudioReviewStatus.All || a.ReviewStatus == status)
|
||||||
|
)
|
||||||
|
.OrderBy(a => a.UploadDate)
|
||||||
|
.AsQueryable();
|
||||||
|
|
||||||
|
(PaginationMetadata PagingMeta, PoemNarration[] Items) paginatedResult =
|
||||||
|
await QueryablePaginator<PoemNarration>.Paginate(source, paging);
|
||||||
|
|
||||||
|
List<PoemNarrationViewModel> res = new List<PoemNarrationViewModel>();
|
||||||
|
foreach(PoemNarration audio in paginatedResult.Items)
|
||||||
|
{
|
||||||
|
res.Add(new PoemNarrationViewModel(audio));
|
||||||
|
}
|
||||||
|
|
||||||
|
return new RServiceResult<(PaginationMetadata PagingMeta, PoemNarrationViewModel[] Items)>((paginatedResult.PagingMeta, res.ToArray()));
|
||||||
|
}
|
||||||
|
catch (Exception exp)
|
||||||
|
{
|
||||||
|
return new RServiceResult<(PaginationMetadata PagingMeta, PoemNarrationViewModel[] Items)>((PagingMeta: null, Items: null), exp.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// imports data from ganjoor MySql database
|
/// imports data from ganjoor MySql database
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -14,17 +14,17 @@
|
|||||||
const int MaxPageSize = 1000;
|
const int MaxPageSize = 1000;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// page number
|
/// page number starting from 1
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int PageNumber { get; set; } = 1;
|
public int PageNumber { get; set; } = 1;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// actual page size
|
/// actual page size (-1 == all items)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private int _pageSize { get; set; } = -1;
|
private int _pageSize { get; set; } = -1;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// settable page size
|
/// settable page size (-1 == all items, 1000 maxpagesize)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int PageSize
|
public int PageSize
|
||||||
{
|
{
|
||||||
|
|||||||
@ -1669,17 +1669,17 @@
|
|||||||
</member>
|
</member>
|
||||||
<member name="P:RSecurityBackend.Models.Generic.PagingParameterModel.PageNumber">
|
<member name="P:RSecurityBackend.Models.Generic.PagingParameterModel.PageNumber">
|
||||||
<summary>
|
<summary>
|
||||||
page number
|
page number starting from 1
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="P:RSecurityBackend.Models.Generic.PagingParameterModel._pageSize">
|
<member name="P:RSecurityBackend.Models.Generic.PagingParameterModel._pageSize">
|
||||||
<summary>
|
<summary>
|
||||||
actual page size
|
actual page size (-1 == all items)
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="P:RSecurityBackend.Models.Generic.PagingParameterModel.PageSize">
|
<member name="P:RSecurityBackend.Models.Generic.PagingParameterModel.PageSize">
|
||||||
<summary>
|
<summary>
|
||||||
settable page size
|
settable page size (-1 == all items, 1000 maxpagesize)
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
<member name="T:RSecurityBackend.Models.Generic.RServiceResult`1">
|
<member name="T:RSecurityBackend.Models.Generic.RServiceResult`1">
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user