commit
02aa4229fb
|
@ -821,9 +821,14 @@ namespace MediaBrowser.Api.Playback
|
||||||
/// <returns>System.String.</returns>
|
/// <returns>System.String.</returns>
|
||||||
protected string GetVideoDecoder(StreamState state)
|
protected string GetVideoDecoder(StreamState state)
|
||||||
{
|
{
|
||||||
if (string.Equals(ApiEntryPoint.Instance.GetEncodingOptions().HardwareAccelerationType, "qsv", StringComparison.OrdinalIgnoreCase))
|
if (string.Equals(state.OutputVideoCodec, "copy", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
if (state.VideoStream != null && !string.IsNullOrWhiteSpace(state.VideoStream.Codec))
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state.VideoStream != null && !string.IsNullOrWhiteSpace(state.VideoStream.Codec))
|
||||||
|
{
|
||||||
|
if (string.Equals(ApiEntryPoint.Instance.GetEncodingOptions().HardwareAccelerationType, "qsv", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
switch (state.MediaSource.VideoStream.Codec.ToLower())
|
switch (state.MediaSource.VideoStream.Codec.ToLower())
|
||||||
{
|
{
|
||||||
|
@ -831,7 +836,8 @@ namespace MediaBrowser.Api.Playback
|
||||||
case "h264":
|
case "h264":
|
||||||
if (MediaEncoder.SupportsDecoder("h264_qsv"))
|
if (MediaEncoder.SupportsDecoder("h264_qsv"))
|
||||||
{
|
{
|
||||||
return "-c:v h264_qsv ";
|
// Seeing stalls and failures with decoding. Not worth it compared to encoding.
|
||||||
|
//return "-c:v h264_qsv ";
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "mpeg2video":
|
case "mpeg2video":
|
||||||
|
@ -1033,7 +1039,7 @@ namespace MediaBrowser.Api.Playback
|
||||||
process.BeginOutputReadLine();
|
process.BeginOutputReadLine();
|
||||||
|
|
||||||
// Important - don't await the log task or we won't be able to kill ffmpeg when the user stops playback
|
// Important - don't await the log task or we won't be able to kill ffmpeg when the user stops playback
|
||||||
StartStreamingLog(transcodingJob, state, process.StandardError.BaseStream, state.LogFileStream);
|
Task.Run(() => StartStreamingLog(transcodingJob, state, process.StandardError.BaseStream, state.LogFileStream));
|
||||||
|
|
||||||
// Wait for the file to exist before proceeeding
|
// Wait for the file to exist before proceeeding
|
||||||
while (!FileSystem.FileExists(state.WaitForPath ?? outputPath) && !transcodingJob.HasExited)
|
while (!FileSystem.FileExists(state.WaitForPath ?? outputPath) && !transcodingJob.HasExited)
|
||||||
|
@ -1076,7 +1082,7 @@ namespace MediaBrowser.Api.Playback
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void StartStreamingLog(TranscodingJob transcodingJob, StreamState state, Stream source, Stream target)
|
private async Task StartStreamingLog(TranscodingJob transcodingJob, StreamState state, Stream source, Stream target)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
|
@ -123,7 +123,6 @@ namespace MediaBrowser.Controller.Entities
|
||||||
public SourceType[] SourceTypes { get; set; }
|
public SourceType[] SourceTypes { get; set; }
|
||||||
public SourceType[] ExcludeSourceTypes { get; set; }
|
public SourceType[] ExcludeSourceTypes { get; set; }
|
||||||
public TrailerType[] TrailerTypes { get; set; }
|
public TrailerType[] TrailerTypes { get; set; }
|
||||||
public TrailerType[] ExcludeTrailerTypes { get; set; }
|
|
||||||
|
|
||||||
public DayOfWeek[] AirDays { get; set; }
|
public DayOfWeek[] AirDays { get; set; }
|
||||||
public SeriesStatus[] SeriesStatuses { get; set; }
|
public SeriesStatus[] SeriesStatuses { get; set; }
|
||||||
|
@ -165,7 +164,6 @@ namespace MediaBrowser.Controller.Entities
|
||||||
SourceTypes = new SourceType[] { };
|
SourceTypes = new SourceType[] { };
|
||||||
ExcludeSourceTypes = new SourceType[] { };
|
ExcludeSourceTypes = new SourceType[] { };
|
||||||
TrailerTypes = new TrailerType[] { };
|
TrailerTypes = new TrailerType[] { };
|
||||||
ExcludeTrailerTypes = new TrailerType[] { };
|
|
||||||
AirDays = new DayOfWeek[] { };
|
AirDays = new DayOfWeek[] { };
|
||||||
SeriesStatuses = new SeriesStatus[] { };
|
SeriesStatuses = new SeriesStatus[] { };
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,19 +41,36 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const string vn = " -vn";
|
|
||||||
|
|
||||||
var threads = GetNumberOfThreads(state, false);
|
var threads = GetNumberOfThreads(state, false);
|
||||||
|
|
||||||
var inputModifier = GetInputModifier(state);
|
var inputModifier = GetInputModifier(state);
|
||||||
|
|
||||||
return string.Format("{0} {1} -threads {2}{3} {4} -id3v2_version 3 -write_id3v1 1 -y \"{5}\"",
|
var albumCoverInput = string.Empty;
|
||||||
|
var mapArgs = string.Empty;
|
||||||
|
var metadata = string.Empty;
|
||||||
|
var vn = string.Empty;
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(state.AlbumCoverPath))
|
||||||
|
{
|
||||||
|
albumCoverInput = " -i \"" + state.AlbumCoverPath + "\"";
|
||||||
|
mapArgs = " -map 0:a -map 1:v -c:v copy";
|
||||||
|
metadata = " -metadata:s:v title=\"Album cover\" -metadata:s:v comment=\"Cover(Front)\"";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vn = " -vn";
|
||||||
|
}
|
||||||
|
|
||||||
|
return string.Format("{0} {1}{6}{7} -threads {2}{3} {4} -id3v2_version 3 -write_id3v1 1{8} -y \"{5}\"",
|
||||||
inputModifier,
|
inputModifier,
|
||||||
GetInputArgument(state),
|
GetInputArgument(state),
|
||||||
threads,
|
threads,
|
||||||
vn,
|
vn,
|
||||||
string.Join(" ", audioTranscodeParams.ToArray()),
|
string.Join(" ", audioTranscodeParams.ToArray()),
|
||||||
state.OutputFilePath).Trim();
|
state.OutputFilePath,
|
||||||
|
albumCoverInput,
|
||||||
|
mapArgs,
|
||||||
|
metadata).Trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override string GetOutputFileExtension(EncodingJob state)
|
protected override string GetOutputFileExtension(EncodingJob state)
|
||||||
|
|
|
@ -366,9 +366,14 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
||||||
/// <returns>System.String.</returns>
|
/// <returns>System.String.</returns>
|
||||||
protected string GetVideoDecoder(EncodingJob state)
|
protected string GetVideoDecoder(EncodingJob state)
|
||||||
{
|
{
|
||||||
if (string.Equals(GetEncodingOptions().HardwareAccelerationType, "qsv", StringComparison.OrdinalIgnoreCase))
|
if (string.Equals(state.OutputVideoCodec, "copy", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
if (state.VideoStream != null && !string.IsNullOrWhiteSpace(state.VideoStream.Codec))
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state.VideoStream != null && !string.IsNullOrWhiteSpace(state.VideoStream.Codec))
|
||||||
|
{
|
||||||
|
if (string.Equals(GetEncodingOptions().HardwareAccelerationType, "qsv", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
switch (state.MediaSource.VideoStream.Codec.ToLower())
|
switch (state.MediaSource.VideoStream.Codec.ToLower())
|
||||||
{
|
{
|
||||||
|
@ -376,7 +381,8 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
||||||
case "h264":
|
case "h264":
|
||||||
if (MediaEncoder.SupportsDecoder("h264_qsv"))
|
if (MediaEncoder.SupportsDecoder("h264_qsv"))
|
||||||
{
|
{
|
||||||
return "-c:v h264_qsv ";
|
// Seeing stalls and failures with decoding. Not worth it compared to encoding.
|
||||||
|
//return "-c:v h264_qsv ";
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "mpeg2video":
|
case "mpeg2video":
|
||||||
|
|
|
@ -64,6 +64,7 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
||||||
public long? InputFileSize { get; set; }
|
public long? InputFileSize { get; set; }
|
||||||
public string OutputAudioSync = "1";
|
public string OutputAudioSync = "1";
|
||||||
public string OutputVideoSync = "vfr";
|
public string OutputVideoSync = "vfr";
|
||||||
|
public string AlbumCoverPath { get; set; }
|
||||||
|
|
||||||
public string GetMimeType(string outputPath)
|
public string GetMimeType(string outputPath)
|
||||||
{
|
{
|
||||||
|
|
|
@ -60,6 +60,14 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
||||||
|
|
||||||
state.IsInputVideo = string.Equals(item.MediaType, MediaType.Video, StringComparison.OrdinalIgnoreCase);
|
state.IsInputVideo = string.Equals(item.MediaType, MediaType.Video, StringComparison.OrdinalIgnoreCase);
|
||||||
|
|
||||||
|
var primaryImage = item.GetImageInfo(ImageType.Primary, 0) ??
|
||||||
|
item.Parents.Select(i => i.GetImageInfo(ImageType.Primary, 0)).FirstOrDefault(i => i != null);
|
||||||
|
|
||||||
|
if (primaryImage != null)
|
||||||
|
{
|
||||||
|
state.AlbumCoverPath = primaryImage.Path;
|
||||||
|
}
|
||||||
|
|
||||||
var mediaSources = await _mediaSourceManager.GetPlayackMediaSources(request.ItemId, null, false, new[] { MediaType.Audio, MediaType.Video }, cancellationToken).ConfigureAwait(false);
|
var mediaSources = await _mediaSourceManager.GetPlayackMediaSources(request.ItemId, null, false, new[] { MediaType.Audio, MediaType.Video }, cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
var mediaSource = string.IsNullOrEmpty(request.MediaSourceId)
|
var mediaSource = string.IsNullOrEmpty(request.MediaSourceId)
|
||||||
|
|
|
@ -61,7 +61,7 @@ namespace MediaBrowser.Providers.BoxSets
|
||||||
{
|
{
|
||||||
var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false);
|
var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
var tmdbImageUrl = tmdbSettings.images.base_url + "original";
|
var tmdbImageUrl = tmdbSettings.images.secure_base_url + "original";
|
||||||
|
|
||||||
return GetImages(mainResult, language, tmdbImageUrl);
|
return GetImages(mainResult, language, tmdbImageUrl);
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,7 +64,7 @@ namespace MediaBrowser.Providers.BoxSets
|
||||||
|
|
||||||
var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false);
|
var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
var tmdbImageUrl = tmdbSettings.images.base_url + "original";
|
var tmdbImageUrl = tmdbSettings.images.secure_base_url + "original";
|
||||||
|
|
||||||
var result = new RemoteSearchResult
|
var result = new RemoteSearchResult
|
||||||
{
|
{
|
||||||
|
|
|
@ -16,6 +16,7 @@ using System.Collections.Generic;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using CommonIO;
|
using CommonIO;
|
||||||
|
@ -185,6 +186,7 @@ namespace MediaBrowser.Providers.Movies
|
||||||
PopulateImages(list, obj.moviebackground, ImageType.Backdrop, 1920, 1080);
|
PopulateImages(list, obj.moviebackground, ImageType.Backdrop, 1920, 1080);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Regex _regex_http = new Regex("^http://");
|
||||||
private void PopulateImages(List<RemoteImageInfo> list, List<Image> images, ImageType type, int width, int height)
|
private void PopulateImages(List<RemoteImageInfo> list, List<Image> images, ImageType type, int width, int height)
|
||||||
{
|
{
|
||||||
if (images == null)
|
if (images == null)
|
||||||
|
@ -208,7 +210,7 @@ namespace MediaBrowser.Providers.Movies
|
||||||
Width = width,
|
Width = width,
|
||||||
Height = height,
|
Height = height,
|
||||||
ProviderName = Name,
|
ProviderName = Name,
|
||||||
Url = url,
|
Url = _regex_http.Replace(url, "https://", 1),
|
||||||
Language = i.lang
|
Language = i.lang
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -249,7 +249,7 @@ namespace MediaBrowser.Providers.Movies
|
||||||
}
|
}
|
||||||
|
|
||||||
resultItem.ResetPeople();
|
resultItem.ResetPeople();
|
||||||
var tmdbImageUrl = settings.images.base_url + "original";
|
var tmdbImageUrl = settings.images.secure_base_url + "original";
|
||||||
|
|
||||||
//Actors, Directors, Writers - all in People
|
//Actors, Directors, Writers - all in People
|
||||||
//actors come from cast
|
//actors come from cast
|
||||||
|
|
|
@ -72,7 +72,7 @@ namespace MediaBrowser.Providers.Movies
|
||||||
|
|
||||||
var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false);
|
var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
var tmdbImageUrl = tmdbSettings.images.base_url + "original";
|
var tmdbImageUrl = tmdbSettings.images.secure_base_url + "original";
|
||||||
|
|
||||||
var supportedImages = GetSupportedImages(item).ToList();
|
var supportedImages = GetSupportedImages(item).ToList();
|
||||||
|
|
||||||
|
|
|
@ -78,7 +78,7 @@ namespace MediaBrowser.Providers.Movies
|
||||||
|
|
||||||
var tmdbSettings = await GetTmdbSettings(cancellationToken).ConfigureAwait(false);
|
var tmdbSettings = await GetTmdbSettings(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
var tmdbImageUrl = tmdbSettings.images.base_url + "original";
|
var tmdbImageUrl = tmdbSettings.images.secure_base_url + "original";
|
||||||
|
|
||||||
var remoteResult = new RemoteSearchResult
|
var remoteResult = new RemoteSearchResult
|
||||||
{
|
{
|
||||||
|
|
|
@ -56,7 +56,7 @@ namespace MediaBrowser.Providers.Movies
|
||||||
|
|
||||||
var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false);
|
var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
var tmdbImageUrl = tmdbSettings.images.base_url + "original";
|
var tmdbImageUrl = tmdbSettings.images.secure_base_url + "original";
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(name))
|
if (!string.IsNullOrWhiteSpace(name))
|
||||||
{
|
{
|
||||||
|
|
|
@ -5,7 +5,7 @@ namespace MediaBrowser.Providers.Movies
|
||||||
internal class TmdbImageSettings
|
internal class TmdbImageSettings
|
||||||
{
|
{
|
||||||
public List<string> backdrop_sizes { get; set; }
|
public List<string> backdrop_sizes { get; set; }
|
||||||
public string base_url { get; set; }
|
public string secure_base_url { get; set; }
|
||||||
public List<string> poster_sizes { get; set; }
|
public List<string> poster_sizes { get; set; }
|
||||||
public List<string> profile_sizes { get; set; }
|
public List<string> profile_sizes { get; set; }
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,7 +67,7 @@ namespace MediaBrowser.Providers.People
|
||||||
|
|
||||||
var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false);
|
var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
var tmdbImageUrl = tmdbSettings.images.base_url + "original";
|
var tmdbImageUrl = tmdbSettings.images.secure_base_url + "original";
|
||||||
|
|
||||||
return GetImages(images, item.GetPreferredMetadataLanguage(), tmdbImageUrl);
|
return GetImages(images, item.GetPreferredMetadataLanguage(), tmdbImageUrl);
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,7 +59,7 @@ namespace MediaBrowser.Providers.People
|
||||||
|
|
||||||
var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false);
|
var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
var tmdbImageUrl = tmdbSettings.images.base_url + "original";
|
var tmdbImageUrl = tmdbSettings.images.secure_base_url + "original";
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(tmdbId))
|
if (!string.IsNullOrEmpty(tmdbId))
|
||||||
{
|
{
|
||||||
|
|
|
@ -62,7 +62,7 @@ namespace MediaBrowser.Providers.TV
|
||||||
|
|
||||||
var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false);
|
var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
var tmdbImageUrl = tmdbSettings.images.base_url + "original";
|
var tmdbImageUrl = tmdbSettings.images.secure_base_url + "original";
|
||||||
|
|
||||||
list.AddRange(GetPosters(response.images).Select(i => new RemoteImageInfo
|
list.AddRange(GetPosters(response.images).Select(i => new RemoteImageInfo
|
||||||
{
|
{
|
||||||
|
|
|
@ -64,7 +64,7 @@ namespace MediaBrowser.Providers.TV
|
||||||
|
|
||||||
var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false);
|
var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
var tmdbImageUrl = tmdbSettings.images.base_url + "original";
|
var tmdbImageUrl = tmdbSettings.images.secure_base_url + "original";
|
||||||
|
|
||||||
list.AddRange(GetPosters(results).Select(i => new RemoteImageInfo
|
list.AddRange(GetPosters(results).Select(i => new RemoteImageInfo
|
||||||
{
|
{
|
||||||
|
|
|
@ -69,7 +69,7 @@ namespace MediaBrowser.Providers.TV
|
||||||
var obj = _jsonSerializer.DeserializeFromFile<RootObject>(dataFilePath);
|
var obj = _jsonSerializer.DeserializeFromFile<RootObject>(dataFilePath);
|
||||||
|
|
||||||
var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false);
|
var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false);
|
||||||
var tmdbImageUrl = tmdbSettings.images.base_url + "original";
|
var tmdbImageUrl = tmdbSettings.images.secure_base_url + "original";
|
||||||
|
|
||||||
var remoteResult = new RemoteSearchResult
|
var remoteResult = new RemoteSearchResult
|
||||||
{
|
{
|
||||||
|
@ -460,7 +460,7 @@ namespace MediaBrowser.Providers.TV
|
||||||
if (tv != null)
|
if (tv != null)
|
||||||
{
|
{
|
||||||
var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false);
|
var tmdbSettings = await MovieDbProvider.Current.GetTmdbSettings(cancellationToken).ConfigureAwait(false);
|
||||||
var tmdbImageUrl = tmdbSettings.images.base_url + "original";
|
var tmdbImageUrl = tmdbSettings.images.secure_base_url + "original";
|
||||||
|
|
||||||
var remoteResult = new RemoteSearchResult
|
var remoteResult = new RemoteSearchResult
|
||||||
{
|
{
|
||||||
|
|
|
@ -102,15 +102,10 @@ namespace MediaBrowser.Server.Implementations.Intros
|
||||||
|
|
||||||
if (trailerTypes.Count > 0)
|
if (trailerTypes.Count > 0)
|
||||||
{
|
{
|
||||||
var excludeTrailerTypes = Enum.GetNames(typeof(TrailerType))
|
|
||||||
.Select(i => (TrailerType)Enum.Parse(typeof(TrailerType), i, true))
|
|
||||||
.Except(trailerTypes)
|
|
||||||
.ToArray();
|
|
||||||
|
|
||||||
var trailerResult = _libraryManager.GetItemList(new InternalItemsQuery
|
var trailerResult = _libraryManager.GetItemList(new InternalItemsQuery
|
||||||
{
|
{
|
||||||
IncludeItemTypes = new[] { typeof(Trailer).Name },
|
IncludeItemTypes = new[] { typeof(Trailer).Name },
|
||||||
ExcludeTrailerTypes = excludeTrailerTypes
|
TrailerTypes = trailerTypes.ToArray()
|
||||||
});
|
});
|
||||||
|
|
||||||
candidates.AddRange(trailerResult.Select(i => new ItemWithTrailer
|
candidates.AddRange(trailerResult.Select(i => new ItemWithTrailer
|
||||||
|
|
|
@ -27,13 +27,16 @@ namespace MediaBrowser.Server.Implementations.Library
|
||||||
.Cast<IHasTrailers>()
|
.Cast<IHasTrailers>()
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
|
var trailerTypes = Enum.GetNames(typeof(TrailerType))
|
||||||
|
.Select(i => (TrailerType)Enum.Parse(typeof(TrailerType), i, true))
|
||||||
|
.Except(new[] { TrailerType.LocalTrailer })
|
||||||
|
.ToArray();
|
||||||
|
|
||||||
var trailers = _libraryManager.GetItemList(new InternalItemsQuery
|
var trailers = _libraryManager.GetItemList(new InternalItemsQuery
|
||||||
{
|
{
|
||||||
IncludeItemTypes = new[] { typeof(Trailer).Name },
|
IncludeItemTypes = new[] { typeof(Trailer).Name },
|
||||||
ExcludeTrailerTypes = new[]
|
TrailerTypes = trailerTypes
|
||||||
{
|
|
||||||
TrailerType.LocalTrailer
|
|
||||||
}
|
|
||||||
}).ToArray();
|
}).ToArray();
|
||||||
|
|
||||||
var numComplete = 0;
|
var numComplete = 0;
|
||||||
|
|
|
@ -42,8 +42,16 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
||||||
|
|
||||||
_logger.Info("Copying recording stream to file {0}", targetFile);
|
_logger.Info("Copying recording stream to file {0}", targetFile);
|
||||||
|
|
||||||
if (!mediaSource.RunTimeTicks.HasValue)
|
if (mediaSource.RunTimeTicks.HasValue)
|
||||||
{
|
{
|
||||||
|
// The media source already has a fixed duration
|
||||||
|
// But add another stop 1 minute later just in case the recording gets stuck for any reason
|
||||||
|
var durationToken = new CancellationTokenSource(duration.Add(TimeSpan.FromMinutes(1)));
|
||||||
|
cancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, durationToken.Token).Token;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// The media source if infinite so we need to handle stopping ourselves
|
||||||
var durationToken = new CancellationTokenSource(duration);
|
var durationToken = new CancellationTokenSource(duration);
|
||||||
cancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, durationToken.Token).Token;
|
cancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, durationToken.Token).Token;
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,6 +44,20 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
||||||
|
|
||||||
public async Task Record(MediaSourceInfo mediaSource, string targetFile, TimeSpan duration, Action onStarted, CancellationToken cancellationToken)
|
public async Task Record(MediaSourceInfo mediaSource, string targetFile, TimeSpan duration, Action onStarted, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
|
if (mediaSource.RunTimeTicks.HasValue)
|
||||||
|
{
|
||||||
|
// The media source already has a fixed duration
|
||||||
|
// But add another stop 1 minute later just in case the recording gets stuck for any reason
|
||||||
|
var durationToken = new CancellationTokenSource(duration.Add(TimeSpan.FromMinutes(1)));
|
||||||
|
cancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, durationToken.Token).Token;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// The media source if infinite so we need to handle stopping ourselves
|
||||||
|
var durationToken = new CancellationTokenSource(duration);
|
||||||
|
cancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, durationToken.Token).Token;
|
||||||
|
}
|
||||||
|
|
||||||
_targetPath = targetFile;
|
_targetPath = targetFile;
|
||||||
_fileSystem.CreateDirectory(Path.GetDirectoryName(targetFile));
|
_fileSystem.CreateDirectory(Path.GetDirectoryName(targetFile));
|
||||||
|
|
||||||
|
@ -143,7 +157,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
||||||
{
|
{
|
||||||
audioChannels = audioStream.Channels ?? audioChannels;
|
audioChannels = audioStream.Channels ?? audioChannels;
|
||||||
}
|
}
|
||||||
return "-codec:a:0 aac -strict experimental -ab 320000";
|
return "-codec:a:0 aac -strict experimental -ab 320000 -af \"async=1000\"";
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool EncodeVideo(MediaSourceInfo mediaSource)
|
private bool EncodeVideo(MediaSourceInfo mediaSource)
|
||||||
|
|
|
@ -1961,20 +1961,6 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||||
whereClauses.Add(clause);
|
whereClauses.Add(clause);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (query.ExcludeTrailerTypes.Length > 0)
|
|
||||||
{
|
|
||||||
var clauses = new List<string>();
|
|
||||||
var index = 0;
|
|
||||||
foreach (var type in query.ExcludeTrailerTypes)
|
|
||||||
{
|
|
||||||
clauses.Add("(TrailerTypes is null OR TrailerTypes not like @TrailerTypes" + index + ")");
|
|
||||||
cmd.Parameters.Add(cmd, "@TrailerTypes" + index, DbType.String).Value = "%" + type + "%";
|
|
||||||
index++;
|
|
||||||
}
|
|
||||||
var clause = "(" + string.Join(" AND ", clauses.ToArray()) + ")";
|
|
||||||
whereClauses.Add(clause);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (query.IsAiring.HasValue)
|
if (query.IsAiring.HasValue)
|
||||||
{
|
{
|
||||||
if (query.IsAiring.Value)
|
if (query.IsAiring.Value)
|
||||||
|
|
|
@ -368,9 +368,6 @@
|
||||||
<Content Include="dashboard-ui\scripts\shared.js">
|
<Content Include="dashboard-ui\scripts\shared.js">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
<Content Include="dashboard-ui\components\sharingwidget.js">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
<Content Include="dashboard-ui\scripts\supporterkeypage.js">
|
<Content Include="dashboard-ui\scripts\supporterkeypage.js">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
@ -473,17 +470,6 @@
|
||||||
<Content Include="dashboard-ui\thirdparty\paper-button-style.css">
|
<Content Include="dashboard-ui\thirdparty\paper-button-style.css">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
<Content Include="dashboard-ui\thirdparty\social-share-kit-1.0.4\.gitignore" />
|
|
||||||
<Content Include="dashboard-ui\thirdparty\social-share-kit-1.0.4\dist\css\social-share-kit.css">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
<Content Include="dashboard-ui\thirdparty\social-share-kit-1.0.4\dist\fonts\social-share-kit.svg">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
<Content Include="dashboard-ui\thirdparty\social-share-kit-1.0.4\dist\js\social-share-kit.js" />
|
|
||||||
<Content Include="dashboard-ui\thirdparty\social-share-kit-1.0.4\dist\js\social-share-kit.min.js">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
<Content Include="dashboard-ui\components\tvproviders\schedulesdirect.js">
|
<Content Include="dashboard-ui\components\tvproviders\schedulesdirect.js">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
@ -1730,17 +1716,6 @@
|
||||||
<None Include="dashboard-ui\thirdparty\jquerymobile-1.4.5\jquery.mobile-1.4.5.min.map">
|
<None Include="dashboard-ui\thirdparty\jquerymobile-1.4.5\jquery.mobile-1.4.5.min.map">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</None>
|
</None>
|
||||||
<None Include="dashboard-ui\thirdparty\social-share-kit-1.0.4\dist\fonts\social-share-kit.eot">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</None>
|
|
||||||
<None Include="dashboard-ui\thirdparty\social-share-kit-1.0.4\dist\fonts\social-share-kit.ttf">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</None>
|
|
||||||
<None Include="dashboard-ui\thirdparty\social-share-kit-1.0.4\dist\fonts\social-share-kit.woff">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</None>
|
|
||||||
<None Include="dashboard-ui\thirdparty\social-share-kit-1.0.4\LICENSE" />
|
|
||||||
<None Include="dashboard-ui\thirdparty\social-share-kit-1.0.4\README.md" />
|
|
||||||
<None Include="dashboard-ui\voice\grammar\en-US.json">
|
<None Include="dashboard-ui\voice\grammar\en-US.json">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</None>
|
</None>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user