mirror of
https://github.com/trafficlunar/jellyfin-spicetify.git
synced 2026-06-13 19:07:06 +00:00
feat: loading indicators, copy quick connect code
Also adds .editorconfig, formats most files, and remove archive false on workflow until nightly.link adds support for it
This commit is contained in:
parent
eee96c84af
commit
71c62c3f07
15 changed files with 2878 additions and 2817 deletions
148
src/player.ts
148
src/player.ts
|
|
@ -7,99 +7,99 @@ export let hijackActive = false;
|
|||
export let currentVolume = 0.5;
|
||||
|
||||
export function setHijackActive(value: boolean) {
|
||||
hijackActive = value;
|
||||
hijackActive = value;
|
||||
}
|
||||
export function setCurrentVolume(value: number) {
|
||||
currentVolume = value;
|
||||
currentVolume = value;
|
||||
}
|
||||
|
||||
export async function playTrack(id: string) {
|
||||
const oldVolume = Spicetify.Player.getVolume();
|
||||
Spicetify.Player.setVolume(0); // Set Spotify audio volume to 0
|
||||
const oldVolume = Spicetify.Player.getVolume();
|
||||
Spicetify.Player.setVolume(0); // Set Spotify audio volume to 0
|
||||
|
||||
setHijackActive(true);
|
||||
audio.src = `${jellyfin.api?.basePath}/Audio/${id}/universal?api_key=${jellyfin.api?.accessToken}&UserId=${jellyfin.user}&Container=flac,aac,mp3&AudioCodec=flac,aac&MaxStreamingBitrate=140000000&EnableRedirection=true`;
|
||||
await audio.play();
|
||||
setHijackActive(true);
|
||||
audio.src = `${jellyfin.api?.basePath}/Audio/${id}/universal?api_key=${jellyfin.api?.accessToken}&UserId=${jellyfin.user}&Container=flac,aac,mp3&AudioCodec=flac,aac&MaxStreamingBitrate=140000000&EnableRedirection=true`;
|
||||
await audio.play();
|
||||
|
||||
Spicetify.Player.setVolume(oldVolume); // Volume is now hijacked, will now set Jellyfin audio volume and also update the volume slider
|
||||
Spicetify.Player.setVolume(oldVolume); // Volume is now hijacked, will now set Jellyfin audio volume and also update the volume slider
|
||||
}
|
||||
|
||||
export function registerEvents() {
|
||||
// Search Jellyfin for song and play that instead if found
|
||||
Spicetify.Player.addEventListener("songchange", async (event) => {
|
||||
if (!jellyfin.api) return;
|
||||
if (!event) return;
|
||||
// Search Jellyfin for song and play that instead if found
|
||||
Spicetify.Player.addEventListener("songchange", async (event) => {
|
||||
if (!jellyfin.api) return;
|
||||
if (!event) return;
|
||||
|
||||
const results = await getSearchApi(jellyfin.api).getSearchHints({
|
||||
searchTerm: event.data.item.name,
|
||||
includeItemTypes: [BaseItemKind.Audio],
|
||||
limit: 1,
|
||||
});
|
||||
const results = await getSearchApi(jellyfin.api).getSearchHints({
|
||||
searchTerm: event.data.item.name,
|
||||
includeItemTypes: [BaseItemKind.Audio],
|
||||
limit: 1,
|
||||
});
|
||||
|
||||
const item = results.data.SearchHints?.[0];
|
||||
if (!item?.Id) {
|
||||
setHijackActive(false);
|
||||
audio.pause();
|
||||
Spicetify.Player.setVolume(currentVolume);
|
||||
return;
|
||||
}
|
||||
const item = results.data.SearchHints?.[0];
|
||||
if (!item?.Id) {
|
||||
setHijackActive(false);
|
||||
audio.pause();
|
||||
Spicetify.Player.setVolume(currentVolume);
|
||||
return;
|
||||
}
|
||||
|
||||
Spicetify.showNotification("Playing on Jellyfin");
|
||||
playTrack(item.Id);
|
||||
});
|
||||
Spicetify.showNotification("Playing on Jellyfin");
|
||||
playTrack(item.Id);
|
||||
});
|
||||
|
||||
// Play/pause Jellyfin audio
|
||||
Spicetify.Player.addEventListener("onplaypause", async (event) => {
|
||||
if (!hijackActive) return;
|
||||
// Play/pause Jellyfin audio
|
||||
Spicetify.Player.addEventListener("onplaypause", async (event) => {
|
||||
if (!hijackActive) return;
|
||||
|
||||
if (event?.data.isPaused) {
|
||||
audio.pause();
|
||||
} else {
|
||||
await audio.play();
|
||||
}
|
||||
if (event?.data.isPaused) {
|
||||
audio.pause();
|
||||
} else {
|
||||
await audio.play();
|
||||
}
|
||||
|
||||
Spicetify.Player.setVolume(currentVolume);
|
||||
});
|
||||
Spicetify.Player.setVolume(currentVolume);
|
||||
});
|
||||
|
||||
// Seeking support
|
||||
let oldTime = 0;
|
||||
Spicetify.Player.addEventListener("onprogress", async (event) => {
|
||||
if (!hijackActive) return;
|
||||
if (!event) return;
|
||||
// Seeking support
|
||||
let oldTime = 0;
|
||||
Spicetify.Player.addEventListener("onprogress", async (event) => {
|
||||
if (!hijackActive) return;
|
||||
if (!event) return;
|
||||
|
||||
// onprogress polls every 100ms, small time difference means normal playback
|
||||
const timeDiff = Math.abs(event.data - oldTime);
|
||||
if (Math.abs(timeDiff - 100) < 100) {
|
||||
// Allow 100ms tolerance
|
||||
oldTime = event.data;
|
||||
return;
|
||||
}
|
||||
// onprogress polls every 100ms, small time difference means normal playback
|
||||
const timeDiff = Math.abs(event.data - oldTime);
|
||||
if (Math.abs(timeDiff - 100) < 100) {
|
||||
// Allow 100ms tolerance
|
||||
oldTime = event.data;
|
||||
return;
|
||||
}
|
||||
|
||||
audio.currentTime = event.data / 1000;
|
||||
oldTime = event.data;
|
||||
});
|
||||
audio.currentTime = event.data / 1000;
|
||||
oldTime = event.data;
|
||||
});
|
||||
|
||||
// Change volume of Jellyfin audio instead of Spotify audio
|
||||
const playback = Spicetify.Platform.PlaybackAPI;
|
||||
playback.getVolume = new Proxy(playback.getVolume, {
|
||||
apply(target, thisArg, args) {
|
||||
if (hijackActive) {
|
||||
return currentVolume;
|
||||
}
|
||||
return Reflect.apply(target, thisArg, args);
|
||||
},
|
||||
});
|
||||
playback.setVolume = new Proxy(playback.setVolume, {
|
||||
apply(target, thisArg, args) {
|
||||
if (hijackActive) {
|
||||
setCurrentVolume(args[0]);
|
||||
audio.volume = Math.pow(currentVolume, 3);
|
||||
// Change volume of Jellyfin audio instead of Spotify audio
|
||||
const playback = Spicetify.Platform.PlaybackAPI;
|
||||
playback.getVolume = new Proxy(playback.getVolume, {
|
||||
apply(target, thisArg, args) {
|
||||
if (hijackActive) {
|
||||
return currentVolume;
|
||||
}
|
||||
return Reflect.apply(target, thisArg, args);
|
||||
},
|
||||
});
|
||||
playback.setVolume = new Proxy(playback.setVolume, {
|
||||
apply(target, thisArg, args) {
|
||||
if (hijackActive) {
|
||||
setCurrentVolume(args[0]);
|
||||
audio.volume = Math.pow(currentVolume, 3);
|
||||
|
||||
const volumeSlider: HTMLDivElement | null = document.querySelector(".volume-bar__slider-container > div > div");
|
||||
if (volumeSlider) volumeSlider.style.setProperty("--progress-bar-transform", `${currentVolume * 100}%`);
|
||||
return;
|
||||
}
|
||||
return Reflect.apply(target, thisArg, args);
|
||||
},
|
||||
});
|
||||
const volumeSlider: HTMLDivElement | null = document.querySelector(".volume-bar__slider-container > div > div");
|
||||
if (volumeSlider) volumeSlider.style.setProperty("--progress-bar-transform", `${currentVolume * 100}%`);
|
||||
return;
|
||||
}
|
||||
return Reflect.apply(target, thisArg, args);
|
||||
},
|
||||
});
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue