Contents

[OLD] SpotiBar: Spotify + Foobar

[This is a post from my old website. Outdated packages and libraries. Viewer discretion is advised ;-)]

SPOTIBAR

Spotify zacząłem używać od momentu jak wprowadzili abonament w PLN. Kilka lat doświadczenia się zatem zebrało i choć bardzo sobie cenię tę usługę, to jest jedna rzecz, która mi strasznie w niej przeszkadza.

/images/oldblog/13-09-2017-spotify-desktop.png{: .align-center}

Od razu zaznaczę, że należę do grona ludzi, którzy trzymać swoją kolekcję muzyczną w ordnungu. Jak kupuję płytę CD, to znajduję dla niej miejsce na odpowiedniej półeczce, scrobbluję do last.fm z iTunesa, Spotify’a i telefonu, staram się pamiętać czy dany album mam na nośniku fizycznym, cyfrowym, w streamingu, i tak dalej. Zarządzanie kolekcją w Spotify kuleje. Jak tylko nasze playlisty przekroczą te kilkadziesiąt utworów, wzrokowe odnalezienie się w nich jest dla mnie niemożliwe. Jest searchbar po playliście, ale co z utworami, których nazwy nie potrafię przywołać a potrafię jedynie rozpoznać? Poza tym, jakbym chciał wszystko załatwiać klawiaturowo, to używałbym mpd + mopidy w terminalu. Listy mają za wysoką linię wiersza (nawet po zoom- na maksimum), nie mogę playlisty pokazać jako zbioru miniatur okładek/wykonawców, nie mogę szukać jednocześnie po wszystkich swoich playlistach/bibliotece (tylko po całej bazie utwórów), i tak dalej. Cała koncepcja biblioteki w Spotify leży i kwiczy. Gdybym miał przenieść tam bibliotekę wykonawców z last.fm, nie wiem w jaki sposób miałbym cokolwiek w niej znaleźć. Koniec końców moja przygoda ze Spotify wygląda tak, że nigdy wcześniej tak dużo nowej muzyki nie słuchałem, ale też nigdy wcześniej tak mało wykonawców/albumów nie zapamiętywałem. Przyjąłem więc rozwiązanie robocze: playlista jest albo pod gatunek albo pod dany temat. Przykładowo, wczesny black metal ma swoją playlistę, podobnie jak muzyka pasująca do pracy przy komputerze, czy jazdy samochodem. Mam też playlisty nieeleganckie: albumy do przesłuchania, utwory do uporządkowania i tym podobne. Być może taki urok czasów, presji wywoływanej samą możliwością słuchania czegokolwiek spośród X milionów dostępnych w Spotify utworów. Póki co nie potrafię tego rozstrzygnąć, ale pamiętam taki programik jak foobar2000. Był idealny dla moich potrzeb. Prosty, konfigurowalny do cna, w którym od razu wiedziałem, gdzie i w jakim miejscu kryje się ten utwór, na który mam w danym momencie ochotę.

/images/oldblog/13-09-2017-spotify-foobar-foobar.png{: .align-center}

Foobar2000 natywnie działa na Windowsie. Windowsa w domu nie posiadam od lat (Linux/MacOS). Uruchamianie na wrapperach, WINE’ach sprawia, że przestaję odczuwać radość z prostoty tego programu, poza tym pozostaje kwestia dostępu do bazy Spotify. Kończąc ten przydługawy wywód, powziąłem następujące wyzwanie: napiszę klienta webowego Spotify, który przynajmniej w małym wymiarze będzie mi przypominać korzystanie z foobara. Jeśli nie pomoże mi to odnaleźć się w kolekcji muzycznej, to będę już po wsze czasy wiedzieć, że albo zrezygnuję ze streamingu albo zmienię podejście do porządkowania muzyki.

Co

  • Webowy klient Spotify
  • Przynajmniej częściowa analogia interfejsu do podstawowego foobara

Czym

PART 2

W poprzednim wpisie na ten temat obiecałem zrobić spotify’owy odpowiednik foobara. Choć idea była szczytna, to jednak minęła się trochę z momentem dziejowym. Gdybym obecne playlisty i bibliotekę Spotify miał na dysku twardym, to korzystając z Foobara bym się dawno… pochlastał. Problem leży raczej w moim podejściu do muzyki, aniżeli do interfejsu ;). Nadmiernie eklektyczny gust najwyraźniej też nie jest zbyt dobry.

Ale to nie powód żeby całkiem rezygnować. Więc zrobiłem coś takiego:

/images/oldblog/Screen-Shot-2018-01-05-at-23.53.35.png{: .align-center}

Spotify w swoim API oferuje coś zwanego Recommendation Request. Zwraca on listę utworów spełniających rozmaite kryteria. Mamy tutaj (oprócz gatunku/artysty/utworu) współczynniki takie jak: taneczność, pozytywność, energiczność, tempo, tonacja, czas trwania, popularność i inne.

Czyli możemy szukać czego podobnego do danego wykonawcy, co dodatkowo nie jest popularne

Pola wyszukiwania są ustawione z walidacją, także w przypadku błędnego kryterium otrzymuje informację zwrotną, a nie błąd 400/502/itd. ;). Powinno to ustrzec przed wystąpieniem przynajmniej części wyjątków, których obsługą się nie zająłem…

/images/oldblog/Screen-Shot-2018-01-06-at-00.16.03.png{: .align-center}

Wyniki wypluwane są w bootstrapowej siatce (lekko zmodyfikowany motyw Superhero), z linkami do desktopowego klienta Spotify:

/images/oldblog/Screen-Shot-2018-01-06-at-00.06.58.png{: .align-center}

Wybrany na tym etapie pracy z API sposób autoryzacji z serwerami Spotify nie wymaga od użytkownika podawania jakichkolwiek danych (Client Credential flow bodajże), więc nie można zapisywać wyników automatycznie do playlist.

Na boku chciałbym wyrazić ogromny smutek, że ludzie spoza zespołu Spotify nie mają już dostępu do API EchoNest. Every Noise at Once to doskonały przykład tego, co można z tych danych wyciągnąć… Póki co udostępniane przez Szwedów API jest bardziej okrojone :/.

Kolejny smutek wywołało u mnie kryterium popularności. Niestety, Spotify nie sumuje różnych edycji tych samych utworów. Jeżeli jakiś utwór takiego Motorhead był wydany kilka razy na różnych składankach, reedycjach albumów, itd., to każdy z nich ma wszystkie współczynniki wyliczane osobno. Dlatego Ace of Spades potrafi nasza apka wypluć z zerową popularnością :D. A taka Madonna posiada utwory mniej popularne od niektórych Ulvera.

Podsumowując, oto - działający po wrzuceniu na tomcata - sposób na bardziej zaawansowane wyszukiwanie w bazie Spotify.

Czym

Co tam jest

  • Walidacja form, w tym własny walidator
  • Builder pattern zbudowany nad builderem z wrappera (to było chyba bardzo głupie rozwiązanie, ale nie miałem pomysłu jak inaczej to zrobić, więcej o tym w przyszłości)
  • Kilka .jsp, w nich zaś pętle i bootstrap

Kod źródłowy

(trzeba zmodyfikować Stringi w SpotifyApiDAO.java na własne klucze developerskie Spotify)

Jak zwykle na GitHub.

/images/oldblog/Screen-Shot-2018-01-05-at-23.53.35.png{: .align-center}

PART 3

Po przerwie spowodowanej perturbacjami niezwiązanymi z programowaniem, zdecydowałem się spróbować innego języka. Ostatni mini-projekcik był fajny: wykorzystanie API, aplikacja internetowa, framework Javowy. Chcąc spróbować sił w czymś podobnym, wziąłem sobie na warsztat ten sam projekt, ale pisany w JS.

Po dłuższych kłótniach z JS-owym stoiskiem Popularnych, Ważnych i Na Czasie frameworków, wybrałem AngularJS.

Aplikacja działa, ale daleko jej do bycia ślicznotką. Bebechem CSSowym jest nadal Bootstrap, ale póki co i tak wygląda jak strona z lat 90. :-).

Estetykę poprawimy w kolejnych wpisach, jak już zostaną opowiedziane koleje losu od zera (‘a gdzie w Javascripcie jest metoda main()?’) do bohatera zera i pół ;-).

Tymczasem link do apki tutaj.