/// <summary> /// update job /// </summary> /// <param name="id"></param> /// <param name="progress"></param> /// <param name="step"></param> /// <param name="succeeded"></param> /// <param name="exception"></param> /// <returns></returns> public async Task <RServiceResult <RLongRunningJobStatus> > UpdateJob(Guid id, double progress, string step = "", bool succeeded = false, string exception = "") { try { RLongRunningJobStatus job = await _context.LongRunningJobs.Where(j => j.Id == id).SingleOrDefaultAsync(); if (!string.IsNullOrEmpty(step)) { job.Step = step; } if (succeeded || !string.IsNullOrEmpty(exception)) { job.EndTime = DateTime.Now; } job.Progress = progress; job.Succeeded = succeeded; job.Exception = exception; _context.Update(job); await _context.SaveChangesAsync(); return(new RServiceResult <RLongRunningJobStatus>(job)); } catch (Exception exp) { return(new RServiceResult <RLongRunningJobStatus>(null, exp.ToString())); } }
/// <summary> /// delete job /// </summary> /// <param name="id"></param> /// <returns></returns> public async Task <RServiceResult <bool> > DeleteJob(Guid id) { RLongRunningJobStatus job = await _context.LongRunningJobs.Where(j => j.Id == id).SingleOrDefaultAsync(); _context.LongRunningJobs.Remove(job); await _context.SaveChangesAsync(); return(new RServiceResult <bool>(true)); }
/// <summary> /// delete job /// </summary> /// <param name="id"></param> /// <returns></returns> public async Task <RServiceResult <bool> > DeleteJob(Guid id) { try { RLongRunningJobStatus job = await _context.LongRunningJobs.Where(j => j.Id == id).SingleOrDefaultAsync(); _context.LongRunningJobs.Remove(job); await _context.SaveChangesAsync(); return(new RServiceResult <bool>(true)); } catch (Exception exp) { return(new RServiceResult <bool>(false, exp.ToString())); } }
/// <summary> /// new job /// </summary> /// <param name="name"></param> /// <param name="step"></param> /// <returns></returns> public async Task <RServiceResult <RLongRunningJobStatus> > NewJob(string name, string step) { RLongRunningJobStatus job = new RLongRunningJobStatus() { Name = name, Step = step, Progress = 0, StartTime = DateTime.Now, Succeeded = false, Exception = "" }; _context.LongRunningJobs.Add(job); await _context.SaveChangesAsync(); return(new RServiceResult <RLongRunningJobStatus>(job)); }
/// <summary> /// import catalogue from ganjoor.net MySql db /// </summary> /// <param name="jobName"></param> /// <param name="jobProgressServiceEF"></param> /// <param name="job"></param> /// <returns></returns> public async Task <RServiceResult <bool> > ImportFromMySql(string jobName, LongRunningJobProgressServiceEF jobProgressServiceEF, RLongRunningJobStatus job) { try { using (RMuseumDbContext context = new RMuseumDbContext(Configuration)) //this is long running job, so _context might be already been freed/collected by GC { using (MySqlConnection connection = new MySqlConnection ( $"server={Configuration.GetSection("AudioMySqlServer")["Server"]};uid={Configuration.GetSection("AudioMySqlServer")["SongsUsername"]};pwd={Configuration.GetSection("AudioMySqlServer")["SongsPassword"]};database={Configuration.GetSection("AudioMySqlServer")["SongsDatabase"]};charset=utf8;convert zero datetime=True" )) { job = (await jobProgressServiceEF.UpdateJob(job.Id, 0, $"{jobName} - import golha data - pre open connection")).Result; connection.Open(); using (MySqlDataAdapter src = new MySqlDataAdapter( "SELECT col_id, name FROM golha_collections ORDER BY col_id", connection)) { using (DataTable data = new DataTable()) { await src.FillAsync(data); foreach (DataRow row in data.Rows) { GolhaCollection collection = new GolhaCollection() { Id = int.Parse(row["col_id"].ToString()), Name = row["name"].ToString(), Programs = new List <GolhaProgram>() }; job = (await jobProgressServiceEF.UpdateJob(job.Id, 0, $"{jobName} - import golha data - golha_collections: {collection.Id}")).Result; using (MySqlDataAdapter srcPrograms = new MySqlDataAdapter( $"SELECT program_id, title, progarm_order, url, mp3 FROM golha_programs WHERE col_id = {collection.Id} ORDER BY program_id", connection)) { using (DataTable programData = new DataTable()) { await srcPrograms.FillAsync(programData); foreach (DataRow golhaProgram in programData.Rows) { GolhaProgram program = new GolhaProgram() { Id = int.Parse(golhaProgram["program_id"].ToString()), Title = golhaProgram["title"].ToString(), ProgramOrder = int.Parse(golhaProgram["progarm_order"].ToString()), Url = golhaProgram["url"].ToString(), Mp3 = golhaProgram["mp3"].ToString(), Tracks = new List <GolhaTrack>() }; using (MySqlDataAdapter srcTracks = new MySqlDataAdapter( $"SELECT track_id, track_no, timing, title FROM golha_tracks WHERE program_id = {program.Id} ORDER BY track_no", connection)) { using (DataTable trackData = new DataTable()) { await srcTracks.FillAsync(trackData); foreach (DataRow golhaTrack in trackData.Rows) { program.Tracks.Add ( new GolhaTrack() { Id = int.Parse(golhaTrack["track_id"].ToString()), TrackNo = int.Parse(golhaTrack["track_no"].ToString()), Timing = golhaTrack["timing"].ToString(), Title = golhaTrack["title"].ToString(), Blocked = false, } ); } } } collection.Programs.Add(program); } } } context.GolhaCollections.Add(collection); await context.SaveChangesAsync(); } } } job = (await jobProgressServiceEF.UpdateJob(job.Id, 0, $"{jobName} - import singers data")).Result; using (MySqlDataAdapter src = new MySqlDataAdapter( "SELECT artist_id, artist_name, artist_beeptunesurl FROM ganja_artists ORDER BY artist_id", connection)) { using (DataTable data = new DataTable()) { await src.FillAsync(data); foreach (DataRow row in data.Rows) { int artistId = int.Parse(row["artist_id"].ToString()); GanjoorSinger singer = new GanjoorSinger() { Name = row["artist_name"].ToString(), Url = row["artist_beeptunesurl"].ToString(), Albums = new List <GanjoorAlbum>() }; using (MySqlDataAdapter srcAlbums = new MySqlDataAdapter( $"SELECT album_id, album_name, album_beeptunesurl FROM ganja_albums WHERE album_artistid = {artistId} ORDER BY album_id", connection)) { using (DataTable dataAlbums = new DataTable()) { await srcAlbums.FillAsync(dataAlbums); foreach (DataRow rowAlbum in dataAlbums.Rows) { int albumId = int.Parse(rowAlbum["album_id"].ToString()); GanjoorAlbum album = new GanjoorAlbum() { Name = rowAlbum["album_name"].ToString(), Url = rowAlbum["album_beeptunesurl"].ToString(), Tracks = new List <GanjoorTrack>() }; using (MySqlDataAdapter srcTracks = new MySqlDataAdapter( $"SELECT track_name, track_beeptunesurl FROM ganja_tracks WHERE album_id = {albumId} ORDER BY track_id", connection)) { using (DataTable dataTracks = new DataTable()) { await srcTracks.FillAsync(dataTracks); foreach (DataRow rowTrack in dataTracks.Rows) { album.Tracks.Add ( new GanjoorTrack() { Name = rowTrack["track_name"].ToString(), Url = rowTrack["track_beeptunesurl"].ToString(), Blocked = false } ); } } } singer.Albums.Add(album); } } } context.GanjoorSingers.Add(singer); job = (await jobProgressServiceEF.UpdateJob(job.Id, 0, $"{jobName} - import singers data - {singer.Name}")).Result; } } } job = (await jobProgressServiceEF.UpdateJob(job.Id, 0, $"{jobName} - finalizing singers data")).Result; await context.SaveChangesAsync(); } } return(new RServiceResult <bool>(true)); } catch (Exception exp) { await jobProgressServiceEF.UpdateJob(job.Id, job.Progress, "", false, exp.ToString()); return(new RServiceResult <bool>(false, exp.ToString())); } }
private async Task <string> _ImportSQLiteCatChildren(RMuseumDbContext context, IDbConnection sqlite, int poetId, int sqliteParentCatId, GanjoorCat parentCat, string parentFullTitle, LongRunningJobProgressServiceEF jobProgressServiceEF, RLongRunningJobStatus job, int parentPagId) { try { string catHtmlText = ""; foreach (var cat in await sqlite.QueryAsync($"SELECT * FROM cat WHERE parent_id = {sqliteParentCatId} ORDER BY id")) { await jobProgressServiceEF.UpdateJob(job.Id, 0, $"Importing - {cat.text}"); var poetCatId = 1 + await context.GanjoorCategories.MaxAsync(c => c.Id); string catTitle = cat.text; string url = GPersianTextSync.Farglisize(catTitle); if (catTitle.IndexOf('|') != -1) { string[] catParts = catTitle.Split('|', StringSplitOptions.RemoveEmptyEntries); if (catParts.Length == 2) { catTitle = catParts[0].Trim(); url = catParts[1].Trim(); } } else { switch (catTitle) { case "دیوان اشعار": url = "divan"; break; case "قصاید": case "قصائد": case "قصیده": case "قصیده ها": url = "ghaside"; break; case "غزلیات": case "غزل": case "غزل ها": url = "ghazal"; break; case "قطعات": case "مقطعات": case "قطعه": url = "ghete"; break; case "مثنویات": case "مثنوی": case "مثنوی ها": url = "masnavi"; break; case "ترکیبات": case "ترکیب بند": url = "tarkib"; break; case "ترجیعات": case "ترجیع بند": url = "tarjee"; break; case "مسمطات": case "مسمط": url = "mosammat"; break; case "مخمسات": case "مخمس": url = "mokhammas"; break; case "رباعیات": case "رباعی": case "رباعی ها": url = "robaee"; break; case "ملمعات": case "ملمع": url = "molamma"; break; case "هجویات": case "هجو": url = "hajv"; break; case "هزلیات": case "هزل": url = "hazl"; break; case "مراثی": case "مرثیه": case "رثا": case "مرثیه ها": url = "marsie"; break; case "مفردات": url = "mofradat"; break; case "ملحقات": url = "molhaghat"; break; case "اشعار عربی": url = "arabi"; break; case "ماده تاریخها": case "ماده تاریخها": case "ماده تاریخ": url = "tarikh"; break; case "معمیات": url = "moammiyat"; break; case "چیستان": url = "chistan"; break; case "لغز": case "لغزها": url = "loghaz"; break; } } GanjoorCat dbCat = new GanjoorCat() { Id = poetCatId, PoetId = poetId, Title = catTitle, UrlSlug = url, FullUrl = $"{parentCat.FullUrl}/{url}", ParentId = parentCat.Id, TableOfContentsStyle = GanjoorTOC.Analyse, Published = true, }; context.GanjoorCategories.Add(dbCat); var maxPageId = await context.GanjoorPages.MaxAsync(p => p.Id); if (await context.GanjoorPoems.MaxAsync(p => p.Id) > maxPageId) { maxPageId = await context.GanjoorPoems.MaxAsync(p => p.Id); } var catPageId = 1 + maxPageId; while (await context.GanjoorPoems.Where(p => p.Id == catPageId).AnyAsync()) { catPageId++; } GanjoorPage dbPageCat = new GanjoorPage() { Id = catPageId, GanjoorPageType = GanjoorPageType.CatPage, Published = false, PageOrder = -1, Title = dbCat.Title, FullTitle = $"{parentFullTitle} » {dbCat.Title}", UrlSlug = dbCat.UrlSlug, FullUrl = dbCat.FullUrl, HtmlText = "", PoetId = poetId, CatId = poetCatId, PostDate = DateTime.Now, ParentId = parentPagId }; context.GanjoorPages.Add(dbPageCat); await context.SaveChangesAsync(); catHtmlText += $"<p><a href=\"{dbCat.FullUrl}\">{dbCat.Title}</a></p>{Environment.NewLine}"; var resChild = await _ImportSQLiteCatChildren(context, sqlite, poetId, (int)cat.id, dbCat, $"{parentFullTitle} » {dbCat.Title}", jobProgressServiceEF, job, dbPageCat.Id); if (!string.IsNullOrEmpty(resChild)) { return(resChild); } } var maxPoemId = await context.GanjoorPoems.MaxAsync(p => p.Id); if (await context.GanjoorPages.MaxAsync(p => p.Id) > maxPoemId) { maxPoemId = await context.GanjoorPages.MaxAsync(p => p.Id); } var poemId = 1 + maxPoemId; int poemNumber = 0; foreach (var poem in await sqlite.QueryAsync($"SELECT * FROM poem WHERE cat_id = {sqliteParentCatId} ORDER BY id")) { poemNumber++; await jobProgressServiceEF.UpdateJob(job.Id, poemNumber, "", false); string title = poem.title; string urlSlug = $"sh{poemNumber}"; if (title.IndexOf('|') != -1) { string[] titleParts = title.Split('|', StringSplitOptions.RemoveEmptyEntries); if (titleParts.Length == 2) { title = titleParts[0].Trim(); urlSlug = titleParts[1].Trim(); } } GanjoorPoem dbPoem = new GanjoorPoem() { Id = poemId, CatId = parentCat.Id, Title = title, UrlSlug = urlSlug, FullTitle = $"{parentFullTitle} » {title}", FullUrl = $"{parentCat.FullUrl}/{urlSlug}", Published = true, }; List <GanjoorVerse> poemVerses = new List <GanjoorVerse>(); foreach (var verse in await sqlite.QueryAsync($"SELECT * FROM verse WHERE poem_id = {poem.id} ORDER BY vorder")) { int vOrder = int.Parse(verse.vorder.ToString()); int position = int.Parse(verse.position.ToString()); string text = verse.text; GanjoorVerse dbVerse = new GanjoorVerse() { PoemId = poemId, VOrder = vOrder, VersePosition = (VersePosition)position, Text = text.Replace("ـ", "").Replace(" ", " ").ApplyCorrectYeKe().Trim() }; poemVerses.Add(dbVerse); } if (poemVerses.Count == 0) { poemNumber--; continue; } dbPoem.PlainText = PreparePlainText(poemVerses); dbPoem.HtmlText = PrepareHtmlText(poemVerses); context.GanjoorPoems.Add(dbPoem); await context.SaveChangesAsync(); foreach (var dbVerse in poemVerses) { context.GanjoorVerses.Add(dbVerse); await context.SaveChangesAsync();//id set should be in order } await _FillPoemCoupletIndices(context, poemId); try { var poemRhymeLettersRes = LanguageUtils.FindRhyme(poemVerses); if (!string.IsNullOrEmpty(poemRhymeLettersRes.Rhyme)) { dbPoem.RhymeLetters = poemRhymeLettersRes.Rhyme; context.GanjoorPoems.Update(dbPoem); } } catch { } GanjoorPage dbPoemPage = new GanjoorPage() { Id = poemId, GanjoorPageType = GanjoorPageType.PoemPage, Published = false, PageOrder = -1, Title = dbPoem.Title, FullTitle = dbPoem.FullTitle, UrlSlug = dbPoem.UrlSlug, FullUrl = dbPoem.FullUrl, HtmlText = dbPoem.HtmlText, PoetId = poetId, CatId = parentCat.Id, PoemId = poemId, PostDate = DateTime.Now, ParentId = parentPagId }; context.GanjoorPages.Add(dbPoemPage); await context.SaveChangesAsync(); catHtmlText += $"<p><a href=\"{dbPoemPage.FullUrl}\">{dbPoemPage.Title}</a></p>{Environment.NewLine}"; poemId++; } if (!string.IsNullOrEmpty(catHtmlText)) { var parentCatPage = await context.GanjoorPages.Where(p => p.FullUrl == parentCat.FullUrl).SingleAsync(); parentCatPage.HtmlText += catHtmlText; context.GanjoorPages.Update(parentCatPage); } await context.SaveChangesAsync(); } catch (Exception exp) { return(exp.ToString()); } return(""); }
private async Task <RServiceResult <bool> > _ImportCommentsDataFromMySql(string jobName, RMuseumDbContext context, LongRunningJobProgressServiceEF jobProgressServiceEF, RLongRunningJobStatus job) { try { job = (await jobProgressServiceEF.UpdateJob(job.Id, 0, $"{jobName} - processing reported comments")).Result; List <GanjoorCommentAbuseReport> reportedComments = await _MySqlImportReportedComments(); job = (await jobProgressServiceEF.UpdateJob(job.Id, 0, $"{jobName} - pre mysql data fetch")).Result; string connectionString = $"server={Configuration.GetSection("AudioMySqlServer")["Server"]};uid={Configuration.GetSection("AudioMySqlServer")["Username"]};pwd={Configuration.GetSection("AudioMySqlServer")["Password"]};database={Configuration.GetSection("AudioMySqlServer")["Database"]};charset=utf8;convert zero datetime=True"; using (MySqlConnection connection = new MySqlConnection ( connectionString )) { connection.Open(); using (MySqlDataAdapter src = new MySqlDataAdapter( "SELECT comment_ID, comment_post_ID, comment_author, comment_author_email, comment_author_url, comment_author_IP, comment_date, comment_content, comment_approved FROM ganja_comments WHERE comment_type <> 'pingback' ORDER BY comment_ID", connection)) { job = (await jobProgressServiceEF.UpdateJob(job.Id, 0, $"{jobName} - mysql")).Result; using (DataTable data = new DataTable()) { await src.FillAsync(data); job = (await jobProgressServiceEF.UpdateJob(job.Id, 0, $"{jobName} - processing approved poem songs")).Result; int count = data.Rows.Count; int i = 0; int percent = -1; foreach (DataRow row in data.Rows) { GanjoorComment comment = new GanjoorComment() { PoemId = int.Parse(row["comment_post_ID"].ToString()), AuthorName = row["comment_author"].ToString(), AuthorEmail = row["comment_author_email"].ToString(), AuthorUrl = row["comment_author_url"].ToString(), AuthorIpAddress = row["comment_author_IP"].ToString(), CommentDate = (DateTime)row["comment_date"], HtmlComment = _PrepareCommentHtml(row["comment_content"].ToString()), Status = row["comment_approved"].ToString() == "1" ? PublishStatus.Published : PublishStatus.Awaiting }; var poem = await context.GanjoorPoems.Where(p => p.Id == comment.PoemId).SingleOrDefaultAsync(); if (poem == null) { continue; } context.GanjoorComments.Add(comment); int originalCommentId = int.Parse(row["comment_post_ID"].ToString()); var complaints = reportedComments.Where(c => c.GanjoorCommentId == originalCommentId).ToList(); if (complaints.Count > 0) { await context.SaveChangesAsync(); //save this comment to make its ID valid foreach (var complaint in complaints) { context.GanjoorReportedComments.Add ( new GanjoorCommentAbuseReport() { GanjoorCommentId = comment.Id, ReasonCode = complaint.ReasonCode, ReasonText = complaint.ReasonText, } ); } } i++; if (i * 100 / count > percent) { percent = i * 100 / count; job = (await jobProgressServiceEF.UpdateJob(job.Id, 0, $"{jobName} - {i} of {count}")).Result; } } await context.SaveChangesAsync(); } } } job = (await jobProgressServiceEF.UpdateJob(job.Id, 0, $"{jobName} - assigning comments to users")).Result; foreach (var user in await context.Users.ToListAsync()) { foreach (var comment in await context.GanjoorComments.Where(u => u.AuthorEmail == user.Email).ToListAsync()) { comment.UserId = user.Id; context.GanjoorComments.Update(comment); } } await context.SaveChangesAsync(); job = (await jobProgressServiceEF.UpdateJob(job.Id, 0, $"{jobName} - finished")).Result; return(new RServiceResult <bool>(true)); } catch (Exception exp) { await jobProgressServiceEF.UpdateJob(job.Id, job.Progress, "", false, exp.ToString()); return(new RServiceResult <bool>(false, exp.ToString())); } }
private async Task <RServiceResult <bool> > _ImportPoemSongsDataFromMySql(string jobName, RMuseumDbContext context, LongRunningJobProgressServiceEF jobProgressServiceEF, RLongRunningJobStatus job, bool approved) { try { job = (await jobProgressServiceEF.UpdateJob(job.Id, 0, $"{jobName} - pre mysql data fetch")).Result; string connectionString = approved ? $"server={Configuration.GetSection("AudioMySqlServer")["Server"]};uid={Configuration.GetSection("AudioMySqlServer")["Username"]};pwd={Configuration.GetSection("AudioMySqlServer")["Password"]};database={Configuration.GetSection("AudioMySqlServer")["Database"]};charset=utf8;convert zero datetime=True" : $"server={Configuration.GetSection("AudioMySqlServer")["Server"]};uid={Configuration.GetSection("AudioMySqlServer")["SongsUsername"]};pwd={Configuration.GetSection("AudioMySqlServer")["SongsPassword"]};database={Configuration.GetSection("AudioMySqlServer")["SongsDatabase"]};charset=utf8;convert zero datetime=True"; using (MySqlConnection connection = new MySqlConnection ( connectionString )) { connection.Open(); using (MySqlDataAdapter src = new MySqlDataAdapter( "SELECT poem_id, artist_name, artist_beeptunesurl, album_name, album_beeptunesurl, track_name, track_beeptunesurl, ptrack_typeid FROM ganja_ptracks ORDER BY id", connection)) { job = (await jobProgressServiceEF.UpdateJob(job.Id, 0, $"{jobName} - mysql")).Result; using (DataTable data = new DataTable()) { await src.FillAsync(data); job = (await jobProgressServiceEF.UpdateJob(job.Id, 0, $"{jobName} - processing approved poem songs")).Result; foreach (DataRow row in data.Rows) { PoemMusicTrack track = new PoemMusicTrack() { TrackType = (PoemMusicTrackType)int.Parse(row["ptrack_typeid"].ToString()), PoemId = int.Parse(row["poem_id"].ToString()), ArtistName = row["artist_name"].ToString(), ArtistUrl = row["artist_beeptunesurl"].ToString(), AlbumName = row["album_name"].ToString(), AlbumUrl = row["album_beeptunesurl"].ToString(), TrackName = row["track_name"].ToString(), TrackUrl = row["track_beeptunesurl"].ToString(), ApprovalDate = DateTime.Now, Description = "", Approved = approved }; var poem = await context.GanjoorPoems.Where(p => p.Id == track.PoemId).SingleOrDefaultAsync(); if (poem == null) { continue; } switch (track.TrackType) { case PoemMusicTrackType.BeepTunesOrKhosousi: case PoemMusicTrackType.iTunes: { GanjoorTrack catalogueTrack = await context.GanjoorMusicCatalogueTracks.Where(m => m.Url == track.TrackUrl).FirstOrDefaultAsync(); if (catalogueTrack != null) { track.GanjoorTrackId = catalogueTrack.Id; } GanjoorSinger singer = await context.GanjoorSingers.Where(s => s.Url == track.ArtistUrl).FirstOrDefaultAsync(); if (singer != null) { track.SingerId = singer.Id; } } break; case PoemMusicTrackType.Golha: { track.AlbumName = $"{track.ArtistName} » {track.AlbumName}"; track.ArtistName = ""; track.GolhaTrackId = int.Parse(track.ArtistUrl); track.ArtistUrl = ""; } break; } context.GanjoorPoemMusicTracks.Add(track); } job = (await jobProgressServiceEF.UpdateJob(job.Id, 0, $"{jobName} - finalizing approved poem songs data")).Result; await context.SaveChangesAsync(); } } } return(new RServiceResult <bool>(true)); } catch (Exception exp) { await jobProgressServiceEF.UpdateJob(job.Id, job.Progress, "", false, exp.ToString()); return(new RServiceResult <bool>(false, exp.ToString())); } }
private async Task _GeneratingSubCatsTOC(Guid userId, RMuseumDbContext context, LongRunningJobProgressServiceEF jobProgressServiceEF, RLongRunningJobStatus job, int catId) { foreach (var cat in await context.GanjoorCategories.AsNoTracking().Where(c => c.ParentId == catId).ToListAsync()) { await jobProgressServiceEF.UpdateJob(job.Id, cat.Id); var page = await context.GanjoorPages.Where(p => p.FullUrl == cat.FullUrl).SingleAsync(); context.GanjoorPageSnapshots.Add ( new GanjoorPageSnapshot() { GanjoorPageId = page.Id, MadeObsoleteByUserId = userId, HtmlText = page.HtmlText, Note = "تولید گروهی فهرستهای زیربخشها", RecordDate = DateTime.Now } ); page.HtmlText = (await _GenerateTableOfContents(context, cat.Id, GanjoorTOC.TitlesAndFirstVerse)).Result; context.GanjoorPages.Update(page); await context.SaveChangesAsync(); await _GeneratingSubCatsTOC(userId, context, jobProgressServiceEF, job, cat.Id); } }
private async Task _PerformMundexHouseKeepingAndPreparation(RMuseumDbContext context, LongRunningJobProgressServiceEF jobProgressServiceEF, RLongRunningJobStatus job) { var singers = await context.GanjoorSingers.ToListAsync(); foreach (var singer in singers) { if (!string.IsNullOrEmpty(singer.Url) && singer.Url.Length > 0 && singer.Url[singer.Url.Length - 1] == '/') { singer.Url = singer.Url.Substring(0, singer.Url.Length - 1); context.GanjoorSingers.Update(singer); } } await context.SaveChangesAsync(); await jobProgressServiceEF.UpdateJob(job.Id, 2); var poemMusicTracks = await context.GanjoorPoemMusicTracks .Where(m => m.TrackType == PoemMusicTrackType.BeepTunesOrKhosousi && m.Approved) .ToListAsync(); IConfigurationRoot configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json") .Build(); ImageFileServiceEF imageFileService = new ImageFileServiceEF(context, configuration); using (HttpClient httpClient = new HttpClient()) foreach (var poemMusicTrack in poemMusicTracks) { if (!string.IsNullOrEmpty(poemMusicTrack.ArtistUrl) && poemMusicTrack.ArtistUrl.Length > 0 && poemMusicTrack.ArtistUrl[poemMusicTrack.ArtistUrl.Length - 1] == '/') { poemMusicTrack.ArtistUrl = poemMusicTrack.ArtistUrl.Substring(0, poemMusicTrack.ArtistUrl.Length - 1); context.GanjoorPoemMusicTracks.Update(poemMusicTrack); } var singer = poemMusicTrack.SingerId != null? context.GanjoorSingers.Where(s => s.Id == poemMusicTrack.SingerId).FirstOrDefault() : context.GanjoorSingers.Where(s => s.Url == poemMusicTrack.ArtistUrl).FirstOrDefault(); if (singer == null) { singer = new GanjoorSinger() { Name = poemMusicTrack.ArtistName, Url = poemMusicTrack.ArtistUrl }; context.GanjoorSingers.Add(singer); await context.SaveChangesAsync(); } if (poemMusicTrack.SingerId == null) { poemMusicTrack.SingerId = singer.Id; context.GanjoorPoemMusicTracks.Update(poemMusicTrack); } //singer image: if (singer.Url.Contains("beeptunes.com/artist/")) { if (singer.RImageId == null) { var bUrl = singer.Url; var beepId = bUrl.Substring(bUrl.LastIndexOf("/") + 1); var response = await httpClient.GetAsync($"https://newapi.beeptunes.com/public/artist/info/?artistId={beepId}"); if (response.IsSuccessStatusCode) { dynamic bpArtist = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync()); if (bpArtist.artistImage != null) { try { var imageResult = await httpClient.GetAsync(bpArtist.artistImage.ToString()); if (imageResult.IsSuccessStatusCode) { using (Stream imageStream = await imageResult.Content.ReadAsStreamAsync()) { RServiceResult <RImage> image = await imageFileService.Add(null, imageStream, $"{beepId}.jpg", Path.Combine(configuration.GetSection("PictureFileService")["StoragePath"], "SingerImages")); if (string.IsNullOrEmpty(image.ExceptionString)) { image = await imageFileService.Store(image.Result); if (string.IsNullOrEmpty(image.ExceptionString)) { singer.RImageId = image.Result.Id; context.GanjoorSingers.Update(singer); await context.SaveChangesAsync(); } } } } } catch { } } } } } } await context.SaveChangesAsync(); await jobProgressServiceEF.UpdateJob(job.Id, 3); }
private async Task _UpdateMundexByPoetPage(Guid editingUserId, RMuseumDbContext context, LongRunningJobProgressServiceEF jobProgressServiceEF, RLongRunningJobStatus job) { var poemMusicTracks = await context.GanjoorPoemMusicTracks.Include(m => m.Poem).ThenInclude(p => p.Cat) .Where(m => m.Approved) .ToListAsync(); var dbPage = await context.GanjoorPages.Where(p => p.FullUrl == "/mundex/bypoet").SingleAsync(); string htmlText = $"<p>در این صفحه فهرست اشعار استفاده شده در آلبومهای موسیقی را با استفاده از اطلاعات جمعآوری شده در <a href=\"http://blog.ganjoor.net/1395/06/28/bptags/\">این پروژه</a> به تفکیک شاعر و به ترتیب نزولی تعداد اشعار مرتبط گرد آوردهایم." + $" تا تاریخ {LanguageUtils.FormatDate(DateTime.Now)} ارتباط {poemMusicTracks.GroupBy(m => m.PoemId).Count().ToPersianNumbers()} شعر از {poemMusicTracks.GroupBy(m => m.Poem.Cat.PoetId).Count().ToPersianNumbers()} شاعر با {poemMusicTracks.Count.ToPersianNumbers()} قطعهٔ موسیقی در پایگاه گنجور ثبت و تأیید شده است. </p>{Environment.NewLine}"; htmlText += $"<p>جهت مشاهدهٔ این اطلاعات به تفکیک هنرمندان <small>(بدون اطلاعات مجموعهٔ گلها و سایت اسپاتیفای)</small> <a href=\"/mundex/\" > این صفحه</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 poetIdsAndTrackCounts = poemMusicTracks.GroupBy(m => new { m.Poem.Cat.PoetId }) .Select(g => new { PoetId = g.Key.PoetId, TrackCount = g.Count() }) .OrderByDescending(g => g.TrackCount) .ToList(); using (HttpClient httpClient = new HttpClient()) for (int nPoetIndex = 0; nPoetIndex < poetIdsAndTrackCounts.Count; nPoetIndex++) { var poetIdAndTrackCount = poetIdsAndTrackCounts[nPoetIndex]; var tracks = poemMusicTracks. Where(m => m.Poem.Cat.PoetId == poetIdAndTrackCount.PoetId) .OrderBy(m => m.PoemId) .ToList(); if (tracks.Count != poetIdAndTrackCount.TrackCount) { continue;//!!! a weird situration I cannot figure out now! } var poet = await context.GanjoorPoets.Where(p => p.Id == poetIdAndTrackCount.PoetId).AsNoTracking().SingleAsync(); var poetCat = await context.GanjoorCategories.Where(c => c.PoetId == poetIdAndTrackCount.PoetId && c.ParentId == null).AsNoTracking().SingleAsync(); htmlText += $"<p><br style=\"clear: both;\" /></p>{Environment.NewLine}"; htmlText += $"<h2>{(nPoetIndex+1).ToPersianNumbers()}. <a href=\"{poetCat.FullUrl}\">{poet.Nickname}</a></h2>{Environment.NewLine}"; htmlText += $"<div class=\"spacer\"> </div>{Environment.NewLine}"; htmlText += $"<div style=\"width:82px;margin:auto\"><a href=\"{poetCat.FullUrl}\"><img src=\"{WebServiceUrl.Url}/api/ganjoor/poet/image/{poetCat.UrlSlug}.gif\" alt=\"{poet.Nickname}\" /></a></div>{Environment.NewLine}"; htmlText += $"<div style=\"width:100%;margin:auto\"><a href=\"/{poetCat.FullUrl}\" >{poet.Nickname}</a> ({tracks.Count.ToPersianNumbers()} قطعه)</div>{Environment.NewLine}" + $"<div class=\"spacer\"> </div>{Environment.NewLine}"; htmlText += $"<ol>{Environment.NewLine}"; foreach (var song in tracks) { htmlText += $"<li><p>{Environment.NewLine}"; var poem = await context.GanjoorPoems.AsNoTracking().Where(p => p.Id == song.PoemId).SingleAsync(); htmlText += $"<a href=\"{poem.FullUrl}\">{poem.FullTitle}</a> در "; if (song.TrackType == PoemMusicTrackType.Golha) { htmlText += "گلها » "; } else { htmlText += $"{song.ArtistName} » "; } htmlText += $"{song.AlbumName.ToPersianNumbers()} » <a href=\"{song.TrackUrl}\">{song.TrackName.ToPersianNumbers()}</a></p></li>{Environment.NewLine}"; } htmlText += $"</ol>{Environment.NewLine}"; } await _UpdatePageHtmlText(context, editingUserId, dbPage, "به روزرسانی خودکار صفحهٔ شاعران به روایت آهنگها", htmlText); }
private async Task _UpdateMundexPage(Guid editingUserId, RMuseumDbContext context, LongRunningJobProgressServiceEF jobProgressServiceEF, RLongRunningJobStatus job) { var poemMusicTracks = await context.GanjoorPoemMusicTracks .Where(m => m.TrackType == PoemMusicTrackType.BeepTunesOrKhosousi && 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.SingerId }) .Select(g => new { SingerId = g.Key.SingerId, TrackCount = g.Count() }) .OrderByDescending(g => g.TrackCount) .ToList(); using (HttpClient httpClient = new HttpClient()) for (int nSinger = 0; nSinger < singers.Count; nSinger++) { var singer = singers[nSinger]; var dbSinger = await context.GanjoorSingers.Where(s => s.Id == singer.SingerId).SingleAsync(); var tracks = poemMusicTracks. Where(m => m.SingerId == singer.SingerId) .OrderBy(m => m.PoemId) .ToList(); if (tracks.Count != singer.TrackCount) { continue;//!!! a weird situration I cannot figure out now! } htmlText += $"<p><br style=\"clear: both;\" /></p>{Environment.NewLine}"; htmlText += $"<h2>{(nSinger + 1).ToPersianNumbers()}. <a href=\"{dbSinger.Url}\">"; htmlText += $"{dbSinger.Name} ({singer.TrackCount.ToPersianNumbers()} قطعه)</a></h2>{Environment.NewLine}"; htmlText += "<div class=\"spacer\"> </div>"; if (dbSinger.RImageId != null) { var imageUrl = $"{WebServiceUrl.Url}/api/rimages/{dbSinger.RImageId}.jpg"; htmlText += $"<div style=\"width:240px;margin:auto\">{Environment.NewLine}" + $"<a href=\"{dbSinger.Url}\">{Environment.NewLine}" + $"<img src=\"{imageUrl}\" loading=\"lazy\" alt=\"{dbSinger.Name}\"/>{Environment.NewLine}" + $"</a>{Environment.NewLine}" + $"</div>{Environment.NewLine}"; } htmlText += $"<ol>{Environment.NewLine}"; foreach (var song in tracks) { 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); }