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;
}
}