aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Controller')
-rw-r--r--MediaBrowser.Controller/Entities/BaseItem.cs8
-rw-r--r--MediaBrowser.Controller/Entities/CollectionFolder.cs2
-rw-r--r--MediaBrowser.Controller/Entities/Folder.cs2
-rw-r--r--MediaBrowser.Controller/Providers/BaseItemXmlParser.cs8
-rw-r--r--MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs7
-rw-r--r--MediaBrowser.Controller/Providers/ImagesByNameProvider.cs3
-rw-r--r--MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs4
-rw-r--r--MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs50
-rw-r--r--MediaBrowser.Controller/Providers/TV/RemoteSeriesProvider.cs157
-rw-r--r--MediaBrowser.Controller/Providers/TV/SeriesXmlParser.cs11
-rw-r--r--MediaBrowser.Controller/Resolvers/ResolverPriority.cs3
-rw-r--r--MediaBrowser.Controller/Session/ISessionManager.cs2
12 files changed, 99 insertions, 158 deletions
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index a0dba1aab..1bc6b523e 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -647,6 +647,11 @@ namespace MediaBrowser.Controller.Entities
public long? RunTimeTicks { get; set; }
/// <summary>
+ /// Gets or sets the original run time ticks.
+ /// </summary>
+ /// <value>The original run time ticks.</value>
+ public long? OriginalRunTimeTicks { get; set; }
+ /// <summary>
/// Gets or sets the aspect ratio.
/// </summary>
/// <value>The aspect ratio.</value>
@@ -900,7 +905,6 @@ namespace MediaBrowser.Controller.Entities
if (changed || forceSave || themeSongsChanged || themeVideosChanged || localTrailersChanged)
{
cancellationToken.ThrowIfCancellationRequested();
-
await LibraryManager.UpdateItem(this, cancellationToken).ConfigureAwait(false);
}
@@ -1501,7 +1505,7 @@ namespace MediaBrowser.Controller.Entities
}
// Refresh metadata
- return RefreshMetadata(CancellationToken.None);
+ return RefreshMetadata(CancellationToken.None, forceSave: true);
}
}
}
diff --git a/MediaBrowser.Controller/Entities/CollectionFolder.cs b/MediaBrowser.Controller/Entities/CollectionFolder.cs
index 67692273d..70f3548f3 100644
--- a/MediaBrowser.Controller/Entities/CollectionFolder.cs
+++ b/MediaBrowser.Controller/Entities/CollectionFolder.cs
@@ -15,7 +15,7 @@ namespace MediaBrowser.Controller.Entities
/// Specialized Folder class that points to a subset of the physical folders in the system.
/// It is created from the user-specific folders within the system root
/// </summary>
- public class CollectionFolder : Folder, ICollectionFolder, IByReferenceItem
+ public class CollectionFolder : Folder, ICollectionFolder
{
/// <summary>
/// Gets a value indicating whether this instance is virtual folder.
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs
index 472cc115e..66a4ca215 100644
--- a/MediaBrowser.Controller/Entities/Folder.cs
+++ b/MediaBrowser.Controller/Entities/Folder.cs
@@ -760,7 +760,7 @@ namespace MediaBrowser.Controller.Entities
var child = currentTuple.Item1;
//refresh it
- await child.RefreshMetadata(cancellationToken, resetResolveArgs: child.IsFolder).ConfigureAwait(false);
+ await child.RefreshMetadata(cancellationToken, resetResolveArgs: child.IsFolder, forceSave: currentTuple.Item2).ConfigureAwait(false);
// Refresh children if a folder and the item changed or recursive is set to true
var refreshChildren = child.IsFolder && (currentTuple.Item2 || (recursive.HasValue && recursive.Value));
diff --git a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs
index 65ec6899f..60a2c19a7 100644
--- a/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs
+++ b/MediaBrowser.Controller/Providers/BaseItemXmlParser.cs
@@ -325,7 +325,7 @@ namespace MediaBrowser.Controller.Providers
if (!string.IsNullOrWhiteSpace(val))
{
- item.AddTrailerUrl(val);
+ //item.AddTrailerUrl(val);
}
break;
}
@@ -336,10 +336,10 @@ namespace MediaBrowser.Controller.Providers
if (!string.IsNullOrWhiteSpace(val))
{
- int ProductionYear;
- if (int.TryParse(val, out ProductionYear) && ProductionYear > 1850)
+ int productionYear;
+ if (int.TryParse(val, out productionYear) && productionYear > 1850)
{
- item.ProductionYear = ProductionYear;
+ item.ProductionYear = productionYear;
}
}
diff --git a/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs b/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs
index 3e8501dfa..6e14682dd 100644
--- a/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs
+++ b/MediaBrowser.Controller/Providers/ImageFromMediaLocationProvider.cs
@@ -91,12 +91,13 @@ namespace MediaBrowser.Controller.Providers
}
// Only validate paths from the same directory - need to copy to a list because we are going to potentially modify the collection below
- var deletedKeys = item.Images.Keys.Where(image =>
+ var deletedKeys = item.Images.ToList().Where(image =>
{
- var path = item.Images[image];
+ var path = image.Value;
return IsInMetaLocation(item, path) && item.ResolveArgs.GetMetaFileByPath(path) == null;
- }).ToList();
+
+ }).Select(i => i.Key).ToList();
// Now remove them from the dictionary
foreach (var key in deletedKeys)
diff --git a/MediaBrowser.Controller/Providers/ImagesByNameProvider.cs b/MediaBrowser.Controller/Providers/ImagesByNameProvider.cs
index 64a988378..3611607c9 100644
--- a/MediaBrowser.Controller/Providers/ImagesByNameProvider.cs
+++ b/MediaBrowser.Controller/Providers/ImagesByNameProvider.cs
@@ -126,7 +126,8 @@ namespace MediaBrowser.Controller.Providers
}
data.Data = ConfigurationManager.ApplicationPaths.ItemsByNamePath.GetMD5();
-
+ SetLastRefreshed(item, DateTime.UtcNow);
+
return result;
}
diff --git a/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs b/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs
index 307db023f..38d80883a 100644
--- a/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs
+++ b/MediaBrowser.Controller/Providers/Movies/MovieDbProvider.cs
@@ -973,8 +973,8 @@ namespace MediaBrowser.Controller.Providers.Movies
boxset.OfficialRating = firstChild != null ? firstChild.OfficialRating : null;
}
- //if (movie.RunTimeTicks == null && movieData.runtime > 0)
- // movie.RunTimeTicks = TimeSpan.FromMinutes(movieData.runtime).Ticks;
+ if (movieData.runtime > 0)
+ movie.OriginalRunTimeTicks = TimeSpan.FromMinutes(movieData.runtime).Ticks;
//studios
if (movieData.production_companies != null)
diff --git a/MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs b/MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs
index 2b4173ed9..b6852e9ba 100644
--- a/MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs
+++ b/MediaBrowser.Controller/Providers/TV/RemoteEpisodeProvider.cs
@@ -46,11 +46,11 @@ namespace MediaBrowser.Controller.Providers.TV
/// <summary>
/// The episode query
/// </summary>
- private const string episodeQuery = "http://www.thetvdb.com/api/{0}/series/{1}/default/{2}/{3}/{4}.xml";
+ private const string EpisodeQuery = "http://www.thetvdb.com/api/{0}/series/{1}/default/{2}/{3}/{4}.xml";
/// <summary>
/// The abs episode query
/// </summary>
- private const string absEpisodeQuery = "http://www.thetvdb.com/api/{0}/series/{1}/absolute/{2}/{3}.xml";
+ private const string AbsEpisodeQuery = "http://www.thetvdb.com/api/{0}/series/{1}/absolute/{2}/{3}.xml";
/// <summary>
/// Supportses the specified item.
@@ -179,25 +179,19 @@ namespace MediaBrowser.Controller.Providers.TV
seasonNumber = "0"; // Specials
}
- var url = string.Format(episodeQuery, TVUtils.TvdbApiKey, seriesId, seasonNumber, episodeNumber, ConfigurationManager.Configuration.PreferredMetadataLanguage);
+ var url = string.Format(EpisodeQuery, TVUtils.TvdbApiKey, seriesId, seasonNumber, episodeNumber, ConfigurationManager.Configuration.PreferredMetadataLanguage);
var doc = new XmlDocument();
- try
+ using (var result = await HttpClient.Get(new HttpRequestOptions
{
- using (var result = await HttpClient.Get(new HttpRequestOptions
- {
- Url = url,
- ResourcePool = RemoteSeriesProvider.Current.TvDbResourcePool,
- CancellationToken = cancellationToken,
- EnableResponseCache = true
+ Url = url,
+ ResourcePool = RemoteSeriesProvider.Current.TvDbResourcePool,
+ CancellationToken = cancellationToken,
+ EnableResponseCache = true
- }).ConfigureAwait(false))
- {
- doc.Load(result);
- }
- }
- catch (HttpException)
+ }).ConfigureAwait(false))
{
+ doc.Load(result);
}
//episode does not exist under this season, try absolute numbering.
@@ -205,25 +199,19 @@ namespace MediaBrowser.Controller.Providers.TV
//this is basicly just for anime.
if (!doc.HasChildNodes && Int32.Parse(seasonNumber) == 1)
{
- url = string.Format(absEpisodeQuery, TVUtils.TvdbApiKey, seriesId, episodeNumber, ConfigurationManager.Configuration.PreferredMetadataLanguage);
+ url = string.Format(AbsEpisodeQuery, TVUtils.TvdbApiKey, seriesId, episodeNumber, ConfigurationManager.Configuration.PreferredMetadataLanguage);
- try
+ using (var result = await HttpClient.Get(new HttpRequestOptions
{
- using (var result = await HttpClient.Get(new HttpRequestOptions
- {
- Url = url,
- ResourcePool = RemoteSeriesProvider.Current.TvDbResourcePool,
- CancellationToken = cancellationToken,
- EnableResponseCache = true
+ Url = url,
+ ResourcePool = RemoteSeriesProvider.Current.TvDbResourcePool,
+ CancellationToken = cancellationToken,
+ EnableResponseCache = true
- }).ConfigureAwait(false))
- {
- if (result != null) doc.Load(result);
- usingAbsoluteData = true;
- }
- }
- catch (HttpException)
+ }).ConfigureAwait(false))
{
+ if (result != null) doc.Load(result);
+ usingAbsoluteData = true;
}
}
diff --git a/MediaBrowser.Controller/Providers/TV/RemoteSeriesProvider.cs b/MediaBrowser.Controller/Providers/TV/RemoteSeriesProvider.cs
index eb689ed2f..39fe4f2c6 100644
--- a/MediaBrowser.Controller/Providers/TV/RemoteSeriesProvider.cs
+++ b/MediaBrowser.Controller/Providers/TV/RemoteSeriesProvider.cs
@@ -1,5 +1,4 @@
-using System.Globalization;
-using MediaBrowser.Common.Extensions;
+using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
@@ -11,6 +10,7 @@ using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Net;
using System;
using System.Collections.Generic;
+using System.Globalization;
using System.IO;
using System.Net;
using System.Text;
@@ -142,8 +142,7 @@ namespace MediaBrowser.Controller.Providers.TV
if (item.DontFetchMeta) return false;
- return !HasLocalMeta(item) && (ConfigurationManager.Configuration.MetadataRefreshDays != -1 &&
- DateTime.UtcNow.Subtract(downloadDate).TotalDays > ConfigurationManager.Configuration.MetadataRefreshDays);
+ return !HasLocalMeta(item) && base.NeedsRefreshInternal(item, providerInfo);
}
/// <summary>
@@ -164,16 +163,17 @@ namespace MediaBrowser.Controller.Providers.TV
var seriesId = Path.GetFileName(path).GetAttributeValue("tvdbid") ?? await GetSeriesId(series, cancellationToken);
cancellationToken.ThrowIfCancellationRequested();
-
+
+ var status = ProviderRefreshStatus.Success;
+
if (!string.IsNullOrEmpty(seriesId))
{
series.SetProviderId(MetadataProviders.Tvdb, seriesId);
- if (!HasCompleteMetadata(series))
- {
- await FetchSeriesData(series, seriesId, cancellationToken).ConfigureAwait(false);
- }
+
+ status = await FetchSeriesData(series, seriesId, cancellationToken).ConfigureAwait(false);
}
- SetLastRefreshed(item, DateTime.UtcNow);
+
+ SetLastRefreshed(item, DateTime.UtcNow, status);
return true;
}
Logger.Info("Series provider not fetching because local meta exists or requested to ignore: " + item.Name);
@@ -188,11 +188,9 @@ namespace MediaBrowser.Controller.Providers.TV
/// <param name="seriesId">The series id.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task{System.Boolean}.</returns>
- private async Task<bool> FetchSeriesData(Series series, string seriesId, CancellationToken cancellationToken)
+ private async Task<ProviderRefreshStatus> FetchSeriesData(Series series, string seriesId, CancellationToken cancellationToken)
{
- var success = false;
-
- var name = series.Name;
+ var status = ProviderRefreshStatus.Success;
if (!string.IsNullOrEmpty(seriesId))
{
@@ -200,22 +198,16 @@ namespace MediaBrowser.Controller.Providers.TV
string url = string.Format(seriesGet, TVUtils.TvdbApiKey, seriesId, ConfigurationManager.Configuration.PreferredMetadataLanguage);
var doc = new XmlDocument();
- try
+ using (var xml = await HttpClient.Get(new HttpRequestOptions
{
- using (var xml = await HttpClient.Get(new HttpRequestOptions
- {
- Url = url,
- ResourcePool = TvDbResourcePool,
- CancellationToken = cancellationToken,
- EnableResponseCache = true
+ Url = url,
+ ResourcePool = TvDbResourcePool,
+ CancellationToken = cancellationToken,
+ EnableResponseCache = true
- }).ConfigureAwait(false))
- {
- doc.Load(xml);
- }
- }
- catch (HttpException)
+ }).ConfigureAwait(false))
{
+ doc.Load(xml);
}
if (doc.HasChildNodes)
@@ -224,8 +216,6 @@ namespace MediaBrowser.Controller.Providers.TV
var actorTask = FetchActors(series, seriesId, doc, cancellationToken);
var imageTask = FetchImages(series, seriesId, cancellationToken);
- success = true;
-
series.Name = doc.SafeGetString("//SeriesName");
series.Overview = doc.SafeGetString("//Overview");
series.CommunityRating = doc.SafeGetSingle("//Rating", 0, 10);
@@ -268,8 +258,15 @@ namespace MediaBrowser.Controller.Providers.TV
}
}
- //wait for other tasks
- await Task.WhenAll(actorTask, imageTask).ConfigureAwait(false);
+ try
+ {
+ //wait for other tasks
+ await Task.WhenAll(actorTask, imageTask).ConfigureAwait(false);
+ }
+ catch (HttpException)
+ {
+ status = ProviderRefreshStatus.CompletedWithErrors;
+ }
if (ConfigurationManager.Configuration.SaveLocalMeta)
{
@@ -281,9 +278,7 @@ namespace MediaBrowser.Controller.Providers.TV
}
}
-
-
- return success;
+ return status;
}
/// <summary>
@@ -299,22 +294,16 @@ namespace MediaBrowser.Controller.Providers.TV
string urlActors = string.Format(getActors, TVUtils.TvdbApiKey, seriesId);
var docActors = new XmlDocument();
- try
+ using (var actors = await HttpClient.Get(new HttpRequestOptions
{
- using (var actors = await HttpClient.Get(new HttpRequestOptions
- {
- Url = urlActors,
- ResourcePool = TvDbResourcePool,
- CancellationToken = cancellationToken,
- EnableResponseCache = true
+ Url = urlActors,
+ ResourcePool = TvDbResourcePool,
+ CancellationToken = cancellationToken,
+ EnableResponseCache = true
- }).ConfigureAwait(false))
- {
- docActors.Load(actors);
- }
- }
- catch (HttpException)
+ }).ConfigureAwait(false))
{
+ docActors.Load(actors);
}
if (docActors.HasChildNodes)
@@ -380,22 +369,16 @@ namespace MediaBrowser.Controller.Providers.TV
string url = string.Format("http://www.thetvdb.com/api/" + TVUtils.TvdbApiKey + "/series/{0}/banners.xml", seriesId);
var images = new XmlDocument();
- try
+ using (var imgs = await HttpClient.Get(new HttpRequestOptions
{
- using (var imgs = await HttpClient.Get(new HttpRequestOptions
- {
- Url = url,
- ResourcePool = TvDbResourcePool,
- CancellationToken = cancellationToken,
- EnableResponseCache = true
+ Url = url,
+ ResourcePool = TvDbResourcePool,
+ CancellationToken = cancellationToken,
+ EnableResponseCache = true
- }).ConfigureAwait(false))
- {
- images.Load(imgs);
- }
- }
- catch (HttpException)
+ }).ConfigureAwait(false))
{
+ images.Load(imgs);
}
if (images.HasChildNodes)
@@ -408,17 +391,7 @@ namespace MediaBrowser.Controller.Providers.TV
n = n.SelectSingleNode("./BannerPath");
if (n != null)
{
- try
- {
- series.PrimaryImagePath = await _providerManager.DownloadAndSaveImage(series, TVUtils.BannerUrl + n.InnerText, "folder" + Path.GetExtension(n.InnerText), ConfigurationManager.Configuration.SaveLocalMeta, TvDbResourcePool, cancellationToken).ConfigureAwait(false);
- }
- catch (HttpException)
- {
- }
- catch (IOException)
- {
-
- }
+ series.PrimaryImagePath = await _providerManager.DownloadAndSaveImage(series, TVUtils.BannerUrl + n.InnerText, "folder" + Path.GetExtension(n.InnerText), ConfigurationManager.Configuration.SaveLocalMeta, TvDbResourcePool, cancellationToken).ConfigureAwait(false);
}
}
}
@@ -431,19 +404,9 @@ namespace MediaBrowser.Controller.Providers.TV
n = n.SelectSingleNode("./BannerPath");
if (n != null)
{
- try
- {
- var bannerImagePath = await _providerManager.DownloadAndSaveImage(series, TVUtils.BannerUrl + n.InnerText, "banner" + Path.GetExtension(n.InnerText), ConfigurationManager.Configuration.SaveLocalMeta, TvDbResourcePool, cancellationToken);
-
- series.SetImage(ImageType.Banner, bannerImagePath);
- }
- catch (HttpException)
- {
- }
- catch (IOException)
- {
+ var bannerImagePath = await _providerManager.DownloadAndSaveImage(series, TVUtils.BannerUrl + n.InnerText, "banner" + Path.GetExtension(n.InnerText), ConfigurationManager.Configuration.SaveLocalMeta, TvDbResourcePool, cancellationToken);
- }
+ series.SetImage(ImageType.Banner, bannerImagePath);
}
}
}
@@ -460,17 +423,7 @@ namespace MediaBrowser.Controller.Providers.TV
var bdName = "backdrop" + (bdNo > 0 ? bdNo.ToString(UsCulture) : "");
if (ConfigurationManager.Configuration.RefreshItemImages || !series.HasLocalImage(bdName))
{
- try
- {
- series.BackdropImagePaths.Add(await _providerManager.DownloadAndSaveImage(series, TVUtils.BannerUrl + p.InnerText, bdName + Path.GetExtension(p.InnerText), ConfigurationManager.Configuration.SaveLocalMeta, TvDbResourcePool, cancellationToken).ConfigureAwait(false));
- }
- catch (HttpException)
- {
- }
- catch (IOException)
- {
-
- }
+ series.BackdropImagePaths.Add(await _providerManager.DownloadAndSaveImage(series, TVUtils.BannerUrl + p.InnerText, bdName + Path.GetExtension(p.InnerText), ConfigurationManager.Configuration.SaveLocalMeta, TvDbResourcePool, cancellationToken).ConfigureAwait(false));
}
bdNo++;
if (bdNo >= ConfigurationManager.Configuration.MaxBackdrops) break;
@@ -481,27 +434,13 @@ namespace MediaBrowser.Controller.Providers.TV
}
/// <summary>
- /// Determines whether [has complete metadata] [the specified series].
- /// </summary>
- /// <param name="series">The series.</param>
- /// <returns><c>true</c> if [has complete metadata] [the specified series]; otherwise, <c>false</c>.</returns>
- private bool HasCompleteMetadata(Series series)
- {
- return (series.HasImage(ImageType.Banner)) && (series.CommunityRating != null)
- && (series.Overview != null) && (series.Name != null) && (series.People != null)
- && (series.Genres != null) && (series.OfficialRating != null);
- }
-
- /// <summary>
/// Determines whether [has local meta] [the specified item].
/// </summary>
/// <param name="item">The item.</param>
/// <returns><c>true</c> if [has local meta] [the specified item]; otherwise, <c>false</c>.</returns>
private bool HasLocalMeta(BaseItem item)
{
- //need at least the xml and folder.jpg/png
- return item.ResolveArgs.ContainsMetaFileByName(LOCAL_META_FILE_NAME) && (item.ResolveArgs.ContainsMetaFileByName("folder.jpg") ||
- item.ResolveArgs.ContainsMetaFileByName("folder.png"));
+ return item.ResolveArgs.ContainsMetaFileByName(LOCAL_META_FILE_NAME);
}
/// <summary>
diff --git a/MediaBrowser.Controller/Providers/TV/SeriesXmlParser.cs b/MediaBrowser.Controller/Providers/TV/SeriesXmlParser.cs
index f63a47627..c03e2a7f5 100644
--- a/MediaBrowser.Controller/Providers/TV/SeriesXmlParser.cs
+++ b/MediaBrowser.Controller/Providers/TV/SeriesXmlParser.cs
@@ -63,8 +63,15 @@ namespace MediaBrowser.Controller.Providers.TV
}
case "Airs_Time":
- item.AirTime = reader.ReadElementContentAsString();
- break;
+ {
+ var val = reader.ReadElementContentAsString();
+
+ if (!string.IsNullOrWhiteSpace(val))
+ {
+ item.AirTime = val;
+ }
+ break;
+ }
case "SeriesName":
item.Name = reader.ReadElementContentAsString();
diff --git a/MediaBrowser.Controller/Resolvers/ResolverPriority.cs b/MediaBrowser.Controller/Resolvers/ResolverPriority.cs
index 63a107fda..df5edeb05 100644
--- a/MediaBrowser.Controller/Resolvers/ResolverPriority.cs
+++ b/MediaBrowser.Controller/Resolvers/ResolverPriority.cs
@@ -18,9 +18,10 @@ namespace MediaBrowser.Controller.Resolvers
/// The third
/// </summary>
Third = 3,
+ Fourth = 4,
/// <summary>
/// The last
/// </summary>
- Last = 4
+ Last = 5
}
}
diff --git a/MediaBrowser.Controller/Session/ISessionManager.cs b/MediaBrowser.Controller/Session/ISessionManager.cs
index 8227170d4..f28721f5f 100644
--- a/MediaBrowser.Controller/Session/ISessionManager.cs
+++ b/MediaBrowser.Controller/Session/ISessionManager.cs
@@ -52,7 +52,7 @@ namespace MediaBrowser.Controller.Session
/// <param name="deviceId">The device id.</param>
/// <param name="deviceName">Name of the device.</param>
/// <exception cref="System.ArgumentNullException"></exception>
- void OnPlaybackStart(User user, BaseItem item, string clientType, string deviceId, string deviceName);
+ Task OnPlaybackStart(User user, BaseItem item, string clientType, string deviceId, string deviceName);
/// <summary>
/// Used to report playback progress for an item