From d769e5e75ee6d8bca85ac5ad7af2bcff1daec31a Mon Sep 17 00:00:00 2001 From: Elwador <75888166+Elwador@users.noreply.github.com> Date: Wed, 22 May 2024 23:22:02 +0200 Subject: [PATCH] Chg - Allow multiple Dub languages to be selected Fix - Invalidate stream token --- CRD/Downloader/Crunchyroll.cs | 21 ++-- CRD/Utils/Muxing/FontsManager.cs | 4 +- CRD/Utils/Muxing/Merger.cs | 126 ++++++++++++---------- CRD/ViewModels/SettingsPageViewModel.cs | 138 ++++++++++++++++-------- CRD/Views/SettingsPageView.axaml | 39 ++++++- 5 files changed, 209 insertions(+), 119 deletions(-) diff --git a/CRD/Downloader/Crunchyroll.cs b/CRD/Downloader/Crunchyroll.cs index fd0c531..8698786 100644 --- a/CRD/Downloader/Crunchyroll.cs +++ b/CRD/Downloader/Crunchyroll.cs @@ -145,11 +145,12 @@ public class Crunchyroll{ CrunOptions.AccentColor = Colors.SlateBlue.ToString(); CrunOptions.Theme = "System"; CrunOptions.SelectedCalendarLanguage = "de"; + CrunOptions.DlVideoOnce = true; CrunOptions.History = true; CfgManager.UpdateSettingsFromFile(); - + if (CrunOptions.History){ if (File.Exists(CfgManager.PathCrHistory)){ HistoryList = JsonConvert.DeserializeObject>(File.ReadAllText(CfgManager.PathCrHistory)) ??[]; @@ -725,7 +726,7 @@ public class Crunchyroll{ if (!streamPlaylistsReqResponse.IsOk){ dlFailed = true; } - + if (dlFailed){ Console.WriteLine($"CAN\'T FETCH VIDEO PLAYLISTS!"); } else{ @@ -868,14 +869,7 @@ public class Crunchyroll{ if (options.DlVideoOnce && dlVideoOnce){ Console.WriteLine("Already downloaded video, skipping video download..."); - return new DownloadResponse{ - Data = files, - Error = dlFailed, - FileName = fileName.Length > 0 ? (Path.IsPathRooted(fileName) ? fileName : Path.Combine(CfgManager.PathVIDEOS_DIR, fileName)) : "./unknown" - }; - } - - if (options.Novids){ + }else if (options.Novids){ Console.WriteLine("Skipping video download..."); } else{ var videoDownloadResult = await DownloadVideo(chosenVideoSegments, options, outFile, tsFile, tempTsFile, data); @@ -1088,6 +1082,7 @@ public class Crunchyroll{ } } else if (!options.Novids){ //TODO + MainWindow.ShowError("Requested Video with the current settings not implemented"); } else if (options.Novids){ fileName = Path.Combine(FileNameManager.ParseFileName(options.FileName, variables, options.Numbers, options.Override).ToArray()); Console.WriteLine("Downloading skipped!"); @@ -1400,11 +1395,15 @@ public class Crunchyroll{ playbackRequestNonDrm.Headers.UserAgent.ParseAdd("Crunchyroll/1.8.0 Nintendo Switch/12.3.12.0 UE4/4.27"); var playbackRequestNonDrmResponse = await HttpClientReq.Instance.SendHttpRequest(playbackRequestNonDrm); - + if (playbackRequestNonDrmResponse.IsOk && playbackRequestNonDrmResponse.ResponseContent != string.Empty){ CrunchyNoDrmStream? playStream = JsonConvert.DeserializeObject(playbackRequestNonDrmResponse.ResponseContent, SettingsJsonSerializerSettings); CrunchyStreams derivedPlayCrunchyStreams = new CrunchyStreams(); if (playStream != null){ + + var deauthVideoToken = HttpClientReq.CreateRequestMessage($"https://cr-play-service.prd.crunchyrollsvc.com/v1/token/{currentMediaId}/{playStream.Token}/inactive", HttpMethod.Patch, true, false, null); + var deauthVideoTokenResponse = await HttpClientReq.Instance.SendHttpRequest(deauthVideoToken); + if (playStream.HardSubs != null) foreach (var hardsub in playStream.HardSubs){ var stream = hardsub.Value; diff --git a/CRD/Utils/Muxing/FontsManager.cs b/CRD/Utils/Muxing/FontsManager.cs index 5127016..82ac362 100644 --- a/CRD/Utils/Muxing/FontsManager.cs +++ b/CRD/Utils/Muxing/FontsManager.cs @@ -107,7 +107,9 @@ public class FontsManager{ foreach (var s in subs){ foreach (var keyValuePair in s.Fonts){ - fontsNameList.Add(keyValuePair.Key,keyValuePair.Value); + if (!fontsNameList.ContainsKey(keyValuePair.Key)){ + fontsNameList.Add(keyValuePair.Key,keyValuePair.Value); + } } subsList.Add(s.Language.Locale); } diff --git a/CRD/Utils/Muxing/Merger.cs b/CRD/Utils/Muxing/Merger.cs index aba1320..386114b 100644 --- a/CRD/Utils/Muxing/Merger.cs +++ b/CRD/Utils/Muxing/Merger.cs @@ -33,35 +33,78 @@ public class Merger{ if (!options.mp3){ foreach (var vid in options.VideoAndAudio){ - if (vid.Delay != null && hasVideo){ - args.Add($"-itsoffset -{Math.Ceiling((double)vid.Delay * 1000)}ms"); - } + if (vid.Delay != null && hasVideo){ + args.Add($"-itsoffset -{Math.Ceiling((double)vid.Delay * 1000)}ms"); + } - args.Add($"-i \"{vid.Path}\""); - if (!hasVideo || options.KeepAllVideos == true){ - metaData.Add($"-map {index}:a -map {index}:v"); - metaData.Add($"-metadata:s:a:{audioIndex} language={vid.Language.Code}"); - metaData.Add($"-metadata:s:v:{index} title=\"{options.VideoTitle}\""); - hasVideo = true; - } else{ - metaData.Add($"-map {index}:a"); - metaData.Add($"-metadata:s:a:{audioIndex} language={vid.Language.Code}"); - } - - audioIndex++; - index++; - } - - foreach (var vid in options.OnlyVid){ - if (!hasVideo || options.KeepAllVideos == true){ args.Add($"-i \"{vid.Path}\""); - metaData.Add($"-map {index} -map -{index}:a"); - metaData.Add($"-metadata:s:v:{index} title=\"{options.VideoTitle}\""); - hasVideo = true; + if (!hasVideo || options.KeepAllVideos == true){ + metaData.Add($"-map {index}:a -map {index}:v"); + metaData.Add($"-metadata:s:a:{audioIndex} language={vid.Language.Code}"); + metaData.Add($"-metadata:s:v:{index} title=\"{options.VideoTitle}\""); + hasVideo = true; + } else{ + metaData.Add($"-map {index}:a"); + metaData.Add($"-metadata:s:a:{audioIndex} language={vid.Language.Code}"); + } + + audioIndex++; index++; } + + foreach (var vid in options.OnlyVid){ + if (!hasVideo || options.KeepAllVideos == true){ + args.Add($"-i \"{vid.Path}\""); + metaData.Add($"-map {index} -map -{index}:a"); + metaData.Add($"-metadata:s:v:{index} title=\"{options.VideoTitle}\""); + hasVideo = true; + index++; + } + } + + foreach (var aud in options.OnlyAudio){ + args.Add($"-i \"{aud.Path}\""); + metaData.Add($"-map {index}"); + metaData.Add($"-metadata:s:a:{audioIndex} language={aud.Language.Code}"); + index++; + audioIndex++; + } + + foreach (var sub in options.Subtitles.Select((value, i) => new{ value, i })){ + if (sub.value.Delay != null){ + args.Add($"-itsoffset -{Math.Ceiling((double)sub.value.Delay * 1000)}ms"); + } + + args.Add($"-i \"{sub.value.File}\""); + } + + if (options.Output.EndsWith(".mkv", StringComparison.OrdinalIgnoreCase)){ + if (options.Fonts != null){ + int fontIndex = 0; + foreach (var font in options.Fonts){ + args.Add($"-attach {font.Path} -metadata:s:t:{fontIndex} mimetype={font.Mime}"); + fontIndex++; + } + } + } + + args.AddRange(metaData); + args.AddRange(options.Subtitles.Select((sub, subIndex) => $"-map {subIndex + index}")); + args.Add("-c:v copy"); + args.Add("-c:a copy"); + args.Add(options.Output.EndsWith(".mp4", StringComparison.OrdinalIgnoreCase) ? "-c:s mov_text" : "-c:s ass"); + args.AddRange(options.Subtitles.Select((sub, subindex) => + $"-metadata:s:s:{subindex} title=\"{sub.Language.Language ?? sub.Language.Name}{(sub.ClosedCaption == true ? $" {options.CcTag}" : "")}{(sub.Signs == true ? " Signs" : "")}\" -metadata:s:s:{subindex} language={sub.Language.Code}")); + if (options.Options.ffmpeg?.Count > 0){ + args.AddRange(options.Options.ffmpeg); + } + + args.Add($"\"{options.Output}\""); + + return string.Join(" ", args); } + foreach (var aud in options.OnlyAudio){ args.Add($"-i \"{aud.Path}\""); metaData.Add($"-map {index}"); @@ -69,42 +112,7 @@ public class Merger{ index++; audioIndex++; } - - foreach (var sub in options.Subtitles.Select((value, i) => new{ value, i })){ - if (sub.value.Delay != null){ - args.Add($"-itsoffset -{Math.Ceiling((double)sub.value.Delay * 1000)}ms"); - } - - args.Add($"-i \"{sub.value.File}\""); - } - - if (options.Output.EndsWith(".mkv", StringComparison.OrdinalIgnoreCase)){ - if (options.Fonts != null){ - int fontIndex = 0; - foreach (var font in options.Fonts){ - args.Add($"-attach {font.Path} -metadata:s:t:{fontIndex} mimetype={font.Mime}"); - fontIndex++; - } - } - } - - args.AddRange(metaData); - args.AddRange(options.Subtitles.Select((sub, subIndex) => $"-map {subIndex + index}")); - args.Add("-c:v copy"); - args.Add("-c:a copy"); - args.Add(options.Output.EndsWith(".mp4", StringComparison.OrdinalIgnoreCase) ? "-c:s mov_text" : "-c:s ass"); - args.AddRange(options.Subtitles.Select((sub, subindex) => - $"-metadata:s:s:{subindex} title=\"{sub.Language.Language ?? sub.Language.Name}{(sub.ClosedCaption == true ? $" {options.CcTag}" : "")}{(sub.Signs == true ? " Signs" : "")}\" -metadata:s:s:{subindex} language={sub.Language.Code}")); - if (options.Options.ffmpeg?.Count > 0){ - args.AddRange(options.Options.ffmpeg); - } - args.Add($"\"{options.Output}\""); - - return string.Join(" ", args); - } - - args.Add($"-i \"{options.OnlyAudio[0].Path}\""); args.Add("-acodec libmp3lame"); args.Add("-ab 192k"); args.Add($"\"{options.Output}\""); @@ -389,7 +397,7 @@ public class MergerOptions{ public bool? SkipSubMux{ get; set; } public MuxOptions Options{ get; set; } public Defaults Defaults{ get; set; } - + public bool mp3{ get; set; } } diff --git a/CRD/ViewModels/SettingsPageViewModel.cs b/CRD/ViewModels/SettingsPageViewModel.cs index 7feada1..591ddf3 100644 --- a/CRD/ViewModels/SettingsPageViewModel.cs +++ b/CRD/ViewModels/SettingsPageViewModel.cs @@ -18,49 +18,73 @@ using FluentAvalonia.Styling; namespace CRD.ViewModels; public partial class SettingsPageViewModel : ViewModelBase{ - [ObservableProperty] private string _currentVersion = "v1.1"; + [ObservableProperty] + private string _currentVersion; - [ObservableProperty] private bool _downloadVideo = true; + [ObservableProperty] + private bool _downloadVideo = true; - [ObservableProperty] private bool _downloadAudio = true; + [ObservableProperty] + private bool _downloadAudio = true; - [ObservableProperty] private bool _downloadChapters = true; + [ObservableProperty] + private bool _downloadChapters = true; - [ObservableProperty] private bool _muxToMp4 = false; - - [ObservableProperty] private bool _history = false; + [ObservableProperty] + private bool _muxToMp4 = false; - [ObservableProperty] private int _leadingNumbers = 0; + [ObservableProperty] + private bool _history = false; - [ObservableProperty] private int _simultaneousDownloads = 0; + [ObservableProperty] + private int _leadingNumbers = 0; - [ObservableProperty] private string _fileName = ""; + [ObservableProperty] + private int _simultaneousDownloads = 0; - [ObservableProperty] private string _mkvMergeOptions = ""; + [ObservableProperty] + private string _fileName = ""; - [ObservableProperty] private string _ffmpegOptions = ""; + [ObservableProperty] + private string _mkvMergeOptions = ""; - [ObservableProperty] private string _selectedSubs = "all"; + [ObservableProperty] + private string _ffmpegOptions = ""; - [ObservableProperty] private ComboBoxItem _selectedHSLang; + [ObservableProperty] + private string _selectedSubs = "all"; - [ObservableProperty] private ComboBoxItem? _selectedDubLang; + [ObservableProperty] + private ComboBoxItem _selectedHSLang; - [ObservableProperty] private ComboBoxItem? _selectedVideoQuality; + [ObservableProperty] + private string _selectedDubs = "ja-JP"; - [ObservableProperty] private ComboBoxItem? _selectedAudioQuality; + [ObservableProperty] + private ObservableCollection _selectedDubLang = new(); - [ObservableProperty] private ComboBoxItem? _currentAppTheme; + [ObservableProperty] + private ComboBoxItem? _selectedVideoQuality; - [ObservableProperty] private ObservableCollection _selectedSubLang = new(); + [ObservableProperty] + private ComboBoxItem? _selectedAudioQuality; - [ObservableProperty] private bool _useCustomAccent = false; + [ObservableProperty] + private ComboBoxItem? _currentAppTheme; - [ObservableProperty] private Color _listBoxColor ; - [ObservableProperty] private Color _customAccentColor = Colors.SlateBlue; + [ObservableProperty] + private ObservableCollection _selectedSubLang = new(); + + [ObservableProperty] + private bool _useCustomAccent = false; + + [ObservableProperty] + private Color _listBoxColor; + + [ObservableProperty] + private Color _customAccentColor = Colors.SlateBlue; public ObservableCollection PredefinedColors{ get; } = new(){ - Color.FromRgb(255, 185, 0), Color.FromRgb(255, 140, 0), Color.FromRgb(247, 99, 12), @@ -151,15 +175,14 @@ public partial class SettingsPageViewModel : ViewModelBase{ private readonly FluentAvaloniaTheme _faTheme; private bool settingsLoaded = false; - + public SettingsPageViewModel(){ - var version = Assembly.GetExecutingAssembly().GetName().Version; _currentVersion = $"{version?.Major}.{version?.Minor}.{version?.Build}"; - - + + _faTheme = App.Current.Styles[0] as FluentAvaloniaTheme; - + foreach (var languageItem in Languages.languages){ HardSubLangList.Add(new ComboBoxItem{ Content = languageItem.CrLocale }); SubLangList.Add(new ListBoxItem{ Content = languageItem.CrLocale }); @@ -174,7 +197,7 @@ public partial class SettingsPageViewModel : ViewModelBase{ foreach (var listBoxItem in softSubLang){ SelectedSubLang.Add(listBoxItem); } - + if (SelectedSubLang.Count == 0){ SelectedSubs = "none"; } else{ @@ -187,8 +210,25 @@ public partial class SettingsPageViewModel : ViewModelBase{ ComboBoxItem? hsLang = HardSubLangList.FirstOrDefault(a => a.Content != null && (string)a.Content == options.Hslang) ?? null; SelectedHSLang = hsLang ?? HardSubLangList[0]; - ComboBoxItem? dubLang = DubLangList.FirstOrDefault(a => a.Content != null && (string)a.Content == options.DubLang[0]) ?? null; - SelectedDubLang = dubLang ?? DubLangList[0]; + // ComboBoxItem? dubLang = DubLangList.FirstOrDefault(a => a.Content != null && (string)a.Content == options.DubLang[0]) ?? null; + // SelectedDubLang = dubLang ?? DubLangList[0]; + + var dubLang = DubLangList.Where(a => options.DubLang.Contains(a.Content)).ToList(); + + SelectedDubLang.Clear(); + foreach (var listBoxItem in dubLang){ + SelectedDubLang.Add(listBoxItem); + } + + if (SelectedDubLang.Count == 0){ + SelectedDubs = "none"; + } else{ + SelectedDubs = SelectedDubLang[0].Content.ToString(); + for (var i = 1; i < SelectedDubLang.Count; i++){ + SelectedDubs += "," + SelectedDubLang[i].Content; + } + } + DownloadVideo = !options.Novids; DownloadAudio = !options.Noaudio; @@ -216,16 +256,16 @@ public partial class SettingsPageViewModel : ViewModelBase{ //TODO - Mux Options SelectedSubLang.CollectionChanged += Changes; + SelectedDubLang.CollectionChanged += Changes; settingsLoaded = true; } private void UpdateSettings(){ - if (!settingsLoaded){ return; } - + if (SelectedSubLang.Count == 0){ SelectedSubs = "none"; } else{ @@ -234,6 +274,15 @@ public partial class SettingsPageViewModel : ViewModelBase{ SelectedSubs += "," + SelectedSubLang[i].Content; } } + + if (SelectedDubLang.Count == 0){ + SelectedDubs = "none"; + } else{ + SelectedDubs = SelectedDubLang[0].Content.ToString(); + for (var i = 1; i < SelectedDubLang.Count; i++){ + SelectedDubs += "," + SelectedDubLang[i].Content; + } + } Crunchyroll.Instance.CrunOptions.Novids = !DownloadVideo; Crunchyroll.Instance.CrunOptions.Noaudio = !DownloadAudio; @@ -254,12 +303,15 @@ public partial class SettingsPageViewModel : ViewModelBase{ Crunchyroll.Instance.CrunOptions.Hslang = hslang != "none" ? Languages.FindLang(hslang).Locale : hslang; - if (SelectedDubLang != null){ - string dublang = SelectedDubLang.Content + ""; - Crunchyroll.Instance.CrunOptions.DubLang = new List{ dublang }; + List dubLangs = new List(); + foreach (var listBoxItem in SelectedDubLang){ + dubLangs.Add(listBoxItem.Content + ""); } + Crunchyroll.Instance.CrunOptions.DubLang = dubLangs; + + Crunchyroll.Instance.CrunOptions.SimultaneousDownloads = SimultaneousDownloads; @@ -270,7 +322,7 @@ public partial class SettingsPageViewModel : ViewModelBase{ Crunchyroll.Instance.CrunOptions.AccentColor = _faTheme.CustomAccentColor.ToString(); Crunchyroll.Instance.CrunOptions.History = History; - + //TODO - Mux Options CfgManager.WriteSettingsToFile(); @@ -297,7 +349,7 @@ public partial class SettingsPageViewModel : ViewModelBase{ if (_faTheme.TryGetResource("SystemAccentColor", null, out var curColor)){ CustomAccentColor = (Color)curColor; ListBoxColor = CustomAccentColor; - + RaisePropertyChanged(nameof(CustomAccentColor)); RaisePropertyChanged(nameof(ListBoxColor)); } @@ -307,16 +359,16 @@ public partial class SettingsPageViewModel : ViewModelBase{ UpdateAppAccentColor(Colors.SlateBlue); } } - + partial void OnListBoxColorChanged(Color value){ if (value != null){ CustomAccentColor = value; RaisePropertyChanged(nameof(CustomAccentColor)); - + UpdateAppAccentColor(value); } } - + partial void OnCustomAccentColorChanged(Color value){ ListBoxColor = value; RaisePropertyChanged(nameof(ListBoxColor)); @@ -329,9 +381,7 @@ public partial class SettingsPageViewModel : ViewModelBase{ } - partial void OnSelectedDubLangChanged(ComboBoxItem? value){ - UpdateSettings(); - } + private void Changes(object? sender, NotifyCollectionChangedEventArgs e){ UpdateSettings(); diff --git a/CRD/Views/SettingsPageView.axaml b/CRD/Views/SettingsPageView.axaml index 9f7c20c..f59c71c 100644 --- a/CRD/Views/SettingsPageView.axaml +++ b/CRD/Views/SettingsPageView.axaml @@ -21,10 +21,41 @@ IconSource="Speaker2" Description="Change the selected dub language"> - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + +