Encore: vlastní aplikace pro Spotify se statistikami a hodnocením
Obsah článku
Hudbu poslouchám přes Spotify, ale už dlouho mi v něm chyběl přehled o tom, co, kdy a kolikrát jsem si pustil. Chtěl jsem si taky hudbu hodnotit a psát si k ní krátké recenze. A hodilo by se mi přímo u alba vidět, jak ho hodnotí uživatelé ProgArchives.
Takovou aplikaci jsem si chtěl napsat už roky, ale nikdy jsem si na to nenašel čas. Poslední kapkou pro mě bylo zjištění, že aplikace Spotify na Macu zabírá přes 1 GB paměti a výrazně vytěžuje procesor, přestože zrovna nic nepřehrává. Zbytečně mi vybíjela baterku a všiml jsem si toho až po pár hodinách. S pomocí Clauda jsem se tedy konečně pustil do vývoje vlastní aplikace. Ani tak to nebyla práce na jedno odpoledne. Strávil jsem nad tím desítky hodin, většinu z nich laděním.
Výsledkem je Encore, nativní aplikace pro macOS, která zobrazuje statistiky poslechu, ukládá moje hodnocení a ovládá přehrávání bez aplikace Spotify.
Historie poslechu
Spotify přes API neposkytuje úplnou historii poslechu. Lze získat nanejvýš 50 naposledy přehraných skladeb. Podcasty v tomto seznamu nejsou. Encore proto skládá historii ze čtyř zdrojů:
- Export rozšířené historie streamování, o který lze požádat v nastavení účtu Spotify. Podle Spotify obsahuje celou historii od založení účtu, ale na jeho doručení se čeká až 30 dní. Ten můj sahá do února 2019 a má přes 39 tisíc záznamů.
- Naposledy přehrané skladby z Web API. Encore při každé synchronizaci načítá i záznamy z 24 hodin před posledním zaznamenaným přehráním. Poslech přes CarPlay nebo v offline režimu se totiž v seznamu může objevit až s několikahodinovým zpožděním.
- Údaje o právě přehrávané skladbě, které Encore během poslechu načítá každých 15 sekund.
- Oznámení aplikace Spotify na Macu. Pokud je aplikace spuštěná, posílá je při každé změně stavu přehrávání.
Jedno přehrání se tak často objeví ve více zdrojích a nesmí se započítat víckrát. Encore považuje dva záznamy téže skladby z různých zdrojů za jedno přehrání, pokud rozdíl mezi časy ukončení nepřesáhne délku skladby zvětšenou o jednu minutu. Ke každému přehrání se z každého dalšího zdroje přiřadí nejvýš jeden záznam, vždy ten časově nejbližší. Když dorazí export, jeho záznam nahradí záznamy z ostatních zdrojů.
Aby se poslech započítal jako přehrání, musí trvat aspoň 30 sekund. Za nové přehrání se považuje jak opakované spuštění skladby, tak přetočení zpět o víc než 15 sekund. U epizody podcastu se jako nové přehrání počítá jen návrat na začátek.
Z těchto záznamů vznikají statistiky. Vidím v nich celkovou dobu poslechu i její rozložení po měsících nebo týdnech a nejposlouchanější alba, interprety a skladby. U přehrání z exportu ukazují i podíl přeskočených skladeb, ostatní zdroje tenhle údaj nemají. Nechybí ani seznam alb, která poslouchám často, ale ještě jsem je neohodnotil.
V historii pak najdu datum a čas každého přehrání, včetně poslechu podcastů.
Hodnocení a recenze
Ve Spotify si můžu skladbu nebo album uložit do knihovny, ale vlastní hodnocení k nim nepřidám. V Encore dávám skladbám, albům, interpretům, podcastům i jednotlivým epizodám jednu až pět hvězdiček a píšu k nim krátké recenze. Hodnotit můžu u právě přehrávané skladby, v panelu z řádku nabídek, na stránce alba, interpreta či podcastu i v seznamu neohodnocených alb ve statistikách, takže je nemusím hledat.
Hodnocení z ProgArchives
ProgArchives je databáze progresivního rocku s uživatelským hodnocením alb. API nemá a stránky jsou za Cloudflare, takže obyčejný HTTP požadavek neprojde. Encore stránky načítá ve skrytém okně WebKitu, jen když se album nebo interpret zobrazí: na své stránce, u právě přehrávané skladby nebo v panelu z řádku nabídek. Jednotlivé stránky načítá s odstupem aspoň dvou sekund a výsledky si ukládá na 30 dní. Pokud Cloudflare vyžaduje ověření, Encore okno zobrazí a ověřením projdu sám.
Párování alba ze Spotify s albem na ProgArchives funguje takhle: Encore vyhledá interpreta, načte jeho diskografii a porovná názvy. Z obou názvů přitom odstraní dodatky jako Remastered nebo Deluxe Edition, označení Live ale ponechá, protože koncertní alba mají na ProgArchives samostatné záznamy. Pokud najde jedinou přesnou shodu, alba propojí automaticky. Jinak mi nabídne možné shody k výběru. U alba pak vidím průměrné hodnocení a počet hlasů. ProgArchives interprety nehodnotí, takže Encore u interpreta počítá průměr jeho studiových alb vážený počtem hlasů.
Přehrávání bez aplikace Spotify
Encore ovládá přehrávání přes Web API na libovolném zařízení se Spotify, třeba na telefonu nebo reproduktoru. Umožňuje připnout oblíbené playlisty, reaguje na multimediální klávesy a spravuje vlastní frontu skladeb, protože Web API umí do fronty jen přidávat.
Encore ale umí hudbu i samo přehrávat. Ve skrytém okně WebKitu spustí Web Playback SDK od Spotify a stane se tím dalším zařízením Spotify Connect. Přehrávač se spustí, až když je potřeba, a ukončí se, jakmile přehrávání přesunu na jiné zařízení. Aplikaci Spotify tak na Macu vůbec nemusím mít spuštěnou.
Co Spotify vývojářům dovolí
Encore je u Spotify registrované jako aplikace ve vývojovém režimu. Ten, kdo aplikaci zaregistroval, musí mít předplatné Premium. Aplikaci smí používat nejvýš pět lidí. V tomto režimu navíc nejsou dostupné některé funkce a údaje API, například hromadné načítání skladeb, jejich zvukové vlastnosti nebo údaje o popularitě. Playlisty od Spotify, jako Discover Weekly nebo Daily Mix, lze přehrát, ale přes API nejde získat jejich název, obal ani seznam skladeb. Skladby se objeví až ve frontě přehrávání, název a obal Encore bere z veřejného rozhraní oEmbed.
Spotify taky přísně omezuje počet požadavků. Když aplikace po načtení exportu doplňovala údaje o skladbách, odeslala za tři minuty asi 540 dotazů a Spotify mi pak na 18,7 hodiny zablokovalo přístup. Encore teď nikdy hromadně neprochází katalog na pozadí. Údaje načítá pro každou skladbu zvlášť, až když je opravdu potřebuje. A pokud Spotify nařídí pauzu, dodrží ji i po restartu aplikace.
Na co jsem narazil
Kód jsem psal s Claudem, ale teprve při používání jsem zjistil, jak se Spotify a macOS chovají v praxi. Pár příkladů:
- Tokeny v Klíčence. Aplikace podepsaná bez vývojářského certifikátu od Applu má přístup ke Klíčence svázaný s konkrétním sestavením. Po každém novém sestavení se macOS znovu ptal na heslo, i když jsem předtím zvolil „Povolit vždy“. Tokeny proto ukládám do souboru, který lze číst jen pod mým uživatelským účtem.
- Uspaný přehrávač. WebKit uspává proces skrytého okna, pokud nepřehrává zvuk. Pozastavený přehrávač pak ignoroval příkazy, třeba pokyn k pokračování, přestože Web API hlásilo úspěch. Pomohlo WebKitu uspávání zakázat.
- Samovolné přehrávání. Web Playback SDK hlásí připravenost po každém obnovení spojení. Encore na to zpočátku pokaždé reagovalo převzetím přehrávání, takže se pozastavená skladba sama znovu spustila. Teď přehrávání převezme jen při prvním ohlášení připravenosti po mém pokynu.
- Multimediální klávesy. Dokud se Encore v systému neohlásilo jako přehrávač, předával macOS stisk klávesy Play aplikaci Hudba. Encore se proto ohlašuje i ve chvíli, kdy nic nehraje, a v Ovládacím centru ukazuje naposledy přehranou skladbu jako pozastavenou.
Jak moc je Encore náročné
Zatížení jsem měřil skriptem, který po dobu jedné minuty každé dvě sekundy zaznamenává vytížení procesoru a paměť aplikace Encore i pomocných procesů WebKitu. Zpočátku Encore vytěžovalo procesor na 2,4 až 4,9 %, i s pozastavenou hudbou a skrytým oknem. Na vině byl hlavně ukazatel průběhu skladby: mění se každou sekundu a SwiftUI kvůli němu pokaždé přepočítávalo rozvržení celého okna. Časovač průběhu se teď při pauze nebo skrytém okně zastaví a řádek s průběhem vykresluje přímo AppKit. Vytížení procesoru se tím snížilo na 0,2 až 0,4 %, ať je okno vidět, nebo ne, a ať hudba hraje, nebo je pozastavená. Encore zabírá i s procesy WebKitu 180 až 260 MB paměti. Pro srovnání: aplikace Spotify, kvůli které jsem s Encore začal, zabírá přes 1 GB.
Na čem Encore běží
Encore je napsané ve Swiftu 6.2, používá SwiftUI a běží na macOS 26. Data ukládá do SQLite přes knihovnu GRDB, která je jeho jedinou závislostí. Přihlašování ke Spotify probíhá přes OAuth s PKCE, takže aplikace nemusí obsahovat žádný tajný klíč. Databáze se každý den zálohuje do zvolené složky, třeba na iCloud Drive, a Encore uchovává posledních sedm záloh.
Co dál
Chtěl bych přidat vyhledávání ve Spotify a další zdroje hodnocení.
Encore není veřejně dostupné. Používám ho jen já a zatím ani nevím, jestli licenční podmínky Spotify zveřejnění takové aplikace umožňují.