Hopefully fix stalling and videos will stop downloading 5 minutes before the six hour mark
This commit is contained in:
		
							parent
							
								
									1473dace87
								
							
						
					
					
						commit
						75fe70a1e7
					
				|  | @ -11,6 +11,7 @@ namespace Tesses.YouTubeDownloader | |||
| { | ||||
|     public class BestStreams | ||||
|     { | ||||
|         public TimeSpan TillExpire {get;set;} | ||||
|         public bool VideoFrozen {get;set;} | ||||
|         public BestStreamInfo MuxedStreamInfo {get;set;} | ||||
| 
 | ||||
|  | @ -88,6 +89,7 @@ namespace Tesses.YouTubeDownloader | |||
|                     if(DateTime.Now < serialization.Expires || !expire_check) | ||||
|                     { | ||||
|                         BestStreams streams=new BestStreams(); | ||||
|                         streams.TillExpire = serialization.Expires - DateTime.Now; | ||||
|                         streams.VideoOnlyStreamInfo = new BestStreamInfo(serialization.VideoOnly); | ||||
|                         streams.AudioOnlyStreamInfo = new BestStreamInfo(serialization.Audio); | ||||
|                         streams.MuxedStreamInfo =new BestStreamInfo(serialization.Muxed); | ||||
|  | @ -103,7 +105,7 @@ namespace Tesses.YouTubeDownloader | |||
|                     if(video.VideoFrozen) | ||||
|                     { | ||||
|                          | ||||
|                         return new BestStreams() {VideoFrozen=true,MuxedStreamInfo=null,VideoOnlyStreamInfo=null,AudioOnlyStreamInfo=null}; | ||||
|                         return new BestStreams() {VideoFrozen=true,MuxedStreamInfo=null,VideoOnlyStreamInfo=null,AudioOnlyStreamInfo=null,TillExpire=new TimeSpan(0,0,0)}; | ||||
|                     } | ||||
|                 } | ||||
|             var res=await storage.YoutubeClient.Videos.Streams.GetManifestAsync(id,token); | ||||
|  | @ -114,6 +116,7 @@ namespace Tesses.YouTubeDownloader | |||
|             BestStreamsSerialized serialized=new BestStreamsSerialized(); | ||||
|             serialized.Expires=expires; | ||||
|             BestStreams streams1 = new BestStreams(); | ||||
|             streams1.TillExpire = new TimeSpan(6,0,0); | ||||
|             streams1.VideoOnlyStreamInfo=new BestStreamInfo(); | ||||
|             streams1.VideoOnlyStreamInfo.SetInfo(videoOnly); | ||||
|             serialized.VideoOnly=streams1.VideoOnlyStreamInfo.Serialization; | ||||
|  |  | |||
|  | @ -40,7 +40,7 @@ namespace Tesses.YouTubeDownloader | |||
|              } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         private CancellationTokenSource currentVideoCancelSource=null; | ||||
|         public readonly SavedVideoProgress Progress = new SavedVideoProgress(); | ||||
|         private async Task ReportProgress(double progress) | ||||
|         { | ||||
|  | @ -179,6 +179,7 @@ namespace Tesses.YouTubeDownloader | |||
|         { | ||||
|             cancelDownload=true; | ||||
|             restartDownload=restart; | ||||
|             if(currentVideoCancelSource != null) currentVideoCancelSource.Cancel(); | ||||
|         } | ||||
|          | ||||
|         private async Task DownloadFileAsync(SavedVideo video, CancellationToken token, IProgress<double> progress, bool report) | ||||
|  | @ -521,6 +522,7 @@ namespace Tesses.YouTubeDownloader | |||
|         } | ||||
|         private async Task DownloadVideoMuxedAsync(SavedVideo video,CancellationToken token,IProgress<double> progress,bool report=true) | ||||
|         { | ||||
|              | ||||
|             bool isValid=true; | ||||
|             isValid=await DownloadVideoOnlyAsync(video,token,progress,report); | ||||
|             if(token.IsCancellationRequested || !isValid || cancelDownload || restartDownload) | ||||
|  | @ -564,9 +566,15 @@ namespace Tesses.YouTubeDownloader | |||
|         } | ||||
|         public async Task<bool> DownloadVideoOnlyAsync(SavedVideo video,CancellationToken token,IProgress<double> progress,bool report=true) | ||||
|         { | ||||
|             currentVideoCancelSource = new CancellationTokenSource(); | ||||
|             token.Register(()=>{ | ||||
|                 currentVideoCancelSource.Cancel(); | ||||
|             }); | ||||
|               | ||||
|              | ||||
|             bool ret=false; | ||||
|             var streams = await BestStreamInfo.GetBestStreams(this, video.Id, token, false);  | ||||
|             var streams = await BestStreamInfo.GetBestStreams(this, video.Id, currentVideoCancelSource.Token, false); | ||||
|            | ||||
|              | ||||
|             if(streams != null) | ||||
|             { | ||||
|  | @ -581,10 +589,12 @@ namespace Tesses.YouTubeDownloader | |||
|                 if(await Continue(complete)) | ||||
|                 { | ||||
|                     if(!can_download) return false; | ||||
|                     streams = await BestStreamInfo.GetBestStreams(this,video.Id,token); | ||||
|                     streams = await BestStreamInfo.GetBestStreams(this,video.Id,currentVideoCancelSource.Token); | ||||
|                     if(streams != null) | ||||
|                     { | ||||
|                         using(var strm = await YoutubeClient.Videos.Streams.GetAsync(streams.VideoOnlyStreamInfo,token)) | ||||
|                          currentVideoCancelSource.CancelAfter(streams.TillExpire - new TimeSpan(0,5,0)); | ||||
|               | ||||
|                         using(var strm = await YoutubeClient.Videos.Streams.GetAsync(streams.VideoOnlyStreamInfo,currentVideoCancelSource.Token)) | ||||
|                         { | ||||
|                             if(token.IsCancellationRequested || cancelDownload || restartDownload) | ||||
|                             { | ||||
|  | @ -596,7 +606,9 @@ namespace Tesses.YouTubeDownloader | |||
|                              | ||||
|                             using(var dest = await OpenOrCreateAsync(incomplete)) | ||||
|                             { | ||||
|                                 ret=await CopyStreamAsync(strm,dest,dest.Length,streams.VideoOnlyStreamInfo.Size.Bytes,4096,progress,token); | ||||
|                                 ret=await CopyStreamAsync(strm,dest,dest.Length,streams.VideoOnlyStreamInfo.Size.Bytes,4096,progress,currentVideoCancelSource.Token); | ||||
|                                 currentVideoCancelSource.Dispose(); | ||||
|                                 currentVideoCancelSource=null; | ||||
|                             } | ||||
|                             if(ret) | ||||
|                             { | ||||
|  | @ -665,10 +677,15 @@ namespace Tesses.YouTubeDownloader | |||
|         } | ||||
|         private async Task<bool> DownloadAudioOnlyAsync(SavedVideo video,CancellationToken token,IProgress<double> progress,bool report=true) | ||||
|         { | ||||
|              currentVideoCancelSource = new CancellationTokenSource(); | ||||
|             token.Register(()=>{ | ||||
|                 currentVideoCancelSource.Cancel(); | ||||
|             }); | ||||
|              | ||||
|             bool ret=false; | ||||
|             var streams = await BestStreamInfo.GetBestStreams(this, video.Id, token, false); | ||||
|              | ||||
|              | ||||
|             if(streams != null) | ||||
|             { | ||||
|                 if(streams.VideoFrozen) | ||||
|  | @ -682,11 +699,13 @@ namespace Tesses.YouTubeDownloader | |||
|                 if(await Continue(complete)) | ||||
|                 { | ||||
|                     if(!can_download) return false; | ||||
|                     streams = await BestStreamInfo.GetBestStreams(this,video.Id,token); | ||||
|                     streams = await BestStreamInfo.GetBestStreams(this,video.Id,currentVideoCancelSource.Token); | ||||
|                     | ||||
|                     if(streams != null) | ||||
|                     { | ||||
|                          currentVideoCancelSource.CancelAfter(streams.TillExpire - new TimeSpan(0,5,0)); | ||||
|               | ||||
|                         using(var strm = await YoutubeClient.Videos.Streams.GetAsync(streams.AudioOnlyStreamInfo,token)) | ||||
|                         using(var strm = await YoutubeClient.Videos.Streams.GetAsync(streams.AudioOnlyStreamInfo,currentVideoCancelSource.Token)) | ||||
|                         { | ||||
|                             if(token.IsCancellationRequested || cancelDownload || restartDownload) | ||||
|                             { | ||||
|  | @ -698,7 +717,9 @@ namespace Tesses.YouTubeDownloader | |||
|                              | ||||
|                             using(var dest = await OpenOrCreateAsync(incomplete)) | ||||
|                             { | ||||
|                                 ret=await CopyStreamAsync(strm,dest,dest.Length,streams.AudioOnlyStreamInfo.Size.Bytes,4096,progress,token); | ||||
|                                 ret=await CopyStreamAsync(strm,dest,dest.Length,streams.AudioOnlyStreamInfo.Size.Bytes,4096,progress,currentVideoCancelSource.Token); | ||||
|                                  currentVideoCancelSource.Dispose(); | ||||
|                                 currentVideoCancelSource=null; | ||||
|                             } | ||||
|                             if(ret) | ||||
|                             { | ||||
|  | @ -719,7 +740,14 @@ namespace Tesses.YouTubeDownloader | |||
|         } | ||||
|         private async Task DownloadPreMuxedVideoAsync(SavedVideo video, CancellationToken token,IProgress<double> progress,bool report=true) | ||||
|         { | ||||
|             var streams = await BestStreamInfo.GetBestStreams(this, video.Id, token, false); | ||||
|                currentVideoCancelSource = new CancellationTokenSource(); | ||||
|             token.Register(()=>{ | ||||
|                 currentVideoCancelSource.Cancel(); | ||||
|             }); | ||||
|              | ||||
|              | ||||
|             var streams = await BestStreamInfo.GetBestStreams(this, video.Id, currentVideoCancelSource.Token, false); | ||||
|              | ||||
|             if(!can_download) return; | ||||
|             if(streams != null) | ||||
|             { | ||||
|  | @ -734,11 +762,13 @@ namespace Tesses.YouTubeDownloader | |||
|                 if(await Continue(complete)) | ||||
|                 { | ||||
|                     | ||||
|                     streams = await BestStreamInfo.GetBestStreams(this,video.Id,token); | ||||
|                     streams = await BestStreamInfo.GetBestStreams(this,video.Id,currentVideoCancelSource.Token); | ||||
|                     | ||||
|                     if(streams != null) | ||||
|                     { | ||||
|                          currentVideoCancelSource.CancelAfter(streams.TillExpire - new TimeSpan(0,5,0)); | ||||
|               | ||||
|                         using(var strm = await YoutubeClient.Videos.Streams.GetAsync(streams.MuxedStreamInfo,token)) | ||||
|                         using(var strm = await YoutubeClient.Videos.Streams.GetAsync(streams.MuxedStreamInfo,currentVideoCancelSource.Token)) | ||||
|                         { | ||||
|                              if(token.IsCancellationRequested || cancelDownload || restartDownload) | ||||
|                             { | ||||
|  | @ -750,7 +780,9 @@ namespace Tesses.YouTubeDownloader | |||
|                             bool ret; | ||||
|                             using(var dest = await OpenOrCreateAsync(incomplete)) | ||||
|                             { | ||||
|                                 ret=await CopyStreamAsync(strm,dest,dest.Length,streams.MuxedStreamInfo.Size.Bytes,4096,progress,token); | ||||
|                                 ret=await CopyStreamAsync(strm,dest,dest.Length,streams.MuxedStreamInfo.Size.Bytes,4096,progress,currentVideoCancelSource.Token); | ||||
|                                  currentVideoCancelSource.Dispose(); | ||||
|                                 currentVideoCancelSource=null; | ||||
|                             } | ||||
|                             //We know its resolution  | ||||
|                             if(ret) | ||||
|  |  | |||
|  | @ -7,9 +7,9 @@ | |||
|       <PackageId>Tesses.YouTubeDownloader</PackageId> | ||||
|     <Author>Mike Nolan</Author> | ||||
|     <Company>Tesses</Company> | ||||
|      <Version>1.2.0</Version> | ||||
|     <AssemblyVersion>1.2.0</AssemblyVersion> | ||||
|     <FileVersion>1.2.0</FileVersion> | ||||
|      <Version>1.2.1</Version> | ||||
|     <AssemblyVersion>1.2.1</AssemblyVersion> | ||||
|     <FileVersion>1.2.1</FileVersion> | ||||
|     <Description>A YouTube Downloader</Description> | ||||
|     <PackageLicenseExpression>LGPL-3.0-only</PackageLicenseExpression> | ||||
|      <PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance> | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue