Browse Source

update storage of genres, studios, tags, & keywords

Luke Pulverenti 9 years ago
parent
commit
977f62336b

+ 1 - 5
MediaBrowser.Api/ItemUpdateService.cs

@@ -298,11 +298,7 @@ namespace MediaBrowser.Api
                 hasShortOverview.ShortOverview = request.ShortOverview;
                 hasShortOverview.ShortOverview = request.ShortOverview;
             }
             }
 
 
-            var hasKeywords = item as IHasKeywords;
-            if (hasKeywords != null)
-            {
-                hasKeywords.Keywords = request.Keywords;
-            }
+            item.Keywords = request.Keywords;
 
 
             if (request.Studios != null)
             if (request.Studios != null)
             {
             {

+ 1 - 7
MediaBrowser.Api/SimilarItemsHelper.cs

@@ -127,13 +127,7 @@ namespace MediaBrowser.Api
 
 
         private static IEnumerable<string> GetKeywords(BaseItem item)
         private static IEnumerable<string> GetKeywords(BaseItem item)
         {
         {
-            var hasTags = item as IHasKeywords;
-            if (hasTags != null)
-            {
-                return hasTags.Keywords;
-            }
-
-            return new List<string>();
+            return item.Keywords;
         }
         }
 
 
         /// <summary>
         /// <summary>

+ 3 - 0
MediaBrowser.Controller/Entities/BaseItem.cs

@@ -37,6 +37,7 @@ namespace MediaBrowser.Controller.Entities
     {
     {
         protected BaseItem()
         protected BaseItem()
         {
         {
+            Keywords = new List<string>();
             Tags = new List<string>();
             Tags = new List<string>();
             Genres = new List<string>();
             Genres = new List<string>();
             Studios = new List<string>();
             Studios = new List<string>();
@@ -811,6 +812,8 @@ namespace MediaBrowser.Controller.Entities
         [IgnoreDataMember]
         [IgnoreDataMember]
         public List<string> Tags { get; set; }
         public List<string> Tags { get; set; }
 
 
+        public List<string> Keywords { get; set; }
+
         /// <summary>
         /// <summary>
         /// Gets or sets the home page URL.
         /// Gets or sets the home page URL.
         /// </summary>
         /// </summary>

+ 2 - 0
MediaBrowser.Controller/Entities/InternalItemsQuery.cs

@@ -33,6 +33,7 @@ namespace MediaBrowser.Controller.Entities
         public string[] ExcludeTags { get; set; }
         public string[] ExcludeTags { get; set; }
         public string[] ExcludeInheritedTags { get; set; }
         public string[] ExcludeInheritedTags { get; set; }
         public string[] Genres { get; set; }
         public string[] Genres { get; set; }
+        public string[] Keywords { get; set; }
 
 
         public bool? IsMissing { get; set; }
         public bool? IsMissing { get; set; }
         public bool? IsUnaired { get; set; }
         public bool? IsUnaired { get; set; }
@@ -151,6 +152,7 @@ namespace MediaBrowser.Controller.Entities
             OfficialRatings = new string[] { };
             OfficialRatings = new string[] { };
             SortBy = new string[] { };
             SortBy = new string[] { };
             MediaTypes = new string[] { };
             MediaTypes = new string[] { };
+            Keywords = new string[] { };
             IncludeItemTypes = new string[] { };
             IncludeItemTypes = new string[] { };
             ExcludeItemTypes = new string[] { };
             ExcludeItemTypes = new string[] { };
             Genres = new string[] { };
             Genres = new string[] { };

+ 1 - 11
MediaBrowser.Controller/Entities/IHasKeywords.cs → MediaBrowser.Controller/Entities/KeywordExtensions.cs

@@ -1,21 +1,11 @@
 using System;
 using System;
-using System.Collections.Generic;
 using System.Linq;
 using System.Linq;
 
 
 namespace MediaBrowser.Controller.Entities
 namespace MediaBrowser.Controller.Entities
 {
 {
-    public interface IHasKeywords
-    {
-        /// <summary>
-        /// Gets or sets the keywords.
-        /// </summary>
-        /// <value>The keywords.</value>
-        List<string> Keywords { get; set; }
-    }
-
     public static class KeywordExtensions
     public static class KeywordExtensions
     {
     {
-        public static void AddKeyword(this IHasKeywords item, string name)
+        public static void AddKeyword(this BaseItem item, string name)
         {
         {
             if (string.IsNullOrWhiteSpace(name))
             if (string.IsNullOrWhiteSpace(name))
             {
             {

+ 1 - 8
MediaBrowser.Controller/Entities/Movies/BoxSet.cs

@@ -15,7 +15,7 @@ namespace MediaBrowser.Controller.Entities.Movies
     /// <summary>
     /// <summary>
     /// Class BoxSet
     /// Class BoxSet
     /// </summary>
     /// </summary>
-    public class BoxSet : Folder, IHasTrailers, IHasKeywords, IHasDisplayOrder, IHasLookupInfo<BoxSetInfo>, IHasShares
+    public class BoxSet : Folder, IHasTrailers, IHasDisplayOrder, IHasLookupInfo<BoxSetInfo>, IHasShares
     {
     {
         public List<Share> Shares { get; set; }
         public List<Share> Shares { get; set; }
 
 
@@ -26,7 +26,6 @@ namespace MediaBrowser.Controller.Entities.Movies
             RemoteTrailerIds = new List<Guid>();
             RemoteTrailerIds = new List<Guid>();
 
 
             DisplayOrder = ItemSortBy.PremiereDate;
             DisplayOrder = ItemSortBy.PremiereDate;
-            Keywords = new List<string>();
             Shares = new List<Share>();
             Shares = new List<Share>();
         }
         }
 
 
@@ -47,12 +46,6 @@ namespace MediaBrowser.Controller.Entities.Movies
         /// <value>The remote trailers.</value>
         /// <value>The remote trailers.</value>
         public List<MediaUrl> RemoteTrailers { get; set; }
         public List<MediaUrl> RemoteTrailers { get; set; }
 
 
-        /// <summary>
-        /// Gets or sets the tags.
-        /// </summary>
-        /// <value>The tags.</value>
-        public List<string> Keywords { get; set; }
-
         /// <summary>
         /// <summary>
         /// Gets or sets the display order.
         /// Gets or sets the display order.
         /// </summary>
         /// </summary>

+ 1 - 3
MediaBrowser.Controller/Entities/Movies/Movie.cs

@@ -15,7 +15,7 @@ namespace MediaBrowser.Controller.Entities.Movies
     /// <summary>
     /// <summary>
     /// Class Movie
     /// Class Movie
     /// </summary>
     /// </summary>
-    public class Movie : Video, IHasCriticRating, IHasSpecialFeatures, IHasProductionLocations, IHasBudget, IHasKeywords, IHasTrailers, IHasThemeMedia, IHasTaglines, IHasAwards, IHasMetascore, IHasLookupInfo<MovieInfo>, ISupportsBoxSetGrouping, IHasOriginalTitle
+    public class Movie : Video, IHasCriticRating, IHasSpecialFeatures, IHasProductionLocations, IHasBudget, IHasTrailers, IHasThemeMedia, IHasTaglines, IHasAwards, IHasMetascore, IHasLookupInfo<MovieInfo>, ISupportsBoxSetGrouping, IHasOriginalTitle
     {
     {
         public List<Guid> SpecialFeatureIds { get; set; }
         public List<Guid> SpecialFeatureIds { get; set; }
 
 
@@ -32,7 +32,6 @@ namespace MediaBrowser.Controller.Entities.Movies
             ThemeSongIds = new List<Guid>();
             ThemeSongIds = new List<Guid>();
             ThemeVideoIds = new List<Guid>();
             ThemeVideoIds = new List<Guid>();
             Taglines = new List<string>();
             Taglines = new List<string>();
-            Keywords = new List<string>();
             ProductionLocations = new List<string>();
             ProductionLocations = new List<string>();
         }
         }
 
 
@@ -42,7 +41,6 @@ namespace MediaBrowser.Controller.Entities.Movies
 
 
         public List<Guid> LocalTrailerIds { get; set; }
         public List<Guid> LocalTrailerIds { get; set; }
         public List<Guid> RemoteTrailerIds { get; set; }
         public List<Guid> RemoteTrailerIds { get; set; }
-        public List<string> Keywords { get; set; }
 
 
         public List<MediaUrl> RemoteTrailers { get; set; }
         public List<MediaUrl> RemoteTrailers { get; set; }
 
 

+ 1 - 3
MediaBrowser.Controller/Entities/Trailer.cs

@@ -12,7 +12,7 @@ namespace MediaBrowser.Controller.Entities
     /// <summary>
     /// <summary>
     /// Class Trailer
     /// Class Trailer
     /// </summary>
     /// </summary>
-    public class Trailer : Video, IHasCriticRating, IHasProductionLocations, IHasBudget, IHasKeywords, IHasTaglines, IHasMetascore, IHasOriginalTitle, IHasLookupInfo<TrailerInfo>
+    public class Trailer : Video, IHasCriticRating, IHasProductionLocations, IHasBudget, IHasTaglines, IHasMetascore, IHasOriginalTitle, IHasLookupInfo<TrailerInfo>
     {
     {
         public List<string> ProductionLocations { get; set; }
         public List<string> ProductionLocations { get; set; }
 
 
@@ -31,8 +31,6 @@ namespace MediaBrowser.Controller.Entities
 
 
         public List<MediaUrl> RemoteTrailers { get; set; }
         public List<MediaUrl> RemoteTrailers { get; set; }
 
 
-        public List<string> Keywords { get; set; }
-
         [IgnoreDataMember]
         [IgnoreDataMember]
         public bool IsLocalTrailer
         public bool IsLocalTrailer
         {
         {

+ 1 - 1
MediaBrowser.Controller/MediaBrowser.Controller.csproj

@@ -142,7 +142,7 @@
     <Compile Include="Entities\IHasDisplayOrder.cs" />
     <Compile Include="Entities\IHasDisplayOrder.cs" />
     <Compile Include="Entities\IHasId.cs" />
     <Compile Include="Entities\IHasId.cs" />
     <Compile Include="Entities\IHasImages.cs" />
     <Compile Include="Entities\IHasImages.cs" />
-    <Compile Include="Entities\IHasKeywords.cs" />
+    <Compile Include="Entities\KeywordExtensions.cs" />
     <Compile Include="Entities\IHasMediaSources.cs" />
     <Compile Include="Entities\IHasMediaSources.cs" />
     <Compile Include="Entities\IHasMetascore.cs" />
     <Compile Include="Entities\IHasMetascore.cs" />
     <Compile Include="Entities\IHasOriginalTitle.cs" />
     <Compile Include="Entities\IHasOriginalTitle.cs" />

+ 2 - 6
MediaBrowser.Controller/Providers/BaseItemXmlParser.cs

@@ -816,11 +816,7 @@ namespace MediaBrowser.Controller.Providers
                     {
                     {
                         using (var subtree = reader.ReadSubtree())
                         using (var subtree = reader.ReadSubtree())
                         {
                         {
-                            var hasTags = item as IHasKeywords;
-                            if (hasTags != null)
-                            {
-                                FetchFromKeywordsNode(subtree, hasTags);
-                            }
+                            FetchFromKeywordsNode(subtree, item);
                         }
                         }
                         break;
                         break;
                     }
                     }
@@ -1099,7 +1095,7 @@ namespace MediaBrowser.Controller.Providers
             }
             }
         }
         }
 
 
-        private void FetchFromKeywordsNode(XmlReader reader, IHasKeywords item)
+        private void FetchFromKeywordsNode(XmlReader reader, BaseItem item)
         {
         {
             reader.MoveToContent();
             reader.MoveToContent();
 
 

+ 7 - 11
MediaBrowser.LocalMetadata/Savers/XmlSaverHelpers.cs

@@ -609,20 +609,16 @@ namespace MediaBrowser.LocalMetadata.Savers
                 }
                 }
             }
             }
 
 
-            var hasKeywords = item as IHasKeywords;
-            if (hasKeywords != null)
+            if (item.Keywords.Count > 0)
             {
             {
-                if (hasKeywords.Keywords.Count > 0)
-                {
-                    builder.Append("<PlotKeywords>");
-
-                    foreach (var tag in hasKeywords.Keywords)
-                    {
-                        builder.Append("<PlotKeyword>" + SecurityElement.Escape(tag) + "</PlotKeyword>");
-                    }
+                builder.Append("<PlotKeywords>");
 
 
-                    builder.Append("</PlotKeywords>");
+                foreach (var tag in item.Keywords)
+                {
+                    builder.Append("<PlotKeyword>" + SecurityElement.Escape(tag) + "</PlotKeyword>");
                 }
                 }
+
+                builder.Append("</PlotKeywords>");
             }
             }
 
 
             var people = libraryManager.GetPeople(item);
             var people = libraryManager.GetPeople(item);

+ 2 - 8
MediaBrowser.Providers/Manager/ProviderUtils.cs

@@ -165,15 +165,9 @@ namespace MediaBrowser.Providers.Manager
 
 
             if (!lockedFields.Contains(MetadataFields.Keywords))
             if (!lockedFields.Contains(MetadataFields.Keywords))
             {
             {
-                var sourceHasKeywords = source as IHasKeywords;
-                var targetHasKeywords = target as IHasKeywords;
-
-                if (sourceHasKeywords != null && targetHasKeywords != null)
+                if (replaceData || target.Keywords.Count == 0)
                 {
                 {
-                    if (replaceData || targetHasKeywords.Keywords.Count == 0)
-                    {
-                        targetHasKeywords.Keywords = sourceHasKeywords.Keywords;
-                    }
+                    target.Keywords = source.Keywords;
                 }
                 }
             }
             }
 
 

+ 1 - 5
MediaBrowser.Providers/Movies/GenericMovieDbInfo.cs

@@ -314,11 +314,7 @@ namespace MediaBrowser.Providers.Movies
 
 
             if (movieData.keywords != null && movieData.keywords.keywords != null)
             if (movieData.keywords != null && movieData.keywords.keywords != null)
             {
             {
-                var hasTags = movie as IHasKeywords;
-                if (hasTags != null)
-                {
-                    hasTags.Keywords = movieData.keywords.keywords.Select(i => i.name).ToList();
-                }
+                movie.Keywords = movieData.keywords.keywords.Select(i => i.name).ToList();
             }
             }
 
 
             if (movieData.trailers != null && movieData.trailers.youtube != null &&
             if (movieData.trailers != null && movieData.trailers.youtube != null &&

+ 1 - 10
MediaBrowser.Server.Implementations/Dto/DtoService.cs

@@ -983,16 +983,7 @@ namespace MediaBrowser.Server.Implementations.Dto
 
 
             if (fields.Contains(ItemFields.Keywords))
             if (fields.Contains(ItemFields.Keywords))
             {
             {
-                var hasTags = item as IHasKeywords;
-                if (hasTags != null)
-                {
-                    dto.Keywords = hasTags.Keywords;
-                }
-
-                if (dto.Keywords == null)
-                {
-                    dto.Keywords = new List<string>();
-                }
+                dto.Keywords = item.Keywords;
             }
             }
 
 
             if (fields.Contains(ItemFields.ProductionLocations))
             if (fields.Contains(ItemFields.ProductionLocations))

+ 1 - 7
MediaBrowser.Server.Implementations/Intros/DefaultIntroProvider.cs

@@ -433,13 +433,7 @@ namespace MediaBrowser.Server.Implementations.Intros
 
 
         private static IEnumerable<string> GetKeywords(BaseItem item)
         private static IEnumerable<string> GetKeywords(BaseItem item)
         {
         {
-            var hasTags = item as IHasKeywords;
-            if (hasTags != null)
-            {
-                return hasTags.Keywords;
-            }
-
-            return new List<string>();
+            return item.Keywords;
         }
         }
 
 
         public IEnumerable<string> GetAllIntroFiles()
         public IEnumerable<string> GetAllIntroFiles()

+ 26 - 7
MediaBrowser.Server.Implementations/Persistence/SqliteItemRepository.cs

@@ -87,7 +87,7 @@ namespace MediaBrowser.Server.Implementations.Persistence
         private IDbCommand _updateInheritedRatingCommand;
         private IDbCommand _updateInheritedRatingCommand;
         private IDbCommand _updateInheritedTagsCommand;
         private IDbCommand _updateInheritedTagsCommand;
 
 
-        public const int LatestSchemaVersion = 80;
+        public const int LatestSchemaVersion = 82;
 
 
         /// <summary>
         /// <summary>
         /// Initializes a new instance of the <see cref="SqliteItemRepository"/> class.
         /// Initializes a new instance of the <see cref="SqliteItemRepository"/> class.
@@ -2489,8 +2489,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
                 var index = 0;
                 var index = 0;
                 foreach (var item in query.Genres)
                 foreach (var item in query.Genres)
                 {
                 {
-                    clauses.Add("Genres like @Genres" + index);
-                    cmd.Parameters.Add(cmd, "@Genres" + index, DbType.String).Value = "%" + item + "%";
+                    clauses.Add("@Genre" + index + " in (select value from itemvalues where ItemId=Guid and Type=2)");
+                    cmd.Parameters.Add(cmd, "@Genre" + index, DbType.String).Value = item;
                     index++;
                     index++;
                 }
                 }
                 var clause = "(" + string.Join(" OR ", clauses.ToArray()) + ")";
                 var clause = "(" + string.Join(" OR ", clauses.ToArray()) + ")";
@@ -2503,8 +2503,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
                 var index = 0;
                 var index = 0;
                 foreach (var item in query.Tags)
                 foreach (var item in query.Tags)
                 {
                 {
-                    clauses.Add("Tags like @Tags" + index);
-                    cmd.Parameters.Add(cmd, "@Tags" + index, DbType.String).Value = "%" + item + "%";
+                    clauses.Add("@Tag" + index + " in (select value from itemvalues where ItemId=Guid and Type=4)");
+                    cmd.Parameters.Add(cmd, "@Tag" + index, DbType.String).Value = item;
                     index++;
                     index++;
                 }
                 }
                 var clause = "(" + string.Join(" OR ", clauses.ToArray()) + ")";
                 var clause = "(" + string.Join(" OR ", clauses.ToArray()) + ")";
@@ -2517,8 +2517,22 @@ namespace MediaBrowser.Server.Implementations.Persistence
                 var index = 0;
                 var index = 0;
                 foreach (var item in query.Studios)
                 foreach (var item in query.Studios)
                 {
                 {
-                    clauses.Add("Studios like @Studios" + index);
-                    cmd.Parameters.Add(cmd, "@Studios" + index, DbType.String).Value = "%" + item + "%";
+                    clauses.Add("@Studio" + index + " in (select value from itemvalues where ItemId=Guid and Type=3)");
+                    cmd.Parameters.Add(cmd, "@Studio" + index, DbType.String).Value = item;
+                    index++;
+                }
+                var clause = "(" + string.Join(" OR ", clauses.ToArray()) + ")";
+                whereClauses.Add(clause);
+            }
+
+            if (query.Keywords.Length > 0)
+            {
+                var clauses = new List<string>();
+                var index = 0;
+                foreach (var item in query.Keywords)
+                {
+                    clauses.Add("@Keyword" + index + " in (select value from itemvalues where ItemId=Guid and Type=5)");
+                    cmd.Parameters.Add(cmd, "@Keyword" + index, DbType.String).Value = item;
                     index++;
                     index++;
                 }
                 }
                 var clause = "(" + string.Join(" OR ", clauses.ToArray()) + ")";
                 var clause = "(" + string.Join(" OR ", clauses.ToArray()) + ")";
@@ -3233,6 +3247,11 @@ namespace MediaBrowser.Server.Implementations.Persistence
                 list.AddRange(hasAlbumArtist.AlbumArtists.Select(i => new Tuple<int, string>(1, i)));
                 list.AddRange(hasAlbumArtist.AlbumArtists.Select(i => new Tuple<int, string>(1, i)));
             }
             }
 
 
+            list.AddRange(item.Genres.Select(i => new Tuple<int, string>(2, i)));
+            list.AddRange(item.Studios.Select(i => new Tuple<int, string>(3, i)));
+            list.AddRange(item.Tags.Select(i => new Tuple<int, string>(4, i)));
+            list.AddRange(item.Keywords.Select(i => new Tuple<int, string>(5, i)));
+
             return list;
             return list;
         }
         }
 
 

+ 1 - 1
MediaBrowser.Server.Mono/Native/SqliteExtensions.cs

@@ -32,7 +32,7 @@ namespace MediaBrowser.Server.Mono.Native
             {
             {
                 PageSize = 4096,
                 PageSize = 4096,
                 CacheSize = 2000,
                 CacheSize = 2000,
-                SyncMode = SynchronizationModes.Full,
+                SyncMode = SynchronizationModes.Normal,
                 DataSource = dbPath,
                 DataSource = dbPath,
                 JournalMode = SQLiteJournalModeEnum.Wal
                 JournalMode = SQLiteJournalModeEnum.Wal
             };
             };

+ 1 - 1
MediaBrowser.ServerApplication/Native/SqliteExtensions.cs

@@ -32,7 +32,7 @@ namespace MediaBrowser.ServerApplication.Native
             {
             {
                 PageSize = 4096,
                 PageSize = 4096,
                 CacheSize = 2000,
                 CacheSize = 2000,
-                SyncMode = SynchronizationModes.Full,
+                SyncMode = SynchronizationModes.Normal,
                 DataSource = dbPath,
                 DataSource = dbPath,
                 JournalMode = SQLiteJournalModeEnum.Wal
                 JournalMode = SQLiteJournalModeEnum.Wal
             };
             };

+ 2 - 6
MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs

@@ -932,13 +932,9 @@ namespace MediaBrowser.XbmcMetadata.Parsers
                     {
                     {
                         var val = reader.ReadElementContentAsString();
                         var val = reader.ReadElementContentAsString();
 
 
-                        var hasKeywords = item as IHasKeywords;
-                        if (hasKeywords != null)
+                        if (!string.IsNullOrWhiteSpace(val))
                         {
                         {
-                            if (!string.IsNullOrWhiteSpace(val))
-                            {
-                                hasKeywords.AddKeyword(val);
-                            }
+                            item.AddKeyword(val);
                         }
                         }
                         break;
                         break;
                     }
                     }

+ 2 - 6
MediaBrowser.XbmcMetadata/Savers/BaseNfoSaver.cs

@@ -752,13 +752,9 @@ namespace MediaBrowser.XbmcMetadata.Savers
                 }
                 }
             }
             }
 
 
-            var hasKeywords = item as IHasKeywords;
-            if (hasKeywords != null)
+            foreach (var tag in item.Keywords)
             {
             {
-                foreach (var tag in hasKeywords.Keywords)
-                {
-                    writer.WriteElementString("plotkeyword", tag);
-                }
+                writer.WriteElementString("plotkeyword", tag);
             }
             }
 
 
             var hasAwards = item as IHasAwards;
             var hasAwards = item as IHasAwards;