diff --git a/RMuseum/Models/GanjoorAudio/PoemNarration.cs b/RMuseum/Models/GanjoorAudio/PoemNarration.cs
index 8da3ed50..3ecc3522 100644
--- a/RMuseum/Models/GanjoorAudio/PoemNarration.cs
+++ b/RMuseum/Models/GanjoorAudio/PoemNarration.cs
@@ -89,6 +89,11 @@ namespace RMuseum.Models.GanjoorAudio
///
public string RemoteXMLFilePath { get { return $"/i/{SoundFilesFolder}/x/{FileNameWithoutExtension}.xml"; } }
+ ///
+ /// XML url
+ ///
+ public string XMLUrl { get { return $"https://i.ganjoor.net/{SoundFilesFolder}/x/{FileNameWithoutExtension}.xml"; } }
+
///
/// Audio Title
///
diff --git a/RMuseum/Models/GanjoorAudio/ViewModels/PoemNarrationViewModel.cs b/RMuseum/Models/GanjoorAudio/ViewModels/PoemNarrationViewModel.cs
new file mode 100644
index 00000000..9721abb3
--- /dev/null
+++ b/RMuseum/Models/GanjoorAudio/ViewModels/PoemNarrationViewModel.cs
@@ -0,0 +1,214 @@
+using RSecurityBackend.Models.Auth.ViewModels;
+using System;
+using System.Collections.Generic;
+
+namespace RMuseum.Models.GanjoorAudio.ViewModels
+{
+ ///
+ /// Poem Narration view model
+ ///
+ public class PoemNarrationViewModel
+ {
+ ///
+ /// constructor
+ ///
+ ///
+ 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;
+ List lst = new List();
+ 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();
+ }
+
+ ///
+ /// Id
+ ///
+ public Guid Id { get; set; }
+
+ ///
+ /// Owner User
+ ///
+ public PublicRAppUser Owner { get; set; }
+
+ ///
+ /// Final data is actually exported to a MySQL database which this auto increment field is its key
+ ///
+ public int GanjoorAudioId { get; set; }
+
+ ///
+ /// Ganjoor Post Id
+ ///
+ public int GanjoorPostId { get; set; }
+
+ ///
+ /// This determines where an audio is displayed between a list of sounds related to a specfic poem
+ ///
+ public int AudioOrder { get; set; }
+
+ ///
+ /// Using this field content you would determine xml, mp3 and ogg file names
+ ///
+ public string FileNameWithoutExtension { get; set; }
+
+ ///
+ /// combining this with + .ext would preduce relative path of sound files on our file server the full path would become [HOMEPath] + '/i/' + this value
+ ///
+ ///
+ /// "a2"
+ ///
+ ///
+ /// 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
+ ///
+ public string SoundFilesFolder { get; set; }
+
+ ///
+ /// MP3 File Path
+ ///
+ public string RemoteMp3FilePath { get { return $"/i/{SoundFilesFolder}/{FileNameWithoutExtension}.mp3"; } }
+
+ ///
+ /// MP3 url
+ ///
+ public string Mp3Url { get { return $"https://i.ganjoor.net/{SoundFilesFolder}/{FileNameWithoutExtension}.mp3"; } }
+
+
+ ///
+ /// OGG File Path
+ ///
+ public string RemoteOggFilePath { get { return $"/i/{SoundFilesFolder}/{FileNameWithoutExtension}.ogg"; } }
+
+ ///
+ /// OGG url
+ ///
+ public string OggUrl { get { return $"https://i.ganjoor.net/{SoundFilesFolder}/{FileNameWithoutExtension}.ogg"; } }
+
+ ///
+ /// This is also a legacy field
+ ///
+ ///
+ /// "/i/a2/x"
+ ///
+ ///
+ /// 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
+ ///
+ public string RemoteXMLFilePath { get { return $"/i/{SoundFilesFolder}/x/{FileNameWithoutExtension}.xml"; } }
+
+ ///
+ /// XML url
+ ///
+ public string XMLUrl { get { return $"https://i.ganjoor.net/{SoundFilesFolder}/x/{FileNameWithoutExtension}.xml"; } }
+
+ ///
+ /// Audio Title
+ ///
+ public string AudioTitle { get; set; }
+
+ ///
+ /// Audio Artist
+ ///
+ public string AudioArtist { get; set; }
+
+ ///
+ /// Audio Artist Url
+ ///
+ public string AudioArtistUrl { get; set; }
+
+ ///
+ /// Audio Source
+ ///
+ public string AudioSrc { get; set; }
+
+ ///
+ /// Audio Src Url
+ ///
+ public string AudioSrcUrl { get; set; }
+
+ ///
+ /// Legacy Audio Guid
+ ///
+ public Guid LegacyAudioGuid { get; set; }
+
+ ///
+ /// Audio File CheckSum
+ ///
+ public string Mp3FileCheckSum { get; set; }
+
+ ///
+ /// mp3 size in bytes
+ ///
+ public int Mp3SizeInBytes { get; set; }
+
+ ///
+ /// ogg size in bytes
+ ///
+ public int OggSizeInBytes { get; set; }
+
+ ///
+ /// Upload Date
+ ///
+ public DateTime UploadDate { get; set; }
+
+ ///
+ /// Review Date (Approve or Reject)
+ ///
+ public DateTime ReviewDate { get; set; }
+
+ ///
+ /// MP3 File local path on Windows Server (if item is not rejected probably it is not valid and it is deleted)
+ ///
+ public string LocalMp3FilePath { get; set; }
+
+ ///
+ /// XML File local path on Windows Server (if item is not rejected probably it is not valid and it is deleted)
+ ///
+ public string LocalXmlFilePath { get; set; }
+
+ ///
+ /// Value is one or a combination of
+ ///
+ public AudioSyncStatus[] AudioSyncStatusArray { get; set; }
+
+ ///
+ /// Review Status
+ ///
+ public AudioReviewStatus ReviewStatus { get; set; }
+ }
+}
diff --git a/RMuseum/RMuseum.xml b/RMuseum/RMuseum.xml
index 2a51a003..80293aaf 100644
--- a/RMuseum/RMuseum.xml
+++ b/RMuseum/RMuseum.xml
@@ -1668,6 +1668,11 @@
https://github.com/ganjoor/ganjoor/blob/master/ganjoor/Audio%20Support/PoemAudioListProcessor.cs
+
+
+ XML url
+
+
Audio Title
@@ -1743,6 +1748,171 @@
Review Status
+
+
+ Poem Narration view model
+
+
+
+
+ constructor
+
+
+
+
+
+ Id
+
+
+
+
+ Owner User
+
+
+
+
+ Final data is actually exported to a MySQL database which this auto increment field is its key
+
+
+
+
+ Ganjoor Post Id
+
+
+
+
+ This determines where an audio is displayed between a list of sounds related to a specfic poem
+
+
+
+
+ Using this field content you would determine xml, mp3 and ogg file names
+
+
+
+
+ combining this with + .ext would preduce relative path of sound files on our file server the full path would become [HOMEPath] + '/i/' + this value
+
+
+ "a2"
+
+
+ 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
+
+
+
+
+ MP3 File Path
+
+
+
+
+ MP3 url
+
+
+
+
+ OGG File Path
+
+
+
+
+ OGG url
+
+
+
+
+ This is also a legacy field
+
+
+ "/i/a2/x"
+
+
+ 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
+
+
+
+
+ XML url
+
+
+
+
+ Audio Title
+
+
+
+
+ Audio Artist
+
+
+
+
+ Audio Artist Url
+
+
+
+
+ Audio Source
+
+
+
+
+ Audio Src Url
+
+
+
+
+ Legacy Audio Guid
+
+
+
+
+ Audio File CheckSum
+
+
+
+
+ mp3 size in bytes
+
+
+
+
+ ogg size in bytes
+
+
+
+
+ Upload Date
+
+
+
+
+ Review Date (Approve or Reject)
+
+
+
+
+ MP3 File local path on Windows Server (if item is not rejected probably it is not valid and it is deleted)
+
+
+
+
+ XML File local path on Windows Server (if item is not rejected probably it is not valid and it is deleted)
+
+
+
+
+ Value is one or a combination of
+
+
+
+
+ Review Status
+
+
ganjoor link for artifacts and items