Adds a season-agnostic fallback to subtitle-episode matching so dropped subtitle files no longer need a full SxxEyy code to be attached to the right video. Recognises bare numbers (06, 6, 16), explicit markers without a season (E06, EP06, Episode 06), and numbers cleanly delimited by separators, including the common anime release style 'Show - 06 - Title'. Guards against false positives from resolutions (1080p), years, and decimal-looking audio tags (DD5.1) by requiring clean separator boundaries and capping bare numbers at a few digits. Full season+episode codes still take priority and match exactly as before; the new bare-number matching only kicks in when one side of the match lacks season info. Note: dotnet is not reachable in this environment, so the required Release build validation could not be run before this commit.
60 lines
2.1 KiB
C#
60 lines
2.1 KiB
C#
using System.ComponentModel;
|
|
using System.IO;
|
|
using System.Runtime.CompilerServices;
|
|
|
|
namespace Futonizer.Models;
|
|
|
|
/// <summary>
|
|
/// Represents one external subtitle file that was drag-and-dropped in and
|
|
/// matched to a <see cref="QueuedFileItem"/> by episode (e.g. "S04E06", or
|
|
/// just a bare episode number like "06"), to be muxed in as an additional
|
|
/// subtitle track when the file is processed.
|
|
/// </summary>
|
|
public class ExternalSubtitleTrack : INotifyPropertyChanged
|
|
{
|
|
private bool _isDefault;
|
|
|
|
public string FilePath { get; }
|
|
public string FileName => Path.GetFileName(FilePath);
|
|
|
|
/// <summary>Uppercased extension without the dot, e.g. "SRT", "ASS", "SUP".</summary>
|
|
public string FormatDisplay => Path.GetExtension(FilePath).TrimStart('.').ToUpperInvariant();
|
|
|
|
/// <summary>ISO 639-2 language code detected from the filename, or "und" if unknown.</summary>
|
|
public string Language { get; init; } = "und";
|
|
|
|
/// <summary>Track name to embed in the output file; may be empty.</summary>
|
|
public string TrackName { get; init; } = string.Empty;
|
|
|
|
public bool Forced { get; init; }
|
|
public bool HearingImpaired { get; init; }
|
|
|
|
/// <summary>
|
|
/// Whether this is the subtitle track flagged default in the output.
|
|
/// Exactly one external subtitle per file should have this set at a time.
|
|
/// </summary>
|
|
public bool IsDefault
|
|
{
|
|
get => _isDefault;
|
|
set
|
|
{
|
|
if (_isDefault == value) return;
|
|
_isDefault = value;
|
|
OnPropertyChanged();
|
|
}
|
|
}
|
|
|
|
/// <summary>Short "FORMAT · LANG" label shown as a chip in the UI.</summary>
|
|
public string LanguageDisplay => $"{FormatDisplay} · {(string.Equals(Language, "und", StringComparison.OrdinalIgnoreCase) ? "UND" : Language.ToUpperInvariant())}";
|
|
|
|
public ExternalSubtitleTrack(string filePath)
|
|
{
|
|
FilePath = filePath;
|
|
}
|
|
|
|
public event PropertyChangedEventHandler? PropertyChanged;
|
|
|
|
private void OnPropertyChanged([CallerMemberName] string? name = null)
|
|
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
|
|
}
|