Ejemplo n.º 1
0
        /// <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));
        }
Ejemplo n.º 3
0
        /// <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()));
            }
        }
Ejemplo n.º 6
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("");
        }
Ejemplo n.º 7
0
        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()));
            }
        }
Ejemplo n.º 8
0
        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);
            }
        }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 11
0
        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\">&nbsp;</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\">&nbsp;</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);
        }
Ejemplo n.º 12
0
        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\">&nbsp;</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);
        }