fix(inf-radio): IM A DUMBASS
This commit is contained in:
parent
ce4979bdb2
commit
f67123a9d1
3 changed files with 23 additions and 14 deletions
14
js/api.js
14
js/api.js
|
|
@ -862,11 +862,11 @@ export class LosslessAPI {
|
||||||
const trackMap = new Map();
|
const trackMap = new Map();
|
||||||
const videoMap = new Map();
|
const videoMap = new Map();
|
||||||
|
|
||||||
const isTrack = (v) => v?.id && v.duration && v.album;
|
const isTrack = (v) => v?.id && v.duration;
|
||||||
const isAlbum = (v) => v?.id && 'numberOfTracks' in v;
|
const isAlbum = (v) => v?.id && 'numberOfTracks' in v;
|
||||||
const isVideo = (v) => v?.id && v.type === 'VIDEO';
|
const isVideo = (v) => v?.id && v.type === 'VIDEO';
|
||||||
|
|
||||||
const scan = (value, visited = new Set()) => {
|
const scan = (value, visited) => {
|
||||||
if (!value || typeof value !== 'object' || visited.has(value)) return;
|
if (!value || typeof value !== 'object' || visited.has(value)) return;
|
||||||
visited.add(value);
|
visited.add(value);
|
||||||
|
|
||||||
|
|
@ -877,13 +877,17 @@ export class LosslessAPI {
|
||||||
|
|
||||||
const item = value.item || value;
|
const item = value.item || value;
|
||||||
if (isAlbum(item)) albumMap.set(item.id, this.prepareAlbum(item));
|
if (isAlbum(item)) albumMap.set(item.id, this.prepareAlbum(item));
|
||||||
if (isTrack(item)) trackMap.set(item.id, this.prepareTrack(item));
|
if (isTrack(item) && !isAlbum(item) && !isVideo(item)) {
|
||||||
|
trackMap.set(item.id, this.prepareTrack(item));
|
||||||
|
}
|
||||||
if (isVideo(item)) videoMap.set(item.id, this.prepareVideo(item));
|
if (isVideo(item)) videoMap.set(item.id, this.prepareVideo(item));
|
||||||
|
|
||||||
Object.values(value).forEach((nested) => scan(nested, visited));
|
Object.values(value).forEach((nested) => scan(nested, visited));
|
||||||
};
|
};
|
||||||
|
|
||||||
entries.forEach((entry) => scan(entry));
|
const visited = new Set();
|
||||||
|
entries.forEach((entry) => scan(entry, visited));
|
||||||
|
scan(primaryData, visited);
|
||||||
|
|
||||||
if (!options.lightweight) {
|
if (!options.lightweight) {
|
||||||
try {
|
try {
|
||||||
|
|
@ -1097,7 +1101,7 @@ export class LosslessAPI {
|
||||||
results.forEach((tracks) => {
|
results.forEach((tracks) => {
|
||||||
if (tracks.length > 0) {
|
if (tracks.length > 0) {
|
||||||
recommendedTracks.push(...tracks);
|
recommendedTracks.push(...tracks);
|
||||||
seenTrackIds.add(...tracks.map((t) => t.id));
|
tracks.forEach((t) => seenTrackIds.add(t.id));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,7 @@ export function initializePlayerEvents(player, audioPlayer, scrobbler, ui) {
|
||||||
const prevBtn = document.getElementById('prev-btn');
|
const prevBtn = document.getElementById('prev-btn');
|
||||||
const shuffleBtn = document.getElementById('shuffle-btn');
|
const shuffleBtn = document.getElementById('shuffle-btn');
|
||||||
const repeatBtn = document.getElementById('repeat-btn');
|
const repeatBtn = document.getElementById('repeat-btn');
|
||||||
const homeStartRadioBtn = document.getElementById('home-start-radio-btn');
|
const homeStartRadioBtn = document.getElementById('home-start-infinite-radio-btn');
|
||||||
const sleepTimerBtnDesktop = document.getElementById('sleep-timer-btn-desktop');
|
const sleepTimerBtnDesktop = document.getElementById('sleep-timer-btn-desktop');
|
||||||
|
|
||||||
const volumeBar = document.getElementById('volume-bar');
|
const volumeBar = document.getElementById('volume-bar');
|
||||||
|
|
@ -778,13 +778,13 @@ export async function handleTrackAction(
|
||||||
if (!item) return;
|
if (!item) return;
|
||||||
|
|
||||||
// Actions not allowed for unavailable tracks
|
// Actions not allowed for unavailable tracks
|
||||||
const forbiddenForUnavailable = ['add-to-queue', 'play-next', 'track-mix', 'download', 'start-radio'];
|
const forbiddenForUnavailable = ['add-to-queue', 'play-next', 'track-mix', 'download', 'start-radio', 'start-infinite-radio'];
|
||||||
if (item.isUnavailable && forbiddenForUnavailable.includes(action)) {
|
if (item.isUnavailable && forbiddenForUnavailable.includes(action)) {
|
||||||
showNotification('This track is unavailable.');
|
showNotification('This track is unavailable.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (action === 'start-radio') {
|
if (action === 'start-radio' || action === 'start-infinite-radio') {
|
||||||
let tracks = [];
|
let tracks = [];
|
||||||
if (type === 'track') {
|
if (type === 'track') {
|
||||||
tracks = [item];
|
tracks = [item];
|
||||||
|
|
|
||||||
17
js/player.js
17
js/player.js
|
|
@ -909,6 +909,9 @@ export class Player {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this.radioSeeds = Array.isArray(seeds) ? seeds : [seeds];
|
this.radioSeeds = Array.isArray(seeds) ? seeds : [seeds];
|
||||||
|
this.wipeQueue();
|
||||||
|
this.setQueue(this.radioSeeds, 0, true);
|
||||||
|
this.playAtIndex(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
const currentQueue = this.getCurrentQueue();
|
const currentQueue = this.getCurrentQueue();
|
||||||
|
|
@ -949,21 +952,23 @@ export class Player {
|
||||||
if (recommendations && recommendations.length > 0) {
|
if (recommendations && recommendations.length > 0) {
|
||||||
const currentQueueIds = new Set(this.getCurrentQueue().map((t) => t.id));
|
const currentQueueIds = new Set(this.getCurrentQueue().map((t) => t.id));
|
||||||
|
|
||||||
const [favorites, userPlaylists] = await Promise.all([
|
const [favorites, userPlaylists, history] = await Promise.all([
|
||||||
db.getFavorites('track'),
|
db.getFavorites('track'),
|
||||||
db.getAll('user_playlists'),
|
db.getAll('user_playlists'),
|
||||||
|
db.getHistory(),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const knownTrackIds = new Set([
|
const knownTrackIds = new Set([
|
||||||
...favorites.map(t => t.id),
|
...favorites.map((t) => t.id),
|
||||||
...userPlaylists.flatMap(p => (p.tracks || []).map(t => t.id))
|
...userPlaylists.flatMap((p) => (p.tracks || []).map((t) => t.id)),
|
||||||
|
...history.map((t) => t.id),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const newTracks = recommendations.filter((t) => {
|
const newTracks = recommendations.filter((t) => {
|
||||||
if (currentQueueIds.has(t.id)) return false;
|
if (currentQueueIds.has(t.id)) return false;
|
||||||
|
|
||||||
if (knownTrackIds.has(t.id)) {
|
if (knownTrackIds.has(t.id)) {
|
||||||
return Math.random() < 0.2;
|
return Math.random() < 0.05;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue