diff --git a/MediaBrowser.Api/Devices/DeviceService.cs b/MediaBrowser.Api/Devices/DeviceService.cs
index ab0a4a4b2..759eea353 100644
--- a/MediaBrowser.Api/Devices/DeviceService.cs
+++ b/MediaBrowser.Api/Devices/DeviceService.cs
@@ -1,4 +1,6 @@
-using MediaBrowser.Controller.Devices;
+using System;
+using System.Linq;
+using MediaBrowser.Controller.Devices;
using MediaBrowser.Controller.Net;
using MediaBrowser.Model.Devices;
using MediaBrowser.Model.Querying;
@@ -128,15 +130,32 @@ namespace MediaBrowser.Api.Devices
var id = Request.QueryString["Id"];
var name = Request.QueryString["Name"];
- var task = _deviceManager.AcceptCameraUpload(deviceId, request.RequestStream, new LocalFileInfo
+ if (Request.ContentType.IndexOf("multi", StringComparison.OrdinalIgnoreCase) == -1)
{
- MimeType = Request.ContentType,
- Album = album,
- Name = name,
- Id = id
- });
+ var task = _deviceManager.AcceptCameraUpload(deviceId, request.RequestStream, new LocalFileInfo
+ {
+ MimeType = Request.ContentType,
+ Album = album,
+ Name = name,
+ Id = id
+ });
- Task.WaitAll(task);
+ Task.WaitAll(task);
+ }
+ else
+ {
+ var file = Request.Files.First();
+
+ var task = _deviceManager.AcceptCameraUpload(deviceId, file.InputStream, new LocalFileInfo
+ {
+ MimeType = file.ContentType,
+ Album = album,
+ Name = name,
+ Id = id
+ });
+
+ Task.WaitAll(task);
+ }
}
}
}
diff --git a/MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs b/MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs
index b615adf81..42871866d 100644
--- a/MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs
+++ b/MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs
@@ -58,7 +58,7 @@ namespace MediaBrowser.Common.ScheduledTasks
{
if (isApplicationStartup)
{
- triggerDate = DateTime.UtcNow.AddMinutes(5);
+ triggerDate = DateTime.UtcNow.AddMinutes(2);
}
else
{
diff --git a/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs b/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs
index 28f6deafa..1be04bb7c 100644
--- a/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs
+++ b/MediaBrowser.Controller/LiveTv/LiveTvAudioRecording.cs
@@ -20,6 +20,7 @@ namespace MediaBrowser.Controller.LiveTv
public string EpisodeTitle { get; set; }
public bool IsSeries { get; set; }
public string SeriesTimerId { get; set; }
+ [IgnoreDataMember]
public DateTime StartDate { get; set; }
public RecordingStatus Status { get; set; }
[IgnoreDataMember]
diff --git a/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs b/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs
index 937234b17..0f7d0a6ce 100644
--- a/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs
+++ b/MediaBrowser.Controller/LiveTv/LiveTvProgram.cs
@@ -56,6 +56,7 @@ namespace MediaBrowser.Controller.LiveTv
///
/// The start date of the program, in UTC.
///
+ [IgnoreDataMember]
public DateTime StartDate { get; set; }
///
diff --git a/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs b/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs
index 768869109..a26d8b402 100644
--- a/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs
+++ b/MediaBrowser.Controller/LiveTv/LiveTvVideoRecording.cs
@@ -20,6 +20,7 @@ namespace MediaBrowser.Controller.LiveTv
public string EpisodeTitle { get; set; }
public bool IsSeries { get; set; }
public string SeriesTimerId { get; set; }
+ [IgnoreDataMember]
public DateTime StartDate { get; set; }
public RecordingStatus Status { get; set; }
[IgnoreDataMember]
diff --git a/MediaBrowser.Controller/Providers/MetadataStatus.cs b/MediaBrowser.Controller/Providers/MetadataStatus.cs
index 283b9edbc..f395dabf1 100644
--- a/MediaBrowser.Controller/Providers/MetadataStatus.cs
+++ b/MediaBrowser.Controller/Providers/MetadataStatus.cs
@@ -78,9 +78,9 @@ namespace MediaBrowser.Controller.Providers
public bool IsDirty { get; private set; }
- public void SetDateLastMetadataRefresh(DateTime date)
+ public void SetDateLastMetadataRefresh(DateTime? date)
{
- if (date != (DateLastMetadataRefresh ?? DateTime.MinValue))
+ if (date != DateLastMetadataRefresh)
{
IsDirty = true;
}
@@ -88,9 +88,9 @@ namespace MediaBrowser.Controller.Providers
DateLastMetadataRefresh = date;
}
- public void SetDateLastImagesRefresh(DateTime date)
+ public void SetDateLastImagesRefresh(DateTime? date)
{
- if (date != (DateLastImagesRefresh ?? DateTime.MinValue))
+ if (date != DateLastImagesRefresh)
{
IsDirty = true;
}
diff --git a/MediaBrowser.Model/Net/MimeTypes.cs b/MediaBrowser.Model/Net/MimeTypes.cs
index efa5a5217..e905af58d 100644
--- a/MediaBrowser.Model/Net/MimeTypes.cs
+++ b/MediaBrowser.Model/Net/MimeTypes.cs
@@ -318,7 +318,7 @@ namespace MediaBrowser.Model.Net
{
return result;
}
- throw new ArgumentNullException("Unable to determine extension for mimeType: " + mimeType);
+ return null;
}
}
}
diff --git a/MediaBrowser.Providers/Manager/MetadataService.cs b/MediaBrowser.Providers/Manager/MetadataService.cs
index cddc6f894..8a60ea78f 100644
--- a/MediaBrowser.Providers/Manager/MetadataService.cs
+++ b/MediaBrowser.Providers/Manager/MetadataService.cs
@@ -147,7 +147,14 @@ namespace MediaBrowser.Providers.Manager
updateType = updateType | result.UpdateType;
refreshResult.AddStatus(result.Status, result.ErrorMessage);
- refreshResult.SetDateLastMetadataRefresh(DateTime.UtcNow);
+ if (result.Failures == 0)
+ {
+ refreshResult.SetDateLastMetadataRefresh(DateTime.UtcNow);
+ }
+ else
+ {
+ refreshResult.SetDateLastMetadataRefresh(null);
+ }
MergeIdentities(itemOfType, id);
}
@@ -164,7 +171,14 @@ namespace MediaBrowser.Providers.Manager
updateType = updateType | result.UpdateType;
refreshResult.AddStatus(result.Status, result.ErrorMessage);
- refreshResult.SetDateLastImagesRefresh(DateTime.UtcNow);
+ if (result.Failures == 0)
+ {
+ refreshResult.SetDateLastImagesRefresh(DateTime.UtcNow);
+ }
+ else
+ {
+ refreshResult.SetDateLastImagesRefresh(null);
+ }
}
}
@@ -503,7 +517,7 @@ namespace MediaBrowser.Providers.Manager
{
return false;
}
-
+
return true;
}
diff --git a/MediaBrowser.Server.Implementations/Devices/DeviceManager.cs b/MediaBrowser.Server.Implementations/Devices/DeviceManager.cs
index 04337dda6..0173f2784 100644
--- a/MediaBrowser.Server.Implementations/Devices/DeviceManager.cs
+++ b/MediaBrowser.Server.Implementations/Devices/DeviceManager.cs
@@ -8,6 +8,7 @@ using MediaBrowser.Model.Devices;
using MediaBrowser.Model.Events;
using MediaBrowser.Model.Extensions;
using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Net;
using MediaBrowser.Model.Querying;
using MediaBrowser.Model.Session;
using MediaBrowser.Model.Users;
@@ -151,12 +152,13 @@ namespace MediaBrowser.Server.Implementations.Devices
path = Path.Combine(path, _fileSystem.GetValidFilename(file.Album));
}
- Directory.CreateDirectory(path);
-
path = Path.Combine(path, file.Name);
+ path = Path.ChangeExtension(path, MimeTypes.ToExtension(file.MimeType) ?? "jpg");
_libraryMonitor.ReportFileSystemChangeBeginning(path);
+ Directory.CreateDirectory(Path.GetDirectoryName(path));
+
try
{
using (var fs = _fileSystem.GetFileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read))
diff --git a/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs b/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
index c5edb212b..fb5824805 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs
@@ -369,6 +369,19 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
}
public async Task> GetProgramsAsync(string channelId, DateTime startDateUtc, DateTime endDateUtc, CancellationToken cancellationToken)
+ {
+ try
+ {
+ return await GetProgramsAsyncInternal(channelId, startDateUtc, endDateUtc, cancellationToken).ConfigureAwait(false);
+ }
+ catch (Exception ex)
+ {
+ _logger.ErrorException("Error getting programs", ex);
+ return GetEpgDataForChannel(channelId).Where(i => i.StartDate <= endDateUtc && i.EndDate >= startDateUtc);
+ }
+ }
+
+ private async Task> GetProgramsAsyncInternal(string channelId, DateTime startDateUtc, DateTime endDateUtc, CancellationToken cancellationToken)
{
var channels = await GetChannelsAsync(true, cancellationToken).ConfigureAwait(false);
var channel = channels.First(i => string.Equals(i.Id, channelId, StringComparison.OrdinalIgnoreCase));
@@ -377,6 +390,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
{
var programs = await provider.Item1.GetProgramsAsync(provider.Item2, channel.Number, startDateUtc, endDateUtc, cancellationToken)
.ConfigureAwait(false);
+
var list = programs.ToList();
// Replace the value that came from the provider with a normalized value
diff --git a/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs b/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs
index bc6ed47ad..c16d044b7 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs
@@ -331,7 +331,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.HdHomerun
Container = "ts",
Id = profile,
SupportsDirectPlay = true,
- SupportsDirectStream = false,
+ SupportsDirectStream = true,
SupportsTranscoding = true
};
diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
index 86b4e7d1c..9fa650bdf 100644
--- a/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
+++ b/MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs
@@ -191,6 +191,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
{
"type",
"data",
+ "StartDate",
"EndDate",
"IsOffline",
"ChannelId",
@@ -516,35 +517,44 @@ namespace MediaBrowser.Server.Implementations.Persistence
if (!reader.IsDBNull(2))
{
- item.EndDate = reader.GetDateTime(2).ToUniversalTime();
+ var hasStartDate = item as IHasStartDate;
+ if (hasStartDate != null)
+ {
+ hasStartDate.StartDate = reader.GetDateTime(2).ToUniversalTime();
+ }
}
if (!reader.IsDBNull(3))
{
- item.IsOffline = reader.GetBoolean(3);
+ item.EndDate = reader.GetDateTime(3).ToUniversalTime();
}
if (!reader.IsDBNull(4))
{
- item.ChannelId = reader.GetString(4);
+ item.IsOffline = reader.GetBoolean(4);
+ }
+
+ if (!reader.IsDBNull(5))
+ {
+ item.ChannelId = reader.GetString(5);
}
var hasProgramAttributes = item as IHasProgramAttributes;
if (hasProgramAttributes != null)
{
- if (!reader.IsDBNull(5))
- {
- hasProgramAttributes.IsMovie = reader.GetBoolean(5);
- }
-
if (!reader.IsDBNull(6))
{
- hasProgramAttributes.IsSports = reader.GetBoolean(6);
+ hasProgramAttributes.IsMovie = reader.GetBoolean(6);
}
if (!reader.IsDBNull(7))
{
- hasProgramAttributes.IsKids = reader.GetBoolean(7);
+ hasProgramAttributes.IsSports = reader.GetBoolean(7);
+ }
+
+ if (!reader.IsDBNull(8))
+ {
+ hasProgramAttributes.IsKids = reader.GetBoolean(8);
}
}
diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
index 91a438ff7..2ba831c3f 100644
--- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
+++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
@@ -90,6 +90,9 @@
PreserveNewest
+
+ PreserveNewest
+
PreserveNewest
@@ -165,6 +168,9 @@
PreserveNewest
+
+ PreserveNewest
+
PreserveNewest