mirror of
https://onedev.site.tesses.net/tytd2025
synced 2026-02-09 01:55:46 +00:00
First commit
This commit is contained in:
@@ -0,0 +1,119 @@
|
||||
class TYTD.AOVideoDownload : IVideoDownload {
|
||||
private info;
|
||||
private tytd;
|
||||
private progress;
|
||||
private video_stream_url;
|
||||
|
||||
private done=false;
|
||||
|
||||
public AOVideoDownload(id)
|
||||
{
|
||||
this.info = {
|
||||
Title = "",
|
||||
Channel = "",
|
||||
VideoId = TYTD.GetVideoId(id),
|
||||
ChannelId = ""
|
||||
};
|
||||
}
|
||||
public setTYTD(tytd)
|
||||
{
|
||||
this.tytd = tytd;
|
||||
var id = this.info.VideoId;
|
||||
var path = /"Streams"/id.Substring(0,4)/id.Substring(4)/"ao.bin";
|
||||
if(this.tytd.Storage.FileExists(path)) {
|
||||
this.done = true;
|
||||
return tytd;
|
||||
}
|
||||
|
||||
var req = this.tytd.ManifestRequest(id).playerResponse;
|
||||
this.info.Title = req.videoDetails.title;
|
||||
this.info.Channel = req.videoDetails.author;
|
||||
this.info.ChannelId = req.videoDetails.channelId;
|
||||
|
||||
this.tytd.PutVideoInfo(req.videoDetails);
|
||||
|
||||
var sampleRate = 0;
|
||||
var bitrate = 0;
|
||||
var url = "";
|
||||
|
||||
each(var item : req.streamingData.adaptiveFormats)
|
||||
{
|
||||
if(TypeOf(item.height) != "Long")
|
||||
{
|
||||
|
||||
item.audioSampleRate = ParseLong(item.audioSampleRate);
|
||||
if(item.audioSampleRate >= sampleRate && item.bitrate >= bitrate)
|
||||
{
|
||||
url = item.url;
|
||||
sampleRate = item.audioSampleRate;
|
||||
bitrate = item.bitrate;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.video_stream_url = url;
|
||||
|
||||
return tytd;
|
||||
}
|
||||
public setProgress(p)
|
||||
{
|
||||
this.progress = p;
|
||||
}
|
||||
public getVideo()
|
||||
{
|
||||
return this.info;
|
||||
}
|
||||
public Start()
|
||||
{
|
||||
for(var i = 0; i < 5; i++)
|
||||
{
|
||||
var req = {
|
||||
FollowRedirects = true,
|
||||
RequestHeaders = [
|
||||
{
|
||||
Key = "User-Agent",
|
||||
|
||||
Value = "com.google.android.youtube/19.28.35 (Linux; U; Android 15; GB) gzip"
|
||||
}
|
||||
]
|
||||
};
|
||||
var resp = Net.Http.MakeRequest(this.video_stream_url,req);
|
||||
|
||||
if(resp.StatusCode >= 200 && resp.StatusCode <= 299)
|
||||
{
|
||||
var id = this.info.VideoId;
|
||||
var path = /"Streams"/id.Substring(0,4)/id.Substring(4)/"ao.bin";
|
||||
this.tytd.Storage.CreateDirectory(path.GetParent());
|
||||
var strm = this.tytd.Storage.OpenFile(path+".part","wb");
|
||||
var src = resp.ReadAsStream();
|
||||
Helpers.CopyToProgress(src,strm,this.progress,100.0);
|
||||
strm.Close();
|
||||
src.Close();
|
||||
this.tytd.Storage.MoveFile(path+".part",path);
|
||||
break;
|
||||
}else {
|
||||
var req = this.tytd.ManifestRequest(this.info.VideoId).playerResponse;
|
||||
var sampleRate = 0;
|
||||
var bitrate = 0;
|
||||
var url = "";
|
||||
|
||||
each(var item : req.streamingData.adaptiveFormats)
|
||||
{
|
||||
if(TypeOf(item.height) != "Long")
|
||||
{
|
||||
|
||||
item.audioSampleRate = ParseLong(item.audioSampleRate);
|
||||
if(item.audioSampleRate >= sampleRate && item.bitrate >= bitrate)
|
||||
{
|
||||
url = item.url;
|
||||
sampleRate = item.audioSampleRate;
|
||||
bitrate = item.bitrate;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.video_stream_url = url;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,223 @@
|
||||
class TYTD.NoConvertVideoDownload : IVideoDownload {
|
||||
private info;
|
||||
private tytd;
|
||||
private progress;
|
||||
private video_stream_url;
|
||||
private audio_stream_url;
|
||||
|
||||
private done=false;
|
||||
|
||||
public NoConvertVideoDownload(id)
|
||||
{
|
||||
this.info = {
|
||||
Title = "",
|
||||
Channel = "",
|
||||
VideoId = TYTD.GetVideoId(id),
|
||||
ChannelId = ""
|
||||
};
|
||||
}
|
||||
public getVideo()
|
||||
{
|
||||
return this.info;
|
||||
}
|
||||
public setTYTD(tytd)
|
||||
{
|
||||
this.tytd = tytd;
|
||||
var id = this.info.VideoId;
|
||||
var path = /"Streams"/id.Substring(0,4)/id.Substring(4)/"vo.bin";
|
||||
var pathA = /"Streams"/id.Substring(0,4)/id.Substring(4)/"ao.bin";
|
||||
if(this.tytd.Storage.FileExists(path) && this.tytd.Storage.FileExists(pathA)) {
|
||||
this.done = true;
|
||||
return tytd;
|
||||
}
|
||||
|
||||
var req = this.tytd.ManifestRequest(id).playerResponse;
|
||||
|
||||
|
||||
this.info.Title = req.videoDetails.title;
|
||||
this.info.Channel = req.videoDetails.author;
|
||||
this.info.ChannelId = req.videoDetails.channelId;
|
||||
|
||||
this.tytd.PutVideoInfo(req.videoDetails);
|
||||
|
||||
var width = 0;
|
||||
var height = 0;
|
||||
var sampleRate = 0;
|
||||
var bitrate = 0;
|
||||
var vurl = "";
|
||||
var aurl = "";
|
||||
|
||||
each(var item : req.streamingData.adaptiveFormats)
|
||||
{
|
||||
if(TypeOf(item.height) == "Long")
|
||||
{
|
||||
if(item.width >= width && item.height >= height)
|
||||
{
|
||||
vurl = item.url;
|
||||
width = item.width;
|
||||
height = item.height;
|
||||
}
|
||||
}
|
||||
else {
|
||||
item.audioSampleRate = ParseLong(item.audioSampleRate);
|
||||
if(item.audioSampleRate >= sampleRate && item.bitrate >= bitrate)
|
||||
{
|
||||
aurl = item.url;
|
||||
sampleRate = item.audioSampleRate;
|
||||
bitrate = item.bitrate;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.video_stream_url = vurl;
|
||||
this.audio_stream_url = aurl;
|
||||
|
||||
return tytd;
|
||||
}
|
||||
public setProgress(p)
|
||||
{
|
||||
this.progress = p;
|
||||
}
|
||||
public Start()
|
||||
{
|
||||
if(this.done) return;
|
||||
|
||||
var id = this.info.VideoId;
|
||||
var path = /"Streams"/id.Substring(0,4)/id.Substring(4)/"vo.bin";
|
||||
var pathA = /"Streams"/id.Substring(0,4)/id.Substring(4)/"ao.bin";
|
||||
|
||||
if(!this.tytd.Storage.FileExists(path))
|
||||
{
|
||||
for(var i = 0; i < 5; i++)
|
||||
{
|
||||
var req = {
|
||||
FollowRedirects = true,
|
||||
RequestHeaders = [
|
||||
{
|
||||
Key = "User-Agent",
|
||||
|
||||
Value = "com.google.android.youtube/19.28.35 (Linux; U; Android 15; GB) gzip"
|
||||
}
|
||||
]
|
||||
};
|
||||
var resp = Net.Http.MakeRequest(this.video_stream_url,req);
|
||||
|
||||
if(resp.StatusCode >= 200 && resp.StatusCode <= 299)
|
||||
{
|
||||
this.tytd.Storage.CreateDirectory(path.GetParent());
|
||||
var strm = this.tytd.Storage.OpenFile(path+".part","wb");
|
||||
var src = resp.ReadAsStream();
|
||||
Helpers.CopyToProgress(src,strm,(p)=>{
|
||||
this.progress(p/2);
|
||||
},100.0);
|
||||
strm.Close();
|
||||
src.Close();
|
||||
this.tytd.Storage.MoveFile(path+".part",path);
|
||||
break;
|
||||
}
|
||||
else {
|
||||
var req = this.tytd.ManifestRequest(this.info.VideoId).playerResponse;
|
||||
var width = 0;
|
||||
var height = 0;
|
||||
var sampleRate = 0;
|
||||
var bitrate = 0;
|
||||
var vurl = "";
|
||||
var aurl = "";
|
||||
|
||||
each(var item : req.streamingData.adaptiveFormats)
|
||||
{
|
||||
if(TypeOf(item.height) == "Long")
|
||||
{
|
||||
if(item.width >= width && item.height >= height)
|
||||
{
|
||||
vurl = item.url;
|
||||
width = item.width;
|
||||
height = item.height;
|
||||
}
|
||||
}
|
||||
else {
|
||||
item.audioSampleRate = ParseLong(item.audioSampleRate);
|
||||
if(item.audioSampleRate >= sampleRate && item.bitrate >= bitrate)
|
||||
{
|
||||
aurl = item.url;
|
||||
sampleRate = item.audioSampleRate;
|
||||
bitrate = item.bitrate;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.video_stream_url = vurl;
|
||||
this.audio_stream_url = aurl;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!this.tytd.Storage.FileExists(pathA))
|
||||
{
|
||||
for(var i = 0; i < 5; i++)
|
||||
{
|
||||
var req = {
|
||||
FollowRedirects = true,
|
||||
RequestHeaders = [
|
||||
{
|
||||
Key = "User-Agent",
|
||||
|
||||
Value = "com.google.android.youtube/19.28.35 (Linux; U; Android 15; GB) gzip"
|
||||
}
|
||||
]
|
||||
};
|
||||
var resp = Net.Http.MakeRequest(this.audio_stream_url,req);
|
||||
|
||||
if(resp.StatusCode >= 200 && resp.StatusCode <= 299)
|
||||
{
|
||||
this.tytd.Storage.CreateDirectory(pathA.GetParent());
|
||||
var strm = this.tytd.Storage.OpenFile(pathA+".part","wb");
|
||||
var src = resp.ReadAsStream();
|
||||
Helpers.CopyToProgress(src,strm,(p)=>{
|
||||
this.progress((p/2)+0.5);
|
||||
},100.0);
|
||||
strm.Close();
|
||||
src.Close();
|
||||
this.tytd.Storage.MoveFile(pathA+".part",pathA);
|
||||
break;
|
||||
}
|
||||
else {
|
||||
var req = this.tytd.ManifestRequest(this.info.VideoId).playerResponse;
|
||||
var width = 0;
|
||||
var height = 0;
|
||||
var sampleRate = 0;
|
||||
var bitrate = 0;
|
||||
var vurl = "";
|
||||
var aurl = "";
|
||||
|
||||
each(var item : req.streamingData.adaptiveFormats)
|
||||
{
|
||||
if(TypeOf(item.height) == "Long")
|
||||
{
|
||||
if(item.width >= width && item.height >= height)
|
||||
{
|
||||
vurl = item.url;
|
||||
width = item.width;
|
||||
height = item.height;
|
||||
}
|
||||
}
|
||||
else {
|
||||
item.audioSampleRate = ParseLong(item.audioSampleRate);
|
||||
if(item.audioSampleRate >= sampleRate && item.bitrate >= bitrate)
|
||||
{
|
||||
aurl = item.url;
|
||||
sampleRate = item.audioSampleRate;
|
||||
bitrate = item.bitrate;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.video_stream_url = vurl;
|
||||
this.audio_stream_url = aurl;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
this.progress(1.0);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
class TYTD.SDVideoDownload : IVideoDownload {
|
||||
private info;
|
||||
private tytd;
|
||||
private progress;
|
||||
private video_stream_url;
|
||||
|
||||
private done=false;
|
||||
|
||||
public SDVideoDownload(id)
|
||||
{
|
||||
this.info = {
|
||||
Title = "",
|
||||
Channel = "",
|
||||
VideoId = TYTD.GetVideoId(id),
|
||||
ChannelId = ""
|
||||
};
|
||||
}
|
||||
public setTYTD(tytd)
|
||||
{
|
||||
this.tytd = tytd;
|
||||
var id = this.info.VideoId;
|
||||
var path = /"Streams"/id.Substring(0,4)/id.Substring(4)/"ytmux.mp4";
|
||||
if(this.tytd.Storage.FileExists(path)) {
|
||||
this.done = true;
|
||||
return tytd;
|
||||
}
|
||||
|
||||
var req = this.tytd.ManifestRequest(id).playerResponse;
|
||||
this.info.Title = req.videoDetails.title;
|
||||
this.info.Channel = req.videoDetails.author;
|
||||
this.info.ChannelId = req.videoDetails.channelId;
|
||||
|
||||
this.tytd.PutVideoInfo(req.videoDetails);
|
||||
|
||||
this.video_stream_url = req.streamingData.formats[0].url;
|
||||
|
||||
return tytd;
|
||||
}
|
||||
public setProgress(p)
|
||||
{
|
||||
this.progress = p;
|
||||
this.progress(0.0);
|
||||
}
|
||||
public getVideo()
|
||||
{
|
||||
return this.info;
|
||||
}
|
||||
public Start()
|
||||
{
|
||||
for(var i = 0; i < 5; i++)
|
||||
{
|
||||
var req = {
|
||||
FollowRedirects = true,
|
||||
RequestHeaders = [
|
||||
{
|
||||
Key = "User-Agent",
|
||||
|
||||
Value = "com.google.android.youtube/19.28.35 (Linux; U; Android 15; GB) gzip"
|
||||
}
|
||||
]
|
||||
};
|
||||
var resp = Net.Http.MakeRequest(this.video_stream_url,req);
|
||||
|
||||
if(resp.StatusCode >= 200 && resp.StatusCode <= 299)
|
||||
{
|
||||
var id = this.info.VideoId;
|
||||
var path = /"Streams"/id.Substring(0,4)/id.Substring(4)/"ytmux.mp4";
|
||||
this.tytd.Storage.CreateDirectory(path.GetParent());
|
||||
var strm = this.tytd.Storage.OpenFile(path+".part","wb");
|
||||
var src = resp.ReadAsStream();
|
||||
Helpers.CopyToProgress(src,strm,this.progress,100.0);
|
||||
strm.Close();
|
||||
src.Close();
|
||||
this.tytd.Storage.MoveFile(path+".part",path);
|
||||
break;
|
||||
}
|
||||
else {
|
||||
var req = this.tytd.ManifestRequest(this.info.VideoId).playerResponse;
|
||||
this.video_stream_url = req.streamingData.formats[0].url;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
class TYTD.TranscodeAudio : IVideoDownload {
|
||||
private id;
|
||||
private ncv;
|
||||
private tytd;
|
||||
private ext;
|
||||
|
||||
public TranscodeAudio(id,ext)
|
||||
{
|
||||
this.id = id;
|
||||
this.ext = ext;
|
||||
this.ncv = new TYTD.AOVideoDownload(id);
|
||||
}
|
||||
|
||||
public setTYTD(tytd)
|
||||
{
|
||||
this.tytd = tytd;
|
||||
return this.ncv.TYTD = tytd;
|
||||
}
|
||||
|
||||
public setProgress(p)
|
||||
{
|
||||
return this.ncv.Progress = p;
|
||||
}
|
||||
|
||||
public getVideo()
|
||||
{
|
||||
return this.ncv.Video;
|
||||
}
|
||||
|
||||
public Start()
|
||||
{
|
||||
var id = this.id;
|
||||
this.ncv.Start();
|
||||
|
||||
var p = new Process();
|
||||
p.FileName = Env.GetRealExecutablePath("ffmpeg").ToString();
|
||||
|
||||
var dir = this.tytd.DatabaseDirectory / "Streams"/this.id.Substring(0,4)/this.id.Substring(4);
|
||||
var ao = dir / "ao.bin";
|
||||
var out = dir / $"conv{this.ext}";
|
||||
if(FS.Local.FileExists(out)) return;
|
||||
var args=["-y","-i",ao.ToString()];
|
||||
|
||||
|
||||
args.Add("-preset");
|
||||
args.Add("ultrafast");
|
||||
args.Add(out.ToString());
|
||||
|
||||
|
||||
p.Arguments = args;
|
||||
if(p.Start())
|
||||
p.Join();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
class TYTD.TranscodeVideo : IVideoDownload {
|
||||
private id;
|
||||
private ncv;
|
||||
private tytd;
|
||||
private ext;
|
||||
|
||||
public TranscodeVideo(id,ext)
|
||||
{
|
||||
this.id = id;
|
||||
this.ext = ext;
|
||||
this.ncv = new TYTD.NoConvertVideoDownload(id);
|
||||
}
|
||||
|
||||
public setTYTD(tytd)
|
||||
{
|
||||
this.tytd = tytd;
|
||||
return this.ncv.TYTD = tytd;
|
||||
}
|
||||
|
||||
public setProgress(p)
|
||||
{
|
||||
return this.ncv.Progress = p;
|
||||
}
|
||||
|
||||
public getVideo()
|
||||
{
|
||||
return this.ncv.Video;
|
||||
}
|
||||
|
||||
public Start()
|
||||
{
|
||||
var id = this.id;
|
||||
this.ncv.Start();
|
||||
|
||||
var p = new Process();
|
||||
p.FileName = Env.GetRealExecutablePath("ffmpeg").ToString();
|
||||
|
||||
var dir = this.tytd.DatabaseDirectory / "Streams"/this.id.Substring(0,4)/this.id.Substring(4);
|
||||
var vo = dir / "vo.bin";
|
||||
var ao = dir / "ao.bin";
|
||||
var out = dir / $"conv{this.ext}";
|
||||
if(FS.Local.FileExists(out)) return;
|
||||
var args=["-y","-i",vo.ToString(),"-i",ao.ToString()];
|
||||
|
||||
if(this.ext == ".mkv")
|
||||
{
|
||||
args.Add("-c");
|
||||
args.Add("copy");
|
||||
}
|
||||
args.Add("-map");
|
||||
args.Add("0:v");
|
||||
args.Add("-map");
|
||||
args.Add("1:a");
|
||||
args.Add("-preset");
|
||||
args.Add("ultrafast");
|
||||
args.Add(out.ToString());
|
||||
|
||||
|
||||
p.Arguments = args;
|
||||
if(p.Start())
|
||||
p.Join();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
class TYTD.VOVideoDownload : IVideoDownload {
|
||||
private info;
|
||||
private tytd;
|
||||
private progress;
|
||||
private video_stream_url;
|
||||
|
||||
private done=false;
|
||||
|
||||
public VOVideoDownload(id)
|
||||
{
|
||||
this.info = {
|
||||
Title = "",
|
||||
Channel = "",
|
||||
VideoId = TYTD.GetVideoId(id),
|
||||
ChannelId = ""
|
||||
};
|
||||
}
|
||||
public setTYTD(tytd)
|
||||
{
|
||||
this.tytd = tytd;
|
||||
var id = this.info.VideoId;
|
||||
var path = /"Streams"/id.Substring(0,4)/id.Substring(4)/"vo.bin";
|
||||
if(this.tytd.Storage.FileExists(path)) {
|
||||
this.done = true;
|
||||
return tytd;
|
||||
}
|
||||
|
||||
var req = this.tytd.ManifestRequest(id).playerResponse;
|
||||
this.info.Title = req.videoDetails.title;
|
||||
this.info.Channel = req.videoDetails.author;
|
||||
this.info.ChannelId = req.videoDetails.channelId;
|
||||
|
||||
this.tytd.PutVideoInfo(req.videoDetails);
|
||||
|
||||
var width = 0;
|
||||
var height = 0;
|
||||
var url = "";
|
||||
|
||||
each(var item : req.streamingData.adaptiveFormats)
|
||||
{
|
||||
if(TypeOf(item.height) == "Long")
|
||||
{
|
||||
if(item.width >= width && item.height >= height)
|
||||
{
|
||||
url = item.url;
|
||||
width = item.width;
|
||||
height = item.height;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.video_stream_url = url;
|
||||
|
||||
return tytd;
|
||||
}
|
||||
public setProgress(p)
|
||||
{
|
||||
this.progress = p;
|
||||
}
|
||||
public getVideo()
|
||||
{
|
||||
return this.info;
|
||||
}
|
||||
public Start()
|
||||
{
|
||||
var req = {
|
||||
FollowRedirects = true,
|
||||
RequestHeaders = [
|
||||
{
|
||||
Key = "User-Agent",
|
||||
|
||||
Value = "com.google.android.youtube/19.28.35 (Linux; U; Android 15; GB) gzip"
|
||||
}
|
||||
]
|
||||
};
|
||||
var resp = Net.Http.MakeRequest(this.video_stream_url,req);
|
||||
|
||||
if(resp.StatusCode >= 200 && resp.StatusCode <= 299)
|
||||
{
|
||||
var id = this.info.VideoId;
|
||||
var path = /"Streams"/id.Substring(0,4)/id.Substring(4)/"vo.bin";
|
||||
this.tytd.Storage.CreateDirectory(path.GetParent());
|
||||
var strm = this.tytd.Storage.OpenFile(path+".part","wb");
|
||||
var src = resp.ReadAsStream();
|
||||
Helpers.CopyToProgress(src,strm,this.progress,100.0);
|
||||
strm.Close();
|
||||
src.Close();
|
||||
this.tytd.Storage.MoveFile(path+".part",path);
|
||||
}
|
||||
else {
|
||||
var req = this.tytd.ManifestRequest(this.info.VideoId).playerResponse;
|
||||
var width = 0;
|
||||
var height = 0;
|
||||
var url = "";
|
||||
|
||||
each(var item : req.streamingData.adaptiveFormats)
|
||||
{
|
||||
if(TypeOf(item.height) == "Long")
|
||||
{
|
||||
if(item.width >= width && item.height >= height)
|
||||
{
|
||||
url = item.url;
|
||||
width = item.width;
|
||||
height = item.height;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.video_stream_url = url;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user