Chg - Allow multiple Dub languages to be selected

Fix - Invalidate stream token
This commit is contained in:
Elwador 2024-05-22 23:22:02 +02:00
parent fbd16274a6
commit d769e5e75e
5 changed files with 209 additions and 119 deletions

View File

@ -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<ObservableCollection<HistorySeries>>(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<CrunchyNoDrmStream>(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;

View File

@ -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);
}

View File

@ -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; }
}

View File

@ -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<ListBoxItem> _selectedDubLang = new();
[ObservableProperty] private ComboBoxItem? _currentAppTheme;
[ObservableProperty]
private ComboBoxItem? _selectedVideoQuality;
[ObservableProperty] private ObservableCollection<ListBoxItem> _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<ListBoxItem> _selectedSubLang = new();
[ObservableProperty]
private bool _useCustomAccent = false;
[ObservableProperty]
private Color _listBoxColor;
[ObservableProperty]
private Color _customAccentColor = Colors.SlateBlue;
public ObservableCollection<Color> 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<string>{ dublang };
List<string> dubLangs = new List<string>();
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();

View File

@ -21,10 +21,41 @@
IconSource="Speaker2"
Description="Change the selected dub language">
<controls:SettingsExpander.Footer>
<ComboBox HorizontalContentAlignment="Center" MinWidth="210" MaxDropDownHeight="400"
ItemsSource="{Binding DubLangList}"
SelectedItem="{Binding SelectedDubLang}">
</ComboBox>
<!-- <ComboBox HorizontalContentAlignment="Center" MinWidth="210" MaxDropDownHeight="400" -->
<!-- -->
<!-- ItemsSource="{Binding DubLangList}" -->
<!-- SelectedItem="{Binding SelectedDubLang}"> -->
<!-- </ComboBox> -->
<StackPanel>
<ToggleButton x:Name="DropdownButtonDub" Width="210" HorizontalContentAlignment="Stretch">
<ToggleButton.Content>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock HorizontalAlignment="Center" Text="{Binding SelectedDubs}"
VerticalAlignment="Center" />
<Path Grid.Column="1" Data="M 0,1 L 4,4 L 8,1" Stroke="White" StrokeThickness="1"
VerticalAlignment="Center" Margin="5,0,5,0" Stretch="Uniform" Width="8" />
</Grid>
</ToggleButton.Content>
</ToggleButton>
<Popup IsLightDismissEnabled="True"
IsOpen="{Binding IsChecked, ElementName=DropdownButtonDub, Mode=TwoWay}" Placement="Bottom"
PlacementTarget="{Binding ElementName=DropdownButtonDub}">
<Border BorderThickness="1" Background="{DynamicResource ComboBoxDropDownBackground}">
<ListBox x:Name="ListBoxDubsSelection" SelectionMode="Multiple,Toggle" Width="210"
MaxHeight="400"
ItemsSource="{Binding DubLangList}" SelectedItems="{Binding SelectedDubLang}">
</ListBox>
</Border>
</Popup>
</StackPanel>
</controls:SettingsExpander.Footer>
</controls:SettingsExpander>