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; } }
public DownloadMemoryData(IDownloadInfo downloadInfo, DownloadStatus status, bool isLocalDownload, string error) { DownloadInfo = downloadInfo; IsLocalDownload = isLocalDownload; Status = status; Error = error; }
public FileResult DeliverFiles(IDownloadInfo downloadInfo, List <Media> relatedMedia) { var delivery = HandleFileDelivery(downloadInfo, relatedMedia); this.OnChange?.Invoke(delivery, relatedMedia); return(delivery); }
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); }
public OnlineDownloadManager(IDownloadInfo info, DownloadStatus status, bool isLocalDownload, string errorInfo) { GuidCode = Guid.NewGuid(); IsLocalDownload = isLocalDownload; initDownloader(info, status, errorInfo); updateThread(); Quality = "标清"; }
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); } } }
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); }
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()); } }
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; } }
private void updateName(IDownloadInfo info) { if (IsLocalDownload) { Name = string.Format($"{info.VideoId}_{info.StreamId}"); } else { Name = GuidCode.ToString(); } }
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); }
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); } }
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; }
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; }
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)); }
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); } }
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); }
public OnlineDownloadManager GetDownloadManager(IDownloadInfo info) { lock (_downloads) return(_downloads.FirstOrDefault(_ => DownloadInfoParam.AreEqual(_.DownloadInfo, info))); }
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); } } } }
public static void LaunchDownloadedVideo(PhoneApplicationPage source, IDownloadInfo downloadInfo) { source.NavigationService.Navigate(source.GetUri<VideoPage>().WithParameters("filename", downloadInfo.VideoLocation.OriginalString)); }
public void UpdateDownloadInfo(IDownloadInfo info) { DownloadInfo = info; }
public static void LaunchDownloadedVideo(PhoneApplicationPage source, IDownloadInfo downloadInfo) { source.NavigationService.Navigate(source.GetUri <VideoPage>().WithParameters("filename", downloadInfo.VideoLocation.OriginalString)); }
public VideoDownloadCmd(IDownloadInfo info) { _info = info; loadProxy(); }
public static bool AreEqual(IDownloadInfo info1, IDownloadInfo info2) { return(AreEqualIgnorePath(info1, info2) && info1?.DownloadPath == info2?.DownloadPath); }