Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
 public static string GetResolution(SVR_VideoLocal videoLocal, SVR_AniDB_File aniFile = null)
 {
     if (aniFile == null)
     {
         aniFile = videoLocal?.GetAniDBFile();
     }
     return(MediaInfoUtils.GetStandardResolution(GetResolutionInternal(videoLocal, aniFile)));
 }
Ejemplo n.º 4
0
 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)));
 }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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);
            }
        }
Ejemplo n.º 7
0
        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);
        }