Use opensubsonic types in module and code
This commit is contained in:
parent
b0ec1c7d56
commit
7488b7cfeb
2 changed files with 54 additions and 35 deletions
|
@ -10,17 +10,28 @@ export module OpenSubsonic {
|
|||
const apiVer = "1.16.1"; // Version supported by Navidrome. Variable for easier updating
|
||||
const clientName = "Lydstyrke";
|
||||
|
||||
export async function get(path: string, parameters: {parameter: string, value: string}[] = []) {
|
||||
export async function get(path: string, parameters: Array<Parameter> = []) {
|
||||
const apiPath = getApiUrl(path, parameters);
|
||||
const res = (await fetch(apiPath));
|
||||
if (res.ok) {
|
||||
switch (res.headers.get("content-type")) {
|
||||
const contentType =res.headers.get("content-type");
|
||||
switch (contentType) {
|
||||
case("application/json"): {
|
||||
return (await res.json())["subsonic-response"];
|
||||
}
|
||||
case("audio/mp4"): {
|
||||
return res;
|
||||
}
|
||||
case("image/jpeg"): {
|
||||
return res;
|
||||
}
|
||||
case("image/png"): {
|
||||
return res;
|
||||
}
|
||||
default: {
|
||||
|
||||
console.warn(`Content Type: '${contentType}' is not supported`)
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
@ -28,10 +39,10 @@ export module OpenSubsonic {
|
|||
}
|
||||
}
|
||||
|
||||
export function getApiUrl(path: string, parameters: {parameter: string, value: string}[] = []) {
|
||||
export function getApiUrl(path: string, parameters: Array<Parameter> = []) {
|
||||
let apiPath = generateBasePath(path);
|
||||
parameters.forEach(({parameter, value}) => {
|
||||
apiPath = apiPath + `&${parameter}=${value}`;
|
||||
parameters.forEach((parameter) => {
|
||||
apiPath = apiPath + `&${parameter.key}=${parameter.value}`;
|
||||
})
|
||||
|
||||
return apiPath;
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
<svelte:options runes={true} />
|
||||
|
||||
<script lang="ts">
|
||||
import {OpenSubsonic} from "$lib/opensubsonic";
|
||||
import {
|
||||
type Parameter, type Song, type NowPlayingResponse, type GetPlayQueueResponse,
|
||||
OpenSubsonic
|
||||
} from "$lib/opensubsonic";
|
||||
import {onMount} from "svelte";
|
||||
import QueueFrame from "$lib/components/custom/QueueFrame.svelte";
|
||||
import {Button} from "$lib/components/ui/button";
|
||||
|
@ -31,18 +34,18 @@
|
|||
let progress = $state(0);
|
||||
let duration = $state(0);
|
||||
|
||||
let queue: Array<unknown> = $state([]);
|
||||
let queue: Array<Song> = $state([]);
|
||||
|
||||
async function fetchQueue() {
|
||||
const data = await OpenSubsonic.get("getPlayQueue");
|
||||
if (data) {
|
||||
const data: GetPlayQueueResponse = await OpenSubsonic.get("getPlayQueue");
|
||||
if (data && data.playQueue.entry) {
|
||||
queue = [];
|
||||
queue = queue.concat(data.playQueue.entry);
|
||||
}
|
||||
}
|
||||
|
||||
async function fetchNowPlaying() {
|
||||
const data = await OpenSubsonic.get("getNowPlaying");
|
||||
const data: NowPlayingResponse = await OpenSubsonic.get("getNowPlaying");
|
||||
let foundInNowPlaying = false;
|
||||
if (data && data.nowPlaying.entry) {
|
||||
data.nowPlaying.entry.forEach((entry) => {
|
||||
|
@ -59,18 +62,23 @@
|
|||
}
|
||||
|
||||
async function saveQueue() {
|
||||
let songs = [];
|
||||
let songs: Array<Parameter> = [];
|
||||
|
||||
if (queue.length === 0) {
|
||||
songs.push({key: "id", value: ""})
|
||||
}
|
||||
else {
|
||||
queue.forEach((song, idx) => {
|
||||
if (idx === 0) {
|
||||
songs.push({parameter: "current", value: song.id})
|
||||
songs.push({parameter: "id", value: song.id})
|
||||
songs.push({key: "current", value: song.id})
|
||||
songs.push({key: "id", value: song.id})
|
||||
// Add Progress within current song
|
||||
}
|
||||
else {
|
||||
songs.push({parameter: "id", value: song.id})
|
||||
songs.push({key: "id", value: song.id})
|
||||
}
|
||||
})
|
||||
}
|
||||
const data = await OpenSubsonic.get("savePlayQueue", songs);
|
||||
if (data) {
|
||||
await fetchQueue();
|
||||
|
@ -83,22 +91,22 @@
|
|||
}
|
||||
}
|
||||
|
||||
function playSong(song: unknown, songIndex: number) {
|
||||
function playSong(song: Song, songIndex: number) {
|
||||
pause();
|
||||
newSong(song);
|
||||
currentSong.queueIndex = songIndex;
|
||||
play();
|
||||
}
|
||||
|
||||
function newSong(song: unknown) {
|
||||
let parameters = [
|
||||
{ parameter: "id", value: song.id },
|
||||
//{ parameter: "maxBitRate", value: } // TODO
|
||||
//{ parameter: "format", value: } // TODO
|
||||
//{ parameter: "timeOffset", value: } // TODO? Only Video related
|
||||
//{ parameter: "size", value: } // TODO? Only Video related
|
||||
{ parameter: "estimateContentLength", value: "true" },
|
||||
//{ parameter: "converted", value: } // TODO? Only Video related
|
||||
function newSong(song: Song) {
|
||||
let parameters: Array<Parameter> = [
|
||||
{ key: "id", value: song.id },
|
||||
//{ key: "maxBitRate", value: } // TODO
|
||||
//{ key: "format", value: } // TODO
|
||||
//{ key: "timeOffset", value: } // TODO? Only Video related
|
||||
//{ key: "size", value: } // TODO? Only Video related
|
||||
{ key: "estimateContentLength", value: "true" },
|
||||
//{ key: "converted", value: } // TODO? Only Video related
|
||||
];
|
||||
let url = OpenSubsonic.getApiUrl("stream", parameters);
|
||||
currentSong.source = new Audio(url); // Assign new URL
|
||||
|
@ -113,10 +121,10 @@
|
|||
currentSong.source.volume = volume;
|
||||
isPaused = currentSong.source.paused;
|
||||
let time: number = Date.now();
|
||||
let parameters = [
|
||||
{ parameter: "id", value: song.id },
|
||||
{ parameter: "time", value: time},
|
||||
{ parameter: "submission", value: false}
|
||||
let parameters: Array<Parameter> = [
|
||||
{ key: "id", value: song.id },
|
||||
{ key: "time", value: time},
|
||||
{ key: "submission", value: false}
|
||||
];
|
||||
OpenSubsonic.get("scrobble", parameters);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue