예제 #1
0
        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);
        }
예제 #2
0
        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);
            }
        }
예제 #3
0
        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);
        }
예제 #4
0
        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));
            }
        }
예제 #5
0
        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);
            }
        }