public override async Task <(ResultType result, List <DownloadInfo> downloadInfos)> GetFileUrlsOfVod(CancellationToken cancellationToken) { (bool retrieveVideoSuccess, HitboxVideo video) = await Hitbox.RetrieveVideo(VideoInfo.VideoId); if (!retrieveVideoSuccess) { return(ResultType.Failure, null); } VideoInfo = new HitboxVideoInfo(video); // TODO: Figure out how to determine quality when there are multiple. string m3u8path = "https://smashcast-vod.akamaized.net/static/videos/vods" + GetM3U8PathFromM3U(video.MediaProfiles.First().Url); string folderpath = TsVideoJob.GetFolder(m3u8path); string m3u8; HttpClient client = new HttpClient(); HttpResponseMessage response = await client.GetAsync(new Uri( m3u8path )); if (response.StatusCode == System.Net.HttpStatusCode.OK) { m3u8 = await response.Content.ReadAsStringAsync(); } else { return(ResultType.Failure, null); } // who cares, hitbox is dead return(ResultType.Failure, null); //string[] filenames = TsVideoJob.GetFilenamesFromM3U8( m3u8 ); //List<string> urls = new List<string>( filenames.Length ); //foreach ( var filename in filenames ) { // urls.Add( folderpath + filename ); //} //return (ResultType.Success, urls.ToArray()); }
public override async Task <(ResultType result, List <DownloadInfo> downloadInfos)> GetFileUrlsOfVod(CancellationToken cancellationToken) { var video_json = await TwitchYTDL.GetVideoJson(long.Parse(VideoInfo.VideoId)); VideoInfo = new TwitchVideoInfo(TwitchYTDL.VideoFromJson(video_json)); string folderpath; List <DownloadInfo> downloadInfos; while (true) { try { bool interactive = false; if (interactive) { Status = ""; string tmp1 = Path.Combine(GetTempFolder(), GetTempFilenameWithoutExtension() + "_baseurl.txt"); string tmp2 = Path.Combine(GetTempFolder(), GetTempFilenameWithoutExtension() + "_tsnames.txt"); string linesbaseurl = TryGetUserCopyBaseurlM3U(tmp1); string linestsnames = TryGetUserCopyTsnamesM3U(tmp2); if (linesbaseurl == null) { File.WriteAllText(tmp1, "get baseurl for m3u8 from https://www.twitch.tv/videos/" + VideoInfo.VideoId); } if (linestsnames == null) { File.WriteAllText(tmp2, "get actual m3u file from https://www.twitch.tv/videos/" + VideoInfo.VideoId); } if (linesbaseurl == null || linestsnames == null) { await Task.Delay(200); Process.Start(tmp1); await Task.Delay(200); Process.Start(tmp2); await Task.Delay(200); return(ResultType.UserInputRequired, null); } folderpath = TsVideoJob.GetFolder(GetM3U8PathFromM3U(linesbaseurl, VideoQuality)); downloadInfos = TsVideoJob.GetFilenamesFromM3U8(folderpath, linestsnames); } else { string m3u8path = ExtractM3u8FromJson(video_json); folderpath = TsVideoJob.GetFolder(m3u8path); var client = new System.Net.Http.HttpClient(); var result = await client.GetAsync(m3u8path); string m3u8 = await result.Content.ReadAsStringAsync(); downloadInfos = TsVideoJob.GetFilenamesFromM3U8(folderpath, m3u8); } } catch (TwitchHttpException e) { if (e.StatusCode == System.Net.HttpStatusCode.NotFound && VideoInfo.VideoRecordingState == RecordingState.Live) { // this can happen on streams that have just started, in this just wait a bit and retry try { await Task.Delay(20000, cancellationToken); } catch (TaskCanceledException) { return(ResultType.Cancelled, null); } video_json = await TwitchYTDL.GetVideoJson(long.Parse(VideoInfo.VideoId)); VideoInfo = new TwitchVideoInfo(TwitchYTDL.VideoFromJson(video_json)); continue; } else { throw; } } break; } return(ResultType.Success, downloadInfos); }