72 lines
2.2 KiB
TypeScript
72 lines
2.2 KiB
TypeScript
import { createFileRoute } from "@tanstack/react-router";
|
|
import { SpotifyWebApiClient } from "@/lib/spotify/client";
|
|
import type { SpotifyPlaybackSnapshot } from "@/lib/spotify/types";
|
|
|
|
export const Route = createFileRoute("/api/spotify/resume")({
|
|
server: {
|
|
handlers: {
|
|
POST: async ({ request }: { request: Request }) => {
|
|
try {
|
|
const cookies = request.headers.get("Cookie") || "";
|
|
const accessTokenMatch = cookies.match(
|
|
/spotify_access_token=([^;]+)/
|
|
);
|
|
|
|
if (!accessTokenMatch) {
|
|
return new Response(
|
|
JSON.stringify({ error: "No access token found" }),
|
|
{
|
|
status: 401,
|
|
headers: { "Content-Type": "application/json" },
|
|
}
|
|
);
|
|
}
|
|
|
|
const accessToken = decodeURIComponent(accessTokenMatch[1]);
|
|
const spotifyClient = new SpotifyWebApiClient(accessToken);
|
|
|
|
const body = await request.json();
|
|
const { snapshot } = body as { snapshot: SpotifyPlaybackSnapshot };
|
|
|
|
if (!snapshot) {
|
|
return new Response(
|
|
JSON.stringify({ error: "No snapshot provided" }),
|
|
{
|
|
status: 400,
|
|
headers: { "Content-Type": "application/json" },
|
|
}
|
|
);
|
|
}
|
|
|
|
await spotifyClient.restorePlaybackSnapshot(snapshot);
|
|
|
|
return new Response(JSON.stringify({ success: true }), {
|
|
status: 200,
|
|
headers: { "Content-Type": "application/json" },
|
|
});
|
|
} catch (error) {
|
|
console.error("Spotify resume error:", error);
|
|
|
|
let errorMessage = "Failed to resume playback state";
|
|
|
|
if (error instanceof Error) {
|
|
if (
|
|
error.message.includes("Premium") ||
|
|
error.message.includes("403")
|
|
) {
|
|
errorMessage = "Spotify premium required";
|
|
} else {
|
|
errorMessage = error.message;
|
|
}
|
|
}
|
|
|
|
return new Response(JSON.stringify({ error: errorMessage }), {
|
|
status: 500,
|
|
headers: { "Content-Type": "application/json" },
|
|
});
|
|
}
|
|
},
|
|
},
|
|
},
|
|
});
|