/// <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); }
public static void Set(MangaSettingCache cache) { caches.AddOrUpdate(cache.Plugin, cache, (_, __) => cache); }
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); }