diff --git a/ApiClient.js b/ApiClient.js index 572cb0cf24..39c154b4b4 100644 --- a/ApiClient.js +++ b/ApiClient.js @@ -1152,6 +1152,27 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout) { }); }; + self.getMusicGenre = function (name, userId) { + + if (!name) { + throw new Error("null name"); + } + + var options = {}; + + if (userId) { + options.userId = userId; + } + + var url = self.getUrl("MusicGenres/" + self.encodeName(name), options); + + return self.ajax({ + type: "GET", + url: url, + dataType: "json" + }); + }; + /** * Gets an artist */ @@ -1424,6 +1445,41 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout) { return self.getUrl(url, options); }; + /** + * Constructs a url for a genre image + * @param {String} name + * @param {Object} options + * Options supports the following properties: + * width - download the image at a fixed width + * height - download the image at a fixed height + * maxWidth - download the image at a maxWidth + * maxHeight - download the image at a maxHeight + * quality - A scale of 0-100. This should almost always be omitted as the default will suffice. + * For best results do not specify both width and height together, as aspect ratio might be altered. + */ + self.getMusicGenreImageUrl = function (name, options) { + + if (!name) { + throw new Error("null name"); + } + + options = options || { + + }; + + var url = "MusicGenres/" + self.encodeName(name) + "/Images/" + options.type; + + if (options.index != null) { + url += "/" + options.index; + } + + // Don't put these on the query string + delete options.type; + delete options.index; + + return self.getUrl(url, options); + }; + /** * Constructs a url for a artist image * @param {String} name @@ -1910,6 +1966,24 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout) { }); }; + self.getMusicGenres = function (userId, options) { + + if (!userId) { + throw new Error("null userId"); + } + + options = options || {}; + options.userId = userId; + + var url = self.getUrl("MusicGenres", options); + + return self.ajax({ + type: "GET", + url: url, + dataType: "json" + }); + }; + /** Gets people from an item */ @@ -2217,6 +2291,26 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout) { }); }; + self.updateFavoriteMusicGenreStatus = function (userId, name, isFavorite) { + + if (!userId) { + throw new Error("null userId"); + } + + if (!name) { + throw new Error("null name"); + } + + var url = self.getUrl("Users/" + userId + "/Favorites/MusicGenres/" + self.encodeName(name)); + + var method = isFavorite ? "POST" : "DELETE"; + + return self.ajax({ + type: method, + url: url + }); + }; + /** * Updates a user's rating for an item by name. * @param {String} userId @@ -2303,6 +2397,26 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout) { }); }; + self.updateMusicGenreRating = function (userId, name, likes) { + + if (!userId) { + throw new Error("null userId"); + } + + if (!name) { + throw new Error("null name"); + } + + var url = self.getUrl("Users/" + userId + "/Ratings/MusicGenres/" + self.encodeName(name), { + likes: likes + }); + + return self.ajax({ + type: "POST", + url: url + }); + }; + /** * Clears a user's rating for an item by name. * @param {String} userId @@ -2380,6 +2494,24 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout) { }); }; + self.clearMusicGenreRating = function (userId, name) { + + if (!userId) { + throw new Error("null userId"); + } + + if (!name) { + throw new Error("null name"); + } + + var url = self.getUrl("Users/" + userId + "/Ratings/MusicGenres/" + self.encodeName(name)); + + return self.ajax({ + type: "DELETE", + url: url + }); + }; + self.getItemCounts = function (userId) { var options = {}; @@ -2445,6 +2577,27 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout) { }); }; + self.getMusicGenreItemCounts = function (userId, name) { + + if (!userId) { + throw new Error("null userId"); + } + + if (!name) { + throw new Error("null name"); + } + + var url = self.getUrl("MusicGenres/" + self.encodeName(name) + "/Counts", { + userId: userId + }); + + return self.ajax({ + type: "GET", + url: url, + dataType: "json" + }); + }; + /** Gets a variety of item counts that an artist appears in */ diff --git a/dashboard-ui/scripts/itembynamedetailpage.js b/dashboard-ui/scripts/itembynamedetailpage.js index 6ef06b97e8..706643572b 100644 --- a/dashboard-ui/scripts/itembynamedetailpage.js +++ b/dashboard-ui/scripts/itembynamedetailpage.js @@ -25,6 +25,12 @@ return ApiClient.getGenre(name, Dashboard.getCurrentUserId()); } + name = getParameterByName('musicgenre'); + + if (name) { + return ApiClient.getMusicGenre(name, Dashboard.getCurrentUserId()); + } + name = getParameterByName('artist'); if (name) { @@ -103,7 +109,7 @@ $('#tvPeopleTabs', page).show(); } - if (context == "music" && item.Type == "Genre") { + if (context == "music" && item.Type == "MusicGenre") { $('#musicGenreTabs', page).show(); } if (context == "music" && item.Type == "Artist") { @@ -127,6 +133,9 @@ else if (item.Type == "Genre") { promise = ApiClient.getGenreItemCounts(Dashboard.getCurrentUserId(), item.Name); } + else if (item.Type == "MusicGenre") { + promise = ApiClient.getMusicGenreItemCounts(Dashboard.getCurrentUserId(), item.Name); + } else if (item.Type == "Studio") { promise = ApiClient.getStudioItemCounts(Dashboard.getCurrentUserId(), item.Name); } @@ -361,6 +370,9 @@ else if (currentItem.Type == "Genre") { query.Genres = currentItem.Name; } + else if (currentItem.Type == "MusicGenre") { + query.Genres = currentItem.Name; + } else if (currentItem.Type == "Studio") { query.Studios = currentItem.Name; } diff --git a/dashboard-ui/scripts/librarybrowser.js b/dashboard-ui/scripts/librarybrowser.js index 7f5775a5e6..917255b432 100644 --- a/dashboard-ui/scripts/librarybrowser.js +++ b/dashboard-ui/scripts/librarybrowser.js @@ -116,7 +116,7 @@ imgUrl = "css/images/items/list/game.png"; isDefault = true; } - else if (item.Type == "Studio" || item.Type == "Genre") { + else if (item.Type == "Studio" || item.Type == "Genre" || item.Type == "MusicGenre") { if (options.context == "games") { @@ -180,7 +180,7 @@ html += '
' + childText + '
'; } - else if (item.Type == "Genre" || item.Type == "Studio" || item.Type == "Person" || item.Type == "Artist") { + else if (item.Type == "Genre" || item.Type == "Studio" || item.Type == "Person" || item.Type == "Artist" || item.Type == "MusicGenre") { childText = item.ChildCount == 1 ? "1 " + options.countNameSingular : item.ChildCount + " " + options.countNamePlural; @@ -366,6 +366,9 @@ if (item.Type == "Genre") { return "itembynamedetails.html?genre=" + ApiClient.encodeName(item.Name) + "&context=" + itemByNameContext; } + if (item.Type == "MusicGenre") { + return "itembynamedetails.html?musicgenre=" + ApiClient.encodeName(item.Name) + "&context=" + itemByNameContext; + } if (item.Type == "Studio") { return "itembynamedetails.html?studio=" + ApiClient.encodeName(item.Name) + "&context=" + itemByNameContext; } @@ -411,6 +414,10 @@ return ApiClient.getGenreImageUrl(item.Name, options); } + if (item.Type == "MusicGenre") { + + return ApiClient.getMusicGenreImageUrl(item.Name, options); + } if (item.Type == "Artist") { return ApiClient.getArtistImageUrl(item.Name, options); @@ -597,7 +604,7 @@ return '