import { S } from './state.js'; import { esc, toast } from './utils.js'; import { makeGlobalTrackItem } from './components.js'; export async function resolveYouTubeLink() { const url = document.getElementById('importer-link-input')?.value.trim(); if (!url) return; if (!S.cfg.backendUrl) { toast('⚠ Backend URL in Einstellungen konfigurieren'); return; } const preview = document.getElementById('yt-preview'); const inner = document.getElementById('yt-preview-inner'); const section = document.getElementById('yt-tracks-section'); preview.style.display = ''; section.style.display = 'none'; inner.innerHTML = '
'; try { const res = await fetch(`${S.cfg.backendUrl}/api/youtube/resolve`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ url }), signal: AbortSignal.timeout(50000), }); if (!res.ok) { const err = await res.json().catch(() => ({})); throw new Error(err.error || `HTTP ${res.status}`); } const data = await res.json(); window._ytResolved = data; _renderYouTubePreview(data); } catch (e) { if (e.name === 'TimeoutError' || e.name === 'AbortError') { inner.innerHTML = `
Zeitüberschreitung — yt-dlp hat nicht rechtzeitig geantwortet.
`; return; } inner.innerHTML = `
${esc(e.message)}
`; } } function _renderYouTubePreview(data) { const inner = document.getElementById('yt-preview-inner'); const section = document.getElementById('yt-tracks-section'); const list = document.getElementById('yt-tracks-list'); const titleEl = document.getElementById('yt-tracks-title'); const typeLabel = data.type === 'playlist' ? 'YouTube Playlist' : 'YouTube'; const YT_RED = '#FF0000'; const art = (data.artworkUrl || '').replace(/\/hqdefault\.jpg/, '/maxresdefault.jpg'); const count = data.tracks?.length || 0; let actionsHtml = ''; if (data.type === 'track' && count > 0) { actionsHtml = ` `; } else if (data.type === 'playlist') { actionsHtml = ` `; } const artHtml = art ? `` : ''; inner.innerHTML = `
${artHtml}
▶
${typeLabel}
${esc(data.name)}
${esc(data.artist)}${count > 1 ? ` · ${count} Tracks` : ''}
${actionsHtml}
`; if (count > 0) { titleEl.textContent = `${count} Tracks`; list.innerHTML = ''; (data.tracks || []).forEach((t, i) => list.appendChild(makeGlobalTrackItem(t, i, data.tracks))); section.style.display = ''; } } export function executeYouTubeDownload(opts) { if (!S.cfg.backendUrl) { toast('⚠ Kein Backend konfiguriert'); return; } window.executeSpotifyDownload(opts); }