mirror of
https://github.com/gethomepage/homepage.git
synced 2025-11-23 06:52:57 -05:00
Feature: Your spotify widget (#5813)
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
This commit is contained in:
parent
4028194830
commit
02089a35ee
28
docs/widgets/services/yourspotify.md
Normal file
28
docs/widgets/services/yourspotify.md
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
---
|
||||||
|
title: Your Spotify
|
||||||
|
description: Your Spotify Widget Configuration
|
||||||
|
---
|
||||||
|
|
||||||
|
Learn more about [Your Spotify](https://github.com/Yooooomi/your_spotify).
|
||||||
|
|
||||||
|
Find your API key under `Settings > Account > Public token`, click `Generate` if not yet generated, copy key after
|
||||||
|
`?token=`.
|
||||||
|
|
||||||
|
Allowed fields: `["songs", "time", "artists"]`.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
widget:
|
||||||
|
type: yourspotify
|
||||||
|
url: http://your-spotify-server.host.or.ip # if using lsio image, add /api/
|
||||||
|
key: apikeyapikeyapikeyapikeyapikey
|
||||||
|
interval: month # optional, defaults to week
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Interval
|
||||||
|
|
||||||
|
Allowed values for `interval`: `day`, `week`, `month`, `year`, `all`.
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
|
||||||
|
`interval` is different from predefined intervals you see in `Your Spotify`'s UI.
|
||||||
|
For example, `This week` in UI means _from the start of this week_, here `week` means _past 7 days_.
|
||||||
@ -176,6 +176,7 @@ nav:
|
|||||||
- widgets/services/wgeasy.md
|
- widgets/services/wgeasy.md
|
||||||
- widgets/services/whatsupdocker.md
|
- widgets/services/whatsupdocker.md
|
||||||
- widgets/services/xteve.md
|
- widgets/services/xteve.md
|
||||||
|
- widgets/services/yourspotify.md
|
||||||
- widgets/services/zabbix.md
|
- widgets/services/zabbix.md
|
||||||
- "Information Widgets":
|
- "Information Widgets":
|
||||||
- widgets/info/index.md
|
- widgets/info/index.md
|
||||||
|
|||||||
@ -1114,5 +1114,10 @@
|
|||||||
"num_success_latest": "Succeeding",
|
"num_success_latest": "Succeeding",
|
||||||
"num_failure_latest": "Failing",
|
"num_failure_latest": "Failing",
|
||||||
"bytes_added_30": "Bytes Added"
|
"bytes_added_30": "Bytes Added"
|
||||||
|
},
|
||||||
|
"yourspotify": {
|
||||||
|
"songs": "Songs",
|
||||||
|
"time": "Time",
|
||||||
|
"artists": "Artists"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -408,6 +408,9 @@ export function cleanServiceGroups(groups) {
|
|||||||
// wgeasy
|
// wgeasy
|
||||||
threshold,
|
threshold,
|
||||||
|
|
||||||
|
// yourspotify
|
||||||
|
interval,
|
||||||
|
|
||||||
// technitium
|
// technitium
|
||||||
range,
|
range,
|
||||||
|
|
||||||
@ -623,6 +626,11 @@ export function cleanServiceGroups(groups) {
|
|||||||
if (pool3) widget.pool3 = pool3;
|
if (pool3) widget.pool3 = pool3;
|
||||||
if (pool4) widget.pool4 = pool4;
|
if (pool4) widget.pool4 = pool4;
|
||||||
}
|
}
|
||||||
|
if (type === "yourspotify") {
|
||||||
|
if (interval !== undefined) {
|
||||||
|
widget.interval = interval;
|
||||||
|
}
|
||||||
|
}
|
||||||
return widget;
|
return widget;
|
||||||
});
|
});
|
||||||
return cleanedService;
|
return cleanedService;
|
||||||
|
|||||||
@ -150,6 +150,7 @@ const components = {
|
|||||||
wgeasy: dynamic(() => import("./wgeasy/component")),
|
wgeasy: dynamic(() => import("./wgeasy/component")),
|
||||||
whatsupdocker: dynamic(() => import("./whatsupdocker/component")),
|
whatsupdocker: dynamic(() => import("./whatsupdocker/component")),
|
||||||
xteve: dynamic(() => import("./xteve/component")),
|
xteve: dynamic(() => import("./xteve/component")),
|
||||||
|
yourspotify: dynamic(() => import("./yourspotify/component")),
|
||||||
zabbix: dynamic(() => import("./zabbix/component")),
|
zabbix: dynamic(() => import("./zabbix/component")),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -141,6 +141,7 @@ import watchtower from "./watchtower/widget";
|
|||||||
import wgeasy from "./wgeasy/widget";
|
import wgeasy from "./wgeasy/widget";
|
||||||
import whatsupdocker from "./whatsupdocker/widget";
|
import whatsupdocker from "./whatsupdocker/widget";
|
||||||
import xteve from "./xteve/widget";
|
import xteve from "./xteve/widget";
|
||||||
|
import yourspotify from "./yourspotify/widget";
|
||||||
import zabbix from "./zabbix/widget";
|
import zabbix from "./zabbix/widget";
|
||||||
|
|
||||||
const widgets = {
|
const widgets = {
|
||||||
@ -291,6 +292,7 @@ const widgets = {
|
|||||||
wgeasy,
|
wgeasy,
|
||||||
whatsupdocker,
|
whatsupdocker,
|
||||||
xteve,
|
xteve,
|
||||||
|
yourspotify,
|
||||||
zabbix,
|
zabbix,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
76
src/widgets/yourspotify/component.jsx
Normal file
76
src/widgets/yourspotify/component.jsx
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
import Block from "components/services/widget/block";
|
||||||
|
import Container from "components/services/widget/container";
|
||||||
|
import { useTranslation } from "next-i18next";
|
||||||
|
import { useMemo } from "react";
|
||||||
|
|
||||||
|
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||||
|
|
||||||
|
function getStartDate(interval) {
|
||||||
|
const d = new Date();
|
||||||
|
switch (interval) {
|
||||||
|
case "day":
|
||||||
|
d.setDate(d.getDate() - 1);
|
||||||
|
break;
|
||||||
|
case "week":
|
||||||
|
d.setDate(d.getDate() - 7);
|
||||||
|
break;
|
||||||
|
case "month":
|
||||||
|
d.setMonth(d.getMonth() - 1);
|
||||||
|
break;
|
||||||
|
case "year":
|
||||||
|
d.setFullYear(d.getFullYear() - 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return d.toISOString();
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function Component({ service }) {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const { widget } = service;
|
||||||
|
|
||||||
|
const interval = widget?.interval || "week";
|
||||||
|
|
||||||
|
const date = useMemo(() => {
|
||||||
|
return interval === "all" ? "2006-04-23T00:00:00.000Z" : getStartDate(interval);
|
||||||
|
}, [interval]);
|
||||||
|
|
||||||
|
const params = {
|
||||||
|
timeSplit: "all",
|
||||||
|
start: date,
|
||||||
|
};
|
||||||
|
|
||||||
|
const { data: songsListened, error: songsError } = useWidgetAPI(widget, "songs", params);
|
||||||
|
const { data: timeListened, error: timeError } = useWidgetAPI(widget, "time", params);
|
||||||
|
const { data: artistsListened, error: artistsError } = useWidgetAPI(widget, "artists", params);
|
||||||
|
|
||||||
|
if (songsError || timeError || artistsError) {
|
||||||
|
return <Container service={service} error={songsError ?? timeError ?? artistsError} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isNaN(songsListened) || isNaN(timeListened) || isNaN(artistsListened)) {
|
||||||
|
return (
|
||||||
|
<Container service={service}>
|
||||||
|
<Block label="yourspotify.songs" />
|
||||||
|
<Block label="yourspotify.time" />
|
||||||
|
<Block label="yourspotify.artists" />
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Container service={service}>
|
||||||
|
<Block label="yourspotify.songs" value={t("common.number", { value: songsListened })} />
|
||||||
|
|
||||||
|
<Block
|
||||||
|
label="yourspotify.time"
|
||||||
|
value={t(
|
||||||
|
timeListened > 0 ? "common.duration" : "common.number", // Display 0 if duration is 0
|
||||||
|
{
|
||||||
|
value: timeListened / 1000,
|
||||||
|
},
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<Block label="yourspotify.artists" value={t("common.number", { value: artistsListened })} />
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
27
src/widgets/yourspotify/widget.js
Normal file
27
src/widgets/yourspotify/widget.js
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
import { asJson } from "utils/proxy/api-helpers";
|
||||||
|
import genericProxyHandler from "utils/proxy/handlers/generic";
|
||||||
|
|
||||||
|
const widget = {
|
||||||
|
api: "{url}/spotify/{endpoint}?token={key}",
|
||||||
|
proxyHandler: genericProxyHandler,
|
||||||
|
|
||||||
|
mappings: {
|
||||||
|
songs: {
|
||||||
|
endpoint: "songs_per",
|
||||||
|
params: ["start", "timeSplit"],
|
||||||
|
map: (data) => asJson(data)[0]?.count || 0,
|
||||||
|
},
|
||||||
|
time: {
|
||||||
|
endpoint: "time_per",
|
||||||
|
params: ["start", "timeSplit"],
|
||||||
|
map: (data) => asJson(data)[0]?.count || 0,
|
||||||
|
},
|
||||||
|
artists: {
|
||||||
|
endpoint: "different_artists_per",
|
||||||
|
params: ["start", "timeSplit"],
|
||||||
|
map: (data) => asJson(data)[0]?.artists?.length || 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default widget;
|
||||||
Loading…
x
Reference in New Issue
Block a user