public async Task <bool> RemoveCacheRequest(string rawVideoId, NicoVideoQuality quality) { NicoVideoCacheRequest removeTarget = null; using (var pendingVideoLockReleaser = await _CacheDownloadPendingVideosLock.LockAsync()) { removeTarget = _CacheDownloadPendingVideos.SingleOrDefault(x => x.RawVideoId == rawVideoId && x.Quality == quality); } // ダウンロード中タスクを削除(DLのキャンセル) bool removed = false; if (removeTarget != null) { await RemoveDownloadOperation(removeTarget); using (var pendingVideoLockReleaser = await _CacheDownloadPendingVideosLock.LockAsync()) { _CacheDownloadPendingVideos.Remove(removeTarget); } await SaveDownloadRequestItems(); RequestCanceled?.Invoke(this, removeTarget); removed = true; } await TryNextCacheRequestedVideoDownload(); return(removed); }
public async Task <bool> CancelCacheRequest(string rawVideoId, NicoVideoQuality quality) { bool removed = false; var items = await GetCacheRequest(rawVideoId); var item = items.FirstOrDefault(x => x.Quality == quality); if (item != null) { switch (item.ToCacheState()) { case NicoVideoCacheState.Pending: using (var releaser2 = await _CacheRequestProcessingLock.LockAsync()) { var removeTarget = _CacheDownloadPendingVideos.FirstOrDefault(x => x.RawVideoId == rawVideoId && x.Quality == quality); removed = _CacheDownloadPendingVideos.Remove(removeTarget); await SaveDownloadRequestItems(); } break; case NicoVideoCacheState.Downloading: var canceledReq = await CancelDownload(rawVideoId, quality); await Task.Delay(500); using (var releaser2 = await _CacheRequestProcessingLock.LockAsync()) { var removeTarget = _CacheDownloadPendingVideos.FirstOrDefault(x => x.RawVideoId == rawVideoId && x.Quality == quality); removed = _CacheDownloadPendingVideos.Remove(removeTarget); await SaveDownloadRequestItems(); } removed = canceledReq != null; break; case NicoVideoCacheState.Cached: removed = await DeleteCachedVideo(rawVideoId, quality); break; default: break; } } if (removed) { RequestCanceled?.Invoke(this, item); VideoCacheStateChanged?.Invoke(this, new VideoCacheStateChangedEventArgs() { CacheState = NicoVideoCacheState.NotCacheRequested, Request = item }); return(true); } else { return(false); } }
public async Task <int> DeleteCachedVideo(string videoId) { int deletedCount = 0; if (_CacheVideos.TryRemove(videoId, out var cachedItems)) { foreach (var target in cachedItems) { var result = await target.Delete(); if (cachedItems.Count == 0) { _CacheVideos.TryRemove(videoId, out var list); break; } RequestCanceled?.Invoke(this, target); VideoCacheStateChanged?.Invoke(this, new VideoCacheStateChangedEventArgs() { CacheState = NicoVideoCacheState.NotCacheRequested, Request = target }); if (result) { deletedCount++; } } } return(deletedCount); }
private void WebClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { IsDownloading = false; if (e.Error == null) { if (!e.Cancelled) { OnRequestCompleted(e.Result); RequestCompleted.IfNotNull(i => i(this, e.Result)); } else { RequestCanceled.IfNotNull(i => i(this)); } } else { OnRequestFailed(e.Error); RequestFailed.IfNotNull(i => i(this, e.Error)); } }
public async Task <bool> DeleteCachedVideo(string videoId, NicoVideoQuality quality) { using (var releaser = await _CacheRequestProcessingLock.LockAsync()) { if (_CacheVideos.TryGetValue(videoId, out var cachedItems)) { var removeCached = cachedItems.FirstOrDefault(x => x.RawVideoId == videoId && x.Quality == quality); if (removeCached != null) { var result = await removeCached.Delete(); if (result) { cachedItems.Remove(removeCached); } if (cachedItems.Count == 0) { _CacheVideos.TryRemove(videoId, out var list); } RequestCanceled?.Invoke(this, removeCached); VideoCacheStateChanged?.Invoke(this, new VideoCacheStateChangedEventArgs() { CacheState = NicoVideoCacheState.NotCacheRequested, Request = removeCached }); return(result); } } return(false); } }