aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Api
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2016-04-09 22:32:27 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2016-04-09 22:32:27 -0400
commit6ea48d1e7c32f159c2e8c92f73f84b09bb78ec3f (patch)
treefd907ec9c752b7c760ab764f74a15b35f6ff660d /MediaBrowser.Api
parentbe4f301198fa0d1d455478eebfc960a6e61c33e9 (diff)
parent638dba51ec75f9180c44ec4e75b67f7cea774910 (diff)
Merge branch 'beta'
Diffstat (limited to 'MediaBrowser.Api')
-rw-r--r--MediaBrowser.Api/ApiEntryPoint.cs3
-rw-r--r--MediaBrowser.Api/BaseApiService.cs1
-rw-r--r--MediaBrowser.Api/ConfigurationService.cs4
-rw-r--r--MediaBrowser.Api/DisplayPreferencesService.cs1
-rw-r--r--MediaBrowser.Api/Images/ImageByNameService.cs1
-rw-r--r--MediaBrowser.Api/Images/RemoteImageService.cs1
-rw-r--r--MediaBrowser.Api/ItemLookupService.cs16
-rw-r--r--MediaBrowser.Api/ItemRefreshService.cs1
-rw-r--r--MediaBrowser.Api/ItemUpdateService.cs2
-rw-r--r--MediaBrowser.Api/Library/LibraryHelpers.cs3
-rw-r--r--MediaBrowser.Api/Library/LibraryService.cs4
-rw-r--r--MediaBrowser.Api/Library/LibraryStructureService.cs3
-rw-r--r--MediaBrowser.Api/LiveTv/LiveTvService.cs16
-rw-r--r--MediaBrowser.Api/MediaBrowser.Api.csproj2
-rw-r--r--MediaBrowser.Api/Movies/MoviesService.cs3
-rw-r--r--MediaBrowser.Api/Movies/TrailersService.cs8
-rw-r--r--MediaBrowser.Api/Music/AlbumsService.cs1
-rw-r--r--MediaBrowser.Api/Playback/BaseStreamingService.cs56
-rw-r--r--MediaBrowser.Api/Playback/Dash/ManifestBuilder.cs224
-rw-r--r--MediaBrowser.Api/Playback/Dash/MpegDashService.cs548
-rw-r--r--MediaBrowser.Api/Playback/Hls/BaseHlsService.cs64
-rw-r--r--MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs38
-rw-r--r--MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs19
-rw-r--r--MediaBrowser.Api/Playback/Hls/VideoHlsService.cs11
-rw-r--r--MediaBrowser.Api/Playback/Progressive/AudioService.cs4
-rw-r--r--MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs4
-rw-r--r--MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs3
-rw-r--r--MediaBrowser.Api/Playback/Progressive/VideoService.cs6
-rw-r--r--MediaBrowser.Api/Playback/StreamRequest.cs7
-rw-r--r--MediaBrowser.Api/Playback/StreamState.cs15
-rw-r--r--MediaBrowser.Api/PluginService.cs1
-rw-r--r--MediaBrowser.Api/Reports/Activities/ReportActivitiesBuilder.cs3
-rw-r--r--MediaBrowser.Api/Reports/Common/HeaderActivitiesMetadata.cs4
-rw-r--r--MediaBrowser.Api/Reports/Common/HeaderMetadata.cs4
-rw-r--r--MediaBrowser.Api/Reports/Common/ItemViewType.cs4
-rw-r--r--MediaBrowser.Api/Reports/Common/ReportBuilderBase.cs5
-rw-r--r--MediaBrowser.Api/Reports/Common/ReportDisplayType.cs4
-rw-r--r--MediaBrowser.Api/Reports/Common/ReportExportType.cs4
-rw-r--r--MediaBrowser.Api/Reports/Common/ReportFieldType.cs4
-rw-r--r--MediaBrowser.Api/Reports/Common/ReportHeaderIdType.cs4
-rw-r--r--MediaBrowser.Api/Reports/Common/ReportIncludeItemTypes.cs4
-rw-r--r--MediaBrowser.Api/Reports/Common/ReportViewType.cs4
-rw-r--r--MediaBrowser.Api/Reports/Data/ReportBuilder.cs15
-rw-r--r--MediaBrowser.Api/Reports/Data/ReportExport.cs5
-rw-r--r--MediaBrowser.Api/Reports/Data/ReportOptions.cs7
-rw-r--r--MediaBrowser.Api/Reports/Model/ReportGroup.cs6
-rw-r--r--MediaBrowser.Api/Reports/Model/ReportHeader.cs9
-rw-r--r--MediaBrowser.Api/Reports/Model/ReportItem.cs8
-rw-r--r--MediaBrowser.Api/Reports/Model/ReportRow.cs6
-rw-r--r--MediaBrowser.Api/Reports/ReportRequests.cs3
-rw-r--r--MediaBrowser.Api/Reports/ReportsService.cs13
-rw-r--r--MediaBrowser.Api/Reports/Stat/ReportStatBuilder.cs3
-rw-r--r--MediaBrowser.Api/Reports/Stat/ReportStatGroup.cs6
-rw-r--r--MediaBrowser.Api/Reports/Stat/ReportStatItem.cs8
-rw-r--r--MediaBrowser.Api/Reports/Stat/ReportStatResult.cs6
-rw-r--r--MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs3
-rw-r--r--MediaBrowser.Api/SearchService.cs2
-rw-r--r--MediaBrowser.Api/Subtitles/SubtitleService.cs1
-rw-r--r--MediaBrowser.Api/System/SystemInfoWebSocketListener.cs3
-rw-r--r--MediaBrowser.Api/System/SystemService.cs2
-rw-r--r--MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs5
-rw-r--r--MediaBrowser.Api/UserLibrary/GameGenresService.cs1
-rw-r--r--MediaBrowser.Api/UserLibrary/ItemsService.cs2
-rw-r--r--MediaBrowser.Api/UserLibrary/MusicGenresService.cs2
-rw-r--r--MediaBrowser.Api/UserLibrary/PlaystateService.cs2
-rw-r--r--MediaBrowser.Api/UserLibrary/StudiosService.cs2
-rw-r--r--MediaBrowser.Api/UserLibrary/YearsService.cs2
-rw-r--r--MediaBrowser.Api/UserService.cs1
-rw-r--r--MediaBrowser.Api/VideosService.cs3
69 files changed, 133 insertions, 1107 deletions
diff --git a/MediaBrowser.Api/ApiEntryPoint.cs b/MediaBrowser.Api/ApiEntryPoint.cs
index 117ff2305..66ca8c25d 100644
--- a/MediaBrowser.Api/ApiEntryPoint.cs
+++ b/MediaBrowser.Api/ApiEntryPoint.cs
@@ -1,6 +1,5 @@
using MediaBrowser.Api.Playback;
using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.IO;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Plugins;
@@ -350,7 +349,7 @@ namespace MediaBrowser.Api
if (job.Type != TranscodingJobType.Progressive)
{
- timerDuration = 1800000;
+ timerDuration = 60000;
}
job.PingTimeout = timerDuration;
diff --git a/MediaBrowser.Api/BaseApiService.cs b/MediaBrowser.Api/BaseApiService.cs
index 4f3e3fb28..30750b374 100644
--- a/MediaBrowser.Api/BaseApiService.cs
+++ b/MediaBrowser.Api/BaseApiService.cs
@@ -9,7 +9,6 @@ using MediaBrowser.Model.Logging;
using ServiceStack.Text.Controller;
using ServiceStack.Web;
using System;
-using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
diff --git a/MediaBrowser.Api/ConfigurationService.cs b/MediaBrowser.Api/ConfigurationService.cs
index 3c0b7f140..446415fbb 100644
--- a/MediaBrowser.Api/ConfigurationService.cs
+++ b/MediaBrowser.Api/ConfigurationService.cs
@@ -1,6 +1,4 @@
-using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Providers;
diff --git a/MediaBrowser.Api/DisplayPreferencesService.cs b/MediaBrowser.Api/DisplayPreferencesService.cs
index df04de79e..69c4c89ee 100644
--- a/MediaBrowser.Api/DisplayPreferencesService.cs
+++ b/MediaBrowser.Api/DisplayPreferencesService.cs
@@ -3,7 +3,6 @@ using MediaBrowser.Controller.Persistence;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Serialization;
using ServiceStack;
-using System;
using System.Threading;
using System.Threading.Tasks;
diff --git a/MediaBrowser.Api/Images/ImageByNameService.cs b/MediaBrowser.Api/Images/ImageByNameService.cs
index e17b35569..7bcb39b4d 100644
--- a/MediaBrowser.Api/Images/ImageByNameService.cs
+++ b/MediaBrowser.Api/Images/ImageByNameService.cs
@@ -1,5 +1,4 @@
using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.IO;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Net;
diff --git a/MediaBrowser.Api/Images/RemoteImageService.cs b/MediaBrowser.Api/Images/RemoteImageService.cs
index 9683632b2..02d1cdbe2 100644
--- a/MediaBrowser.Api/Images/RemoteImageService.cs
+++ b/MediaBrowser.Api/Images/RemoteImageService.cs
@@ -1,5 +1,4 @@
using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.IO;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Dto;
diff --git a/MediaBrowser.Api/ItemLookupService.cs b/MediaBrowser.Api/ItemLookupService.cs
index 8e1abef14..41bfd9da2 100644
--- a/MediaBrowser.Api/ItemLookupService.cs
+++ b/MediaBrowser.Api/ItemLookupService.cs
@@ -1,5 +1,4 @@
using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.IO;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
@@ -203,14 +202,19 @@ namespace MediaBrowser.Api
// }
//}
Logger.Info("Setting provider id's to item {0}-{1}: {2}", item.Id, item.Name, _json.SerializeToString(request.ProviderIds));
+
+ // Since the refresh process won't erase provider Ids, we need to set this explicitly now.
item.ProviderIds = request.ProviderIds;
+ //item.ProductionYear = request.ProductionYear;
+ //item.Name = request.Name;
- var task = _providerManager.RefreshFullItem(item, new MetadataRefreshOptions(_fileSystem)
+ var task = _providerManager.RefreshFullItem(item, new MetadataRefreshOptions(_fileSystem)
{
MetadataRefreshMode = MetadataRefreshMode.FullRefresh,
ImageRefreshMode = ImageRefreshMode.FullRefresh,
ReplaceAllMetadata = true,
- ReplaceAllImages = request.ReplaceAllImages
+ ReplaceAllImages = request.ReplaceAllImages,
+ SearchResult = request
}, CancellationToken.None);
Task.WaitAll(task);
@@ -235,7 +239,7 @@ namespace MediaBrowser.Api
contentPath = await reader.ReadToEndAsync().ConfigureAwait(false);
}
- if (_fileSystem.FileExists(contentPath))
+ if (_fileSystem.FileExists(contentPath))
{
return ToStaticFileResult(contentPath);
}
@@ -276,7 +280,7 @@ namespace MediaBrowser.Api
var fullCachePath = GetFullCachePath(urlHash + "." + ext);
- _fileSystem.CreateDirectory(Path.GetDirectoryName(fullCachePath));
+ _fileSystem.CreateDirectory(Path.GetDirectoryName(fullCachePath));
using (var stream = result.Content)
{
using (var filestream = _fileSystem.GetFileStream(fullCachePath, FileMode.Create, FileAccess.Write, FileShare.Read, true))
@@ -285,7 +289,7 @@ namespace MediaBrowser.Api
}
}
- _fileSystem.CreateDirectory(Path.GetDirectoryName(pointerCachePath));
+ _fileSystem.CreateDirectory(Path.GetDirectoryName(pointerCachePath));
using (var writer = new StreamWriter(pointerCachePath))
{
await writer.WriteAsync(fullCachePath).ConfigureAwait(false);
diff --git a/MediaBrowser.Api/ItemRefreshService.cs b/MediaBrowser.Api/ItemRefreshService.cs
index 1e912c92d..5aab15dff 100644
--- a/MediaBrowser.Api/ItemRefreshService.cs
+++ b/MediaBrowser.Api/ItemRefreshService.cs
@@ -5,7 +5,6 @@ using MediaBrowser.Controller.Providers;
using ServiceStack;
using System.Threading;
using CommonIO;
-using MediaBrowser.Common.IO;
namespace MediaBrowser.Api
{
diff --git a/MediaBrowser.Api/ItemUpdateService.cs b/MediaBrowser.Api/ItemUpdateService.cs
index 23ff74495..f37874774 100644
--- a/MediaBrowser.Api/ItemUpdateService.cs
+++ b/MediaBrowser.Api/ItemUpdateService.cs
@@ -331,7 +331,7 @@ namespace MediaBrowser.Api
hasAspectRatio.AspectRatio = request.AspectRatio;
}
- item.IsLocked = (request.LockData ?? false);
+ item.IsLocked = request.LockData ?? false;
if (request.LockedFields != null)
{
diff --git a/MediaBrowser.Api/Library/LibraryHelpers.cs b/MediaBrowser.Api/Library/LibraryHelpers.cs
index 7e30ffc93..46ec4f270 100644
--- a/MediaBrowser.Api/Library/LibraryHelpers.cs
+++ b/MediaBrowser.Api/Library/LibraryHelpers.cs
@@ -1,5 +1,4 @@
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller;
+using MediaBrowser.Controller;
using System;
using System.IO;
using System.Linq;
diff --git a/MediaBrowser.Api/Library/LibraryService.cs b/MediaBrowser.Api/Library/LibraryService.cs
index 097546af6..f9b3def97 100644
--- a/MediaBrowser.Api/Library/LibraryService.cs
+++ b/MediaBrowser.Api/Library/LibraryService.cs
@@ -1,7 +1,6 @@
using MediaBrowser.Api.Movies;
using MediaBrowser.Api.Music;
using MediaBrowser.Controller.Activity;
-using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
@@ -14,13 +13,11 @@ using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Controller.TV;
using MediaBrowser.Model.Activity;
-using MediaBrowser.Model.Channels;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Querying;
using ServiceStack;
using System;
-using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
@@ -28,7 +25,6 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using CommonIO;
-using MediaBrowser.Common.IO;
namespace MediaBrowser.Api.Library
{
diff --git a/MediaBrowser.Api/Library/LibraryStructureService.cs b/MediaBrowser.Api/Library/LibraryStructureService.cs
index 82931e11e..244dcf09f 100644
--- a/MediaBrowser.Api/Library/LibraryStructureService.cs
+++ b/MediaBrowser.Api/Library/LibraryStructureService.cs
@@ -1,5 +1,4 @@
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller;
+using MediaBrowser.Controller;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Net;
using MediaBrowser.Model.Entities;
diff --git a/MediaBrowser.Api/LiveTv/LiveTvService.cs b/MediaBrowser.Api/LiveTv/LiveTvService.cs
index 5b7bc78a8..ebcf8fbea 100644
--- a/MediaBrowser.Api/LiveTv/LiveTvService.cs
+++ b/MediaBrowser.Api/LiveTv/LiveTvService.cs
@@ -482,7 +482,14 @@ namespace MediaBrowser.Api.LiveTv
[Authenticated(AllowBeforeStartupWizard = true)]
public class GetSatIniMappings : IReturn<List<NameValuePair>>
{
-
+
+ }
+
+ [Route("/LiveTv/TunerHosts/Satip/ChannelScan", "GET", Summary = "Scans for available channels")]
+ [Authenticated(AllowBeforeStartupWizard = true)]
+ public class GetSatChannnelScanResult : TunerHostInfo
+ {
+
}
public class LiveTvService : BaseApiService
@@ -504,6 +511,13 @@ namespace MediaBrowser.Api.LiveTv
_dtoService = dtoService;
}
+ public async Task<object> Get(GetSatChannnelScanResult request)
+ {
+ var result = await _liveTvManager.GetSatChannelScanResult(request, CancellationToken.None).ConfigureAwait(false);
+
+ return ToOptimizedResult(result);
+ }
+
public async Task<object> Get(GetLiveTvRegistrationInfo request)
{
var result = await _liveTvManager.GetRegistrationInfo(request.ChannelId, request.ProgramId, request.Feature).ConfigureAwait(false);
diff --git a/MediaBrowser.Api/MediaBrowser.Api.csproj b/MediaBrowser.Api/MediaBrowser.Api.csproj
index cdc0cd6ae..db8961a66 100644
--- a/MediaBrowser.Api/MediaBrowser.Api.csproj
+++ b/MediaBrowser.Api/MediaBrowser.Api.csproj
@@ -80,8 +80,6 @@
<Compile Include="FilterService.cs" />
<Compile Include="IHasDtoOptions.cs" />
<Compile Include="Library\ChapterService.cs" />
- <Compile Include="Playback\Dash\ManifestBuilder.cs" />
- <Compile Include="Playback\Dash\MpegDashService.cs" />
<Compile Include="Playback\MediaInfoService.cs" />
<Compile Include="Playback\TranscodingThrottler.cs" />
<Compile Include="PlaylistService.cs" />
diff --git a/MediaBrowser.Api/Movies/MoviesService.cs b/MediaBrowser.Api/Movies/MoviesService.cs
index 970e8df51..065f88268 100644
--- a/MediaBrowser.Api/Movies/MoviesService.cs
+++ b/MediaBrowser.Api/Movies/MoviesService.cs
@@ -1,12 +1,10 @@
using MediaBrowser.Common.Extensions;
-using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Persistence;
-using MediaBrowser.Model.Channels;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Querying;
@@ -15,7 +13,6 @@ using ServiceStack;
using System;
using System.Collections.Generic;
using System.Linq;
-using System.Threading;
using System.Threading.Tasks;
namespace MediaBrowser.Api.Movies
diff --git a/MediaBrowser.Api/Movies/TrailersService.cs b/MediaBrowser.Api/Movies/TrailersService.cs
index 4883b38fb..d74dd5b6a 100644
--- a/MediaBrowser.Api/Movies/TrailersService.cs
+++ b/MediaBrowser.Api/Movies/TrailersService.cs
@@ -1,17 +1,9 @@
using MediaBrowser.Api.UserLibrary;
-using MediaBrowser.Controller.Channels;
using MediaBrowser.Controller.Dto;
-using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Net;
-using MediaBrowser.Model.Channels;
-using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Querying;
using ServiceStack;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
using MediaBrowser.Controller.Collections;
using MediaBrowser.Controller.Localization;
using MediaBrowser.Model.Serialization;
diff --git a/MediaBrowser.Api/Music/AlbumsService.cs b/MediaBrowser.Api/Music/AlbumsService.cs
index 9628ab231..e774c3077 100644
--- a/MediaBrowser.Api/Music/AlbumsService.cs
+++ b/MediaBrowser.Api/Music/AlbumsService.cs
@@ -4,7 +4,6 @@ using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Persistence;
-using MediaBrowser.Model.Querying;
using ServiceStack;
using System;
using System.Collections.Generic;
diff --git a/MediaBrowser.Api/Playback/BaseStreamingService.cs b/MediaBrowser.Api/Playback/BaseStreamingService.cs
index 9d2c8c444..2c3abe95e 100644
--- a/MediaBrowser.Api/Playback/BaseStreamingService.cs
+++ b/MediaBrowser.Api/Playback/BaseStreamingService.cs
@@ -1,12 +1,10 @@
using MediaBrowser.Common.Extensions;
-using MediaBrowser.Common.IO;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Devices;
using MediaBrowser.Controller.Dlna;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.MediaEncoding;
-using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Dlna;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
@@ -616,7 +614,7 @@ namespace MediaBrowser.Api.Playback
if (!string.IsNullOrEmpty(state.SubtitleStream.Language))
{
- var charenc = SubtitleEncoder.GetSubtitleFileCharacterSet(subtitlePath, state.MediaSource.Protocol, CancellationToken.None).Result;
+ var charenc = SubtitleEncoder.GetSubtitleFileCharacterSet(subtitlePath, state.SubtitleStream.Language, state.MediaSource.Protocol, CancellationToken.None).Result;
if (!string.IsNullOrEmpty(charenc))
{
@@ -1028,7 +1026,7 @@ namespace MediaBrowser.Api.Playback
StartStreamingLog(transcodingJob, state, process.StandardError.BaseStream, state.LogFileStream);
// Wait for the file to exist before proceeeding
- while (!FileSystem.FileExists(state.WaitForPath ?? outputPath) && !transcodingJob.HasExited)
+ while (!FileSystem.FileExists(state.WaitForPath ?? outputPath) && !transcodingJob.HasExited)
{
await Task.Delay(100, cancellationTokenSource.Token).ConfigureAwait(false);
}
@@ -1454,10 +1452,7 @@ namespace MediaBrowser.Api.Playback
}
else if (i == 19)
{
- if (videoRequest != null)
- {
- videoRequest.Cabac = string.Equals("true", val, StringComparison.OrdinalIgnoreCase);
- }
+ // cabac no longer used
}
else if (i == 20)
{
@@ -1548,7 +1543,7 @@ namespace MediaBrowser.Api.Playback
double digit;
if (double.TryParse(time, NumberStyles.Any, UsCulture, out digit))
{
- secondsSum += (digit * timeFactor);
+ secondsSum += digit * timeFactor;
}
else
{
@@ -1656,9 +1651,9 @@ namespace MediaBrowser.Api.Playback
if (state.OutputVideoBitrate.HasValue)
{
var resolution = ResolutionNormalizer.Normalize(
- state.VideoStream == null ? (int?)null : state.VideoStream.BitRate,
- state.OutputVideoBitrate.Value,
- state.VideoStream == null ? null : state.VideoStream.Codec,
+ state.VideoStream == null ? (int?)null : state.VideoStream.BitRate,
+ state.OutputVideoBitrate.Value,
+ state.VideoStream == null ? null : state.VideoStream.Codec,
state.OutputVideoCodec,
videoRequest.MaxWidth,
videoRequest.MaxHeight);
@@ -1682,12 +1677,12 @@ namespace MediaBrowser.Api.Playback
private void TryStreamCopy(StreamState state, VideoStreamRequest videoRequest)
{
- if (state.VideoStream != null && CanStreamCopyVideo(videoRequest, state.VideoStream))
+ if (state.VideoStream != null && CanStreamCopyVideo(state))
{
state.OutputVideoCodec = "copy";
}
- if (state.AudioStream != null && CanStreamCopyAudio(videoRequest, state.AudioStream, state.SupportedAudioCodecs))
+ if (state.AudioStream != null && CanStreamCopyAudio(state, state.SupportedAudioCodecs))
{
state.OutputAudioCodec = "copy";
}
@@ -1775,8 +1770,11 @@ namespace MediaBrowser.Api.Playback
state.MediaSource = mediaSource;
}
- protected virtual bool CanStreamCopyVideo(VideoStreamRequest request, MediaStream videoStream)
+ protected virtual bool CanStreamCopyVideo(StreamState state)
{
+ var request = state.VideoRequest;
+ var videoStream = state.VideoStream;
+
if (videoStream.IsInterlaced)
{
return false;
@@ -1786,7 +1784,7 @@ namespace MediaBrowser.Api.Playback
{
return false;
}
-
+
// Can't stream copy if we're burning in subtitles
if (request.SubtitleStreamIndex.HasValue)
{
@@ -1807,10 +1805,10 @@ namespace MediaBrowser.Api.Playback
{
if (string.IsNullOrEmpty(videoStream.Profile))
{
- return false;
+ //return false;
}
- if (!string.Equals(request.Profile, videoStream.Profile, StringComparison.OrdinalIgnoreCase))
+ if (!string.IsNullOrEmpty(videoStream.Profile) && !string.Equals(request.Profile, videoStream.Profile, StringComparison.OrdinalIgnoreCase))
{
var currentScore = GetVideoProfileScore(videoStream.Profile);
var requestedScore = GetVideoProfileScore(request.Profile);
@@ -1886,24 +1884,16 @@ namespace MediaBrowser.Api.Playback
{
if (!videoStream.Level.HasValue)
{
- return false;
+ //return false;
}
- if (videoStream.Level.Value > requestLevel)
+ if (videoStream.Level.HasValue && videoStream.Level.Value > requestLevel)
{
return false;
}
}
}
- if (request.Cabac.HasValue && request.Cabac.Value)
- {
- if (videoStream.IsCabac.HasValue && !videoStream.IsCabac.Value)
- {
- return false;
- }
- }
-
return request.EnableAutoStreamCopy;
}
@@ -1923,8 +1913,11 @@ namespace MediaBrowser.Api.Playback
return Array.FindIndex(list.ToArray(), t => string.Equals(t, profile, StringComparison.OrdinalIgnoreCase));
}
- protected virtual bool CanStreamCopyAudio(VideoStreamRequest request, MediaStream audioStream, List<string> supportedAudioCodecs)
+ protected virtual bool CanStreamCopyAudio(StreamState state, List<string> supportedAudioCodecs)
{
+ var request = state.VideoRequest;
+ var audioStream = state.AudioStream;
+
// Source and target codecs must match
if (string.IsNullOrEmpty(audioStream.Codec) || !supportedAudioCodecs.Contains(audioStream.Codec, StringComparer.OrdinalIgnoreCase))
{
@@ -2030,7 +2023,6 @@ namespace MediaBrowser.Api.Playback
state.TargetPacketLength,
state.TargetTimestamp,
state.IsTargetAnamorphic,
- state.IsTargetCabac,
state.TargetRefFrames,
state.TargetVideoStreamCount,
state.TargetAudioStreamCount,
@@ -2056,6 +2048,7 @@ namespace MediaBrowser.Api.Playback
if (state.VideoRequest != null)
{
state.VideoRequest.CopyTimestamps = transcodingProfile.CopyTimestamps;
+ state.VideoRequest.ForceLiveStream = transcodingProfile.ForceLiveStream;
}
}
}
@@ -2133,7 +2126,6 @@ namespace MediaBrowser.Api.Playback
state.TargetPacketLength,
state.TranscodeSeekInfo,
state.IsTargetAnamorphic,
- state.IsTargetCabac,
state.TargetRefFrames,
state.TargetVideoStreamCount,
state.TargetAudioStreamCount,
@@ -2225,7 +2217,7 @@ namespace MediaBrowser.Api.Playback
inputModifier += " -noaccurate_seek";
}
}
-
+
return inputModifier;
}
diff --git a/MediaBrowser.Api/Playback/Dash/ManifestBuilder.cs b/MediaBrowser.Api/Playback/Dash/ManifestBuilder.cs
deleted file mode 100644
index 35e252a19..000000000
--- a/MediaBrowser.Api/Playback/Dash/ManifestBuilder.cs
+++ /dev/null
@@ -1,224 +0,0 @@
-using System;
-using System.Globalization;
-using System.Security;
-using System.Text;
-
-namespace MediaBrowser.Api.Playback.Dash
-{
- public class ManifestBuilder
- {
- protected readonly CultureInfo UsCulture = new CultureInfo("en-US");
-
- public string GetManifestText(StreamState state, string playlistUrl)
- {
- var builder = new StringBuilder();
-
- var time = TimeSpan.FromTicks(state.RunTimeTicks.Value);
-
- var duration = "PT" + time.Hours.ToString("00", UsCulture) + "H" + time.Minutes.ToString("00", UsCulture) + "M" + time.Seconds.ToString("00", UsCulture) + ".00S";
-
- builder.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
-
- builder.AppendFormat(
- "<MPD xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"urn:mpeg:dash:schema:mpd:2011\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xsi:schemaLocation=\"urn:mpeg:DASH:schema:MPD:2011 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd\" profiles=\"urn:mpeg:dash:profile:isoff-live:2011\" type=\"static\" mediaPresentationDuration=\"{0}\" minBufferTime=\"PT5.0S\">",
- duration);
-
- builder.Append("<ProgramInformation>");
- builder.Append("</ProgramInformation>");
-
- builder.Append("<Period start=\"PT0S\">");
- builder.Append(GetVideoAdaptationSet(state, playlistUrl));
- builder.Append(GetAudioAdaptationSet(state, playlistUrl));
- builder.Append("</Period>");
-
- builder.Append("</MPD>");
-
- return builder.ToString();
- }
-
- private string GetVideoAdaptationSet(StreamState state, string playlistUrl)
- {
- var builder = new StringBuilder();
-
- builder.Append("<AdaptationSet id=\"video\" segmentAlignment=\"true\" bitstreamSwitching=\"true\">");
- builder.Append(GetVideoRepresentationOpenElement(state));
-
- AppendSegmentList(state, builder, "0", playlistUrl);
-
- builder.Append("</Representation>");
- builder.Append("</AdaptationSet>");
-
- return builder.ToString();
- }
-
- private string GetAudioAdaptationSet(StreamState state, string playlistUrl)
- {
- var builder = new StringBuilder();
-
- builder.Append("<AdaptationSet id=\"audio\" segmentAlignment=\"true\" bitstreamSwitching=\"true\">");
- builder.Append(GetAudioRepresentationOpenElement(state));
-
- builder.Append("<AudioChannelConfiguration schemeIdUri=\"urn:mpeg:dash:23003:3:audio_channel_configuration:2011\" value=\"6\" />");
-
- AppendSegmentList(state, builder, "1", playlistUrl);
-
- builder.Append("</Representation>");
- builder.Append("</AdaptationSet>");
-
- return builder.ToString();
- }
-
- private string GetVideoRepresentationOpenElement(StreamState state)
- {
- var codecs = GetVideoCodecDescriptor(state);
-
- var mime = "video/mp4";
-
- var xml = "<Representation id=\"0\" mimeType=\"" + mime + "\" codecs=\"" + codecs + "\"";
-
- if (state.OutputWidth.HasValue)
- {
- xml += " width=\"" + state.OutputWidth.Value.ToString(UsCulture) + "\"";
- }
- if (state.OutputHeight.HasValue)
- {
- xml += " height=\"" + state.OutputHeight.Value.ToString(UsCulture) + "\"";
- }
- if (state.OutputVideoBitrate.HasValue)
- {
- xml += " bandwidth=\"" + state.OutputVideoBitrate.Value.ToString(UsCulture) + "\"";
- }
-
- xml += ">";
-
- return xml;
- }
-
- private string GetAudioRepresentationOpenElement(StreamState state)
- {
- var codecs = GetAudioCodecDescriptor(state);
-
- var mime = "audio/mp4";
-
- var xml = "<Representation id=\"1\" mimeType=\"" + mime + "\" codecs=\"" + codecs + "\"";
-
- if (state.OutputAudioSampleRate.HasValue)
- {
- xml += " audioSamplingRate=\"" + state.OutputAudioSampleRate.Value.ToString(UsCulture) + "\"";
- }
- if (state.OutputAudioBitrate.HasValue)
- {
- xml += " bandwidth=\"" + state.OutputAudioBitrate.Value.ToString(UsCulture) + "\"";
- }
-
- xml += ">";
-
- return xml;
- }
-
- private string GetVideoCodecDescriptor(StreamState state)
- {
- // https://developer.apple.com/library/ios/documentation/networkinginternet/conceptual/streamingmediaguide/FrequentlyAskedQuestions/FrequentlyAskedQuestions.html
- // http://www.chipwreck.de/blog/2010/02/25/html-5-video-tag-and-attributes/
-
- var level = state.TargetVideoLevel ?? 0;
- var profile = state.TargetVideoProfile ?? string.Empty;
-
- if (profile.IndexOf("high", StringComparison.OrdinalIgnoreCase) != -1)
- {
- if (level >= 4.1)
- {
- return "avc1.640028";
- }
-
- if (level >= 4)
- {
- return "avc1.640028";
- }
-
- return "avc1.64001f";
- }
-
- if (profile.IndexOf("main", StringComparison.OrdinalIgnoreCase) != -1)
- {
- if (level >= 4)
- {
- return "avc1.4d0028";
- }
-
- if (level >= 3.1)
- {
- return "avc1.4d001f";
- }
-
- return "avc1.4d001e";
- }
-
- if (level >= 3.1)
- {
- return "avc1.42001f";
- }
-
- return "avc1.42E01E";
- }
-
- private string GetAudioCodecDescriptor(StreamState state)
- {
- // https://developer.apple.com/library/ios/documentation/networkinginternet/conceptual/streamingmediaguide/FrequentlyAskedQuestions/FrequentlyAskedQuestions.html
-
- if (string.Equals(state.OutputAudioCodec, "mp3", StringComparison.OrdinalIgnoreCase))
- {
- return "mp4a.40.34";
- }
-
- // AAC 5ch
- if (state.OutputAudioChannels.HasValue && state.OutputAudioChannels.Value >= 5)
- {
- return "mp4a.40.5";
- }
-
- // AAC 2ch
- return "mp4a.40.2";
- }
-
- private void AppendSegmentList(StreamState state, StringBuilder builder, string type, string playlistUrl)
- {
- var extension = ".m4s";
-
- var seconds = TimeSpan.FromTicks(state.RunTimeTicks ?? 0).TotalSeconds;
-
- var queryStringIndex = playlistUrl.IndexOf('?');
- var queryString = queryStringIndex == -1 ? string.Empty : playlistUrl.Substring(queryStringIndex);
-
- var index = 0;
- var duration = 1000000 * state.SegmentLength;
- builder.AppendFormat("<SegmentList timescale=\"1000000\" duration=\"{0}\" startNumber=\"1\">", duration.ToString(CultureInfo.InvariantCulture));
-
- while (seconds > 0)
- {
- var filename = index == 0
- ? "init"
- : (index - 1).ToString(UsCulture);
-
- var segmentUrl = string.Format("dash/{3}/{0}{1}{2}",
- filename,
- extension,
- SecurityElement.Escape(queryString),
- type);
-
- if (index == 0)
- {
- builder.AppendFormat("<Initialization sourceURL=\"{0}\"/>", segmentUrl);
- }
- else
- {
- builder.AppendFormat("<SegmentURL media=\"{0}\"/>", segmentUrl);
- }
-
- seconds -= state.SegmentLength;
- index++;
- }
- builder.Append("</SegmentList>");
- }
- }
-}
diff --git a/MediaBrowser.Api/Playback/Dash/MpegDashService.cs b/MediaBrowser.Api/Playback/Dash/MpegDashService.cs
deleted file mode 100644
index defb2eef0..000000000
--- a/MediaBrowser.Api/Playback/Dash/MpegDashService.cs
+++ /dev/null
@@ -1,548 +0,0 @@
-using MediaBrowser.Api.Playback.Hls;
-using MediaBrowser.Common.IO;
-using MediaBrowser.Common.Net;
-using MediaBrowser.Controller.Configuration;
-using MediaBrowser.Controller.Devices;
-using MediaBrowser.Controller.Dlna;
-using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.MediaEncoding;
-using MediaBrowser.Controller.Net;
-using MediaBrowser.Model.IO;
-using MediaBrowser.Model.Serialization;
-using ServiceStack;
-using System;
-using System.Collections.Generic;
-using System.Globalization;
-using System.IO;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-using CommonIO;
-using MimeTypes = MediaBrowser.Model.Net.MimeTypes;
-
-namespace MediaBrowser.Api.Playback.Dash
-{
- /// <summary>
- /// Options is needed for chromecast. Threw Head in there since it's related
- /// </summary>
- [Route("/Videos/{Id}/master.mpd", "GET", Summary = "Gets a video stream using Mpeg dash.")]
- [Route("/Videos/{Id}/master.mpd", "HEAD", Summary = "Gets a video stream using Mpeg dash.")]
- public class GetMasterManifest : VideoStreamRequest
- {
- public bool EnableAdaptiveBitrateStreaming { get; set; }
-
- public GetMasterManifest()
- {
- EnableAdaptiveBitrateStreaming = true;
- }
- }
-
- [Route("/Videos/{Id}/dash/{RepresentationId}/{SegmentId}.m4s", "GET")]
- public class GetDashSegment : VideoStreamRequest
- {
- /// <summary>
- /// Gets or sets the segment id.
- /// </summary>
- /// <value>The segment id.</value>
- public string SegmentId { get; set; }
-
- /// <summary>
- /// Gets or sets the representation identifier.
- /// </summary>
- /// <value>The representation identifier.</value>
- public string RepresentationId { get; set; }
- }
-
- public class MpegDashService : BaseHlsService
- {
- public MpegDashService(IServerConfigurationManager serverConfig, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IFileSystem fileSystem, IDlnaManager dlnaManager, ISubtitleEncoder subtitleEncoder, IDeviceManager deviceManager, IMediaSourceManager mediaSourceManager, IZipClient zipClient, IJsonSerializer jsonSerializer, INetworkManager networkManager) : base(serverConfig, userManager, libraryManager, isoManager, mediaEncoder, fileSystem, dlnaManager, subtitleEncoder, deviceManager, mediaSourceManager, zipClient, jsonSerializer)
- {
- NetworkManager = networkManager;
- }
-
- protected INetworkManager NetworkManager { get; private set; }
-
- public object Get(GetMasterManifest request)
- {
- var result = GetAsync(request, "GET").Result;
-
- return result;
- }
-
- public object Head(GetMasterManifest request)
- {
- var result = GetAsync(request, "HEAD").Result;
-
- return result;
- }
-
- protected override bool EnableOutputInSubFolder
- {
- get
- {
- return true;
- }
- }
-
- private async Task<object> GetAsync(GetMasterManifest request, string method)
- {
- if (string.IsNullOrEmpty(request.MediaSourceId))
- {
- throw new ArgumentException("MediaSourceId is required");
- }
-
- var state = await GetState(request, CancellationToken.None).ConfigureAwait(false);
-
- var playlistText = string.Empty;
-
- if (string.Equals(method, "GET", StringComparison.OrdinalIgnoreCase))
- {
- playlistText = new ManifestBuilder().GetManifestText(state, Request.RawUrl);
- }
-
- return ResultFactory.GetResult(playlistText, MimeTypes.GetMimeType("playlist.mpd"), new Dictionary<string, string>());
- }
-
- public object Get(GetDashSegment request)
- {
- return GetDynamicSegment(request, request.SegmentId, request.RepresentationId).Result;
- }
-
- private async Task<object> GetDynamicSegment(VideoStreamRequest request, string segmentId, string representationId)
- {
- if ((request.StartTimeTicks ?? 0) > 0)
- {
- throw new ArgumentException("StartTimeTicks is not allowed.");
- }
-
- var cancellationTokenSource = new CancellationTokenSource();
- var cancellationToken = cancellationTokenSource.Token;
-
- var requestedIndex = string.Equals(segmentId, "init", StringComparison.OrdinalIgnoreCase) ?
- -1 :
- int.Parse(segmentId, NumberStyles.Integer, UsCulture);
-
- var state = await GetState(request, cancellationToken).ConfigureAwait(false);
-
- var playlistPath = Path.ChangeExtension(state.OutputFilePath, ".mpd");
-
- var segmentExtension = GetSegmentFileExtension(state);
-
- var segmentPath = FindSegment(playlistPath, representationId, segmentExtension, requestedIndex);
- var segmentLength = state.SegmentLength;
-
- TranscodingJob job = null;
-
- if (!string.IsNullOrWhiteSpace(segmentPath))
- {
- job = ApiEntryPoint.Instance.GetTranscodingJob(playlistPath, TranscodingJobType);
- return await GetSegmentResult(playlistPath, segmentPath, requestedIndex, segmentLength, job, cancellationToken).ConfigureAwait(false);
- }
-
- await ApiEntryPoint.Instance.TranscodingStartLock.WaitAsync(cancellationTokenSource.Token).ConfigureAwait(false);
- try
- {
- segmentPath = FindSegment(playlistPath, representationId, segmentExtension, requestedIndex);
- if (!string.IsNullOrWhiteSpace(segmentPath))
- {
- job = ApiEntryPoint.Instance.GetTranscodingJob(playlistPath, TranscodingJobType);
- return await GetSegmentResult(playlistPath, segmentPath, requestedIndex, segmentLength, job, cancellationToken).ConfigureAwait(false);
- }
- else
- {
- if (string.Equals(representationId, "0", StringComparison.OrdinalIgnoreCase))
- {
- job = ApiEntryPoint.Instance.GetTranscodingJob(playlistPath, TranscodingJobType);
- var currentTranscodingIndex = GetCurrentTranscodingIndex(playlistPath, segmentExtension);
- var segmentGapRequiringTranscodingChange = 24 / state.SegmentLength;
- Logger.Debug("Current transcoding index is {0}. requestedIndex={1}. segmentGapRequiringTranscodingChange={2}", currentTranscodingIndex ?? -2, requestedIndex, segmentGapRequiringTranscodingChange);
- if (currentTranscodingIndex == null || requestedIndex < currentTranscodingIndex.Value || (requestedIndex - currentTranscodingIndex.Value) > segmentGapRequiringTranscodingChange)
- {
- // If the playlist doesn't already exist, startup ffmpeg
- try
- {
- ApiEntryPoint.Instance.KillTranscodingJobs(request.DeviceId, request.PlaySessionId, p => false);
-
- if (currentTranscodingIndex.HasValue)
- {
- DeleteLastTranscodedFiles(playlistPath, 0);
- }
-
- var positionTicks = GetPositionTicks(state, requestedIndex);
- request.StartTimeTicks = positionTicks;
-
- var startNumber = GetStartNumber(state);
-
- var workingDirectory = Path.Combine(Path.GetDirectoryName(playlistPath), (startNumber == -1 ? 0 : startNumber).ToString(CultureInfo.InvariantCulture));
- state.WaitForPath = Path.Combine(workingDirectory, Path.GetFileName(playlistPath));
- FileSystem.CreateDirectory(workingDirectory);
- job = await StartFfMpeg(state, playlistPath, cancellationTokenSource, workingDirectory).ConfigureAwait(false);
- await WaitForMinimumDashSegmentCount(Path.Combine(workingDirectory, Path.GetFileName(playlistPath)), 1, cancellationTokenSource.Token).ConfigureAwait(false);
- }
- catch
- {
- state.Dispose();
- throw;
- }
- }
- }
- }
- }
- finally
- {
- ApiEntryPoint.Instance.TranscodingStartLock.Release();
- }
-
- while (string.IsNullOrWhiteSpace(segmentPath))
- {
- segmentPath = FindSegment(playlistPath, representationId, segmentExtension, requestedIndex);
- await Task.Delay(50, cancellationToken).ConfigureAwait(false);
- }
-
- Logger.Info("returning {0}", segmentPath);
- return await GetSegmentResult(playlistPath, segmentPath, requestedIndex, segmentLength, job ?? ApiEntryPoint.Instance.GetTranscodingJob(playlistPath, TranscodingJobType), cancellationToken).ConfigureAwait(false);
- }
-
- private long GetPositionTicks(StreamState state, int requestedIndex)
- {
- if (requestedIndex <= 0)
- {
- return 0;
- }
-
- var startSeconds = requestedIndex * state.SegmentLength;
- return TimeSpan.FromSeconds(startSeconds).Ticks;
- }
-
- protected Task WaitForMinimumDashSegmentCount(string playlist, int segmentCount, CancellationToken cancellationToken)
- {
- return WaitForSegment(playlist, "stream0-" + segmentCount.ToString("00000", CultureInfo.InvariantCulture) + ".m4s", cancellationToken);
- }
-
- private async Task<object> GetSegmentResult(string playlistPath,
- string segmentPath,
- int segmentIndex,
- int segmentLength,
- TranscodingJob transcodingJob,
- CancellationToken cancellationToken)
- {
- // If all transcoding has completed, just return immediately
- if (transcodingJob != null && transcodingJob.HasExited)
- {
- return GetSegmentResult(segmentPath, segmentIndex, segmentLength, transcodingJob);
- }
-
- // Wait for the file to stop being written to, then stream it
- var length = new FileInfo(segmentPath).Length;
- var eofCount = 0;
-
- while (eofCount < 10)
- {
- var info = new FileInfo(segmentPath);
-
- if (!info.Exists)
- {
- break;
- }
-
- var newLength = info.Length;
-
- if (newLength == length)
- {
- eofCount++;
- }
- else
- {
- eofCount = 0;
- }
-
- length = newLength;
- await Task.Delay(100, cancellationToken).ConfigureAwait(false);
- }
-
- return GetSegmentResult(segmentPath, segmentIndex, segmentLength, transcodingJob);
- }
-
- private object GetSegmentResult(string segmentPath, int index, int segmentLength, TranscodingJob transcodingJob)
- {
- var segmentEndingSeconds = (1 + index) * segmentLength;
- var segmentEndingPositionTicks = TimeSpan.FromSeconds(segmentEndingSeconds).Ticks;
-
- return ResultFactory.GetStaticFileResult(Request, new StaticFileResultOptions
- {
- Path = segmentPath,
- FileShare = FileShare.ReadWrite,
- OnComplete = () =>
- {
- if (transcodingJob != null)
- {
- transcodingJob.DownloadPositionTicks = Math.Max(transcodingJob.DownloadPositionTicks ?? segmentEndingPositionTicks, segmentEndingPositionTicks);
- }
-
- }
- });
- }
-
- public int? GetCurrentTranscodingIndex(string playlist, string segmentExtension)
- {
- var job = ApiEntryPoint.Instance.GetTranscodingJob(playlist, TranscodingJobType);
-
- if (job == null || job.HasExited)
- {
- return null;
- }
-
- var file = GetLastTranscodingFiles(playlist, segmentExtension, FileSystem, 1).FirstOrDefault();
-
- if (file == null)
- {
- return null;
- }
-
- return GetIndex(file.FullName);
- }
-
- public int GetIndex(string segmentPath)
- {
- var indexString = Path.GetFileNameWithoutExtension(segmentPath).Split('-').LastOrDefault();
-
- if (string.Equals(indexString, "init", StringComparison.OrdinalIgnoreCase))
- {
- return -1;
- }
- var startNumber = int.Parse(Path.GetFileNameWithoutExtension(Path.GetDirectoryName(segmentPath)), NumberStyles.Integer, UsCulture);
-
- return startNumber + int.Parse(indexString, NumberStyles.Integer, UsCulture) - 1;
- }
-
- private void DeleteLastTranscodedFiles(string playlistPath, int retryCount)
- {
- if (retryCount >= 5)
- {
- return;
- }
- }
-
- private static List<FileSystemMetadata> GetLastTranscodingFiles(string playlist, string segmentExtension, IFileSystem fileSystem, int count)
- {
- var folder = Path.GetDirectoryName(playlist);
-
- try
- {
- return fileSystem.GetFiles(folder)
- .Where(i => string.Equals(i.Extension, segmentExtension, StringComparison.OrdinalIgnoreCase))
- .OrderByDescending(fileSystem.GetLastWriteTimeUtc)
- .Take(count)
- .ToList();
- }
- catch (DirectoryNotFoundException)
- {
- return new List<FileSystemMetadata>();
- }
- }
-
- private string FindSegment(string playlist, string representationId, string segmentExtension, int requestedIndex)
- {
- var folder = Path.GetDirectoryName(playlist);
-
- if (requestedIndex == -1)
- {
- var path = Path.Combine(folder, "0", "stream" + representationId + "-" + "init" + segmentExtension);
- return FileSystem.FileExists(path) ? path : null;
- }
-
- try
- {
- foreach (var subfolder in FileSystem.GetDirectoryPaths(folder).ToList())
- {
- var subfolderName = Path.GetFileNameWithoutExtension(subfolder);
- int startNumber;
- if (int.TryParse(subfolderName, NumberStyles.Any, UsCulture, out startNumber))
- {
- var segmentIndex = requestedIndex - startNumber + 1;
- var path = Path.Combine(folder, subfolderName, "stream" + representationId + "-" + segmentIndex.ToString("00000", CultureInfo.InvariantCulture) + segmentExtension);
- if (FileSystem.FileExists(path))
- {
- return path;
- }
- }
- }
- }
- catch (DirectoryNotFoundException)
- {
-
- }
-
- return null;
- }
-
- protected override string GetAudioArguments(StreamState state)
- {
- var codec = GetAudioEncoder(state);
-
- if (string.Equals(codec, "copy", StringComparison.OrdinalIgnoreCase))
- {
- return "-codec:a:0 copy";
- }
-
- var args = "-codec:a:0 " + codec;
-
- var channels = state.OutputAudioChannels;
-
- if (channels.HasValue)
- {
- args += " -ac " + channels.Value;
- }
-
- var bitrate = state.OutputAudioBitrate;
-
- if (bitrate.HasValue)
- {
- args += " -ab " + bitrate.Value.ToString(UsCulture);
- }
-
- args += " " + GetAudioFilterParam(state, true);
-
- return args;
- }
-
- protected override string GetVideoArguments(StreamState state)
- {
- var codec = GetVideoEncoder(state);
-
- var args = "-codec:v:0 " + codec;
-
- if (state.EnableMpegtsM2TsMode)
- {
- args += " -mpegts_m2ts_mode 1";
- }
-
- // See if we can save come cpu cycles by avoiding encoding
- if (codec.Equals("copy", StringComparison.OrdinalIgnoreCase))
- {
- return state.VideoStream != null && IsH264(state.VideoStream) ?
- args + " -bsf:v h264_mp4toannexb" :
- args;
- }
-
- var keyFrameArg = string.Format(" -force_key_frames expr:gte(t,n_forced*{0})",
- state.SegmentLength.ToString(UsCulture));
-
- var hasGraphicalSubs = state.SubtitleStream != null && !state.SubtitleStream.IsTextSubtitleStream;
-
- args += " " + GetVideoQualityParam(state, GetH264Encoder(state)) + keyFrameArg;
-
- // Add resolution params, if specified
- if (!hasGraphicalSubs)
- {
- args += GetOutputSizeParam(state, codec, false);
- }
-
- // This is for internal graphical subs
- if (hasGraphicalSubs)
- {
- args += GetGraphicalSubtitleParam(state, codec);
- }
-
- return args;
- }
-
- protected override string GetCommandLineArguments(string outputPath, StreamState state, bool isEncoding)
- {
- // test url http://192.168.1.2:8096/videos/233e8905d559a8f230db9bffd2ac9d6d/master.mpd?mediasourceid=233e8905d559a8f230db9bffd2ac9d6d&videocodec=h264&audiocodec=aac&maxwidth=1280&videobitrate=500000&audiobitrate=128000&profile=baseline&level=3
- // Good info on i-frames http://blog.streamroot.io/encode-multi-bitrate-videos-mpeg-dash-mse-based-media-players/
-
- var threads = GetNumberOfThreads(state, false);
-
- var inputModifier = GetInputModifier(state);
-
- var initSegmentName = "stream$RepresentationID$-init.m4s";
- var segmentName = "stream$RepresentationID$-$Number%05d$.m4s";
-
- var args = string.Format("{0} {1} -map_metadata -1 -threads {2} {3} {4} -copyts {5} -f dash -init_seg_name \"{6}\" -media_seg_name \"{7}\" -use_template 0 -use_timeline 1 -min_seg_duration {8} -y \"{9}\"",
- inputModifier,
- GetInputArgument(state),
- threads,
- GetMapArgs(state),
- GetVideoArguments(state),
- GetAudioArguments(state),
- initSegmentName,
- segmentName,
- (state.SegmentLength * 1000000).ToString(CultureInfo.InvariantCulture),
- state.WaitForPath
- ).Trim();
-
- return args;
- }
-
- protected override int GetStartNumber(StreamState state)
- {
- return GetStartNumber(state.VideoRequest);
- }
-
- private int GetStartNumber(VideoStreamRequest request)
- {
- var segmentId = "0";
-
- var segmentRequest = request as GetDashSegment;
- if (segmentRequest != null)
- {
- segmentId = segmentRequest.SegmentId;
- }
-
- if (string.Equals(segmentId, "init", StringComparison.OrdinalIgnoreCase))
- {
- return -1;
- }
-
- return int.Parse(segmentId, NumberStyles.Integer, UsCulture);
- }
-
- /// <summary>
- /// Gets the segment file extension.
- /// </summary>
- /// <param name="state">The state.</param>
- /// <returns>System.String.</returns>
- protected override string GetSegmentFileExtension(StreamState state)
- {
- return ".m4s";
- }
-
- protected override TranscodingJobType TranscodingJobType
- {
- get
- {
- return TranscodingJobType.Dash;
- }
- }
-
- private async Task WaitForSegment(string playlist, string segment, CancellationToken cancellationToken)
- {
- var segmentFilename = Path.GetFileName(segment);
-
- Logger.Debug("Waiting for {0} in {1}", segmentFilename, playlist);
-
- while (true)
- {
- // Need to use FileShare.ReadWrite because we're reading the file at the same time it's being written
- using (var fileStream = GetPlaylistFileStream(playlist))
- {
- using (var reader = new StreamReader(fileStream))
- {
- while (!reader.EndOfStream)
- {
- var line = await reader.ReadLineAsync().ConfigureAwait(false);
-
- if (line.IndexOf(segmentFilename, StringComparison.OrdinalIgnoreCase) != -1)
- {
- Logger.Debug("Finished waiting for {0} in {1}", segmentFilename, playlist);
- return;
- }
- }
- await Task.Delay(100, cancellationToken).ConfigureAwait(false);
- }
- }
- }
- }
- }
-}
diff --git a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs
index 766e8a003..cb344690c 100644
--- a/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs
+++ b/MediaBrowser.Api/Playback/Hls/BaseHlsService.cs
@@ -1,5 +1,4 @@
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Devices;
using MediaBrowser.Controller.Dlna;
using MediaBrowser.Controller.Library;
@@ -84,11 +83,6 @@ namespace MediaBrowser.Api.Playback.Hls
var state = await GetState(request, cancellationTokenSource.Token).ConfigureAwait(false);
- if (isLive)
- {
- state.Request.StartTimeTicks = null;
- }
-
TranscodingJob job = null;
var playlist = state.OutputFilePath;
@@ -138,13 +132,6 @@ namespace MediaBrowser.Api.Playback.Hls
var appendBaselineStream = false;
var baselineStreamBitrate = 64000;
- var hlsVideoRequest = state.VideoRequest as GetHlsVideoStreamLegacy;
- if (hlsVideoRequest != null)
- {
- appendBaselineStream = hlsVideoRequest.AppendBaselineStream;
- baselineStreamBitrate = hlsVideoRequest.BaselineStreamAudioBitRate ?? baselineStreamBitrate;
- }
-
var playlistText = GetMasterPlaylistFileText(playlist, videoBitrate + audioBitrate, appendBaselineStream, baselineStreamBitrate);
job = job ?? ApiEntryPoint.Instance.OnTranscodeBeginRequest(playlist, TranscodingJobType);
@@ -249,11 +236,7 @@ namespace MediaBrowser.Api.Playback.Hls
protected override string GetCommandLineArguments(string outputPath, StreamState state, bool isEncoding)
{
- var hlsVideoRequest = state.VideoRequest as GetHlsVideoStreamLegacy;
-
- var itsOffsetMs = hlsVideoRequest == null
- ? 0
- : hlsVideoRequest.TimeStampOffsetMs;
+ var itsOffsetMs = 0;
var itsOffset = itsOffsetMs == 0 ? string.Empty : string.Format("-itsoffset {0} ", TimeSpan.FromMilliseconds(itsOffsetMs).TotalSeconds.ToString(UsCulture));
@@ -287,26 +270,6 @@ namespace MediaBrowser.Api.Playback.Hls
outputPath
).Trim();
- if (hlsVideoRequest != null)
- {
- if (hlsVideoRequest.AppendBaselineStream)
- {
- var lowBitratePath = Path.Combine(Path.GetDirectoryName(outputPath), Path.GetFileNameWithoutExtension(outputPath) + "-low.m3u8");
-
- var bitrate = hlsVideoRequest.BaselineStreamAudioBitRate ?? 64000;
-
- var lowBitrateParams = string.Format(" -threads {0} -vn -codec:a:0 libmp3lame -ac 2 -ab {1} -hls_time {2} -start_number {3} -hls_list_size {4} -y \"{5}\"",
- threads,
- bitrate / 2,
- state.SegmentLength.ToString(UsCulture),
- startNumberParam,
- state.HlsListSize.ToString(UsCulture),
- lowBitratePath);
-
- args += " " + lowBitrateParams;
- }
- }
-
return args;
}
@@ -315,9 +278,28 @@ namespace MediaBrowser.Api.Playback.Hls
return 0;
}
- protected override bool CanStreamCopyAudio(VideoStreamRequest request, MediaStream audioStream, List<string> supportedAudioCodecs)
+ protected bool IsLiveStream(StreamState state)
{
- return false;
+ var isLiveStream = (state.RunTimeTicks ?? 0) == 0;
+
+ if (state.VideoRequest.ForceLiveStream)
+ {
+ return true;
+ }
+
+ return isLiveStream;
+ }
+
+ protected override bool CanStreamCopyAudio(StreamState state, List<string> supportedAudioCodecs)
+ {
+ var isLiveStream = IsLiveStream(state);
+
+ if (!isLiveStream)
+ {
+ return false;
+ }
+
+ return base.CanStreamCopyAudio(state, supportedAudioCodecs);
}
}
} \ No newline at end of file
diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
index 000c02256..65e236525 100644
--- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
+++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs
@@ -199,9 +199,9 @@ namespace MediaBrowser.Api.Playback.Hls
Logger.Debug("Starting transcoding because requestedIndex={0} and currentTranscodingIndex={1}", requestedIndex, currentTranscodingIndex);
startTranscoding = true;
}
- else if ((requestedIndex - currentTranscodingIndex.Value) > segmentGapRequiringTranscodingChange)
+ else if (requestedIndex - currentTranscodingIndex.Value > segmentGapRequiringTranscodingChange)
{
- Logger.Debug("Starting transcoding because segmentGap is {0} and max allowed gap is {1}. requestedIndex={2}", (requestedIndex - currentTranscodingIndex.Value), segmentGapRequiringTranscodingChange, requestedIndex);
+ Logger.Debug("Starting transcoding because segmentGap is {0} and max allowed gap is {1}. requestedIndex={2}", requestedIndex - currentTranscodingIndex.Value, segmentGapRequiringTranscodingChange, requestedIndex);
startTranscoding = true;
}
if (startTranscoding)
@@ -500,13 +500,25 @@ namespace MediaBrowser.Api.Playback.Hls
return ResultFactory.GetResult(playlistText, MimeTypes.GetMimeType("playlist.m3u8"), new Dictionary<string, string>());
}
+ private bool IsLiveStream(StreamState state)
+ {
+ var isLiveStream = (state.RunTimeTicks ?? 0) == 0;
+
+ if (state.VideoRequest.ForceLiveStream)
+ {
+ return true;
+ }
+
+ return isLiveStream;
+ }
+
private string GetMasterPlaylistFileText(StreamState state, int totalBitrate)
{
var builder = new StringBuilder();
builder.AppendLine("#EXTM3U");
- var isLiveStream = (state.RunTimeTicks ?? 0) == 0;
+ var isLiveStream = IsLiveStream(state);
var queryStringIndex = Request.RawUrl.IndexOf('?');
var queryString = queryStringIndex == -1 ? string.Empty : Request.RawUrl.Substring(queryStringIndex);
@@ -524,7 +536,7 @@ namespace MediaBrowser.Api.Playback.Hls
.ToList();
var subtitleGroup = subtitleStreams.Count > 0 &&
- (request is GetMasterHlsVideoPlaylist) &&
+ request is GetMasterHlsVideoPlaylist &&
((GetMasterHlsVideoPlaylist)request).SubtitleMethod == SubtitleDeliveryMethod.Hls ?
"subs" :
null;
@@ -544,12 +556,12 @@ namespace MediaBrowser.Api.Playback.Hls
var variation = GetBitrateVariation(totalBitrate);
var newBitrate = totalBitrate - variation;
- var variantUrl = ReplaceBitrate(playlistUrl, requestedVideoBitrate, (requestedVideoBitrate - variation));
+ var variantUrl = ReplaceBitrate(playlistUrl, requestedVideoBitrate, requestedVideoBitrate - variation);
AppendPlaylist(builder, state, variantUrl, newBitrate, subtitleGroup);
variation *= 2;
newBitrate = totalBitrate - variation;
- variantUrl = ReplaceBitrate(playlistUrl, requestedVideoBitrate, (requestedVideoBitrate - variation));
+ variantUrl = ReplaceBitrate(playlistUrl, requestedVideoBitrate, requestedVideoBitrate - variation);
AppendPlaylist(builder, state, variantUrl, newBitrate, subtitleGroup);
}
@@ -703,7 +715,7 @@ namespace MediaBrowser.Api.Playback.Hls
builder.AppendLine("#EXTM3U");
builder.AppendLine("#EXT-X-PLAYLIST-TYPE:VOD");
builder.AppendLine("#EXT-X-VERSION:3");
- builder.AppendLine("#EXT-X-TARGETDURATION:" + Math.Ceiling((segmentLengths.Length > 0 ? segmentLengths.Max() : state.SegmentLength)).ToString(UsCulture));
+ builder.AppendLine("#EXT-X-TARGETDURATION:" + Math.Ceiling(segmentLengths.Length > 0 ? segmentLengths.Max() : state.SegmentLength).ToString(UsCulture));
builder.AppendLine("#EXT-X-MEDIA-SEQUENCE:0");
var queryStringIndex = Request.RawUrl.IndexOf('?');
@@ -929,10 +941,16 @@ namespace MediaBrowser.Api.Playback.Hls
return isOutputVideo ? ".ts" : ".ts";
}
- protected override bool CanStreamCopyVideo(VideoStreamRequest request, MediaStream videoStream)
+ protected override bool CanStreamCopyVideo(StreamState state)
{
- return false;
- //return base.CanStreamCopyVideo(request, videoStream);
+ var isLiveStream = IsLiveStream(state);
+
+ if (!isLiveStream)
+ {
+ return false;
+ }
+
+ return base.CanStreamCopyVideo(state);
}
}
} \ No newline at end of file
diff --git a/MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs b/MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs
index b44d7f660..e9f33161e 100644
--- a/MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs
+++ b/MediaBrowser.Api/Playback/Hls/HlsSegmentService.cs
@@ -32,25 +32,6 @@ namespace MediaBrowser.Api.Playback.Hls
}
/// <summary>
- /// Class GetHlsVideoStream
- /// </summary>
- [Route("/Videos/{Id}/stream.m3u8", "GET")]
- [Api(Description = "Gets a video stream using HTTP live streaming.")]
- public class GetHlsVideoStreamLegacy : VideoStreamRequest
- {
- // TODO: Deprecate with new iOS app
-
- [ApiMember(Name = "BaselineStreamAudioBitRate", Description = "Optional. Specify the audio bitrate for the baseline stream.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
- public int? BaselineStreamAudioBitRate { get; set; }
-
- [ApiMember(Name = "AppendBaselineStream", Description = "Optional. Whether or not to include a baseline audio-only stream in the master playlist.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
- public bool AppendBaselineStream { get; set; }
-
- [ApiMember(Name = "TimeStampOffsetMs", Description = "Optional. Alter the timestamps in the playlist by a given amount, in ms. Default is 1000.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
- public int TimeStampOffsetMs { get; set; }
- }
-
- /// <summary>
/// Class GetHlsVideoSegment
/// </summary>
[Route("/Videos/{Id}/hls/{PlaylistId}/stream.m3u8", "GET")]
diff --git a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs
index f8adbdc22..610628ced 100644
--- a/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs
+++ b/MediaBrowser.Api/Playback/Hls/VideoHlsService.cs
@@ -1,4 +1,3 @@
-using MediaBrowser.Common.IO;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Devices;
using MediaBrowser.Controller.Dlna;
@@ -28,16 +27,6 @@ namespace MediaBrowser.Api.Playback.Hls
{
}
- /// <summary>
- /// Gets the specified request.
- /// </summary>
- /// <param name="request">The request.</param>
- /// <returns>System.Object.</returns>
- public object Get(GetHlsVideoStreamLegacy request)
- {
- return ProcessRequest(request, false);
- }
-
public object Get(GetLiveHlsStream request)
{
return ProcessRequest(request, true);
diff --git a/MediaBrowser.Api/Playback/Progressive/AudioService.cs b/MediaBrowser.Api/Playback/Progressive/AudioService.cs
index 1d8f5003f..032a0719c 100644
--- a/MediaBrowser.Api/Playback/Progressive/AudioService.cs
+++ b/MediaBrowser.Api/Playback/Progressive/AudioService.cs
@@ -1,11 +1,9 @@
-using MediaBrowser.Common.IO;
-using MediaBrowser.Common.Net;
+using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Devices;
using MediaBrowser.Controller.Dlna;
using MediaBrowser.Controller.Drawing;
using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.LiveTv;
using MediaBrowser.Controller.MediaEncoding;
using MediaBrowser.Model.IO;
using MediaBrowser.Model.Serialization;
diff --git a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs
index 61c3e9aa8..3211f9e39 100644
--- a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs
+++ b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs
@@ -1,5 +1,4 @@
-using MediaBrowser.Common.IO;
-using MediaBrowser.Common.Net;
+using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Devices;
using MediaBrowser.Controller.Dlna;
@@ -14,7 +13,6 @@ using ServiceStack.Web;
using System;
using System.Collections.Generic;
using System.Globalization;
-using System.IO;
using System.Threading;
using System.Threading.Tasks;
using CommonIO;
diff --git a/MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs b/MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs
index f766f46b1..9f02c51cd 100644
--- a/MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs
+++ b/MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs
@@ -1,5 +1,4 @@
-using MediaBrowser.Common.IO;
-using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Logging;
using ServiceStack.Web;
using System;
using System.Collections.Generic;
diff --git a/MediaBrowser.Api/Playback/Progressive/VideoService.cs b/MediaBrowser.Api/Playback/Progressive/VideoService.cs
index 1353d8fe7..b0d87c975 100644
--- a/MediaBrowser.Api/Playback/Progressive/VideoService.cs
+++ b/MediaBrowser.Api/Playback/Progressive/VideoService.cs
@@ -1,4 +1,3 @@
-using MediaBrowser.Common.IO;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Devices;
@@ -10,7 +9,6 @@ using MediaBrowser.Model.IO;
using MediaBrowser.Model.Serialization;
using ServiceStack;
using System;
-using System.Globalization;
using System.IO;
using CommonIO;
using MediaBrowser.Model.Dlna;
@@ -139,12 +137,10 @@ namespace MediaBrowser.Api.Playback.Progressive
args += " -mpegts_m2ts_mode 1";
}
- var isOutputMkv = string.Equals(state.OutputContainer, "mkv", StringComparison.OrdinalIgnoreCase);
-
if (string.Equals(videoCodec, "copy", StringComparison.OrdinalIgnoreCase))
{
if (state.VideoStream != null && IsH264(state.VideoStream) &&
- (string.Equals(state.OutputContainer, "ts", StringComparison.OrdinalIgnoreCase) || isOutputMkv))
+ (string.Equals(state.OutputContainer, "ts", StringComparison.OrdinalIgnoreCase)))
{
args += " -bsf:v h264_mp4toannexb";
}
diff --git a/MediaBrowser.Api/Playback/StreamRequest.cs b/MediaBrowser.Api/Playback/StreamRequest.cs
index 1135a3a54..371dbbda2 100644
--- a/MediaBrowser.Api/Playback/StreamRequest.cs
+++ b/MediaBrowser.Api/Playback/StreamRequest.cs
@@ -189,10 +189,9 @@ namespace MediaBrowser.Api.Playback
[ApiMember(Name = "CopyTimestamps", Description = "Whether or not to copy timestamps when transcoding with an offset. Defaults to false.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
public bool CopyTimestamps { get; set; }
-
- [ApiMember(Name = "Cabac", Description = "Enable if cabac encoding is required", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
- public bool? Cabac { get; set; }
-
+
+ public bool ForceLiveStream { get; set; }
+
public VideoStreamRequest()
{
EnableAutoStreamCopy = true;
diff --git a/MediaBrowser.Api/Playback/StreamState.cs b/MediaBrowser.Api/Playback/StreamState.cs
index d61bb9c0f..ed8a27faf 100644
--- a/MediaBrowser.Api/Playback/StreamState.cs
+++ b/MediaBrowser.Api/Playback/StreamState.cs
@@ -185,7 +185,7 @@ namespace MediaBrowser.Api.Playback
private async void DisposeLiveStream()
{
- if ((MediaSource.RequiresClosing) && string.IsNullOrWhiteSpace(Request.LiveStreamId))
+ if (MediaSource.RequiresClosing && string.IsNullOrWhiteSpace(Request.LiveStreamId))
{
try
{
@@ -480,18 +480,5 @@ namespace MediaBrowser.Api.Playback
return false;
}
}
-
- public bool? IsTargetCabac
- {
- get
- {
- if (Request.Static)
- {
- return VideoStream == null ? null : VideoStream.IsCabac;
- }
-
- return true;
- }
- }
}
}
diff --git a/MediaBrowser.Api/PluginService.cs b/MediaBrowser.Api/PluginService.cs
index aead73def..3bf70715f 100644
--- a/MediaBrowser.Api/PluginService.cs
+++ b/MediaBrowser.Api/PluginService.cs
@@ -1,5 +1,4 @@
using MediaBrowser.Common;
-using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.Net;
using MediaBrowser.Common.Security;
using MediaBrowser.Common.Updates;
diff --git a/MediaBrowser.Api/Reports/Activities/ReportActivitiesBuilder.cs b/MediaBrowser.Api/Reports/Activities/ReportActivitiesBuilder.cs
index 83816c6e3..8fe5246f6 100644
--- a/MediaBrowser.Api/Reports/Activities/ReportActivitiesBuilder.cs
+++ b/MediaBrowser.Api/Reports/Activities/ReportActivitiesBuilder.cs
@@ -1,10 +1,7 @@
using MediaBrowser.Model.Activity;
using MediaBrowser.Model.Querying;
-using System;
using System.Collections.Generic;
using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
using MediaBrowser.Controller.Library;
namespace MediaBrowser.Api.Reports
{
diff --git a/MediaBrowser.Api/Reports/Common/HeaderActivitiesMetadata.cs b/MediaBrowser.Api/Reports/Common/HeaderActivitiesMetadata.cs
index 69c0ff234..4a45f2646 100644
--- a/MediaBrowser.Api/Reports/Common/HeaderActivitiesMetadata.cs
+++ b/MediaBrowser.Api/Reports/Common/HeaderActivitiesMetadata.cs
@@ -1,7 +1,3 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
namespace MediaBrowser.Api.Reports
{
public enum HeaderActivitiesMetadata
diff --git a/MediaBrowser.Api/Reports/Common/HeaderMetadata.cs b/MediaBrowser.Api/Reports/Common/HeaderMetadata.cs
index 62f941a7a..b25123df8 100644
--- a/MediaBrowser.Api/Reports/Common/HeaderMetadata.cs
+++ b/MediaBrowser.Api/Reports/Common/HeaderMetadata.cs
@@ -1,7 +1,3 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
namespace MediaBrowser.Api.Reports
{
public enum HeaderMetadata
diff --git a/MediaBrowser.Api/Reports/Common/ItemViewType.cs b/MediaBrowser.Api/Reports/Common/ItemViewType.cs
index 098442115..ede6705e0 100644
--- a/MediaBrowser.Api/Reports/Common/ItemViewType.cs
+++ b/MediaBrowser.Api/Reports/Common/ItemViewType.cs
@@ -1,7 +1,3 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
namespace MediaBrowser.Api.Reports
{
public enum ItemViewType
diff --git a/MediaBrowser.Api/Reports/Common/ReportBuilderBase.cs b/MediaBrowser.Api/Reports/Common/ReportBuilderBase.cs
index 6e1dd8d35..39b2610d5 100644
--- a/MediaBrowser.Api/Reports/Common/ReportBuilderBase.cs
+++ b/MediaBrowser.Api/Reports/Common/ReportBuilderBase.cs
@@ -1,5 +1,4 @@
using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Channels;
@@ -8,8 +7,6 @@ using MediaBrowser.Model.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
namespace MediaBrowser.Api.Reports
{
@@ -327,7 +324,7 @@ namespace MediaBrowser.Api.Reports
if (stream != null && stream.Width != null)
return string.Format("{0} * {1}",
stream.Width,
- (stream.Height != null ? stream.Height.ToString() : "-"));
+ stream.Height != null ? stream.Height.ToString() : "-");
return string.Empty;
}
diff --git a/MediaBrowser.Api/Reports/Common/ReportDisplayType.cs b/MediaBrowser.Api/Reports/Common/ReportDisplayType.cs
index 69d6d71ee..681bb3928 100644
--- a/MediaBrowser.Api/Reports/Common/ReportDisplayType.cs
+++ b/MediaBrowser.Api/Reports/Common/ReportDisplayType.cs
@@ -1,7 +1,3 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
namespace MediaBrowser.Api.Reports
{
public enum ReportDisplayType
diff --git a/MediaBrowser.Api/Reports/Common/ReportExportType.cs b/MediaBrowser.Api/Reports/Common/ReportExportType.cs
index 05f27f72e..4ac4cad21 100644
--- a/MediaBrowser.Api/Reports/Common/ReportExportType.cs
+++ b/MediaBrowser.Api/Reports/Common/ReportExportType.cs
@@ -1,7 +1,3 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
namespace MediaBrowser.Api.Reports
{
public enum ReportExportType
diff --git a/MediaBrowser.Api/Reports/Common/ReportFieldType.cs b/MediaBrowser.Api/Reports/Common/ReportFieldType.cs
index 58523657a..63c48dff0 100644
--- a/MediaBrowser.Api/Reports/Common/ReportFieldType.cs
+++ b/MediaBrowser.Api/Reports/Common/ReportFieldType.cs
@@ -1,7 +1,3 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
namespace MediaBrowser.Api.Reports
{
public enum ReportFieldType
diff --git a/MediaBrowser.Api/Reports/Common/ReportHeaderIdType.cs b/MediaBrowser.Api/Reports/Common/ReportHeaderIdType.cs
index 58c118151..32b2bc04d 100644
--- a/MediaBrowser.Api/Reports/Common/ReportHeaderIdType.cs
+++ b/MediaBrowser.Api/Reports/Common/ReportHeaderIdType.cs
@@ -1,7 +1,3 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
namespace MediaBrowser.Api.Reports
{
public enum ReportHeaderIdType
diff --git a/MediaBrowser.Api/Reports/Common/ReportIncludeItemTypes.cs b/MediaBrowser.Api/Reports/Common/ReportIncludeItemTypes.cs
index 4b6d96792..65cc2b686 100644
--- a/MediaBrowser.Api/Reports/Common/ReportIncludeItemTypes.cs
+++ b/MediaBrowser.Api/Reports/Common/ReportIncludeItemTypes.cs
@@ -1,7 +1,3 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
namespace MediaBrowser.Api.Reports
{
public enum ReportIncludeItemTypes
diff --git a/MediaBrowser.Api/Reports/Common/ReportViewType.cs b/MediaBrowser.Api/Reports/Common/ReportViewType.cs
index d9b049bb7..a5ffc7085 100644
--- a/MediaBrowser.Api/Reports/Common/ReportViewType.cs
+++ b/MediaBrowser.Api/Reports/Common/ReportViewType.cs
@@ -1,7 +1,3 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
namespace MediaBrowser.Api.Reports
{
public enum ReportViewType
diff --git a/MediaBrowser.Api/Reports/Data/ReportBuilder.cs b/MediaBrowser.Api/Reports/Data/ReportBuilder.cs
index 5e339dc73..e4a560383 100644
--- a/MediaBrowser.Api/Reports/Data/ReportBuilder.cs
+++ b/MediaBrowser.Api/Reports/Data/ReportBuilder.cs
@@ -1,19 +1,10 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
-using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.Localization;
-using MediaBrowser.Model.Channels;
-using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Querying;
-using System;
using System.Collections.Generic;
using System.Linq;
-using System.Linq.Expressions;
-using System.Text;
-using System.Threading.Tasks;
namespace MediaBrowser.Api.Reports
{
@@ -616,9 +607,9 @@ namespace MediaBrowser.Api.Reports
Id = item.Id.ToString("N"),
HasLockData = item.IsLocked,
HasLocalTrailer = hasTrailers != null ? hasTrailers.GetTrailerIds().Count() > 0 : false,
- HasImageTagsPrimary = (item.ImageInfos != null && item.ImageInfos.Count(n => n.Type == ImageType.Primary) > 0),
- HasImageTagsBackdrop = (item.ImageInfos != null && item.ImageInfos.Count(n => n.Type == ImageType.Backdrop) > 0),
- HasImageTagsLogo = (item.ImageInfos != null && item.ImageInfos.Count(n => n.Type == ImageType.Logo) > 0),
+ HasImageTagsPrimary = item.ImageInfos != null && item.ImageInfos.Count(n => n.Type == ImageType.Primary) > 0,
+ HasImageTagsBackdrop = item.ImageInfos != null && item.ImageInfos.Count(n => n.Type == ImageType.Backdrop) > 0,
+ HasImageTagsLogo = item.ImageInfos != null && item.ImageInfos.Count(n => n.Type == ImageType.Logo) > 0,
HasSpecials = hasSpecialFeatures != null ? hasSpecialFeatures.SpecialFeatureIds.Count > 0 : false,
HasSubtitles = video != null ? video.HasSubtitles : false,
RowType = ReportHelper.GetRowType(item.GetClientTypeName())
diff --git a/MediaBrowser.Api/Reports/Data/ReportExport.cs b/MediaBrowser.Api/Reports/Data/ReportExport.cs
index f313cf252..6d751e030 100644
--- a/MediaBrowser.Api/Reports/Data/ReportExport.cs
+++ b/MediaBrowser.Api/Reports/Data/ReportExport.cs
@@ -1,8 +1,5 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
+using System.Linq;
using System.Text;
-using System.Threading.Tasks;
namespace MediaBrowser.Api.Reports
{
diff --git a/MediaBrowser.Api/Reports/Data/ReportOptions.cs b/MediaBrowser.Api/Reports/Data/ReportOptions.cs
index b4fd2ee85..fae91fca3 100644
--- a/MediaBrowser.Api/Reports/Data/ReportOptions.cs
+++ b/MediaBrowser.Api/Reports/Data/ReportOptions.cs
@@ -1,9 +1,4 @@
-using MediaBrowser.Controller.Entities;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using System;
namespace MediaBrowser.Api.Reports
{
diff --git a/MediaBrowser.Api/Reports/Model/ReportGroup.cs b/MediaBrowser.Api/Reports/Model/ReportGroup.cs
index 49c76c7ba..06ffa9082 100644
--- a/MediaBrowser.Api/Reports/Model/ReportGroup.cs
+++ b/MediaBrowser.Api/Reports/Model/ReportGroup.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using System.Collections.Generic;
namespace MediaBrowser.Api.Reports
{
diff --git a/MediaBrowser.Api/Reports/Model/ReportHeader.cs b/MediaBrowser.Api/Reports/Model/ReportHeader.cs
index 6bff9b37e..f08339037 100644
--- a/MediaBrowser.Api/Reports/Model/ReportHeader.cs
+++ b/MediaBrowser.Api/Reports/Model/ReportHeader.cs
@@ -1,11 +1,4 @@
-using MediaBrowser.Controller.Entities;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace MediaBrowser.Api.Reports
+namespace MediaBrowser.Api.Reports
{
/// <summary> A report header. </summary>
public class ReportHeader
diff --git a/MediaBrowser.Api/Reports/Model/ReportItem.cs b/MediaBrowser.Api/Reports/Model/ReportItem.cs
index 06d0b0c46..8d53dd9a1 100644
--- a/MediaBrowser.Api/Reports/Model/ReportItem.cs
+++ b/MediaBrowser.Api/Reports/Model/ReportItem.cs
@@ -1,10 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace MediaBrowser.Api.Reports
+namespace MediaBrowser.Api.Reports
{
/// <summary> A report item. </summary>
public class ReportItem
diff --git a/MediaBrowser.Api/Reports/Model/ReportRow.cs b/MediaBrowser.Api/Reports/Model/ReportRow.cs
index 1a46b72b7..e8e26a053 100644
--- a/MediaBrowser.Api/Reports/Model/ReportRow.cs
+++ b/MediaBrowser.Api/Reports/Model/ReportRow.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using System.Collections.Generic;
namespace MediaBrowser.Api.Reports
{
diff --git a/MediaBrowser.Api/Reports/ReportRequests.cs b/MediaBrowser.Api/Reports/ReportRequests.cs
index b11e293d5..36f4bb379 100644
--- a/MediaBrowser.Api/Reports/ReportRequests.cs
+++ b/MediaBrowser.Api/Reports/ReportRequests.cs
@@ -1,9 +1,6 @@
using MediaBrowser.Api.UserLibrary;
-using MediaBrowser.Model.Entities;
using ServiceStack;
-using System;
using System.Collections.Generic;
-using System.Linq;
namespace MediaBrowser.Api.Reports
{
diff --git a/MediaBrowser.Api/Reports/ReportsService.cs b/MediaBrowser.Api/Reports/ReportsService.cs
index ae6fbc9e2..c3af09cd5 100644
--- a/MediaBrowser.Api/Reports/ReportsService.cs
+++ b/MediaBrowser.Api/Reports/ReportsService.cs
@@ -1,26 +1,15 @@
-using MediaBrowser.Controller.Dto;
-using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Querying;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Globalization;
using System.Linq;
-using MediaBrowser.Model.Dto;
using MediaBrowser.Controller.Localization;
-using MediaBrowser.Controller.Entities.Movies;
-using MediaBrowser.Controller.Persistence;
-using MediaBrowser.Api.UserLibrary;
-using MediaBrowser.Controller.Collections;
-using MediaBrowser.Controller.Entities.TV;
using System;
-using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Model.Entities;
-using MediaBrowser.Controller.Net;
using MediaBrowser.Model.Activity;
using MediaBrowser.Controller.Activity;
-using System.IO;
-using System.Text;
namespace MediaBrowser.Api.Reports
{
diff --git a/MediaBrowser.Api/Reports/Stat/ReportStatBuilder.cs b/MediaBrowser.Api/Reports/Stat/ReportStatBuilder.cs
index fb694d6e1..0da4857ac 100644
--- a/MediaBrowser.Api/Reports/Stat/ReportStatBuilder.cs
+++ b/MediaBrowser.Api/Reports/Stat/ReportStatBuilder.cs
@@ -1,11 +1,8 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
-using MediaBrowser.Model.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
namespace MediaBrowser.Api.Reports
{
diff --git a/MediaBrowser.Api/Reports/Stat/ReportStatGroup.cs b/MediaBrowser.Api/Reports/Stat/ReportStatGroup.cs
index 378eda935..f901b5417 100644
--- a/MediaBrowser.Api/Reports/Stat/ReportStatGroup.cs
+++ b/MediaBrowser.Api/Reports/Stat/ReportStatGroup.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using System.Collections.Generic;
namespace MediaBrowser.Api.Reports
{
diff --git a/MediaBrowser.Api/Reports/Stat/ReportStatItem.cs b/MediaBrowser.Api/Reports/Stat/ReportStatItem.cs
index c7b14511f..c93ba15af 100644
--- a/MediaBrowser.Api/Reports/Stat/ReportStatItem.cs
+++ b/MediaBrowser.Api/Reports/Stat/ReportStatItem.cs
@@ -1,10 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace MediaBrowser.Api.Reports
+namespace MediaBrowser.Api.Reports
{
/// <summary> A report stat item. </summary>
public class ReportStatItem
diff --git a/MediaBrowser.Api/Reports/Stat/ReportStatResult.cs b/MediaBrowser.Api/Reports/Stat/ReportStatResult.cs
index 66d5f16a4..fbf98fc17 100644
--- a/MediaBrowser.Api/Reports/Stat/ReportStatResult.cs
+++ b/MediaBrowser.Api/Reports/Stat/ReportStatResult.cs
@@ -1,8 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using System.Collections.Generic;
namespace MediaBrowser.Api.Reports
{
diff --git a/MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs b/MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs
index cb8f91ab6..5d3465c58 100644
--- a/MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs
+++ b/MediaBrowser.Api/ScheduledTasks/ScheduledTasksWebSocketListener.cs
@@ -1,5 +1,4 @@
-using MediaBrowser.Common.Net;
-using MediaBrowser.Common.ScheduledTasks;
+using MediaBrowser.Common.ScheduledTasks;
using MediaBrowser.Controller.Net;
using MediaBrowser.Model.Events;
using MediaBrowser.Model.Logging;
diff --git a/MediaBrowser.Api/SearchService.cs b/MediaBrowser.Api/SearchService.cs
index 89fc29f3d..5f6767a35 100644
--- a/MediaBrowser.Api/SearchService.cs
+++ b/MediaBrowser.Api/SearchService.cs
@@ -4,12 +4,10 @@ using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.LiveTv;
using MediaBrowser.Controller.Net;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Search;
using ServiceStack;
-using System;
using System.Linq;
using System.Threading.Tasks;
diff --git a/MediaBrowser.Api/Subtitles/SubtitleService.cs b/MediaBrowser.Api/Subtitles/SubtitleService.cs
index ff17e988e..c3f31e75a 100644
--- a/MediaBrowser.Api/Subtitles/SubtitleService.cs
+++ b/MediaBrowser.Api/Subtitles/SubtitleService.cs
@@ -17,7 +17,6 @@ using System.Threading;
using System.Threading.Tasks;
using CommonIO;
using MimeTypes = MediaBrowser.Model.Net.MimeTypes;
-using MediaBrowser.Common.IO;
namespace MediaBrowser.Api.Subtitles
{
diff --git a/MediaBrowser.Api/System/SystemInfoWebSocketListener.cs b/MediaBrowser.Api/System/SystemInfoWebSocketListener.cs
index 49a3e3291..9ab7770ed 100644
--- a/MediaBrowser.Api/System/SystemInfoWebSocketListener.cs
+++ b/MediaBrowser.Api/System/SystemInfoWebSocketListener.cs
@@ -1,5 +1,4 @@
-using MediaBrowser.Common.Net;
-using MediaBrowser.Controller;
+using MediaBrowser.Controller;
using MediaBrowser.Controller.Net;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.System;
diff --git a/MediaBrowser.Api/System/SystemService.cs b/MediaBrowser.Api/System/SystemService.cs
index 2661c245f..b4b41c844 100644
--- a/MediaBrowser.Api/System/SystemService.cs
+++ b/MediaBrowser.Api/System/SystemService.cs
@@ -1,10 +1,8 @@
using MediaBrowser.Common.Configuration;
-using MediaBrowser.Common.IO;
using MediaBrowser.Common.Net;
using MediaBrowser.Common.Security;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Net;
-using MediaBrowser.Model.Entities;
using MediaBrowser.Model.System;
using ServiceStack;
using System;
diff --git a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs
index a28202943..6ae2b0832 100644
--- a/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs
+++ b/MediaBrowser.Api/UserLibrary/BaseItemsByNameService.cs
@@ -2,7 +2,6 @@
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Persistence;
-using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Querying;
using ServiceStack;
@@ -332,7 +331,7 @@ namespace MediaBrowser.Api.UserLibrary
{
return false;
}
- if (!(tags.Any(v => hasTags.Tags.Contains(v, StringComparer.OrdinalIgnoreCase))))
+ if (!tags.Any(v => hasTags.Tags.Contains(v, StringComparer.OrdinalIgnoreCase)))
{
return false;
}
@@ -347,7 +346,7 @@ namespace MediaBrowser.Api.UserLibrary
// Apply genre filter
var genres = request.GetGenres();
- if (genres.Length > 0 && !(genres.Any(v => i.Genres.Contains(v, StringComparer.OrdinalIgnoreCase))))
+ if (genres.Length > 0 && !genres.Any(v => i.Genres.Contains(v, StringComparer.OrdinalIgnoreCase)))
{
return false;
}
diff --git a/MediaBrowser.Api/UserLibrary/GameGenresService.cs b/MediaBrowser.Api/UserLibrary/GameGenresService.cs
index a1ad14a4d..58237f80f 100644
--- a/MediaBrowser.Api/UserLibrary/GameGenresService.cs
+++ b/MediaBrowser.Api/UserLibrary/GameGenresService.cs
@@ -5,7 +5,6 @@ using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Querying;
using ServiceStack;
using System;
using System.Collections.Generic;
diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs
index ea7e16e8d..cfdc40bb2 100644
--- a/MediaBrowser.Api/UserLibrary/ItemsService.cs
+++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs
@@ -1,8 +1,6 @@
using MediaBrowser.Controller.Collections;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Entities.Audio;
-using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Localization;
using MediaBrowser.Controller.Net;
diff --git a/MediaBrowser.Api/UserLibrary/MusicGenresService.cs b/MediaBrowser.Api/UserLibrary/MusicGenresService.cs
index 182691584..12cb62fac 100644
--- a/MediaBrowser.Api/UserLibrary/MusicGenresService.cs
+++ b/MediaBrowser.Api/UserLibrary/MusicGenresService.cs
@@ -5,9 +5,7 @@ using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Model.Dto;
-using MediaBrowser.Model.Querying;
using ServiceStack;
-using System;
using System.Collections.Generic;
using System.Linq;
diff --git a/MediaBrowser.Api/UserLibrary/PlaystateService.cs b/MediaBrowser.Api/UserLibrary/PlaystateService.cs
index 0a96a5b06..94c391cb5 100644
--- a/MediaBrowser.Api/UserLibrary/PlaystateService.cs
+++ b/MediaBrowser.Api/UserLibrary/PlaystateService.cs
@@ -285,7 +285,7 @@ namespace MediaBrowser.Api.UserLibrary
/// <param name="request">The request.</param>
public void Post(OnPlaybackStart request)
{
- var queueableMediaTypes = (request.QueueableMediaTypes ?? string.Empty);
+ var queueableMediaTypes = request.QueueableMediaTypes ?? string.Empty;
Post(new ReportPlaybackStart
{
diff --git a/MediaBrowser.Api/UserLibrary/StudiosService.cs b/MediaBrowser.Api/UserLibrary/StudiosService.cs
index 7cf8d752a..2cdabf721 100644
--- a/MediaBrowser.Api/UserLibrary/StudiosService.cs
+++ b/MediaBrowser.Api/UserLibrary/StudiosService.cs
@@ -4,9 +4,7 @@ using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Model.Dto;
-using MediaBrowser.Model.Querying;
using ServiceStack;
-using System;
using System.Collections.Generic;
using System.Linq;
diff --git a/MediaBrowser.Api/UserLibrary/YearsService.cs b/MediaBrowser.Api/UserLibrary/YearsService.cs
index 4b3fe6c8e..ef80f8714 100644
--- a/MediaBrowser.Api/UserLibrary/YearsService.cs
+++ b/MediaBrowser.Api/UserLibrary/YearsService.cs
@@ -4,9 +4,7 @@ using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Model.Dto;
-using MediaBrowser.Model.Querying;
using ServiceStack;
-using System;
using System.Collections.Generic;
using System.Linq;
diff --git a/MediaBrowser.Api/UserService.cs b/MediaBrowser.Api/UserService.cs
index a35a1c3a2..9b611c397 100644
--- a/MediaBrowser.Api/UserService.cs
+++ b/MediaBrowser.Api/UserService.cs
@@ -2,7 +2,6 @@
using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Devices;
-using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Session;
diff --git a/MediaBrowser.Api/VideosService.cs b/MediaBrowser.Api/VideosService.cs
index 0cffbb42c..c6ec69c85 100644
--- a/MediaBrowser.Api/VideosService.cs
+++ b/MediaBrowser.Api/VideosService.cs
@@ -1,5 +1,4 @@
-using MediaBrowser.Common.IO;
-using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;