diff --git a/RMuseum/Controllers/RecitationController.cs b/RMuseum/Controllers/RecitationController.cs index 41412668..449df1bc 100644 --- a/RMuseum/Controllers/RecitationController.cs +++ b/RMuseum/Controllers/RecitationController.cs @@ -8,6 +8,7 @@ using RMuseum.Models.GanjoorAudio.ViewModels; using RMuseum.Models.UploadSession; using RMuseum.Models.UploadSession.ViewModels; using RMuseum.Services; +using RMuseum.Services.Implementation; using RSecurityBackend.Models.Generic; using RSecurityBackend.Services; using System; @@ -46,6 +47,31 @@ namespace RMuseum.Controllers return Ok(res.Result.Items); } + /// + /// create an RSS file from recent published recitations + /// + /// + /// + [HttpGet("published/rss/{count}")] + [AllowAnonymous] + [ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(FileStreamResult))] + [ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))] + public async Task GetRssFeed(int count = 200) + { + var res = await _audioService.GetPublishedRecitations(new PagingParameterModel() { PageNumber = 1, PageSize = count}, ""); + if (!string.IsNullOrEmpty(res.ExceptionString)) + return BadRequest(res.ExceptionString); + + string rss = await RecitationsRssBuilder.Build(res.Result.Items); + var stream = new MemoryStream(); + var writer = new StreamWriter(stream); + writer.Write(rss); + writer.Flush(); + stream.Position = 0; + + return new FileStreamResult(stream, "application/rss+xml"); + } + /// /// Gets audio narrations, user must have recitation::moderate permission to be able to see all users narrations /// @@ -131,6 +157,8 @@ namespace RMuseum.Controllers return new FileStreamResult(new FileStream(narration.Result.LocalMp3FilePath, FileMode.Open, FileAccess.Read), "audio/mpeg"); } + + /// /// get the corresponding xml file contemnts (xml) for the narration /// diff --git a/RMuseum/RMuseum.csproj b/RMuseum/RMuseum.csproj index e3d3c0d6..ea229d3e 100644 --- a/RMuseum/RMuseum.csproj +++ b/RMuseum/RMuseum.csproj @@ -19,6 +19,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/RMuseum/RMuseum.xml b/RMuseum/RMuseum.xml index 87b0a026..500f2095 100644 --- a/RMuseum/RMuseum.xml +++ b/RMuseum/RMuseum.xml @@ -733,6 +733,13 @@ + + + create an RSS file from recent published recitations + + + + Gets audio narrations, user must have recitation::moderate permission to be able to see all users narrations @@ -5273,6 +5280,18 @@ + + + creates an RSS feed from recitations + + + + + build rss + + + + Internal messaging system implementation diff --git a/RMuseum/Services/Implementation/RecitationsRssBuilder.cs b/RMuseum/Services/Implementation/RecitationsRssBuilder.cs new file mode 100644 index 00000000..dba670f5 --- /dev/null +++ b/RMuseum/Services/Implementation/RecitationsRssBuilder.cs @@ -0,0 +1,82 @@ +using Microsoft.SyndicationFeed; +using Microsoft.SyndicationFeed.Rss; +using RMuseum.Models.GanjoorAudio.ViewModels; +using System; +using System.IO; +using System.Text; +using System.Threading.Tasks; +using System.Xml; + +namespace RMuseum.Services.Implementation +{ + /// + /// creates an RSS feed from recitations + /// + public static class RecitationsRssBuilder + { + /// + /// build rss + /// + /// + /// + public static async Task Build(PublicRecitationViewModel[] recitations) + { + var sw = new StringWriterWithEncoding(Encoding.UTF8); + + using (XmlWriter xmlWriter = XmlWriter.Create(sw, new XmlWriterSettings() { Async = true, Indent = true })) + { + var writer = new RssFeedWriter(xmlWriter); + + await writer.WriteTitle("خوانش‌های گنجور"); + await writer.WriteDescription("روایتهای صوتی اشعار سایت گنجور"); + await writer.Write(new SyndicationLink(new Uri("http://ava.ganjoor.net"))); + await writer.WriteLastBuildDate(recitations.Length > 0 ? recitations[0].PublishDate.ToUniversalTime() : DateTimeOffset.UtcNow); + await writer.WriteLanguage(new System.Globalization.CultureInfo("fa-IR")); + await writer.WriteGenerator("https://ganjgah.ir"); + + foreach(PublicRecitationViewModel recitation in recitations) + { + var item = new SyndicationItem() + { + Id = recitation.LegacyAudioGuid.ToString(), + Title = $"{recitation.PoemFullTitle} با خوانش {recitation.AudioArtist}", + Description = recitation.HtmlText == null ? "" : recitation.HtmlText + .Replace("", "") + .Replace("
", "") + .Replace("
", "") + .Replace("
", "") + .Replace("
", "") + .Replace("
", ""), + Published = recitation.PublishDate.ToUniversalTime(), + }; + + item.AddLink(new SyndicationLink(new Uri($"https://ava.ganjoor.net/#/{recitation.Id}"))); + item.AddCategory(new SyndicationCategory("شعرخوانی")); + item.AddCategory(new SyndicationCategory("ادبیات")); + + await writer.Write(item); + } + + xmlWriter.Flush(); + } + + + return sw.ToString(); + } + } + + class StringWriterWithEncoding : StringWriter + { + private readonly Encoding _encoding; + + public StringWriterWithEncoding(Encoding encoding) + { + this._encoding = encoding; + } + + public override Encoding Encoding + { + get { return _encoding; } + } + } +}