diff options
| -rw-r--r-- | MediaBrowser.Api/ApiService.cs | 2 | ||||
| -rw-r--r-- | MediaBrowser.Api/HttpHandlers/FavoriteStatusHandler.cs | 10 | ||||
| -rw-r--r-- | MediaBrowser.Api/HttpHandlers/PlayedStatusHandler.cs | 38 | ||||
| -rw-r--r-- | MediaBrowser.Api/HttpHandlers/UserItemRatingHandler.cs | 8 | ||||
| -rw-r--r-- | MediaBrowser.Api/MediaBrowser.Api.csproj | 1 | ||||
| -rw-r--r-- | MediaBrowser.ApiInteraction.Portable/ApiClient.cs | 13 | ||||
| -rw-r--r-- | MediaBrowser.ApiInteraction/BaseHttpApiClient.cs | 16 | ||||
| -rw-r--r-- | MediaBrowser.Model/Entities/BaseItem.cs | 31 | ||||
| -rw-r--r-- | MediaBrowser.Model/Entities/Folder.cs | 34 |
9 files changed, 130 insertions, 23 deletions
diff --git a/MediaBrowser.Api/ApiService.cs b/MediaBrowser.Api/ApiService.cs index 46303ddc4..06929de73 100644 --- a/MediaBrowser.Api/ApiService.cs +++ b/MediaBrowser.Api/ApiService.cs @@ -172,7 +172,7 @@ namespace MediaBrowser.Api dto.Type = item.GetType().Name;
dto.UserRating = item.UserRating;
- dto.UserData = GetDTOUserItemData(item.GetUserData(user));
+ dto.UserData = GetDTOUserItemData(item.GetUserData(user, false));
Folder folder = item as Folder;
diff --git a/MediaBrowser.Api/HttpHandlers/FavoriteStatusHandler.cs b/MediaBrowser.Api/HttpHandlers/FavoriteStatusHandler.cs index 851120230..1c640e89a 100644 --- a/MediaBrowser.Api/HttpHandlers/FavoriteStatusHandler.cs +++ b/MediaBrowser.Api/HttpHandlers/FavoriteStatusHandler.cs @@ -11,7 +11,7 @@ namespace MediaBrowser.Api.HttpHandlers /// Provides a handler to set user favorite status for an item
/// </summary>
[Export(typeof(BaseHandler))]
- public class FavoriteStatus : BaseSerializationHandler<DTOUserItemData>
+ public class FavoriteStatusHandler : BaseSerializationHandler<DTOUserItemData>
{
public override bool HandlesRequest(HttpListenerRequest request)
{
@@ -27,13 +27,7 @@ namespace MediaBrowser.Api.HttpHandlers User user = ApiService.GetUserById(QueryString["userid"], true);
// Get the user data for this item
- UserItemData data = item.GetUserData(user);
-
- if (data == null)
- {
- data = new UserItemData();
- item.AddUserData(user, data);
- }
+ UserItemData data = item.GetUserData(user, true);
// Set favorite status
data.IsFavorite = QueryString["isfavorite"] == "1";
diff --git a/MediaBrowser.Api/HttpHandlers/PlayedStatusHandler.cs b/MediaBrowser.Api/HttpHandlers/PlayedStatusHandler.cs new file mode 100644 index 000000000..ae32b23da --- /dev/null +++ b/MediaBrowser.Api/HttpHandlers/PlayedStatusHandler.cs @@ -0,0 +1,38 @@ +using MediaBrowser.Common.Net.Handlers;
+using MediaBrowser.Model.DTO;
+using MediaBrowser.Model.Entities;
+using System.ComponentModel.Composition;
+using System.Net;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Api.HttpHandlers
+{
+ /// <summary>
+ /// Provides a handler to set played status for an item
+ /// </summary>
+ [Export(typeof(BaseHandler))]
+ public class PlayedStatusHandler : BaseSerializationHandler<DTOUserItemData>
+ {
+ public override bool HandlesRequest(HttpListenerRequest request)
+ {
+ return ApiService.IsApiUrlMatch("PlayedStatus", request);
+ }
+
+ protected override Task<DTOUserItemData> GetObjectToSerialize()
+ {
+ // Get the item
+ BaseItem item = ApiService.GetItemById(QueryString["id"]);
+
+ // Get the user
+ User user = ApiService.GetUserById(QueryString["userid"], true);
+
+ bool wasPlayed = QueryString["played"] == "1";
+
+ item.SetPlayedStatus(user, wasPlayed);
+
+ UserItemData data = item.GetUserData(user, true);
+
+ return Task.FromResult<DTOUserItemData>(ApiService.GetDTOUserItemData(data));
+ }
+ }
+}
\ No newline at end of file diff --git a/MediaBrowser.Api/HttpHandlers/UserItemRatingHandler.cs b/MediaBrowser.Api/HttpHandlers/UserItemRatingHandler.cs index a83bb07f7..216bcac7f 100644 --- a/MediaBrowser.Api/HttpHandlers/UserItemRatingHandler.cs +++ b/MediaBrowser.Api/HttpHandlers/UserItemRatingHandler.cs @@ -27,13 +27,7 @@ namespace MediaBrowser.Api.HttpHandlers User user = ApiService.GetUserById(QueryString["userid"], true);
// Get the user data for this item
- UserItemData data = item.GetUserData(user);
-
- if (data == null)
- {
- data = new UserItemData();
- item.AddUserData(user, data);
- }
+ UserItemData data = item.GetUserData(user, true);
// If clearing the rating, set it to null
if (QueryString["clear"] == "1")
diff --git a/MediaBrowser.Api/MediaBrowser.Api.csproj b/MediaBrowser.Api/MediaBrowser.Api.csproj index 9c9e32359..858717e6e 100644 --- a/MediaBrowser.Api/MediaBrowser.Api.csproj +++ b/MediaBrowser.Api/MediaBrowser.Api.csproj @@ -62,6 +62,7 @@ <Compile Include="HttpHandlers\BaseMediaHandler.cs" />
<Compile Include="HttpHandlers\FavoriteStatusHandler.cs" />
<Compile Include="HttpHandlers\MovieSpecialFeaturesHandler.cs" />
+ <Compile Include="HttpHandlers\PlayedStatusHandler.cs" />
<Compile Include="HttpHandlers\UserHandler.cs" />
<Compile Include="HttpHandlers\GenreHandler.cs" />
<Compile Include="HttpHandlers\GenresHandler.cs" />
diff --git a/MediaBrowser.ApiInteraction.Portable/ApiClient.cs b/MediaBrowser.ApiInteraction.Portable/ApiClient.cs index a49c0f7cf..b41572cd3 100644 --- a/MediaBrowser.ApiInteraction.Portable/ApiClient.cs +++ b/MediaBrowser.ApiInteraction.Portable/ApiClient.cs @@ -411,6 +411,19 @@ namespace MediaBrowser.ApiInteraction.Portable }
/// <summary>
+ /// Updates played status for an item
+ /// </summary>
+ public void UpdatePlayedStatusAsync(Guid itemId, Guid userId, bool wasPlayed, Action<DTOUserItemData> callback)
+ {
+ string url = ApiUrl + "/PlayedStatus?id=" + itemId;
+
+ url += "&userid=" + userId;
+ url += "&played=" + (wasPlayed ? "1" : "0");
+
+ GetDataAsync(url, callback);
+ }
+
+ /// <summary>
/// Clears a user's rating for an item
/// </summary>
public void ClearUserItemRatingAsync(Guid itemId, Guid userId, Action<DTOUserItemData> callback)
diff --git a/MediaBrowser.ApiInteraction/BaseHttpApiClient.cs b/MediaBrowser.ApiInteraction/BaseHttpApiClient.cs index ca29f8ff4..0b87ef4cd 100644 --- a/MediaBrowser.ApiInteraction/BaseHttpApiClient.cs +++ b/MediaBrowser.ApiInteraction/BaseHttpApiClient.cs @@ -465,6 +465,22 @@ namespace MediaBrowser.ApiInteraction }
/// <summary>
+ /// Updates played status for an item
+ /// </summary>
+ public async Task<DTOUserItemData> UpdatePlayedStatusAsync(Guid itemId, Guid userId, bool wasPlayed)
+ {
+ string url = ApiUrl + "/PlayedStatus?id=" + itemId;
+
+ url += "&userid=" + userId;
+ url += "&played=" + (wasPlayed ? "1" : "0");
+
+ using (Stream stream = await GetSerializedStreamAsync(url).ConfigureAwait(false))
+ {
+ return DeserializeFromStream<DTOUserItemData>(stream);
+ }
+ }
+
+ /// <summary>
/// Updates a user's favorite status for an item and returns the updated UserItemData object.
/// </summary>
public async Task<DTOUserItemData> UpdateFavoriteStatusAsync(Guid itemId, Guid userId, bool isFavorite)
diff --git a/MediaBrowser.Model/Entities/BaseItem.cs b/MediaBrowser.Model/Entities/BaseItem.cs index 775120742..51cb34a53 100644 --- a/MediaBrowser.Model/Entities/BaseItem.cs +++ b/MediaBrowser.Model/Entities/BaseItem.cs @@ -72,17 +72,24 @@ namespace MediaBrowser.Model.Entities public Dictionary<Guid, UserItemData> UserData { get; set; }
- public UserItemData GetUserData(User user)
+ public UserItemData GetUserData(User user, bool createIfNull)
{
if (UserData == null || !UserData.ContainsKey(user.Id))
{
- return null;
+ if (createIfNull)
+ {
+ AddUserData(user, new UserItemData());
+ }
+ else
+ {
+ return null;
+ }
}
return UserData[user.Id];
}
- public void AddUserData(User user, UserItemData data)
+ private void AddUserData(User user, UserItemData data)
{
if (UserData == null)
{
@@ -143,5 +150,23 @@ namespace MediaBrowser.Model.Entities People[person.Name] = person;
}
+
+ /// <summary>
+ /// Marks the item as either played or unplayed
+ /// </summary>
+ public virtual void SetPlayedStatus(User user, bool wasPlayed)
+ {
+ UserItemData data = GetUserData(user, true);
+
+ if (wasPlayed)
+ {
+ data.PlayCount = Math.Max(data.PlayCount, 1);
+ }
+ else
+ {
+ data.PlayCount = 0;
+ data.PlaybackPositionTicks = 0;
+ }
+ }
}
}
diff --git a/MediaBrowser.Model/Entities/Folder.cs b/MediaBrowser.Model/Entities/Folder.cs index ec37107c3..ef0507138 100644 --- a/MediaBrowser.Model/Entities/Folder.cs +++ b/MediaBrowser.Model/Entities/Folder.cs @@ -103,7 +103,7 @@ namespace MediaBrowser.Model.Entities {
return GetParentalAllowedRecursiveChildren(user).Where(c =>
{
- UserItemData data = c.GetUserData(user);
+ UserItemData data = c.GetUserData(user, false);
if (data != null)
{
@@ -171,21 +171,30 @@ namespace MediaBrowser.Model.Entities return GetInProgressItems(GetParentalAllowedRecursiveChildren(user), user);
}
+ /// <summary>
+ /// Takes a list of items and returns the ones that are recently added
+ /// </summary>
private static IEnumerable<BaseItem> GetRecentlyAddedItems(IEnumerable<BaseItem> itemSet, User user)
{
return itemSet.Where(i => !(i.IsFolder) && i.IsRecentlyAdded(user));
}
+ /// <summary>
+ /// Takes a list of items and returns the ones that are recently added and unplayed
+ /// </summary>
private static IEnumerable<BaseItem> GetRecentlyAddedUnplayedItems(IEnumerable<BaseItem> itemSet, User user)
{
return GetRecentlyAddedItems(itemSet, user).Where(i =>
{
- var userdata = i.GetUserData(user);
+ var userdata = i.GetUserData(user, false);
return userdata == null || userdata.PlayCount == 0;
});
}
+ /// <summary>
+ /// Takes a list of items and returns the ones that are in progress
+ /// </summary>
private static IEnumerable<BaseItem> GetInProgressItems(IEnumerable<BaseItem> itemSet, User user)
{
return itemSet.Where(i =>
@@ -195,12 +204,15 @@ namespace MediaBrowser.Model.Entities return false;
}
- var userdata = i.GetUserData(user);
+ var userdata = i.GetUserData(user, false);
return userdata != null && userdata.PlaybackPositionTicks > 0;
});
}
+ /// <summary>
+ /// Gets the total played percentage for a set of items
+ /// </summary>
private static decimal GetPlayedPercentage(IEnumerable<BaseItem> itemSet, User user)
{
itemSet = itemSet.Where(i => !(i.IsFolder));
@@ -214,7 +226,7 @@ namespace MediaBrowser.Model.Entities foreach (BaseItem item in itemSet)
{
- UserItemData data = item.GetUserData(user);
+ UserItemData data = item.GetUserData(user, false);
if (data == null)
{
@@ -237,6 +249,20 @@ namespace MediaBrowser.Model.Entities }
/// <summary>
+ /// Marks the item as either played or unplayed
+ /// </summary>
+ public override void SetPlayedStatus(User user, bool wasPlayed)
+ {
+ base.SetPlayedStatus(user, wasPlayed);
+
+ // Now sweep through recursively and update status
+ foreach (BaseItem item in GetParentalAllowedChildren(user))
+ {
+ item.SetPlayedStatus(user, wasPlayed);
+ }
+ }
+
+ /// <summary>
/// Finds an item by ID, recursively
/// </summary>
public override BaseItem FindItemById(Guid id)
|
