diff --git a/MediaBrowser.Controller/LiveTv/ProgramInfo.cs b/MediaBrowser.Controller/LiveTv/ProgramInfo.cs
index 3f8fc639f1..467264e7ab 100644
--- a/MediaBrowser.Controller/LiveTv/ProgramInfo.cs
+++ b/MediaBrowser.Controller/LiveTv/ProgramInfo.cs
@@ -33,6 +33,11 @@ namespace MediaBrowser.Controller.LiveTv
///
/// The overview.
public string Overview { get; set; }
+ ///
+ /// Gets or sets the short overview.
+ ///
+ /// The short overview.
+ public string ShortOverview { get; set; }
///
/// The start date of the program, in UTC.
@@ -165,7 +170,17 @@ namespace MediaBrowser.Controller.LiveTv
///
/// The show identifier.
public string ShowId { get; set; }
-
+ ///
+ /// Gets or sets the season number.
+ ///
+ /// The season number.
+ public int? SeasonNumber { get; set; }
+ ///
+ /// Gets or sets the episode number.
+ ///
+ /// The episode number.
+ public int? EpisodeNumber { get; set; }
+
public ProgramInfo()
{
Genres = new List();
diff --git a/MediaBrowser.Dlna/Didl/DidlBuilder.cs b/MediaBrowser.Dlna/Didl/DidlBuilder.cs
index 25514f1dca..390f442670 100644
--- a/MediaBrowser.Dlna/Didl/DidlBuilder.cs
+++ b/MediaBrowser.Dlna/Didl/DidlBuilder.cs
@@ -193,6 +193,9 @@ namespace MediaBrowser.Dlna.Didl
if (string.Equals(subtitleMode, "CaptionInfoEx", StringComparison.OrdinalIgnoreCase))
{
+ // http://192.168.1.3:9999/video.srt
+ // http://192.168.1.3:9999/video.srt
+
//var res = container.OwnerDocument.CreateElement("SEC", "CaptionInfoEx");
//res.InnerText = info.Url;
@@ -201,6 +204,16 @@ namespace MediaBrowser.Dlna.Didl
//res.SetAttribute("type", info.Format.ToLower());
//container.AppendChild(res);
}
+ else if (string.Equals(subtitleMode, "smi", StringComparison.OrdinalIgnoreCase))
+ {
+ var res = container.OwnerDocument.CreateElement(string.Empty, "res", NS_DIDL);
+
+ res.InnerText = info.Url;
+
+ res.SetAttribute("protocolInfo", "http-get:*:smi/caption:*");
+
+ container.AppendChild(res);
+ }
else
{
var res = container.OwnerDocument.CreateElement(string.Empty, "res", NS_DIDL);
diff --git a/MediaBrowser.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs b/MediaBrowser.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs
index c536d0e83f..230a797756 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/Listings/SchedulesDirect.cs
@@ -132,6 +132,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
{
StreamReader innerReader = new StreamReader(innerResponse.Content);
responseString = innerReader.ReadToEnd();
+
var programDetails =
_jsonSerializer.DeserializeFromString>(
responseString);
@@ -142,10 +143,10 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
var schedules = dailySchedules.SelectMany(d => d.programs);
foreach (ScheduleDirect.Program schedule in schedules)
{
- _logger.Debug("Proccesing Schedule for statio ID " + stationID +
- " which corresponds to channel " + channelNumber + " and program id " +
- schedule.programID + " which says it has images? " +
- programDict[schedule.programID].hasImageArtwork);
+ //_logger.Debug("Proccesing Schedule for statio ID " + stationID +
+ // " which corresponds to channel " + channelNumber + " and program id " +
+ // schedule.programID + " which says it has images? " +
+ // programDict[schedule.programID].hasImageArtwork);
var imageIndex = images.FindIndex(i => i.programID == schedule.programID.Substring(0, 10));
if (imageIndex > -1)
@@ -244,7 +245,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
CultureInfo.InvariantCulture);
DateTime endAt = startAt.AddSeconds(programInfo.duration);
ProgramAudio audioType = ProgramAudio.Stereo;
- bool hdtv = false;
+
bool repeat = (programInfo.@new == null);
string newID = programInfo.programID + "T" + startAt.Ticks + "C" + channel;
@@ -268,43 +269,17 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
}
}
- if ((programInfo.videoProperties != null))
- {
- hdtv = programInfo.videoProperties.Exists(item => item == "hdtv");
- }
-
- string desc = "";
- if (details.descriptions != null)
- {
- if (details.descriptions.description1000 != null)
- {
- desc = details.descriptions.description1000[0].description;
- }
- else if (details.descriptions.description100 != null)
- {
- desc = details.descriptions.description100[0].description;
- }
- }
- ScheduleDirect.Gracenote gracenote;
string episodeTitle = null;
- if (details.metadata != null)
- {
- gracenote = details.metadata.Find(x => x.Gracenote != null).Gracenote;
- if ((details.showType ?? "No ShowType") == "Series")
- {
- episodeTitle = "Season: " + gracenote.season + " Episode: " + gracenote.episode;
- }
- }
if (details.episodeTitle150 != null)
{
- episodeTitle = ((episodeTitle ?? string.Empty) + " " + details.episodeTitle150).Trim();
+ episodeTitle = details.episodeTitle150;
}
- var imageLink = "";
+ string imageUrl = null;
if (details.hasImageArtwork)
{
- imageLink = details.images;
+ imageUrl = details.images;
}
var showType = details.showType ?? string.Empty;
@@ -313,7 +288,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
{
ChannelId = channel,
Id = newID,
- Overview = desc,
StartDate = startAt,
EndDate = endAt,
Name = details.titles[0].title120 ?? "Unkown",
@@ -321,23 +295,48 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
CommunityRating = null,
EpisodeTitle = episodeTitle,
Audio = audioType,
- IsHD = hdtv,
IsRepeat = repeat,
IsSeries = showType.IndexOf("series", StringComparison.OrdinalIgnoreCase) != -1,
- ImageUrl = imageLink,
+ ImageUrl = imageUrl,
HasImage = details.hasImageArtwork,
- IsNews = false,
- IsKids = false,
+ IsKids = string.Equals(details.audience, "children", StringComparison.OrdinalIgnoreCase),
IsSports = showType.IndexOf("sports", StringComparison.OrdinalIgnoreCase) != -1,
- IsLive = false,
IsMovie = showType.IndexOf("movie", StringComparison.OrdinalIgnoreCase) != -1 || showType.IndexOf("film", StringComparison.OrdinalIgnoreCase) != -1,
- IsPremiere = false,
ShowId = programInfo.programID
};
+ if (programInfo.videoProperties != null)
+ {
+ info.IsHD = programInfo.videoProperties.Contains("hdtv", StringComparer.OrdinalIgnoreCase);
+ }
+
+ if (details.contentRating != null && details.contentRating.Count > 0)
+ {
+ info.OfficialRating = details.contentRating[0].code.Replace("TV", "TV-").Replace("--", "-");
+ }
+
+ if (details.descriptions != null)
+ {
+ if (details.descriptions.description1000 != null)
+ {
+ info.Overview = details.descriptions.description1000[0].description;
+ }
+ else if (details.descriptions.description100 != null)
+ {
+ info.ShortOverview = details.descriptions.description100[0].description;
+ }
+ }
+
if (info.IsSeries)
{
info.SeriesId = programInfo.programID.Substring(0, 10);
+
+ if (details.metadata != null)
+ {
+ var gracenote = details.metadata.Find(x => x.Gracenote != null).Gracenote;
+ info.SeasonNumber = gracenote.season;
+ info.EpisodeNumber = gracenote.episode;
+ }
}
if (!string.IsNullOrWhiteSpace(details.originalAirDate))
@@ -349,8 +348,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
{
info.Genres = details.genres.Where(g => !string.IsNullOrWhiteSpace(g)).ToList();
info.IsNews = details.genres.Contains("news", StringComparer.OrdinalIgnoreCase);
- info.IsKids = false;
}
+
return info;
}
@@ -888,6 +887,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
public class ProgramDetails
{
+ public string audience { get; set; }
public string programID { get; set; }
public List titles { get; set; }
public EventDetails eventDetails { get; set; }
diff --git a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
index 4c44f5c3b5..26007f1451 100644
--- a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
+++ b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs
@@ -632,6 +632,9 @@ namespace MediaBrowser.Server.Implementations.LiveTv
item.ProductionYear = info.ProductionYear;
item.PremiereDate = item.PremiereDate ?? info.OriginalAirDate;
+ item.IndexNumber = info.EpisodeNumber;
+ item.ParentIndexNumber = info.SeasonNumber;
+
if (isNew)
{
await _libraryManager.CreateItem(item, cancellationToken).ConfigureAwait(false);
@@ -641,24 +644,11 @@ namespace MediaBrowser.Server.Implementations.LiveTv
await _libraryManager.UpdateItem(item, ItemUpdateType.MetadataImport, cancellationToken).ConfigureAwait(false);
}
- var maxStartDate = DateTime.UtcNow.AddDays(3);
-
- _providerManager.QueueRefresh(item.Id, new MetadataRefreshOptions
- {
- ImageRefreshMode = info.StartDate <= maxStartDate ? ImageRefreshMode.Default : ImageRefreshMode.ValidationOnly
- });
+ _providerManager.QueueRefresh(item.Id, new MetadataRefreshOptions());
return item;
}
- private void RefreshIfNeeded(LiveTvProgram program)
- {
- if (_refreshedPrograms.TryAdd(program.Id, program.Id))
- {
- _providerManager.QueueRefresh(program.Id, new MetadataRefreshOptions());
- }
- }
-
private async Task CreateRecordingRecord(RecordingInfo info, string serviceName, CancellationToken cancellationToken)
{
var isNew = false;
@@ -763,8 +753,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv
{
var program = GetInternalProgram(id);
- RefreshIfNeeded(program);
-
var dto = _dtoService.GetBaseItemDto(program, new DtoOptions(), user);
await AddRecordingInfo(new[] { dto }, cancellationToken).ConfigureAwait(false);
@@ -832,7 +820,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv
var returnArray = returnPrograms
.Select(i =>
{
- RefreshIfNeeded(i);
return _dtoService.GetBaseItemDto(i, options, user);
})
.ToArray();
@@ -907,11 +894,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv
var returnArray = programList.ToArray();
- foreach (var program in returnArray)
- {
- RefreshIfNeeded(program);
- }
-
var result = new QueryResult
{
Items = returnArray,