示例#1
0
            void TaskMethod(object toRun)
            {
                InfoProviderBase provider = toRun as InfoProviderBase;

                provider.DoUpdateInfo(currentDecision);//currentDecision.PlayerId, currentDecision.Cache, cacheTracker, selectedTaskTree.ActualKey);

                if (selectedTaskTree.dependents.ContainsKey(provider.ProviderType))
                {
                    foreach (var dependent in selectedTaskTree.dependents[provider.ProviderType])
                    {
                        lock (dependent.PrerequesitesLocker)
                        {
                            if (dependent.PrerequesitesLeft > 0)
                            {
                                dependent.PrerequesitesLeft--;
                                if (dependent.PrerequesitesLeft == 0)
                                {
                                    if (ConcurrencyMode.Concurrency == ConcurrencyMode.ConcurencyModel.MultiCore)
                                    {
                                        providerTasks[dependent.ProviderType].Start();
                                    }
                                    else
                                    {
                                        providerActions[dependent.ProviderType]();
                                    }
                                }
                            }
                        }
                    }
                }
            }
示例#2
0
文件: Info.cs 项目: asfdfdfd/AniDB
        public static string CreateTxtLog(string path, InfoProviderBase p)
        {
            XmlDocument xmlDoc = CreateNewAVDumpLog(p);

            Func <string, string> formatDuration = (ldStr) => {
                var duration = TimeSpan.FromSeconds(double.Parse(ldStr)).ToString();
                return(duration.IndexOf(".") < 0 ? duration : duration.Substring(0, duration.IndexOf('.')));
            };

            string log = "File: " + path + Environment.NewLine;

            foreach (XmlElement node in xmlDoc["Creq"]["File"]["General"])
            {
                log += " " + node.Name + ": " + (node.Name.Equals("Duration") ? formatDuration(node.InnerText) : node.InnerText) + Environment.NewLine;
            }

            if (xmlDoc["Creq"]["File"]["Hashes"].HasChildNodes)
            {
                log += " #Hashes" + Environment.NewLine;
            }
            foreach (XmlElement streamsNode in xmlDoc["Creq"]["File"]["Hashes"])
            {
                log += "  " + streamsNode.Name + ": " + streamsNode.InnerText + Environment.NewLine;
            }

            foreach (XmlElement streamsNode in xmlDoc["Creq"]["File"]["VideoStreams"])
            {
                log += " #Videostream" + Environment.NewLine;
                foreach (XmlElement node in streamsNode)
                {
                    log += "  " + node.Name + ": " + (node.Name.Equals("Duration") ? formatDuration(node.InnerText) : node.InnerText) + Environment.NewLine;
                }
            }
            foreach (XmlElement streamsNode in xmlDoc["Creq"]["File"]["AudioStreams"])
            {
                log += " #Audiostream" + Environment.NewLine;
                foreach (XmlElement node in streamsNode)
                {
                    log += "  " + node.Name + ": " + (node.Name.Equals("Duration") ? formatDuration(node.InnerText) : node.InnerText) + Environment.NewLine;
                }
            }

            foreach (XmlElement streamsNode in xmlDoc["Creq"]["File"]["SubtitleStreams"])
            {
                log += " #Subtitlestream" + Environment.NewLine;
                foreach (XmlElement node in streamsNode)
                {
                    log += "  " + node.Name + ": " + (node.Name.Equals("Duration") ? formatDuration(node.InnerText) : node.InnerText) + Environment.NewLine;
                }
            }


            return(log);
        }
示例#3
0
文件: Info.cs 项目: asfdfdfd/AniDB
        public static string CreateHashLog(string path, InfoProviderBase p)
        {
            XmlDocument xmlDoc = CreateNewAVDumpLog(p);

            string log = "";

            if (xmlDoc["Creq"]["File"]["Hashes"].HasChildNodes)
            {
                log = " #Hashes" + Environment.NewLine;
            }
            foreach (XmlElement streamsNode in xmlDoc["Creq"]["File"]["Hashes"])
            {
                log += "  " + streamsNode.Name + ": " + streamsNode.InnerText + Environment.NewLine;
            }
            return(log);
        }
示例#4
0
文件: Info.cs 项目: asfdfdfd/AniDB
        public static XmlDocument CreateNewAVDumpLog(InfoProviderBase provider)
        {
            XmlDocument xmlDoc = new XmlDocument();;
            Func <string, string, string, string, XmlNode> createNode = (name, value, unit, p) => {
                var n = xmlDoc.CreateElement(name);
                if (!string.IsNullOrEmpty(unit))
                {
                    n.Attributes.Append(xmlDoc.CreateAttribute("u")).Value = unit;
                }
                //if(!string.IsNullOrEmpty(p)) n.Attributes.Append(xmlDoc.CreateAttribute("p")).Value = p;

                n.AppendChild(xmlDoc.CreateTextNode(value));
                return(n);
            };
            Func <InfoProviderBase, string> getName = (p) => { return(p.ToString().Substring(p.ToString().LastIndexOf('.') + 1)); };

            var aCreqNode    = xmlDoc.AppendChild(xmlDoc.CreateElement("Creq"));
            var fileNode     = aCreqNode.AppendChild(xmlDoc.CreateElement("File"));
            var hashNode     = fileNode.AppendChild(xmlDoc.CreateElement("Hashes"));
            var generalNode  = fileNode.AppendChild(xmlDoc.CreateElement("General"));
            var videoNode    = fileNode.AppendChild(xmlDoc.CreateElement("VideoStreams"));
            var audioNode    = fileNode.AppendChild(xmlDoc.CreateElement("AudioStreams"));
            var subtitleNode = fileNode.AppendChild(xmlDoc.CreateElement("SubtitleStreams"));
            var chaptersNode = fileNode.AppendChild(xmlDoc.CreateElement("Chapters"));

            XmlNode node;
            var     lookUp = new Dictionary <KeyValuePair <StreamType, int>, XmlNode>();

            foreach (var entry in provider)
            {
                var pair = new KeyValuePair <StreamType, int>(entry.Key.Type, entry.Key.Index);
                if (!lookUp.TryGetValue(pair, out node))
                {
                    switch (pair.Key)
                    {
                    case StreamType.General: node = generalNode; break;

                    case StreamType.Video: lookUp[pair] = node = xmlDoc.CreateElement("VideoStream"); videoNode.AppendChild(node); break;

                    case StreamType.Audio: lookUp[pair] = node = xmlDoc.CreateElement("AudioStream"); audioNode.AppendChild(node); break;

                    case StreamType.Text: lookUp[pair] = node = xmlDoc.CreateElement("SubtitleStream"); subtitleNode.AppendChild(node); break;

                    case StreamType.Hash: lookUp[pair] = node = hashNode; break;

                    case StreamType.Chapter: break;

                    default: break;
                    }
                }

                if (entry.Key.Type == StreamType.Hash)
                {
                    node.AppendChild(createNode(entry.Unit, entry.Value, null, null));
                }
                else
                {
                    node.AppendChild(createNode(entry.Key.Entry.ToString(), entry.Value, entry.Unit, getName(entry.Provider)));
                }
            }

            var comp = (CompositeInfoProvider)provider;

            if (comp.GetProvider <MatroskaProvider>() != null)
            {
                var mkvProvider  = comp.GetProvider <MatroskaProvider>();
                var matroskaFile = mkvProvider.MFI;

                if (matroskaFile.Segment.SegmentInfo.PreviousUId != null)
                {
                    generalNode.AppendChild(createNode("PreviousUId", new Guid(matroskaFile.Segment.SegmentInfo.PreviousUId).ToString(), null, getName(mkvProvider)));
                }
                if (matroskaFile.Segment.SegmentInfo.NextUId != null)
                {
                    generalNode.AppendChild(createNode("NextUId", new Guid(matroskaFile.Segment.SegmentInfo.NextUId).ToString(), null, getName(mkvProvider)));
                }
                if (matroskaFile.Segment.SegmentInfo.PreviousFilename != null)
                {
                    generalNode.AppendChild(createNode("PreviousFilename", matroskaFile.Segment.SegmentInfo.PreviousFilename, null, getName(mkvProvider)));
                }
                if (matroskaFile.Segment.SegmentInfo.NextFilename != null)
                {
                    generalNode.AppendChild(createNode("NextFilename", matroskaFile.Segment.SegmentInfo.NextFilename, null, getName(mkvProvider)));
                }
                if (matroskaFile.Segment.SegmentInfo.SegmentUId != null)
                {
                    generalNode.AppendChild(createNode("SegmentUId", new Guid(matroskaFile.Segment.SegmentInfo.SegmentUId).ToString(), null, getName(mkvProvider)));
                }
                if (matroskaFile.Segment.Chapters != null)
                {
                    CreateEBMLTree(xmlDoc, chaptersNode, matroskaFile.Segment.Chapters);
                }
            }
            else
            {
                try { CreateChaptersMIL(xmlDoc, chaptersNode, comp.GetProvider <MediaInfoProvider>().MIL); } catch (Exception) { }
            }

            return(xmlDoc);
        }
示例#5
0
文件: Info.cs 项目: asfdfdfd/AniDB
        public static XmlDocument CreateOldAVDumpLog(string path, InfoProviderBase p)
        {
            IMediaInfo   mediaInfo;
            MatroskaFile matroskaFileInfo;

            XmlDocument xmlDoc = new XmlDocument();
            XmlNode     node, subNode;
            int         streamCount;
            string      milInfo;

            node = xmlDoc.AppendChild(xmlDoc.CreateElement("file"));
            AppendLeaf(xmlDoc, node, "size", (new FileInfo(path)).Length.ToString(), null);

            //if(blockConsumers != null) {
            //    foreach(IBlockConsumer blockConsumer in blockConsumers) {
            //        if(blockConsumer is HashCalculator) {
            //            HashCalculator hashExecute = (HashCalculator)blockConsumer;
            //            BaseOption baseOption = (hashExecute.HashObj is TreeHash || hashExecute.HashObj is TigerThex ? BaseOption.Base32 : BaseOption.Heximal) | BaseOption.Pad | BaseOption.Reverse;
            //            AppendLeaf(xmlDoc, node, hashExecute.Name.ToLower(), BaseConverter.ToString(hashExecute.HashObj.Hash, baseOption).ToLower(), null);

            //            if(hashExecute.HashObj is Ed2k) {
            //                Ed2k ed2k = (Ed2k)hashExecute.HashObj;
            //                if(!ed2k.BlueIsRed) {
            //                    baseOption = BaseOption.Heximal | BaseOption.Pad | BaseOption.Reverse;
            //                    AppendLeaf(xmlDoc, node, hashExecute.Name.ToLower() + "_alt", BaseConverter.ToString(ed2k.RedHash, baseOption).ToLower(), null);
            //                }
            //            }
            //        } else if(blockConsumer is MatroskaParser) {
            //            matroskaFileInfo = (MatroskaParser)blockConsumer;
            //        }
            //    }
            //}

            mediaInfo = CreateMediaInfoInstance();
            mediaInfo.Open(path);

            node = node.AppendChild(xmlDoc.CreateElement("avmf"));

            milInfo = mediaInfo.Get(eStreamType.General, 0, "Duration");
            if (!String.IsNullOrEmpty(milInfo))
            {
                AppendLeaf(xmlDoc, node, "duration", (double.Parse(milInfo, CultureInfo.InvariantCulture) / 1000d).ToString(CultureInfo.InvariantCulture), null);
                AppendLeaf(xmlDoc, node, "duration2", TimeSpan.FromSeconds(((long)double.Parse(milInfo, CultureInfo.InvariantCulture) / 1000)).ToString(), null);
            }

            AppendLeaf(xmlDoc, node, "extension", mediaInfo.Get(eStreamType.General, 0, "FileExtension"), null);
            //AppendLeaf(xmlDoc, node, "date", mi.Get(StreamKind.General, 0, ""));
            AppendLeaf(xmlDoc, node, "chapters", mediaInfo.Get(eStreamType.General, 0, "ChaptersCount"), null);
            AppendLeaf(xmlDoc, node, "app", mediaInfo.Get(eStreamType.General, 0, "Encoded_Application"), null);
            AppendLeaf(xmlDoc, node, "lib", mediaInfo.Get(eStreamType.General, 0, "Encoded_Library"), null);

            streamCount = mediaInfo.Count_Get(eStreamType.Video);
            for (int i = 0; i < streamCount; i++)
            {
                subNode = node.AppendChild(xmlDoc.CreateElement("video"));
                AppendLeaf(xmlDoc, subNode, "title", mediaInfo.Get(eStreamType.Video, i, "Title"), null);
                var asdf = mediaInfo.Get(eStreamType.Video, i, "StreamSize");
                if (!String.IsNullOrEmpty(asdf))
                {
                    asdf = "";
                }
                AppendLeaf(xmlDoc, subNode, "size", mediaInfo.Get(eStreamType.Video, i, "StreamSize"), null);


                milInfo = mediaInfo.Get(eStreamType.Video, i, "Duration");
                if (!String.IsNullOrEmpty(milInfo))
                {
                    AppendLeaf(xmlDoc, subNode, "duration", (double.Parse(milInfo, CultureInfo.InvariantCulture) / 1000d).ToString(CultureInfo.InvariantCulture), null);
                    AppendLeaf(xmlDoc, subNode, "duration2", TimeSpan.FromSeconds(((long)double.Parse(milInfo, CultureInfo.InvariantCulture) / 1000)).ToString(), null);
                }

                //AppendLeaf(xmlDoc, subNode, "identifier", mi.Get(StreamKind.Video, i, ""));
                milInfo = mediaInfo.Get(eStreamType.Video, i, "BitRate");
                if (!String.IsNullOrEmpty(milInfo))
                {
                    AppendLeaf(xmlDoc, subNode, "bitrate2", ((long)double.Parse(milInfo, CultureInfo.InvariantCulture) / 1000).ToString(), new String[, ] {
                        { "unit", "kbit/s" }
                    });
                }
                AppendLeaf(xmlDoc, subNode, "bitrate", mediaInfo.Get(eStreamType.Video, i, "BitRate"), null);
                AppendLeaf(xmlDoc, subNode, "fourcc", mediaInfo.Get(eStreamType.Video, i, "CodecID"), null);                 //Codec/CC
                AppendLeaf(xmlDoc, subNode, "fps", mediaInfo.Get(eStreamType.Video, i, "FrameRate"), null);
                AppendLeaf(xmlDoc, subNode, "encoder", mediaInfo.Get(eStreamType.Video, i, "Encoded_Library"), null);
                AppendLeaf(xmlDoc, subNode, "setting", mediaInfo.Get(eStreamType.Video, i, "Encoded_Library_Settings"), null);
                //AppendLeaf(xmlDoc, subNode, "private", mi.Get(StreamKind.Video, i, ""));
                AppendLeaf(xmlDoc, subNode, "sample_count", mediaInfo.Get(eStreamType.Video, i, "FrameCount"), null);
                AppendLeaf(xmlDoc, subNode, "chroma", mediaInfo.Get(eStreamType.Video, i, "Colorimetry"), null);
                AppendLeaf(xmlDoc, subNode, "structure", mediaInfo.Get(eStreamType.Video, i, "Interlacement"), null);

                AppendLeaf(xmlDoc, subNode, "res_p", null, new String[, ] {
                    { "width", mediaInfo.Get(eStreamType.Video, i, "Width") },
                    { "height", mediaInfo.Get(eStreamType.Video, i, "Height") }
                });

                //AppendLeaf(xmlDoc, subNode, "dar", mediaInfo.Get(eStreamKind.Video, i, "DisplayAspectRatio"), null);
                string res_d = mediaInfo.Get(eStreamType.Video, i, "DisplayAspectRatio/String");
                if (res_d.Contains(":"))
                {
                    AppendLeaf(xmlDoc, subNode, "dar", null, new String[, ] {
                        { "width", res_d.Split(':')[0].ToString() }, { "height", res_d.Split(':')[1].ToString() }
                    });
                }
            }


            streamCount = mediaInfo.Count_Get(eStreamType.Audio);
            for (int i = 0; i < streamCount; i++)
            {
                subNode = node.AppendChild(xmlDoc.CreateElement("audio"));

                milInfo = mediaInfo.Get(eStreamType.Audio, i, "Duration");
                if (!String.IsNullOrEmpty(milInfo))
                {
                    AppendLeaf(xmlDoc, subNode, "duration", (double.Parse(milInfo, CultureInfo.InvariantCulture) / 1000d).ToString(CultureInfo.InvariantCulture), null);
                    AppendLeaf(xmlDoc, subNode, "duration2", TimeSpan.FromSeconds(((long)double.Parse(milInfo, CultureInfo.InvariantCulture) / 1000)).ToString(), null);
                }


                AppendLeaf(xmlDoc, subNode, "size", mediaInfo.Get(eStreamType.Audio, i, "StreamSize"), null);
                AppendLeaf(xmlDoc, subNode, "title", mediaInfo.Get(eStreamType.Audio, i, "Title"), null);
                AppendLeaf(xmlDoc, subNode, "bitrate", mediaInfo.Get(eStreamType.Audio, i, "BitRate"), null);
                milInfo = mediaInfo.Get(eStreamType.Audio, i, "BitRate");
                if (!String.IsNullOrEmpty(milInfo))
                {
                    AppendLeaf(xmlDoc, subNode, "bitrate2", ((long)double.Parse(milInfo, CultureInfo.InvariantCulture) / 1000).ToString(), new String[, ] {
                        { "unit", "kbit/s" }
                    });
                }
                AppendLeaf(xmlDoc, subNode, "language", mediaInfo.Get(eStreamType.Audio, i, "Language"), null);
                //AppendLeaf(xmlDoc, subNode, "identifier", mi.Get(StreamKind.Audio, i, ""));
                AppendLeaf(xmlDoc, subNode, "twocc", mediaInfo.Get(eStreamType.Audio, i, "Codec"), null);
                AppendLeaf(xmlDoc, subNode, "channels", mediaInfo.Get(eStreamType.Audio, i, "Channel(s)"), null);
                AppendLeaf(xmlDoc, subNode, "sampling_rate", mediaInfo.Get(eStreamType.Audio, i, "SamplingRate"), null);
                AppendLeaf(xmlDoc, subNode, "mode", mediaInfo.Get(eStreamType.Audio, i, "BitRate_Mode"), null);
                AppendLeaf(xmlDoc, subNode, "sample_count", mediaInfo.Get(eStreamType.Audio, i, "SamplingCount"), null);
            }

            streamCount = mediaInfo.Count_Get(eStreamType.Text);
            for (int i = 0; i < streamCount; i++)
            {
                subNode = node.AppendChild(xmlDoc.CreateElement("subtitles"));
                //AppendLeaf(xmlDoc, subNode, "size", mi.Get(StreamKind.Text, i, ""));
                AppendLeaf(xmlDoc, subNode, "title", mediaInfo.Get(eStreamType.Text, i, "Title"), null);
                AppendLeaf(xmlDoc, subNode, "language", mediaInfo.Get(eStreamType.Text, i, "Language"), null);
                AppendLeaf(xmlDoc, subNode, "identifier", mediaInfo.Get(eStreamType.Text, i, "Codec"), null);
            }
            mediaInfo.Close();

            return(xmlDoc);
        }
示例#6
0
文件: Info.cs 项目: asfdfdfd/AniDB
        public static XmlDocument CreateAVDumpLog(InfoProviderBase p)
        {
            XmlDocument xmlDoc = new XmlDocument();
            Func <InfoProviderBase, string> getName = (provider) => {
                string name;
                if (provider is MatroskaProvider)
                {
                    name = "mkv";
                }
                else if (provider is MediaInfoProvider)
                {
                    name = "mil";
                }
                else if (provider is OgmOggProvider)
                {
                    name = "ogm";
                }
                else if (provider is HashInfoProvider)
                {
                    name = "hash";
                }
                else if (provider is FileExtensionProvider)
                {
                    name = "ext";
                }
                else
                {
                    name = "";
                }
                return(name);
            };
            Func <string, string, string, XmlNode> createNode = (name, value, pName) => {
                var n = xmlDoc.CreateElement(name);
                if (value != null)
                {
                    n.AppendChild(xmlDoc.CreateTextNode(value));
                }
                //if(!string.IsNullOrEmpty(pName)) n.Attributes.Append(xmlDoc.CreateAttribute("p")).Value = pName;
                return(n);
            };
            Action <XmlNode, string, string>           addAttribute = (n, name, value) => { n.Attributes.Append(xmlDoc.CreateAttribute(name)).Value = value; };
            Func <StreamType, TrackEntrySection.Types> convertEnum  = t => t == StreamType.Audio ? TrackEntrySection.Types.Audio : (t == StreamType.Video ? TrackEntrySection.Types.Video : (t == StreamType.Text ? TrackEntrySection.Types.Subtitle : 0));

            var toAcreqName = new Dictionary <EntryKey, string>();

            toAcreqName[EntryKey.MuxingApp]      = "app";
            toAcreqName[EntryKey.EncodeLibrary]  = "encoder";
            toAcreqName[EntryKey.WritingApp]     = "lib";
            toAcreqName[EntryKey.CodecId]        = "identifier";
            toAcreqName[EntryKey.CodecIdAlt]     = "identifier2";
            toAcreqName[EntryKey.FrameRate]      = "fps";
            toAcreqName[EntryKey.FrameCount]     = "sample_count";
            toAcreqName[EntryKey.SampleCount]    = "sample_count";
            toAcreqName[EntryKey.EncodeSettings] = "settings";
            toAcreqName[EntryKey.ChannelCount]   = "channels";
            toAcreqName[EntryKey.SamplingRate]   = "sampling_rate";
            toAcreqName[EntryKey.FileExtension]  = "file_extension";
            toAcreqName[EntryKey.Extension]      = "extension";
            toAcreqName[EntryKey.CodecName]      = "codec_name";
            toAcreqName[EntryKey.Overhead]       = "extra_size";
            toAcreqName[EntryKey.BitrateMode]    = "mode";
            toAcreqName[EntryKey.DAR]            = "ar";
            toAcreqName[EntryKey.VFR]            = null;
            toAcreqName[EntryKey.TrackNumber]    = null;
            toAcreqName[EntryKey.MaxFrameRate]   = null;
            toAcreqName[EntryKey.MinFrameRate]   = null;

            var fileNode = xmlDoc.AppendChild(xmlDoc.CreateElement("file"));
            var avmfNode = xmlDoc.CreateElement("avmf");
            var lookUp   = new Dictionary <KeyValuePair <StreamType, int>, XmlNode>();

            XmlNode node, fpsNode = null;
            CompositeInfoProvider comp = (CompositeInfoProvider)p;

            foreach (var entry in p)
            {
                var pair = new KeyValuePair <StreamType, int>(entry.Key.Type, entry.Key.Index);

                if (pair.Key == StreamType.Text && (entry.Key.Entry == EntryKey.Bitrate || entry.Key.Entry == EntryKey.Duration || entry.Key.Entry == EntryKey.BitrateMode))
                {
                    continue;
                }

                if (!lookUp.TryGetValue(pair, out node))
                {
                    switch (pair.Key)
                    {
                    case StreamType.General: node = entry.Key.Entry == EntryKey.Size ? fileNode : avmfNode; break;

                    case StreamType.Video:
                        lookUp[pair] = node = xmlDoc.CreateElement("video"); avmfNode.AppendChild(node);

                        if (comp.GetProvider <MatroskaProvider>() != null)
                        {
                            var matroskaFile = comp.GetProvider <MatroskaProvider>().MFI;
                            var subNode      = node.AppendChild(createNode("res_d", null, "mkv"));
                            addAttribute(subNode, "width", matroskaFile.Segment.Tracks[TrackEntrySection.Types.Video, entry.Key.Index].Video.DisplayWidth.ToString());
                            addAttribute(subNode, "height", matroskaFile.Segment.Tracks[TrackEntrySection.Types.Video, entry.Key.Index].Video.DisplayHeight.ToString());
                        }
                        break;

                    case StreamType.Audio: lookUp[pair] = node = xmlDoc.CreateElement("audio"); avmfNode.AppendChild(node); break;

                    case StreamType.Text: lookUp[pair] = node = xmlDoc.CreateElement("subtitles"); avmfNode.AppendChild(node); break;

                    case StreamType.Unkown: lookUp[pair] = node = xmlDoc.CreateElement("unkownstream"); avmfNode.AppendChild(node); break;

                    case StreamType.Hash: lookUp[pair] = node = fileNode; break;

                    case StreamType.Chapter: break;

                    default: break;
                    }

                    if (comp.GetProvider <MatroskaProvider>() != null)
                    {
                        var matroskaFile = comp.GetProvider <MatroskaProvider>().MFI;

                        if (pair.Key == StreamType.Audio || pair.Key == StreamType.Video || pair.Key == StreamType.Text)
                        {
                            if ((matroskaFile.Segment.Tracks[convertEnum(pair.Key), entry.Key.Index].TrackFlags & TrackEntrySection.Options.Default) != 0)
                            {
                                addAttribute(node, "default", "1");
                            }
                        }
                    }
                }


                string name, value;
                if (!toAcreqName.TryGetValue(entry.Key.Entry, out name))
                {
                    name = entry.Key.Entry.ToString().ToLower();
                }
                else if (name == null)
                {
                    continue;
                }
                if (entry.Key.Entry == EntryKey.Date)
                {
                    try {
                        value = Convert.ToString((int)(DateTime.ParseExact(entry.Value, "yyyy.MM.dd HH.mm.ss.ffff", CultureInfo.InvariantCulture) - new DateTime(1970, 1, 1)).TotalSeconds, 16);
                    } catch (Exception) { continue; }
                }
                else
                {
                    value = entry.Value;
                }

                if (entry.Key.Entry == EntryKey.ColorBitDepth && pair.Key == StreamType.Video && ("8".Equals(entry.Value) || "0".Equals(entry.Value)))
                {
                    continue;
                }

                if (entry.Key.Type == StreamType.Hash)
                {
                    node.AppendChild(createNode(entry.Unit.ToLower(), entry.Value.ToLower(), "hash"));
                }
                else if (entry.Key.Entry == EntryKey.FrameRate && pair.Key == StreamType.Video)
                {
                    var vfrInfo    = p[StreamType.Video, entry.Key.Index, EntryKey.VFR];
                    var maxFpsInfo = p[StreamType.Video, entry.Key.Index, EntryKey.MaxFrameRate];
                    var minFpsInfo = p[StreamType.Video, entry.Key.Index, EntryKey.MinFrameRate];

                    fpsNode = node.AppendChild(createNode(name, value.Equals("") ? null : value, getName(entry.Provider)));
                    //fpsNode = node.AppendChild(createNode(name, null, getName(entry.Provider)));


                    if (vfrInfo != null)
                    {
                        addAttribute(fpsNode, "avg", vfrInfo.Value);
                    }
                    if (maxFpsInfo != null)
                    {
                        addAttribute(fpsNode, "max", maxFpsInfo.Value);
                    }
                    if (minFpsInfo != null)
                    {
                        addAttribute(fpsNode, "min", minFpsInfo.Value);
                    }
                    //if(!value.Equals("")) addAttribute(fpsNode, "entry", value);

                    if (comp.GetProvider <MatroskaProvider>() != null)
                    {
                        var matroskaProvider = comp.GetProvider <MatroskaProvider>();
                        var trackInfo        = matroskaProvider.MFI.Segment.Cluster.Tracks[int.Parse(matroskaProvider[StreamType.Video, entry.Key.Index, EntryKey.TrackNumber].Value)].TrackInfo;
                        if (trackInfo != null && trackInfo.FPSTable != null)
                        {
                            fpsNode = node.AppendChild(createNode("fpshistogram", null, getName(matroskaProvider)));
                            if (trackInfo.FPSTable.Count() > 10)
                            {
                                addAttribute(fpsNode, "compressed", "k-means");

                                var cluster = KMeansPP(10, trackInfo.FPSTable.ToArray());
                                for (int i = 0; i < cluster.Length; i++)
                                {
                                    var fpsEntryNode = fpsNode.AppendChild(xmlDoc.CreateElement("entry"));
                                    addAttribute(fpsEntryNode, "fps", cluster[i][0].ToString("0.000"));
                                    addAttribute(fpsEntryNode, "count", cluster[i][1].ToString());
                                }
                            }
                            else
                            {
                                foreach (var item in trackInfo.FPSTable)
                                {
                                    var fpsEntryNode = fpsNode.AppendChild(xmlDoc.CreateElement("entry"));
                                    addAttribute(fpsEntryNode, "fps", item.Key.ToString("0.000"));
                                    addAttribute(fpsEntryNode, "count", item.Value.ToString());
                                }
                            }
                        }
                    }
                }
                else if ((entry.Key.Entry == EntryKey.Width || entry.Key.Entry == EntryKey.Height) && pair.Key == StreamType.Video)
                {
                    if (node["res_p"] == null)
                    {
                        var subNode = node["res_d"] == null ? node["ar"] : node["res_d"];
                        if (subNode != null)
                        {
                            node.InsertBefore(xmlDoc.CreateElement("res_p"), subNode);
                        }
                        else
                        {
                            node.AppendChild(xmlDoc.CreateElement("res_p"));
                        }
                    }
                    node["res_p"].Attributes.Append(xmlDoc.CreateAttribute(entry.Key.Entry == EntryKey.Width ? "width" : "height")).Value = entry.Value;
                }
                else
                {
                    //if(name.Equals("idenfitier") && value.Equals("-- --") || value.Equals("")) {
                    //    return null;
                    //}
                    node.AppendChild(createNode(name, value, getName(entry.Provider)));
                }
            }
            fileNode.AppendChild(avmfNode);

            XmlNode chaptersNode;

            if (comp.GetProvider <MatroskaProvider>() != null)
            {
                var matroskaFile = comp.GetProvider <MatroskaProvider>().MFI;

                if (matroskaFile.Segment.Attachments != null)
                {
                    fileNode.AppendChild(createNode("extra_size", matroskaFile.Segment.Attachments.SectionSize.Value.ToString(), "mkv"));
                }
                if (matroskaFile.Segment.SegmentInfo.PreviousUId != null)
                {
                    avmfNode.AppendChild(createNode("previous_uid", new Guid(matroskaFile.Segment.SegmentInfo.PreviousUId).ToString(), "mkv"));
                }
                if (matroskaFile.Segment.SegmentInfo.NextUId != null)
                {
                    avmfNode.AppendChild(createNode("next_uid", new Guid(matroskaFile.Segment.SegmentInfo.NextUId).ToString(), "mkv"));
                }
                if (matroskaFile.Segment.SegmentInfo.PreviousFilename != null)
                {
                    avmfNode.AppendChild(createNode("previous_filename", matroskaFile.Segment.SegmentInfo.PreviousFilename, "mkv"));
                }
                if (matroskaFile.Segment.SegmentInfo.NextFilename != null)
                {
                    avmfNode.AppendChild(createNode("next_filename", matroskaFile.Segment.SegmentInfo.NextFilename, "mkv"));
                }
                if (matroskaFile.Segment.SegmentInfo.SegmentUId != null)
                {
                    avmfNode.AppendChild(createNode("segment_uid", new Guid(matroskaFile.Segment.SegmentInfo.SegmentUId).ToString(), "mkv"));
                }
                if (matroskaFile.Segment.Chapters != null)
                {
                    foreach (var chapter in matroskaFile.Segment.Chapters)
                    {
                        chaptersNode = xmlDoc.CreateElement("Chapters");
                        CreateChaptersNode(xmlDoc, chaptersNode, (EditionEntrySection)chapter.Value);
                        if (chaptersNode.HasChildNodes)
                        {
                            avmfNode.AppendChild(chaptersNode);
                        }
                    }
                }
            }
            else if (comp.GetProvider <MediaInfoProvider>() != null)
            {
                var mil = comp.GetProvider <MediaInfoProvider>().MIL;

                chaptersNode = xmlDoc.CreateElement("Chapters");
                try { CreateChaptersNode(xmlDoc, chaptersNode, mil); } catch (Exception) { chaptersNode.RemoveAll(); }
                if (chaptersNode.HasChildNodes)
                {
                    avmfNode.AppendChild(chaptersNode);
                }
            }

            if (avmfNode["audio"] == null && avmfNode["video"] == null && avmfNode["duration"] != null)
            {
                avmfNode.RemoveChild(avmfNode["duration"]);
            }

            return(xmlDoc);
        }
示例#7
0
 /// <summary>
 /// Can be used to determine if the slow provider update has completed.
 /// </summary>
 /// <returns></returns>
 public bool AllSlowUpdateTasksCompleted()
 {
     return(InfoProviderBase.AllSlowUpdateTasksCompleted());
 }
示例#8
0
 /// <summary>
 /// Creates a task that will start all infoProvider slow update queues
 /// Method returns as soon as the task is started, i.e. not necessary once it's completed
 /// Use WaitForSlowProviderUpdateToComplete()
 /// </summary>
 public void BeginSlowProviderUpdate(List <InfoProviderType> providersToUpdate)
 {
     InfoProviderBase.InitiateSlowTasks(providersToUpdate);
 }
示例#9
0
 /// <summary>
 /// If the slowupdate task is running this will return once it is complete.
 /// If the task is not running this will return immediately.
 /// </summary>
 public void WaitForSlowProviderUpdateToComplete()
 {
     InfoProviderBase.WaitForSlowTasksToComplete();
 }