瀏覽代碼

Added api methods to mark an item as played or unplayed

LukePulverenti Luke Pulverenti luke pulverenti 12 年之前
父節點
當前提交
614668a447

+ 1 - 1
MediaBrowser.Api/ApiService.cs

@@ -172,7 +172,7 @@ namespace MediaBrowser.Api
             dto.Type = item.GetType().Name;
             dto.Type = item.GetType().Name;
             dto.UserRating = item.UserRating;
             dto.UserRating = item.UserRating;
 
 
-            dto.UserData = GetDTOUserItemData(item.GetUserData(user));
+            dto.UserData = GetDTOUserItemData(item.GetUserData(user, false));
 
 
             Folder folder = item as Folder;
             Folder folder = item as Folder;
 
 

+ 2 - 8
MediaBrowser.Api/HttpHandlers/FavoriteStatusHandler.cs

@@ -11,7 +11,7 @@ namespace MediaBrowser.Api.HttpHandlers
     /// Provides a handler to set user favorite status for an item
     /// Provides a handler to set user favorite status for an item
     /// </summary>
     /// </summary>
     [Export(typeof(BaseHandler))]
     [Export(typeof(BaseHandler))]
-    public class FavoriteStatus : BaseSerializationHandler<DTOUserItemData>
+    public class FavoriteStatusHandler : BaseSerializationHandler<DTOUserItemData>
     {
     {
         public override bool HandlesRequest(HttpListenerRequest request)
         public override bool HandlesRequest(HttpListenerRequest request)
         {
         {
@@ -27,13 +27,7 @@ namespace MediaBrowser.Api.HttpHandlers
             User user = ApiService.GetUserById(QueryString["userid"], true);
             User user = ApiService.GetUserById(QueryString["userid"], true);
 
 
             // Get the user data for this item
             // 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
             // Set favorite status
             data.IsFavorite = QueryString["isfavorite"] == "1";
             data.IsFavorite = QueryString["isfavorite"] == "1";

+ 38 - 0
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));
+        }
+    }
+}

+ 1 - 7
MediaBrowser.Api/HttpHandlers/UserItemRatingHandler.cs

@@ -27,13 +27,7 @@ namespace MediaBrowser.Api.HttpHandlers
             User user = ApiService.GetUserById(QueryString["userid"], true);
             User user = ApiService.GetUserById(QueryString["userid"], true);
 
 
             // Get the user data for this item
             // 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 clearing the rating, set it to null
             if (QueryString["clear"] == "1")
             if (QueryString["clear"] == "1")

+ 1 - 0
MediaBrowser.Api/MediaBrowser.Api.csproj

@@ -62,6 +62,7 @@
     <Compile Include="HttpHandlers\BaseMediaHandler.cs" />
     <Compile Include="HttpHandlers\BaseMediaHandler.cs" />
     <Compile Include="HttpHandlers\FavoriteStatusHandler.cs" />
     <Compile Include="HttpHandlers\FavoriteStatusHandler.cs" />
     <Compile Include="HttpHandlers\MovieSpecialFeaturesHandler.cs" />
     <Compile Include="HttpHandlers\MovieSpecialFeaturesHandler.cs" />
+    <Compile Include="HttpHandlers\PlayedStatusHandler.cs" />
     <Compile Include="HttpHandlers\UserHandler.cs" />
     <Compile Include="HttpHandlers\UserHandler.cs" />
     <Compile Include="HttpHandlers\GenreHandler.cs" />
     <Compile Include="HttpHandlers\GenreHandler.cs" />
     <Compile Include="HttpHandlers\GenresHandler.cs" />
     <Compile Include="HttpHandlers\GenresHandler.cs" />

+ 13 - 0
MediaBrowser.ApiInteraction.Portable/ApiClient.cs

@@ -410,6 +410,19 @@ namespace MediaBrowser.ApiInteraction.Portable
             GetDataAsync(url, callback);
             GetDataAsync(url, callback);
         }
         }
 
 
+        /// <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>
         /// <summary>
         /// Clears a user's rating for an item
         /// Clears a user's rating for an item
         /// </summary>
         /// </summary>

+ 16 - 0
MediaBrowser.ApiInteraction/BaseHttpApiClient.cs

@@ -464,6 +464,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>
         /// <summary>
         /// Updates a user's favorite status for an item and returns the updated UserItemData object.
         /// Updates a user's favorite status for an item and returns the updated UserItemData object.
         /// </summary>
         /// </summary>

+ 28 - 3
MediaBrowser.Model/Entities/BaseItem.cs

@@ -72,17 +72,24 @@ namespace MediaBrowser.Model.Entities
 
 
         public Dictionary<Guid, UserItemData> UserData { get; set; }
         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))
             if (UserData == null || !UserData.ContainsKey(user.Id))
             {
             {
-                return null;
+                if (createIfNull)
+                {
+                    AddUserData(user, new UserItemData());
+                }
+                else
+                {
+                    return null;
+                }
             }
             }
 
 
             return UserData[user.Id];
             return UserData[user.Id];
         }
         }
 
 
-        public void AddUserData(User user, UserItemData data)
+        private void AddUserData(User user, UserItemData data)
         {
         {
             if (UserData == null)
             if (UserData == null)
             {
             {
@@ -143,5 +150,23 @@ namespace MediaBrowser.Model.Entities
 
 
             People[person.Name] = person;
             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;
+            }
+        }
     }
     }
 }
 }

+ 30 - 4
MediaBrowser.Model/Entities/Folder.cs

@@ -103,7 +103,7 @@ namespace MediaBrowser.Model.Entities
         {
         {
             return GetParentalAllowedRecursiveChildren(user).Where(c =>
             return GetParentalAllowedRecursiveChildren(user).Where(c =>
             {
             {
-                UserItemData data = c.GetUserData(user);
+                UserItemData data = c.GetUserData(user, false);
 
 
                 if (data != null)
                 if (data != null)
                 {
                 {
@@ -171,21 +171,30 @@ namespace MediaBrowser.Model.Entities
             return GetInProgressItems(GetParentalAllowedRecursiveChildren(user), user);
             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)
         private static IEnumerable<BaseItem> GetRecentlyAddedItems(IEnumerable<BaseItem> itemSet, User user)
         {
         {
             return itemSet.Where(i => !(i.IsFolder) && i.IsRecentlyAdded(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)
         private static IEnumerable<BaseItem> GetRecentlyAddedUnplayedItems(IEnumerable<BaseItem> itemSet, User user)
         {
         {
             return GetRecentlyAddedItems(itemSet, user).Where(i =>
             return GetRecentlyAddedItems(itemSet, user).Where(i =>
             {
             {
-                var userdata = i.GetUserData(user);
+                var userdata = i.GetUserData(user, false);
 
 
                 return userdata == null || userdata.PlayCount == 0;
                 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)
         private static IEnumerable<BaseItem> GetInProgressItems(IEnumerable<BaseItem> itemSet, User user)
         {
         {
             return itemSet.Where(i =>
             return itemSet.Where(i =>
@@ -195,12 +204,15 @@ namespace MediaBrowser.Model.Entities
                     return false;
                     return false;
                 }
                 }
 
 
-                var userdata = i.GetUserData(user);
+                var userdata = i.GetUserData(user, false);
 
 
                 return userdata != null && userdata.PlaybackPositionTicks > 0;
                 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)
         private static decimal GetPlayedPercentage(IEnumerable<BaseItem> itemSet, User user)
         {
         {
             itemSet = itemSet.Where(i => !(i.IsFolder));
             itemSet = itemSet.Where(i => !(i.IsFolder));
@@ -214,7 +226,7 @@ namespace MediaBrowser.Model.Entities
 
 
             foreach (BaseItem item in itemSet)
             foreach (BaseItem item in itemSet)
             {
             {
-                UserItemData data = item.GetUserData(user);
+                UserItemData data = item.GetUserData(user, false);
 
 
                 if (data == null)
                 if (data == null)
                 {
                 {
@@ -236,6 +248,20 @@ namespace MediaBrowser.Model.Entities
             return totalPercent / itemSet.Count();
             return totalPercent / itemSet.Count();
         }
         }
 
 
+        /// <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>
         /// <summary>
         /// Finds an item by ID, recursively
         /// Finds an item by ID, recursively
         /// </summary>
         /// </summary>