#26 api to return narration verse sync

This commit is contained in:
Hamid Reza Mohammadi 2020-11-05 10:14:59 +03:30
parent c99f8d464a
commit b00c5c16c6
5 changed files with 132 additions and 0 deletions

View File

@ -142,6 +142,24 @@ namespace RMuseum.Controllers
return Ok(System.IO.File.ReadAllText(narration.Result.LocalXmlFilePath));
}
/// <summary>
/// Gets Verse Sync Information
/// </summary>
/// <param name="id">narration id</param>
/// <returns></returns>
[HttpGet("verses/{id}")]
[AllowAnonymous]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(string))]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
public async Task<IActionResult> GetPoemNarrationVerseSyncArray(int id)
{
RServiceResult<NarrationVerseSync[]> verses =
await _audioService.GetPoemNarrationVerseSyncArray(id);
if (!string.IsNullOrEmpty(verses.ExceptionString))
return BadRequest(verses.ExceptionString);
return Ok(verses.Result);
}
/// <summary>
/// updates narration metadata
/// </summary>

View File

@ -0,0 +1,23 @@
namespace RMuseum.Models.GanjoorAudio.ViewModels
{
/// <summary>
/// Verse Sync Range
/// </summary>
public class NarrationVerseSync
{
/// <summary>
/// Verse Order
/// </summary>
public int VerseOrder { get; set; }
/// <summary>
/// Verse Text
/// </summary>
public string VerseText { get; set; }
/// <summary>
/// Audio Start in Milliseconds
/// </summary>
public int AudioStartMilliseconds { get; set; }
}
}

View File

@ -657,6 +657,13 @@
<param name="id"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.AudioNarrationController.GetPoemNarrationVerseSyncArray(System.Int32)">
<summary>
Gets Verse Sync Information
</summary>
<param name="id">narration id</param>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.AudioNarrationController.UpdatePoemNarration(System.Int32,RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationUpdateViewModel)">
<summary>
updates narration metadata
@ -1989,6 +1996,26 @@
is default
</summary>
</member>
<member name="T:RMuseum.Models.GanjoorAudio.ViewModels.NarrationVerseSync">
<summary>
Verse Sync Range
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.NarrationVerseSync.VerseOrder">
<summary>
Verse Order
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.NarrationVerseSync.VerseText">
<summary>
Verse Text
</summary>
</member>
<member name="P:RMuseum.Models.GanjoorAudio.ViewModels.NarrationVerseSync.AudioStartMilliseconds">
<summary>
Audio Start in Milliseconds
</summary>
</member>
<member name="T:RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationModerationResult">
<summary>
Moderation Result
@ -3959,6 +3986,13 @@
<param name="id"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IAudioNarrationService.GetPoemNarrationVerseSyncArray(System.Int32)">
<summary>
Gets Verse Sync Range Information
</summary>
<param name="id">narration id</param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IAudioNarrationService.UpdatePoemNarration(System.Int32,RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationUpdateViewModel)">
<summary>
updates metadata for narration
@ -4763,6 +4797,13 @@
<param name="id"></param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.AudioNarrationService.GetPoemNarrationVerseSyncArray(System.Int32)">
<summary>
Gets Verse Sync Range Information
</summary>
<param name="id">narration id</param>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.AudioNarrationService.UpdatePoemNarration(System.Int32,RMuseum.Models.GanjoorAudio.ViewModels.PoemNarrationUpdateViewModel)">
<summary>
updates metadata for narration

View File

@ -30,6 +30,13 @@ namespace RMuseum.Services
/// <returns></returns>
Task<RServiceResult<PoemNarrationViewModel>> Get(int id);
/// <summary>
/// Gets Verse Sync Range Information
/// </summary>
/// <param name="id">narration id</param>
/// <returns></returns>
Task<RServiceResult<NarrationVerseSync[]>> GetPoemNarrationVerseSyncArray(int id);
/// <summary>
/// updates metadata for narration
/// </summary>

View File

@ -19,6 +19,7 @@ using System.Data;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace RMuseum.Services.Implementation
{
@ -91,6 +92,48 @@ namespace RMuseum.Services.Implementation
}
}
/// <summary>
/// Gets Verse Sync Range Information
/// </summary>
/// <param name="id">narration id</param>
/// <returns></returns>
public async Task<RServiceResult<NarrationVerseSync[]>> GetPoemNarrationVerseSyncArray(int id)
{
try
{
var narration = await _context.AudioFiles.Where(a => a.Id == id).SingleOrDefaultAsync();
var verses = await _context.GanjoorVerses.Where(v => v.PoemId == narration.GanjoorPostId).ToListAsync();
string xml = File.ReadAllText(narration.LocalXmlFilePath);
List<NarrationVerseSync> verseSyncs = new List<NarrationVerseSync>();
XElement elObject = XDocument.Parse(xml).Root;
foreach (var syncInfo in elObject.Element("PoemAudio").Element("SyncArray").Elements("SyncInfo"))
{
int verseOrder = int.Parse(syncInfo.Element("VerseOrder").Value);
if (verseOrder < 0) //this happens, seems to be a bug, I did not trace it yet
verseOrder = 0;
var verse = verses.Where(v => v.VOrder == verseOrder).Single();
if(verse != null)
{
verseSyncs.Add(new NarrationVerseSync()
{
VerseOrder = verseOrder,
VerseText = verse.Text,
AudioStartMilliseconds = int.Parse(syncInfo.Element("AudioMiliseconds").Value)
});
}
}
return new RServiceResult<NarrationVerseSync[]>(verseSyncs.ToArray());
}
catch (Exception exp)
{
return new RServiceResult<NarrationVerseSync[]>(null, exp.ToString());
}
}
/// <summary>
/// updates metadata for narration
/// </summary>