public ViewMediaInfoForm(string path)
        {
            InitializeComponent();

            var mediaFile = new MediaFile(path);

            var lines = new List<string>();
            {
                lines.Add(string.Format("Unique ID            : {0}", mediaFile.uniqueId));
                lines.Add(string.Format("Complete name        : {0}", path));
                lines.Add(string.Format("Format               : {0}", mediaFile.format));
                lines.Add(string.Format("File size            : {0}", mediaFile.size));
                lines.Add(string.Format("Duration             : {0}", mediaFile.duration));
                lines.Add(string.Format("Overall bit rate     : {0}", mediaFile.bitRate));
                lines.Add(string.Format("Encoded date         : {0}", mediaFile.encodedDate));
                lines.Add(string.Format("Writing application  : {0}", mediaFile.miGetString("Encoded_Application")));
                lines.Add(string.Format("Writing library      : {0}", mediaFile.encodedLibrary));
            }

            lines.Add(string.Empty);
            lines.Add("Video");
            foreach (var info in mediaFile.Video)
            {
                double bitPerFrame = info.Value.size*8/
                                     ((double) info.Value.width*info.Value.height*info.Value.frameCount);
                lines.Add(string.Format("ID                   : {0}", info.Value.uniqueId));
                lines.Add(string.Format("Format               : {0}", info.Value.format));
                lines.Add(string.Format("Format profile       : {0}", info.Value.miGetString("Format_Profile")));
                lines.Add(string.Format("Format settings      : {0}", info.Value.miGetString("Format_Settings")));
                lines.Add(string.Format("Codec ID             : {0}", info.Value.codecId));
                lines.Add(string.Format("Duration             : {0}", info.Value.duration));
                lines.Add(string.Format("Bit rate             : {0}", info.Value.bitRate));
                lines.Add(string.Format("Width                : {0}", info.Value.width));
                lines.Add(string.Format("Height               : {0}", info.Value.height));
                lines.Add(string.Format("Display aspect ratio : {0}", info.Value.pixelAspectRatio));
                lines.Add(string.Format("Frame rate mode      : {0}", info.Value.frameRateMode));
                lines.Add(string.Format("Frame rate           : {0}", info.Value.frameRate));
                lines.Add(string.Format("Chroma subsampling   : {0}", info.Value.miGetString("ChromaSubsampling")));
                lines.Add(string.Format("Bit depth            : {0}", info.Value.bitDepth));
                lines.Add(string.Format("Scan type            : {0}", info.Value.miGetString("ScanType")));
                lines.Add(string.Format("Bits/(Pixel*Frame)   : {0}", bitPerFrame.ToString("0.#####")));
                lines.Add(string.Format("Stream size          : {0}", info.Value.miGetString("StreamSize")));
                lines.Add(string.Format("Writing library      : {0}", info.Value.encodedLibrary));
                lines.Add(string.Format("Encoding settings    : {0}", info.Value.encoderSettingsRaw));
                lines.Add(string.Format("Language             : {0}", info.Value.language));
            }

            lines.Add(string.Empty);

            lines.Add("Audio");
            foreach (var info in mediaFile.Audio)
            {
                lines.Add(string.Format("ID                   : {0}", info.Value.uniqueId));
                lines.Add(string.Format("Format               : {0}", info.Value.format));
                lines.Add(string.Format("Codec ID             : {0}", info.Value.codecId));
                lines.Add(string.Format("Duration             : {0}", info.Value.duration));
                lines.Add(string.Format("Bit rate mode        : {0}", info.Value.bitRateMode));
                lines.Add(string.Format("Bit rate             : {0}", info.Value.bitRate));
                lines.Add(string.Format("Channel(s)           : {0}", info.Value.channels));
                lines.Add(string.Format("Sampling rate        : {0}", info.Value.sampleRate));
                lines.Add(string.Format("Bit depth            : {0}", info.Value.bitDepth));
                lines.Add(string.Format("Compression mode     : {0}", info.Value.compressionMode));
                lines.Add(string.Format("Stream size          : {0}", info.Value.size));
                lines.Add(string.Format("Language             : {0}", info.Value.language));
            }

            lines.Add(string.Empty);

            lines.Add("Subtitle");
            foreach (var info in mediaFile.Text)
            {
                lines.Add(string.Format("ID                   : {0}", info.Value.uniqueId));
                lines.Add(string.Format("Format               : {0}", info.Value.format));
                lines.Add(string.Format("Muxing Mode          : {0}", info.Value.muxingMode));
                lines.Add(string.Format("Codec ID             : {0}", info.Value.codecId));
                lines.Add(string.Format("Language             : {0}", info.Value.language));
            }

            textBoxInfo.Lines = lines.ToArray();
        }
        public ViewMediaInfoForm(string path)
        {
            InitializeComponent();

            Icon = Gui.Icon;

            wb_info.PreviewKeyDown += OnBrowserPreviewKeyDown;

            var mediaFile = new MediaFile(path);
            var mi = new MediaInfo();
            mi.Open(path);

            var lines = new List<string>();
            {
                lines.Add("<!doctype html>");
                lines.Add("<html>");
                lines.Add("<head>");
                lines.Add("<style>* { padding: 0px; margin: 0px; font-family:tahoma; } body { width: 700px; background: #fff; margin: 0 auto; } table { width: 700px; font-size: 12px; border-collapse: collapse; } td { width: 570px; padding: 5px; border-bottom: 1px dotted #1562b6; word-wrap: break-word; } td:first-child { width: 130px; border-right: 1px solid #1562b6; } .thead { font-size: 15px; color: #1562b6; padding-top: 25px; border: 0px !important; border-bottom: 2px solid #1562b6 !important; } .no-padding { padding-top: 0px !important; }</style>");
                lines.Add("</head>");
                lines.Add("<body>");
                lines.Add("<table border='0' cellspacing='0' cellpadding='0'>");
                lines.Add("<tr><td class='thead no-padding' colspan='2'><b>General</b></td></tr>");
                lines.Add(string.IsNullOrEmpty(mediaFile.miGetString("UniqueID/String")) ? string.Empty : string.Format("<tr><td>Unique ID:</td><td>{0}</td></tr>", mediaFile.miGetString("UniqueID/String")));
                lines.Add(string.IsNullOrEmpty(mediaFile.miGetString("Movie")) ? string.Empty : string.Format("<tr><td>Movie name:</td><td>{0}</td></tr>", mediaFile.miGetString("Movie")));
                lines.Add(string.IsNullOrEmpty(mediaFile.miGetString("CompleteName")) ? string.Empty : string.Format("<tr><td>Complete name:</td><td>{0}</td></tr>", mediaFile.miGetString("CompleteName")));
                lines.Add(string.IsNullOrEmpty(mediaFile.miGetString("Format")) ? string.Empty : string.Format("<tr><td>Format:</td><td>{0}</td></tr>", mediaFile.miGetString("Format")));
                lines.Add(string.IsNullOrEmpty(mediaFile.miGetString("Format_Version")) ? string.Empty : string.Format("<tr><td>Format version:</td><td>{0}</td></tr>", mediaFile.miGetString("Format_Version")));
                lines.Add(string.IsNullOrEmpty(mediaFile.miGetString("FileSize/String")) ? string.Empty : string.Format("<tr><td>File size:</td><td>{0}</td></tr>", mediaFile.miGetString("FileSize/String")));
                lines.Add(string.IsNullOrEmpty(mediaFile.miGetString("Duration/String")) ? string.Empty : string.Format("<tr><td>Duration:</td><td>{0}</td></tr>", mediaFile.miGetString("Duration/String")));
                lines.Add(string.IsNullOrEmpty(mediaFile.miGetString("OverallBitRate/String")) ? string.Empty : string.Format("<tr><td>Overall bitrate:</td><td>{0}</td></tr>", mediaFile.miGetString("OverallBitRate/String")));
                lines.Add(string.IsNullOrEmpty(mediaFile.miGetString("Encoded_Date")) ? string.Empty : string.Format("<tr><td>Encoded date:</td><td>{0}</td></tr>", mediaFile.miGetString("Encoded_Date")));
                lines.Add(string.IsNullOrEmpty(mediaFile.miGetString("Encoded_Application")) ? string.Empty : string.Format("<tr><td>Writing application:</td><td>{0}</td></tr>", mediaFile.miGetString("Encoded_Application")));
                lines.Add(string.IsNullOrEmpty(mediaFile.miGetString("Encoded_Library/String")) ? string.Empty : string.Format("<tr><td>Writing library:</td><td>{0}</td></tr>", mediaFile.miGetString("Encoded_Library/String")));
            }

            lines.Add("<tr><td class='thead' colspan='2'><b>Video</b></td></tr>");
            foreach (var info in mediaFile.Video)
            {
                lines.Add(string.Format("<tr><td>ID:</td><td>{0}</td></tr>", info.Value.miGetString("ID/String")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Title")) ? string.Empty : string.Format("<tr><td>Title:</td><td>{0}</td></tr>", info.Value.miGetString("Title")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Format")) ? string.Empty : string.Format("<tr><td>Format:</td><td>{0}</td></tr>", info.Value.miGetString("Format")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Format/Info")) ? string.Empty : string.Format("<tr><td>Format info:</td><td>{0}</td></tr>", info.Value.miGetString("Format/Info")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Format_Profile")) ? string.Empty : string.Format("<tr><td>Format profile:</td><td>{0}</td></tr>", info.Value.miGetString("Format_Profile")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Format_Settings")) ? string.Empty : string.Format("<tr><td>Format settings:</td><td>{0}</td></tr>", info.Value.miGetString("Format_Settings")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("MuxingMode")) ? string.Empty : string.Format("<tr><td>Muxing mode:</td><td>{0}</td></tr>", info.Value.miGetString("MuxingMode")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("CodecID/String")) ? string.Empty : string.Format("<tr><td>Codec ID:</td><td>{0}</td></tr>", info.Value.miGetString("CodecID/String")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Duration/String")) ? string.Empty : string.Format("<tr><td>Duration:</td><td>{0}</td></tr>", info.Value.miGetString("Duration/String")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("BitRate/String")) ? string.Empty : string.Format("<tr><td>Bitrate:</td><td>{0}</td></tr>", info.Value.miGetString("BitRate/String")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("BitRate_Nominal/String")) ? string.Empty : string.Format("<tr><td>Nominal bitrate:</td><td>{0}</td></tr>", info.Value.miGetString("BitRate_Nominal/String")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Width/String")) ? string.Empty : string.Format("<tr><td>Width:</td><td>{0}</td></tr>", info.Value.miGetString("Width/String")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Height/String")) ? string.Empty : string.Format("<tr><td>Height:</td><td>{0}</td></tr>", info.Value.miGetString("Height/String")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("DisplayAspectRatio/String")) ? string.Empty : string.Format("<tr><td>Display aspect ratio:</td><td>{0}</td></tr>", info.Value.miGetString("DisplayAspectRatio/String")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("FrameRate_Mode/String")) ? string.Empty : string.Format("<tr><td>Frame rate mode:</td><td>{0}</td></tr>", info.Value.miGetString("FrameRate_Mode/String")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("FrameRate/String")) ? string.Empty : string.Format("<tr><td>Frame rate:</td><td>{0}</td></tr>", info.Value.miGetString("FrameRate/String")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("ColorSpace")) ? string.Empty : string.Format("<tr><td>Color space:</td><td>{0}</td></tr>", info.Value.miGetString("ColorSpace")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("ChromaSubsampling")) ? string.Empty : string.Format("<tr><td>Chroma subsampling:</td><td>{0}</td></tr>", info.Value.miGetString("ChromaSubsampling")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("BitDepth/String")) ? string.Empty : string.Format("<tr><td>Bit depth:</td><td>{0}</td></tr>", info.Value.miGetString("BitDepth/String")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("ScanType")) ? string.Empty : string.Format("<tr><td>Scan type:</td><td>{0}</td></tr>", info.Value.miGetString("ScanType")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Bits-(Pixel*Frame)")) ? string.Empty : string.Format("<tr><td>Bits/(Pixel*Frame):</td><td>{0}</td></tr>", info.Value.miGetString("Bits-(Pixel*Frame)")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("StreamSize/String")) ? string.Empty : string.Format("<tr><td>Stream size:</td><td>{0}</td></tr>", info.Value.miGetString("StreamSize/String")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Encoded_Library/String")) ? string.Empty : string.Format("<tr><td>Writing library:</td><td>{0}</td></tr>", info.Value.miGetString("Encoded_Library/String")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Encoded_Library_Settings")) ? string.Empty : string.Format("<tr><td>Encoding settings:</td><td>{0}</td></tr>", info.Value.miGetString("Encoded_Library_Settings")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Language/String")) ? string.Empty : string.Format("<tr><td>Language:</td><td>{0}</td></tr>", info.Value.miGetString("Language/String")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Default/String")) ? string.Empty : string.Format("<tr><td>Default:</td><td>{0}</td></tr>", info.Value.miGetString("Default/String")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Forced/String")) ? string.Empty : string.Format("<tr><td>Forced:</td><td>{0}</td></tr>", info.Value.miGetString("Forced/String")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("colour_range")) ? string.Empty : string.Format("<tr><td>Color range:</td><td>{0}</td></tr>", info.Value.miGetString("colour_range")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("colour_primaries")) ? string.Empty : string.Format("<tr><td>Color primaries:</td><td>{0}</td></tr>", info.Value.miGetString("colour_primaries")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("transfer_characteristics")) ? string.Empty : string.Format("<tr><td>Transfer characteristics:</td><td>{0}</td></tr>", info.Value.miGetString("transfer_characteristics")));
                lines.Add(string.IsNullOrEmpty(info.Value.miGetString("matrix_coefficients")) ? string.Empty : string.Format("<tr><td>Matrix coefficients:</td><td>{0}</td></tr>", info.Value.miGetString("matrix_coefficients")));
            }

            if (mediaFile.Audio.Count > 0)
            {
                int audioTracks = 1;

                foreach (var info in mediaFile.Audio)
                {
                    lines.Add(mediaFile.Audio.Count == 1 ? "<tr><td class='thead' colspan='2'><b>Audio</b></td></tr>" : string.Format("<tr><td class='thead' colspan='2'><b>Audio #{0}</b></td></tr>", audioTracks));
                    lines.Add(string.Format("<tr><td>ID:</td><td>{0}</td></tr>", info.Value.miGetString("ID/String")));
                    lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Title")) ? string.Empty : string.Format("<tr><td>Title:</td><td>{0}</td></tr>", info.Value.miGetString("Title")));
                    lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Format")) ? string.Empty : string.Format("<tr><td>Format:</td><td>{0}</td></tr>", info.Value.miGetString("Format")));
                    lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Format/Info")) ? string.Empty : string.Format("<tr><td>Format info:</td><td>{0}</td></tr>", info.Value.miGetString("Format/Info")));
                    lines.Add(string.IsNullOrEmpty(info.Value.miGetString("CodecID/String")) ? string.Empty : string.Format("<tr><td>Codec ID:</td><td>{0}</td></tr>", info.Value.miGetString("CodecID/String")));
                    lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Duration/String")) ? string.Empty : string.Format("<tr><td>Duration:</td><td>{0}</td></tr>", info.Value.miGetString("Duration/String")));
                    lines.Add(string.IsNullOrEmpty(info.Value.miGetString("BitRate_Mode/String")) ? string.Empty : string.Format("<tr><td>Bitrate mode:</td><td>{0}</td></tr>", info.Value.miGetString("BitRate_Mode/String")));
                    lines.Add(string.IsNullOrEmpty(info.Value.miGetString("BitRate/String")) ? string.Empty : string.Format("<tr><td>Bitrate:</td><td>{0}</td></tr>", info.Value.miGetString("BitRate/String")));
                    lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Channel(s)/String")) ? string.Empty : string.Format("<tr><td>Channels:</td><td>{0}</td></tr>", info.Value.miGetString("Channel(s)/String")));
                    lines.Add(string.IsNullOrEmpty(info.Value.miGetString("SamplingRate/String")) ? string.Empty : string.Format("<tr><td>Sampling rate:</td><td>{0}</td></tr>", info.Value.miGetString("SamplingRate/String")));
                    lines.Add(string.IsNullOrEmpty(info.Value.miGetString("BitDepth/String")) ? string.Empty : string.Format("<tr><td>Bit depth:</td><td>{0}</td></tr>", info.Value.miGetString("BitDepth/String")));
                    lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Compression_Mode/String")) ? string.Empty : string.Format("<tr><td>Compression mode:</td><td>{0}</td></tr>", info.Value.miGetString("Compression_Mode/String")));
                    lines.Add(string.IsNullOrEmpty(info.Value.miGetString("StreamSize/String")) ? string.Empty : string.Format("<tr><td>Stream size:</td><td>{0}</td></tr>", info.Value.miGetString("StreamSize/String")));
                    lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Language/String")) ? string.Empty : string.Format("<tr><td>Language:</td><td>{0}</td></tr>", info.Value.miGetString("Language/String")));
                    lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Default/String")) ? string.Empty : string.Format("<tr><td>Default:</td><td>{0}</td></tr>", info.Value.miGetString("Default/String")));
                    lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Forced/String")) ? string.Empty : string.Format("<tr><td>Forced:</td><td>{0}</td></tr>", info.Value.miGetString("Forced/String")));

                    audioTracks++;
                }
            }

            if (mediaFile.Text.Count > 0)
            {
                int textTracks = 1;

                foreach (var info in mediaFile.Text)
                {
                    lines.Add(mediaFile.Text.Count == 1 ? "<tr><td class='thead' colspan='2'><b>Text</b></td></tr>" : string.Format("<tr><td class='thead' colspan='2'><b>Text #{0}</b></td></tr>", textTracks));
                    lines.Add(string.Format("<tr><td>ID:</td><td>{0}</td></tr>", info.Value.miGetString("ID/String")));
                    lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Format")) ? string.Empty : string.Format("<tr><td>Format:</td><td>{0}</td></tr>", info.Value.miGetString("Format")));
                    lines.Add(string.IsNullOrEmpty(info.Value.miGetString("CodecID")) ? string.Empty : string.Format("<tr><td>Codec ID:</td><td>{0}</td></tr>", info.Value.miGetString("CodecID")));
                    lines.Add(string.IsNullOrEmpty(info.Value.miGetString("CodecID/Info")) ? string.Empty : string.Format("<tr><td>Codec ID info:</td><td>{0}</td></tr>", info.Value.miGetString("CodecID/Info")));
                    lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Compression_Mode/String")) ? string.Empty : string.Format("<tr><td>Compression mode:</td><td>{0}</td></tr>", info.Value.miGetString("Compression_Mode/String")));
                    lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Language/String")) ? string.Empty : string.Format("<tr><td>Language:</td><td>{0}</td></tr>", info.Value.miGetString("Language/String")));
                    lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Default/String")) ? string.Empty : string.Format("<tr><td>Default:</td><td>{0}</td></tr>", info.Value.miGetString("Default/String")));
                    lines.Add(string.IsNullOrEmpty(info.Value.miGetString("Forced/String")) ? string.Empty : string.Format("<tr><td>Forced:</td><td>{0}</td></tr>", info.Value.miGetString("Forced/String")));

                    textTracks++;
                }
            }

            if (mediaFile.Menu.Count > 0)
            {
                int chapterBegin = int.Parse(mi.Get(StreamKind.Menu, 0, "Chapters_Pos_Begin"));
                int chapterEnd = int.Parse(mi.Get(StreamKind.Menu, 0, "Chapters_Pos_End"));

                lines.Add("<tr><td class='thead' colspan='2'><b>Menu</b></td></tr>");
                foreach (var info in mediaFile.Menu)
                {
                    for (int i = chapterBegin; i < chapterEnd; i++)
                    {
                        string key = mi.Get(StreamKind.Menu, 0, i, InfoKind.Name);
                        string value = mi.Get(StreamKind.Menu, 0, i);
                        lines.Add(string.IsNullOrEmpty(info.Value.miGetString(key)) ? string.Empty : string.Format("<tr><td>{0}:</td><td>{1}</td></tr>", key, value));
                    }
                }
            }

            lines.Add("</table></body></html>");

            wb_info.DocumentText = string.Join("\n", lines.ToArray());
        }