Assets accept name in URL so we can load simple playlists (eg Tidal) that don't respond to playlists.lookup

This commit is contained in:
James Barnsley
2021-05-29 12:04:41 +12:00
parent d90d7c6123
commit 2fc20638fa
10 changed files with 156 additions and 90 deletions

View File

@ -147809,12 +147809,6 @@ var App = /*#__PURE__*/function (_React$Component) {
component: _views_Search__WEBPACK_IMPORTED_MODULE_25__["default"],
"data-qa-node": "Route",
"data-qa-file": "App"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__["Route"], {
exact: true,
path: "/album/:uri",
component: _views_Album__WEBPACK_IMPORTED_MODULE_16__["default"],
"data-qa-node": "Route",
"data-qa-file": "App"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__["Route"], {
exact: true,
path: "/artist/:uri/:sub_view?",
@ -147823,25 +147817,31 @@ var App = /*#__PURE__*/function (_React$Component) {
"data-qa-file": "App"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__["Route"], {
exact: true,
path: "/playlist/:uri",
path: "/album/:uri/:name?",
component: _views_Album__WEBPACK_IMPORTED_MODULE_16__["default"],
"data-qa-node": "Route",
"data-qa-file": "App"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__["Route"], {
exact: true,
path: "/playlist/:uri/:name?",
component: _views_Playlist__WEBPACK_IMPORTED_MODULE_18__["default"],
"data-qa-node": "Route",
"data-qa-file": "App"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__["Route"], {
exact: true,
path: "/user/:uri",
path: "/user/:uri/:name?",
component: _views_User__WEBPACK_IMPORTED_MODULE_19__["default"],
"data-qa-node": "Route",
"data-qa-file": "App"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__["Route"], {
exact: true,
path: "/track/:uri",
path: "/track/:uri/:name?",
component: _views_Track__WEBPACK_IMPORTED_MODULE_20__["default"],
"data-qa-node": "Route",
"data-qa-file": "App"
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react_router_dom__WEBPACK_IMPORTED_MODULE_2__["Route"], {
exact: true,
path: "/uri/:uri",
path: "/uri/:uri/:name?",
component: _views_UriRedirect__WEBPACK_IMPORTED_MODULE_21__["default"],
"data-qa-node": "Route",
"data-qa-file": "App"
@ -154739,7 +154739,7 @@ var GridItem = function GridItem(_ref2) {
} else if (item.link) {
to = item.link;
} else {
to = "/".concat(item.type, "/").concat(Object(_util_format__WEBPACK_IMPORTED_MODULE_7__["encodeUri"])(item.uri));
to = "/".concat(item.type, "/").concat(Object(_util_format__WEBPACK_IMPORTED_MODULE_7__["encodeUri"])(item.uri)).concat(item.name ? "/".concat(item.name) : '');
}
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_Link__WEBPACK_IMPORTED_MODULE_2__["default"], {
@ -155925,7 +155925,7 @@ var ListItem = function ListItem(_ref) {
} else if (item.link) {
to = item.link;
} else {
to = "/".concat(item.type, "/").concat(Object(_util_format__WEBPACK_IMPORTED_MODULE_12__["encodeUri"])(item.uri));
to = "/".concat(item.type, "/").concat(Object(_util_format__WEBPACK_IMPORTED_MODULE_12__["encodeUri"])(item.uri)).concat(item.name ? "/".concat(item.name) : '');
}
if (e.target.tagName.toLowerCase() !== 'a') {
@ -168637,38 +168637,67 @@ var MopidyMiddleware = function () {
}
case 'MOPIDY_GET_PLAYLIST':
request(store, 'playlists.lookup', {
uri: action.uri
}).then(function (response) {
if (!response) return;
var playlist = Object(_util_format__WEBPACK_IMPORTED_MODULE_6__["formatPlaylist"])(_objectSpread(_objectSpread({}, response), {}, {
uri: action.uri,
// Patch in the requested URI
type: 'playlist',
provider: 'mopidy',
can_edit: true
}));
{
var processResponse = function processResponse(response) {
var fetchTracks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
var playlist = Object(_util_format__WEBPACK_IMPORTED_MODULE_6__["formatPlaylist"])(_objectSpread(_objectSpread({
can_edit: true,
provider: 'mopidy'
}, response), {}, {
uri: action.uri,
// Patch in the requested URI
type: 'playlist'
}));
if (response.tracks) {
request(store, 'library.lookup', {
uris: Object(_util_arrays__WEBPACK_IMPORTED_MODULE_7__["arrayOf"])('uri', response.tracks)
}).then(function (tracksResponse) {
var tracks = response.tracks.map(function (simpleTrack) {
var fullTracks = tracksResponse[simpleTrack.uri];
return _objectSpread(_objectSpread({}, simpleTrack), fullTracks.length ? fullTracks[0] : {});
if (response.tracks && fetchTracks) {
request(store, 'library.lookup', {
uris: Object(_util_arrays__WEBPACK_IMPORTED_MODULE_7__["arrayOf"])('uri', response.tracks)
}).then(function (tracksResponse) {
var tracks = response.tracks.map(function (simpleTrack) {
var fullTracks = tracksResponse[simpleTrack.uri];
return _objectSpread(_objectSpread({}, simpleTrack), fullTracks.length ? fullTracks[0] : {});
});
playlist.tracks = Object(_util_format__WEBPACK_IMPORTED_MODULE_6__["injectSortId"])(Object(_util_format__WEBPACK_IMPORTED_MODULE_6__["formatTracks"])(tracks));
store.dispatch(coreActions.itemLoaded(playlist));
});
playlist.tracks = Object(_util_format__WEBPACK_IMPORTED_MODULE_6__["injectSortId"])(Object(_util_format__WEBPACK_IMPORTED_MODULE_6__["formatTracks"])(tracks));
} else {
store.dispatch(coreActions.itemLoaded(playlist));
});
} else {
store.dispatch(coreActions.itemLoaded(playlist));
}
}
if (!playlist.images) {
store.dispatch(mopidyActions.getImages([playlist.uri]));
}
});
break;
if (!playlist.images) {
store.dispatch(mopidyActions.getImages([playlist.uri]));
}
};
request(store, 'playlists.lookup', {
uri: action.uri
}).then(function (playlistResponse) {
if (playlistResponse) {
// Got a playlist from our playlists core, this is typically because it's a local
// playlist, or one that our backend user owns.
processResponse(playlistResponse);
} else {
console.info('Playlist not in playlists, fetching using library', action.uri); // No match, so let's try fetching from foreign provider. This needs to happen when we
// don't have a HTTP API (eg Spotify) but the playlist is not ours (eg Tidal browse)
request(store, 'library.lookup', {
uris: [action.uri]
}).then(function () {
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
libraryResponse = _ref[action.uri];
if (!libraryResponse) return;
processResponse(_objectSpread({
tracks: libraryResponse,
can_edit: false
}, action.options.name ? {
name: action.options.name
} : {}), false);
});
}
});
break;
}
case 'MOPIDY_ADD_PLAYLIST_TRACKS':
request(store, 'playlists.lookup', {
@ -169185,6 +169214,7 @@ var MopidyMiddleware = function () {
}
if (subdirectoryImagesToLoad.length) {
console.info("Loading ".concat(subdirectoryImagesToLoad.length, " subdirectory URIs"));
request(store, 'library.getImages', {
uris: subdirectoryImagesToLoad
}).then(function (response) {
@ -180477,6 +180507,10 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var _util_format__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../util/format */ "./src/js/util/format.js");
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
@ -180544,6 +180578,7 @@ var Playlist = /*#__PURE__*/function (_React$Component) {
prevPlaylist = _ref.playlist;
var _this$props = _this.props,
uri = _this$props.uri,
name = _this$props.name,
playlist = _this$props.playlist,
loadPlaylist = _this$props.coreActions.loadPlaylist,
push = _this$props.history.push;
@ -180554,7 +180589,8 @@ var Playlist = /*#__PURE__*/function (_React$Component) {
if (uri !== prevUri) {
loadPlaylist(uri, {
full: true
full: true,
name: name
});
}
@ -180574,11 +180610,14 @@ var Playlist = /*#__PURE__*/function (_React$Component) {
var _this$props2 = _this.props,
showContextMenu = _this$props2.uiActions.showContextMenu,
playlist = _this$props2.playlist,
uri = _this$props2.uri;
uri = _this$props2.uri,
name = _this$props2.name;
showContextMenu({
e: e,
context: 'playlist',
items: [playlist],
items: [_objectSpread({
name: name
}, playlist)],
uris: [uri]
});
});
@ -181071,11 +181110,13 @@ var Playlist = /*#__PURE__*/function (_React$Component) {
value: function componentDidMount() {
var _this$props11 = this.props,
loadPlaylist = _this$props11.coreActions.loadPlaylist,
uri = _this$props11.uri;
uri = _this$props11.uri,
name = _this$props11.name;
this.setWindowTitle();
setTimeout(function () {
return loadPlaylist(uri, {
full: true
full: true,
name: name
});
}, 1);
}
@ -181106,6 +181147,7 @@ var mapStateToProps = function mapStateToProps(state, ownProps) {
return {
uri: uri,
encodedUri: ownProps.match.params.uri,
name: ownProps.match.params.name,
allow_reporting: allow_reporting,
slim_mode: slim_mode,
theme: theme,

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -115,7 +115,7 @@
// Release details
// These are automatically injected to built HTML
var build = "1621658938";
var build = "1622246428";
var version = "3.58.0";
// Construct the script tag