コード例 #1
0
        private void ResetData()
        {
            RestartRequired = false;
            DisablePropertyChange();
            PropertyInfo[] UserConfigurationProperties = typeof(UserConfigurationObject).GetProperties();
            foreach (PropertyInfo Property in UserConfigurationProperties)
            {
                Property.SetValue(UserConfiguration, Property.GetValue(App.CORE.UserConfiguration));
            }

            SiteExtensionObjects.Clear();
            DatabaseExtensionObjects.Clear();

            // Load Extensions
            IEnumerable <EnabledExtensionObject> EnabledSiteExtensionObjects     = UserConfiguration.EnabledExtensions.Where(ext => Equals(ext.ExtensionType, typeof(ISiteExtension).Name));
            IEnumerable <EnabledExtensionObject> EnabledDatabaseExtensionObjects = UserConfiguration.EnabledExtensions.Where(ext => Equals(ext.ExtensionType, typeof(IDatabaseExtension).Name));

            foreach (EnabledExtensionObject EnabledSiteExtensionObject in EnabledSiteExtensionObjects)
            {
                ISiteExtension SiteExtension = App.CORE.SiteExtensions[EnabledSiteExtensionObject.Name, EnabledSiteExtensionObject.Language];
                SiteExtensionObjects.Add(new ExtensionObject(SiteExtension, EnabledSiteExtensionObject.Enabled));
            }
            foreach (ISiteExtension SiteExtension in App.CORE.SiteExtensions)
            {
                String          Name = String.Format("{0} ({1})", SiteExtension.ExtensionDescriptionAttribute.Name, SiteExtension.ExtensionDescriptionAttribute.Language);
                ExtensionObject SiteExtensionObject = SiteExtensionObjects.FirstOrDefault(seo => Equals(seo.Name, Name));
                if (Equals(SiteExtensionObject, null))
                {
                    SiteExtensionObjects.Add(new ExtensionObject(SiteExtension, false));
                }
            }

            foreach (EnabledExtensionObject EnabledDatabaseExtensionObject in EnabledDatabaseExtensionObjects)
            {
                IDatabaseExtension DatabaseExtension = App.CORE.DatabaseExtensions[EnabledDatabaseExtensionObject.Name, EnabledDatabaseExtensionObject.Language];
                DatabaseExtensionObjects.Add(new ExtensionObject(DatabaseExtension, EnabledDatabaseExtensionObject.Enabled));
            }
            foreach (IDatabaseExtension DatabaseExtension in App.CORE.DatabaseExtensions)
            {
                String          Name = String.Format("{0} ({1})", DatabaseExtension.ExtensionDescriptionAttribute.Name, DatabaseExtension.ExtensionDescriptionAttribute.Language);
                ExtensionObject DatabaseExtensionObject = DatabaseExtensionObjects.FirstOrDefault(seo => Equals(seo.Name, Name));
                if (Equals(DatabaseExtensionObject, null))
                {
                    DatabaseExtensionObjects.Add(new ExtensionObject(DatabaseExtension, false));
                }
            }

            MangaCount = App.MangaCacheObjects.Count(mco =>
                                                     Equals(mco.MangaObject.MangaType, MangaObjectType.Manga));
            ManhwaCount = App.MangaCacheObjects.Count(mco =>
                                                      Equals(mco.MangaObject.MangaType, MangaObjectType.Manhua));
            ManhwaCount += App.MangaCacheObjects.Count(mco =>
                                                       Equals(mco.MangaObject.MangaType, MangaObjectType.Manhwa));
            UnknownCount = App.MangaCacheObjects.Count(mco =>
                                                       Equals(mco.MangaObject.MangaType, MangaObjectType.Unknown));
            TotalCount = MangaCount + ManhwaCount + UnknownCount;

            EnablePropertyChange();
        }
コード例 #2
0
        public async Task DownloadAsync(MangaObject MangaObject, ChapterObject ChapterObject, PageObject PageObject, IProgress <Int32> ProgressReporter = null)
        {
            String CK = CacheKey(MangaObject, ChapterObject, PageObject);

            if (ActiveDownloadsCache.Contains(CK))
            {
                return;
            }
            ActiveDownloadsCache.Set(CK, true, DateTimeOffset.MaxValue);

            try
            {
                // Only load page from we if ImgUrl is empty.
                if (String.IsNullOrWhiteSpace(PageObject.ImgUrl))
                {
                    await Task.Delay(TimeSpan.FromSeconds(1));

                    // Load the PageObject via Async and LimitedTaskFactory
                    PageObject = await ContentTaskFactory.StartNew(() => LoadPageObjectAsync(
                                                                       MangaObject,
                                                                       ChapterObject,
                                                                       PageObject,
                                                                       cts.Token,
                                                                       ProgressReporter)).Unwrap();

                    ChapterObject = await StorePageObject(MangaObject, ChapterObject, PageObject);
                }

                ISiteExtension SiteExtension = CORE.SiteExtensions.First(_SiteExtension =>
                                                                         { return(PageObject.Url.Contains(_SiteExtension.ExtensionDescriptionAttribute.URLFormat)); });
                // Start the DownloadImage task, don't wait.
                DownloadImage(PageObject.ImgUrl, PageObject.Url, SiteExtension.Cookies, SavePath(MangaObject, ChapterObject), Path.GetFileName(new Uri(PageObject.ImgUrl).LocalPath));
            }
            catch (Exception ex)
            {
                if (!Equals(CORE.Logger, null))
                {
                    CORE.Logger.Warn(String.Format("[ContentDownloadManager] An exception was thrown while processing {0}.", MangaObject.Name), ex);
                }
                throw ex;
            }
            finally
            {
                if (!Equals(ProgressReporter, null))
                {
                    ProgressReporter.Report(100);
                }
                ActiveDownloadsCache.Remove(CK);
            }
        }
コード例 #3
0
        private async Task <PageObject> LoadPageObjectAsync(MangaObject MangaObject, ChapterObject ChapterObject, PageObject PageObject, CancellationToken ct, IProgress <Int32> progress)
        {
            try
            {
                await TaskConcurrencySemaphore.WaitAsync(ct);

                ct.ThrowIfCancellationRequested();

                ISiteExtension SiteExtension = CORE.SiteExtensions.First(_SiteExtension => PageObject.Url.Contains(_SiteExtension.ExtensionDescriptionAttribute.URLFormat));
                using (WebDownloader WebDownloader = new WebDownloader(SiteExtension.Cookies))
                {
                    WebDownloader.Referer = SiteExtension.ExtensionDescriptionAttribute.RefererHeader;
                    DownloadProgressChangedEventHandler ProgressEventHandler = (s, e) =>
                    {
                        if (!Equals(progress, null))
                        {
                            progress.Report((Int32)Math.Round((Double)e.ProgressPercentage * 0.9));
                        }
                        ct.ThrowIfCancellationRequested();
                    };
                    WebDownloader.DownloadProgressChanged += ProgressEventHandler;

                    String PageWebContent = await WebDownloader.DownloadStringTaskAsync(PageObject.Url).Retry(DOWNLOAD_TIMEOUT);

                    PageObject = SiteExtension.ParsePageObject(PageWebContent);

                    WebDownloader.DownloadProgressChanged -= ProgressEventHandler;
                }
                if (!Equals(progress, null))
                {
                    progress.Report(100);
                }
                return(PageObject);
            }
            finally { TaskConcurrencySemaphore.Release(); }
        }
コード例 #4
0
ファイル: Program.cs プロジェクト: gitter-badger/myManga
        static MangaObject LoadMangaObject(String Link, ISiteExtension ise)
        {
            MangaObject MangaObj = null;
            ISiteExtensionDescriptionAttribute isea = ise.GetType().GetCustomAttribute<ISiteExtensionDescriptionAttribute>(false);

            HttpWebRequest request = WebRequest.Create(Link) as HttpWebRequest;
            request.Referer = isea.RefererHeader ?? request.Host;
            request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
            using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
            {
                using (StreamReader streamReader = new StreamReader(response.GetResponseStream()))
                {
                    MangaObj = ise.ParseMangaObject(streamReader.ReadToEnd());
                    MangaObj.Locations.Add(new LocationObject() { ExtensionName = isea.Name, Url = Link });
                }
            }
            return MangaObj;
        }
コード例 #5
0
        private async Task <List <MangaObject> > SearchMangaObjectAsync(String SearchTerm, CancellationToken ct, IProgress <Int32> progress)
        {
            List <MangaObject> SearchResults = new List <MangaObject>();

            if (!Equals(progress, null))
            {
                progress.Report(5);
            }

            Boolean firstResponse = true;
            IEnumerable <Task <ExtensionContentResult> > ExtensionContentTasksQuery =
                from Extension in ValidExtensions(CORE.Extensions, CORE.UserConfiguration.EnabledExtensions)
                select LoadExtensionSearchContent(Extension, SearchTerm);

            List <Task <ExtensionContentResult> > ExtensionContentTasks = ExtensionContentTasksQuery.ToList();
            Int32 OriginalExtensionContentTasksCount = ExtensionContentTasks.Count;

            if (!Equals(progress, null))
            {
                progress.Report(10);
            }
            while (ExtensionContentTasks.Count > 0)
            {   // Load Content via Async and process as they complete.
                ct.ThrowIfCancellationRequested();
                Task <ExtensionContentResult> completedTask = await Task.WhenAny(ExtensionContentTasks);

                ExtensionContentTasks.Remove(completedTask);
                ct.ThrowIfCancellationRequested();

                ExtensionContentResult LoadedExtensionContentResult = await completedTask;
                if (!Equals(LoadedExtensionContentResult, null))
                {
                    String Content = LoadedExtensionContentResult.Content;
                    if (LoadedExtensionContentResult.Extension is ISiteExtension)
                    {   // Extension was a ISiteExtension
                        ISiteExtension            SiteExtension       = LoadedExtensionContentResult.Extension as ISiteExtension;
                        List <SearchResultObject> SearchResultObjects = SiteExtension.ParseSearch(Content);
                        foreach (SearchResultObject SearchResultObject in SearchResultObjects)
                        {
                            MangaObject MangaObject = SearchResultObject.ConvertToMangaObject(),
                                                    ExistingMangaObject = SearchResults.FirstOrDefault(_MangaObject =>
                            {       // Locate an Existing MangaObject
                                List <String> ExistingMangaObjectNames = new List <String>(_MangaObject.AlternateNames),
                                MangaObjectNames = new List <String>(MangaObject.AlternateNames);
                                ExistingMangaObjectNames.Insert(0, _MangaObject.Name);
                                MangaObjectNames.Insert(0, MangaObject.Name);

                                ExistingMangaObjectNames = ExistingMangaObjectNames.Select(_ExistingMangaObjectName => SafeAlphaNumeric.Replace(_ExistingMangaObjectName.ToLower(), String.Empty)).ToList();
                                MangaObjectNames         = MangaObjectNames.Select(_MangaObjectNames => SafeAlphaNumeric.Replace(_MangaObjectNames.ToLower(), String.Empty)).ToList();

                                return(ExistingMangaObjectNames.Intersect(MangaObjectNames).Any());
                            });
                            if (Equals(ExistingMangaObject, null))
                            {
                                SearchResults.Add(MangaObject);
                            }
                            else
                            {
                                ExistingMangaObject.Merge(MangaObject);
                            }
                        }
                    }
                    else if (LoadedExtensionContentResult.Extension is IDatabaseExtension)
                    {   // Extension was a IDatabaseExtension
                        IDatabaseExtension    DatabaseExtension = LoadedExtensionContentResult.Extension as IDatabaseExtension;
                        List <DatabaseObject> DatabaseObjects   = DatabaseExtension.ParseSearch(Content);
                        foreach (DatabaseObject DatabaseObject in DatabaseObjects)
                        {
                            MangaObject ExistingMangaObject = SearchResults.FirstOrDefault(_MangaObject =>
                            {   // Locate an Existing MangaObject
                                List <String> ExistingMangaObjectNames = new List <String>(_MangaObject.AlternateNames),
                                DatabaseObjectNames = new List <String>(DatabaseObject.AlternateNames);

                                ExistingMangaObjectNames.Insert(0, _MangaObject.Name);
                                DatabaseObjectNames.Insert(0, DatabaseObject.Name);

                                ExistingMangaObjectNames = ExistingMangaObjectNames.Select(_ExistingMangaObjectName => SafeAlphaNumeric.Replace(_ExistingMangaObjectName.ToLower(), String.Empty)).ToList();
                                DatabaseObjectNames      = DatabaseObjectNames.Select(_DatabaseObjectNames => SafeAlphaNumeric.Replace(_DatabaseObjectNames.ToLower(), String.Empty)).ToList();

                                Int32 IntersectCount = ExistingMangaObjectNames.Intersect(DatabaseObjectNames).Count(),
                                ExistingHalfCount    = (Int32)Math.Ceiling((Double)ExistingMangaObjectNames.Count / 2);
                                return(IntersectCount >= ExistingHalfCount);
                            });
                            if (Equals(ExistingMangaObject, null))
                            {
                                MangaObject databaseMangaObject = new MangaObject();
                                databaseMangaObject.AttachDatabase(DatabaseObject, true, true);
                                SearchResults.Add(databaseMangaObject);
                            }
                            else
                            {
                                if (Equals(ExistingMangaObject.DatabaseLocations.FindIndex(_DatabaseLocation => Equals(
                                                                                               _DatabaseLocation.ExtensionName,
                                                                                               DatabaseExtension.ExtensionDescriptionAttribute.Name)), -1))
                                {
                                    ExistingMangaObject.AttachDatabase(DatabaseObject, preferDatabaseDescription: true);
                                }
                            }
                        }
                    }
                }
                firstResponse = Equals(SearchResults.Count, 0);
                Int32 ExtensionContentTasksProgress = (Int32)Math.Round(((Double)(OriginalExtensionContentTasksCount - ExtensionContentTasks.Count) / (Double)OriginalExtensionContentTasksCount) * 70);
                if (!Equals(progress, null))
                {
                    progress.Report(10 + ExtensionContentTasksProgress);
                }
            }

            if (!Equals(progress, null))
            {
                progress.Report(85);
            }
            ct.ThrowIfCancellationRequested();

            // Remove Database only results
            Int32 RemoveCount = SearchResults.RemoveAll(_ => Equals(_.Locations.Count, 0));

            if (!Equals(progress, null))
            {
                progress.Report(100);
            }
            ct.ThrowIfCancellationRequested();
            return(SearchResults);
        }
コード例 #6
0
        private async Task <ChapterObject> LoadChapterObjectAsync(MangaObject MangaObject, ChapterObject ChapterObject, CancellationToken ct, IProgress <Int32> progress)
        {
            try
            {
                await TaskConcurrencySemaphore.WaitAsync(ct);

                ct.ThrowIfCancellationRequested();

                // Store valid ISiteExtension
                IEnumerable <ISiteExtension> ValidSiteExtensions = ValidExtensions(CORE.SiteExtensions, CORE.UserConfiguration.EnabledExtensions).Cast <ISiteExtension>();

                // Re-Order the Chapter's LocationObjects to the EnabledExtensions order.
                IEnumerable <LocationObject> OrderedChapterObjectLocations = from EnExt in CORE.UserConfiguration.EnabledExtensions
                                                                             where ChapterObject.Locations.Exists(LocObj => EnExt.EqualsLocationObject(LocObj))
                                                                             select ChapterObject.Locations.FirstOrDefault(LocObj => EnExt.EqualsLocationObject(LocObj));

                foreach (LocationObject LocationObject in OrderedChapterObjectLocations)
                {
                    ct.ThrowIfCancellationRequested();
                    ISiteExtension SiteExtension = ValidSiteExtensions.FirstOrDefault(_ => LocationObjectExtension(_, LocationObject));
                    if (Equals(SiteExtension, null))
                    {
                        continue;                               // Continue with the foreach loop
                    }
                    ct.ThrowIfCancellationRequested();
                    using (WebDownloader WebDownloader = new WebDownloader(SiteExtension.Cookies))
                    {
                        WebDownloader.Encoding = System.Text.Encoding.UTF8;
                        WebDownloader.Referer  = SiteExtension.ExtensionDescriptionAttribute.RefererHeader;
                        DownloadProgressChangedEventHandler ProgressEventHandler = (s, e) =>
                        {
                            if (!Equals(progress, null))
                            {
                                progress.Report((Int32)Math.Round((Double)e.ProgressPercentage * 0.9));
                            }
                            ct.ThrowIfCancellationRequested();
                        };
                        WebDownloader.DownloadProgressChanged += ProgressEventHandler;

                        String ChapterWebContent = await WebDownloader.DownloadStringTaskAsync(LocationObject.Url).Retry(DOWNLOAD_TIMEOUT);

                        ChapterObject DownloadedChapterObject = SiteExtension.ParseChapterObject(ChapterWebContent);

                        WebDownloader.DownloadProgressChanged -= ProgressEventHandler;
                        ct.ThrowIfCancellationRequested();
                        if (!Equals(DownloadedChapterObject, null))
                        {
                            ChapterObject.Merge(DownloadedChapterObject);
                            ChapterObject.Pages = DownloadedChapterObject.Pages;
                            break;  // Break free of the foreach loop
                        }
                    }
                }
                if (!Equals(progress, null))
                {
                    progress.Report(100);
                }
                ct.ThrowIfCancellationRequested();
                return(ChapterObject);
            }
            finally { TaskConcurrencySemaphore.Release(); }
        }