Пример #1
0
        public void Prepare(string path, ContextObject context)
        {
            _context = context;

            try
            {
                _mediaInfo = new MediaInfo.MediaInfo(Path.Combine(
                                                         Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
                                                         Environment.Is64BitProcess ? "MediaInfo-x64\\" : "MediaInfo-x86\\"));
                _mediaInfo.Option("Cover_Data", "base64");

                _mediaInfo.Open(path);
            }
            catch (Exception)
            {
                _mediaInfo?.Dispose();
                _mediaInfo = null;
            }

            context.TitlebarOverlap = true;

            if (_mediaInfo == null ||
                !string.IsNullOrWhiteSpace(_mediaInfo.Get(StreamKind.General, 0, "VideoCount"))) // video
            {
                int.TryParse(_mediaInfo?.Get(StreamKind.Video, 0, "Width"), out var width);
                int.TryParse(_mediaInfo?.Get(StreamKind.Video, 0, "Height"), out var height);
                double.TryParse(_mediaInfo?.Get(StreamKind.Video, 0, "Rotation"), out var rotation);
                // Correct rotation: on some machine the value "90" becomes "90000" by some reason
                if (rotation > 360)
                {
                    rotation /= 1e3;
                }

                var windowSize = new Size
                {
                    Width  = Math.Max(100, width == 0 ? 1366 : width),
                    Height = Math.Max(100, height == 0 ? 768 : height)
                };

                if (rotation % 180 != 0)
                {
                    windowSize = new Size(windowSize.Height, windowSize.Width);
                }

                context.SetPreferredSizeFit(windowSize, 0.8);

                context.TitlebarAutoHide       = true;
                context.Theme                  = Themes.Dark;
                context.TitlebarBlurVisibility = true;
            }
            else // audio
            {
                context.PreferredSize = new Size(500, 300);

                context.CanResize                = false;
                context.TitlebarAutoHide         = false;
                context.TitlebarBlurVisibility   = false;
                context.TitlebarColourVisibility = false;
            }
        }
Пример #2
0
        public static Dictionary <String, String> Info(String uri)
        {
            Dictionary <String, String> info = new Dictionary <String, String>();

            String fileName = Path.GetFileName(uri);

            /// Get Media Info
            MediaInfo.MediaInfo MI = new MediaInfo.MediaInfo();
            MI.Open(uri);
            String artist     = MI.Get(StreamKind.General, 0, "Performer");
            String trackName  = MI.Get(StreamKind.General, 0, "Title");
            String duration   = MI.Get(StreamKind.Audio, 0, "Duration");
            String fileLength = MI.Get(0, 0, "FileSize");
            String bitrate    = MI.Get(StreamKind.Audio, 0, "BitRate");

            info.Add("FileName", fileName);
            info.Add("Artist", artist);
            info.Add("Title", trackName);
            info.Add("Duration", duration);
            info.Add("FileLength", fileLength);
            info.Add("Bitrate", bitrate);

            MI.Close();

            return(info);
        }
Пример #3
0
        private static bool HasMatroskaChapter(TaskDetail task)
        {
            FileInfo inputFile = new FileInfo(task.InputFile);

            if (inputFile.Extension.ToLower() != ".mkv")
            {
                Logger.Warn($"{task.InputFile}不是Matroska文件。");
                return(false);
            }

            MediaInfo.MediaInfo MI = new MediaInfo.MediaInfo();
            MI.Open(inputFile.FullName);
            MI.Option("Complete");
            int.TryParse(MI.Get(StreamKind.General, 0, "MenuCount"), out var MenuCount);

            if (MenuCount == 0)
            {
                Logger.Warn($"{task.InputFile}内不含有章节。");
                MI?.Close();
                return(false);
            }

            MI?.Close();
            return(true);
        }
Пример #4
0
        public bool CanHandle(string path)
        {
            if (!Directory.Exists(path))
            {
                try
                {
                    _mediaInfo.Open(path);
                    string videoCodec = _mediaInfo.Get(StreamKind.Video, 0, "Format");
                    string audioCodec = _mediaInfo.Get(StreamKind.Audio, 0, "Format");
                    // Note MediaInfo.Close seems to close the dll and you have to re-create the MediaInfo
                    //      object like in the static class constructor above. Any call to Get methods etc.
                    //      will result in a "Unable to load MediaInfo library" error.
                    // Ref: https://github.com/MediaArea/MediaInfoLib/blob/master/Source/MediaInfoDLL/MediaInfoDLL.cs
                    // Pretty sure it doesn't leak when opening another file as the c++ code calls Close on Open
                    // Ref: https://github.com/MediaArea/MediaInfoLib/blob/master/Source/MediaInfo/MediaInfo_Internal.cpp
                    if (videoCodec == "Unable to load MediaInfo library") // should not happen
                    {
                        return(false);
                    }
                    if (!string.IsNullOrWhiteSpace(videoCodec) || !string.IsNullOrWhiteSpace(audioCodec))
                    {
                        return(true);
                    }
                }
                catch
                {
                    // return false;
                }
            }

            return(false);
        }
Пример #5
0
        public DateTime GetOriginalCreationDateTime(string filePath)
        {
            DateTime creationDateTime;

            using (var mediaInfo = new MediaInfo.MediaInfo())
            {
                mediaInfo.Open(filePath);
                var rawValue   = mediaInfo.Get(StreamKind.Video, 0, "Encoded_Date");
                var dateString = rawValue.Replace("UTC", string.Empty);
                creationDateTime = DateTime.TryParse(dateString, null, DateTimeStyles.AssumeUniversal, out DateTime dateTime) ? dateTime : DateTime.Now;
            }

            return(creationDateTime);
        }
Пример #6
0
        private void ExtractInfo(string filePath, string pathToDll, NumberFormatInfo providerNumber)
        {
            using (var mediaInfo = new MediaInfo(pathToDll))
            {
                Version = mediaInfo.Option("Info_Version");
                mediaInfo.Open(filePath);

                var streamNumber = 0;

                // Setup videos
                for (var i = 0; i < mediaInfo.CountGet(StreamKind.Video); ++i)
                {
                    VideoStreams.Add(new VideoStreamBuilder(mediaInfo, streamNumber++, i).Build());
                }

                if (VideoDuration == 0)
                {
                    double duration;
                    double.TryParse(
                        mediaInfo.Get(StreamKind.Video, 0, "Duration"),
                        NumberStyles.AllowDecimalPoint,
                        providerNumber,
                        out duration);
                    VideoDuration = (int)duration;
                }

                // Setup audios
                for (var i = 0; i < mediaInfo.CountGet(StreamKind.Audio); ++i)
                {
                    AudioStreams.Add(new AudioStreamBuilder(mediaInfo, streamNumber++, i).Build());
                }

                // Setup subtitles
                for (var i = 0; i < mediaInfo.CountGet(StreamKind.Text); ++i)
                {
                    Subtitles.Add(new SubtitleStreamBuilder(mediaInfo, streamNumber++, i).Build());
                }

                // Setup chapters
                for (var i = 0; i < mediaInfo.CountGet(StreamKind.Other); ++i)
                {
                    Chapters.Add(new ChapterStreamBuilder(mediaInfo, streamNumber++, i).Build());
                }

                // Setup menus
                for (var i = 0; i < mediaInfo.CountGet(StreamKind.Menu); ++i)
                {
                    MenuStreams.Add(new MenuStreamBuilder(mediaInfo, streamNumber++, i).Build());
                }

                MediaInfoNotloaded = VideoStreams.Count == 0 && AudioStreams.Count == 0 && Subtitles.Count == 0;

                // Produce copability properties
                if (MediaInfoNotloaded)
                {
                    SetPropertiesDefault();
                }
                else
                {
                    SetupProperties(mediaInfo);
                }
            }
        }
Пример #7
0
        private void ExtractInfo(string filePath, NumberFormatInfo providerNumber)
#endif
        {
#if (NET40 || NET45)
            using (var mediaInfo = new MediaInfo(pathToDll))
#else
            using (var mediaInfo = new MediaInfo())
#endif
            {
                if (mediaInfo.Handle == IntPtr.Zero)
                {
                    MediaInfoNotloaded = true;
                    _logger.LogWarning("MediaInfo library was not loaded!");
                    return;
                }
                else
                {
                    Version = mediaInfo.Option("Info_Version");
                    _logger.LogDebug($"MediaInfo library was loaded. Handle={mediaInfo.Handle} Version is {Version}");
                }

                var filePricessingHandle = mediaInfo.Open(filePath);
                if (filePricessingHandle == IntPtr.Zero)
                {
                    MediaInfoNotloaded = true;
                    _logger.LogWarning($"MediaInfo library has not been opened media {filePath}");
                    return;
                }
                else
                {
                    _logger.LogDebug($"MediaInfo library successfully opened {filePath}. Handle={filePricessingHandle}");
                }

                var streamNumber = 0;

                Tags = new AudioTagBuilder(mediaInfo, 0).Build();

                // Setup videos
                for (var i = 0; i < mediaInfo.CountGet(StreamKind.Video); ++i)
                {
                    VideoStreams.Add(new VideoStreamBuilder(mediaInfo, streamNumber++, i).Build());
                }

                if (Duration == 0)
                {
                    double.TryParse(
                        mediaInfo.Get(StreamKind.Video, 0, (int)NativeMethods.Video.Video_Duration),
                        NumberStyles.AllowDecimalPoint,
                        providerNumber,
                        out var duration);
                    Duration = (int)duration;
                }

                // Fix 3D for some containers
                if (VideoStreams.Count == 1 && Tags.GeneralTags.TryGetValue((NativeMethods.General) 1000, out var isStereo))
                {
                    var video = VideoStreams.First();
                    if (Tags.GeneralTags.TryGetValue((NativeMethods.General) 1001, out var stereoMode))
                    {
                        video.Stereoscopic = (StereoMode)stereoMode;
                    }
                    else
                    {
                        video.Stereoscopic = (bool)isStereo ? StereoMode.Stereo : StereoMode.Mono;
                    }
                }

                // Setup audios
                for (var i = 0; i < mediaInfo.CountGet(StreamKind.Audio); ++i)
                {
                    AudioStreams.Add(new AudioStreamBuilder(mediaInfo, streamNumber++, i).Build());
                }

                if (Duration == 0)
                {
                    double.TryParse(
                        mediaInfo.Get(StreamKind.Audio, 0, (int)NativeMethods.Audio.Audio_Duration),
                        NumberStyles.AllowDecimalPoint,
                        providerNumber,
                        out var duration);
                    Duration = (int)duration;
                }

                // Setup subtitles
                for (var i = 0; i < mediaInfo.CountGet(StreamKind.Text); ++i)
                {
                    Subtitles.Add(new SubtitleStreamBuilder(mediaInfo, streamNumber++, i).Build());
                }

                // Setup chapters
                for (var i = 0; i < mediaInfo.CountGet(StreamKind.Other); ++i)
                {
                    Chapters.Add(new ChapterStreamBuilder(mediaInfo, streamNumber++, i).Build());
                }

                // Setup menus
                for (var i = 0; i < mediaInfo.CountGet(StreamKind.Menu); ++i)
                {
                    MenuStreams.Add(new MenuStreamBuilder(mediaInfo, streamNumber++, i).Build());
                }

                MediaInfoNotloaded = VideoStreams.Count == 0 && AudioStreams.Count == 0 && Subtitles.Count == 0;

                // Produce capability properties
                if (MediaInfoNotloaded)
                {
                    SetPropertiesDefault();
                }
                else
                {
                    SetupProperties(mediaInfo);
                }
            }
        }