commit
e8d370406b
|
@ -161,12 +161,6 @@ namespace Emby.Common.Implementations
|
||||||
/// <value>The name.</value>
|
/// <value>The name.</value>
|
||||||
public abstract string Name { get; }
|
public abstract string Name { get; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets a value indicating whether this instance is running as service.
|
|
||||||
/// </summary>
|
|
||||||
/// <value><c>true</c> if this instance is running as service; otherwise, <c>false</c>.</value>
|
|
||||||
public abstract bool IsRunningAsService { get; }
|
|
||||||
|
|
||||||
protected ICryptoProvider CryptographyProvider = new CryptographyProvider();
|
protected ICryptoProvider CryptographyProvider = new CryptographyProvider();
|
||||||
|
|
||||||
protected IEnvironmentInfo EnvironmentInfo { get; private set; }
|
protected IEnvironmentInfo EnvironmentInfo { get; private set; }
|
||||||
|
|
|
@ -67,7 +67,7 @@ namespace Emby.Dlna.Profiles
|
||||||
},
|
},
|
||||||
new DirectPlayProfile
|
new DirectPlayProfile
|
||||||
{
|
{
|
||||||
Container = "mp4",
|
Container = "mp4,m4v",
|
||||||
VideoCodec = "h264,mpeg4",
|
VideoCodec = "h264,mpeg4",
|
||||||
AudioCodec = "aac,ac3,mp3,dca,dts",
|
AudioCodec = "aac,ac3,mp3,dca,dts",
|
||||||
Type = DlnaProfileType.Video
|
Type = DlnaProfileType.Video
|
||||||
|
@ -203,7 +203,15 @@ namespace Emby.Dlna.Profiles
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
ResponseProfiles = new ResponseProfile[] { };
|
ResponseProfiles = new ResponseProfile[]
|
||||||
|
{
|
||||||
|
new ResponseProfile
|
||||||
|
{
|
||||||
|
Container = "m4v",
|
||||||
|
Type = DlnaProfileType.Video,
|
||||||
|
MimeType = "video/mp4"
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,12 +26,20 @@ namespace Emby.Dlna.Profiles
|
||||||
|
|
||||||
new DirectPlayProfile
|
new DirectPlayProfile
|
||||||
{
|
{
|
||||||
Container = "avi,mp4,mkv,ts",
|
Container = "avi,mp4,mkv,ts,m4v",
|
||||||
Type = DlnaProfileType.Video
|
Type = DlnaProfileType.Video
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
ResponseProfiles = new ResponseProfile[] { };
|
ResponseProfiles = new ResponseProfile[]
|
||||||
|
{
|
||||||
|
new ResponseProfile
|
||||||
|
{
|
||||||
|
Container = "m4v",
|
||||||
|
Type = DlnaProfileType.Video,
|
||||||
|
MimeType = "video/mp4"
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,7 +80,7 @@ namespace Emby.Dlna.Profiles
|
||||||
|
|
||||||
new DirectPlayProfile
|
new DirectPlayProfile
|
||||||
{
|
{
|
||||||
Container = "mp4",
|
Container = "mp4,m4v",
|
||||||
VideoCodec = "h264",
|
VideoCodec = "h264",
|
||||||
AudioCodec = "aac,ac3,mp3,pcm",
|
AudioCodec = "aac,ac3,mp3,pcm",
|
||||||
Type = DlnaProfileType.Video
|
Type = DlnaProfileType.Video
|
||||||
|
@ -208,6 +208,12 @@ namespace Emby.Dlna.Profiles
|
||||||
Container = "ts",
|
Container = "ts",
|
||||||
OrgPn = "MPEG_TS_SD_EU,MPEG_TS_SD_NA,MPEG_TS_SD_KO",
|
OrgPn = "MPEG_TS_SD_EU,MPEG_TS_SD_NA,MPEG_TS_SD_KO",
|
||||||
MimeType = "video/vnd.dlna.mpeg-tts"
|
MimeType = "video/vnd.dlna.mpeg-tts"
|
||||||
|
},
|
||||||
|
new ResponseProfile
|
||||||
|
{
|
||||||
|
Container = "m4v",
|
||||||
|
Type = DlnaProfileType.Video,
|
||||||
|
MimeType = "video/mp4"
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,7 @@ namespace Emby.Dlna.Profiles
|
||||||
{
|
{
|
||||||
new DirectPlayProfile
|
new DirectPlayProfile
|
||||||
{
|
{
|
||||||
Container = "mp4,mov",
|
Container = "mp4,mov,m4v",
|
||||||
Type = DlnaProfileType.Video,
|
Type = DlnaProfileType.Video,
|
||||||
VideoCodec = "h264,mpeg4",
|
VideoCodec = "h264,mpeg4",
|
||||||
AudioCodec = "aac"
|
AudioCodec = "aac"
|
||||||
|
@ -201,7 +201,15 @@ namespace Emby.Dlna.Profiles
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
ResponseProfiles = new ResponseProfile[] { };
|
ResponseProfiles = new ResponseProfile[]
|
||||||
|
{
|
||||||
|
new ResponseProfile
|
||||||
|
{
|
||||||
|
Container = "m4v",
|
||||||
|
Type = DlnaProfileType.Video,
|
||||||
|
MimeType = "video/mp4"
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,7 +77,7 @@ namespace Emby.Dlna.Profiles
|
||||||
},
|
},
|
||||||
new DirectPlayProfile
|
new DirectPlayProfile
|
||||||
{
|
{
|
||||||
Container = "mp4",
|
Container = "mp4,m4v",
|
||||||
VideoCodec = "h264,mpeg4",
|
VideoCodec = "h264,mpeg4",
|
||||||
AudioCodec = "mp3,aac",
|
AudioCodec = "mp3,aac",
|
||||||
Type = DlnaProfileType.Video
|
Type = DlnaProfileType.Video
|
||||||
|
@ -335,6 +335,12 @@ namespace Emby.Dlna.Profiles
|
||||||
Container = "flac",
|
Container = "flac",
|
||||||
MimeType = "audio/x-flac",
|
MimeType = "audio/x-flac",
|
||||||
Type = DlnaProfileType.Audio
|
Type = DlnaProfileType.Audio
|
||||||
|
},
|
||||||
|
new ResponseProfile
|
||||||
|
{
|
||||||
|
Container = "m4v",
|
||||||
|
Type = DlnaProfileType.Video,
|
||||||
|
MimeType = "video/mp4"
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -83,7 +83,7 @@ namespace Emby.Dlna.Profiles
|
||||||
},
|
},
|
||||||
new DirectPlayProfile
|
new DirectPlayProfile
|
||||||
{
|
{
|
||||||
Container = "avi,mp4",
|
Container = "avi,mp4,m4v",
|
||||||
VideoCodec = "mpeg4,h264",
|
VideoCodec = "mpeg4,h264",
|
||||||
AudioCodec = "ac3,aac,mp3,pcm",
|
AudioCodec = "ac3,aac,mp3,pcm",
|
||||||
Type = DlnaProfileType.Video
|
Type = DlnaProfileType.Video
|
||||||
|
@ -248,6 +248,13 @@ namespace Emby.Dlna.Profiles
|
||||||
Type = DlnaProfileType.Video
|
Type = DlnaProfileType.Video
|
||||||
},
|
},
|
||||||
|
|
||||||
|
new ResponseProfile
|
||||||
|
{
|
||||||
|
Container = "m4v",
|
||||||
|
MimeType = "video/mpeg",
|
||||||
|
Type = DlnaProfileType.Video
|
||||||
|
},
|
||||||
|
|
||||||
new ResponseProfile
|
new ResponseProfile
|
||||||
{
|
{
|
||||||
Container = "mpeg",
|
Container = "mpeg",
|
||||||
|
|
|
@ -80,7 +80,7 @@ namespace Emby.Dlna.Profiles
|
||||||
},
|
},
|
||||||
new DirectPlayProfile
|
new DirectPlayProfile
|
||||||
{
|
{
|
||||||
Container = "mp4",
|
Container = "mp4,m4v",
|
||||||
VideoCodec = "h264,mpeg4",
|
VideoCodec = "h264,mpeg4",
|
||||||
AudioCodec = "ac3,aac,mp3",
|
AudioCodec = "ac3,aac,mp3",
|
||||||
Type = DlnaProfileType.Video
|
Type = DlnaProfileType.Video
|
||||||
|
@ -211,6 +211,12 @@ namespace Emby.Dlna.Profiles
|
||||||
MimeType = "video/mpeg",
|
MimeType = "video/mpeg",
|
||||||
OrgPn="MPEG_PS_NTSC,MPEG_PS_PAL",
|
OrgPn="MPEG_PS_NTSC,MPEG_PS_PAL",
|
||||||
Type = DlnaProfileType.Video
|
Type = DlnaProfileType.Video
|
||||||
|
},
|
||||||
|
new ResponseProfile
|
||||||
|
{
|
||||||
|
Container = "m4v",
|
||||||
|
Type = DlnaProfileType.Video,
|
||||||
|
MimeType = "video/mp4"
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -80,7 +80,7 @@ namespace Emby.Dlna.Profiles
|
||||||
},
|
},
|
||||||
new DirectPlayProfile
|
new DirectPlayProfile
|
||||||
{
|
{
|
||||||
Container = "mp4",
|
Container = "mp4,m4v",
|
||||||
VideoCodec = "h264,mpeg4",
|
VideoCodec = "h264,mpeg4",
|
||||||
AudioCodec = "ac3,aac,mp3,mp2",
|
AudioCodec = "ac3,aac,mp3,mp2",
|
||||||
Type = DlnaProfileType.Video
|
Type = DlnaProfileType.Video
|
||||||
|
@ -199,6 +199,12 @@ namespace Emby.Dlna.Profiles
|
||||||
MimeType = "video/mpeg",
|
MimeType = "video/mpeg",
|
||||||
OrgPn="MPEG_PS_NTSC,MPEG_PS_PAL",
|
OrgPn="MPEG_PS_NTSC,MPEG_PS_PAL",
|
||||||
Type = DlnaProfileType.Video
|
Type = DlnaProfileType.Video
|
||||||
|
},
|
||||||
|
new ResponseProfile
|
||||||
|
{
|
||||||
|
Container = "m4v",
|
||||||
|
Type = DlnaProfileType.Video,
|
||||||
|
MimeType = "video/mp4"
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -79,7 +79,7 @@ namespace Emby.Dlna.Profiles
|
||||||
},
|
},
|
||||||
new DirectPlayProfile
|
new DirectPlayProfile
|
||||||
{
|
{
|
||||||
Container = "mp4",
|
Container = "mp4,m4v",
|
||||||
VideoCodec = "h264,mpeg4",
|
VideoCodec = "h264,mpeg4",
|
||||||
AudioCodec = "ac3,eac3,aac,mp3,mp2",
|
AudioCodec = "ac3,eac3,aac,mp3,mp2",
|
||||||
Type = DlnaProfileType.Video
|
Type = DlnaProfileType.Video
|
||||||
|
@ -255,6 +255,12 @@ namespace Emby.Dlna.Profiles
|
||||||
MimeType = "video/mpeg",
|
MimeType = "video/mpeg",
|
||||||
OrgPn="MPEG_PS_NTSC,MPEG_PS_PAL",
|
OrgPn="MPEG_PS_NTSC,MPEG_PS_PAL",
|
||||||
Type = DlnaProfileType.Video
|
Type = DlnaProfileType.Video
|
||||||
|
},
|
||||||
|
new ResponseProfile
|
||||||
|
{
|
||||||
|
Container = "m4v",
|
||||||
|
Type = DlnaProfileType.Video,
|
||||||
|
MimeType = "video/mp4"
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -79,7 +79,7 @@ namespace Emby.Dlna.Profiles
|
||||||
},
|
},
|
||||||
new DirectPlayProfile
|
new DirectPlayProfile
|
||||||
{
|
{
|
||||||
Container = "mp4",
|
Container = "mp4,m4v",
|
||||||
VideoCodec = "h264,mpeg4",
|
VideoCodec = "h264,mpeg4",
|
||||||
AudioCodec = "ac3,eac3,aac,mp3,mp2",
|
AudioCodec = "ac3,eac3,aac,mp3,mp2",
|
||||||
Type = DlnaProfileType.Video
|
Type = DlnaProfileType.Video
|
||||||
|
@ -255,6 +255,12 @@ namespace Emby.Dlna.Profiles
|
||||||
MimeType = "video/mpeg",
|
MimeType = "video/mpeg",
|
||||||
OrgPn="MPEG_PS_NTSC,MPEG_PS_PAL",
|
OrgPn="MPEG_PS_NTSC,MPEG_PS_PAL",
|
||||||
Type = DlnaProfileType.Video
|
Type = DlnaProfileType.Video
|
||||||
|
},
|
||||||
|
new ResponseProfile
|
||||||
|
{
|
||||||
|
Container = "m4v",
|
||||||
|
Type = DlnaProfileType.Video,
|
||||||
|
MimeType = "video/mp4"
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,7 @@ namespace Emby.Dlna.Profiles
|
||||||
},
|
},
|
||||||
new DirectPlayProfile
|
new DirectPlayProfile
|
||||||
{
|
{
|
||||||
Container = "mp4,mkv",
|
Container = "mp4,mkv,m4v",
|
||||||
Type = DlnaProfileType.Video,
|
Type = DlnaProfileType.Video,
|
||||||
VideoCodec = "h264,mpeg4",
|
VideoCodec = "h264,mpeg4",
|
||||||
AudioCodec = "aac,ac3"
|
AudioCodec = "aac,ac3"
|
||||||
|
@ -255,6 +255,13 @@ namespace Emby.Dlna.Profiles
|
||||||
Container = "wav",
|
Container = "wav",
|
||||||
MimeType = "audio/wav",
|
MimeType = "audio/wav",
|
||||||
Type = DlnaProfileType.Audio
|
Type = DlnaProfileType.Audio
|
||||||
|
},
|
||||||
|
|
||||||
|
new ResponseProfile
|
||||||
|
{
|
||||||
|
Container = "m4v",
|
||||||
|
Type = DlnaProfileType.Video,
|
||||||
|
MimeType = "video/mp4"
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,7 +87,7 @@ namespace Emby.Dlna.Profiles
|
||||||
|
|
||||||
new DirectPlayProfile
|
new DirectPlayProfile
|
||||||
{
|
{
|
||||||
Container = "mp4,mov",
|
Container = "mp4,mov,m4v",
|
||||||
Type = DlnaProfileType.Video,
|
Type = DlnaProfileType.Video,
|
||||||
VideoCodec = "h264,mpeg4",
|
VideoCodec = "h264,mpeg4",
|
||||||
AudioCodec = "ac3,aac,mp2,mp3,dca,dts"
|
AudioCodec = "ac3,aac,mp2,mp3,dca,dts"
|
||||||
|
|
|
@ -80,7 +80,7 @@ namespace Emby.Dlna.Profiles
|
||||||
},
|
},
|
||||||
new DirectPlayProfile
|
new DirectPlayProfile
|
||||||
{
|
{
|
||||||
Container = "mp4,mov,mkv",
|
Container = "mp4,mov,mkv,m4v",
|
||||||
VideoCodec = "h264,mpeg4,mpeg2video",
|
VideoCodec = "h264,mpeg4,mpeg2video",
|
||||||
AudioCodec = "aac,ac3",
|
AudioCodec = "aac,ac3",
|
||||||
Type = DlnaProfileType.Video
|
Type = DlnaProfileType.Video
|
||||||
|
@ -349,6 +349,12 @@ namespace Emby.Dlna.Profiles
|
||||||
Container = "avi",
|
Container = "avi",
|
||||||
MimeType = "video/avi",
|
MimeType = "video/avi",
|
||||||
Type = DlnaProfileType.Video
|
Type = DlnaProfileType.Video
|
||||||
|
},
|
||||||
|
new ResponseProfile
|
||||||
|
{
|
||||||
|
Container = "m4v",
|
||||||
|
Type = DlnaProfileType.Video,
|
||||||
|
MimeType = "video/mp4"
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
<DirectPlayProfiles>
|
<DirectPlayProfiles>
|
||||||
<DirectPlayProfile container="ts" audioCodec="aac,ac3,mp3,dca,dts" videoCodec="h264" type="Video" />
|
<DirectPlayProfile container="ts" audioCodec="aac,ac3,mp3,dca,dts" videoCodec="h264" type="Video" />
|
||||||
<DirectPlayProfile container="mkv" audioCodec="aac,ac3,mp3,dca,dts" videoCodec="h264" type="Video" />
|
<DirectPlayProfile container="mkv" audioCodec="aac,ac3,mp3,dca,dts" videoCodec="h264" type="Video" />
|
||||||
<DirectPlayProfile container="mp4" audioCodec="aac,ac3,mp3,dca,dts" videoCodec="h264,mpeg4" type="Video" />
|
<DirectPlayProfile container="mp4,m4v" audioCodec="aac,ac3,mp3,dca,dts" videoCodec="h264,mpeg4" type="Video" />
|
||||||
<DirectPlayProfile container="mp3" type="Audio" />
|
<DirectPlayProfile container="mp3" type="Audio" />
|
||||||
<DirectPlayProfile container="jpeg" type="Photo" />
|
<DirectPlayProfile container="jpeg" type="Photo" />
|
||||||
</DirectPlayProfiles>
|
</DirectPlayProfiles>
|
||||||
|
@ -79,7 +79,11 @@
|
||||||
<ApplyConditions />
|
<ApplyConditions />
|
||||||
</CodecProfile>
|
</CodecProfile>
|
||||||
</CodecProfiles>
|
</CodecProfiles>
|
||||||
<ResponseProfiles />
|
<ResponseProfiles>
|
||||||
|
<ResponseProfile container="m4v" type="Video" mimeType="video/mp4">
|
||||||
|
<Conditions />
|
||||||
|
</ResponseProfile>
|
||||||
|
</ResponseProfiles>
|
||||||
<SubtitleProfiles>
|
<SubtitleProfiles>
|
||||||
<SubtitleProfile format="srt" method="Embed" />
|
<SubtitleProfile format="srt" method="Embed" />
|
||||||
<SubtitleProfile format="srt" method="External" />
|
<SubtitleProfile format="srt" method="External" />
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
<XmlRootAttributes />
|
<XmlRootAttributes />
|
||||||
<DirectPlayProfiles>
|
<DirectPlayProfiles>
|
||||||
<DirectPlayProfile container="mp3,flac,m4a,wma" type="Audio" />
|
<DirectPlayProfile container="mp3,flac,m4a,wma" type="Audio" />
|
||||||
<DirectPlayProfile container="avi,mp4,mkv,ts" type="Video" />
|
<DirectPlayProfile container="avi,mp4,mkv,ts,m4v" type="Video" />
|
||||||
</DirectPlayProfiles>
|
</DirectPlayProfiles>
|
||||||
<TranscodingProfiles>
|
<TranscodingProfiles>
|
||||||
<TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" copyTimestamps="false" context="Streaming" enableSubtitlesInManifest="false" />
|
<TranscodingProfile container="mp3" type="Audio" audioCodec="mp3" estimateContentLength="false" enableMpegtsM2TsMode="false" transcodeSeekInfo="Auto" copyTimestamps="false" context="Streaming" enableSubtitlesInManifest="false" />
|
||||||
|
@ -43,7 +43,11 @@
|
||||||
</TranscodingProfiles>
|
</TranscodingProfiles>
|
||||||
<ContainerProfiles />
|
<ContainerProfiles />
|
||||||
<CodecProfiles />
|
<CodecProfiles />
|
||||||
<ResponseProfiles />
|
<ResponseProfiles>
|
||||||
|
<ResponseProfile container="m4v" type="Video" mimeType="video/mp4">
|
||||||
|
<Conditions />
|
||||||
|
</ResponseProfile>
|
||||||
|
</ResponseProfiles>
|
||||||
<SubtitleProfiles>
|
<SubtitleProfiles>
|
||||||
<SubtitleProfile format="srt" method="Embed" />
|
<SubtitleProfile format="srt" method="Embed" />
|
||||||
</SubtitleProfiles>
|
</SubtitleProfiles>
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
<DirectPlayProfile container="mpeg,mpg" audioCodec="ac3,mp3,pcm_dvd" videoCodec="mpeg2video,mpeg4" type="Video" />
|
<DirectPlayProfile container="mpeg,mpg" audioCodec="ac3,mp3,pcm_dvd" videoCodec="mpeg2video,mpeg4" type="Video" />
|
||||||
<DirectPlayProfile container="mkv" audioCodec="aac,ac3,dca,mp3,mp2,pcm,dts" videoCodec="h264,mpeg2video" type="Video" />
|
<DirectPlayProfile container="mkv" audioCodec="aac,ac3,dca,mp3,mp2,pcm,dts" videoCodec="h264,mpeg2video" type="Video" />
|
||||||
<DirectPlayProfile container="ts" audioCodec="aac,mp3,mp2" videoCodec="h264,mpeg2video" type="Video" />
|
<DirectPlayProfile container="ts" audioCodec="aac,mp3,mp2" videoCodec="h264,mpeg2video" type="Video" />
|
||||||
<DirectPlayProfile container="mp4" audioCodec="aac,ac3,mp3,pcm" videoCodec="h264" type="Video" />
|
<DirectPlayProfile container="mp4,m4v" audioCodec="aac,ac3,mp3,pcm" videoCodec="h264" type="Video" />
|
||||||
<DirectPlayProfile container="mov" audioCodec="aac,pcm" videoCodec="h264" type="Video" />
|
<DirectPlayProfile container="mov" audioCodec="aac,pcm" videoCodec="h264" type="Video" />
|
||||||
<DirectPlayProfile container="avi" audioCodec="pcm" videoCodec="mpeg4" type="Video" />
|
<DirectPlayProfile container="avi" audioCodec="pcm" videoCodec="mpeg4" type="Video" />
|
||||||
<DirectPlayProfile container="flv" audioCodec="aac" videoCodec="h264" type="Video" />
|
<DirectPlayProfile container="flv" audioCodec="aac" videoCodec="h264" type="Video" />
|
||||||
|
@ -76,6 +76,9 @@
|
||||||
<ResponseProfile container="ts" type="Video" orgPn="MPEG_TS_SD_EU,MPEG_TS_SD_NA,MPEG_TS_SD_KO" mimeType="video/vnd.dlna.mpeg-tts">
|
<ResponseProfile container="ts" type="Video" orgPn="MPEG_TS_SD_EU,MPEG_TS_SD_NA,MPEG_TS_SD_KO" mimeType="video/vnd.dlna.mpeg-tts">
|
||||||
<Conditions />
|
<Conditions />
|
||||||
</ResponseProfile>
|
</ResponseProfile>
|
||||||
|
<ResponseProfile container="m4v" type="Video" mimeType="video/mp4">
|
||||||
|
<Conditions />
|
||||||
|
</ResponseProfile>
|
||||||
</ResponseProfiles>
|
</ResponseProfiles>
|
||||||
<SubtitleProfiles>
|
<SubtitleProfiles>
|
||||||
<SubtitleProfile format="srt" method="Embed" />
|
<SubtitleProfile format="srt" method="Embed" />
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
|
<IgnoreTranscodeByteRangeRequests>false</IgnoreTranscodeByteRangeRequests>
|
||||||
<XmlRootAttributes />
|
<XmlRootAttributes />
|
||||||
<DirectPlayProfiles>
|
<DirectPlayProfiles>
|
||||||
<DirectPlayProfile container="mp4,mov" audioCodec="aac" videoCodec="h264,mpeg4" type="Video" />
|
<DirectPlayProfile container="mp4,mov,m4v" audioCodec="aac" videoCodec="h264,mpeg4" type="Video" />
|
||||||
<DirectPlayProfile container="ts" audioCodec="aac,ac3,eac3,mp3,mp2,pcm" videoCodec="h264" type="Video" />
|
<DirectPlayProfile container="ts" audioCodec="aac,ac3,eac3,mp3,mp2,pcm" videoCodec="h264" type="Video" />
|
||||||
<DirectPlayProfile container="asf,wmv" audioCodec="wmav2,wmapro" videoCodec="wmv3,vc1" type="Video" />
|
<DirectPlayProfile container="asf,wmv" audioCodec="wmav2,wmapro" videoCodec="wmv3,vc1" type="Video" />
|
||||||
<DirectPlayProfile container="avi" audioCodec="mp3,ac3,eac3,mp2,pcm" videoCodec="mpeg4,msmpeg4" type="Video" />
|
<DirectPlayProfile container="avi" audioCodec="mp3,ac3,eac3,mp2,pcm" videoCodec="mpeg4,msmpeg4" type="Video" />
|
||||||
|
@ -81,7 +81,11 @@
|
||||||
<ApplyConditions />
|
<ApplyConditions />
|
||||||
</CodecProfile>
|
</CodecProfile>
|
||||||
</CodecProfiles>
|
</CodecProfiles>
|
||||||
<ResponseProfiles />
|
<ResponseProfiles>
|
||||||
|
<ResponseProfile container="m4v" type="Video" mimeType="video/mp4">
|
||||||
|
<Conditions />
|
||||||
|
</ResponseProfile>
|
||||||
|
</ResponseProfiles>
|
||||||
<SubtitleProfiles>
|
<SubtitleProfiles>
|
||||||
<SubtitleProfile format="srt" method="Embed" />
|
<SubtitleProfile format="srt" method="Embed" />
|
||||||
</SubtitleProfiles>
|
</SubtitleProfiles>
|
||||||
|
|
|
@ -40,7 +40,7 @@
|
||||||
<DirectPlayProfile container="asf" audioCodec="mp3,ac3,wmav2,wmapro,wmavoice" videoCodec="h264,mpeg4,mjpeg" type="Video" />
|
<DirectPlayProfile container="asf" audioCodec="mp3,ac3,wmav2,wmapro,wmavoice" videoCodec="h264,mpeg4,mjpeg" type="Video" />
|
||||||
<DirectPlayProfile container="avi" audioCodec="mp3,ac3,dca,dts" videoCodec="h264,mpeg4,mjpeg" type="Video" />
|
<DirectPlayProfile container="avi" audioCodec="mp3,ac3,dca,dts" videoCodec="h264,mpeg4,mjpeg" type="Video" />
|
||||||
<DirectPlayProfile container="mkv" audioCodec="mp3,ac3,dca,aac,dts" videoCodec="h264,mpeg4,mjpeg4" type="Video" />
|
<DirectPlayProfile container="mkv" audioCodec="mp3,ac3,dca,aac,dts" videoCodec="h264,mpeg4,mjpeg4" type="Video" />
|
||||||
<DirectPlayProfile container="mp4" audioCodec="mp3,aac" videoCodec="h264,mpeg4" type="Video" />
|
<DirectPlayProfile container="mp4,m4v" audioCodec="mp3,aac" videoCodec="h264,mpeg4" type="Video" />
|
||||||
<DirectPlayProfile container="3gp" audioCodec="aac,he-aac" videoCodec="h264,mpeg4" type="Video" />
|
<DirectPlayProfile container="3gp" audioCodec="aac,he-aac" videoCodec="h264,mpeg4" type="Video" />
|
||||||
<DirectPlayProfile container="mpg,mpeg" audioCodec="ac3,mp2,mp3,aac" videoCodec="mpeg1video,mpeg2video,h264" type="Video" />
|
<DirectPlayProfile container="mpg,mpeg" audioCodec="ac3,mp2,mp3,aac" videoCodec="mpeg1video,mpeg2video,h264" type="Video" />
|
||||||
<DirectPlayProfile container="vro,vob" audioCodec="ac3,mp2,mp3" videoCodec="mpeg1video,mpeg2video" type="Video" />
|
<DirectPlayProfile container="vro,vob" audioCodec="ac3,mp2,mp3" videoCodec="mpeg1video,mpeg2video" type="Video" />
|
||||||
|
@ -117,6 +117,9 @@
|
||||||
<ResponseProfile container="flac" type="Audio" mimeType="audio/x-flac">
|
<ResponseProfile container="flac" type="Audio" mimeType="audio/x-flac">
|
||||||
<Conditions />
|
<Conditions />
|
||||||
</ResponseProfile>
|
</ResponseProfile>
|
||||||
|
<ResponseProfile container="m4v" type="Video" mimeType="video/mp4">
|
||||||
|
<Conditions />
|
||||||
|
</ResponseProfile>
|
||||||
</ResponseProfiles>
|
</ResponseProfiles>
|
||||||
<SubtitleProfiles>
|
<SubtitleProfiles>
|
||||||
<SubtitleProfile format="srt" method="Embed" />
|
<SubtitleProfile format="srt" method="Embed" />
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
<DirectPlayProfiles>
|
<DirectPlayProfiles>
|
||||||
<DirectPlayProfile container="ts" audioCodec="ac3,aac,mp3,pcm" videoCodec="mpeg1video,mpeg2video,h264" type="Video" />
|
<DirectPlayProfile container="ts" audioCodec="ac3,aac,mp3,pcm" videoCodec="mpeg1video,mpeg2video,h264" type="Video" />
|
||||||
<DirectPlayProfile container="mpeg" audioCodec="ac3,mp3,pcm" videoCodec="mpeg1video,mpeg2video" type="Video" />
|
<DirectPlayProfile container="mpeg" audioCodec="ac3,mp3,pcm" videoCodec="mpeg1video,mpeg2video" type="Video" />
|
||||||
<DirectPlayProfile container="avi,mp4" audioCodec="ac3,aac,mp3,pcm" videoCodec="mpeg4,h264" type="Video" />
|
<DirectPlayProfile container="avi,mp4,m4v" audioCodec="ac3,aac,mp3,pcm" videoCodec="mpeg4,h264" type="Video" />
|
||||||
<DirectPlayProfile container="mp3" audioCodec="mp3" type="Audio" />
|
<DirectPlayProfile container="mp3" audioCodec="mp3" type="Audio" />
|
||||||
<DirectPlayProfile container="asf" audioCodec="wmav2,wmapro,wmavoice" type="Audio" />
|
<DirectPlayProfile container="asf" audioCodec="wmav2,wmapro,wmavoice" type="Audio" />
|
||||||
<DirectPlayProfile container="jpeg" type="Photo" />
|
<DirectPlayProfile container="jpeg" type="Photo" />
|
||||||
|
@ -99,6 +99,9 @@
|
||||||
<ResponseProfile container="mp4" type="Video" mimeType="video/mpeg">
|
<ResponseProfile container="mp4" type="Video" mimeType="video/mpeg">
|
||||||
<Conditions />
|
<Conditions />
|
||||||
</ResponseProfile>
|
</ResponseProfile>
|
||||||
|
<ResponseProfile container="m4v" type="Video" mimeType="video/mpeg">
|
||||||
|
<Conditions />
|
||||||
|
</ResponseProfile>
|
||||||
<ResponseProfile container="mpeg" type="Video" mimeType="video/mpeg">
|
<ResponseProfile container="mpeg" type="Video" mimeType="video/mpeg">
|
||||||
<Conditions />
|
<Conditions />
|
||||||
</ResponseProfile>
|
</ResponseProfile>
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
<DirectPlayProfiles>
|
<DirectPlayProfiles>
|
||||||
<DirectPlayProfile container="ts" audioCodec="ac3,aac,mp3" videoCodec="h264" type="Video" />
|
<DirectPlayProfile container="ts" audioCodec="ac3,aac,mp3" videoCodec="h264" type="Video" />
|
||||||
<DirectPlayProfile container="ts" audioCodec="mp3" videoCodec="mpeg2video" type="Video" />
|
<DirectPlayProfile container="ts" audioCodec="mp3" videoCodec="mpeg2video" type="Video" />
|
||||||
<DirectPlayProfile container="mp4" audioCodec="ac3,aac,mp3" videoCodec="h264,mpeg4" type="Video" />
|
<DirectPlayProfile container="mp4,m4v" audioCodec="ac3,aac,mp3" videoCodec="h264,mpeg4" type="Video" />
|
||||||
<DirectPlayProfile container="mpeg" audioCodec="mp3" videoCodec="mpeg2video,mpeg1video" type="Video" />
|
<DirectPlayProfile container="mpeg" audioCodec="mp3" videoCodec="mpeg2video,mpeg1video" type="Video" />
|
||||||
<DirectPlayProfile container="asf" audioCodec="wmav2,wmapro,wmavoice" videoCodec="wmv2,wmv3,vc1" type="Video" />
|
<DirectPlayProfile container="asf" audioCodec="wmav2,wmapro,wmavoice" videoCodec="wmv2,wmv3,vc1" type="Video" />
|
||||||
<DirectPlayProfile container="mp3" audioCodec="mp3" type="Audio" />
|
<DirectPlayProfile container="mp3" audioCodec="mp3" type="Audio" />
|
||||||
|
@ -129,6 +129,9 @@
|
||||||
<ResponseProfile container="mpeg" videoCodec="mpeg1video,mpeg2video" type="Video" orgPn="MPEG_PS_NTSC,MPEG_PS_PAL" mimeType="video/mpeg">
|
<ResponseProfile container="mpeg" videoCodec="mpeg1video,mpeg2video" type="Video" orgPn="MPEG_PS_NTSC,MPEG_PS_PAL" mimeType="video/mpeg">
|
||||||
<Conditions />
|
<Conditions />
|
||||||
</ResponseProfile>
|
</ResponseProfile>
|
||||||
|
<ResponseProfile container="m4v" type="Video" mimeType="video/mp4">
|
||||||
|
<Conditions />
|
||||||
|
</ResponseProfile>
|
||||||
</ResponseProfiles>
|
</ResponseProfiles>
|
||||||
<SubtitleProfiles>
|
<SubtitleProfiles>
|
||||||
<SubtitleProfile format="srt" method="Embed" />
|
<SubtitleProfile format="srt" method="Embed" />
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
<DirectPlayProfiles>
|
<DirectPlayProfiles>
|
||||||
<DirectPlayProfile container="ts" audioCodec="ac3,aac,mp3" videoCodec="h264" type="Video" />
|
<DirectPlayProfile container="ts" audioCodec="ac3,aac,mp3" videoCodec="h264" type="Video" />
|
||||||
<DirectPlayProfile container="ts" audioCodec="mp3,mp2" videoCodec="mpeg2video" type="Video" />
|
<DirectPlayProfile container="ts" audioCodec="mp3,mp2" videoCodec="mpeg2video" type="Video" />
|
||||||
<DirectPlayProfile container="mp4" audioCodec="ac3,aac,mp3,mp2" videoCodec="h264,mpeg4" type="Video" />
|
<DirectPlayProfile container="mp4,m4v" audioCodec="ac3,aac,mp3,mp2" videoCodec="h264,mpeg4" type="Video" />
|
||||||
<DirectPlayProfile container="avi" audioCodec="ac3,mp3" videoCodec="mpeg4" type="Video" />
|
<DirectPlayProfile container="avi" audioCodec="ac3,mp3" videoCodec="mpeg4" type="Video" />
|
||||||
<DirectPlayProfile container="mpeg" audioCodec="mp3,mp2" videoCodec="mpeg2video,mpeg1video" type="Video" />
|
<DirectPlayProfile container="mpeg" audioCodec="mp3,mp2" videoCodec="mpeg2video,mpeg1video" type="Video" />
|
||||||
<DirectPlayProfile container="asf" audioCodec="wmav2,wmapro,wmavoice" videoCodec="wmv2,wmv3,vc1" type="Video" />
|
<DirectPlayProfile container="asf" audioCodec="wmav2,wmapro,wmavoice" videoCodec="wmv2,wmv3,vc1" type="Video" />
|
||||||
|
@ -105,6 +105,9 @@
|
||||||
<ResponseProfile container="mpeg" videoCodec="mpeg1video,mpeg2video" type="Video" orgPn="MPEG_PS_NTSC,MPEG_PS_PAL" mimeType="video/mpeg">
|
<ResponseProfile container="mpeg" videoCodec="mpeg1video,mpeg2video" type="Video" orgPn="MPEG_PS_NTSC,MPEG_PS_PAL" mimeType="video/mpeg">
|
||||||
<Conditions />
|
<Conditions />
|
||||||
</ResponseProfile>
|
</ResponseProfile>
|
||||||
|
<ResponseProfile container="m4v" type="Video" mimeType="video/mp4">
|
||||||
|
<Conditions />
|
||||||
|
</ResponseProfile>
|
||||||
</ResponseProfiles>
|
</ResponseProfiles>
|
||||||
<SubtitleProfiles>
|
<SubtitleProfiles>
|
||||||
<SubtitleProfile format="srt" method="Embed" />
|
<SubtitleProfile format="srt" method="Embed" />
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
<DirectPlayProfiles>
|
<DirectPlayProfiles>
|
||||||
<DirectPlayProfile container="ts" audioCodec="ac3,eac3,aac,mp3" videoCodec="h264" type="Video" />
|
<DirectPlayProfile container="ts" audioCodec="ac3,eac3,aac,mp3" videoCodec="h264" type="Video" />
|
||||||
<DirectPlayProfile container="ts" audioCodec="mp3,mp2" videoCodec="mpeg2video" type="Video" />
|
<DirectPlayProfile container="ts" audioCodec="mp3,mp2" videoCodec="mpeg2video" type="Video" />
|
||||||
<DirectPlayProfile container="mp4" audioCodec="ac3,eac3,aac,mp3,mp2" videoCodec="h264,mpeg4" type="Video" />
|
<DirectPlayProfile container="mp4,m4v" audioCodec="ac3,eac3,aac,mp3,mp2" videoCodec="h264,mpeg4" type="Video" />
|
||||||
<DirectPlayProfile container="mov" audioCodec="ac3,eac3,aac,mp3,mp2" videoCodec="h264,mpeg4,mjpeg" type="Video" />
|
<DirectPlayProfile container="mov" audioCodec="ac3,eac3,aac,mp3,mp2" videoCodec="h264,mpeg4,mjpeg" type="Video" />
|
||||||
<DirectPlayProfile container="mkv" audioCodec="ac3,eac3,aac,mp3,mp2,pcm,vorbis" videoCodec="h264,mpeg4,vp8" type="Video" />
|
<DirectPlayProfile container="mkv" audioCodec="ac3,eac3,aac,mp3,mp2,pcm,vorbis" videoCodec="h264,mpeg4,vp8" type="Video" />
|
||||||
<DirectPlayProfile container="avi" audioCodec="ac3,eac3,mp3" videoCodec="mpeg4" type="Video" />
|
<DirectPlayProfile container="avi" audioCodec="ac3,eac3,mp3" videoCodec="mpeg4" type="Video" />
|
||||||
|
@ -104,6 +104,9 @@
|
||||||
<ResponseProfile container="mpeg" videoCodec="mpeg1video,mpeg2video" type="Video" orgPn="MPEG_PS_NTSC,MPEG_PS_PAL" mimeType="video/mpeg">
|
<ResponseProfile container="mpeg" videoCodec="mpeg1video,mpeg2video" type="Video" orgPn="MPEG_PS_NTSC,MPEG_PS_PAL" mimeType="video/mpeg">
|
||||||
<Conditions />
|
<Conditions />
|
||||||
</ResponseProfile>
|
</ResponseProfile>
|
||||||
|
<ResponseProfile container="m4v" type="Video" mimeType="video/mp4">
|
||||||
|
<Conditions />
|
||||||
|
</ResponseProfile>
|
||||||
</ResponseProfiles>
|
</ResponseProfiles>
|
||||||
<SubtitleProfiles>
|
<SubtitleProfiles>
|
||||||
<SubtitleProfile format="srt" method="Embed" />
|
<SubtitleProfile format="srt" method="Embed" />
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
<DirectPlayProfiles>
|
<DirectPlayProfiles>
|
||||||
<DirectPlayProfile container="ts" audioCodec="ac3,eac3,aac,mp3" videoCodec="h264" type="Video" />
|
<DirectPlayProfile container="ts" audioCodec="ac3,eac3,aac,mp3" videoCodec="h264" type="Video" />
|
||||||
<DirectPlayProfile container="ts" audioCodec="mp3,mp2" videoCodec="mpeg2video" type="Video" />
|
<DirectPlayProfile container="ts" audioCodec="mp3,mp2" videoCodec="mpeg2video" type="Video" />
|
||||||
<DirectPlayProfile container="mp4" audioCodec="ac3,eac3,aac,mp3,mp2" videoCodec="h264,mpeg4" type="Video" />
|
<DirectPlayProfile container="mp4,m4v" audioCodec="ac3,eac3,aac,mp3,mp2" videoCodec="h264,mpeg4" type="Video" />
|
||||||
<DirectPlayProfile container="mov" audioCodec="ac3,eac3,aac,mp3,mp2" videoCodec="h264,mpeg4,mjpeg" type="Video" />
|
<DirectPlayProfile container="mov" audioCodec="ac3,eac3,aac,mp3,mp2" videoCodec="h264,mpeg4,mjpeg" type="Video" />
|
||||||
<DirectPlayProfile container="mkv" audioCodec="ac3,eac3,aac,mp3,mp2,pcm,vorbis" videoCodec="h264,mpeg4,vp8" type="Video" />
|
<DirectPlayProfile container="mkv" audioCodec="ac3,eac3,aac,mp3,mp2,pcm,vorbis" videoCodec="h264,mpeg4,vp8" type="Video" />
|
||||||
<DirectPlayProfile container="avi" audioCodec="ac3,eac3,mp3" videoCodec="mpeg4" type="Video" />
|
<DirectPlayProfile container="avi" audioCodec="ac3,eac3,mp3" videoCodec="mpeg4" type="Video" />
|
||||||
|
@ -104,6 +104,9 @@
|
||||||
<ResponseProfile container="mpeg" videoCodec="mpeg1video,mpeg2video" type="Video" orgPn="MPEG_PS_NTSC,MPEG_PS_PAL" mimeType="video/mpeg">
|
<ResponseProfile container="mpeg" videoCodec="mpeg1video,mpeg2video" type="Video" orgPn="MPEG_PS_NTSC,MPEG_PS_PAL" mimeType="video/mpeg">
|
||||||
<Conditions />
|
<Conditions />
|
||||||
</ResponseProfile>
|
</ResponseProfile>
|
||||||
|
<ResponseProfile container="m4v" type="Video" mimeType="video/mp4">
|
||||||
|
<Conditions />
|
||||||
|
</ResponseProfile>
|
||||||
</ResponseProfiles>
|
</ResponseProfiles>
|
||||||
<SubtitleProfiles>
|
<SubtitleProfiles>
|
||||||
<SubtitleProfile format="srt" method="Embed" />
|
<SubtitleProfile format="srt" method="Embed" />
|
||||||
|
|
|
@ -40,7 +40,7 @@
|
||||||
<DirectPlayProfile container="avi" audioCodec="mp2,mp3" videoCodec="mpeg4" type="Video" />
|
<DirectPlayProfile container="avi" audioCodec="mp2,mp3" videoCodec="mpeg4" type="Video" />
|
||||||
<DirectPlayProfile container="ts" audioCodec="ac3,mp2,mp3,aac" videoCodec="mpeg1video,mpeg2video,h264" type="Video" />
|
<DirectPlayProfile container="ts" audioCodec="ac3,mp2,mp3,aac" videoCodec="mpeg1video,mpeg2video,h264" type="Video" />
|
||||||
<DirectPlayProfile container="mpeg" audioCodec="mp2" videoCodec="mpeg1video,mpeg2video" type="Video" />
|
<DirectPlayProfile container="mpeg" audioCodec="mp2" videoCodec="mpeg1video,mpeg2video" type="Video" />
|
||||||
<DirectPlayProfile container="mp4,mkv" audioCodec="aac,ac3" videoCodec="h264,mpeg4" type="Video" />
|
<DirectPlayProfile container="mp4,mkv,m4v" audioCodec="aac,ac3" videoCodec="h264,mpeg4" type="Video" />
|
||||||
<DirectPlayProfile container="aac,mp3,wav" type="Audio" />
|
<DirectPlayProfile container="aac,mp3,wav" type="Audio" />
|
||||||
<DirectPlayProfile container="jpeg,png,gif,bmp,tiff" type="Photo" />
|
<DirectPlayProfile container="jpeg,png,gif,bmp,tiff" type="Photo" />
|
||||||
</DirectPlayProfiles>
|
</DirectPlayProfiles>
|
||||||
|
@ -98,6 +98,9 @@
|
||||||
<ResponseProfile container="wav" type="Audio" mimeType="audio/wav">
|
<ResponseProfile container="wav" type="Audio" mimeType="audio/wav">
|
||||||
<Conditions />
|
<Conditions />
|
||||||
</ResponseProfile>
|
</ResponseProfile>
|
||||||
|
<ResponseProfile container="m4v" type="Video" mimeType="video/mp4">
|
||||||
|
<Conditions />
|
||||||
|
</ResponseProfile>
|
||||||
</ResponseProfiles>
|
</ResponseProfiles>
|
||||||
<SubtitleProfiles>
|
<SubtitleProfiles>
|
||||||
<SubtitleProfile format="srt" method="Embed" />
|
<SubtitleProfile format="srt" method="Embed" />
|
||||||
|
|
|
@ -40,7 +40,7 @@
|
||||||
<DirectPlayProfile container="mpeg" audioCodec="ac3,dca,mp2,mp3,pcm,dts" videoCodec="mpeg1video,mpeg2video" type="Video" />
|
<DirectPlayProfile container="mpeg" audioCodec="ac3,dca,mp2,mp3,pcm,dts" videoCodec="mpeg1video,mpeg2video" type="Video" />
|
||||||
<DirectPlayProfile container="mkv" audioCodec="ac3,dca,aac,mp2,mp3,pcm,dts" videoCodec="mpeg1video,mpeg2video,mpeg4,h264,vc1" type="Video" />
|
<DirectPlayProfile container="mkv" audioCodec="ac3,dca,aac,mp2,mp3,pcm,dts" videoCodec="mpeg1video,mpeg2video,mpeg4,h264,vc1" type="Video" />
|
||||||
<DirectPlayProfile container="ts,m2ts" audioCodec="ac3,dca,mp2,mp3,aac,dts" videoCodec="mpeg1video,mpeg2video,h264,vc1" type="Video" />
|
<DirectPlayProfile container="ts,m2ts" audioCodec="ac3,dca,mp2,mp3,aac,dts" videoCodec="mpeg1video,mpeg2video,h264,vc1" type="Video" />
|
||||||
<DirectPlayProfile container="mp4,mov" audioCodec="ac3,aac,mp2,mp3,dca,dts" videoCodec="h264,mpeg4" type="Video" />
|
<DirectPlayProfile container="mp4,mov,m4v" audioCodec="ac3,aac,mp2,mp3,dca,dts" videoCodec="h264,mpeg4" type="Video" />
|
||||||
<DirectPlayProfile container="asf" audioCodec="wmav2,wmapro" videoCodec="vc1" type="Video" />
|
<DirectPlayProfile container="asf" audioCodec="wmav2,wmapro" videoCodec="vc1" type="Video" />
|
||||||
<DirectPlayProfile container="asf" audioCodec="mp2,ac3" videoCodec="mpeg2video" type="Video" />
|
<DirectPlayProfile container="asf" audioCodec="mp2,ac3" videoCodec="mpeg2video" type="Video" />
|
||||||
<DirectPlayProfile container="mp3" audioCodec="mp2,mp3" type="Audio" />
|
<DirectPlayProfile container="mp3" audioCodec="mp2,mp3" type="Audio" />
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
<DirectPlayProfile container="ts" audioCodec="ac3,aac,mp3" videoCodec="h264,mpeg2video" type="Video" />
|
<DirectPlayProfile container="ts" audioCodec="ac3,aac,mp3" videoCodec="h264,mpeg2video" type="Video" />
|
||||||
<DirectPlayProfile container="avi" audioCodec="ac3,mp3" videoCodec="mpeg4" type="Video" />
|
<DirectPlayProfile container="avi" audioCodec="ac3,mp3" videoCodec="mpeg4" type="Video" />
|
||||||
<DirectPlayProfile container="avi" audioCodec="aac" videoCodec="h264" type="Video" />
|
<DirectPlayProfile container="avi" audioCodec="aac" videoCodec="h264" type="Video" />
|
||||||
<DirectPlayProfile container="mp4,mov,mkv" audioCodec="aac,ac3" videoCodec="h264,mpeg4,mpeg2video" type="Video" />
|
<DirectPlayProfile container="mp4,mov,mkv,m4v" audioCodec="aac,ac3" videoCodec="h264,mpeg4,mpeg2video" type="Video" />
|
||||||
<DirectPlayProfile container="asf" audioCodec="wmav2,wmapro" videoCodec="wmv2,wmv3,vc1" type="Video" />
|
<DirectPlayProfile container="asf" audioCodec="wmav2,wmapro" videoCodec="wmv2,wmv3,vc1" type="Video" />
|
||||||
<DirectPlayProfile container="asf" audioCodec="wmav2,wmapro,wmavoice" type="Audio" />
|
<DirectPlayProfile container="asf" audioCodec="wmav2,wmapro,wmavoice" type="Audio" />
|
||||||
<DirectPlayProfile container="mp3" audioCodec="mp3" type="Audio" />
|
<DirectPlayProfile container="mp3" audioCodec="mp3" type="Audio" />
|
||||||
|
@ -116,6 +116,9 @@
|
||||||
<ResponseProfile container="avi" type="Video" mimeType="video/avi">
|
<ResponseProfile container="avi" type="Video" mimeType="video/avi">
|
||||||
<Conditions />
|
<Conditions />
|
||||||
</ResponseProfile>
|
</ResponseProfile>
|
||||||
|
<ResponseProfile container="m4v" type="Video" mimeType="video/mp4">
|
||||||
|
<Conditions />
|
||||||
|
</ResponseProfile>
|
||||||
</ResponseProfiles>
|
</ResponseProfiles>
|
||||||
<SubtitleProfiles>
|
<SubtitleProfiles>
|
||||||
<SubtitleProfile format="srt" method="Embed" />
|
<SubtitleProfile format="srt" method="Embed" />
|
||||||
|
|
|
@ -326,6 +326,8 @@ namespace Emby.Server.Core
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public abstract bool IsRunningAsService { get; }
|
||||||
|
|
||||||
private Assembly GetAssembly(Type type)
|
private Assembly GetAssembly(Type type)
|
||||||
{
|
{
|
||||||
return type.GetTypeInfo().Assembly;
|
return type.GetTypeInfo().Assembly;
|
||||||
|
@ -1247,7 +1249,6 @@ namespace Emby.Server.Core
|
||||||
HasUpdateAvailable = HasUpdateAvailable,
|
HasUpdateAvailable = HasUpdateAvailable,
|
||||||
SupportsAutoRunAtStartup = SupportsAutoRunAtStartup,
|
SupportsAutoRunAtStartup = SupportsAutoRunAtStartup,
|
||||||
TranscodingTempPath = ApplicationPaths.TranscodingTempPath,
|
TranscodingTempPath = ApplicationPaths.TranscodingTempPath,
|
||||||
IsRunningAsService = IsRunningAsService,
|
|
||||||
SupportsRunningAsService = SupportsRunningAsService,
|
SupportsRunningAsService = SupportsRunningAsService,
|
||||||
ServerName = FriendlyName,
|
ServerName = FriendlyName,
|
||||||
LocalAddress = localAddress,
|
LocalAddress = localAddress,
|
||||||
|
|
|
@ -2384,8 +2384,17 @@ namespace Emby.Server.Implementations.Data
|
||||||
|
|
||||||
var excludeIds = query.ExcludeItemIds.ToList();
|
var excludeIds = query.ExcludeItemIds.ToList();
|
||||||
excludeIds.Add(item.Id.ToString("N"));
|
excludeIds.Add(item.Id.ToString("N"));
|
||||||
query.ExcludeItemIds = excludeIds.ToArray();
|
|
||||||
|
|
||||||
|
if (query.IncludeItemTypes.Length == 0 || query.IncludeItemTypes.Contains(typeof(Trailer).Name))
|
||||||
|
{
|
||||||
|
var hasTrailers = item as IHasTrailers;
|
||||||
|
if (hasTrailers != null)
|
||||||
|
{
|
||||||
|
excludeIds.AddRange(hasTrailers.GetTrailerIds().Select(i => i.ToString("N")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
query.ExcludeItemIds = excludeIds.ToArray();
|
||||||
query.ExcludeProviderIds = item.ProviderIds;
|
query.ExcludeProviderIds = item.ProviderIds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2821,8 +2830,9 @@ namespace Emby.Server.Implementations.Data
|
||||||
{
|
{
|
||||||
if (orderBy.Count == 0)
|
if (orderBy.Count == 0)
|
||||||
{
|
{
|
||||||
orderBy.Add(new Tuple<string, SortOrder>("SimilarityScore", SortOrder.Descending));
|
|
||||||
orderBy.Add(new Tuple<string, SortOrder>(ItemSortBy.Random, SortOrder.Ascending));
|
orderBy.Add(new Tuple<string, SortOrder>(ItemSortBy.Random, SortOrder.Ascending));
|
||||||
|
orderBy.Add(new Tuple<string, SortOrder>("SimilarityScore", SortOrder.Descending));
|
||||||
|
//orderBy.Add(new Tuple<string, SortOrder>(ItemSortBy.Random, SortOrder.Ascending));
|
||||||
query.SortOrder = SortOrder.Descending;
|
query.SortOrder = SortOrder.Descending;
|
||||||
enableOrderInversion = false;
|
enableOrderInversion = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,15 +6,16 @@ using System.Threading.Tasks;
|
||||||
using MediaBrowser.Model.System;
|
using MediaBrowser.Model.System;
|
||||||
using MediaBrowser.Controller.Plugins;
|
using MediaBrowser.Controller.Plugins;
|
||||||
using MediaBrowser.Common;
|
using MediaBrowser.Common;
|
||||||
|
using MediaBrowser.Controller;
|
||||||
|
|
||||||
namespace Emby.Server.Implementations.EntryPoints
|
namespace Emby.Server.Implementations.EntryPoints
|
||||||
{
|
{
|
||||||
public class SystemEvents : IServerEntryPoint
|
public class SystemEvents : IServerEntryPoint
|
||||||
{
|
{
|
||||||
private readonly ISystemEvents _systemEvents;
|
private readonly ISystemEvents _systemEvents;
|
||||||
private readonly IApplicationHost _appHost;
|
private readonly IServerApplicationHost _appHost;
|
||||||
|
|
||||||
public SystemEvents(ISystemEvents systemEvents, IApplicationHost appHost)
|
public SystemEvents(ISystemEvents systemEvents, IServerApplicationHost appHost)
|
||||||
{
|
{
|
||||||
_systemEvents = systemEvents;
|
_systemEvents = systemEvents;
|
||||||
_appHost = appHost;
|
_appHost = appHost;
|
||||||
|
|
|
@ -10,6 +10,7 @@ using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using MediaBrowser.Controller;
|
||||||
using MediaBrowser.Controller.Configuration;
|
using MediaBrowser.Controller.Configuration;
|
||||||
|
|
||||||
namespace Emby.Server.Implementations.EntryPoints
|
namespace Emby.Server.Implementations.EntryPoints
|
||||||
|
@ -19,7 +20,7 @@ namespace Emby.Server.Implementations.EntryPoints
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class UsageEntryPoint : IServerEntryPoint
|
public class UsageEntryPoint : IServerEntryPoint
|
||||||
{
|
{
|
||||||
private readonly IApplicationHost _applicationHost;
|
private readonly IServerApplicationHost _applicationHost;
|
||||||
private readonly IHttpClient _httpClient;
|
private readonly IHttpClient _httpClient;
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
private readonly ISessionManager _sessionManager;
|
private readonly ISessionManager _sessionManager;
|
||||||
|
@ -28,7 +29,7 @@ namespace Emby.Server.Implementations.EntryPoints
|
||||||
|
|
||||||
private readonly ConcurrentDictionary<Guid, ClientInfo> _apps = new ConcurrentDictionary<Guid, ClientInfo>();
|
private readonly ConcurrentDictionary<Guid, ClientInfo> _apps = new ConcurrentDictionary<Guid, ClientInfo>();
|
||||||
|
|
||||||
public UsageEntryPoint(ILogger logger, IApplicationHost applicationHost, IHttpClient httpClient, ISessionManager sessionManager, IUserManager userManager, IServerConfigurationManager config)
|
public UsageEntryPoint(ILogger logger, IServerApplicationHost applicationHost, IHttpClient httpClient, ISessionManager sessionManager, IUserManager userManager, IServerConfigurationManager config)
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_applicationHost = applicationHost;
|
_applicationHost = applicationHost;
|
||||||
|
|
|
@ -8,19 +8,20 @@ using System.Globalization;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using MediaBrowser.Controller;
|
||||||
using MediaBrowser.Model.Logging;
|
using MediaBrowser.Model.Logging;
|
||||||
|
|
||||||
namespace Emby.Server.Implementations.EntryPoints
|
namespace Emby.Server.Implementations.EntryPoints
|
||||||
{
|
{
|
||||||
public class UsageReporter
|
public class UsageReporter
|
||||||
{
|
{
|
||||||
private readonly IApplicationHost _applicationHost;
|
private readonly IServerApplicationHost _applicationHost;
|
||||||
private readonly IHttpClient _httpClient;
|
private readonly IHttpClient _httpClient;
|
||||||
private readonly IUserManager _userManager;
|
private readonly IUserManager _userManager;
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
private const string MbAdminUrl = "https://www.mb3admin.com/admin/";
|
private const string MbAdminUrl = "https://www.mb3admin.com/admin/";
|
||||||
|
|
||||||
public UsageReporter(IApplicationHost applicationHost, IHttpClient httpClient, IUserManager userManager, ILogger logger)
|
public UsageReporter(IServerApplicationHost applicationHost, IHttpClient httpClient, IUserManager userManager, ILogger logger)
|
||||||
{
|
{
|
||||||
_applicationHost = applicationHost;
|
_applicationHost = applicationHost;
|
||||||
_httpClient = httpClient;
|
_httpClient = httpClient;
|
||||||
|
|
|
@ -62,91 +62,91 @@ namespace Emby.Server.Implementations.FileOrganization
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (_libraryMonitor.IsPathLocked(path))
|
if (_libraryMonitor.IsPathLocked(path))
|
||||||
{
|
|
||||||
result.Status = FileSortingStatus.Failure;
|
|
||||||
result.StatusMessage = "Path is locked by other processes. Please try again later.";
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
var namingOptions = ((LibraryManager)_libraryManager).GetNamingOptions();
|
|
||||||
var resolver = new EpisodeResolver(namingOptions, new NullLogger());
|
|
||||||
|
|
||||||
var episodeInfo = resolver.Resolve(path, false) ??
|
|
||||||
new MediaBrowser.Naming.TV.EpisodeInfo();
|
|
||||||
|
|
||||||
var seriesName = episodeInfo.SeriesName;
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(seriesName))
|
|
||||||
{
|
|
||||||
var seasonNumber = episodeInfo.SeasonNumber;
|
|
||||||
|
|
||||||
result.ExtractedSeasonNumber = seasonNumber;
|
|
||||||
|
|
||||||
// Passing in true will include a few extra regex's
|
|
||||||
var episodeNumber = episodeInfo.EpisodeNumber;
|
|
||||||
|
|
||||||
result.ExtractedEpisodeNumber = episodeNumber;
|
|
||||||
|
|
||||||
var premiereDate = episodeInfo.IsByDate ?
|
|
||||||
new DateTime(episodeInfo.Year.Value, episodeInfo.Month.Value, episodeInfo.Day.Value) :
|
|
||||||
(DateTime?)null;
|
|
||||||
|
|
||||||
if (episodeInfo.IsByDate || (seasonNumber.HasValue && episodeNumber.HasValue))
|
|
||||||
{
|
{
|
||||||
if (episodeInfo.IsByDate)
|
result.Status = FileSortingStatus.Failure;
|
||||||
|
result.StatusMessage = "Path is locked by other processes. Please try again later.";
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
var namingOptions = ((LibraryManager)_libraryManager).GetNamingOptions();
|
||||||
|
var resolver = new EpisodeResolver(namingOptions, new NullLogger());
|
||||||
|
|
||||||
|
var episodeInfo = resolver.Resolve(path, false) ??
|
||||||
|
new MediaBrowser.Naming.TV.EpisodeInfo();
|
||||||
|
|
||||||
|
var seriesName = episodeInfo.SeriesName;
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(seriesName))
|
||||||
|
{
|
||||||
|
var seasonNumber = episodeInfo.SeasonNumber;
|
||||||
|
|
||||||
|
result.ExtractedSeasonNumber = seasonNumber;
|
||||||
|
|
||||||
|
// Passing in true will include a few extra regex's
|
||||||
|
var episodeNumber = episodeInfo.EpisodeNumber;
|
||||||
|
|
||||||
|
result.ExtractedEpisodeNumber = episodeNumber;
|
||||||
|
|
||||||
|
var premiereDate = episodeInfo.IsByDate ?
|
||||||
|
new DateTime(episodeInfo.Year.Value, episodeInfo.Month.Value, episodeInfo.Day.Value) :
|
||||||
|
(DateTime?)null;
|
||||||
|
|
||||||
|
if (episodeInfo.IsByDate || (seasonNumber.HasValue && episodeNumber.HasValue))
|
||||||
{
|
{
|
||||||
_logger.Debug("Extracted information from {0}. Series name {1}, Date {2}", path, seriesName, premiereDate.Value);
|
if (episodeInfo.IsByDate)
|
||||||
|
{
|
||||||
|
_logger.Debug("Extracted information from {0}. Series name {1}, Date {2}", path, seriesName, premiereDate.Value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_logger.Debug("Extracted information from {0}. Series name {1}, Season {2}, Episode {3}", path, seriesName, seasonNumber, episodeNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
var endingEpisodeNumber = episodeInfo.EndingEpsiodeNumber;
|
||||||
|
|
||||||
|
result.ExtractedEndingEpisodeNumber = endingEpisodeNumber;
|
||||||
|
|
||||||
|
await OrganizeEpisode(path,
|
||||||
|
seriesName,
|
||||||
|
seasonNumber,
|
||||||
|
episodeNumber,
|
||||||
|
endingEpisodeNumber,
|
||||||
|
premiereDate,
|
||||||
|
options,
|
||||||
|
overwriteExisting,
|
||||||
|
false,
|
||||||
|
result,
|
||||||
|
cancellationToken).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_logger.Debug("Extracted information from {0}. Series name {1}, Season {2}, Episode {3}", path, seriesName, seasonNumber, episodeNumber);
|
var msg = string.Format("Unable to determine episode number from {0}", path);
|
||||||
|
result.Status = FileSortingStatus.Failure;
|
||||||
|
result.StatusMessage = msg;
|
||||||
|
_logger.Warn(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
var endingEpisodeNumber = episodeInfo.EndingEpsiodeNumber;
|
|
||||||
|
|
||||||
result.ExtractedEndingEpisodeNumber = endingEpisodeNumber;
|
|
||||||
|
|
||||||
await OrganizeEpisode(path,
|
|
||||||
seriesName,
|
|
||||||
seasonNumber,
|
|
||||||
episodeNumber,
|
|
||||||
endingEpisodeNumber,
|
|
||||||
premiereDate,
|
|
||||||
options,
|
|
||||||
overwriteExisting,
|
|
||||||
false,
|
|
||||||
result,
|
|
||||||
cancellationToken).ConfigureAwait(false);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var msg = string.Format("Unable to determine episode number from {0}", path);
|
var msg = string.Format("Unable to determine series name from {0}", path);
|
||||||
result.Status = FileSortingStatus.Failure;
|
result.Status = FileSortingStatus.Failure;
|
||||||
result.StatusMessage = msg;
|
result.StatusMessage = msg;
|
||||||
_logger.Warn(msg);
|
_logger.Warn(msg);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var msg = string.Format("Unable to determine series name from {0}", path);
|
|
||||||
result.Status = FileSortingStatus.Failure;
|
|
||||||
result.StatusMessage = msg;
|
|
||||||
_logger.Warn(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
var previousResult = _organizationService.GetResultBySourcePath(path);
|
var previousResult = _organizationService.GetResultBySourcePath(path);
|
||||||
|
|
||||||
if (previousResult != null)
|
if (previousResult != null)
|
||||||
{
|
|
||||||
// Don't keep saving the same result over and over if nothing has changed
|
|
||||||
if (previousResult.Status == result.Status && previousResult.StatusMessage == result.StatusMessage && result.Status != FileSortingStatus.Success)
|
|
||||||
{
|
{
|
||||||
return previousResult;
|
// Don't keep saving the same result over and over if nothing has changed
|
||||||
|
if (previousResult.Status == result.Status && previousResult.StatusMessage == result.StatusMessage && result.Status != FileSortingStatus.Success)
|
||||||
|
{
|
||||||
|
return previousResult;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
await _organizationService.SaveResult(result, CancellationToken.None).ConfigureAwait(false);
|
await _organizationService.SaveResult(result, CancellationToken.None).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
@ -163,57 +163,59 @@ namespace Emby.Server.Implementations.FileOrganization
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Series series = null;
|
Series series = null;
|
||||||
|
|
||||||
if (request.NewSeriesProviderIds.Count > 0)
|
if (request.NewSeriesProviderIds.Count > 0)
|
||||||
{
|
|
||||||
// We're having a new series here
|
|
||||||
SeriesInfo seriesRequest = new SeriesInfo();
|
|
||||||
seriesRequest.ProviderIds = request.NewSeriesProviderIds;
|
|
||||||
|
|
||||||
var refreshOptions = new MetadataRefreshOptions(_fileSystem);
|
|
||||||
series = new Series();
|
|
||||||
series.Id = Guid.NewGuid();
|
|
||||||
series.Name = request.NewSeriesName;
|
|
||||||
|
|
||||||
int year;
|
|
||||||
if (int.TryParse(request.NewSeriesYear, out year))
|
|
||||||
{
|
{
|
||||||
series.ProductionYear = year;
|
// We're having a new series here
|
||||||
|
SeriesInfo seriesRequest = new SeriesInfo();
|
||||||
|
seriesRequest.ProviderIds = request.NewSeriesProviderIds;
|
||||||
|
|
||||||
|
var refreshOptions = new MetadataRefreshOptions(_fileSystem);
|
||||||
|
series = new Series();
|
||||||
|
series.Id = Guid.NewGuid();
|
||||||
|
series.Name = request.NewSeriesName;
|
||||||
|
|
||||||
|
int year;
|
||||||
|
if (int.TryParse(request.NewSeriesYear, out year))
|
||||||
|
{
|
||||||
|
series.ProductionYear = year;
|
||||||
|
}
|
||||||
|
|
||||||
|
var seriesFolderName = series.Name;
|
||||||
|
if (series.ProductionYear.HasValue)
|
||||||
|
{
|
||||||
|
seriesFolderName = string.Format("{0} ({1})", seriesFolderName, series.ProductionYear);
|
||||||
|
}
|
||||||
|
|
||||||
|
seriesFolderName = _fileSystem.GetValidFilename(seriesFolderName);
|
||||||
|
|
||||||
|
series.Path = Path.Combine(request.TargetFolder, seriesFolderName);
|
||||||
|
|
||||||
|
series.ProviderIds = request.NewSeriesProviderIds;
|
||||||
|
|
||||||
|
await series.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
var seriesFolderName = series.Name;
|
if (series == null)
|
||||||
if (series.ProductionYear.HasValue)
|
|
||||||
{
|
{
|
||||||
seriesFolderName = string.Format("{0} ({1})", seriesFolderName, series.ProductionYear);
|
// Existing Series
|
||||||
|
series = (Series)_libraryManager.GetItemById(new Guid(request.SeriesId));
|
||||||
}
|
}
|
||||||
|
|
||||||
series.Path = Path.Combine(request.TargetFolder, seriesFolderName);
|
await OrganizeEpisode(result.OriginalPath,
|
||||||
|
series,
|
||||||
|
request.SeasonNumber,
|
||||||
|
request.EpisodeNumber,
|
||||||
|
request.EndingEpisodeNumber,
|
||||||
|
null,
|
||||||
|
options,
|
||||||
|
true,
|
||||||
|
request.RememberCorrection,
|
||||||
|
result,
|
||||||
|
cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
series.ProviderIds = request.NewSeriesProviderIds;
|
await _organizationService.SaveResult(result, CancellationToken.None).ConfigureAwait(false);
|
||||||
|
|
||||||
await series.RefreshMetadata(refreshOptions, cancellationToken);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (series == null)
|
|
||||||
{
|
|
||||||
// Existing Series
|
|
||||||
series = (Series)_libraryManager.GetItemById(new Guid(request.SeriesId));
|
|
||||||
}
|
|
||||||
|
|
||||||
await OrganizeEpisode(result.OriginalPath,
|
|
||||||
series,
|
|
||||||
request.SeasonNumber,
|
|
||||||
request.EpisodeNumber,
|
|
||||||
request.EndingEpisodeNumber,
|
|
||||||
null,
|
|
||||||
options,
|
|
||||||
true,
|
|
||||||
request.RememberCorrection,
|
|
||||||
result,
|
|
||||||
cancellationToken).ConfigureAwait(false);
|
|
||||||
|
|
||||||
await _organizationService.SaveResult(result, CancellationToken.None).ConfigureAwait(false);
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
@ -290,88 +292,88 @@ namespace Emby.Server.Implementations.FileOrganization
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Proceed to sort the file
|
// Proceed to sort the file
|
||||||
var newPath = await GetNewPath(sourcePath, series, seasonNumber, episodeNumber, endingEpiosdeNumber, premiereDate, options.TvOptions, cancellationToken).ConfigureAwait(false);
|
var newPath = await GetNewPath(sourcePath, series, seasonNumber, episodeNumber, endingEpiosdeNumber, premiereDate, options.TvOptions, cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(newPath))
|
if (string.IsNullOrEmpty(newPath))
|
||||||
{
|
|
||||||
var msg = string.Format("Unable to sort {0} because target path could not be determined.", sourcePath);
|
|
||||||
throw new Exception(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
_logger.Info("Sorting file {0} to new path {1}", sourcePath, newPath);
|
|
||||||
result.TargetPath = newPath;
|
|
||||||
|
|
||||||
var fileExists = _fileSystem.FileExists(result.TargetPath);
|
|
||||||
var otherDuplicatePaths = GetOtherDuplicatePaths(result.TargetPath, series, seasonNumber, episodeNumber, endingEpiosdeNumber);
|
|
||||||
|
|
||||||
if (!overwriteExisting)
|
|
||||||
{
|
|
||||||
if (options.TvOptions.CopyOriginalFile && fileExists && IsSameEpisode(sourcePath, newPath))
|
|
||||||
{
|
{
|
||||||
var msg = string.Format("File '{0}' already copied to new path '{1}', stopping organization", sourcePath, newPath);
|
var msg = string.Format("Unable to sort {0} because target path could not be determined.", sourcePath);
|
||||||
_logger.Info(msg);
|
throw new Exception(msg);
|
||||||
result.Status = FileSortingStatus.SkippedExisting;
|
|
||||||
result.StatusMessage = msg;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fileExists)
|
_logger.Info("Sorting file {0} to new path {1}", sourcePath, newPath);
|
||||||
|
result.TargetPath = newPath;
|
||||||
|
|
||||||
|
var fileExists = _fileSystem.FileExists(result.TargetPath);
|
||||||
|
var otherDuplicatePaths = GetOtherDuplicatePaths(result.TargetPath, series, seasonNumber, episodeNumber, endingEpiosdeNumber);
|
||||||
|
|
||||||
|
if (!overwriteExisting)
|
||||||
{
|
{
|
||||||
var msg = string.Format("File '{0}' already exists as '{1}', stopping organization", sourcePath, newPath);
|
if (options.TvOptions.CopyOriginalFile && fileExists && IsSameEpisode(sourcePath, newPath))
|
||||||
_logger.Info(msg);
|
{
|
||||||
result.Status = FileSortingStatus.SkippedExisting;
|
var msg = string.Format("File '{0}' already copied to new path '{1}', stopping organization", sourcePath, newPath);
|
||||||
result.StatusMessage = msg;
|
_logger.Info(msg);
|
||||||
result.TargetPath = newPath;
|
result.Status = FileSortingStatus.SkippedExisting;
|
||||||
return;
|
result.StatusMessage = msg;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fileExists)
|
||||||
|
{
|
||||||
|
var msg = string.Format("File '{0}' already exists as '{1}', stopping organization", sourcePath, newPath);
|
||||||
|
_logger.Info(msg);
|
||||||
|
result.Status = FileSortingStatus.SkippedExisting;
|
||||||
|
result.StatusMessage = msg;
|
||||||
|
result.TargetPath = newPath;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (otherDuplicatePaths.Count > 0)
|
||||||
|
{
|
||||||
|
var msg = string.Format("File '{0}' already exists as these:'{1}'. Stopping organization", sourcePath, string.Join("', '", otherDuplicatePaths));
|
||||||
|
_logger.Info(msg);
|
||||||
|
result.Status = FileSortingStatus.SkippedExisting;
|
||||||
|
result.StatusMessage = msg;
|
||||||
|
result.DuplicatePaths = otherDuplicatePaths;
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (otherDuplicatePaths.Count > 0)
|
PerformFileSorting(options.TvOptions, result);
|
||||||
|
|
||||||
|
if (overwriteExisting)
|
||||||
{
|
{
|
||||||
var msg = string.Format("File '{0}' already exists as these:'{1}'. Stopping organization", sourcePath, string.Join("', '", otherDuplicatePaths));
|
var hasRenamedFiles = false;
|
||||||
_logger.Info(msg);
|
|
||||||
result.Status = FileSortingStatus.SkippedExisting;
|
|
||||||
result.StatusMessage = msg;
|
|
||||||
result.DuplicatePaths = otherDuplicatePaths;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PerformFileSorting(options.TvOptions, result);
|
foreach (var path in otherDuplicatePaths)
|
||||||
|
|
||||||
if (overwriteExisting)
|
|
||||||
{
|
|
||||||
var hasRenamedFiles = false;
|
|
||||||
|
|
||||||
foreach (var path in otherDuplicatePaths)
|
|
||||||
{
|
|
||||||
_logger.Debug("Removing duplicate episode {0}", path);
|
|
||||||
|
|
||||||
_libraryMonitor.ReportFileSystemChangeBeginning(path);
|
|
||||||
|
|
||||||
var renameRelatedFiles = !hasRenamedFiles &&
|
|
||||||
string.Equals(Path.GetDirectoryName(path), Path.GetDirectoryName(result.TargetPath), StringComparison.OrdinalIgnoreCase);
|
|
||||||
|
|
||||||
if (renameRelatedFiles)
|
|
||||||
{
|
{
|
||||||
hasRenamedFiles = true;
|
_logger.Debug("Removing duplicate episode {0}", path);
|
||||||
}
|
|
||||||
|
|
||||||
try
|
_libraryMonitor.ReportFileSystemChangeBeginning(path);
|
||||||
{
|
|
||||||
DeleteLibraryFile(path, renameRelatedFiles, result.TargetPath);
|
var renameRelatedFiles = !hasRenamedFiles &&
|
||||||
}
|
string.Equals(Path.GetDirectoryName(path), Path.GetDirectoryName(result.TargetPath), StringComparison.OrdinalIgnoreCase);
|
||||||
catch (IOException ex)
|
|
||||||
{
|
if (renameRelatedFiles)
|
||||||
_logger.ErrorException("Error removing duplicate episode", ex, path);
|
{
|
||||||
}
|
hasRenamedFiles = true;
|
||||||
finally
|
}
|
||||||
{
|
|
||||||
_libraryMonitor.ReportFileSystemChangeComplete(path, true);
|
try
|
||||||
|
{
|
||||||
|
DeleteLibraryFile(path, renameRelatedFiles, result.TargetPath);
|
||||||
|
}
|
||||||
|
catch (IOException ex)
|
||||||
|
{
|
||||||
|
_logger.ErrorException("Error removing duplicate episode", ex, path);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
_libraryMonitor.ReportFileSystemChangeComplete(path, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
result.Status = FileSortingStatus.Failure;
|
result.Status = FileSortingStatus.Failure;
|
||||||
|
|
|
@ -118,8 +118,7 @@ namespace Emby.Server.Implementations.Intros
|
||||||
|
|
||||||
// Account for duplicates by imdb id, since the database doesn't support this yet
|
// Account for duplicates by imdb id, since the database doesn't support this yet
|
||||||
Limit = config.TrailerLimit * 4,
|
Limit = config.TrailerLimit * 4,
|
||||||
SourceTypes = sourceTypes.ToArray(),
|
SourceTypes = sourceTypes.ToArray()
|
||||||
MinSimilarityScore = 0
|
|
||||||
})
|
})
|
||||||
.Where(i => string.IsNullOrWhiteSpace(i.GetProviderId(MetadataProviders.Imdb)) || !string.Equals(i.GetProviderId(MetadataProviders.Imdb), item.GetProviderId(MetadataProviders.Imdb), StringComparison.OrdinalIgnoreCase))
|
.Where(i => string.IsNullOrWhiteSpace(i.GetProviderId(MetadataProviders.Imdb)) || !string.Equals(i.GetProviderId(MetadataProviders.Imdb), item.GetProviderId(MetadataProviders.Imdb), StringComparison.OrdinalIgnoreCase))
|
||||||
.Where(i => i.IsVisibleStandalone(user))
|
.Where(i => i.IsVisibleStandalone(user))
|
||||||
|
|
|
@ -199,6 +199,8 @@ namespace Emby.Server.Implementations.Library
|
||||||
|
|
||||||
foreach (var mediaSource in list)
|
foreach (var mediaSource in list)
|
||||||
{
|
{
|
||||||
|
mediaSource.InferTotalBitrate();
|
||||||
|
|
||||||
SetKeyProperties(provider, mediaSource);
|
SetKeyProperties(provider, mediaSource);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1064,6 +1064,8 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV
|
||||||
var isAudio = false;
|
var isAudio = false;
|
||||||
await new LiveStreamHelper(_mediaEncoder, _logger).AddMediaInfoWithProbe(stream, isAudio, cancellationToken).ConfigureAwait(false);
|
await new LiveStreamHelper(_mediaEncoder, _logger).AddMediaInfoWithProbe(stream, isAudio, cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
|
stream.InferTotalBitrate();
|
||||||
|
|
||||||
return new List<MediaSourceInfo>
|
return new List<MediaSourceInfo>
|
||||||
{
|
{
|
||||||
stream
|
stream
|
||||||
|
|
|
@ -96,15 +96,7 @@ namespace Emby.Server.Implementations.LiveTv
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try to estimate this
|
// Try to estimate this
|
||||||
if (!mediaSource.Bitrate.HasValue)
|
mediaSource.InferTotalBitrate();
|
||||||
{
|
|
||||||
var total = mediaSource.MediaStreams.Select(i => i.BitRate ?? 0).Sum();
|
|
||||||
|
|
||||||
if (total > 0)
|
|
||||||
{
|
|
||||||
mediaSource.Bitrate = total;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -459,15 +459,7 @@ namespace Emby.Server.Implementations.LiveTv
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the total bitrate if not already supplied
|
// Set the total bitrate if not already supplied
|
||||||
if (!mediaSource.Bitrate.HasValue)
|
mediaSource.InferTotalBitrate();
|
||||||
{
|
|
||||||
var total = mediaSource.MediaStreams.Select(i => i.BitRate ?? 0).Sum();
|
|
||||||
|
|
||||||
if (total > 0)
|
|
||||||
{
|
|
||||||
mediaSource.Bitrate = total;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(service is EmbyTV.EmbyTV))
|
if (!(service is EmbyTV.EmbyTV))
|
||||||
{
|
{
|
||||||
|
|
|
@ -200,15 +200,7 @@ namespace Emby.Server.Implementations.LiveTv
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try to estimate this
|
// Try to estimate this
|
||||||
if (!mediaSource.Bitrate.HasValue)
|
mediaSource.InferTotalBitrate();
|
||||||
{
|
|
||||||
var total = mediaSource.MediaStreams.Select(i => i.BitRate ?? 0).Sum();
|
|
||||||
|
|
||||||
if (total > 0)
|
|
||||||
{
|
|
||||||
mediaSource.Bitrate = total;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task CloseMediaSource(string liveStreamId)
|
public Task CloseMediaSource(string liveStreamId)
|
||||||
|
|
|
@ -431,6 +431,8 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
||||||
IsInfiniteStream = true
|
IsInfiniteStream = true
|
||||||
};
|
};
|
||||||
|
|
||||||
|
mediaSource.InferTotalBitrate();
|
||||||
|
|
||||||
return mediaSource;
|
return mediaSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,6 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
||||||
private readonly TaskCompletionSource<bool> _liveStreamTaskCompletionSource = new TaskCompletionSource<bool>();
|
private readonly TaskCompletionSource<bool> _liveStreamTaskCompletionSource = new TaskCompletionSource<bool>();
|
||||||
private readonly MulticastStream _multicastStream;
|
private readonly MulticastStream _multicastStream;
|
||||||
|
|
||||||
|
|
||||||
public HdHomerunLiveStream(MediaSourceInfo mediaSource, string originalStreamId, IFileSystem fileSystem, IHttpClient httpClient, ILogger logger, IServerApplicationPaths appPaths, IServerApplicationHost appHost)
|
public HdHomerunLiveStream(MediaSourceInfo mediaSource, string originalStreamId, IFileSystem fileSystem, IHttpClient httpClient, ILogger logger, IServerApplicationPaths appPaths, IServerApplicationHost appHost)
|
||||||
: base(mediaSource)
|
: base(mediaSource)
|
||||||
{
|
{
|
||||||
|
|
|
@ -164,6 +164,8 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
|
||||||
IsRemote = true
|
IsRemote = true
|
||||||
};
|
};
|
||||||
|
|
||||||
|
mediaSource.InferTotalBitrate();
|
||||||
|
|
||||||
return new List<MediaSourceInfo> { mediaSource };
|
return new List<MediaSourceInfo> { mediaSource };
|
||||||
}
|
}
|
||||||
return new List<MediaSourceInfo>();
|
return new List<MediaSourceInfo>();
|
||||||
|
|
|
@ -175,6 +175,15 @@ namespace MediaBrowser.Api.Playback
|
||||||
return ToOptimizedResult(info);
|
return ToOptimizedResult(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private T Clone<T>(T obj)
|
||||||
|
{
|
||||||
|
// Since we're going to be setting properties on MediaSourceInfos that come out of _mediaSourceManager, we should clone it
|
||||||
|
// Should we move this directly into MediaSourceManager?
|
||||||
|
|
||||||
|
var json = _json.SerializeToString(obj);
|
||||||
|
return _json.DeserializeFromString<T>(json);
|
||||||
|
}
|
||||||
|
|
||||||
private async Task<PlaybackInfoResponse> GetPlaybackInfo(string id, string userId, string[] supportedLiveMediaTypes, string mediaSourceId = null, string liveStreamId = null)
|
private async Task<PlaybackInfoResponse> GetPlaybackInfo(string id, string userId, string[] supportedLiveMediaTypes, string mediaSourceId = null, string liveStreamId = null)
|
||||||
{
|
{
|
||||||
var result = new PlaybackInfoResponse();
|
var result = new PlaybackInfoResponse();
|
||||||
|
@ -217,6 +226,8 @@ namespace MediaBrowser.Api.Playback
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
result.MediaSources = Clone(result.MediaSources);
|
||||||
|
|
||||||
result.PlaySessionId = Guid.NewGuid().ToString("N");
|
result.PlaySessionId = Guid.NewGuid().ToString("N");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,12 +36,6 @@ namespace MediaBrowser.Common
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event EventHandler<GenericEventArgs<PackageVersionInfo>> ApplicationUpdated;
|
event EventHandler<GenericEventArgs<PackageVersionInfo>> ApplicationUpdated;
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets a value indicating whether this instance is running as service.
|
|
||||||
/// </summary>
|
|
||||||
/// <value><c>true</c> if this instance is running as service; otherwise, <c>false</c>.</value>
|
|
||||||
bool IsRunningAsService { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets a value indicating whether this instance has pending kernel reload.
|
/// Gets or sets a value indicating whether this instance has pending kernel reload.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -72,12 +72,7 @@ namespace MediaBrowser.Controller.Channels
|
||||||
IsRemote = true
|
IsRemote = true
|
||||||
};
|
};
|
||||||
|
|
||||||
var bitrate = (AudioBitrate ?? 0) + (VideoBitrate ?? 0);
|
source.InferTotalBitrate();
|
||||||
|
|
||||||
if (bitrate > 0)
|
|
||||||
{
|
|
||||||
source.Bitrate = bitrate;
|
|
||||||
}
|
|
||||||
|
|
||||||
return source;
|
return source;
|
||||||
}
|
}
|
||||||
|
|
|
@ -267,15 +267,8 @@ namespace MediaBrowser.Controller.Entities.Audio
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var bitrate = i.TotalBitrate ??
|
info.Bitrate = i.TotalBitrate;
|
||||||
info.MediaStreams.Where(m => m.Type == MediaStreamType.Audio)
|
info.InferTotalBitrate();
|
||||||
.Select(m => m.BitRate ?? 0)
|
|
||||||
.Sum();
|
|
||||||
|
|
||||||
if (bitrate > 0)
|
|
||||||
{
|
|
||||||
info.Bitrate = bitrate;
|
|
||||||
}
|
|
||||||
|
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1337,6 +1337,11 @@ namespace MediaBrowser.Controller.Entities
|
||||||
.FirstOrDefault(i => !string.IsNullOrWhiteSpace(i));
|
.FirstOrDefault(i => !string.IsNullOrWhiteSpace(i));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(lang))
|
||||||
|
{
|
||||||
|
lang = LibraryManager.GetLibraryOptions(this).PreferredMetadataLanguage;
|
||||||
|
}
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(lang))
|
if (string.IsNullOrWhiteSpace(lang))
|
||||||
{
|
{
|
||||||
lang = ConfigurationManager.Configuration.PreferredMetadataLanguage;
|
lang = ConfigurationManager.Configuration.PreferredMetadataLanguage;
|
||||||
|
@ -1367,6 +1372,11 @@ namespace MediaBrowser.Controller.Entities
|
||||||
.FirstOrDefault(i => !string.IsNullOrWhiteSpace(i));
|
.FirstOrDefault(i => !string.IsNullOrWhiteSpace(i));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(lang))
|
||||||
|
{
|
||||||
|
lang = LibraryManager.GetLibraryOptions(this).MetadataCountryCode;
|
||||||
|
}
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(lang))
|
if (string.IsNullOrWhiteSpace(lang))
|
||||||
{
|
{
|
||||||
lang = ConfigurationManager.Configuration.MetadataCountryCode;
|
lang = ConfigurationManager.Configuration.MetadataCountryCode;
|
||||||
|
|
|
@ -197,7 +197,7 @@ namespace MediaBrowser.Controller.Entities
|
||||||
|
|
||||||
public InternalItemsQuery()
|
public InternalItemsQuery()
|
||||||
{
|
{
|
||||||
MinSimilarityScore = 1;
|
MinSimilarityScore = 20;
|
||||||
|
|
||||||
GroupByPresentationUniqueKey = true;
|
GroupByPresentationUniqueKey = true;
|
||||||
EnableTotalRecordCount = true;
|
EnableTotalRecordCount = true;
|
||||||
|
|
|
@ -649,22 +649,8 @@ namespace MediaBrowser.Controller.Entities
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
info.Bitrate = i.TotalBitrate;
|
||||||
{
|
info.InferTotalBitrate();
|
||||||
var bitrate = i.TotalBitrate ??
|
|
||||||
info.MediaStreams.Where(m => m.Type != MediaStreamType.Subtitle && !string.Equals(m.Codec, "mjpeg", StringComparison.OrdinalIgnoreCase))
|
|
||||||
.Select(m => m.BitRate ?? 0)
|
|
||||||
.Sum();
|
|
||||||
|
|
||||||
if (bitrate > 0)
|
|
||||||
{
|
|
||||||
info.Bitrate = bitrate;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (OverflowException ex)
|
|
||||||
{
|
|
||||||
Logger.ErrorException("Error calculating total bitrate", ex);
|
|
||||||
}
|
|
||||||
|
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,12 @@ namespace MediaBrowser.Controller
|
||||||
/// <returns>SystemInfo.</returns>
|
/// <returns>SystemInfo.</returns>
|
||||||
Task<SystemInfo> GetSystemInfo();
|
Task<SystemInfo> GetSystemInfo();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets a value indicating whether this instance is running as service.
|
||||||
|
/// </summary>
|
||||||
|
/// <value><c>true</c> if this instance is running as service; otherwise, <c>false</c>.</value>
|
||||||
|
bool IsRunningAsService { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets a value indicating whether [supports automatic run at startup].
|
/// Gets a value indicating whether [supports automatic run at startup].
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -15,6 +15,18 @@
|
||||||
public bool ImportMissingEpisodes { get; set; }
|
public bool ImportMissingEpisodes { get; set; }
|
||||||
public bool EnableAutomaticSeriesGrouping { get; set; }
|
public bool EnableAutomaticSeriesGrouping { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the preferred metadata language.
|
||||||
|
/// </summary>
|
||||||
|
/// <value>The preferred metadata language.</value>
|
||||||
|
public string PreferredMetadataLanguage { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the metadata country code.
|
||||||
|
/// </summary>
|
||||||
|
/// <value>The metadata country code.</value>
|
||||||
|
public string MetadataCountryCode { get; set; }
|
||||||
|
|
||||||
public LibraryOptions()
|
public LibraryOptions()
|
||||||
{
|
{
|
||||||
EnablePhotos = true;
|
EnablePhotos = true;
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
using System;
|
using MediaBrowser.Model.Entities;
|
||||||
using MediaBrowser.Model.Entities;
|
|
||||||
using MediaBrowser.Model.Extensions;
|
using MediaBrowser.Model.Extensions;
|
||||||
using MediaBrowser.Model.MediaInfo;
|
using MediaBrowser.Model.MediaInfo;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using MediaBrowser.Model.Serialization;
|
using MediaBrowser.Model.Serialization;
|
||||||
|
|
||||||
namespace MediaBrowser.Model.Dto
|
namespace MediaBrowser.Model.Dto
|
||||||
|
@ -72,6 +72,32 @@ namespace MediaBrowser.Model.Dto
|
||||||
SupportsProbing = true;
|
SupportsProbing = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void InferTotalBitrate()
|
||||||
|
{
|
||||||
|
if (Bitrate.HasValue || MediaStreams == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var internalStreams = MediaStreams
|
||||||
|
.Where(i => !i.IsExternal)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
if (internalStreams.Count == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var bitrate = internalStreams
|
||||||
|
.Select(m => m.BitRate ?? 0)
|
||||||
|
.Sum();
|
||||||
|
|
||||||
|
if (bitrate > 0)
|
||||||
|
{
|
||||||
|
Bitrate = bitrate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public int? DefaultAudioStreamIndex { get; set; }
|
public int? DefaultAudioStreamIndex { get; set; }
|
||||||
public int? DefaultSubtitleStreamIndex { get; set; }
|
public int? DefaultSubtitleStreamIndex { get; set; }
|
||||||
|
|
||||||
|
|
|
@ -16,12 +16,6 @@ namespace MediaBrowser.Model.System
|
||||||
/// <value>The display name of the operating system.</value>
|
/// <value>The display name of the operating system.</value>
|
||||||
public string OperatingSystemDisplayName { get; set; }
|
public string OperatingSystemDisplayName { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets a value indicating whether this instance is running as service.
|
|
||||||
/// </summary>
|
|
||||||
/// <value><c>true</c> if this instance is running as service; otherwise, <c>false</c>.</value>
|
|
||||||
public bool IsRunningAsService { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets a value indicating whether [supports running as service].
|
/// Gets or sets a value indicating whether [supports running as service].
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -237,17 +237,17 @@ namespace MediaBrowser.Providers.Manager
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IImageProvider> GetImageProviders(IHasImages item, ImageRefreshOptions refreshOptions)
|
public IEnumerable<IImageProvider> GetImageProviders(IHasImages item, ImageRefreshOptions refreshOptions)
|
||||||
{
|
{
|
||||||
return GetImageProviders(item, GetMetadataOptions(item), refreshOptions, false);
|
return GetImageProviders(item, GetMetadataOptions(item), refreshOptions, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerable<IImageProvider> GetImageProviders(IHasImages item, MetadataOptions options, ImageRefreshOptions refreshOptions, bool includeDisabled)
|
private IEnumerable<IImageProvider> GetImageProviders(IHasImages item, MetadataOptions options, ImageRefreshOptions refreshOptions, bool includeDisabled)
|
||||||
{
|
{
|
||||||
// Avoid implicitly captured closure
|
// Avoid implicitly captured closure
|
||||||
var currentOptions = options;
|
var currentOptions = options;
|
||||||
|
|
||||||
return ImageProviders.Where(i => CanRefresh(i, item, options, refreshOptions, includeDisabled))
|
return ImageProviders.Where(i => CanRefresh(i, item, options, refreshOptions, includeDisabled))
|
||||||
.OrderBy(i =>
|
.OrderBy(i =>
|
||||||
{
|
{
|
||||||
// See if there's a user-defined order
|
// See if there's a user-defined order
|
||||||
|
@ -291,7 +291,7 @@ namespace MediaBrowser.Providers.Manager
|
||||||
{
|
{
|
||||||
var options = GetMetadataOptions(item);
|
var options = GetMetadataOptions(item);
|
||||||
|
|
||||||
return GetImageProviders(item, options, new ImageRefreshOptions(new DirectoryService(_logger, _fileSystem)), includeDisabled).OfType<IRemoteImageProvider>();
|
return GetImageProviders(item, options, new ImageRefreshOptions(new DirectoryService(_logger, _fileSystem)), includeDisabled).OfType<IRemoteImageProvider>();
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool CanRefresh(IMetadataProvider provider, IHasMetadata item, MetadataOptions options, bool includeDisabled, bool forceEnableInternetMetadata, bool checkIsOwnedItem)
|
private bool CanRefresh(IMetadataProvider provider, IHasMetadata item, MetadataOptions options, bool includeDisabled, bool forceEnableInternetMetadata, bool checkIsOwnedItem)
|
||||||
|
@ -335,17 +335,17 @@ namespace MediaBrowser.Providers.Manager
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool CanRefresh(IImageProvider provider, IHasImages item, MetadataOptions options, ImageRefreshOptions refreshOptions, bool includeDisabled)
|
private bool CanRefresh(IImageProvider provider, IHasImages item, MetadataOptions options, ImageRefreshOptions refreshOptions, bool includeDisabled)
|
||||||
{
|
{
|
||||||
if (!includeDisabled)
|
if (!includeDisabled)
|
||||||
{
|
{
|
||||||
// If locked only allow local providers
|
// If locked only allow local providers
|
||||||
if (item.IsLocked && !(provider is ILocalImageProvider))
|
if (item.IsLocked && !(provider is ILocalImageProvider))
|
||||||
{
|
{
|
||||||
if (refreshOptions.ImageRefreshMode != ImageRefreshMode.FullRefresh)
|
if (refreshOptions.ImageRefreshMode != ImageRefreshMode.FullRefresh)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (provider is IRemoteImageProvider || provider is IDynamicImageProvider)
|
if (provider is IRemoteImageProvider || provider is IDynamicImageProvider)
|
||||||
|
@ -481,7 +481,7 @@ namespace MediaBrowser.Providers.Manager
|
||||||
ItemType = typeof(T).Name
|
ItemType = typeof(T).Name
|
||||||
};
|
};
|
||||||
|
|
||||||
var imageProviders = GetImageProviders(dummy, options, new ImageRefreshOptions(new DirectoryService(_logger, _fileSystem)), true).ToList();
|
var imageProviders = GetImageProviders(dummy, options, new ImageRefreshOptions(new DirectoryService(_logger, _fileSystem)), true).ToList();
|
||||||
|
|
||||||
AddMetadataPlugins(summary.Plugins, dummy, options);
|
AddMetadataPlugins(summary.Plugins, dummy, options);
|
||||||
AddImagePlugins(summary.Plugins, dummy, imageProviders);
|
AddImagePlugins(summary.Plugins, dummy, imageProviders);
|
||||||
|
@ -578,7 +578,7 @@ namespace MediaBrowser.Providers.Manager
|
||||||
return SaveMetadata(item, updateType, _savers.Where(i => savers.Contains(i.Name, StringComparer.OrdinalIgnoreCase)));
|
return SaveMetadata(item, updateType, _savers.Where(i => savers.Contains(i.Name, StringComparer.OrdinalIgnoreCase)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly SemaphoreSlim _saveLock = new SemaphoreSlim(1,1);
|
private readonly SemaphoreSlim _saveLock = new SemaphoreSlim(1, 1);
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Saves the metadata.
|
/// Saves the metadata.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -958,11 +958,14 @@ namespace MediaBrowser.Providers.Manager
|
||||||
{
|
{
|
||||||
var cancellationToken = CancellationToken.None;
|
var cancellationToken = CancellationToken.None;
|
||||||
|
|
||||||
var albums = _libraryManagerFactory().RootFolder
|
var albums = _libraryManagerFactory()
|
||||||
.GetRecursiveChildren()
|
.GetItemList(new InternalItemsQuery
|
||||||
.OfType<MusicAlbum>()
|
{
|
||||||
.Where(i => i.HasAnyArtist(item.Name))
|
IncludeItemTypes = new[] { typeof(MusicAlbum).Name },
|
||||||
.ToList();
|
ArtistIds = new[] { item.Id.ToString("N") }
|
||||||
|
})
|
||||||
|
.OfType<MusicAlbum>()
|
||||||
|
.ToList();
|
||||||
|
|
||||||
var musicArtists = albums
|
var musicArtists = albums
|
||||||
.Select(i => i.MusicArtist)
|
.Select(i => i.MusicArtist)
|
||||||
|
|
|
@ -115,6 +115,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.SatIp
|
||||||
RequiresClosing = false
|
RequiresClosing = false
|
||||||
};
|
};
|
||||||
|
|
||||||
|
mediaSource.InferTotalBitrate();
|
||||||
|
|
||||||
return new List<MediaSourceInfo> { mediaSource };
|
return new List<MediaSourceInfo> { mediaSource };
|
||||||
}
|
}
|
||||||
return new List<MediaSourceInfo>();
|
return new List<MediaSourceInfo>();
|
||||||
|
|
|
@ -972,9 +972,6 @@
|
||||||
<Content Include="dashboard-ui\wizardlivetvtuner.html">
|
<Content Include="dashboard-ui\wizardlivetvtuner.html">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
<Content Include="dashboard-ui\wizardsettings.html">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
<Content Include="dashboard-ui\index.html">
|
<Content Include="dashboard-ui\index.html">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
@ -1074,11 +1071,6 @@
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
|
||||||
<Content Include="dashboard-ui\metadata.html">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Content Include="dashboard-ui\scripts\tvgenres.js">
|
<Content Include="dashboard-ui\scripts\tvgenres.js">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
@ -1175,11 +1167,6 @@
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
|
||||||
<Content Include="dashboard-ui\scripts\metadataconfigurationpage.js">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Content Include="dashboard-ui\scripts\loginpage.js">
|
<Content Include="dashboard-ui\scripts\loginpage.js">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
@ -1231,6 +1218,9 @@
|
||||||
</Content>
|
</Content>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Content Include="dashboard-ui\wizardsettings.html">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
<Content Include="dashboard-ui\wizardstart.html">
|
<Content Include="dashboard-ui\wizardstart.html">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user