Skip to content

Commit

Permalink
Continue processing when update server is down
Browse files Browse the repository at this point in the history
  • Loading branch information
ptr727 committed Mar 26, 2023
1 parent 202909c commit 93ddbc1
Show file tree
Hide file tree
Showing 8 changed files with 40 additions and 61 deletions.
13 changes: 4 additions & 9 deletions PlexCleaner/MediaInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,30 +76,25 @@ public static bool GetMediaInfo(FileInfo fileInfo, MediaTool.ToolType parser, ou
}
public void RemoveCoverArt()
{
// Video tracks only
// No video tracks nothing to do
if (Video.Count == 0)
{
return;
}

// TODO: Find a more deterministic way to identify cover art and thumbnail clips
// Some media includes a thumbnail preview and main video tracks
// Some media includes static cover art

// Find all tracks with cover art
var coverArtTracks = Video.FindAll(item => TrackInfo.MatchCoverArt(item.Codec));
var coverArtTracks = Video.FindAll(item => item.MatchCoverArt());

// Are all tracks cover art
if (Video.Count == coverArtTracks.Count)
{
Log.Logger.Error("All video tracks are cover art");
return;
Log.Logger.Error("All video tracks are cover art : {Parser}", Parser);
}

// Remove all cover art tracks
foreach (var item in coverArtTracks)
{
Log.Logger.Warning("Ignoring cover art video track : {Codec}", item.Codec);
Log.Logger.Warning("Ignoring cover art video track : {Parser}:{Format}:{Codec}", Parser, item.Format, item.Codec);
Video.Remove(item);
}
}
Expand Down
5 changes: 3 additions & 2 deletions PlexCleaner/Process.cs
Original file line number Diff line number Diff line change
Expand Up @@ -386,7 +386,8 @@ private static bool ProcessFile(string fileName, out bool modified, out SidecarF
break;
}

// TODO: RemoveUnwantedLanguageTracks() and RemoveDuplicateTracks() both remux, are logically separate, but could be combined
// TODO: RemoveUnwantedLanguageTracks() and RemoveDuplicateTracks() both remux, are logically separate,
// but could be combined to complete in one remux operation

// Remove all the duplicate tracks
if (!processFile.RemoveDuplicateTracks(ref modified) ||
Expand All @@ -405,7 +406,7 @@ private static bool ProcessFile(string fileName, out bool modified, out SidecarF
}

// Verify media streams, and repair if possible
// Save the state but do not break yet, if file was modified cleanup could still happen
// Save the state but do not break yet, if file was modified further cleanup could still be required
bool verified = processFile.Verify(ref modified);
if (Program.IsCancelled())
{
Expand Down
26 changes: 15 additions & 11 deletions PlexCleaner/ProcessFile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -963,7 +963,7 @@ public bool Verify(ref bool modified)
return true;
}

// Conditional
// Conditional verify metadata
if (!ShouldVerify(Process.Tasks.VerifyMetadata))
{
// Skip
Expand All @@ -987,7 +987,7 @@ public bool Verify(ref bool modified)
// Warn if audio or video tracks are missing
if (MediaInfoInfo.Video.Count == 0 || MediaInfoInfo.Audio.Count == 0)
{
Log.Logger.Warning("File missing audio ({Audio}) or video ({Video}) track : {FileName}", MediaInfoInfo.Audio.Count, MediaInfoInfo.Video.Count, FileInfo.Name);
Log.Logger.Warning("File missing audio or video tracks : Audio: {Audio}, Video: {Video} : {FileName}", MediaInfoInfo.Audio.Count, MediaInfoInfo.Video.Count, FileInfo.Name);
MediaInfoInfo.WriteLine("Missing");

// Warning only, continue
Expand All @@ -996,7 +996,7 @@ public bool Verify(ref bool modified)
// Warn if more than one video track
if (MediaInfoInfo.Video.Count > 1)
{
Log.Logger.Warning("File has more than one video ({Video}) track : {FileName}", MediaInfoInfo.Video.Count, FileInfo.Name);
Log.Logger.Warning("File has more than one video track : Video: {Video} : {FileName}", MediaInfoInfo.Video.Count, FileInfo.Name);
MediaInfoInfo.WriteLine("Extra");

// Warning only, continue
Expand Down Expand Up @@ -1571,9 +1571,9 @@ public bool GetBitrateInfo(out BitrateInfo bitrateInfo)

// Use the default track, else the first track
var videoInfo = FfProbeInfo.Video.Find(item => item.Flags.HasFlag(TrackInfo.FlagsType.Default));
videoInfo ??= FfProbeInfo.Video.First();
videoInfo ??= FfProbeInfo.Video.FirstOrDefault();
var audioInfo = FfProbeInfo.Audio.Find(item => item.Flags.HasFlag(TrackInfo.FlagsType.Default));
audioInfo ??= FfProbeInfo.Audio.First();
audioInfo ??= FfProbeInfo.Audio.FirstOrDefault();

// Compute bitrate from packets
bitrateInfo = new BitrateInfo();
Expand Down Expand Up @@ -1649,9 +1649,13 @@ public SelectMediaInfo FindNeedReEncode()
if (selectMediaInfo.Selected.Audio.Count > 0 &&
selectMediaInfo.Selected.Video.Count == 0)
{
// If the video is not H264 or H265 (by experimentation), then tag the video to also be reencoded
var reEncodevideo = selectMediaInfo.Selected.Video.FindAll(item => !ReEncodeVideoOnAudioReEncode.Contains(item.Codec));
selectMediaInfo.Move(reEncodevideo, true);
// If the video is not H264, H265 or AV1 (by experimentation), then tag the video to also be reencoded
var reEncodeVideo = selectMediaInfo.NotSelected.Video.FindAll(item => !ReEncodeVideoOnAudioReEncode.Contains(item.Format, StringComparer.OrdinalIgnoreCase));
if (reEncodeVideo.Count > 0)
{
selectMediaInfo.Move(reEncodeVideo, true);
Log.Logger.Warning("Including incompatible Video track for Audio only ReEncoding");
}
}

// Selected is ReEncode
Expand Down Expand Up @@ -1729,7 +1733,7 @@ public SelectMediaInfo FindUnwantedLanguageTracks()
// Use the first track
var videoInfo = MkvMergeInfo.Video.First();
selectMediaInfo.Move(videoInfo, true);
Log.Logger.Warning("No video track matching requested language : {Available} not in {Languages}, Selecting {Selected}", Language.GetLanguageList(MkvMergeInfo.Video), Program.Config.ProcessOptions.KeepLanguages, videoInfo.LanguageIetf);
Log.Logger.Warning("No video track matching requested language : {Available} not in {Languages}, selecting {Selected}", Language.GetLanguageList(MkvMergeInfo.Video), Program.Config.ProcessOptions.KeepLanguages, videoInfo.LanguageIetf);
}

// Keep at least one audio track if any
Expand All @@ -1738,7 +1742,7 @@ public SelectMediaInfo FindUnwantedLanguageTracks()
// Use the preferred audio codec track from the unselected tracks
var audioInfo = FindPreferredAudio(selectMediaInfo.NotSelected.Audio);
selectMediaInfo.Move(audioInfo, true);
Log.Logger.Warning("No audio track matching requested language : {Available} not in {Languages}, Selecting {Selected}", Language.GetLanguageList(MkvMergeInfo.Audio), Program.Config.ProcessOptions.KeepLanguages, audioInfo.LanguageIetf);
Log.Logger.Warning("No audio track matching requested language : {Available} not in {Languages}, selecting {Selected}", Language.GetLanguageList(MkvMergeInfo.Audio), Program.Config.ProcessOptions.KeepLanguages, audioInfo.LanguageIetf);
}

// No language matching subtitle tracks
Expand Down Expand Up @@ -1792,5 +1796,5 @@ static AudioInfo FindPreferredAudio(IEnumerable<TrackInfo> trackInfoList)

private const int RefreshWaitTime = 5;
private static readonly string[] Hdr10Format = { "SMPTE ST 2086", "SMPTE ST 2094" };
private static readonly string[] ReEncodeVideoOnAudioReEncode = { "h264", "hevc" };
private static readonly string[] ReEncodeVideoOnAudioReEncode = { "h264", "hevc", "av1" };
}
3 changes: 2 additions & 1 deletion PlexCleaner/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -423,7 +423,8 @@ private static Program Create(CommandLineOptions options, bool verifyTools)
if (Config.ToolsOptions.AutoUpdate &&
!Tools.CheckForNewTools())
{
return null;
// Ignore error, do not stop execution in case of e.g. a site being down
Log.Logger.Error("Checking for new tools failed, continuing with existing tools.");
}

// Verify tools
Expand Down
27 changes: 0 additions & 27 deletions PlexCleaner/SelectMediaInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,11 +69,6 @@ public void Add(IEnumerable<TrackInfo> trackList, bool select)
}
}

public void Add(TrackInfo trackInfo, Func<TrackInfo, bool> selectFunc)
{
Add(trackInfo, selectFunc(trackInfo));
}

public void Add(TrackInfo trackInfo, bool select)
{
switch (trackInfo)
Expand All @@ -92,23 +87,6 @@ public void Add(TrackInfo trackInfo, bool select)
}
}

public void Move(MediaInfo mediaInfo, bool select)
{
Debug.Assert(mediaInfo.Parser == Selected.Parser);
Debug.Assert(mediaInfo.Parser == NotSelected.Parser);
Move(mediaInfo.Video, select);
Move(mediaInfo.Audio, select);
Move(mediaInfo.Subtitle, select);
}

public void Move(IEnumerable<TrackInfo> trackList, Func<TrackInfo, bool> selectFunc)
{
foreach (var trackInfo in trackList)
{
Move(trackInfo, selectFunc(trackInfo));
}
}

public void Move(IEnumerable<TrackInfo> trackList, bool select)
{
foreach (var trackInfo in trackList)
Expand All @@ -117,11 +95,6 @@ public void Move(IEnumerable<TrackInfo> trackList, bool select)
}
}

public void Move(TrackInfo trackInfo, Func<TrackInfo, bool> selectFunc)
{
Move(trackInfo, selectFunc(trackInfo));
}

public void Move(TrackInfo trackInfo, bool select)
{
switch (trackInfo)
Expand Down
7 changes: 6 additions & 1 deletion PlexCleaner/TrackInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,11 @@ public static bool IsTagTitle(string title)
return !IsUsefulTrackTitle(title);
}

public bool MatchCoverArt()
{
return MatchCoverArt(Codec) || MatchCoverArt(Format);
}

public static bool MatchCoverArt(string codec)
{
return CoverArtFormat.Any(cover => codec.Contains(cover, StringComparison.OrdinalIgnoreCase));
Expand All @@ -316,7 +321,7 @@ public static bool MatchCoverArt(string codec)
private static partial Regex TrackRegex();

// Cover art and thumbnail formats
private static readonly string[] CoverArtFormat = { "jpg", "jpeg", "mjpeg", "png" };
private static readonly string[] CoverArtFormat = { "jpg", "jpeg", "png" };
// Not so useful track titles
private static readonly string[] UsefulTitles = { "SDH", "Commentary", "Forced" };
}
12 changes: 6 additions & 6 deletions PlexCleaner/VideoInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ internal VideoInfo(MkvToolJsonSchema.Track track) : base(track)
// Missing: ClosedCaptions

// Cover art
if (MatchCoverArt(Codec))
if (MatchCoverArt())
{
Log.Logger.Warning("MkvToolJsonSchema : Cover art video track : {Codec}", Codec);
Log.Logger.Warning("MkvToolJsonSchema : Cover art video track : {Format}:{Codec}", Format, Codec);
}
}

Expand Down Expand Up @@ -59,9 +59,9 @@ internal VideoInfo(FfMpegToolJsonSchema.Stream stream) : base(stream)
// Missing: HDR

// Cover art
if (MatchCoverArt(Codec))
if (MatchCoverArt())
{
Log.Logger.Warning("FfMpegToolJsonSchema : Cover art video track : {Codec}", Codec);
Log.Logger.Warning("FfMpegToolJsonSchema : Cover art video track : {Format}:{Codec}", Format, Codec);
}
}

Expand Down Expand Up @@ -89,9 +89,9 @@ internal VideoInfo(MediaInfoToolXmlSchema.Track track) : base(track)
// Missing: ClosedCaptions

// Cover art
if (MatchCoverArt(Codec))
if (MatchCoverArt())
{
Log.Logger.Warning("MediaInfoToolXmlSchema : Cover art video track : {Codec}", Codec);
Log.Logger.Warning("MediaInfoToolXmlSchema : Cover art video track : {Format}:{Codec}", Format, Codec);
}
}

Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -462,13 +462,13 @@ Settings allows for custom configuration of:
Get encoder options:

- List all supported encoders: `ffmpeg -encoders`
- List options supported by an encoder: `ffmpeg -h encoder=libaom-av1`
- List options supported by an encoder: `ffmpeg -h encoder=libsvtav1`

Example video encoder options:

- [H.264](https://trac.ffmpeg.org/wiki/Encode/H.264): `libx264 -crf 22 -preset medium`
- [H.265](https://trac.ffmpeg.org/wiki/Encode/H.265): `libx265 -crf 26 -preset medium`
- [AV1](https://trac.ffmpeg.org/wiki/Encode/AV1): `libaom-av1 -crf 30`
- [AV1](https://trac.ffmpeg.org/wiki/Encode/AV1): `libsvtav1 -crf 30 -preset 5`

Example hardware assisted video encoding options:

Expand Down Expand Up @@ -497,13 +497,13 @@ Settings allows for custom configuration of:
Get encoder options:

- List all supported encoders: `HandBrakeCLI.exe --help`
- List presets supported by an encoder: `HandBrakeCLI --encoder-preset-list x264`
- List presets supported by an encoder: `HandBrakeCLI --encoder-preset-list svt_av1`

Example video encoder options:

- H.264: `x264 --quality 22 --encoder-preset medium`
- H.265: `x265 --quality 26 --encoder-preset medium`
- AV1: `svt_av1 --quality 30 --encoder-preset 8`
- AV1: `svt_av1 --quality 30 --encoder-preset 5`

Example hardware assisted video encoding options:

Expand Down

0 comments on commit 93ddbc1

Please sign in to comment.