CSharpRTMP.Core.Streaming.StreamsManager.GetMetaData C# (CSharp) Method

GetMetaData() public method

public GetMetaData ( string streamName, bool extractInnerMetadata, Variant configuration ) : Variant
streamName string
extractInnerMetadata bool
configuration Variant
return Variant
        public Variant GetMetaData(string streamName, bool extractInnerMetadata, Variant configuration)
        {
            bool keyframeSeek = configuration[Defines.CONF_APPLICATION_KEYFRAMESEEK];
            int clientSideBuffer = configuration[Defines.CONF_APPLICATION_CLIENTSIDEBUFFER];
            var seekGranularity = (uint)((double)configuration[Defines.CONF_APPLICATION_SEEKGRANULARITY] * 1000);
            bool renameBadFiles = configuration[Defines.CONF_APPLICATION_RENAMEBADFILES];
            bool externSeekGenerator = configuration[Defines.CONF_APPLICATION_EXTERNSEEKGENERATOR];
            var result = Variant.Get();
            result[Defines.META_REQUESTED_STREAM_NAME] = streamName;
            result[Defines.CONF_APPLICATION_KEYFRAMESEEK] = keyframeSeek;
            result[Defines.CONF_APPLICATION_CLIENTSIDEBUFFER] = clientSideBuffer;
            result[Defines.CONF_APPLICATION_SEEKGRANULARITY] = seekGranularity;
            result[Defines.CONF_APPLICATION_RENAMEBADFILES] = renameBadFiles;
            result[Defines.CONF_APPLICATION_EXTERNSEEKGENERATOR] = externSeekGenerator;
            var parts = streamName.Split(':');
            if (parts.Length != 1 && parts.Length != 2 && parts.Length != 5)
            {
                Logger.FATAL("Invalid stream name format:{0}", streamName);
                return result;
            }
            result[Defines.META_MEDIA_TYPE] = parts.Length == 1 ? Defines.MEDIA_TYPE_LIVE_OR_FLV : parts[0].ToLower();
            var searchFor = "";
            switch ((string)result[Defines.META_MEDIA_TYPE])
            {
                case Defines.MEDIA_TYPE_LIVE_OR_FLV:
                    searchFor = parts[0] + ".flv";
                    break;
                case Defines.MEDIA_TYPE_MP3:
                    searchFor = parts[1] + ".mp3";
                    break;
                default:
                    searchFor = parts[1];
                    break;
            }
            result[Defines.META_SERVER_FILE_NAME] = searchFor;
            var _mediaFolder = Application.MediaPath;
            result[Defines.META_SERVER_MEDIA_DIR] = _mediaFolder;

            result[Defines.META_SERVER_FULL_PATH] = searchFor[0] == Path.DirectorySeparatorChar
                ? (searchFor.StartsWith(_mediaFolder.NormalizePath())
                    ? searchFor
                    : "")
                : _mediaFolder.NormalizePath(searchFor);
            if (string.IsNullOrEmpty(result[Defines.META_SERVER_FULL_PATH])) return result;
            var metaPath = result[Defines.META_SERVER_FULL_PATH] + "." + Defines.MEDIA_TYPE_META;
            var seekPath = result[Defines.META_SERVER_FULL_PATH] + "." + Defines.MEDIA_TYPE_SEEK;
            var regenerateFiles = true;
            if (File.Exists(metaPath) && File.Exists(seekPath))
            {
                var capabilities = new StreamCapabilities();
                var originalServerFullPath = (string)result[Defines.META_SERVER_FULL_PATH];
                regenerateFiles =
                (new FileInfo(metaPath).LastWriteTime < new FileInfo(result[Defines.META_SERVER_FULL_PATH]).LastWriteTime)
                || (new FileInfo(seekPath).LastWriteTime < new FileInfo(result[Defines.META_SERVER_FULL_PATH]).LastWriteTime)
                || !Variant.DeserializeFromFile(metaPath, out result)
                || (!StreamCapabilities.Deserialize(seekPath, capabilities));
                regenerateFiles |=
                        (result[Defines.META_SERVER_FULL_PATH] == null)
                        || ((string)result[Defines.META_SERVER_FULL_PATH] != originalServerFullPath)
                        || (result[Defines.CONF_APPLICATION_KEYFRAMESEEK] == null)
                        || ((bool)result[Defines.CONF_APPLICATION_KEYFRAMESEEK] != keyframeSeek)
                        || (result[Defines.CONF_APPLICATION_CLIENTSIDEBUFFER] == null)
                        || ((int)result[Defines.CONF_APPLICATION_CLIENTSIDEBUFFER] != clientSideBuffer)
                        || (result[Defines.CONF_APPLICATION_SEEKGRANULARITY] == null)
                        || ((uint)result[Defines.CONF_APPLICATION_SEEKGRANULARITY] != seekGranularity);
                if (regenerateFiles)
                {
                    result[Defines.META_SERVER_FULL_PATH] = originalServerFullPath;
                    result[Defines.CONF_APPLICATION_KEYFRAMESEEK] = keyframeSeek;
                    result[Defines.CONF_APPLICATION_CLIENTSIDEBUFFER] = clientSideBuffer;
                    result[Defines.CONF_APPLICATION_SEEKGRANULARITY] = seekGranularity;
                }
            }
            if (!regenerateFiles)
            {
                result[Defines.META_REQUESTED_STREAM_NAME] = streamName;
                return result;
            }
            this.Log().Info("Generate seek/meta for file {0}", result[Defines.META_SERVER_FULL_PATH]);
            //8. We either have a bad meta file or we don't have it at all. Build it
            if (extractInnerMetadata)
            {
                if (!BaseInFileStream.ResolveCompleteMetadata(ref result))
                {
                    Logger.FATAL("Unable to get metadata. Partial result:\n{0}",
                            result);
                    return Variant.Get();
                }
            }
            result.SerializeToFile(metaPath);
            return result;
        }
    }