Esempio n. 1
0
        /// <summary>
        /// Скачать файл.
        /// </summary>
        /// <param name="uri">Ссылка на страницу манги.</param>
        /// <param name="settingCache">Настройки сети.</param>
        /// <returns>Содержимое файла.</returns>
        public static async Task <ImageFile> DownloadImage(Uri uri, MangaSettingCache settingCache)
        {
            byte[]      result;
            WebResponse response;
            var         file    = new ImageFile();
            var         request = (HttpWebRequest)WebRequest.Create(uri);

            request.Referer = uri.Host;
            request.Proxy   = settingCache.Proxy;

            try
            {
                response = await request.GetResponseAsync().ConfigureAwait(false);

                result = await CopyTo(response.GetResponseStream()).ConfigureAwait(false);
            }
            catch (System.Exception ex)
            {
                Log.Exception(ex, string.Format($"Загрузка {uri} не завершена. Использованы настройки прокси {settingCache.SettingType}"));
                return(file);
            }
            if (response.ContentLength <= result.LongLength)
            {
                file.Body = result;
            }
            return(file);
        }
Esempio n. 2
0
 public static void Set(MangaSettingCache cache)
 {
     caches.AddOrUpdate(cache.Plugin, cache, (_, __) => cache);
 }
Esempio n. 3
0
        public override async Task BeforeSave(ChangeTrackerArgs args)
        {
            if (!DirectoryHelpers.ValidateSettingPath(this.Folder))
            {
                throw new DirectoryNotFoundException($"Не найдена папка {this.Folder}, папка должна существовать.");
            }

            if (!args.IsNewEntity)
            {
                using (var context = Repository.GetEntityContext())
                {
                    var folderState = args.GetPropertyState <string>(nameof(Folder));
                    if (folderState.IsChanged)
                    {
                        var mangaFolders = await context.Get <IManga>().Select(m => m.Folder).ToListAsync().ConfigureAwait(false);

                        mangaFolders = mangaFolders.Select(DirectoryHelpers.GetAbsoluteFolderPath).ToList();
                        var settingAbsoluteFolderPath = DirectoryHelpers.GetAbsoluteFolderPath(this.Folder);
                        if (mangaFolders.Any(f => DirectoryHelpers.Equals(f, settingAbsoluteFolderPath) || DirectoryHelpers.IsSubfolder(f, settingAbsoluteFolderPath)))
                        {
                            throw new MangaSettingSaveValidationException($"Папка {this.Folder} используется мангой.", this);
                        }
                    }

                    var uriState = args.GetPropertyState <Uri>(nameof(MainUri));
                    if (folderState.IsChanged || uriState.IsChanged)
                    {
                        if (!args.CanAddEntities)
                        {
                            var debugMessage = $"Manga settings {MangaName}({Manga:D}) changed:";
                            if (folderState.IsChanged)
                            {
                                debugMessage += $" folder changed from '{folderState.OldValue}' to '{folderState.Value}'";
                            }
                            if (uriState.IsChanged)
                            {
                                debugMessage += $" uri changed from '{uriState.OldValue}' to '{uriState.Value}'";
                            }
                            Log.Add(debugMessage);
                        }

                        // Changed manga will be added to session.
                        if (args.CanAddEntities)
                        {
                            if (uriState.IsChanged &&
                                Login != null &&
                                Equals(Login.MainUri, uriState.OldValue) &&
                                !Equals(Login.MainUri, uriState.Value))
                            {
                                Login.MainUri = MainUri;
                            }

                            var mangas = await context.Get <IManga>().Where(m => m.Setting == this).ToListAsync().ConfigureAwait(false);

                            foreach (var manga in mangas)
                            {
                                if (uriState.IsChanged)
                                {
                                    manga.Uri = new Uri(manga.Uri.OriginalString.Replace(uriState.OldValue.GetLeftPart(UriPartial.Authority), uriState.Value.GetLeftPart(UriPartial.Authority)));
                                }
                                if (folderState.IsChanged)
                                {
                                    manga.RefreshFolder();
                                }
                                await context.AddToTransaction(manga).ConfigureAwait(false);
                            }
                        }
                    }

                    if (!args.CanAddEntities)
                    {
                        var proxyState = args.GetPropertyState <ProxySetting>(nameof(ProxySetting));
                        if (proxyState.IsChanged)
                        {
                            MangaSettingCache.RevalidateSetting(MangaSettingCache.GetPluginType(this), proxyState.Value);
                        }
                    }
                }
            }

            await base.BeforeSave(args).ConfigureAwait(false);
        }