Пример #1
0
 /// <summary>
 /// constructor
 /// </summary>
 /// <param name="src"></param>
 /// <param name="appUser"></param>
 /// <param name="poem"></param>
 /// <param name="mistake"></param>
 public RecitationViewModel(Recitation src, RAppUser appUser, GanjoorPoem poem, string mistake)
 {
     Id    = src.Id;
     Owner = new PublicRAppUser()
     {
         Id             = appUser.Id,
         Username       = appUser.UserName,
         Email          = appUser.Email,
         FirstName      = appUser.FirstName,
         SureName       = appUser.SureName,
         PhoneNumber    = appUser.PhoneNumber,
         RImageId       = appUser.RImageId,
         Status         = appUser.Status,
         NickName       = appUser.NickName,
         Website        = appUser.Website,
         Bio            = appUser.Bio,
         EmailConfirmed = appUser.EmailConfirmed
     };
     GanjoorAudioId           = src.GanjoorAudioId;
     GanjoorPostId            = src.GanjoorPostId;
     AudioOrder               = src.AudioOrder;
     FileNameWithoutExtension = src.FileNameWithoutExtension;
     SoundFilesFolder         = src.SoundFilesFolder;
     AudioTitle               = src.AudioTitle;
     AudioArtist              = src.AudioArtist;
     AudioArtistUrl           = src.AudioArtistUrl;
     AudioSrc         = src.AudioSrc;
     AudioSrcUrl      = src.AudioSrcUrl;
     LegacyAudioGuid  = src.LegacyAudioGuid;
     Mp3FileCheckSum  = src.Mp3FileCheckSum;
     Mp3SizeInBytes   = src.Mp3SizeInBytes;
     OggSizeInBytes   = src.OggSizeInBytes;
     LocalMp3FilePath = src.LocalMp3FilePath;
     LocalXmlFilePath = src.LocalXmlFilePath;
     ReviewStatus     = src.ReviewStatus;
     UploadDate       = src.UploadDate;
     FileLastUpdated  = src.FileLastUpdated;
     ReviewDate       = src.ReviewDate;
     if (poem != null)
     {
         PoemFullTitle = poem.FullTitle;
         PoemFullUrl   = poem.FullUrl;
     }
     AudioSyncStatus = src.AudioSyncStatus;
     if (string.IsNullOrEmpty(mistake))
     {
         ReviewMsg = src.ReviewMsg;
     }
     else
     {
         ReviewMsg = mistake;
     }
 }
Пример #2
0
        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("");
        }
Пример #3
0
        /// <summary>
        /// Apply corrections from sqlite
        /// </summary>
        /// <param name="poetId"></param>
        /// <param name="file"></param>
        /// <param name="note"></param>
        /// <returns></returns>
        public async Task <RServiceResult <bool> > ApplyCorrectionsFromSqlite(int poetId, IFormFile file, string note)
        {
            try
            {
                string dir = Path.Combine($"{Configuration.GetSection("PictureFileService")["StoragePath"]}", "SQLiteImports");
                if (!Directory.Exists(dir))
                {
                    Directory.CreateDirectory(dir);
                }

                string filePath = Path.Combine(dir, file.FileName);
                if (File.Exists(filePath))
                {
                    File.Delete(filePath);
                }
                using (FileStream fsMain = new FileStream(filePath, FileMode.Create))
                {
                    await file.CopyToAsync(fsMain);
                }

                string email  = $"{Configuration.GetSection("Ganjoor")["SystemEmail"]}";
                var    userId = (await _appUserService.FindUserByEmail(email)).Result.Id;

                _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("ApplyCorrectionsFromSqlite", "Query data")).Result;

                        try
                        {
                            SqliteConnectionStringBuilder connectionStringBuilder = new SqliteConnectionStringBuilder();
                            connectionStringBuilder.DataSource = filePath;
                            using (SqliteConnection sqliteConnection = new SqliteConnection(connectionStringBuilder.ToString()))
                            {
                                await sqliteConnection.OpenAsync();
                                IDbConnection sqlite = sqliteConnection;
                                var poets            = (await sqlite.QueryAsync("SELECT * FROM poet")).ToList();
                                if (poets.Count != 1)
                                {
                                    await jobProgressServiceEF.UpdateJob(job.Id, 100, "", false, "poets count in sqlite db is not equal to 1");
                                }

                                int poemNumber = 0;
                                foreach (var poem in await sqlite.QueryAsync($"SELECT * FROM poem ORDER BY id"))
                                {
                                    poemNumber++;
                                    await jobProgressServiceEF.UpdateJob(job.Id, poemNumber, "", false);

                                    int poemId = (int)poem.id;

                                    GanjoorPoem dbPoem = await context.GanjoorPoems.Include(p => p.Cat).Where(p => p.Id == poemId).SingleOrDefaultAsync();

                                    if (dbPoem == null)
                                    {
                                        continue;
                                    }

                                    if (dbPoem.Cat.PoetId != poetId)
                                    {
                                        continue;
                                    }

                                    string comment  = $"<p>تغییرات حاصل از پردازش {note}</p>{Environment.NewLine}";
                                    bool anyChanges = false;

                                    var dbPage = await context.GanjoorPages.Where(p => p.Id == poemId).SingleOrDefaultAsync();

                                    GanjoorPageSnapshot snapshot = new GanjoorPageSnapshot()
                                    {
                                        GanjoorPageId        = poemId,
                                        MadeObsoleteByUserId = (Guid)userId,
                                        RecordDate           = DateTime.Now,
                                        Note     = note,
                                        Title    = dbPage.Title,
                                        UrlSlug  = dbPage.UrlSlug,
                                        HtmlText = dbPage.HtmlText,
                                    };

                                    string poemTitle = poem.title;
                                    if (poemTitle != dbPoem.Title)
                                    {
                                        anyChanges       = true;
                                        comment         += $"<p>تغییر عنوان از «{dbPoem.Title}» به «{poemTitle}»</p>{Environment.NewLine}";
                                        dbPoem.Title     = poemTitle;
                                        dbPoem.FullTitle = $"{dbPoem.Cat.FullUrl} » {dbPoem.Title}";
                                        context.GanjoorPoems.Update(dbPoem);
                                    }


                                    var sqliteVerses = new List <dynamic>(await sqlite.QueryAsync($"SELECT * FROM verse WHERE poem_id = {poem.id} ORDER BY vorder"));
                                    var dbVerses     = await context.GanjoorVerses.Where(v => v.PoemId == poemId).OrderBy(v => v.VOrder).ToListAsync();

                                    int vIndex = 0;
                                    while (vIndex < sqliteVerses.Count && vIndex < dbVerses.Count)
                                    {
                                        if (sqliteVerses[vIndex].vorder != dbVerses[vIndex].VOrder)
                                        {
                                            vIndex = -1;
                                            break;
                                        }

                                        string text = sqliteVerses[vIndex].text;
                                        text        = text.Replace("ـ", "").Replace("  ", " ").ApplyCorrectYeKe().Trim();

                                        if (text == dbVerses[vIndex].Text)
                                        {
                                            vIndex++;
                                            continue;
                                        }

                                        comment += $"<p>تغییر مصرع {vIndex + 1} از «{dbVerses[vIndex].Text}» به «{text}»</p>{Environment.NewLine}".ToPersianNumbers();

                                        dbVerses[vIndex].Text = text;

                                        context.GanjoorVerses.Update(dbVerses[vIndex]);

                                        anyChanges = true;
                                        vIndex++;
                                    }

                                    if (vIndex != -1)
                                    {
                                        while (vIndex < dbVerses.Count)
                                        {
                                            comment += $"<p>حذف مصرع {vIndex + 1} با متن «{dbVerses[vIndex].Text}»</p>{Environment.NewLine}".ToPersianNumbers();
                                            context.GanjoorVerses.Remove(dbVerses[vIndex]);
                                            vIndex++;
                                            anyChanges = true;
                                        }

                                        while (vIndex < sqliteVerses.Count)
                                        {
                                            string text  = sqliteVerses[vIndex].text;
                                            text         = text.Replace("ـ", "").Replace("  ", " ").ApplyCorrectYeKe().Trim();
                                            int vOrder   = int.Parse(sqliteVerses[vIndex].vorder.ToString());
                                            int position = int.Parse(sqliteVerses[vIndex].position.ToString());
                                            comment     += $"<p>اضافه شدن مصرع {vIndex + 1} با متن «{text}»</p>{Environment.NewLine}".ToPersianNumbers();
                                            context.GanjoorVerses.Add
                                            (
                                                new GanjoorVerse()
                                            {
                                                PoemId        = poemId,
                                                VOrder        = vOrder,
                                                VersePosition = (VersePosition)position,
                                                Text          = text
                                            }
                                            );
                                            vIndex++;
                                            anyChanges = true;
                                        }



                                        if (anyChanges)
                                        {
                                            await _FillPoemCoupletIndices(context, poemId);
                                            GanjoorComment sysComment = new GanjoorComment()
                                            {
                                                UserId          = userId,
                                                AuthorIpAddress = "127.0.0.1",
                                                CommentDate     = DateTime.Now,
                                                HtmlComment     = comment,
                                                PoemId          = poemId,
                                                Status          = PublishStatus.Published,
                                            };
                                            context.GanjoorComments.Add(sysComment);

                                            context.GanjoorPageSnapshots.Add(snapshot);

                                            await context.SaveChangesAsync();

                                            var poemVerses = await context.GanjoorVerses.Where(v => v.PoemId == poemId).OrderBy(v => v.VOrder).ToListAsync();

                                            bool needsNewVOrder = false;
                                            for (int i = 0; i < poemVerses.Count; i++)
                                            {
                                                if (poemVerses[i].VOrder != (i + 1))
                                                {
                                                    poemVerses[i].VOrder = i + 1;
                                                    needsNewVOrder       = true;
                                                }
                                            }
                                            if (needsNewVOrder)
                                            {
                                                context.GanjoorVerses.UpdateRange(poemVerses);
                                            }

                                            dbPoem.PlainText = PreparePlainText(poemVerses);
                                            dbPoem.HtmlText  = PrepareHtmlText(poemVerses);
                                            dbPage.HtmlText  = dbPoem.HtmlText;
                                            dbPage.Title     = dbPoem.Title;
                                            dbPage.FullTitle = dbPoem.FullTitle;

                                            try
                                            {
                                                var poemRhymeLettersRes = LanguageUtils.FindRhyme(poemVerses);
                                                if (!string.IsNullOrEmpty(poemRhymeLettersRes.Rhyme))
                                                {
                                                    dbPoem.RhymeLetters = poemRhymeLettersRes.Rhyme;
                                                }
                                            }
                                            catch
                                            {
                                            }


                                            context.GanjoorPoems.Update(dbPoem);
                                            context.GanjoorPages.Update(dbPage);

                                            await context.SaveChangesAsync();
                                        }
                                    }
                                }

                                await jobProgressServiceEF.UpdateJob(job.Id, 100, "", true);
                            }
                        }
                        catch (Exception exp)
                        {
                            await jobProgressServiceEF.UpdateJob(job.Id, 100, "", false, exp.ToString());
                        }
                    }

                    File.Delete(filePath);
                }
                );
            }
            catch (Exception exp)
            {
                return(new RServiceResult <bool>(false, exp.ToString()));
            }



            return(new RServiceResult <bool>(true));
        }