commit
3e0a218076
|
@ -36,6 +36,7 @@ namespace MediaBrowser.Api.Playback.Progressive
|
||||||
[Route("/Videos/{Id}/stream.wmv", "GET")]
|
[Route("/Videos/{Id}/stream.wmv", "GET")]
|
||||||
[Route("/Videos/{Id}/stream.wtv", "GET")]
|
[Route("/Videos/{Id}/stream.wtv", "GET")]
|
||||||
[Route("/Videos/{Id}/stream.mov", "GET")]
|
[Route("/Videos/{Id}/stream.mov", "GET")]
|
||||||
|
[Route("/Videos/{Id}/stream.iso", "GET")]
|
||||||
[Route("/Videos/{Id}/stream", "GET")]
|
[Route("/Videos/{Id}/stream", "GET")]
|
||||||
[Route("/Videos/{Id}/stream.ts", "HEAD")]
|
[Route("/Videos/{Id}/stream.ts", "HEAD")]
|
||||||
[Route("/Videos/{Id}/stream.webm", "HEAD")]
|
[Route("/Videos/{Id}/stream.webm", "HEAD")]
|
||||||
|
@ -53,6 +54,7 @@ namespace MediaBrowser.Api.Playback.Progressive
|
||||||
[Route("/Videos/{Id}/stream.wtv", "HEAD")]
|
[Route("/Videos/{Id}/stream.wtv", "HEAD")]
|
||||||
[Route("/Videos/{Id}/stream.m2ts", "HEAD")]
|
[Route("/Videos/{Id}/stream.m2ts", "HEAD")]
|
||||||
[Route("/Videos/{Id}/stream.mov", "HEAD")]
|
[Route("/Videos/{Id}/stream.mov", "HEAD")]
|
||||||
|
[Route("/Videos/{Id}/stream.iso", "HEAD")]
|
||||||
[Route("/Videos/{Id}/stream", "HEAD")]
|
[Route("/Videos/{Id}/stream", "HEAD")]
|
||||||
[Api(Description = "Gets a video stream")]
|
[Api(Description = "Gets a video stream")]
|
||||||
public class GetVideoStream : VideoStreamRequest
|
public class GetVideoStream : VideoStreamRequest
|
||||||
|
|
|
@ -6,6 +6,7 @@ using ServiceStack;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using MediaBrowser.Controller.Configuration;
|
||||||
|
|
||||||
namespace MediaBrowser.Api.ScheduledTasks
|
namespace MediaBrowser.Api.ScheduledTasks
|
||||||
{
|
{
|
||||||
|
@ -90,12 +91,14 @@ namespace MediaBrowser.Api.ScheduledTasks
|
||||||
/// <value>The task manager.</value>
|
/// <value>The task manager.</value>
|
||||||
private ITaskManager TaskManager { get; set; }
|
private ITaskManager TaskManager { get; set; }
|
||||||
|
|
||||||
|
private readonly IServerConfigurationManager _config;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="ScheduledTaskService" /> class.
|
/// Initializes a new instance of the <see cref="ScheduledTaskService" /> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="taskManager">The task manager.</param>
|
/// <param name="taskManager">The task manager.</param>
|
||||||
/// <exception cref="System.ArgumentNullException">taskManager</exception>
|
/// <exception cref="ArgumentNullException">taskManager</exception>
|
||||||
public ScheduledTaskService(ITaskManager taskManager)
|
public ScheduledTaskService(ITaskManager taskManager, IServerConfigurationManager config)
|
||||||
{
|
{
|
||||||
if (taskManager == null)
|
if (taskManager == null)
|
||||||
{
|
{
|
||||||
|
@ -103,6 +106,7 @@ namespace MediaBrowser.Api.ScheduledTasks
|
||||||
}
|
}
|
||||||
|
|
||||||
TaskManager = taskManager;
|
TaskManager = taskManager;
|
||||||
|
_config = config;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -194,6 +198,20 @@ namespace MediaBrowser.Api.ScheduledTasks
|
||||||
throw new ResourceNotFoundException("Task not found");
|
throw new ResourceNotFoundException("Task not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var hasKey = task.ScheduledTask as IHasKey;
|
||||||
|
if (hasKey != null)
|
||||||
|
{
|
||||||
|
if (string.Equals(hasKey.Key, "SystemUpdateTask", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
// This is a hack for now just to get the update application function to work when auto-update is disabled
|
||||||
|
if (!_config.Configuration.EnableAutoUpdate)
|
||||||
|
{
|
||||||
|
_config.Configuration.EnableAutoUpdate = true;
|
||||||
|
_config.SaveConfiguration();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TaskManager.Execute(task);
|
TaskManager.Execute(task);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,8 @@ namespace MediaBrowser.Controller.Providers
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// using EnumerateFileSystemInfos doesn't handle reparse points (symlinks)
|
// using EnumerateFileSystemInfos doesn't handle reparse points (symlinks)
|
||||||
var list = _fileSystem.GetFileSystemEntries(path);
|
var list = _fileSystem.GetFileSystemEntries(path)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
// Seeing dupes on some users file system for some reason
|
// Seeing dupes on some users file system for some reason
|
||||||
foreach (var item in list)
|
foreach (var item in list)
|
||||||
|
|
|
@ -286,16 +286,29 @@ namespace MediaBrowser.Server.Implementations.FileOrganization
|
||||||
{
|
{
|
||||||
if (options.TvOptions.CopyOriginalFile && fileExists && IsSameEpisode(sourcePath, newPath))
|
if (options.TvOptions.CopyOriginalFile && fileExists && IsSameEpisode(sourcePath, newPath))
|
||||||
{
|
{
|
||||||
_logger.Info("File {0} already copied to new path {1}, stopping organization", sourcePath, newPath);
|
var msg = string.Format("File '{0}' already copied to new path '{1}', stopping organization", sourcePath, newPath);
|
||||||
|
_logger.Info(msg);
|
||||||
result.Status = FileSortingStatus.SkippedExisting;
|
result.Status = FileSortingStatus.SkippedExisting;
|
||||||
result.StatusMessage = string.Empty;
|
result.StatusMessage = msg;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fileExists || otherDuplicatePaths.Count > 0)
|
if (fileExists)
|
||||||
{
|
{
|
||||||
|
var msg = string.Format("File '{0}' already exists as '{1}', stopping organization", sourcePath, newPath);
|
||||||
|
_logger.Info(msg);
|
||||||
result.Status = FileSortingStatus.SkippedExisting;
|
result.Status = FileSortingStatus.SkippedExisting;
|
||||||
result.StatusMessage = string.Empty;
|
result.StatusMessage = msg;
|
||||||
|
result.TargetPath = newPath;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (otherDuplicatePaths.Count > 0)
|
||||||
|
{
|
||||||
|
var msg = string.Format("File '{0}' already exists as '{1}', stopping organization", sourcePath, otherDuplicatePaths);
|
||||||
|
_logger.Info(msg);
|
||||||
|
result.Status = FileSortingStatus.SkippedExisting;
|
||||||
|
result.StatusMessage = msg;
|
||||||
result.DuplicatePaths = otherDuplicatePaths;
|
result.DuplicatePaths = otherDuplicatePaths;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -778,7 +778,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// HDHR doesn't seem to release the tuner right away after first probing with ffmpeg
|
// HDHR doesn't seem to release the tuner right away after first probing with ffmpeg
|
||||||
await Task.Delay(3000, cancellationToken).ConfigureAwait(false);
|
//await Task.Delay(3000, cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
var duration = recordingEndDate - DateTime.UtcNow;
|
var duration = recordingEndDate - DateTime.UtcNow;
|
||||||
|
|
||||||
|
|
|
@ -88,11 +88,11 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
||||||
// MUST read both stdout and stderr asynchronously or a deadlock may occurr
|
// MUST read both stdout and stderr asynchronously or a deadlock may occurr
|
||||||
process.BeginOutputReadLine();
|
process.BeginOutputReadLine();
|
||||||
|
|
||||||
|
onStarted();
|
||||||
|
|
||||||
// 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(process.StandardError.BaseStream, _logFileStream);
|
StartStreamingLog(process.StandardError.BaseStream, _logFileStream);
|
||||||
|
|
||||||
onStarted();
|
|
||||||
|
|
||||||
// Wait for the file to exist before proceeeding
|
// Wait for the file to exist before proceeeding
|
||||||
while (!_hasExited)
|
while (!_hasExited)
|
||||||
{
|
{
|
||||||
|
|
|
@ -96,30 +96,19 @@ namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
||||||
|
|
||||||
private async Task<string> GetModelInfo(TunerHostInfo info, CancellationToken cancellationToken)
|
private async Task<string> GetModelInfo(TunerHostInfo info, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
string model = null;
|
|
||||||
|
|
||||||
using (var stream = await _httpClient.Get(new HttpRequestOptions()
|
using (var stream = await _httpClient.Get(new HttpRequestOptions()
|
||||||
{
|
{
|
||||||
Url = string.Format("{0}/", GetApiUrl(info, false)),
|
Url = string.Format("{0}/discover.json", GetApiUrl(info, false)),
|
||||||
CancellationToken = cancellationToken,
|
CancellationToken = cancellationToken,
|
||||||
CacheLength = TimeSpan.FromDays(1),
|
CacheLength = TimeSpan.FromDays(1),
|
||||||
CacheMode = CacheMode.Unconditional,
|
CacheMode = CacheMode.Unconditional,
|
||||||
TimeoutMs = Convert.ToInt32(TimeSpan.FromSeconds(5).TotalMilliseconds)
|
TimeoutMs = Convert.ToInt32(TimeSpan.FromSeconds(5).TotalMilliseconds)
|
||||||
}))
|
}))
|
||||||
{
|
{
|
||||||
using (var sr = new StreamReader(stream, System.Text.Encoding.UTF8))
|
var response = JsonSerializer.DeserializeFromStream<DiscoverResponse>(stream);
|
||||||
{
|
|
||||||
while (!sr.EndOfStream)
|
|
||||||
{
|
|
||||||
string line = StripXML(sr.ReadLine());
|
|
||||||
if (line.StartsWith("Model:")) { model = line.Replace("Model: ", ""); }
|
|
||||||
//if (line.StartsWith("Device ID:")) { deviceID = line.Replace("Device ID: ", ""); }
|
|
||||||
//if (line.StartsWith("Firmware:")) { firmware = line.Replace("Firmware: ", ""); }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return model;
|
return response.ModelNumber;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<List<LiveTvTunerInfo>> GetTunerInfos(TunerHostInfo info, CancellationToken cancellationToken)
|
public async Task<List<LiveTvTunerInfo>> GetTunerInfos(TunerHostInfo info, CancellationToken cancellationToken)
|
||||||
|
@ -438,5 +427,17 @@ namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
||||||
|
|
||||||
return info.Any(i => i.Status == LiveTvTunerStatus.Available);
|
return info.Any(i => i.Status == LiveTvTunerStatus.Available);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class DiscoverResponse
|
||||||
|
{
|
||||||
|
public string FriendlyName { get; set; }
|
||||||
|
public string ModelNumber { get; set; }
|
||||||
|
public string FirmwareName { get; set; }
|
||||||
|
public string FirmwareVersion { get; set; }
|
||||||
|
public string DeviceID { get; set; }
|
||||||
|
public string DeviceAuth { get; set; }
|
||||||
|
public string BaseURL { get; set; }
|
||||||
|
public string LineupURL { get; set; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user