diff --git a/src/app.tsx b/src/app.tsx index 57bd666..3bb7973 100644 --- a/src/app.tsx +++ b/src/app.tsx @@ -1,11 +1,10 @@ import React from "react"; import { Api, Jellyfin } from "@jellyfin/sdk"; +import { getUserApi } from "@jellyfin/sdk/lib/utils/api/user-api"; import { getSearchApi } from "@jellyfin/sdk/lib/utils/api/search-api"; import { BaseItemKind } from "@jellyfin/sdk/lib/generated-client/models"; import SettingsModal from "./settings"; -let hijackActive = false; - export const jellyfin = new Jellyfin({ clientInfo: { name: "Spicetify", @@ -26,11 +25,31 @@ export const setJellyfinUser = (id: string) => { jellyfinUser = id; }; +let hijackActive = false; + async function main() { while (!Spicetify.showNotification) { await new Promise((resolve) => setTimeout(resolve, 100)); } + // Automatically login to Jellyfin if settings are present + const url = Spicetify.LocalStorage.get("jellyfin-url"); + const token = Spicetify.LocalStorage.get("jellyfin-token"); + + if (url && token) { + const servers = await jellyfin.discovery.getRecommendedServerCandidates(url); + const best = jellyfin.discovery.findBestServer(servers); + if (!best) { + Spicetify.showNotification("Failed to connect to Jellyfin server!", true); + return; + } + jellyfinApi = jellyfin.createApi(best.address); + jellyfinApi.accessToken = token; + + const user = await getUserApi(jellyfinApi).getCurrentUser(); + if (user.data.Id) setJellyfinUser(user.data.Id); + } + const audio = new Audio(); // Topbar button for settings diff --git a/src/settings.tsx b/src/settings.tsx index d0d6593..d5bec08 100644 --- a/src/settings.tsx +++ b/src/settings.tsx @@ -3,17 +3,16 @@ import React, { useEffect, useState } from "react"; import { getQuickConnectApi } from "@jellyfin/sdk/lib/utils/api/quick-connect-api"; import { getUserApi } from "@jellyfin/sdk/lib/utils/api/user-api"; -import { jellyfin, jellyfinApi, setJellyfinApi, setJellyfinUser } from "./app"; +import { jellyfin, jellyfinApi, jellyfinUser, setJellyfinApi, setJellyfinUser } from "./app"; import styles from "./styles.module.css"; -type View = "url" | "password" | "quick-connect"; +type View = "url" | "password" | "quick-connect" | "settings"; export default function SettingsModal() { - const [isLoggedIn, setIsLoggedIn] = useState(false); const [url, setUrl] = useState(Spicetify.LocalStorage.get("jellyfin-url") || ""); const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); - const [view, setView] = useState("url"); + const [view, setView] = useState(jellyfinUser ? "settings" : "url"); const [quickConnectCode, setQuickConnectCode] = useState(""); const createApi = async () => { @@ -42,16 +41,18 @@ export default function SettingsModal() { return; } - jellyfinApi!.accessToken = auth.data.AccessToken; + jellyfinApi.accessToken = auth.data.AccessToken; Spicetify.LocalStorage.set("jellyfin-token", auth.data.AccessToken); - const user = await getUserApi(jellyfinApi!).getCurrentUser(); - if (user.data.Id) { - setJellyfinUser(user.data.Id!); - Spicetify.LocalStorage.set("jellyfin-user", user.data.Id!); - } + const user = await getUserApi(jellyfinApi).getCurrentUser(); + if (user.data.Id) setJellyfinUser(user.data.Id); - setIsLoggedIn(true); + setView("settings"); + }; + + const logout = () => { + Spicetify.LocalStorage.remove("jellyfin-token"); + setView("url"); }; useEffect(() => { @@ -93,12 +94,9 @@ export default function SettingsModal() { Spicetify.LocalStorage.set("jellyfin-token", auth.data.AccessToken); const user = await getUserApi(jellyfinApi!).getCurrentUser(); - if (user.data.Id) { - setJellyfinUser(user.data.Id!); - Spicetify.LocalStorage.set("jellyfin-user", user.data.Id!); - } + if (user.data.Id) setJellyfinUser(user.data.Id); - setIsLoggedIn(true); + setView("settings"); } catch { clearInterval(interval); Spicetify.showNotification("Quick Connect polling failed!", true); @@ -110,7 +108,7 @@ export default function SettingsModal() { return () => clearInterval(interval); }, [view]); - if (isLoggedIn) + if (view === "settings") return (
@@ -151,13 +149,7 @@ export default function SettingsModal() {
-