last.fm? yup!
This commit is contained in:
parent
e702bdb4e8
commit
c0658e9f40
|
@ -1,3 +1,4 @@
|
||||||
|
import { LastfmWidget } from "./lastfm.js";
|
||||||
import { NotificationPopups } from "./notificationPopups.js";
|
import { NotificationPopups } from "./notificationPopups.js";
|
||||||
import { StatusWidget } from "./status.js";
|
import { StatusWidget } from "./status.js";
|
||||||
|
|
||||||
|
@ -202,6 +203,7 @@ App.config({
|
||||||
style: "./style.css",
|
style: "./style.css",
|
||||||
windows: [
|
windows: [
|
||||||
StatusWidget(1),
|
StatusWidget(1),
|
||||||
|
LastfmWidget(1),
|
||||||
Bar(0),
|
Bar(0),
|
||||||
Bar(1),
|
Bar(1),
|
||||||
NotificationPopups(0),
|
NotificationPopups(0),
|
||||||
|
|
124
src/.config/ags/lastfm.js
Normal file
124
src/.config/ags/lastfm.js
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
export function timeAgo(input) {
|
||||||
|
const date = input instanceof Date ? input : new Date(input);
|
||||||
|
const formatter = new Intl.RelativeTimeFormat("en");
|
||||||
|
const ranges = [
|
||||||
|
["years", 3600 * 24 * 365],
|
||||||
|
["months", 3600 * 24 * 30],
|
||||||
|
["weeks", 3600 * 24 * 7],
|
||||||
|
["days", 3600 * 24],
|
||||||
|
["hours", 3600],
|
||||||
|
["minutes", 60],
|
||||||
|
["seconds", 1],
|
||||||
|
];
|
||||||
|
const secondsElapsed = (date.getTime() - Date.now()) / 1000;
|
||||||
|
|
||||||
|
for (const [rangeType, rangeVal] of ranges) {
|
||||||
|
//@ts-expect-error
|
||||||
|
if (rangeVal < Math.abs(secondsElapsed)) {
|
||||||
|
//@ts-expect-error
|
||||||
|
const delta = secondsElapsed / rangeVal;
|
||||||
|
//@ts-expect-error
|
||||||
|
|
||||||
|
return formatter.format(Math.round(delta), rangeType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const lastFM = {
|
||||||
|
apiKey: "816cfe50ddeeb73c9987b85de5c19e71",
|
||||||
|
constructUrl: (method, parameters) => {
|
||||||
|
const defaultParams = {
|
||||||
|
format: "json",
|
||||||
|
api_key: lastFM.apiKey,
|
||||||
|
method,
|
||||||
|
};
|
||||||
|
|
||||||
|
Object.assign(parameters, defaultParams);
|
||||||
|
|
||||||
|
return (
|
||||||
|
"https://ws.audioscrobbler.com/2.0/?" +
|
||||||
|
Object.entries(parameters)
|
||||||
|
.map((z) => z[0] + "=" + z[1])
|
||||||
|
.join("&")
|
||||||
|
);
|
||||||
|
},
|
||||||
|
getRecentTracks: async (user) => {
|
||||||
|
const request = await Utils.fetch(
|
||||||
|
lastFM.constructUrl("User.getrecenttracks", { user, limit: 1 })
|
||||||
|
);
|
||||||
|
return await request.json();
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export function LastfmWidget(monitor = 0) {
|
||||||
|
function generateCSS(image = "https://placehold.co/300x300") {
|
||||||
|
return (
|
||||||
|
`background-image: url("${image}");` +
|
||||||
|
"background-size: contain;" +
|
||||||
|
"background-repeat: no-repeat;" +
|
||||||
|
"background-position: center;"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const imagebox = Widget.Box({
|
||||||
|
widthRequest: 150,
|
||||||
|
heightRequest: 150,
|
||||||
|
css: generateCSS(),
|
||||||
|
});
|
||||||
|
|
||||||
|
const nowplayingLabel = Widget.Label({
|
||||||
|
label: "Playing NOW!",
|
||||||
|
css: "font-size: 35px;",
|
||||||
|
});
|
||||||
|
|
||||||
|
const artistLabel = Widget.Label({
|
||||||
|
label: "Loading Artist",
|
||||||
|
css: "font-size: 30px;",
|
||||||
|
});
|
||||||
|
|
||||||
|
const titleLabel = Widget.Label({
|
||||||
|
label: "Loading Title",
|
||||||
|
css: "font-size: 25px;",
|
||||||
|
});
|
||||||
|
|
||||||
|
Utils.interval(
|
||||||
|
2150,
|
||||||
|
() => {
|
||||||
|
lastFM.getRecentTracks("yourfriendoss").then((z) => {
|
||||||
|
const track = z.recenttracks.track[0];
|
||||||
|
if (!track) return;
|
||||||
|
nowplayingLabel.set_label(
|
||||||
|
track["@attr"]?.nowplaying
|
||||||
|
? "listening to Now"
|
||||||
|
: "listened to " + timeAgo(+track.date.uts * 1000)
|
||||||
|
);
|
||||||
|
artistLabel.set_label(track.artist["#text"]);
|
||||||
|
titleLabel.set_label(track.name);
|
||||||
|
imagebox.setCss(generateCSS(track.image.at(-1)["#text"]));
|
||||||
|
});
|
||||||
|
},
|
||||||
|
imagebox
|
||||||
|
);
|
||||||
|
|
||||||
|
return Widget.Window({
|
||||||
|
name: `lastfm-${monitor}`,
|
||||||
|
class_name: "lastfmjs",
|
||||||
|
monitor,
|
||||||
|
anchor: ["bottom", "right"],
|
||||||
|
exclusivity: "exclusive",
|
||||||
|
layer: "background",
|
||||||
|
margins: [6, 6, 6, 6],
|
||||||
|
child: Widget.Box({
|
||||||
|
class_name: "lastfm",
|
||||||
|
children: [
|
||||||
|
imagebox,
|
||||||
|
Widget.Box({
|
||||||
|
margin: 6,
|
||||||
|
vertical: true,
|
||||||
|
vpack: "center",
|
||||||
|
children: [nowplayingLabel, titleLabel, artistLabel],
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
}
|
|
@ -74,14 +74,14 @@ export function StatusWidget(monitor = 0) {
|
||||||
});
|
});
|
||||||
const linuxLabel = Widget.Label({
|
const linuxLabel = Widget.Label({
|
||||||
label: "Linux " + unameR,
|
label: "Linux " + unameR,
|
||||||
hpack: "start"
|
hpack: "start",
|
||||||
});
|
});
|
||||||
|
|
||||||
const uptime = Widget.Box({
|
const uptime = Widget.Box({
|
||||||
children: [
|
children: [
|
||||||
Widget.Label({
|
Widget.Label({
|
||||||
label: "Uptime: ",
|
label: "Uptime: ",
|
||||||
class_name: "gray"
|
class_name: "gray",
|
||||||
}),
|
}),
|
||||||
Widget.Label({
|
Widget.Label({
|
||||||
label: uptimeVar.bind(),
|
label: uptimeVar.bind(),
|
||||||
|
@ -96,7 +96,7 @@ export function StatusWidget(monitor = 0) {
|
||||||
children: [
|
children: [
|
||||||
Widget.Label({
|
Widget.Label({
|
||||||
label: "RAM Usage: ",
|
label: "RAM Usage: ",
|
||||||
class_name: "gray"
|
class_name: "gray",
|
||||||
}),
|
}),
|
||||||
Widget.Label({
|
Widget.Label({
|
||||||
label: freeKBMemory.bind().as((freeKb) => {
|
label: freeKBMemory.bind().as((freeKb) => {
|
||||||
|
@ -134,7 +134,7 @@ export function StatusWidget(monitor = 0) {
|
||||||
children: [
|
children: [
|
||||||
Widget.Label({
|
Widget.Label({
|
||||||
label: "Average CPU load: ",
|
label: "Average CPU load: ",
|
||||||
class_name: "gray"
|
class_name: "gray",
|
||||||
}),
|
}),
|
||||||
Widget.Label({
|
Widget.Label({
|
||||||
label: loadAverage.bind(),
|
label: loadAverage.bind(),
|
||||||
|
@ -146,7 +146,7 @@ export function StatusWidget(monitor = 0) {
|
||||||
children: [
|
children: [
|
||||||
Widget.Label({
|
Widget.Label({
|
||||||
label: "Processes: ",
|
label: "Processes: ",
|
||||||
class_name: "gray"
|
class_name: "gray",
|
||||||
}),
|
}),
|
||||||
Widget.Label({
|
Widget.Label({
|
||||||
label: processCount.bind().as((z) => z.toString()),
|
label: processCount.bind().as((z) => z.toString()),
|
||||||
|
@ -163,7 +163,7 @@ export function StatusWidget(monitor = 0) {
|
||||||
Widget.Label({
|
Widget.Label({
|
||||||
label: z.file,
|
label: z.file,
|
||||||
hpack: "start",
|
hpack: "start",
|
||||||
class_name: "gray"
|
class_name: "gray",
|
||||||
}),
|
}),
|
||||||
Widget.Box({
|
Widget.Box({
|
||||||
vertical: true,
|
vertical: true,
|
||||||
|
@ -202,8 +202,7 @@ export function StatusWidget(monitor = 0) {
|
||||||
" ".repeat(7 - 3) +
|
" ".repeat(7 - 3) +
|
||||||
"%Mem " +
|
"%Mem " +
|
||||||
"%Cpu ",
|
"%Cpu ",
|
||||||
class_name: "gray"
|
class_name: "gray",
|
||||||
|
|
||||||
}),
|
}),
|
||||||
...z.map((proc) => {
|
...z.map((proc) => {
|
||||||
return Widget.Box({
|
return Widget.Box({
|
||||||
|
|
|
@ -90,7 +90,12 @@ window.notification-popups box.notifications {
|
||||||
.gray {
|
.gray {
|
||||||
color: @theme_unfocused_fg_color;
|
color: @theme_unfocused_fg_color;
|
||||||
}
|
}
|
||||||
|
.lastfm {
|
||||||
|
background-color: @theme_bg_color;
|
||||||
|
padding: 10px;
|
||||||
|
border-radius: 5px;
|
||||||
|
color: @theme_fg_color;
|
||||||
|
}
|
||||||
levelbar trough {
|
levelbar trough {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,12 +14,13 @@ monitor=,highres,auto,auto
|
||||||
exec-once=/usr/lib/polkit-kde-authentication-agent-1
|
exec-once=/usr/lib/polkit-kde-authentication-agent-1
|
||||||
exec-once=dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
|
exec-once=dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
|
||||||
exec-once=~/.config/hypr/portal.sh
|
exec-once=~/.config/hypr/portal.sh
|
||||||
exec-once=swww init && swww img ~/wallpaper.png
|
|
||||||
exec-once=nm-applet
|
exec-once=nm-applet
|
||||||
exec-once=ags
|
exec-once=ags
|
||||||
exec-once=~/.config/hypr/setgtktheme.sh
|
exec-once=swww-daemon
|
||||||
|
|
||||||
exec=~/.config/hypr/import-gsettings.sh
|
exec=~/.config/hypr/import-gsettings.sh
|
||||||
|
exec=swww img ~/wallpaper.png
|
||||||
|
exec=~/.config/hypr/setgtktheme.sh
|
||||||
|
|
||||||
env = XCURSOR_SIZE,24
|
env = XCURSOR_SIZE,24
|
||||||
|
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 541 KiB After Width: | Height: | Size: 3.4 MiB |
Loading…
Reference in a new issue