#166 generating main mundex page

This commit is contained in:
Hamid Reza Mohammadi 2021-06-29 19:49:13 +04:30
parent dc58904e6c
commit f635f2bee4
7 changed files with 199 additions and 3 deletions

View File

@ -163,12 +163,15 @@ else
</form>
}
@if(ViewData.ContainsKey("ganjoor-songrevu"))
{
@if (ViewData.ContainsKey("ganjoor-songrevu"))
{
<a class="nav-link text-dark" asp-area="User" asp-page="/AddSong">اضافه کردن آهنگ از منبع دلخواه</a>
}
<p><a role="button" onclick="rebuildMundex()" class="actionlink" title="بازسازی صفحات نمایهٔ موسیقی">بازسازی صفحات نمایهٔ موسیقی</a></p>

View File

@ -152,5 +152,19 @@ namespace GanjooRazor.Areas.User.Pages
return Redirect($"/User/ReviewSongs/?skip={Skip}");
}
public async Task<IActionResult> OnPostRebuildMundexAsync()
{
using (HttpClient secureClient = new HttpClient())
{
if (await GanjoorSessionChecker.PrepareClient(secureClient, Request, Response))
{
HttpResponseMessage response = await secureClient.PutAsync($"{APIRoot.Url}/api/ganjoor/rebuild/mundex", null);
response.EnsureSuccessStatusCode();
return new OkObjectResult(true);
}
}
return new OkObjectResult(false);
}
}
}

View File

@ -126,6 +126,25 @@
});
}
function rebuildMundex() {
if (!confirm('آیا از بازسازی صفحات نمایهٔ موسیقی اطمینان دارید؟'))
return;
var url = '?handler=RebuildMundex';
$.ajax({
type: "POST",
url: url,
error: function () {
alert('خطا رخ داد.')
},
success: function () {
alert('فرایند بازسازی صفحات نمایهٔ موسیقی شروع شد.')
},
});
}
</script>

View File

@ -1490,6 +1490,32 @@ namespace RMuseum.Controllers
}
}
/// <summary>
/// start updating mundex page
/// </summary>
/// <returns></returns>
[HttpPut("rebuild/mundex")]
[Authorize(Policy = RMuseumSecurableItem.GanjoorEntityShortName + ":" + RMuseumSecurableItem.ReviewSongs)]
[ProducesResponseType((int)HttpStatusCode.OK)]
[ProducesResponseType((int)HttpStatusCode.BadRequest, Type = typeof(string))]
[ProducesResponseType((int)HttpStatusCode.Unauthorized)]
public IActionResult StartUpdatingMundexPage()
{
try
{
Guid userId = new Guid(User.Claims.FirstOrDefault(c => c.Type == "UserId").Value);
var res = _ganjoorService.StartUpdatingMundexPage(userId);
if (!string.IsNullOrEmpty(res.ExceptionString))
return BadRequest(res.ExceptionString);
return Ok();
}
catch (Exception exp)
{
return BadRequest(exp.ToString());
}
}
/// <summary>
/// Ganjoor Service
/// </summary>

View File

@ -1101,6 +1101,12 @@
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Controllers.GanjoorController.StartUpdatingMundexPage">
<summary>
start updating mundex page
</summary>
<returns></returns>
</member>
<member name="F:RMuseum.Controllers.GanjoorController._ganjoorService">
<summary>
Ganjoor Service
@ -7612,6 +7618,12 @@
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Services.IGanjoorService.StartUpdatingMundexPage(System.Guid)">
<summary>
start updating mundex page
</summary>
<returns></returns>
</member>
<member name="T:RMuseum.Services.Implementation.ArtifactService">
<summary>
IArtifactService implementation
@ -8565,6 +8577,15 @@
<summary>
IGanjoorService implementation
</summary>
<summary>
IGanjoorService implementation
</summary>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorService.StartUpdatingMundexPage(System.Guid)">
<summary>
start updating stats page
</summary>
<returns></returns>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorService.ImportFromMySql">
<summary>

View File

@ -452,5 +452,11 @@ namespace RMuseum.Services
/// </summary>
/// <returns></returns>
RServiceResult<bool> StartUpdatingStatsPage(Guid editingUserId);
/// <summary>
/// start updating mundex page
/// </summary>
/// <returns></returns>
RServiceResult<bool> StartUpdatingMundexPage(Guid editingUserId);
}
}

View File

@ -0,0 +1,107 @@
using DNTPersianUtils.Core;
using Microsoft.EntityFrameworkCore;
using RMuseum.DbContext;
using RMuseum.Models.Ganjoor;
using RSecurityBackend.Models.Generic;
using RSecurityBackend.Services.Implementation;
using System;
using System.Data;
using System.Linq;
namespace RMuseum.Services.Implementation
{
/// <summary>
/// IGanjoorService implementation
/// </summary>
public partial class GanjoorService : IGanjoorService
{
/// <summary>
/// start updating stats page
/// </summary>
/// <returns></returns>
public RServiceResult<bool> StartUpdatingMundexPage(Guid editingUserId)
{
try
{
_backgroundTaskQueue.QueueBackgroundWorkItem
(
async token =>
{
using (RMuseumDbContext context = new RMuseumDbContext(new DbContextOptions<RMuseumDbContext>())) //this is long running job, so _context might be already been freed/collected by GC
{
LongRunningJobProgressServiceEF jobProgressServiceEF = new LongRunningJobProgressServiceEF(context);
var job = (await jobProgressServiceEF.NewJob("UpdateMundexPage", "Query data")).Result;
try
{
var poemMusicTracks =
await context.GanjoorPoemMusicTracks
.Where(m =>
m.TrackType == PoemMusicTrackType.BeepTunesOrKhosousi
&&
m.AlbumUrl != "http://khosousi.com"
&&
m.Approved)
.ToListAsync();
var dbPage = await context.GanjoorPages.Where(p => p.FullUrl == "/mundex").SingleAsync();
string htmlText = $"<p>در این صفحه فهرست اشعار استفاده شده در آلبومهای موسیقی را با استفاده از اطلاعات جمع‌آوری شده در <a href=\"http://blog.ganjoor.net/1395/06/28/bptags/\">این پروژه</a> به تفکیک خواننده و به ترتیب نزولی تعداد قطعات مرتبط گرد آورده‌ایم." +
$" تا تاریخ {LanguageUtils.FormatDate(DateTime.Now)} ارتباط {poemMusicTracks.Count.ToPersianNumbers()} قطعهٔ موسیقی از {poemMusicTracks.GroupBy(m => m.ArtistName).Count().ToPersianNumbers()} هنرمند با {poemMusicTracks.GroupBy(m => m.PoemId).Count().ToPersianNumbers()} شعر در پایگاه گنجور ثبت و تأیید شده است. </p>{Environment.NewLine}";
htmlText += $"<p>جهت مشاهدهٔ این اطلاعات به تفکیک شاعران <small>(به همراه اطلاعات مجموعهٔ گلها، سایت اسپاتیفای و اجراهای خصوصی)</small> <a href=\"/mundex/bypoet/\" > این صفحه</a> را ببینید.</p>{Environment.NewLine}";
htmlText += $"<p>جهت کمک به تکمیل این مجموعه <a href=\"http://blog.ganjoor.net/1395/06/28/bptags/\">این مطلب</a> را مطالعه بفرمایید و <a href=\"http://www.aparat.com/v/kxGre\">این فیلم</a> را مشاهده کنید.</p>{Environment.NewLine}";
var singers = poemMusicTracks.GroupBy(m => new { m.ArtistName, m.ArtistUrl })
.Select(g => new { ArtistName = g.Key.ArtistName, ArtistUrl = g.Key.ArtistUrl, TrackCount = g.Count() })
.OrderByDescending(g => g.TrackCount)
.ToList();
for (int nSinger = 0; nSinger < singers.Count; nSinger++)
{
var singer = singers[nSinger];
htmlText += $"<p><br style=\"clear: both;\" /></p>{Environment.NewLine}";
htmlText += $"<h2>{nSinger.ToPersianNumbers()}. <a href=\"{singer.ArtistUrl}\">";
htmlText += $"{singer.ArtistName} ({singer.TrackCount.ToPersianNumbers()} قطعه)</a></h2>{Environment.NewLine}";
htmlText += "<div class=\"spacer\">&nbsp;</div>";
htmlText += $"<ol>{Environment.NewLine}";
foreach (var song in poemMusicTracks.Where(m => m.ArtistUrl == singer.ArtistUrl).OrderBy(m => m.PoemId).ToList())
{
htmlText += $"<li><p>{Environment.NewLine}";
var poem = await context.GanjoorPoems.Where(p => p.Id == song.PoemId).SingleAsync();
htmlText += $"<a href=\"{poem.FullUrl}\">{poem.FullTitle}</a> در ";
htmlText += $"<a href=\"{song.AlbumUrl}\">{song.AlbumName.ToPersianNumbers()}</a> » <a href=\"{song.TrackUrl}\">{song.TrackName.ToPersianNumbers()}</a></p></li>{Environment.NewLine}";
}
htmlText += $"</ol>{Environment.NewLine}";
}
await _UpdatePageHtmlText(context, editingUserId, dbPage, "به روزرسانی خودکار صفحهٔ نمایهٔ موسیقی", htmlText);
await jobProgressServiceEF.UpdateJob(job.Id, 100, "", true);
}
catch (Exception exp)
{
await jobProgressServiceEF.UpdateJob(job.Id, 100, "", false, exp.ToString());
}
}
}
);
return new RServiceResult<bool>(true);
}
catch (Exception exp)
{
return new RServiceResult<bool>(false, exp.ToString());
}
}
}
}