🔧 chore(spicetify): update

This commit is contained in:
Sergio Laín 2025-04-20 14:03:02 +02:00
parent 85b9b1733d
commit 16bcf8f84b
No known key found for this signature in database
GPG key ID: 51BB28D8B42FB438
11 changed files with 566 additions and 14755 deletions

View file

@ -95,6 +95,23 @@ var library = (() => {
getCollection(uri) { getCollection(uri) {
return this._collections.find((collection) => collection.uri === uri); return this._collections.find((collection) => collection.uri === uri);
} }
async getLocalAlbums() {
const localAlbumsIntegration = window.localTracksService;
if (!localAlbumsIntegration)
return /* @__PURE__ */ new Map();
if (!localAlbumsIntegration.isReady) {
await new Promise((resolve) => {
const sub = localAlbumsIntegration.isReady$.subscribe((ready) => {
if (ready) {
resolve(true);
sub.unsubscribe();
}
});
localAlbumsIntegration.init();
});
}
return localAlbumsIntegration.getAlbums();
}
async getCollectionContents(uri) { async getCollectionContents(uri) {
const collection = this.getCollection(uri); const collection = this.getCollection(uri);
if (!collection) if (!collection)
@ -106,6 +123,12 @@ var library = (() => {
limit: 9999 limit: 9999
}); });
items.push(...albums.items.filter((album) => collection.items.includes(album.uri))); items.push(...albums.items.filter((album) => collection.items.includes(album.uri)));
const localAlbumUris = collection.items.filter((item) => item.includes("local"));
if (localAlbumUris.length > 0) {
const localAlbums = await this.getLocalAlbums();
const inCollection = localAlbumUris.map((uri2) => localAlbums.get(uri2));
items.push(...inCollection.filter(Boolean));
}
return items; return items;
} }
async getContents(props) { async getContents(props) {
@ -123,10 +146,18 @@ var library = (() => {
for (const collection of this._collections) { for (const collection of this._collections) {
const boolArray = await Spicetify.Platform.LibraryAPI.contains(...collection.items); const boolArray = await Spicetify.Platform.LibraryAPI.contains(...collection.items);
if (boolArray.includes(false)) { if (boolArray.includes(false)) {
collection.items = collection.items.filter((_, i) => boolArray[i]); const result = [];
this.saveCollections(); for (let i = 0; i < boolArray.length; i++) {
Spicetify.showNotification("Album removed from collection"); if (boolArray[i] || collection.items[i].includes("local")) {
this.syncCollection(collection.uri); result.push(collection.items[i]);
}
}
if (result.length !== collection.items.length) {
collection.items = collection.items.filter((uri, i) => boolArray[i] || uri.includes("local"));
this.saveCollections();
Spicetify.showNotification("Album removed from collection");
this.syncCollection(collection.uri);
}
} }
} }
} }
@ -146,6 +177,7 @@ var library = (() => {
await PlaylistAPI.add(collection.syncedPlaylistUri, wanted, { before: "end" }); await PlaylistAPI.add(collection.syncedPlaylistUri, wanted, { before: "end" });
if (unwanted.length) if (unwanted.length)
await PlaylistAPI.remove(collection.syncedPlaylistUri, unwanted); await PlaylistAPI.remove(collection.syncedPlaylistUri, unwanted);
Spicetify.showNotification("Playlist synced");
} }
unsyncCollection(uri) { unsyncCollection(uri) {
const collection = this.getCollection(uri); const collection = this.getCollection(uri);
@ -153,6 +185,7 @@ var library = (() => {
return; return;
collection.syncedPlaylistUri = void 0; collection.syncedPlaylistUri = void 0;
this.saveCollections(); this.saveCollections();
Spicetify.showNotification("Collection unsynced");
} }
async getTracklist(collectionUri) { async getTracklist(collectionUri) {
const collection = this.getCollection(collectionUri); const collection = this.getCollection(collectionUri);
@ -160,8 +193,17 @@ var library = (() => {
return []; return [];
return Promise.all( return Promise.all(
collection.items.map(async (uri) => { collection.items.map(async (uri) => {
const album = await Spicetify.Platform.LibraryAPI.getAlbum(uri); if (uri.includes("local")) {
return album.items.map((t) => t.uri); const localAlbums = await this.getLocalAlbums();
const localAlbum = localAlbums.get(uri);
return localAlbum?.getTracks().map((t) => t.uri) || [];
}
const res = await Spicetify.GraphQL.Request(Spicetify.GraphQL.Definitions.queryAlbumTrackUris, {
offset: 0,
limit: 50,
uri
});
return res.data.albumUnion.tracksV2.items.map((t) => t.track.uri);
}) })
).then((tracks) => tracks.flat()); ).then((tracks) => tracks.flat());
} }
@ -190,7 +232,8 @@ var library = (() => {
Spicetify.GraphQL.Request(Spicetify.GraphQL.Definitions.queryArtistDiscographyAlbums, { Spicetify.GraphQL.Request(Spicetify.GraphQL.Definitions.queryArtistDiscographyAlbums, {
uri: artistUri, uri: artistUri,
offset: 0, offset: 0,
limit: 50 limit: 50,
order: "DATE_DESC"
}), }),
Spicetify.GraphQL.Request(Spicetify.GraphQL.Definitions.queryArtistOverview, { Spicetify.GraphQL.Request(Spicetify.GraphQL.Definitions.queryArtistOverview, {
uri: artistUri, uri: artistUri,
@ -237,7 +280,8 @@ var library = (() => {
if (!collection) if (!collection)
return; return;
for (const album of collection.items) { for (const album of collection.items) {
Spicetify.Platform.LibraryAPI.remove({ uris: [album] }); if (!album.includes("local"))
Spicetify.Platform.LibraryAPI.remove({ uris: [album] });
} }
this.deleteCollection(uri); this.deleteCollection(uri);
} }
@ -245,11 +289,20 @@ var library = (() => {
const collection = this.getCollection(collectionUri); const collection = this.getCollection(collectionUri);
if (!collection) if (!collection)
return; return;
await Spicetify.Platform.LibraryAPI.add({ uris: [albumUri] }); if (!albumUri.includes("local")) {
collection.items.push(albumUri); const isSaved = await Spicetify.Platform.LibraryAPI.contains(albumUri)[0];
this.saveCollections(); if (!isSaved) {
Spicetify.showNotification("Album added to collection"); await Spicetify.Platform.LibraryAPI.add({ uris: [albumUri] });
this.syncCollection(collectionUri); }
}
if (!collection.items.includes(albumUri)) {
collection.items.push(albumUri);
this.saveCollections();
Spicetify.showNotification("Album added to collection");
this.syncCollection(collectionUri);
} else {
Spicetify.showNotification("Album already in collection");
}
} }
removeAlbumFromCollection(collectionUri, albumUri) { removeAlbumFromCollection(collectionUri, albumUri) {
const collection = this.getCollection(collectionUri); const collection = this.getCollection(collectionUri);

View file

@ -98,20 +98,23 @@ var library = (() => {
}; };
var SliderInput = (props) => { var SliderInput = (props) => {
const { Slider } = Spicetify.ReactComponent; const { Slider } = Spicetify.ReactComponent;
const handleSliderChange = (newValue) => { const [value, setValue] = import_react.default.useState((props.value - props.min) / (props.max - props.min));
const handleSliderChange = import_react.default.useCallback((newValue) => {
setValue(newValue);
const calculatedValue = props.min + newValue * (props.max - props.min); const calculatedValue = props.min + newValue * (props.max - props.min);
props.callback(calculatedValue); props.callback(calculatedValue);
}; }, [props]);
const value = (props.value - props.min) / (props.max - props.min); const handleDragMove = import_react.default.useCallback((v) => {
console.log(v);
}, []);
return /* @__PURE__ */ import_react.default.createElement(Slider, { return /* @__PURE__ */ import_react.default.createElement(Slider, {
id: `slider:${props.storageKey}`, id: `slider:${props.storageKey}`,
value, value,
min: 0, min: 0,
max: 1, max: 1,
step: 0.1, step: 0.1,
onDragMove: (newValue) => handleSliderChange(newValue), onDragMove: handleDragMove,
onDragStart: () => { onDragStart: handleSliderChange,
},
onDragEnd: () => { onDragEnd: () => {
} }
}); });
@ -311,7 +314,7 @@ var library = (() => {
// src/components/collapse_button.tsx // src/components/collapse_button.tsx
var import_react4 = __toESM(require_react()); var import_react4 = __toESM(require_react());
var collapseLibrary = () => { var collapseLibrary = () => {
Spicetify.Platform.LocalStorageAPI.setItem("ylx-sidebar-state", 1); Spicetify.Platform.LocalStorageAPI.setItem("left-sidebar-state", 1);
}; };
var CollapseIcon = () => { var CollapseIcon = () => {
const { IconComponent } = Spicetify.ReactComponent; const { IconComponent } = Spicetify.ReactComponent;
@ -410,7 +413,7 @@ var library = (() => {
"data-encore-id": "icon", "data-encore-id": "icon",
role: "img", role: "img",
"aria-hidden": "true", "aria-hidden": "true",
className: "Svg-sc-ytk21e-0 Svg-img-icon-small x-filterBox-searchIcon", className: "Svg-sc-ytk21e-0 Svg-img-icon-small e-9640-icon x-filterBox-searchIcon",
viewBox: "0 0 16 16" viewBox: "0 0 16 16"
}, /* @__PURE__ */ import_react7.default.createElement("path", { }, /* @__PURE__ */ import_react7.default.createElement("path", {
d: "M7 1.75a5.25 5.25 0 1 0 0 10.5 5.25 5.25 0 0 0 0-10.5zM.25 7a6.75 6.75 0 1 1 12.096 4.12l3.184 3.185a.75.75 0 1 1-1.06 1.06L11.304 12.2A6.75 6.75 0 0 1 .25 7z" d: "M7 1.75a5.25 5.25 0 1 0 0 10.5 5.25 5.25 0 0 0 0-10.5zM.25 7a6.75 6.75 0 1 1 12.096 4.12l3.184 3.185a.75.75 0 1 1-1.06 1.06L11.304 12.2A6.75 6.75 0 0 1 .25 7z"
@ -451,7 +454,7 @@ var library = (() => {
const [textFilter, setTextFilter] = import_react8.default.useState(""); const [textFilter, setTextFilter] = import_react8.default.useState("");
const [collections, setCollections] = import_react8.default.useState(null); const [collections, setCollections] = import_react8.default.useState(null);
const context = import_react8.default.useContext(Spicetify.ContextMenuV2._context); const context = import_react8.default.useContext(Spicetify.ContextMenuV2._context);
const uri = context?.props?.uri; const uri = context?.props?.uri || context?.props?.id;
import_react8.default.useEffect(() => { import_react8.default.useEffect(() => {
const fetchCollections = async () => { const fetchCollections = async () => {
setCollections(await CollectionsWrapper.getContents({ textFilter, limit: 20, offset: 0 })); setCollections(await CollectionsWrapper.getContents({ textFilter, limit: 20, offset: 0 }));
@ -598,6 +601,23 @@ var library = (() => {
getCollection(uri) { getCollection(uri) {
return this._collections.find((collection) => collection.uri === uri); return this._collections.find((collection) => collection.uri === uri);
} }
async getLocalAlbums() {
const localAlbumsIntegration = window.localTracksService;
if (!localAlbumsIntegration)
return /* @__PURE__ */ new Map();
if (!localAlbumsIntegration.isReady) {
await new Promise((resolve) => {
const sub = localAlbumsIntegration.isReady$.subscribe((ready) => {
if (ready) {
resolve(true);
sub.unsubscribe();
}
});
localAlbumsIntegration.init();
});
}
return localAlbumsIntegration.getAlbums();
}
async getCollectionContents(uri) { async getCollectionContents(uri) {
const collection = this.getCollection(uri); const collection = this.getCollection(uri);
if (!collection) if (!collection)
@ -609,6 +629,12 @@ var library = (() => {
limit: 9999 limit: 9999
}); });
items.push(...albums.items.filter((album) => collection.items.includes(album.uri))); items.push(...albums.items.filter((album) => collection.items.includes(album.uri)));
const localAlbumUris = collection.items.filter((item) => item.includes("local"));
if (localAlbumUris.length > 0) {
const localAlbums = await this.getLocalAlbums();
const inCollection = localAlbumUris.map((uri2) => localAlbums.get(uri2));
items.push(...inCollection.filter(Boolean));
}
return items; return items;
} }
async getContents(props) { async getContents(props) {
@ -626,10 +652,18 @@ var library = (() => {
for (const collection of this._collections) { for (const collection of this._collections) {
const boolArray = await Spicetify.Platform.LibraryAPI.contains(...collection.items); const boolArray = await Spicetify.Platform.LibraryAPI.contains(...collection.items);
if (boolArray.includes(false)) { if (boolArray.includes(false)) {
collection.items = collection.items.filter((_, i) => boolArray[i]); const result = [];
this.saveCollections(); for (let i = 0; i < boolArray.length; i++) {
Spicetify.showNotification("Album removed from collection"); if (boolArray[i] || collection.items[i].includes("local")) {
this.syncCollection(collection.uri); result.push(collection.items[i]);
}
}
if (result.length !== collection.items.length) {
collection.items = collection.items.filter((uri, i) => boolArray[i] || uri.includes("local"));
this.saveCollections();
Spicetify.showNotification("Album removed from collection");
this.syncCollection(collection.uri);
}
} }
} }
} }
@ -649,6 +683,7 @@ var library = (() => {
await PlaylistAPI.add(collection.syncedPlaylistUri, wanted, { before: "end" }); await PlaylistAPI.add(collection.syncedPlaylistUri, wanted, { before: "end" });
if (unwanted.length) if (unwanted.length)
await PlaylistAPI.remove(collection.syncedPlaylistUri, unwanted); await PlaylistAPI.remove(collection.syncedPlaylistUri, unwanted);
Spicetify.showNotification("Playlist synced");
} }
unsyncCollection(uri) { unsyncCollection(uri) {
const collection = this.getCollection(uri); const collection = this.getCollection(uri);
@ -656,6 +691,7 @@ var library = (() => {
return; return;
collection.syncedPlaylistUri = void 0; collection.syncedPlaylistUri = void 0;
this.saveCollections(); this.saveCollections();
Spicetify.showNotification("Collection unsynced");
} }
async getTracklist(collectionUri) { async getTracklist(collectionUri) {
const collection = this.getCollection(collectionUri); const collection = this.getCollection(collectionUri);
@ -663,8 +699,17 @@ var library = (() => {
return []; return [];
return Promise.all( return Promise.all(
collection.items.map(async (uri) => { collection.items.map(async (uri) => {
const album = await Spicetify.Platform.LibraryAPI.getAlbum(uri); if (uri.includes("local")) {
return album.items.map((t) => t.uri); const localAlbums = await this.getLocalAlbums();
const localAlbum = localAlbums.get(uri);
return localAlbum?.getTracks().map((t) => t.uri) || [];
}
const res = await Spicetify.GraphQL.Request(Spicetify.GraphQL.Definitions.queryAlbumTrackUris, {
offset: 0,
limit: 50,
uri
});
return res.data.albumUnion.tracksV2.items.map((t) => t.track.uri);
}) })
).then((tracks) => tracks.flat()); ).then((tracks) => tracks.flat());
} }
@ -693,7 +738,8 @@ var library = (() => {
Spicetify.GraphQL.Request(Spicetify.GraphQL.Definitions.queryArtistDiscographyAlbums, { Spicetify.GraphQL.Request(Spicetify.GraphQL.Definitions.queryArtistDiscographyAlbums, {
uri: artistUri, uri: artistUri,
offset: 0, offset: 0,
limit: 50 limit: 50,
order: "DATE_DESC"
}), }),
Spicetify.GraphQL.Request(Spicetify.GraphQL.Definitions.queryArtistOverview, { Spicetify.GraphQL.Request(Spicetify.GraphQL.Definitions.queryArtistOverview, {
uri: artistUri, uri: artistUri,
@ -740,7 +786,8 @@ var library = (() => {
if (!collection) if (!collection)
return; return;
for (const album of collection.items) { for (const album of collection.items) {
Spicetify.Platform.LibraryAPI.remove({ uris: [album] }); if (!album.includes("local"))
Spicetify.Platform.LibraryAPI.remove({ uris: [album] });
} }
this.deleteCollection(uri); this.deleteCollection(uri);
} }
@ -748,11 +795,20 @@ var library = (() => {
const collection = this.getCollection(collectionUri); const collection = this.getCollection(collectionUri);
if (!collection) if (!collection)
return; return;
await Spicetify.Platform.LibraryAPI.add({ uris: [albumUri] }); if (!albumUri.includes("local")) {
collection.items.push(albumUri); const isSaved = await Spicetify.Platform.LibraryAPI.contains(albumUri)[0];
this.saveCollections(); if (!isSaved) {
Spicetify.showNotification("Album added to collection"); await Spicetify.Platform.LibraryAPI.add({ uris: [albumUri] });
this.syncCollection(collectionUri); }
}
if (!collection.items.includes(albumUri)) {
collection.items.push(albumUri);
this.saveCollections();
Spicetify.showNotification("Album added to collection");
this.syncCollection(collectionUri);
} else {
Spicetify.showNotification("Album already in collection");
}
} }
removeAlbumFromCollection(collectionUri, albumUri) { removeAlbumFromCollection(collectionUri, albumUri) {
const collection = this.getCollection(collectionUri); const collection = this.getCollection(collectionUri);
@ -851,19 +907,6 @@ var library = (() => {
className: "main-image-image x-entityImage-image main-image-loading main-image-loaded" className: "main-image-image x-entityImage-image main-image-loading main-image-loaded"
}); });
}; };
var FolderPlaceholder = () => {
return /* @__PURE__ */ import_react10.default.createElement("div", {
className: "x-entityImage-imagePlaceholder"
}, /* @__PURE__ */ import_react10.default.createElement("svg", {
"data-encore-id": "icon",
role: "img",
"aria-hidden": "true",
className: "Svg-sc-ytk21e-0 Svg-img-icon-medium",
viewBox: "0 0 24 24"
}, /* @__PURE__ */ import_react10.default.createElement("path", {
d: "M1 4a2 2 0 0 1 2-2h5.155a3 3 0 0 1 2.598 1.5l.866 1.5H21a2 2 0 0 1 2 2v13a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V4zm7.155 0H3v16h18V7H10.464L9.021 4.5a1 1 0 0 0-.866-.5z"
})));
};
var SpicetifyLibrary = class { var SpicetifyLibrary = class {
ConfigWrapper = new config_wrapper_default( ConfigWrapper = new config_wrapper_default(
[ [
@ -884,6 +927,21 @@ var library = (() => {
def: false, def: false,
callback: setSearchBarSize callback: setSearchBarSize
}, },
{
name: "Add Local Albums Integration",
key: "localAlbums",
type: "toggle",
def: true,
desc: "You need to install the better-local-files app for this to work."
},
{
name: "Hide 'Your Library' Button",
key: "hideLibraryButton",
type: "toggle",
def: false,
desc: "This is experimental and may break the sidebar layout in some cases. Requires a spotify restart to take effect.",
sectionHeader: "Left Sidebar"
},
{ {
name: "Playlists Page", name: "Playlists Page",
key: "show-playlists", key: "show-playlists",
@ -909,7 +967,7 @@ var library = (() => {
main(LocalStorageAPI); main(LocalStorageAPI);
})(); })();
function main(LocalStorageAPI) { function main(LocalStorageAPI) {
const isAlbum = (props) => props.uri?.includes("album"); const isAlbum = (props) => props.uri?.includes("album") || props.id?.includes("local");
const isArtist = (props) => props.uri?.includes("artist"); const isArtist = (props) => props.uri?.includes("artist");
Spicetify.ContextMenuV2.registerItem(/* @__PURE__ */ import_react10.default.createElement(album_menu_item_default, null), isAlbum); Spicetify.ContextMenuV2.registerItem(/* @__PURE__ */ import_react10.default.createElement(album_menu_item_default, null), isAlbum);
Spicetify.ContextMenuV2.registerItem(/* @__PURE__ */ import_react10.default.createElement(artist_menu_item_default, null), isArtist); Spicetify.ContextMenuV2.registerItem(/* @__PURE__ */ import_react10.default.createElement(artist_menu_item_default, null), isArtist);
@ -926,9 +984,7 @@ var library = (() => {
if (!imageBox) if (!imageBox)
return; return;
const imageUrl = FolderImageWrapper.getFolderImage(uri); const imageUrl = FolderImageWrapper.getFolderImage(uri);
if (!imageUrl) if (imageUrl)
import_react_dom.default.render(/* @__PURE__ */ import_react10.default.createElement(FolderPlaceholder, null), imageBox);
else
import_react_dom.default.render(/* @__PURE__ */ import_react10.default.createElement(FolderImage, { import_react_dom.default.render(/* @__PURE__ */ import_react10.default.createElement(FolderImage, {
url: imageUrl url: imageUrl
}), imageBox); }), imageBox);
@ -939,7 +995,7 @@ var library = (() => {
injectFolderImages(); injectFolderImages();
FolderImageWrapper.addEventListener("update", injectFolderImages); FolderImageWrapper.addEventListener("update", injectFolderImages);
function injectYLXButtons() { function injectYLXButtons() {
const ylx_filter = document.querySelector(".main-yourLibraryX-libraryRootlist > .main-yourLibraryX-libraryFilter"); const ylx_filter = document.querySelector(".main-yourLibraryX-libraryRootlist .main-yourLibraryX-libraryFilter");
if (!ylx_filter) { if (!ylx_filter) {
return setTimeout(injectYLXButtons, 100); return setTimeout(injectYLXButtons, 100);
} }
@ -956,24 +1012,22 @@ var library = (() => {
const collapseButton = document.createElement("span"); const collapseButton = document.createElement("span");
collapseButton.classList.add("collapse-button"); collapseButton.classList.add("collapse-button");
ylx_filter.appendChild(collapseButton); ylx_filter.appendChild(collapseButton);
import_react_dom.default.render( import_react_dom.default.render(/* @__PURE__ */ import_react10.default.createElement(collapse_button_default, null), collapseButton);
/* @__PURE__ */ import_react10.default.createElement(Spicetify.ReactComponent.TooltipWrapper, {
label: "Collapse Sidebar",
placement: "top"
}, /* @__PURE__ */ import_react10.default.createElement(collapse_button_default, null)),
collapseButton
);
} }
const state = LocalStorageAPI.getItem("ylx-sidebar-state"); if (!window.SpicetifyLibrary.ConfigWrapper.Config.hideLibraryButton) {
return;
}
document.body.classList.add("hide-library-button");
const state = LocalStorageAPI.getItem("left-sidebar-state");
if (state === 0) if (state === 0)
injectYLXButtons(); injectYLXButtons();
LocalStorageAPI.getEvents()._emitter.addListener("update", (e) => { LocalStorageAPI.getEvents()._emitter.addListener("update", (e) => {
const { key, value } = e.data; const { key, value } = e.data;
if (key === "ylx-sidebar-state" && value === 0) { if (key === "left-sidebar-state" && value === 0) {
injectFolderImages(); injectFolderImages();
injectYLXButtons(); injectYLXButtons();
} }
if (key === "ylx-sidebar-state" && value === 1) { if (key === "left-sidebar-state" && value === 1) {
injectFolderImages(); injectFolderImages();
} }
}); });

File diff suppressed because it is too large Load diff

View file

@ -1,4 +1,4 @@
/* ../../../AppData/Local/Temp/tmp-4464-wbZ6O1BKhuot/19178f16f304/navBar.module.css */ /* ../../../AppData/Local/Temp/tmp-11620-eM0deEIwPFIq/1961479c6904/navBar.module.css */
.navBar-module__topBarHeaderItem___piw4C_library { .navBar-module__topBarHeaderItem___piw4C_library {
-webkit-app-region: no-drag; -webkit-app-region: no-drag;
display: inline-block; display: inline-block;
@ -46,7 +46,7 @@ div.navBar-module__topBarHeaderItemLink___xA4uv_library {
padding: 0; padding: 0;
} }
/* ../../../AppData/Local/Temp/tmp-4464-wbZ6O1BKhuot/19178f16dc80/app.css */ /* ../../../AppData/Local/Temp/tmp-11620-eM0deEIwPFIq/1961479c4ec0/app.css */
:root { :root {
--library-card-size: 180px; --library-card-size: 180px;
--library-searchbar-size: 200px; --library-searchbar-size: 200px;
@ -79,6 +79,10 @@ div.navBar-module__topBarHeaderItemLink___xA4uv_library {
#library-app .load-more-card:hover { #library-app .load-more-card:hover {
cursor: pointer; cursor: pointer;
} }
#library-app .x-filterBox-searchIcon {
--encore-icon-height: var(--encore-graphic-size-decorative-smaller);
--encore-icon-width: var(--encore-graphic-size-decorative-smaller);
}
.text-input-form { .text-input-form {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@ -104,25 +108,27 @@ div.navBar-module__topBarHeaderItemLink___xA4uv_library {
align-self: end; align-self: end;
} }
/* ../../../AppData/Local/Temp/tmp-4464-wbZ6O1BKhuot/19178f16ee21/external.css */ /* ../../../AppData/Local/Temp/tmp-11620-eM0deEIwPFIq/1961479c6341/external.css */
body:not(.show-ylx-filters) .main-yourLibraryX-filterArea:not(:has(> .main-yourLibraryX-libraryFilter)), body.hide-library-button:not(.show-ylx-filters) .main-yourLibraryX-filterArea:not(:has(> .main-yourLibraryX-libraryFilter)),
.main-yourLibraryX-header:not(:has(> .main-yourLibraryX-headerContent > .main-yourLibraryX-collapseButton > button:nth-child(2))), body.hide-library-button .main-yourLibraryX-header:not(:has(> .main-yourLibraryX-headerContent > .main-yourLibraryX-collapseButton > button:nth-child(2))),
.main-yourLibraryX-collapseButton > button:first-child, body.hide-library-button .main-yourLibraryX-collapseButton > button:first-child,
.main-yourLibraryX-headerContent > button { body.hide-library-button .main-yourLibraryX-headerContent > button {
display: none; display: none;
} }
.main-yourLibraryX-library { body.hide-library-button .main-yourLibraryX-library {
padding-top: 8px; padding-top: 8px;
} }
.main-yourLibraryX-header { body.hide-library-button .main-yourLibraryX-header {
margin-top: -8px; margin-top: -8px;
} }
.main-yourLibraryX-libraryFilter .main-yourLibraryX-librarySortWrapper button span:first-child, body.hide-library-button .main-yourLibraryX-libraryFilter {
.main-yourLibraryX-libraryFilter span[role=presentation] span[role=presentation] button span:first-child { --encore-spacing-base: 8px;
}
body.hide-library-button .main-yourLibraryX-libraryFilter span[role=presentation] button span:first-child,
body.hide-library-button .main-yourLibraryX-libraryFilter span[role=presentation] button span:first-child {
display: none; display: none;
} }
.main-yourLibraryX-libraryFilter .main-yourLibraryX-librarySortWrapper, body.hide-library-button .main-yourLibraryX-libraryFilter span[role=presentation] {
.main-yourLibraryX-libraryFilter span[role=presentation] {
margin-left: auto; margin-left: auto;
} }
.toggle-filters-button > button:after, .toggle-filters-button > button:after,
@ -236,7 +242,7 @@ li.main-yourLibraryX-navItem[data-id="/library"] > a {
transform: scale(1.04); transform: scale(1.04);
} }
/* ../../../AppData/Local/Temp/tmp-4464-wbZ6O1BKhuot/19178f16f0a2/config_modal.css */ /* ../../../AppData/Local/Temp/tmp-11620-eM0deEIwPFIq/1961479c6612/config_modal.css */
.config-container { .config-container {
gap: 10px; gap: 10px;
display: flex; display: flex;
@ -313,7 +319,7 @@ li.main-yourLibraryX-navItem[data-id="/library"] > a {
width: 200px; width: 200px;
} }
/* ../../../AppData/Local/Temp/tmp-4464-wbZ6O1BKhuot/19178f16f163/shared.css */ /* ../../../AppData/Local/Temp/tmp-11620-eM0deEIwPFIq/1961479c6713/shared.css */
.grid { .grid {
--grid-gap: 24px; --grid-gap: 24px;
grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)) !important; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)) !important;
@ -377,3 +383,10 @@ li.main-yourLibraryX-navItem[data-id="/library"] > a {
margin: 0 24px; margin: 0 24px;
border: 0px; border: 0px;
} }
.x-sortBox-sortDropdown {
fill: rgba(var(--spice-rgb-selected-row), 0.7);
}
#stats-app > :first-child,
#library-app > :first-child {
margin-top: 64px;
}

View file

@ -1,55 +0,0 @@
(async function() {
while (!Spicetify.React || !Spicetify.ReactDOM) {
await new Promise(resolve => setTimeout(resolve, 10));
}
"use strict";
var stats = (() => {
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/extensions/cache.ts
var cache_exports = {};
__export(cache_exports, {
cacher: () => cacher,
invalidator: () => invalidator
});
var cache = {};
var set = (key, value) => {
cache[key] = value;
};
var invalidate = (key) => {
delete cache[key];
};
var cacher = (cb) => {
return async ({ queryKey }) => {
const key = queryKey.join("-");
if (cache[key])
return cache[key];
const result = await cb();
set(key, result);
return result;
};
};
var invalidator = (queryKey, refetch) => {
invalidate(queryKey.join("-"));
refetch();
};
return __toCommonJS(cache_exports);
})();
})();

View file

@ -1,76 +0,0 @@
/* ../../../AppData/Local/Temp/tmp-15744-866d0PjWRxih/18d53b11b111/config_modal.css */
#config-container {
gap: 10px;
display: flex;
flex-direction: column;
}
#config-container .section-header {
box-sizing: border-box;
-webkit-tap-highlight-color: transparent;
margin-block: 0px;
font-size: 1.125rem;
font-weight: 700;
color: var(--spice-text);
}
#config-container .col.description {
box-sizing: border-box;
-webkit-tap-highlight-color: transparent;
margin-block: 0px;
font-size: 0.875rem;
font-weight: 400;
color: var(--spice-subtext);
}
#config-container .disabled {
opacity: 0;
pointer-events: none;
}
#config-container .text-input {
background: rgba(var(--spice-rgb-selected-row), 0.1);
border: 1px solid transparent;
border-radius: 4px;
color: var(--spice-text);
font-family: inherit;
font-size: 14px;
height: 32px;
padding: 0 12px;
width: 100%;
}
#config-container .text-input:focus {
background-color: var(--spice-tab-active);
border: 1px solid var(--spice-button-disabled);
outline: none;
}
#config-container .dropdown-input {
background-color: var(--spice-tab-active);
border: 0;
border-radius: 4px;
color: rgba(var(--spice-rgb-selected-row), 0.7);
font-size: 14px;
font-weight: 400;
height: 32px;
letter-spacing: 0.24px;
line-height: 20px;
padding: 0 32px 0 12px;
width: 100%;
}
#config-container .tooltip-icon {
float: right;
margin-left: 10px;
display: flex;
align-items: center;
height: 22px;
fill: var(--spice-subtext);
}
#config-container .tooltip-icon:hover {
fill: var(--spice-text);
}
#config-container .tooltip {
text-align: center;
}
#config-container .setting-row {
display: flex;
justify-content: space-between;
}
#config-container .playback-progressbar {
width: 200px;
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,10 +0,0 @@
{
"name": "Statistics",
"icon": "<svg xmlns=\"http://www.w3.org/2000/svg\"\r\n\t width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" style=\"fill:currentColor\" >\r\n<path d=\"M3,23L3,23c-0.55,0-1-0.45-1-1v-9c0-0.55,0.45-1,1-1h0c0.55,0,1,0.45,1,1v9C4,22.55,3.55,23,3,23z\"/>\r\n<path d=\"M9,23L9,23c-0.55,0-1-0.45-1-1V9c0-0.55,0.45-1,1-1h0c0.55,0,1,0.45,1,1v13C10,22.55,9.55,23,9,23z\"/>\r\n<path d=\"M15,23L15,23c-0.55,0-1-0.45-1-1V11c0-0.55,0.45-1,1-1h0c0.55,0,1,0.45,1,1v11C16,22.55,15.55,23,15,23z\"/>\r\n<path d=\"M21,23L21,23c-0.55,0-1-0.45-1-1V8c0-0.55,0.45-1,1-1h0c0.55,0,1,0.45,1,1v14C22,22.55,21.55,23,21,23z\"/>\r\n<path d=\"M22.86,1.5c-0.28-0.48-0.89-0.64-1.37-0.37l-6.54,3.74l-6-2.33C8.52,2.38,8.22,2.41,7.88,2.73L1.29,7.71\r\n\tC0.86,8.05,0.8,8.68,1.15,9.11s0.98,0.49,1.41,0.14l6.2-4.65l5.69,2.2C15,6.99,15.3,6.96,15.83,6.68l6.67-3.82\r\n\tC22.98,2.59,23.14,1.97,22.86,1.5z\"/>\r\n</svg>\r\n",
"active-icon": "<svg xmlns=\"http://www.w3.org/2000/svg\"\r\n\t width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" style=\"fill:currentColor\" >\r\n<path d=\"M3,23L3,23c-0.55,0-1-0.45-1-1v-9c0-0.55,0.45-1,1-1h0c0.55,0,1,0.45,1,1v9C4,22.55,3.55,23,3,23z\"/>\r\n<path d=\"M9,23L9,23c-0.55,0-1-0.45-1-1V9c0-0.55,0.45-1,1-1h0c0.55,0,1,0.45,1,1v13C10,22.55,9.55,23,9,23z\"/>\r\n<path d=\"M15,23L15,23c-0.55,0-1-0.45-1-1V11c0-0.55,0.45-1,1-1h0c0.55,0,1,0.45,1,1v11C16,22.55,15.55,23,15,23z\"/>\r\n<path d=\"M21,23L21,23c-0.55,0-1-0.45-1-1V8c0-0.55,0.45-1,1-1h0c0.55,0,1,0.45,1,1v14C22,22.55,21.55,23,21,23z\"/>\r\n<path d=\"M22.86,1.5c-0.28-0.48-0.89-0.64-1.37-0.37l-6.54,3.74l-6-2.33C8.52,2.38,8.22,2.41,7.88,2.73L1.29,7.71\r\n\tC0.86,8.05,0.8,8.68,1.15,9.11s0.98,0.49,1.41,0.14l6.2-4.65l5.69,2.2C15,6.99,15.3,6.96,15.83,6.68l6.67-3.82\r\n\tC22.98,2.59,23.14,1.97,22.86,1.5z\"/>\r\n</svg>\r\n",
"subfiles": [],
"subfiles_extension": [
"cache.js",
"extension.js"
]
}

View file

@ -1,311 +0,0 @@
/* ../../../AppData/Local/Temp/tmp-8216-VCWpAfv0Bkqy/1909217e9563/navBar.module.css */
.navBar-module__topBarHeaderItem___piw4C_stats {
-webkit-app-region: no-drag;
display: inline-block;
pointer-events: auto;
}
.navBar-module__topBarHeaderItemLink___xA4uv_stats {
margin: 0 8px 0 0;
}
.navBar-module__topBarActive___XhWpm_stats {
background-color: var(--spice-tab-active);
border-radius: 4px;
}
.navBar-module__topBarHeaderItemLink___xA4uv_stats {
border-radius: 4px;
color: var(--spice-text);
display: inline-block;
margin: 0 8px;
padding: 8px 16px;
position: relative;
text-decoration: none !important;
cursor: pointer;
}
.navBar-module__topBarNav___qWGeZ_stats {
-webkit-app-region: drag;
pointer-events: none;
width: 100%;
}
.navBar-module__topBarHeaderItem___piw4C_stats .navBar-module__optionsMenuDropBox___pzfNI_stats {
color: var(--spice-text);
border: 0;
max-width: 150px;
height: 42px;
padding: 0 30px 0 12px;
background-color: initial;
cursor: pointer;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
}
.navBar-module__topBarHeaderItem___piw4C_stats .navBar-module__optionsMenuDropBox___pzfNI_stats svg {
position: absolute;
margin-left: 8px;
}
div.navBar-module__topBarHeaderItemLink___xA4uv_stats {
padding: 0;
}
/* ../../../AppData/Local/Temp/tmp-8216-VCWpAfv0Bkqy/1909217e7ff0/app.css */
#stats-app .stats-gridInline {
--grid-gap: 24px;
grid-template-columns: repeat(10, 180px) !important;
overflow-x: hidden;
scroll-behavior: smooth;
margin-top: 5px;
}
#stats-app .grid:nth-child(2) {
margin-top: 24px;
}
#stats-app [data-scroll=both] {
-webkit-mask-image: linear-gradient(to right, transparent, black 10%, black 90%, transparent);
mask-image: linear-gradient(to right, transparent, black 10%, black 90%, transparent);
}
#stats-app [data-scroll=end] {
-webkit-mask-image: linear-gradient(to right, transparent, black 10%);
mask-image: linear-gradient(to right, transparent, black 10%);
}
#stats-app [data-scroll=start] {
-webkit-mask-image: linear-gradient(to right, black 90%, transparent);
mask-image: linear-gradient(to right, black 90%, transparent);
}
#stats-app .stats-libraryOverview {
display: flex;
gap: 24px;
align-items: center;
}
#stats-app .stats-trackPageTitle {
display: flex;
gap: 24px;
align-items: center;
}
#stats-app .stats-scrollButton {
width: 40px;
border-radius: 8px;
border: none;
padding: 0;
margin-right: 5px;
background-color: var(--spice-player);
color: var(--spice-subtext);
}
#stats-app .stats-scrollButton:hover {
background-color: var(--spice-card);
color: var(--spice-text);
}
#stats-app .stats-tracklistHeader > div {
display: flex;
-webkit-app-region: no-drag;
gap: 20px;
align-items: center;
}
#stats-app .stats-make-playlist-button {
margin-inline-start: 12px;
}
#stats-app .stats-genreCard {
display: flex;
flex-direction: column;
gap: 10px;
padding: 16px;
border-radius: 8px;
background: var(--spice-player);
position: relative;
}
#stats-app .stats-genreRow {
width: 100%;
height: 20px;
display: flex;
gap: 10px;
}
#stats-app .stats-genreRowFill {
background: var(--spice-button);
height: 100%;
border-radius: 8px;
display: flex;
align-items: center;
}
#stats-app .stats-genreText {
color: var(--spice-player);
font-size: 0.875rem;
margin-left: 7px;
font-weight: bold;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
#stats-app .stats-genreValue {
color: var(--spice-text);
font-size: 0.875rem;
}
#stats-app .stats-genreCard + .stats-gridInlineSection {
margin-top: 3px;
}
#stats-app .main-trackList-rowHeartButton,
#stats-app .main-trackList-rowMoreButton {
background-color: transparent;
border: none;
}
#stats-app .main-trackList-rowPlayPauseIcon {
fill: currentColor;
}
#stats-app .badge {
position: absolute;
top: 3%;
left: 3%;
height: 30px;
width: 30px;
border-radius: 50%;
background-color: rgb(65, 110, 170);
color: white;
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
}
#stats-app .extend-button {
background-color: transparent;
border: none;
position: absolute;
right: 20px;
bottom: 20px;
font-size: 14px;
color: var(--spice-subtext);
}
#stats-app .extend-button:hover {
color: var(--spice-text);
}
.GenericModal[aria-label="Playlist Stats"] .main-embedWidgetGenerator-container {
width: 80vw;
height: 80vh;
background-color: var(--spice-main);
}
.GenericModal[aria-label="Playlist Stats"] .main-shelf-title {
color: var(--spice-text);
}
/* ../../../AppData/Local/Temp/tmp-8216-VCWpAfv0Bkqy/1909217e92e1/config_modal.css */
.config-container {
gap: 10px;
display: flex;
flex-direction: column;
}
.config-container .section-header {
box-sizing: border-box;
-webkit-tap-highlight-color: transparent;
margin-block: 0px;
font-size: 1.125rem;
font-weight: 700;
color: var(--spice-text);
}
.config-container .col.description {
box-sizing: border-box;
-webkit-tap-highlight-color: transparent;
margin-block: 0px;
font-size: 0.875rem;
font-weight: 400;
color: var(--spice-subtext);
}
.config-container .disabled {
opacity: 0;
pointer-events: none;
}
.config-container .text-input {
background: rgba(var(--spice-rgb-selected-row), 0.1);
border: 1px solid transparent;
border-radius: 4px;
color: var(--spice-text);
font-family: inherit;
font-size: 14px;
height: 32px;
padding: 0 12px;
width: 100%;
}
.config-container .text-input:focus {
background-color: var(--spice-tab-active);
border: 1px solid var(--spice-button-disabled);
outline: none;
}
.config-container .dropdown-input {
background-color: var(--spice-tab-active);
border: 0;
border-radius: 4px;
color: rgba(var(--spice-rgb-selected-row), 0.7);
font-size: 14px;
font-weight: 400;
height: 32px;
letter-spacing: 0.24px;
line-height: 20px;
padding: 0 32px 0 12px;
width: 100%;
}
.config-container .tooltip-icon {
float: right;
margin-left: 10px;
display: flex;
align-items: center;
height: 22px;
fill: var(--spice-subtext);
}
.config-container .tooltip-icon:hover {
fill: var(--spice-text);
}
.config-container .tooltip {
text-align: center;
}
.config-container .setting-row {
display: flex;
justify-content: space-between;
}
.config-container .playback-progressbar {
width: 200px;
}
/* ../../../AppData/Local/Temp/tmp-8216-VCWpAfv0Bkqy/1909217e93c2/shared.css */
.grid {
--grid-gap: 24px;
grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)) !important;
}
.loadingWrapper {
display: flex;
justify-content: center;
align-items: center;
min-height: 60vh;
flex-direction: column;
gap: 16px;
}
.loadingWrapper .status-icon {
width: 40px;
height: 40px;
fill: currentColor;
}
.page-content {
display: flex;
flex-direction: column;
gap: 24px;
}
.page-header {
align-content: space-between;
align-items: center;
display: flex;
justify-content: space-between;
margin: 16px 0;
}
.page-header .header-right,
.page-header .header-left {
display: flex;
align-items: center;
gap: 8px;
}
.page-header .header-right {
justify-content: flex-end;
}
.page-header .header-left {
justify-content: flex-start;
}
.new-update {
background-color: var(--spice-player);
color: var(--spice-text);
border-radius: 8px;
padding: 2px 12px;
margin: 0 24px;
border: 0px;
}

View file

@ -22,11 +22,11 @@ sidebar_config = 0
home_config = 1 home_config = 1
experimental_features = 1 experimental_features = 1
extensions = extensions =
custom_apps = library|lyrics-plus|marketplace|stats custom_apps = library|lyrics-plus|marketplace
[Patch] [Patch]
; DO NOT CHANGE! ; DO NOT CHANGE!
[Backup] [Backup]
version = 1.2.59.514.g834e17d4 version = 1.2.59.514.g834e17d4
with = 2.39.5 with = 2.39.6