Fix - Crash with multiple OVAs in series

Fix - FFMPEG error with chapters
This commit is contained in:
Elwador 2024-07-30 12:12:02 +02:00
parent 65deb5180d
commit 771ebfe074
3 changed files with 36 additions and 14 deletions

View File

@ -229,11 +229,18 @@ public class CrSeries(){
string newKey; string newKey;
if (isSpecial && !string.IsNullOrEmpty(item.Items[0].Episode)){ if (isSpecial && !string.IsNullOrEmpty(item.Items[0].Episode)){
newKey = item.Items[0].Episode ?? "SP" + (specialIndex + " " + item.Items[0].Id); newKey = $"SP{specialIndex}_" + item.Items[0].Episode ?? "SP" + (specialIndex + " " + item.Items[0].Id);
} else{ } else{
newKey = $"{(isSpecial ? "SP" : 'E')}{(isSpecial ? (specialIndex + " " + item.Items[0].Id) : epIndex + "")}"; newKey = $"{(isSpecial ? "SP" : 'E')}{(isSpecial ? (specialIndex + " " + item.Items[0].Id) : epIndex + "")}";
} }
int counter = 1;
string originalKey = newKey;
while (episodes.ContainsKey(newKey)){
newKey = originalKey + "_" + counter;
counter++;
}
episodes.Remove(key); episodes.Remove(key);
episodes.Add(newKey, item); episodes.Add(newKey, item);
@ -285,7 +292,7 @@ public class CrSeries(){
Season = Helpers.ExtractNumberAfterS(value.Items[0].Identifier) ?? value.Items[0].SeasonNumber.ToString(), Season = Helpers.ExtractNumberAfterS(value.Items[0].Identifier) ?? value.Items[0].SeasonNumber.ToString(),
SeriesTitle = Regex.Replace(value.Items[0].SeriesTitle, @"\(\w+ Dub\)", "").TrimEnd(), SeriesTitle = Regex.Replace(value.Items[0].SeriesTitle, @"\(\w+ Dub\)", "").TrimEnd(),
SeasonTitle = Regex.Replace(value.Items[0].SeasonTitle, @"\(\w+ Dub\)", "").TrimEnd(), SeasonTitle = Regex.Replace(value.Items[0].SeasonTitle, @"\(\w+ Dub\)", "").TrimEnd(),
EpisodeNum = value.Items[0].EpisodeNumber?.ToString() ?? value.Items[0].Episode ?? "?", EpisodeNum = key.StartsWith("SP") ? key : value.Items[0].EpisodeNumber?.ToString() ?? value.Items[0].Episode ?? "?",
Id = value.Items[0].SeasonId, Id = value.Items[0].SeasonId,
Img = images[images.Count / 2].FirstOrDefault().Source, Img = images[images.Count / 2].FirstOrDefault().Source,
Description = value.Items[0].Description, Description = value.Items[0].Description,

View File

@ -133,6 +133,7 @@ public class Helpers{
public static void ConvertChapterFileForFFMPEG(string chapterFilePath){ public static void ConvertChapterFileForFFMPEG(string chapterFilePath){
var chapterLines = File.ReadAllLines(chapterFilePath); var chapterLines = File.ReadAllLines(chapterFilePath);
var ffmpegChapterLines = new List<string>{ ";FFMETADATA1" }; var ffmpegChapterLines = new List<string>{ ";FFMETADATA1" };
var chapters = new List<(double StartTime, string Title)>();
for (int i = 0; i < chapterLines.Length; i += 2){ for (int i = 0; i < chapterLines.Length; i += 2){
var timeLine = chapterLines[i]; var timeLine = chapterLines[i];
@ -143,14 +144,28 @@ public class Helpers{
if (timeParts.Length == 2 && nameParts.Length == 2){ if (timeParts.Length == 2 && nameParts.Length == 2){
var startTime = TimeSpan.Parse(timeParts[1]).TotalMilliseconds; var startTime = TimeSpan.Parse(timeParts[1]).TotalMilliseconds;
var endTime = i + 2 < chapterLines.Length ? TimeSpan.Parse(chapterLines[i + 2].Split('=')[1]).TotalMilliseconds : startTime + 10000; var title = nameParts[1];
chapters.Add((startTime, title));
}
}
// Sort chapters by start time
chapters = chapters.OrderBy(c => c.StartTime).ToList();
for (int i = 0; i < chapters.Count; i++){
var startTime = chapters[i].StartTime;
var title = chapters[i].Title;
var endTime = (i + 1 < chapters.Count) ? chapters[i + 1].StartTime : startTime + 10000; // Add 10 seconds to the last chapter end time
if (endTime < startTime) {
endTime = startTime + 10000; // Correct end time if it is before start time
}
ffmpegChapterLines.Add("[CHAPTER]"); ffmpegChapterLines.Add("[CHAPTER]");
ffmpegChapterLines.Add("TIMEBASE=1/1000"); ffmpegChapterLines.Add("TIMEBASE=1/1000");
ffmpegChapterLines.Add($"START={startTime}"); ffmpegChapterLines.Add($"START={startTime}");
ffmpegChapterLines.Add($"END={endTime}"); ffmpegChapterLines.Add($"END={endTime}");
ffmpegChapterLines.Add($"title={nameParts[1]}"); ffmpegChapterLines.Add($"title={title}");
}
} }
File.WriteAllLines(chapterFilePath, ffmpegChapterLines); File.WriteAllLines(chapterFilePath, ffmpegChapterLines);

View File

@ -235,11 +235,11 @@ public partial class AddDownloadPageViewModel : ViewModelBase{
currentSeriesList = list; currentSeriesList = list;
foreach (var episode in currentSeriesList.Value.List){ foreach (var episode in currentSeriesList.Value.List){
if (episodesBySeason.ContainsKey("S" + episode.Season)){ if (episodesBySeason.ContainsKey("S" + episode.Season)){
episodesBySeason["S" + episode.Season].Add(new ItemModel(episode.Img, episode.Description, episode.Time, episode.Name, "S" + episode.Season, "E" + episode.EpisodeNum, episode.E, episodesBySeason["S" + episode.Season].Add(new ItemModel(episode.Img, episode.Description, episode.Time, episode.Name, "S" + episode.Season, episode.EpisodeNum.StartsWith("SP") ? episode.EpisodeNum : "E" + episode.EpisodeNum, episode.E,
episode.Lang)); episode.Lang));
} else{ } else{
episodesBySeason.Add("S" + episode.Season, new List<ItemModel>{ episodesBySeason.Add("S" + episode.Season, new List<ItemModel>{
new ItemModel(episode.Img, episode.Description, episode.Time, episode.Name, "S" + episode.Season, "E" + episode.EpisodeNum, episode.E, episode.Lang) new ItemModel(episode.Img, episode.Description, episode.Time, episode.Name, "S" + episode.Season, episode.EpisodeNum.StartsWith("SP") ? episode.EpisodeNum : "E" + episode.EpisodeNum, episode.E, episode.Lang)
}); });
SeasonList.Add(new ComboBoxItem{ Content = "S" + episode.Season }); SeasonList.Add(new ComboBoxItem{ Content = "S" + episode.Season });
} }
@ -346,11 +346,11 @@ public partial class AddDownloadPageViewModel : ViewModelBase{
currentSeriesList = list; currentSeriesList = list;
foreach (var episode in currentSeriesList.Value.List){ foreach (var episode in currentSeriesList.Value.List){
if (episodesBySeason.ContainsKey("S" + episode.Season)){ if (episodesBySeason.ContainsKey("S" + episode.Season)){
episodesBySeason["S" + episode.Season].Add(new ItemModel(episode.Img, episode.Description, episode.Time, episode.Name, "S" + episode.Season, "E" + episode.EpisodeNum, episode.E, episodesBySeason["S" + episode.Season].Add(new ItemModel(episode.Img, episode.Description, episode.Time, episode.Name, "S" + episode.Season, episode.EpisodeNum.StartsWith("SP") ? episode.EpisodeNum : "E" + episode.EpisodeNum, episode.E,
episode.Lang)); episode.Lang));
} else{ } else{
episodesBySeason.Add("S" + episode.Season, new List<ItemModel>{ episodesBySeason.Add("S" + episode.Season, new List<ItemModel>{
new(episode.Img, episode.Description, episode.Time, episode.Name, "S" + episode.Season, "E" + episode.EpisodeNum, episode.E, episode.Lang) new(episode.Img, episode.Description, episode.Time, episode.Name, "S" + episode.Season, episode.EpisodeNum.StartsWith("SP") ? episode.EpisodeNum : "E" + episode.EpisodeNum, episode.E, episode.Lang)
}); });
SeasonList.Add(new ComboBoxItem{ Content = "S" + episode.Season }); SeasonList.Add(new ComboBoxItem{ Content = "S" + episode.Season });
} }