#438 ImportNaskbanGanjoorPoemMatchFindings

This commit is contained in:
Hamid Reza Mohammadi 2024-05-03 17:14:23 +03:30
parent 4aa9047404
commit beb5c215a2
4 changed files with 337 additions and 0 deletions

View File

@ -569,5 +569,10 @@ namespace RMuseum.DbContext
/// </summary>
public DbSet<DiscoverQuotedQueueItem> DiscoverQuotedQueueItems { get; set; }
/// <summary>
/// paper sources
/// </summary>
public DbSet<PaperSource> PaperSources { get; set; }
}
}

View File

@ -0,0 +1,102 @@
using System;
namespace RMuseum.Models.PDFLibrary
{
public class GanjoorPoemMatchFinding
{
/// <summary>
/// id
/// </summary>
public Guid Id { get; set; }
/// <summary>
/// cat id
/// </summary>
public int GanjoorCatId { get; set; }
/// <summary>
/// cat full title
/// </summary>
public string GanjoorCatFullTitle { get; set; }
/// <summary>
/// cat full url
/// </summary>
public string GanjoorCatFullUrl { get; set; }
/// <summary>
/// start from this poem
/// </summary>
public int GanjoorPoemId { get; set; } = 0;
/// <summary>
/// book id
/// </summary>
public int BookId { get; set; }
/// <summary>
/// book title
/// </summary>
public string BookTitle { get; set; }
/// <summary>
/// page number
/// </summary>
public int PageNumber { get; set; }
/// <summary>
/// threshold
/// </summary>
public int Threshold { get; set; }
/// <summary>
/// queue time
/// </summary>
public DateTime QueueTime { get; set; }
/// <summary>
/// started
/// </summary>
public bool Started { get; set; }
/// <summary>
/// start time
/// </summary>
public DateTime? StartTime { get; set; }
/// <summary>
/// last update
/// </summary>
public DateTime? LastUpdate { get; set; }
/// <summary>
/// updated by user
/// </summary>
public Guid? LastUpdatedByUserId { get; set; }
/// <summary>
/// current poem id
/// </summary>
public int CurrentPoemId { get; set; }
/// <summary>
/// progress
/// </summary>
public int Progress { get; set; }
/// <summary>
/// current page number
/// </summary>
public int CurrentPageNumber { get; set; }
/// <summary>
/// finished
/// </summary>
public bool Finished { get; set; }
/// <summary>
/// finish time
/// </summary>
public DateTime? FinishTime { get; set; }
}
}

View File

@ -3508,6 +3508,11 @@
discover quoted q items
</summary>
</member>
<member name="P:RMuseum.DbContext.RMuseumDbContext.PaperSources">
<summary>
paper sources
</summary>
</member>
<member name="T:RMuseum.Migrations.PictureFileExtUrl">
<inheritdoc />
</member>
@ -13076,6 +13081,101 @@
Manuscript
</summary>
</member>
<member name="P:RMuseum.Models.PDFLibrary.GanjoorPoemMatchFinding.Id">
<summary>
id
</summary>
</member>
<member name="P:RMuseum.Models.PDFLibrary.GanjoorPoemMatchFinding.GanjoorCatId">
<summary>
cat id
</summary>
</member>
<member name="P:RMuseum.Models.PDFLibrary.GanjoorPoemMatchFinding.GanjoorCatFullTitle">
<summary>
cat full title
</summary>
</member>
<member name="P:RMuseum.Models.PDFLibrary.GanjoorPoemMatchFinding.GanjoorCatFullUrl">
<summary>
cat full url
</summary>
</member>
<member name="P:RMuseum.Models.PDFLibrary.GanjoorPoemMatchFinding.GanjoorPoemId">
<summary>
start from this poem
</summary>
</member>
<member name="P:RMuseum.Models.PDFLibrary.GanjoorPoemMatchFinding.BookId">
<summary>
book id
</summary>
</member>
<member name="P:RMuseum.Models.PDFLibrary.GanjoorPoemMatchFinding.BookTitle">
<summary>
book title
</summary>
</member>
<member name="P:RMuseum.Models.PDFLibrary.GanjoorPoemMatchFinding.PageNumber">
<summary>
page number
</summary>
</member>
<member name="P:RMuseum.Models.PDFLibrary.GanjoorPoemMatchFinding.Threshold">
<summary>
threshold
</summary>
</member>
<member name="P:RMuseum.Models.PDFLibrary.GanjoorPoemMatchFinding.QueueTime">
<summary>
queue time
</summary>
</member>
<member name="P:RMuseum.Models.PDFLibrary.GanjoorPoemMatchFinding.Started">
<summary>
started
</summary>
</member>
<member name="P:RMuseum.Models.PDFLibrary.GanjoorPoemMatchFinding.StartTime">
<summary>
start time
</summary>
</member>
<member name="P:RMuseum.Models.PDFLibrary.GanjoorPoemMatchFinding.LastUpdate">
<summary>
last update
</summary>
</member>
<member name="P:RMuseum.Models.PDFLibrary.GanjoorPoemMatchFinding.LastUpdatedByUserId">
<summary>
updated by user
</summary>
</member>
<member name="P:RMuseum.Models.PDFLibrary.GanjoorPoemMatchFinding.CurrentPoemId">
<summary>
current poem id
</summary>
</member>
<member name="P:RMuseum.Models.PDFLibrary.GanjoorPoemMatchFinding.Progress">
<summary>
progress
</summary>
</member>
<member name="P:RMuseum.Models.PDFLibrary.GanjoorPoemMatchFinding.CurrentPageNumber">
<summary>
current page number
</summary>
</member>
<member name="P:RMuseum.Models.PDFLibrary.GanjoorPoemMatchFinding.Finished">
<summary>
finished
</summary>
</member>
<member name="P:RMuseum.Models.PDFLibrary.GanjoorPoemMatchFinding.FinishTime">
<summary>
finish time
</summary>
</member>
<member name="T:RMuseum.Models.PDFLibrary.MultiVolumePDFCollection">
<summary>
Multi Volume Book
@ -18068,6 +18168,22 @@
<param name="naskbanUserName"></param>
<param name="naskbanPassword"></param>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorService.ImportNaskbanGanjoorPoemMatchFindings(System.String,System.String)">
<summary>
import naskban ganjoor matchings
</summary>
<param name="naskbanUserName"></param>
<param name="naskbanPassword"></param>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorService._ImportNaskbanGanjoorPoemMatchFindingsAsync(RMuseum.DbContext.RMuseumDbContext,System.String,System.String)">
<summary>
import naskban ganjoor matchings
</summary>
<param name="context"></param>
<param name="naskbanUserName"></param>
<param name="naskbanPassword"></param>
<returns>number of synched items</returns>
</member>
<member name="M:RMuseum.Services.Implementation.GanjoorService.GetPoetSuggestedSpecLinesAsync(System.Int32)">
<summary>
return list of suggested spec lines

View File

@ -19,6 +19,7 @@ using RSecurityBackend.Models.Generic.Db;
using RMuseum.Models.PDFLibrary;
using DNTPersianUtils.Core;
using System.Collections.Generic;
using RMuseum.Migrations;
namespace RMuseum.Services.Implementation
{
@ -507,5 +508,118 @@ namespace RMuseum.Services.Implementation
return new RServiceResult<bool>(false, exp.ToString());
}
}
/// <summary>
/// import naskban ganjoor matchings
/// </summary>
/// <param name="naskbanUserName"></param>
/// <param name="naskbanPassword"></param>
public void ImportNaskbanGanjoorPoemMatchFindings(string naskbanUserName, string naskbanPassword)
{
_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("ImportNaskbanGanjoorPoemMatchFindings", "Query data")).Result;
var res = await _ImportNaskbanGanjoorPoemMatchFindingsAsync(context, naskbanUserName, naskbanPassword);
if (!string.IsNullOrEmpty(res.ExceptionString))
{
await jobProgressServiceEF.UpdateJob(job.Id, 100, "", false, res.ExceptionString);
}
else
{
await jobProgressServiceEF.UpdateJob(job.Id, 100, "", true);
}
}
});
}
/// <summary>
/// import naskban ganjoor matchings
/// </summary>
/// <param name="context"></param>
/// <param name="naskbanUserName"></param>
/// <param name="naskbanPassword"></param>
/// <returns>number of synched items</returns>
private async Task<RServiceResult<int>> _ImportNaskbanGanjoorPoemMatchFindingsAsync(RMuseumDbContext context, string naskbanUserName, string naskbanPassword)
{
try
{
LoggedOnUserModelEx loggedOnUser;
using (HttpClient client = new HttpClient())
{
LoginViewModel loginViewModel = new LoginViewModel()
{
Username = naskbanUserName,
Password = naskbanPassword,
ClientAppName = "Ganjoor API",
Language = "fa-IR"
};
var loginResponse = await client.PostAsync("https://api.naskban.ir/api/users/login", new StringContent(JsonConvert.SerializeObject(loginViewModel), Encoding.UTF8, "application/json"));
if (loginResponse.StatusCode != HttpStatusCode.OK)
{
return new RServiceResult<int>(0, "login error: " + JsonConvert.DeserializeObject<string>(await loginResponse.Content.ReadAsStringAsync()));
}
loggedOnUser = JsonConvert.DeserializeObject<LoggedOnUserModelEx>(await loginResponse.Content.ReadAsStringAsync());
}
using (HttpClient secureClient = new HttpClient())
{
secureClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", loggedOnUser.Token);
var unsyncedResponse = await secureClient.GetAsync("https://api.naskban.ir/api/pdf/ganjoor/matching");
if (!unsyncedResponse.IsSuccessStatusCode)
{
return new RServiceResult<int>(0, "unsync error: " + JsonConvert.DeserializeObject<string>(await unsyncedResponse.Content.ReadAsStringAsync()));
}
var matchings = JsonConvert.DeserializeObject<GanjoorPoemMatchFinding[]>(await unsyncedResponse.Content.ReadAsStringAsync());
foreach (var matching in matchings)
{
if (false == await context.PaperSources.Where(p => p.NaskbanBookId == matching.BookId).AnyAsync())
{
HttpResponseMessage responseBook = await secureClient.GetAsync($"https://api.naskban.ir/api/pdf/{matching.BookId}?includePages=false&includeBookText=false&includePageText=false");
if (responseBook.StatusCode != HttpStatusCode.OK)
{
return new RServiceResult<int>(0, $"book fetch error bookid = {matching.BookId} matching id = {matching.Id} - " + JsonConvert.DeserializeObject<string>(await responseBook.Content.ReadAsStringAsync()));
}
responseBook.EnsureSuccessStatusCode();
var book = JsonConvert.DeserializeObject<PDFBook>(await responseBook.Content.ReadAsStringAsync());
var cat = await context.GanjoorCategories.AsNoTracking().Where(c => c.Id == matching.GanjoorCatId).SingleAsync();
PaperSource paperSource = new PaperSource()
{
GanjoorPoetId = cat.PoetId,
GanjoorCatId = matching.GanjoorCatId,
GanjoorCatFullTitle = matching.GanjoorCatFullTitle,
GanjoorCatFullUrl = matching.GanjoorCatFullUrl,
BookType = LinkType.Naskban,
BookFullUrl = $"https://naskban.ir/{matching.BookId}",
NaskbanBookId = matching.BookId,
BookFullTitle = matching.BookTitle,
CoverThumbnailImageUrl = book.ExtenalCoverImageUrl,
Description = "",
IsTextOriginalSource = false,
MatchPercent = 0,
HumanReviewed = false,
};
context.PaperSources.Add(paperSource);
await context.SaveChangesAsync();
}
}
var logoutUrl = $"https://api.naskban.ir/api/users/delsession?userId={loggedOnUser.User.Id}&sessionId={loggedOnUser.SessionId}";
await secureClient.DeleteAsync(logoutUrl);
return new RServiceResult<int>(matchings.Length);
}
}
catch (Exception exp)
{
return new RServiceResult<int>(0, exp.ToString());
}
}
}
}