mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-07-13 01:33:04 +01:00
added media profiles
This commit is contained in:
@@ -12,7 +12,7 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||
|
||||
public DlnaProfileType MediaType { get; set; }
|
||||
|
||||
public string FileFormat { get; set; }
|
||||
public string Container { get; set; }
|
||||
|
||||
public string MimeType { get; set; }
|
||||
|
||||
|
||||
@@ -42,8 +42,7 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||
if (directPlay != null)
|
||||
{
|
||||
playlistItem.Transcode = false;
|
||||
playlistItem.FileFormat = Path.GetExtension(item.Path);
|
||||
playlistItem.MimeType = directPlay.MimeType;
|
||||
playlistItem.Container = Path.GetExtension(item.Path);
|
||||
|
||||
return playlistItem;
|
||||
}
|
||||
@@ -55,10 +54,11 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||
{
|
||||
playlistItem.Transcode = true;
|
||||
|
||||
playlistItem.FileFormat = "." + transcodingProfile.Container.TrimStart('.');
|
||||
playlistItem.MimeType = transcodingProfile.MimeType;
|
||||
playlistItem.Container = "." + transcodingProfile.Container.TrimStart('.');
|
||||
}
|
||||
|
||||
AttachMediaProfile(playlistItem, profile);
|
||||
|
||||
return playlistItem;
|
||||
}
|
||||
|
||||
@@ -76,8 +76,7 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||
if (directPlay != null)
|
||||
{
|
||||
playlistItem.Transcode = false;
|
||||
playlistItem.FileFormat = Path.GetExtension(item.Path);
|
||||
playlistItem.MimeType = directPlay.MimeType;
|
||||
playlistItem.Container = Path.GetExtension(item.Path);
|
||||
|
||||
return playlistItem;
|
||||
}
|
||||
@@ -89,10 +88,11 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||
{
|
||||
playlistItem.Transcode = true;
|
||||
|
||||
playlistItem.FileFormat = "." + transcodingProfile.Container.TrimStart('.');
|
||||
playlistItem.MimeType = transcodingProfile.MimeType;
|
||||
playlistItem.Container = "." + transcodingProfile.Container.TrimStart('.');
|
||||
}
|
||||
|
||||
AttachMediaProfile(playlistItem, profile);
|
||||
|
||||
return playlistItem;
|
||||
}
|
||||
|
||||
@@ -119,8 +119,7 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||
if (directPlay != null)
|
||||
{
|
||||
playlistItem.Transcode = false;
|
||||
playlistItem.FileFormat = Path.GetExtension(item.Path);
|
||||
playlistItem.MimeType = directPlay.MimeType;
|
||||
playlistItem.Container = Path.GetExtension(item.Path);
|
||||
|
||||
return playlistItem;
|
||||
}
|
||||
@@ -131,25 +130,55 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||
if (transcodingProfile != null)
|
||||
{
|
||||
playlistItem.Transcode = true;
|
||||
|
||||
playlistItem.FileFormat = "." + transcodingProfile.Container.TrimStart('.');
|
||||
playlistItem.MimeType = transcodingProfile.MimeType;
|
||||
playlistItem.Container = "." + transcodingProfile.Container.TrimStart('.');
|
||||
}
|
||||
|
||||
AttachMediaProfile(playlistItem, profile);
|
||||
|
||||
return playlistItem;
|
||||
}
|
||||
|
||||
private void AttachMediaProfile(PlaylistItem item, DeviceProfile profile)
|
||||
{
|
||||
var mediaProfile = GetMediaProfile(item, profile);
|
||||
|
||||
if (mediaProfile != null)
|
||||
{
|
||||
item.MimeType = (mediaProfile.MimeType ?? string.Empty).Split('/').LastOrDefault();
|
||||
|
||||
// TODO: Org_pn?
|
||||
}
|
||||
}
|
||||
|
||||
private MediaProfile GetMediaProfile(PlaylistItem item, DeviceProfile profile)
|
||||
{
|
||||
return profile.MediaProfiles.FirstOrDefault(i =>
|
||||
{
|
||||
if (i.Type == item.MediaType)
|
||||
{
|
||||
if (string.Equals(item.Container.TrimStart('.'), i.Container.TrimStart('.'), StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
// TODO: Enforce codecs
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
private bool IsSupported(DirectPlayProfile profile, Photo item)
|
||||
{
|
||||
var mediaPath = item.Path;
|
||||
|
||||
// Check container type
|
||||
var mediaContainer = Path.GetExtension(mediaPath);
|
||||
|
||||
if (!profile.Containers.Any(i => string.Equals("." + i.TrimStart('.'), mediaContainer, StringComparison.OrdinalIgnoreCase)))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check additional conditions
|
||||
if (!profile.Conditions.Any(i => IsConditionSatisfied(i, mediaPath, null, null)))
|
||||
{
|
||||
return false;
|
||||
@@ -162,13 +191,14 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||
{
|
||||
var mediaPath = item.Path;
|
||||
|
||||
// Check container type
|
||||
var mediaContainer = Path.GetExtension(mediaPath);
|
||||
|
||||
if (!profile.Containers.Any(i => string.Equals("." + i.TrimStart('.'), mediaContainer, StringComparison.OrdinalIgnoreCase)))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check additional conditions
|
||||
if (!profile.Conditions.Any(i => IsConditionSatisfied(i, mediaPath, null, audioStream)))
|
||||
{
|
||||
return false;
|
||||
@@ -186,13 +216,34 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||
|
||||
var mediaPath = item.Path;
|
||||
|
||||
// Check container type
|
||||
var mediaContainer = Path.GetExtension(mediaPath);
|
||||
|
||||
if (!profile.Containers.Any(i => string.Equals("." + i.TrimStart('.'), mediaContainer, StringComparison.OrdinalIgnoreCase)))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check video codec
|
||||
if (profile.VideoCodecs.Length > 0)
|
||||
{
|
||||
var videoCodec = videoStream == null ? null : videoStream.Codec;
|
||||
if (string.IsNullOrWhiteSpace(videoCodec) || !profile.VideoCodecs.Contains(videoCodec, StringComparer.OrdinalIgnoreCase))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (profile.AudioCodecs.Length > 0)
|
||||
{
|
||||
// Check audio codecs
|
||||
var audioCodec = audioStream == null ? null : audioStream.Codec;
|
||||
if (string.IsNullOrWhiteSpace(audioCodec) || !profile.AudioCodecs.Contains(audioCodec, StringComparer.OrdinalIgnoreCase))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Check additional conditions
|
||||
if (!profile.Conditions.Any(i => IsConditionSatisfied(i, mediaPath, videoStream, audioStream)))
|
||||
{
|
||||
return false;
|
||||
@@ -283,6 +334,8 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||
return videoStream == null ? null : videoStream.Height;
|
||||
case ProfileConditionValue.VideoWidth:
|
||||
return videoStream == null ? null : videoStream.Width;
|
||||
case ProfileConditionValue.VideoLevel:
|
||||
return videoStream == null ? null : ConvertToLong(videoStream.Level);
|
||||
default:
|
||||
throw new InvalidOperationException("Unexpected Property");
|
||||
}
|
||||
@@ -297,5 +350,15 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||
{
|
||||
return val.HasValue ? Convert.ToInt64(val.Value) : (long?)null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Converts to long.
|
||||
/// </summary>
|
||||
/// <param name="val">The value.</param>
|
||||
/// <returns>System.Nullable{System.Int64}.</returns>
|
||||
private long? ConvertToLong(double? val)
|
||||
{
|
||||
return val.HasValue ? Convert.ToInt64(val.Value) : (long?)null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,39 +24,39 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||
|
||||
var contentFeatures = string.Empty;
|
||||
|
||||
if (string.Equals(item.FileFormat, "mp3", StringComparison.OrdinalIgnoreCase))
|
||||
if (string.Equals(item.Container, "mp3", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
contentFeatures = "DLNA.ORG_PN=MP3";
|
||||
}
|
||||
else if (string.Equals(item.FileFormat, "wma", StringComparison.OrdinalIgnoreCase))
|
||||
else if (string.Equals(item.Container, "wma", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
contentFeatures = "DLNA.ORG_PN=WMABASE";
|
||||
}
|
||||
else if (string.Equals(item.FileFormat, "wmw", StringComparison.OrdinalIgnoreCase))
|
||||
else if (string.Equals(item.Container, "wmw", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
contentFeatures = "DLNA.ORG_PN=WMVMED_BASE";
|
||||
}
|
||||
else if (string.Equals(item.FileFormat, "asf", StringComparison.OrdinalIgnoreCase))
|
||||
else if (string.Equals(item.Container, "asf", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
contentFeatures = "DLNA.ORG_PN=WMVMED_BASE";
|
||||
}
|
||||
else if (string.Equals(item.FileFormat, "avi", StringComparison.OrdinalIgnoreCase))
|
||||
else if (string.Equals(item.Container, "avi", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
contentFeatures = "DLNA.ORG_PN=AVI";
|
||||
}
|
||||
else if (string.Equals(item.FileFormat, "mkv", StringComparison.OrdinalIgnoreCase))
|
||||
else if (string.Equals(item.Container, "mkv", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
contentFeatures = "DLNA.ORG_PN=MATROSKA";
|
||||
}
|
||||
else if (string.Equals(item.FileFormat, "mp4", StringComparison.OrdinalIgnoreCase))
|
||||
else if (string.Equals(item.Container, "mp4", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
contentFeatures = "DLNA.ORG_PN=AVC_MP4_MP_HD_720p_AAC";
|
||||
}
|
||||
else if (string.Equals(item.FileFormat, "mpeg", StringComparison.OrdinalIgnoreCase))
|
||||
else if (string.Equals(item.Container, "mpeg", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
contentFeatures = "DLNA.ORG_PN=MPEG_PS_PAL";
|
||||
}
|
||||
else if (string.Equals(item.FileFormat, "ts", StringComparison.OrdinalIgnoreCase))
|
||||
else if (string.Equals(item.Container, "ts", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
contentFeatures = "DLNA.ORG_PN=MPEG_PS_PAL";
|
||||
}
|
||||
@@ -85,7 +85,7 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||
internal static string GetAudioUrl(PlaylistItem item, string serverAddress)
|
||||
{
|
||||
if (!item.Transcode)
|
||||
return string.Format("{0}/audio/{1}/stream{2}?Static=True", serverAddress, item.ItemId, item.FileFormat);
|
||||
return string.Format("{0}/audio/{1}/stream{2}?Static=True", serverAddress, item.ItemId, item.Container);
|
||||
|
||||
return string.Format("{0}/audio/{1}/stream.mp3?AudioCodec=Mp3", serverAddress, item.ItemId);
|
||||
}
|
||||
@@ -108,7 +108,7 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||
if (!item.Transcode)
|
||||
{
|
||||
dlnaCommand = BuildDlnaUrl(deviceProperties.UUID, !item.Transcode, null, null, null, null, null, null, null, null, null, null, item.MimeType);
|
||||
return string.Format("{0}/Videos/{1}/stream{2}?{3}", serverAddress, item.ItemId, item.FileFormat, dlnaCommand);
|
||||
return string.Format("{0}/Videos/{1}/stream{2}?{3}", serverAddress, item.ItemId, item.Container, dlnaCommand);
|
||||
}
|
||||
var videostream = streams.Where(m => m.Type == MediaStreamType.Video).OrderBy(m => m.IsDefault).FirstOrDefault();
|
||||
var audiostream = streams.Where(m => m.Type == MediaStreamType.Audio).OrderBy(m => m.IsDefault).FirstOrDefault();
|
||||
@@ -129,7 +129,7 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||
}
|
||||
|
||||
dlnaCommand = BuildDlnaUrl(deviceProperties.UUID, !item.Transcode, videoCodec, audioCodec, null, null, videoBitrate, audioChannels, audioBitrate, item.StartPositionTicks, "baseline", "3", item.MimeType);
|
||||
return string.Format("{0}/Videos/{1}/stream{2}?{3}", serverAddress, item.ItemId, item.FileFormat, dlnaCommand);
|
||||
return string.Format("{0}/Videos/{1}/stream{2}?{3}", serverAddress, item.ItemId, item.Container, dlnaCommand);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
Reference in New Issue
Block a user