public static string GetLanguageFromFilename(string path) { // sub format of filename.eng.srt int lastSeparator = path.Trim(new [] { Path.PathSeparator, Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar }).LastIndexOfAny(new[] { Path.PathSeparator, Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar }); string filename = path.Substring(lastSeparator + 1); string[] parts = filename.Split('.'); // if there aren't 3 parts, then it's not in the format for this to work if (parts.Length < 3) { return(null); } // length - 1 is last, so - 2 is second to last string lang = parts[parts.Length - 2]; switch (lang.Length) { case 2: return(lang); case 3: return(MediaInfoUtils.GetLanguageFromCode(lang) ?? lang); default: return(MediaInfoUtils.GetLanguageFromName(lang) ?? lang); } }
public List <TextStream> GetStreams(FileInfo file) { List <TextStream> streams = new List <TextStream>(); var language = SubtitleHelper.GetLanguageFromFilename(file.Name); MediaContainer m = MediaInfo.GetMediaInfo(file.FullName); List <TextStream> tStreams = m?.TextStreams; if (tStreams == null || tStreams.Count <= 0) { return(streams); } tStreams.ForEach(a => { a.External = true; a.Filename = file.Name; if (language == null) { return; } a.Language = language; Tuple <string, string> mapping = MediaInfoUtils.GetLanguageMapping(language); if (mapping == null) { return; } a.LanguageCode = mapping.Item1; a.LanguageName = mapping.Item2; }); streams.AddRange(tStreams); return(streams); }
public static string GetResolution(SVR_VideoLocal videoLocal, SVR_AniDB_File aniFile = null) { if (aniFile == null) { aniFile = videoLocal?.GetAniDBFile(); } return(MediaInfoUtils.GetStandardResolution(GetResolutionInternal(videoLocal, aniFile))); }
public static string GetResolution(string res) { if (string.IsNullOrEmpty(res)) { return(null); } string[] parts = res.Split('x'); if (parts.Length != 2) { return(null); } if (!int.TryParse(parts[0], out int width)) { return(null); } if (!int.TryParse(parts[1], out int height)) { return(null); } return(MediaInfoUtils.GetStandardResolution(new Tuple <int, int>(width, height))); }
public static List <TextStream> GetSubtitleStreams(SVR_VideoLocal_Place vplace) { List <TextStream> ls = new VobSubSubtitles().GetStreams(vplace); ls.AddRange(new TextSubtitles().GetStreams(vplace)); ls.ForEach(a => { a.External = true; string lang = GetLanguageFromFilename(vplace.FilePath); if (lang == null) { return; } a.Language = lang; Tuple <string, string> mapping = MediaInfoUtils.GetLanguageMapping(lang); if (mapping == null) { return; } a.LanguageCode = mapping.Item1; a.LanguageName = mapping.Item2; }); return(ls); }
public static MediaContainer GetMediaInfo_New(string filename) { try { string exe = GetMediaInfoPathForOS(); string args = $"--OUTPUT=JSON \"{filename}\""; var pProcess = GetProcess(exe, args); pProcess.Start(); string output = pProcess.StandardOutput.ReadToEnd().Trim(); //Wait for process to finish pProcess.WaitForExit(); if (pProcess.ExitCode != 0 || !output.StartsWith("{")) { // We have an error if (string.IsNullOrWhiteSpace(output) || output.EqualsInvariantIgnoreCase("null")) { output = pProcess.StandardError.ReadToEnd().Trim(); } if (string.IsNullOrWhiteSpace(output) || output.EqualsInvariantIgnoreCase("null")) { output = "No message"; } logger.Error($"MediaInfo threw an error on {filename}: {output}"); return(null); } var settings = new JsonSerializerSettings { Converters = new JsonConverter[] { new StreamJsonConverter(), new BooleanConverter(), new StringEnumConverter(), new DateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" }, new MultiIntConverter() }, Error = (s, e) => { logger.Error(e.ErrorContext.Error); e.ErrorContext.Handled = true; } }; // assuming json, as it starts with { MediaContainer m = JsonConvert.DeserializeObject <MediaContainer>(output, settings); m.media.track.ForEach(a => { // Stream should never be null, but here we are if (string.IsNullOrEmpty(a?.Language)) { return; } Tuple <string, string> langs = MediaInfoUtils.GetLanguageMapping(a.Language); if (langs == null) { logger.Error($"{filename} had a missing language code: {a.Language}"); return; } a.LanguageCode = langs.Item1; a.LanguageName = langs.Item2; }); return(m); } catch (Exception e) { logger.Error($"MediaInfo threw an error on {filename}: {e}"); return(null); } }
private static bool CheckResolution(SVR_VideoLocal videoLocal, SVR_AniDB_File aniFile) { Tuple <int, int> resTuple = GetResolutionInternal(videoLocal, aniFile); string res = MediaInfoUtils.GetStandardResolution(resTuple); if (res == null) { return(true); } int resArea = resTuple.Item1 * resTuple.Item2; FileQualityFilterOperationType operationType = Settings.RequiredResolutions.Operator; switch (operationType) { case FileQualityFilterOperationType.EQUALS: return(res.Equals(Settings.RequiredResolutions.Value.FirstOrDefault())); case FileQualityFilterOperationType.GREATER_EQ: List <int> keysGT = MediaInfoUtils.ResolutionArea.Keys.Where(a => resArea >= a).ToList(); keysGT.AddRange(MediaInfoUtils.ResolutionArea43.Keys.Where(a => resArea >= a)); List <string> valuesGT = new List <string>(); foreach (int key in keysGT) { if (MediaInfoUtils.ResolutionArea.ContainsKey(key)) { valuesGT.Add(MediaInfoUtils.ResolutionArea[key]); } if (MediaInfoUtils.ResolutionArea43.ContainsKey(key)) { valuesGT.Add(MediaInfoUtils.ResolutionArea43[key]); } } if (valuesGT.FindInEnumerable(Settings.RequiredResolutions.Value)) { return(true); } break; case FileQualityFilterOperationType.LESS_EQ: List <int> keysLT = MediaInfoUtils.ResolutionArea.Keys.Where(a => resArea <= a).ToList(); keysLT.AddRange(MediaInfoUtils.ResolutionArea43.Keys.Where(a => resArea <= a)); List <string> valuesLT = new List <string>(); foreach (int key in keysLT) { if (MediaInfoUtils.ResolutionArea.ContainsKey(key)) { valuesLT.Add(MediaInfoUtils.ResolutionArea[key]); } if (MediaInfoUtils.ResolutionArea43.ContainsKey(key)) { valuesLT.Add(MediaInfoUtils.ResolutionArea43[key]); } } if (valuesLT.FindInEnumerable(Settings.RequiredResolutions.Value)) { return(true); } break; case FileQualityFilterOperationType.IN: return(Settings.RequiredResolutions.Value.Contains(res)); case FileQualityFilterOperationType.NOTIN: return(!Settings.RequiredResolutions.Value.Contains(res)); } return(false); }