예제 #1
0
        private void Downloader_OnChange(IDownloadInfo downloadInfo, Action <IDownloadInfo> downloaderCallback = null)
        {
            downloaderCallback?.Invoke(downloadInfo);

            switch (downloadInfo.State)
            {
            case IDownloadInfo.DownloadState.Initializing:
                break;

            case IDownloadInfo.DownloadState.Downloading:
                // Check average speed and potentially do something if it's taking too long to download this magnet.
                break;

            case IDownloadInfo.DownloadState.Waiting:
                // This is not started yet, probably because we've reached max concurrent and there are other higher priority downloads.
                break;

            case IDownloadInfo.DownloadState.Completed:
                // Lets pass this information to IFileHandler which will move files into the proper location (Series or Movie folder)
                DeliverContent(downloadInfo);
                break;

            case IDownloadInfo.DownloadState.Failed:
                // If it's failed, retry same magnet or maybe try selecting another one if possible.
                break;
            }
        }
예제 #2
0
 public DownloadMemoryData(IDownloadInfo downloadInfo, DownloadStatus status, bool isLocalDownload, string error)
 {
     DownloadInfo    = downloadInfo;
     IsLocalDownload = isLocalDownload;
     Status          = status;
     Error           = error;
 }
예제 #3
0
        public FileResult DeliverFiles(IDownloadInfo downloadInfo, List <Media> relatedMedia)
        {
            var delivery = HandleFileDelivery(downloadInfo, relatedMedia);

            this.OnChange?.Invoke(delivery, relatedMedia);
            return(delivery);
        }
예제 #4
0
 public DownloadViewModel(IDownloadInfoExpand packet)
 {
     _downloadInfo    = packet.DownloadInfo;
     _all             = packet.TimePeriodsAll;
     _downloaded      = packet.TimePeriodsCompleted;
     GuidCode         = packet.GuidCode;
     Quality          = packet.Quality;
     Size             = getByteLengthString(packet.Size);
     IPAddress        = packet.DownloadInfo.SourceIp;
     BeginTime        = GlobalProcess.TimeFormatOfCn(packet.DownloadInfo.BeginTime);
     EndTime          = GlobalProcess.TimeFormatOfCn(packet.DownloadInfo.EndTime);
     DownloadTimeSpan = (packet.DownloadInfo.EndTime - packet.DownloadInfo.BeginTime).ToString();
     updateStatus(packet.DownloadStatus);
     IsLocalDownload = packet.IsLocalDownload;
     updateSlider();
     ErrorInfo = packet.ErrorInfo;
     updatedLastestTime(packet.UpdatedLastestTime);
     updateSpeed(packet.Speed);
     PlayingCommand   = new CommandDelegate(_ => Play());
     DeleteCommand    = new CommandDelegate(_ => Delete());
     GoTopCommand     = new CommandDelegate(_ => GoTop());
     OpenCommand      = new CommandDelegate(_ => Open());
     PropertyChanged += onPropertyChanged;
     if (packet.DownloadInfo.VideoName != null)
     {
         Name = string.Format("{0} ({1})", packet.DownloadInfo.VideoName, packet.Name);
     }
     else
     {
         Name = packet.Name;
     }
 }
        private OnlineDownloadManager add(IDownloadInfo info, DownloadStatus status, bool isPrior, bool isLocalDownload, string errorInfo = null)
        {
            OnlineDownloadManager down = isLocalDownload? GetDownloadManager(info) : GetDownloadManagerIgnorePath(info);

            if (down == null)
            {
                down = new OnlineDownloadManager(info, status, isLocalDownload, errorInfo);
                add(down);
                down.SetPriority(isPrior);
                _needWriting = true;
            }
            else
            {
                if (isPrior)
                {
                    down.SetPriority(isPrior);
                }
                if (!down.IsLocalDownload && isLocalDownload)
                {
                    down.DownloadToLocal(info.DownloadPath);
                }
            }
            Logger.Default.Trace($"添加下载任务:Guid: {down.GuidCode} 名称:{info.VideoName}, VideoId:{info.VideoId}, Stream:{info.StreamId}," +
                                 $" Path:{info.DownloadPath}. Begin:{info.BeginTime}, End:{info.EndTime}, " +
                                 $"SourceIp:{info.SourceIp}, SourcePort:{info.SourcePort},本地:{isLocalDownload}");
            return(down);
        }
예제 #6
0
 public OnlineDownloadManager(IDownloadInfo info, DownloadStatus status, bool isLocalDownload, string errorInfo)
 {
     GuidCode        = Guid.NewGuid();
     IsLocalDownload = isLocalDownload;
     initDownloader(info, status, errorInfo);
     updateThread();
     Quality = "标清";
 }
예제 #7
0
        private void DeliverContent(IDownloadInfo downloadInfo, int retry = 0)
        {
            if (downloadInfo.State != IDownloadInfo.DownloadState.Completed)
            {
                return;
            }

            var relatedMedia = this.Library.GetMediaWithMagnet(downloadInfo.MagnetUri);

            lock (GetLockForUri(downloadInfo.MagnetUri))
            {
                if (relatedMedia?.Any(x => x.State != Media.MediaState.Collected) ?? false)
                {
                    var deliveryResult = this.File.DeliverFiles(downloadInfo, relatedMedia);
                    if (deliveryResult.Status == FileService.FileResult.ActionStatus.OK)
                    {
                        try
                        {
                            var fileRenamePattern = this.Config.RenameFilePattern?.GetValueByKey(relatedMedia.FirstOrDefault().GetType().Name);
                            if (!string.IsNullOrEmpty(fileRenamePattern))
                            {
                                foreach (var media in relatedMedia)
                                {
                                    this.File.RenameMediaFileTo(media, SmartFormat.Smart.Format(fileRenamePattern, media));
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            // ?
                        }

                        var indexers = this.Scouter.GetIndexersForMedia(relatedMedia.First());

                        var quality = indexers.Select(x => x.GetQualityLevel(downloadInfo.Name)).OrderByDescending(x => x).FirstOrDefault();
                        var traits  = indexers.Select(x => x.GetTraits(downloadInfo.Name)).OrderByDescending(x => x.Length).FirstOrDefault();

                        var changes = this.Library.SetMediaAsCollected(relatedMedia.ToArray(), IndexerQualityLevelToTraktResolution(quality), IndexerQualityTraitsToTraktAudio(traits));
                        if (changes.Any())
                        {
                            this.Library.Save();
                        }

                        this.Downloader.Stop(downloadInfo.MagnetUri, this.File.Config.CleanUpSource, true);
                    }
                    else if (deliveryResult.Status == FileService.FileResult.ActionStatus.TransientError && retry < 3)
                    {
                        retry++;
                        Task.Delay(TimeSpan.FromMinutes(retry * 5)).ContinueWith((t) => { DeliverContent(downloadInfo, retry); });
                    }
                }
                else
                {
                    this.Downloader.Stop(downloadInfo.MagnetUri, true, true);
                }
            }
        }
예제 #8
0
 public static void AssertAreEqual(IDownloadInfo p1, IDownloadInfo p2)
 {
     DownloadInfoParam.AreEqual(p1, p2);
     Assert.AreEqual(p1.SourceIp, p2.SourceIp);
     Assert.AreEqual(p1.SourcePort, p2.SourcePort);
     Assert.AreEqual(p1.DownloadPath, p2.DownloadPath);
     Assert.AreEqual(p1.BeginTime, p2.BeginTime);
     Assert.AreEqual(p1.EndTime, p2.EndTime);
     Assert.AreEqual(p1.VideoId, p2.VideoId);
     Assert.AreEqual(p1.StreamId, p2.StreamId);
 }
예제 #9
0
 public static byte[] Encode(IDownloadInfo param)
 {
     using (MemoryStream ms = new MemoryStream())
     {
         PacketBase.WriteBytes(ms, param.SourceIp);
         PacketBase.WriteBytes(ms, param.SourcePort);
         PacketBase.WriteBytes(ms, param.DownloadPath);
         PacketBase.WriteBytes(ms, VideoBaseInfomParam.Encode(param as IVideoBaseInfom));
         return(ms.ToArray());
     }
 }
예제 #10
0
        public void Update(DownloadCode code, object value)
        {
            switch (code)
            {
            case DownloadCode.DownloadInfo:
                var param = (DownloadInfoParam)value;
                _downloadInfo = param;
                IPAddress     = param.SourceIp;
                break;

            case DownloadCode.Name:
                Name = (string)value;
                break;

            case DownloadCode.Quality:
                Quality = (string)value;
                break;

            case DownloadCode.TimePeriodsAll:
                _all = (TimePeriodPacket[])value;
                updateSlider();
                break;

            case DownloadCode.TimePeriodsCompleted:
                _downloaded = (TimePeriodPacket[])value;
                updateSlider();
                break;

            case DownloadCode.Size:
                Size = getByteLengthString((long)value);
                break;

            case DownloadCode.IsLocalDownload:
                IsLocalDownload = (bool)value;
                onRefresh();
                break;

            case DownloadCode.Status:
                updateStatus((DownloadStatus)(int)value);
                break;

            case DownloadCode.Speed:
                updateSpeed((long)value);
                break;

            case DownloadCode.ErrorInfo:
                ErrorInfo = (string)value;
                break;

            case DownloadCode.UpdatedLastestTime:
                updatedLastestTime((DateTime)value);
                break;
            }
        }
예제 #11
0
 private void updateName(IDownloadInfo info)
 {
     if (IsLocalDownload)
     {
         Name = string.Format($"{info.VideoId}_{info.StreamId}");
     }
     else
     {
         Name = GuidCode.ToString();
     }
 }
예제 #12
0
        public static new IDownloadInfo[] DecodeArray(Stream stream)
        {
            int len = PacketBase.ReadInt(stream);

            IDownloadInfo[] infos = new IDownloadInfo[len];
            for (int i = 0; i < len; i++)
            {
                infos[i] = Decode(stream);
            }
            return(infos);
        }
예제 #13
0
 void updateMoveDirect(IDownloadInfo info, string oldName, string path, ref string error)
 {
     try
     {
         moveTo(info.DownloadPath, path, oldName);
         info.UpdatePath(path);
     }
     catch (Exception ex)
     {
         error = string.Format("下载到指定路径\"{0}\"错误!\n当前下载路径:{1}\n{2}", path, info.DownloadPath, ex.Message);
     }
 }
예제 #14
0
 private void initDownloader(IDownloadInfo info, DownloadStatus status, string errorInfo)
 {
     updateName(info);
     _downloader = new Downloader(info, status, errorInfo, Name);
     onSize();
     _downloader.SizeEvent += onSize;
     onTimePeriodsCompleted();
     _downloader.TimePeriodsAllEvent       += onTimePeriodsAll;
     _downloader.TimePeriodsCompletedEvent += onTimePeriodsCompleted;
     onStatus();
     _downloader.DownloadStatusEvent += onStatus;
 }
예제 #15
0
 public static bool AreEqualIgnorePath(IDownloadInfo info1, IDownloadInfo info2)
 {
     if (info1 == info2)
     {
         return(true);
     }
     if (info1 == null || info2 == null)
     {
         return(false);
     }
     return(info1.SourceIp == info2.SourceIp && info1.SourcePort == info2.SourcePort &&
            info1.VideoId == info2.VideoId && info1.StreamId == info2.StreamId &&
            info1.BeginTime == info2.BeginTime && info1.EndTime == info2.EndTime);
 }
 public DownloadInfoExpandPacket(Guid guid, IDownloadInfo info, string name, string quality, long size, bool isLocalDownload, TimePeriodPacket[] timePeriods, TimePeriodPacket[] timePeriodsCompleted, DownloadStatus status, string errorInfo, DateTime updatedLastestTime, long speed)
 {
     GuidCode             = guid;
     DownloadInfo         = info;
     Name                 = name;
     Quality              = quality;
     Size                 = size;
     IsLocalDownload      = isLocalDownload;
     TimePeriodsAll       = timePeriods;
     TimePeriodsCompleted = timePeriodsCompleted;
     DownloadStatus       = status;
     ErrorInfo            = errorInfo;
     UpdatedLastestTime   = updatedLastestTime;
     Speed                = speed;
 }
예제 #17
0
 public Downloader(IDownloadInfo info, DownloadStatus status, string errorInfo, string name)
 {
     DownloadInfo = info;
     ErrorInfom   = errorInfo;
     Path         = System.IO.Path.Combine(DownloadInfo.DownloadPath, name);
     load();
     if (DownloadingStatus == DownloadStatus.Waiting)
     {
         if (DownloadStatusManager.IsDownloadingOrWaiting(status))
         {
             status = DownloadStatus.Waiting;
         }
         onStatus(status);
         updateFromDownloadedStatus();
     }
 }
        public static DownloadInfoExpandPacket Decode(MemoryStream ms)
        {
            Guid          guid            = PacketBase.ReadGuid(ms);
            IDownloadInfo di              = DownloadInfoParam.Decode(ms);
            string        name            = PacketBase.ReadString(ms);
            string        quality         = PacketBase.ReadString(ms);
            long          size            = PacketBase.ReadLong(ms);
            bool          isLocalDownload = PacketBase.ReadBool(ms);

            TimePeriodPacket[] tps       = TimePeriodPacket.DecodeArray(ms);
            TimePeriodPacket[] tpsc      = TimePeriodPacket.DecodeArray(ms);
            DownloadStatus     status    = (DownloadStatus)PacketBase.ReadInt(ms);
            string             errorInfo = PacketBase.ReadString(ms);
            DateTime           time      = PacketBase.ReadTime(ms);
            long speed = PacketBase.ReadLong(ms);

            return(new DownloadInfoExpandPacket(guid, di, name, quality, size, isLocalDownload, tps, tpsc, status, errorInfo, time, speed));
        }
예제 #19
0
        private void Play()
        {
            try
            {
                IDownloadInfo dInfo  = _downloadInfo;
                IUrl          ui     = null;
                VideoInfo[]   vInfos = new VideoInfo[] { new VideoInfo(dInfo.VideoId, dInfo.StreamId, dInfo.VideoName) };

                if (!new DirectoryInfo(Path.Combine(dInfo.DownloadPath, $"{dInfo.VideoId}_{dInfo.StreamId}")).Exists)
                {
                    //throw new FileNotFoundException("未找到该视频!");
                    vInfos = null;
                }

                ui = new RemoteUrl(dInfo.SourceIp, dInfo.SourcePort, dInfo.BeginTime, dInfo.EndTime, vInfos, dInfo.DownloadPath);

                string fileName = @"D:\Workspace\CCTV\CCTVReplay\CCTVReplay\bin\Debug\CCTVReplay.exe";
                if (!new System.IO.FileInfo(fileName).Exists)
                {
                    fileName = @"F:\CCTV\CCTVReplay\CCTVReplay\bin\Debug\CCTVReplay.exe";
                }
                if (!new System.IO.FileInfo(fileName).Exists)
                {
                    fileName = @"CCTVReplay.exe";
                }
                if (!new FileInfo(fileName).Exists)
                {
                    throw new FileNotFoundException("未找到播放软件!");
                }
                Process.Start(fileName, ui.ToString());
                Console.WriteLine("\n\n" + ui.ToString() + "\n\n");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
예제 #20
0
        private FileResult HandleFileDelivery(IDownloadInfo downloadInfo, List <Media> relatedMedia)
        {
            var physicalName = StripInvalidCharacters(GetPhysicalName(relatedMedia));

            var type      = GetMediaType(relatedMedia);
            var mediaPath = BuildMediaPath(type.Name, physicalName);

            var filesMoved      = new List <(string OldPath, string NewPath, long Size)>();
            var fileTypesToMove = this.Config.MediaTypes.Concat(this.Config.IncludeSubs ? new List <string> {
                "sub"
            } : new List <string>()).ToArray();

            try
            {
                if (!Directory.Exists(mediaPath))
                {
                    Directory.CreateDirectory(mediaPath);
                }

                foreach (var file in downloadInfo.Files.Where(x => fileTypesToMove.Contains(Path.GetExtension(x).Substring(1))))
                {
                    if (!File.Exists(file))
                    {
                        continue;
                    }

                    var newPath = Path.Combine(mediaPath, Path.GetFileName(file));
                    var size    = new FileInfo(file).Length;
                    for (int i = 1; i <= 4; i++)
                    {
                        try
                        {
                            File.Move(file, newPath);
                            filesMoved.Add((file, newPath, size));
                            break;
                        }
                        catch (IOException e) when((e.HResult & 0x0000FFFF) == 32 && i <= 3)  // ERROR_SHARING_VIOLATION
                        {
                            System.Threading.Tasks.Task.Delay(5000 * i).Wait();
                        }
                        catch (IOException e) when((e.HResult & 0x0000FFFF) == 183 && i <= 3) // ERROR_ALREADY_EXISTS
                        {
                            if (File.Exists(file) && File.Exists(newPath) && new FileInfo(file).Length > new FileInfo(newPath).Length)
                            {
                                File.Delete(newPath);
                                System.Threading.Tasks.Task.Delay(5000).Wait();
                                continue;
                            }
                            break;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                foreach (var revert in filesMoved)
                {
                    File.Move(revert.NewPath, revert.OldPath);
                }

                if (ex is IOException ioEx && ((ioEx.HResult & 0x0000FFFF) == 32))
                {
                    return(new FileResult {
                        Status = FileResult.ActionStatus.TransientError, Error = ioEx.ToString(), FolderName = physicalName
                    });
                }

                return(new FileResult {
                    Status = FileResult.ActionStatus.Error, Error = ex.ToString(), FolderName = physicalName
                });
            }

            var delivery = new FileResult
            {
                Action     = FileResult.FileAction.Deliver,
                Status     = filesMoved.Any(x => Path.GetExtension(x.NewPath) != ".sub") ? FileResult.ActionStatus.OK : FileResult.ActionStatus.MediaNotFound,
                Files      = filesMoved.OrderByDescending(x => x.Size).Select(x => Path.GetRelativePath(mediaPath, x.NewPath)).ToArray(),
                FolderName = physicalName
            };

            return(delivery);
        }
예제 #21
0
 public OnlineDownloadManager GetDownloadManager(IDownloadInfo info)
 {
     lock (_downloads)
         return(_downloads.FirstOrDefault(_ => DownloadInfoParam.AreEqual(_.DownloadInfo, info)));
 }
예제 #22
0
        private IHttpRequestInfo GetUrlContentUploadInfo(IContentIdentifier contentIdentifier, IDownloadInfo downloadInfo)
        {
            var contentID = ContentIdentifierSerializer.Serialize(contentIdentifier);

            var urlForGetUrlContentUploadInfo =
                ContentStorageServiceURLProvider.GetURLForGetUrlContentUploadInfo(
                    ContentStorageServiceURL,
                    ContainerName,
                    contentID,
                    downloadInfo.Size,
                    AuthenticationToken);

            using (var httpClient = GetHttpClient())
            {
                var headers =
                    new[] {
                    new KeyValuePair <string, string>("ContentUrl", downloadInfo.Url),
                    new KeyValuePair <string, string>("ContentStorageServiceUrl", ContentStorageServiceURL)
                };

                using (var response = httpClient.GetAsync(urlForGetUrlContentUploadInfo, headers: headers).Result)
                {
                    if (response.IsSuccessStatusCode)
                    {
                        var stringResult = response.Content.ReadAsStringAsync().Result;
                        return(Serializer.Deserialize <IHttpRequestInfo>(stringResult));
                    }
                    else if (response.StatusCode == HttpStatusCode.NotFound)
                    {
                        return(null);
                    }
                    else
                    {
                        response.CheckSuccessAsync().Wait();
                        return(null);
                    }
                }
            }
        }
예제 #23
0
 public static void LaunchDownloadedVideo(PhoneApplicationPage source, IDownloadInfo downloadInfo)
 {
     source.NavigationService.Navigate(source.GetUri<VideoPage>().WithParameters("filename", downloadInfo.VideoLocation.OriginalString));
 }
예제 #24
0
 public void UpdateDownloadInfo(IDownloadInfo info)
 {
     DownloadInfo = info;
 }
예제 #25
0
 public static void LaunchDownloadedVideo(PhoneApplicationPage source, IDownloadInfo downloadInfo)
 {
     source.NavigationService.Navigate(source.GetUri <VideoPage>().WithParameters("filename", downloadInfo.VideoLocation.OriginalString));
 }
예제 #26
0
 public VideoDownloadCmd(IDownloadInfo info)
 {
     _info = info;
     loadProxy();
 }
예제 #27
0
 public static bool AreEqual(IDownloadInfo info1, IDownloadInfo info2)
 {
     return(AreEqualIgnorePath(info1, info2) && info1?.DownloadPath == info2?.DownloadPath);
 }