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 class BestStreams
|
||||||
{
|
{
|
||||||
|
public TimeSpan TillExpire {get;set;}
|
||||||
public bool VideoFrozen {get;set;}
|
public bool VideoFrozen {get;set;}
|
||||||
public BestStreamInfo MuxedStreamInfo {get;set;}
|
public BestStreamInfo MuxedStreamInfo {get;set;}
|
||||||
|
|
||||||
|
@ -88,6 +89,7 @@ namespace Tesses.YouTubeDownloader
|
||||||
if(DateTime.Now < serialization.Expires || !expire_check)
|
if(DateTime.Now < serialization.Expires || !expire_check)
|
||||||
{
|
{
|
||||||
BestStreams streams=new BestStreams();
|
BestStreams streams=new BestStreams();
|
||||||
|
streams.TillExpire = serialization.Expires - DateTime.Now;
|
||||||
streams.VideoOnlyStreamInfo = new BestStreamInfo(serialization.VideoOnly);
|
streams.VideoOnlyStreamInfo = new BestStreamInfo(serialization.VideoOnly);
|
||||||
streams.AudioOnlyStreamInfo = new BestStreamInfo(serialization.Audio);
|
streams.AudioOnlyStreamInfo = new BestStreamInfo(serialization.Audio);
|
||||||
streams.MuxedStreamInfo =new BestStreamInfo(serialization.Muxed);
|
streams.MuxedStreamInfo =new BestStreamInfo(serialization.Muxed);
|
||||||
|
@ -103,7 +105,7 @@ namespace Tesses.YouTubeDownloader
|
||||||
if(video.VideoFrozen)
|
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);
|
var res=await storage.YoutubeClient.Videos.Streams.GetManifestAsync(id,token);
|
||||||
|
@ -114,6 +116,7 @@ namespace Tesses.YouTubeDownloader
|
||||||
BestStreamsSerialized serialized=new BestStreamsSerialized();
|
BestStreamsSerialized serialized=new BestStreamsSerialized();
|
||||||
serialized.Expires=expires;
|
serialized.Expires=expires;
|
||||||
BestStreams streams1 = new BestStreams();
|
BestStreams streams1 = new BestStreams();
|
||||||
|
streams1.TillExpire = new TimeSpan(6,0,0);
|
||||||
streams1.VideoOnlyStreamInfo=new BestStreamInfo();
|
streams1.VideoOnlyStreamInfo=new BestStreamInfo();
|
||||||
streams1.VideoOnlyStreamInfo.SetInfo(videoOnly);
|
streams1.VideoOnlyStreamInfo.SetInfo(videoOnly);
|
||||||
serialized.VideoOnly=streams1.VideoOnlyStreamInfo.Serialization;
|
serialized.VideoOnly=streams1.VideoOnlyStreamInfo.Serialization;
|
||||||
|
|
|
@ -40,7 +40,7 @@ namespace Tesses.YouTubeDownloader
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
private CancellationTokenSource currentVideoCancelSource=null;
|
||||||
public readonly SavedVideoProgress Progress = new SavedVideoProgress();
|
public readonly SavedVideoProgress Progress = new SavedVideoProgress();
|
||||||
private async Task ReportProgress(double progress)
|
private async Task ReportProgress(double progress)
|
||||||
{
|
{
|
||||||
|
@ -179,6 +179,7 @@ namespace Tesses.YouTubeDownloader
|
||||||
{
|
{
|
||||||
cancelDownload=true;
|
cancelDownload=true;
|
||||||
restartDownload=restart;
|
restartDownload=restart;
|
||||||
|
if(currentVideoCancelSource != null) currentVideoCancelSource.Cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task DownloadFileAsync(SavedVideo video, CancellationToken token, IProgress<double> progress, bool report)
|
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)
|
private async Task DownloadVideoMuxedAsync(SavedVideo video,CancellationToken token,IProgress<double> progress,bool report=true)
|
||||||
{
|
{
|
||||||
|
|
||||||
bool isValid=true;
|
bool isValid=true;
|
||||||
isValid=await DownloadVideoOnlyAsync(video,token,progress,report);
|
isValid=await DownloadVideoOnlyAsync(video,token,progress,report);
|
||||||
if(token.IsCancellationRequested || !isValid || cancelDownload || restartDownload)
|
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)
|
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;
|
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)
|
if(streams != null)
|
||||||
{
|
{
|
||||||
|
@ -581,10 +589,12 @@ namespace Tesses.YouTubeDownloader
|
||||||
if(await Continue(complete))
|
if(await Continue(complete))
|
||||||
{
|
{
|
||||||
if(!can_download) return false;
|
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)
|
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)
|
if(token.IsCancellationRequested || cancelDownload || restartDownload)
|
||||||
{
|
{
|
||||||
|
@ -596,7 +606,9 @@ namespace Tesses.YouTubeDownloader
|
||||||
|
|
||||||
using(var dest = await OpenOrCreateAsync(incomplete))
|
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)
|
if(ret)
|
||||||
{
|
{
|
||||||
|
@ -665,10 +677,15 @@ namespace Tesses.YouTubeDownloader
|
||||||
}
|
}
|
||||||
private async Task<bool> DownloadAudioOnlyAsync(SavedVideo video,CancellationToken token,IProgress<double> progress,bool report=true)
|
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;
|
bool ret=false;
|
||||||
var streams = await BestStreamInfo.GetBestStreams(this, video.Id, token, false);
|
var streams = await BestStreamInfo.GetBestStreams(this, video.Id, token, false);
|
||||||
|
|
||||||
|
|
||||||
if(streams != null)
|
if(streams != null)
|
||||||
{
|
{
|
||||||
if(streams.VideoFrozen)
|
if(streams.VideoFrozen)
|
||||||
|
@ -682,11 +699,13 @@ namespace Tesses.YouTubeDownloader
|
||||||
if(await Continue(complete))
|
if(await Continue(complete))
|
||||||
{
|
{
|
||||||
if(!can_download) return false;
|
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)
|
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)
|
if(token.IsCancellationRequested || cancelDownload || restartDownload)
|
||||||
{
|
{
|
||||||
|
@ -698,7 +717,9 @@ namespace Tesses.YouTubeDownloader
|
||||||
|
|
||||||
using(var dest = await OpenOrCreateAsync(incomplete))
|
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)
|
if(ret)
|
||||||
{
|
{
|
||||||
|
@ -719,7 +740,14 @@ namespace Tesses.YouTubeDownloader
|
||||||
}
|
}
|
||||||
private async Task DownloadPreMuxedVideoAsync(SavedVideo video, CancellationToken token,IProgress<double> progress,bool report=true)
|
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(!can_download) return;
|
||||||
if(streams != null)
|
if(streams != null)
|
||||||
{
|
{
|
||||||
|
@ -734,11 +762,13 @@ namespace Tesses.YouTubeDownloader
|
||||||
if(await Continue(complete))
|
if(await Continue(complete))
|
||||||
{
|
{
|
||||||
|
|
||||||
streams = await BestStreamInfo.GetBestStreams(this,video.Id,token);
|
streams = await BestStreamInfo.GetBestStreams(this,video.Id,currentVideoCancelSource.Token);
|
||||||
|
|
||||||
if(streams != null)
|
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)
|
if(token.IsCancellationRequested || cancelDownload || restartDownload)
|
||||||
{
|
{
|
||||||
|
@ -750,7 +780,9 @@ namespace Tesses.YouTubeDownloader
|
||||||
bool ret;
|
bool ret;
|
||||||
using(var dest = await OpenOrCreateAsync(incomplete))
|
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
|
//We know its resolution
|
||||||
if(ret)
|
if(ret)
|
||||||
|
|
|
@ -7,9 +7,9 @@
|
||||||
<PackageId>Tesses.YouTubeDownloader</PackageId>
|
<PackageId>Tesses.YouTubeDownloader</PackageId>
|
||||||
<Author>Mike Nolan</Author>
|
<Author>Mike Nolan</Author>
|
||||||
<Company>Tesses</Company>
|
<Company>Tesses</Company>
|
||||||
<Version>1.2.0</Version>
|
<Version>1.2.1</Version>
|
||||||
<AssemblyVersion>1.2.0</AssemblyVersion>
|
<AssemblyVersion>1.2.1</AssemblyVersion>
|
||||||
<FileVersion>1.2.0</FileVersion>
|
<FileVersion>1.2.1</FileVersion>
|
||||||
<Description>A YouTube Downloader</Description>
|
<Description>A YouTube Downloader</Description>
|
||||||
<PackageLicenseExpression>LGPL-3.0-only</PackageLicenseExpression>
|
<PackageLicenseExpression>LGPL-3.0-only</PackageLicenseExpression>
|
||||||
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
|
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
|
||||||
|
|
Loading…
Reference in New Issue