Add - History tab language selection
Add - Muxing description language selection
This commit is contained in:
parent
9d66eb34c9
commit
d2516d039b
|
@ -17,7 +17,7 @@ namespace CRD.Downloader;
|
||||||
public class CrEpisode(){
|
public class CrEpisode(){
|
||||||
private readonly Crunchyroll crunInstance = Crunchyroll.Instance;
|
private readonly Crunchyroll crunInstance = Crunchyroll.Instance;
|
||||||
|
|
||||||
public async Task<CrunchyEpisode?> ParseEpisodeById(string id, string locale){
|
public async Task<CrunchyEpisode?> ParseEpisodeById(string id, string crLocale,bool forcedLang = false){
|
||||||
if (crunInstance.CmsToken?.Cms == null){
|
if (crunInstance.CmsToken?.Cms == null){
|
||||||
Console.Error.WriteLine("Missing CMS Access Token");
|
Console.Error.WriteLine("Missing CMS Access Token");
|
||||||
return null;
|
return null;
|
||||||
|
@ -26,7 +26,13 @@ public class CrEpisode(){
|
||||||
NameValueCollection query = HttpUtility.ParseQueryString(new UriBuilder().Query);
|
NameValueCollection query = HttpUtility.ParseQueryString(new UriBuilder().Query);
|
||||||
|
|
||||||
query["preferred_audio_language"] = "ja-JP";
|
query["preferred_audio_language"] = "ja-JP";
|
||||||
query["locale"] = Languages.Locale2language(locale).CrLocale;
|
if (!string.IsNullOrEmpty(crLocale)){
|
||||||
|
query["locale"] = crLocale;
|
||||||
|
if (forcedLang){
|
||||||
|
query["force_locale"] = crLocale;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
var request = HttpClientReq.CreateRequestMessage($"{Api.Cms}/episodes/{id}", HttpMethod.Get, true, true, query);
|
var request = HttpClientReq.CreateRequestMessage($"{Api.Cms}/episodes/{id}", HttpMethod.Get, true, true, query);
|
||||||
|
|
||||||
|
@ -199,6 +205,7 @@ public class CrEpisode(){
|
||||||
};
|
};
|
||||||
epMeta.AvailableSubs = item.SubtitleLocales;
|
epMeta.AvailableSubs = item.SubtitleLocales;
|
||||||
epMeta.Description = item.Description;
|
epMeta.Description = item.Description;
|
||||||
|
|
||||||
if (episodeP.EpisodeAndLanguages.Langs.Count > 0){
|
if (episodeP.EpisodeAndLanguages.Langs.Count > 0){
|
||||||
epMeta.SelectedDubs = dubLang
|
epMeta.SelectedDubs = dubLang
|
||||||
.Where(language => episodeP.EpisodeAndLanguages.Langs.Any(epLang => epLang.CrLocale == language))
|
.Where(language => episodeP.EpisodeAndLanguages.Langs.Any(epLang => epLang.CrLocale == language))
|
||||||
|
|
|
@ -133,12 +133,12 @@ public class CrSeries(){
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public async Task<CrunchySeriesList?> ListSeriesId(string id,string Locale, CrunchyMultiDownload? data){
|
public async Task<CrunchySeriesList?> ListSeriesId(string id,string crLocale, CrunchyMultiDownload? data){
|
||||||
await crunInstance.CrAuth.RefreshToken(true);
|
await crunInstance.CrAuth.RefreshToken(true);
|
||||||
|
|
||||||
bool serieshasversions = true;
|
bool serieshasversions = true;
|
||||||
|
|
||||||
CrSeriesSearch? parsedSeries = await ParseSeriesById(id,Locale); // one piece - GRMG8ZQZR
|
CrSeriesSearch? parsedSeries = await ParseSeriesById(id,crLocale); // one piece - GRMG8ZQZR
|
||||||
|
|
||||||
if (parsedSeries == null){
|
if (parsedSeries == null){
|
||||||
Console.Error.WriteLine("Parse Data Invalid");
|
Console.Error.WriteLine("Parse Data Invalid");
|
||||||
|
@ -154,7 +154,7 @@ public class CrSeries(){
|
||||||
var s = result[season][key];
|
var s = result[season][key];
|
||||||
if (data?.S != null && s.Id != data.Value.S) continue;
|
if (data?.S != null && s.Id != data.Value.S) continue;
|
||||||
int fallbackIndex = 0;
|
int fallbackIndex = 0;
|
||||||
var seasonData = await GetSeasonDataById(s.Id);
|
var seasonData = await GetSeasonDataById(s.Id,"");
|
||||||
if (seasonData.Data != null){
|
if (seasonData.Data != null){
|
||||||
|
|
||||||
if (crunInstance.CrunOptions.History){
|
if (crunInstance.CrunOptions.History){
|
||||||
|
@ -285,7 +285,7 @@ public class CrSeries(){
|
||||||
return crunchySeriesList;
|
return crunchySeriesList;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<CrunchyEpisodeList> GetSeasonDataById(string seasonID, bool log = false){
|
public async Task<CrunchyEpisodeList> GetSeasonDataById(string seasonID,string? crLocale,bool forcedLang = false, bool log = false){
|
||||||
CrunchyEpisodeList episodeList = new CrunchyEpisodeList(){ Data = new List<CrunchyEpisode>(), Total = 0, Meta = new Meta() };
|
CrunchyEpisodeList episodeList = new CrunchyEpisodeList(){ Data = new List<CrunchyEpisode>(), Total = 0, Meta = new Meta() };
|
||||||
|
|
||||||
if (crunInstance.CmsToken?.Cms == null){
|
if (crunInstance.CmsToken?.Cms == null){
|
||||||
|
@ -293,8 +293,20 @@ public class CrSeries(){
|
||||||
return episodeList;
|
return episodeList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NameValueCollection query;
|
||||||
if (log){
|
if (log){
|
||||||
var showRequest = HttpClientReq.CreateRequestMessage($"{Api.Cms}/seasons/{seasonID}?preferred_audio_language=ja-JP", HttpMethod.Get, true, true, null);
|
|
||||||
|
query = HttpUtility.ParseQueryString(new UriBuilder().Query);
|
||||||
|
|
||||||
|
query["preferred_audio_language"] = "ja-JP";
|
||||||
|
if (!string.IsNullOrEmpty(crLocale)){
|
||||||
|
query["locale"] = crLocale;
|
||||||
|
if (forcedLang){
|
||||||
|
query["force_locale"] = crLocale;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var showRequest = HttpClientReq.CreateRequestMessage($"{Api.Cms}/seasons/{seasonID}", HttpMethod.Get, true, true, query);
|
||||||
|
|
||||||
var response = await HttpClientReq.Instance.SendHttpRequest(showRequest);
|
var response = await HttpClientReq.Instance.SendHttpRequest(showRequest);
|
||||||
|
|
||||||
|
@ -305,9 +317,17 @@ public class CrSeries(){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var episodeRequest = new HttpRequestMessage(HttpMethod.Get, $"{Api.Cms}/seasons/{seasonID}/episodes?preferred_audio_language=ja-JP");
|
query = HttpUtility.ParseQueryString(new UriBuilder().Query);
|
||||||
|
|
||||||
episodeRequest.Headers.Authorization = new AuthenticationHeaderValue("Bearer", crunInstance.Token?.access_token);
|
query["preferred_audio_language"] = "ja-JP";
|
||||||
|
if (!string.IsNullOrEmpty(crLocale)){
|
||||||
|
query["locale"] = crLocale;
|
||||||
|
if (forcedLang){
|
||||||
|
query["force_locale"] = crLocale;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var episodeRequest = HttpClientReq.CreateRequestMessage( $"{Api.Cms}/seasons/{seasonID}/episodes",HttpMethod.Get, true,true,query);
|
||||||
|
|
||||||
var episodeRequestResponse = await HttpClientReq.Instance.SendHttpRequest(episodeRequest);
|
var episodeRequestResponse = await HttpClientReq.Instance.SendHttpRequest(episodeRequest);
|
||||||
|
|
||||||
|
@ -356,7 +376,7 @@ public class CrSeries(){
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<CrSeriesSearch?> ParseSeriesById(string id,string? locale,bool forced = false){
|
public async Task<CrSeriesSearch?> ParseSeriesById(string id,string? crLocale,bool forced = false){
|
||||||
if (crunInstance.CmsToken?.Cms == null){
|
if (crunInstance.CmsToken?.Cms == null){
|
||||||
Console.Error.WriteLine("Missing CMS Access Token");
|
Console.Error.WriteLine("Missing CMS Access Token");
|
||||||
return null;
|
return null;
|
||||||
|
@ -365,10 +385,10 @@ public class CrSeries(){
|
||||||
NameValueCollection query = HttpUtility.ParseQueryString(new UriBuilder().Query);
|
NameValueCollection query = HttpUtility.ParseQueryString(new UriBuilder().Query);
|
||||||
|
|
||||||
query["preferred_audio_language"] = "ja-JP";
|
query["preferred_audio_language"] = "ja-JP";
|
||||||
if (!string.IsNullOrEmpty(locale)){
|
if (!string.IsNullOrEmpty(crLocale)){
|
||||||
query["locale"] = Languages.Locale2language(locale).CrLocale;
|
query["locale"] = crLocale;
|
||||||
if (forced){
|
if (forced){
|
||||||
query["force_locale"] = Languages.Locale2language(locale).CrLocale;
|
query["force_locale"] = crLocale;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -393,7 +413,7 @@ public class CrSeries(){
|
||||||
return seasonsList;
|
return seasonsList;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<CrSeriesBase?> SeriesById(string id){
|
public async Task<CrSeriesBase?> SeriesById(string id,string? crLocale,bool forced = false){
|
||||||
if (crunInstance.CmsToken?.Cms == null){
|
if (crunInstance.CmsToken?.Cms == null){
|
||||||
Console.Error.WriteLine("Missing CMS Access Token");
|
Console.Error.WriteLine("Missing CMS Access Token");
|
||||||
return null;
|
return null;
|
||||||
|
@ -402,6 +422,13 @@ public class CrSeries(){
|
||||||
NameValueCollection query = HttpUtility.ParseQueryString(new UriBuilder().Query);
|
NameValueCollection query = HttpUtility.ParseQueryString(new UriBuilder().Query);
|
||||||
|
|
||||||
query["preferred_audio_language"] = "ja-JP";
|
query["preferred_audio_language"] = "ja-JP";
|
||||||
|
if (!string.IsNullOrEmpty(crLocale)){
|
||||||
|
query["locale"] = crLocale;
|
||||||
|
if (forced){
|
||||||
|
query["force_locale"] = crLocale;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
var request = HttpClientReq.CreateRequestMessage($"{Api.Cms}/series/{id}", HttpMethod.Get, true, true, query);
|
var request = HttpClientReq.CreateRequestMessage($"{Api.Cms}/series/{id}", HttpMethod.Get, true, true, query);
|
||||||
|
|
||||||
|
|
|
@ -69,7 +69,7 @@ public class Crunchyroll{
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public string DefaultLocale = "en";
|
public string DefaultLocale = "en-US";
|
||||||
|
|
||||||
public JsonSerializerSettings? SettingsJsonSerializerSettings = new(){
|
public JsonSerializerSettings? SettingsJsonSerializerSettings = new(){
|
||||||
NullValueHandling = NullValueHandling.Ignore,
|
NullValueHandling = NullValueHandling.Ignore,
|
||||||
|
@ -159,6 +159,7 @@ public class Crunchyroll{
|
||||||
CrunOptions.DlVideoOnce = true;
|
CrunOptions.DlVideoOnce = true;
|
||||||
CrunOptions.StreamEndpoint = "web/firefox";
|
CrunOptions.StreamEndpoint = "web/firefox";
|
||||||
CrunOptions.SubsAddScaledBorder = ScaledBorderAndShadowSelection.ScaledBorderAndShadowYes;
|
CrunOptions.SubsAddScaledBorder = ScaledBorderAndShadowSelection.ScaledBorderAndShadowYes;
|
||||||
|
CrunOptions.HistoryLang = "";
|
||||||
|
|
||||||
CrunOptions.History = true;
|
CrunOptions.History = true;
|
||||||
|
|
||||||
|
@ -321,10 +322,10 @@ public class Crunchyroll{
|
||||||
return week;
|
return week;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task AddEpisodeToQue(string epId, string locale, List<string> dubLang){
|
public async Task AddEpisodeToQue(string epId, string crLocale, List<string> dubLang){
|
||||||
await CrAuth.RefreshToken(true);
|
await CrAuth.RefreshToken(true);
|
||||||
|
|
||||||
var episodeL = await CrEpisode.ParseEpisodeById(epId, locale);
|
var episodeL = await CrEpisode.ParseEpisodeById(epId, crLocale);
|
||||||
|
|
||||||
|
|
||||||
if (episodeL != null){
|
if (episodeL != null){
|
||||||
|
@ -336,6 +337,13 @@ public class Crunchyroll{
|
||||||
var sList = await CrEpisode.EpisodeData((CrunchyEpisode)episodeL);
|
var sList = await CrEpisode.EpisodeData((CrunchyEpisode)episodeL);
|
||||||
var selected = CrEpisode.EpisodeMeta(sList, dubLang);
|
var selected = CrEpisode.EpisodeMeta(sList, dubLang);
|
||||||
|
|
||||||
|
if (CrunOptions.IncludeVideoDescription){
|
||||||
|
if (selected.Data is{ Count: > 0 }){
|
||||||
|
var episode = await CrEpisode.ParseEpisodeById(selected.Data.First().MediaId, string.IsNullOrEmpty(CrunOptions.DescriptionLang) ? DefaultLocale : CrunOptions.DescriptionLang, true);
|
||||||
|
selected.Description = episode?.Description ?? selected.Description;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (selected.Data is{ Count: > 0 }){
|
if (selected.Data is{ Count: > 0 }){
|
||||||
if (CrunOptions.History){
|
if (CrunOptions.History){
|
||||||
var historyEpisode = CrHistory.GetHistoryEpisodeWithDownloadDir(selected.ShowId, selected.SeasonId, selected.Data.First().MediaId);
|
var historyEpisode = CrHistory.GetHistoryEpisodeWithDownloadDir(selected.ShowId, selected.SeasonId, selected.Data.First().MediaId);
|
||||||
|
@ -373,7 +381,7 @@ public class Crunchyroll{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddSeriesToQueue(CrunchySeriesList list, CrunchyMultiDownload data){
|
public async Task AddSeriesToQueue(CrunchySeriesList list, CrunchyMultiDownload data){
|
||||||
var selected = CrSeries.ItemSelectMultiDub(list.Data, data.DubLang, data.But, data.AllEpisodes, data.E);
|
var selected = CrSeries.ItemSelectMultiDub(list.Data, data.DubLang, data.But, data.AllEpisodes, data.E);
|
||||||
|
|
||||||
bool failed = false;
|
bool failed = false;
|
||||||
|
@ -399,6 +407,13 @@ public class Crunchyroll{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (CrunOptions.IncludeVideoDescription){
|
||||||
|
if (crunchyEpMeta.Data is{ Count: > 0 }){
|
||||||
|
var episode = await CrEpisode.ParseEpisodeById(crunchyEpMeta.Data.First().MediaId, string.IsNullOrEmpty(CrunOptions.DescriptionLang) ? DefaultLocale : CrunOptions.DescriptionLang, true);
|
||||||
|
crunchyEpMeta.Description = episode?.Description ?? crunchyEpMeta.Description;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Queue.Add(crunchyEpMeta);
|
Queue.Add(crunchyEpMeta);
|
||||||
} else{
|
} else{
|
||||||
failed = true;
|
failed = true;
|
||||||
|
|
|
@ -27,7 +27,7 @@ public class History(){
|
||||||
public async Task UpdateSeries(string seriesId, string? seasonId){
|
public async Task UpdateSeries(string seriesId, string? seasonId){
|
||||||
await crunInstance.CrAuth.RefreshToken(true);
|
await crunInstance.CrAuth.RefreshToken(true);
|
||||||
|
|
||||||
CrSeriesSearch? parsedSeries = await crunInstance.CrSeries.ParseSeriesById(seriesId, "ja", true);
|
CrSeriesSearch? parsedSeries = await crunInstance.CrSeries.ParseSeriesById(seriesId, "ja-JP", true);
|
||||||
|
|
||||||
if (parsedSeries == null){
|
if (parsedSeries == null){
|
||||||
Console.Error.WriteLine("Parse Data Invalid");
|
Console.Error.WriteLine("Parse Data Invalid");
|
||||||
|
@ -55,8 +55,8 @@ public class History(){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var seasonData = await crunInstance.CrSeries.GetSeasonDataById(sId);
|
var seasonData = await crunInstance.CrSeries.GetSeasonDataById(sId,string.IsNullOrEmpty(crunInstance.CrunOptions.HistoryLang) ? crunInstance.DefaultLocale : crunInstance.CrunOptions.HistoryLang,true);
|
||||||
UpdateWithSeasonData(seasonData);
|
await UpdateWithSeasonData(seasonData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -152,10 +152,7 @@ public class History(){
|
||||||
if (historySeries != null){
|
if (historySeries != null){
|
||||||
var historySeason = historySeries.Seasons.FirstOrDefault(s => s.SeasonId == episode.SeasonId);
|
var historySeason = historySeries.Seasons.FirstOrDefault(s => s.SeasonId == episode.SeasonId);
|
||||||
|
|
||||||
var series = await crunInstance.CrSeries.SeriesById(seriesId);
|
await RefreshSeriesData(seriesId, historySeries);
|
||||||
if (series?.Data != null){
|
|
||||||
historySeries.SeriesTitle = series.Data.First().Title;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (historySeason != null){
|
if (historySeason != null){
|
||||||
historySeason.SeasonTitle = episode.SeasonTitle;
|
historySeason.SeasonTitle = episode.SeasonTitle;
|
||||||
|
@ -192,12 +189,7 @@ public class History(){
|
||||||
crunInstance.HistoryList.Add(historySeries);
|
crunInstance.HistoryList.Add(historySeries);
|
||||||
var newSeason = NewHistorySeason(episode);
|
var newSeason = NewHistorySeason(episode);
|
||||||
|
|
||||||
var series = await crunInstance.CrSeries.SeriesById(seriesId);
|
await RefreshSeriesData(seriesId, historySeries);
|
||||||
if (series?.Data != null){
|
|
||||||
historySeries.SeriesDescription = series.Data.First().Description;
|
|
||||||
historySeries.ThumbnailImageUrl = GetSeriesThumbnail(series);
|
|
||||||
historySeries.SeriesTitle = series.Data.First().Title;
|
|
||||||
}
|
|
||||||
|
|
||||||
historySeries.Seasons.Add(newSeason);
|
historySeries.Seasons.Add(newSeason);
|
||||||
historySeries.UpdateNewEpisodes();
|
historySeries.UpdateNewEpisodes();
|
||||||
|
@ -217,10 +209,8 @@ public class History(){
|
||||||
var historySeries = crunInstance.HistoryList.FirstOrDefault(series => series.SeriesId == seriesId);
|
var historySeries = crunInstance.HistoryList.FirstOrDefault(series => series.SeriesId == seriesId);
|
||||||
if (historySeries != null){
|
if (historySeries != null){
|
||||||
var historySeason = historySeries.Seasons.FirstOrDefault(s => s.SeasonId == firstEpisode.SeasonId);
|
var historySeason = historySeries.Seasons.FirstOrDefault(s => s.SeasonId == firstEpisode.SeasonId);
|
||||||
var series = await crunInstance.CrSeries.SeriesById(seriesId);
|
|
||||||
if (series?.Data != null){
|
await RefreshSeriesData(seriesId, historySeries);
|
||||||
historySeries.SeriesTitle = series.Data.First().Title;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (historySeason != null){
|
if (historySeason != null){
|
||||||
historySeason.SeasonTitle = firstEpisode.SeasonTitle;
|
historySeason.SeasonTitle = firstEpisode.SeasonTitle;
|
||||||
|
@ -274,12 +264,7 @@ public class History(){
|
||||||
|
|
||||||
newSeason.EpisodesList.Sort(new NumericStringPropertyComparer());
|
newSeason.EpisodesList.Sort(new NumericStringPropertyComparer());
|
||||||
|
|
||||||
var series = await crunInstance.CrSeries.SeriesById(seriesId);
|
await RefreshSeriesData(seriesId, historySeries);
|
||||||
if (series?.Data != null){
|
|
||||||
historySeries.SeriesDescription = series.Data.First().Description;
|
|
||||||
historySeries.ThumbnailImageUrl = GetSeriesThumbnail(series);
|
|
||||||
historySeries.SeriesTitle = series.Data.First().Title;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
historySeries.Seasons.Add(newSeason);
|
historySeries.Seasons.Add(newSeason);
|
||||||
|
@ -295,6 +280,15 @@ public class History(){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task RefreshSeriesData(string seriesId, HistorySeries historySeries){
|
||||||
|
var series = await crunInstance.CrSeries.SeriesById(seriesId,string.IsNullOrEmpty(crunInstance.CrunOptions.HistoryLang) ? crunInstance.DefaultLocale : crunInstance.CrunOptions.HistoryLang,true);
|
||||||
|
if (series?.Data != null){
|
||||||
|
historySeries.SeriesDescription = series.Data.First().Description;
|
||||||
|
historySeries.ThumbnailImageUrl = GetSeriesThumbnail(series);
|
||||||
|
historySeries.SeriesTitle = series.Data.First().Title;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void SortSeasons(HistorySeries series){
|
private void SortSeasons(HistorySeries series){
|
||||||
var sortedSeasons = series.Seasons
|
var sortedSeasons = series.Seasons
|
||||||
.OrderBy(s => s.SeasonNum != null ? int.Parse(s.SeasonNum) : 0)
|
.OrderBy(s => s.SeasonNum != null ? int.Parse(s.SeasonNum) : 0)
|
||||||
|
|
|
@ -1,106 +0,0 @@
|
||||||
<Styles xmlns="https://github.com/avaloniaui"
|
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
||||||
xmlns:ui="using:FluentAvalonia.UI.Controls"
|
|
||||||
xmlns:uip="using:FluentAvalonia.UI.Controls.Primitives">
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!--
|
|
||||||
NavView style in MainView for main app navigation
|
|
||||||
While you are free to copy this into your own apps
|
|
||||||
if you want an MS store like NavView, this will NOT
|
|
||||||
be an officially supported thing in the main library
|
|
||||||
-->
|
|
||||||
<Style Selector="ui|NavigationView.SampleAppNav">
|
|
||||||
<Setter Property="IsPaneToggleButtonVisible" Value="False" />
|
|
||||||
<Setter Property="OpenPaneLength" Value="72" />
|
|
||||||
<Setter Property="IsPaneOpen" Value="True" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="ui|NavigationView.SampleAppNav /template/ Button#NavigationViewBackButton">
|
|
||||||
<Setter Property="Width" Value="{DynamicResource NavigationBackButtonWidth}" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="ui|NavigationView.SampleAppNav[IsBackButtonVisible=False] SplitView /template/ ContentPresenter#PART_PanePresenter">
|
|
||||||
<Setter Property="Margin" Value="0 40 0 0" />
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="ui|NavigationViewItem.SampleAppNav uip|NavigationViewItemPresenter">
|
|
||||||
<Setter Property="Width" Value="72" />
|
|
||||||
<Setter Property="MinHeight" Value="60" />
|
|
||||||
<Setter Property="CornerRadius" Value="{StaticResource ControlCornerRadius}" />
|
|
||||||
<Setter Property="Foreground" Value="{DynamicResource TextFillColorSecondaryBrush}" />
|
|
||||||
<Setter Property="Template">
|
|
||||||
<ControlTemplate>
|
|
||||||
<Border Name="LayoutRoot"
|
|
||||||
Background="{TemplateBinding Background}"
|
|
||||||
CornerRadius="{TemplateBinding CornerRadius}"
|
|
||||||
Margin="4 2"
|
|
||||||
TemplatedControl.IsTemplateFocusTarget="True">
|
|
||||||
<Panel>
|
|
||||||
<Panel HorizontalAlignment="Left"
|
|
||||||
VerticalAlignment="Center">
|
|
||||||
|
|
||||||
<Border Name="SelectionIndicator"
|
|
||||||
Background="{DynamicResource NavigationViewSelectionIndicatorForeground}"
|
|
||||||
Width="3"
|
|
||||||
Opacity="0"
|
|
||||||
VerticalAlignment="Center"
|
|
||||||
Height="20"
|
|
||||||
CornerRadius="{StaticResource ControlCornerRadius}"/>
|
|
||||||
</Panel>
|
|
||||||
|
|
||||||
|
|
||||||
<DockPanel>
|
|
||||||
<ContentPresenter Name="ContentPresenter"
|
|
||||||
Grid.Row="1"
|
|
||||||
ContentTemplate="{TemplateBinding ContentTemplate}"
|
|
||||||
Content="{TemplateBinding Content}"
|
|
||||||
HorizontalAlignment="Center"
|
|
||||||
VerticalAlignment="Bottom"
|
|
||||||
FontSize="10"
|
|
||||||
Padding="0 4"
|
|
||||||
Margin="0 -15 0 3"
|
|
||||||
DockPanel.Dock="Bottom"
|
|
||||||
IsVisible="False">
|
|
||||||
<ContentPresenter.Styles>
|
|
||||||
<Style Selector="TextBlock">
|
|
||||||
<Setter Property="TextWrapping" Value="Wrap" />
|
|
||||||
</Style>
|
|
||||||
</ContentPresenter.Styles>
|
|
||||||
</ContentPresenter>
|
|
||||||
|
|
||||||
<Viewbox Name="IconBox"
|
|
||||||
Height="28"
|
|
||||||
HorizontalAlignment="Center"
|
|
||||||
VerticalAlignment="Center">
|
|
||||||
<ContentPresenter Name="Icon"
|
|
||||||
Content="{Binding TemplateSettings.Icon, RelativeSource={RelativeSource TemplatedParent}}" />
|
|
||||||
</Viewbox>
|
|
||||||
|
|
||||||
</DockPanel>
|
|
||||||
</Panel>
|
|
||||||
</Border>
|
|
||||||
</ControlTemplate>
|
|
||||||
</Setter>
|
|
||||||
</Style>
|
|
||||||
<Style Selector="ui|NavigationViewItem.SampleAppNav uip|NavigationViewItemPresenter:pointerover /template/ ContentPresenter#ContentPresenter">
|
|
||||||
<Setter Property="Foreground" Value="{DynamicResource TextFillColorPrimaryBrush}" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="ui|NavigationViewItem.SampleAppNav uip|NavigationViewItemPresenter:pointerover /template/ ContentPresenter#Icon">
|
|
||||||
<Setter Property="Foreground" Value="{DynamicResource TextFillColorPrimaryBrush}" />
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="ui|NavigationViewItem.SampleAppNav uip|NavigationViewItemPresenter:pressed /template/ ContentPresenter#ContentPresenter">
|
|
||||||
<Setter Property="Foreground" Value="{DynamicResource TextFillColorSecondaryBrush}" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="ui|NavigationViewItem.SampleAppNav uip|NavigationViewItemPresenter:pressed /template/ ContentPresenter#Icon">
|
|
||||||
<Setter Property="Foreground" Value="{DynamicResource TextFillColorSecondaryBrush}" />
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
<Style Selector="ui|NavigationViewItem.SampleAppNav uip|NavigationViewItemPresenter:selected /template/ ContentPresenter#ContentPresenter">
|
|
||||||
<Setter Property="IsVisible" Value="False" />
|
|
||||||
</Style>
|
|
||||||
<Style Selector="ui|NavigationViewItem.SampleAppNav uip|NavigationViewItemPresenter:selected /template/ ContentPresenter#Icon">
|
|
||||||
<Setter Property="Foreground" Value="{DynamicResource AccentFillColorDefaultBrush}" />
|
|
||||||
</Style>
|
|
||||||
|
|
||||||
</Styles>
|
|
|
@ -47,7 +47,7 @@ public partial class CalendarEpisode : INotifyPropertyChanged{
|
||||||
if (match.Success){
|
if (match.Success){
|
||||||
var locale = match.Groups[1].Value; // Capture the locale part
|
var locale = match.Groups[1].Value; // Capture the locale part
|
||||||
var id = match.Groups[2].Value; // Capture the ID part
|
var id = match.Groups[2].Value; // Capture the ID part
|
||||||
Crunchyroll.Instance.AddEpisodeToQue(id, locale, Crunchyroll.Instance.CrunOptions.DubLang);
|
Crunchyroll.Instance.AddEpisodeToQue(id, Languages.Locale2language(locale).CrLocale, Crunchyroll.Instance.CrunOptions.DubLang);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -81,6 +81,9 @@ public class CrDownloadOptions{
|
||||||
[YamlMember(Alias = "mux_video_description", ApplyNamingConventions = false)]
|
[YamlMember(Alias = "mux_video_description", ApplyNamingConventions = false)]
|
||||||
public bool IncludeVideoDescription{ get; set; }
|
public bool IncludeVideoDescription{ get; set; }
|
||||||
|
|
||||||
|
[YamlMember(Alias = "mux_description_lang", ApplyNamingConventions = false)]
|
||||||
|
public string? DescriptionLang{ get; set; }
|
||||||
|
|
||||||
[YamlIgnore]
|
[YamlIgnore]
|
||||||
public string Force{ get; set; }
|
public string Force{ get; set; }
|
||||||
|
|
||||||
|
@ -132,6 +135,9 @@ public class CrDownloadOptions{
|
||||||
[YamlMember(Alias = "history", ApplyNamingConventions = false)]
|
[YamlMember(Alias = "history", ApplyNamingConventions = false)]
|
||||||
public bool History{ get; set; }
|
public bool History{ get; set; }
|
||||||
|
|
||||||
|
[YamlMember(Alias = "history_lang", ApplyNamingConventions = false)]
|
||||||
|
public string? HistoryLang{ get; set; }
|
||||||
|
|
||||||
[YamlMember(Alias = "sonarr_properties", ApplyNamingConventions = false)]
|
[YamlMember(Alias = "sonarr_properties", ApplyNamingConventions = false)]
|
||||||
public SonarrProperties? SonarrProperties{ get; set; }
|
public SonarrProperties? SonarrProperties{ get; set; }
|
||||||
|
|
||||||
|
|
|
@ -147,6 +147,8 @@ public class HistorySeries : INotifyPropertyChanged{
|
||||||
await Crunchyroll.Instance.CrHistory.UpdateSeries(SeriesId, seasonId);
|
await Crunchyroll.Instance.CrHistory.UpdateSeries(SeriesId, seasonId);
|
||||||
FetchingData = false;
|
FetchingData = false;
|
||||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(FetchingData)));
|
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(FetchingData)));
|
||||||
|
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SeriesTitle)));
|
||||||
|
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SeriesDescription)));
|
||||||
Crunchyroll.Instance.CrHistory.MatchHistoryEpisodesWithSonarr(false, this);
|
Crunchyroll.Instance.CrHistory.MatchHistoryEpisodesWithSonarr(false, this);
|
||||||
UpdateNewEpisodes();
|
UpdateNewEpisodes();
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,7 +91,7 @@ public partial class AddDownloadPageViewModel : ViewModelBase{
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currentSeriesList != null){
|
if (currentSeriesList != null){
|
||||||
Crunchyroll.Instance.AddSeriesToQueue(currentSeriesList.Value, new CrunchyMultiDownload(Crunchyroll.Instance.CrunOptions.DubLang, AddAllEpisodes, false, selectedEpisodes));
|
await Crunchyroll.Instance.AddSeriesToQueue(currentSeriesList.Value, new CrunchyMultiDownload(Crunchyroll.Instance.CrunOptions.DubLang, AddAllEpisodes, false, selectedEpisodes));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -119,7 +119,7 @@ public partial class AddDownloadPageViewModel : ViewModelBase{
|
||||||
if (match.Success){
|
if (match.Success){
|
||||||
var locale = match.Groups[1].Value; // Capture the locale part
|
var locale = match.Groups[1].Value; // Capture the locale part
|
||||||
var id = match.Groups[2].Value; // Capture the ID part
|
var id = match.Groups[2].Value; // Capture the ID part
|
||||||
Crunchyroll.Instance.AddEpisodeToQue(id, locale, Crunchyroll.Instance.CrunOptions.DubLang);
|
Crunchyroll.Instance.AddEpisodeToQue(id, Languages.Locale2language(locale).CrLocale, Crunchyroll.Instance.CrunOptions.DubLang);
|
||||||
UrlInput = "";
|
UrlInput = "";
|
||||||
selectedEpisodes.Clear();
|
selectedEpisodes.Clear();
|
||||||
SelectedItems.Clear();
|
SelectedItems.Clear();
|
||||||
|
@ -142,7 +142,7 @@ public partial class AddDownloadPageViewModel : ViewModelBase{
|
||||||
|
|
||||||
ButtonEnabled = false;
|
ButtonEnabled = false;
|
||||||
ShowLoading = true;
|
ShowLoading = true;
|
||||||
var list = await Crunchyroll.Instance.CrSeries.ListSeriesId(id, "", new CrunchyMultiDownload(Crunchyroll.Instance.CrunOptions.DubLang, true));
|
var list = await Crunchyroll.Instance.CrSeries.ListSeriesId(id, Languages.Locale2language(locale).CrLocale, new CrunchyMultiDownload(Crunchyroll.Instance.CrunOptions.DubLang, true));
|
||||||
ShowLoading = false;
|
ShowLoading = false;
|
||||||
if (list != null){
|
if (list != null){
|
||||||
currentSeriesList = list;
|
currentSeriesList = list;
|
||||||
|
|
|
@ -79,7 +79,7 @@ public partial class SeriesPageViewModel : ViewModelBase{
|
||||||
public async Task UpdateData(string? season){
|
public async Task UpdateData(string? season){
|
||||||
await SelectedSeries.FetchData(season);
|
await SelectedSeries.FetchData(season);
|
||||||
|
|
||||||
MessageBus.Current.SendMessage(new NavigationMessage(typeof(SeriesPageViewModel), false, true));
|
// MessageBus.Current.SendMessage(new NavigationMessage(typeof(SeriesPageViewModel), false, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
[RelayCommand]
|
[RelayCommand]
|
||||||
|
|
|
@ -94,6 +94,13 @@ public partial class SettingsPageViewModel : ViewModelBase{
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
private ComboBoxItem _selectedHSLang;
|
private ComboBoxItem _selectedHSLang;
|
||||||
|
|
||||||
|
[ObservableProperty]
|
||||||
|
private ComboBoxItem _selectedHistoryLang;
|
||||||
|
|
||||||
|
[ObservableProperty]
|
||||||
|
private ComboBoxItem _selectedDescriptionLang;
|
||||||
|
|
||||||
|
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
private string _selectedDubs = "ja-JP";
|
private string _selectedDubs = "ja-JP";
|
||||||
|
|
||||||
|
@ -228,6 +235,36 @@ public partial class SettingsPageViewModel : ViewModelBase{
|
||||||
new ComboBoxItem(){ Content = "none" },
|
new ComboBoxItem(){ Content = "none" },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
public ObservableCollection<ComboBoxItem> HistoryLangList{ get; } = new(){
|
||||||
|
new ComboBoxItem(){ Content = "default" },
|
||||||
|
new ComboBoxItem(){ Content = "de-DE" },
|
||||||
|
new ComboBoxItem(){ Content = "en-US" },
|
||||||
|
new ComboBoxItem(){ Content = "es-419" },
|
||||||
|
new ComboBoxItem(){ Content = "es-ES" },
|
||||||
|
new ComboBoxItem(){ Content = "fr-FR" },
|
||||||
|
new ComboBoxItem(){ Content = "it-IT" },
|
||||||
|
new ComboBoxItem(){ Content = "pt-BR" },
|
||||||
|
new ComboBoxItem(){ Content = "pt-PT" },
|
||||||
|
new ComboBoxItem(){ Content = "ru-RU" },
|
||||||
|
new ComboBoxItem(){ Content = "hi-IN" },
|
||||||
|
new ComboBoxItem(){ Content = "ar-SA" },
|
||||||
|
};
|
||||||
|
|
||||||
|
public ObservableCollection<ComboBoxItem> DescriptionLangList{ get; } = new(){
|
||||||
|
new ComboBoxItem(){ Content = "default" },
|
||||||
|
new ComboBoxItem(){ Content = "de-DE" },
|
||||||
|
new ComboBoxItem(){ Content = "en-US" },
|
||||||
|
new ComboBoxItem(){ Content = "es-419" },
|
||||||
|
new ComboBoxItem(){ Content = "es-ES" },
|
||||||
|
new ComboBoxItem(){ Content = "fr-FR" },
|
||||||
|
new ComboBoxItem(){ Content = "it-IT" },
|
||||||
|
new ComboBoxItem(){ Content = "pt-BR" },
|
||||||
|
new ComboBoxItem(){ Content = "pt-PT" },
|
||||||
|
new ComboBoxItem(){ Content = "ru-RU" },
|
||||||
|
new ComboBoxItem(){ Content = "hi-IN" },
|
||||||
|
new ComboBoxItem(){ Content = "ar-SA" },
|
||||||
|
};
|
||||||
|
|
||||||
public ObservableCollection<ComboBoxItem> DubLangList{ get; } = new(){
|
public ObservableCollection<ComboBoxItem> DubLangList{ get; } = new(){
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -287,6 +324,12 @@ public partial class SettingsPageViewModel : ViewModelBase{
|
||||||
|
|
||||||
DownloadDirPath = string.IsNullOrEmpty(options.DownloadDirPath) ? CfgManager.PathVIDEOS_DIR : options.DownloadDirPath;
|
DownloadDirPath = string.IsNullOrEmpty(options.DownloadDirPath) ? CfgManager.PathVIDEOS_DIR : options.DownloadDirPath;
|
||||||
|
|
||||||
|
ComboBoxItem? descriptionLang = DescriptionLangList.FirstOrDefault(a => a.Content != null && (string)a.Content == options.DescriptionLang) ?? null;
|
||||||
|
SelectedDescriptionLang = descriptionLang ?? DescriptionLangList[0];
|
||||||
|
|
||||||
|
ComboBoxItem? historyLang = HistoryLangList.FirstOrDefault(a => a.Content != null && (string)a.Content == options.HistoryLang) ?? null;
|
||||||
|
SelectedHistoryLang = historyLang ?? HistoryLangList[0];
|
||||||
|
|
||||||
ComboBoxItem? hsLang = HardSubLangList.FirstOrDefault(a => a.Content != null && (string)a.Content == options.Hslang) ?? null;
|
ComboBoxItem? hsLang = HardSubLangList.FirstOrDefault(a => a.Content != null && (string)a.Content == options.Hslang) ?? null;
|
||||||
SelectedHSLang = hsLang ?? HardSubLangList[0];
|
SelectedHSLang = hsLang ?? HardSubLangList[0];
|
||||||
|
|
||||||
|
@ -408,6 +451,14 @@ public partial class SettingsPageViewModel : ViewModelBase{
|
||||||
|
|
||||||
Crunchyroll.Instance.CrunOptions.DlSubs = softSubs;
|
Crunchyroll.Instance.CrunOptions.DlSubs = softSubs;
|
||||||
|
|
||||||
|
string descLang = SelectedDescriptionLang.Content + "";
|
||||||
|
|
||||||
|
Crunchyroll.Instance.CrunOptions.DescriptionLang = descLang != "default" ? descLang : "";
|
||||||
|
|
||||||
|
string historyLang = SelectedHistoryLang.Content + "";
|
||||||
|
|
||||||
|
Crunchyroll.Instance.CrunOptions.HistoryLang = historyLang != "default" ? historyLang : "";
|
||||||
|
|
||||||
string hslang = SelectedHSLang.Content + "";
|
string hslang = SelectedHSLang.Content + "";
|
||||||
|
|
||||||
Crunchyroll.Instance.CrunOptions.Hslang = hslang != "none" ? Languages.FindLang(hslang).Locale : hslang;
|
Crunchyroll.Instance.CrunOptions.Hslang = hslang != "none" ? Languages.FindLang(hslang).Locale : hslang;
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
x:Class="CRD.Views.SeriesPageView">
|
x:Class="CRD.Views.SeriesPageView">
|
||||||
|
|
||||||
|
<Grid>
|
||||||
<Grid Margin="10">
|
<Grid Margin="10">
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="Auto" />
|
<RowDefinition Height="Auto" />
|
||||||
|
@ -217,8 +218,12 @@
|
||||||
</ItemsControl.ItemTemplate>
|
</ItemsControl.ItemTemplate>
|
||||||
</ItemsControl>
|
</ItemsControl>
|
||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
|
|
||||||
|
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
|
<Grid IsVisible="{Binding SelectedSeries.FetchingData}"
|
||||||
|
Background="#90000000"
|
||||||
|
HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
|
||||||
|
<controls:ProgressRing Width="100" Height="100" HorizontalAlignment="Center" VerticalAlignment="Center" />
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
</UserControl>
|
</UserControl>
|
|
@ -135,6 +135,15 @@
|
||||||
<CheckBox IsChecked="{Binding History}"> </CheckBox>
|
<CheckBox IsChecked="{Binding History}"> </CheckBox>
|
||||||
</controls:SettingsExpander.Footer>
|
</controls:SettingsExpander.Footer>
|
||||||
|
|
||||||
|
<controls:SettingsExpanderItem Content="History Language" Description="Use the same language as Sonarr if you plan to connect it to this downloader">
|
||||||
|
<controls:SettingsExpanderItem.Footer>
|
||||||
|
<ComboBox HorizontalContentAlignment="Center" MinWidth="210" MaxDropDownHeight="400"
|
||||||
|
ItemsSource="{Binding HistoryLangList}"
|
||||||
|
SelectedItem="{Binding SelectedHistoryLang}">
|
||||||
|
</ComboBox>
|
||||||
|
</controls:SettingsExpanderItem.Footer>
|
||||||
|
</controls:SettingsExpanderItem>
|
||||||
|
|
||||||
</controls:SettingsExpander>
|
</controls:SettingsExpander>
|
||||||
|
|
||||||
<controls:SettingsExpander Header="Download Settings"
|
<controls:SettingsExpander Header="Download Settings"
|
||||||
|
@ -304,6 +313,15 @@
|
||||||
</controls:SettingsExpanderItem.Footer>
|
</controls:SettingsExpanderItem.Footer>
|
||||||
</controls:SettingsExpanderItem>
|
</controls:SettingsExpanderItem>
|
||||||
|
|
||||||
|
<controls:SettingsExpanderItem Content="Episode description Language" >
|
||||||
|
<controls:SettingsExpanderItem.Footer>
|
||||||
|
<ComboBox HorizontalContentAlignment="Center" MinWidth="210" MaxDropDownHeight="400"
|
||||||
|
ItemsSource="{Binding DescriptionLangList}"
|
||||||
|
SelectedItem="{Binding SelectedDescriptionLang}">
|
||||||
|
</ComboBox>
|
||||||
|
</controls:SettingsExpanderItem.Footer>
|
||||||
|
</controls:SettingsExpanderItem>
|
||||||
|
|
||||||
|
|
||||||
<controls:SettingsExpanderItem Content="Additional MKVMerge Options">
|
<controls:SettingsExpanderItem Content="Additional MKVMerge Options">
|
||||||
<controls:SettingsExpanderItem.Footer>
|
<controls:SettingsExpanderItem.Footer>
|
||||||
|
|
Loading…
Reference in New Issue