diff --git a/lib/last_fm/album.ex b/lib/last_fm/album.ex new file mode 100644 index 00000000..d21ba5a7 --- /dev/null +++ b/lib/last_fm/album.ex @@ -0,0 +1,3 @@ +defmodule LastFm.Album do + defstruct [:musicbrainz_id, :title] +end diff --git a/lib/last_fm/api.ex b/lib/last_fm/api.ex index 050f81fb..67294866 100644 --- a/lib/last_fm/api.ex +++ b/lib/last_fm/api.ex @@ -1,6 +1,8 @@ defmodule LastFm.API do require Logger + alias LastFm.Track + @base_url "http://ws.audioscrobbler.com/2.0/" def get_recent_tracks(user, api_key) do @@ -21,7 +23,7 @@ defmodule LastFm.API do {:ok, response |> get_in(["recenttracks", "track"]) - |> parse_tracks()} + |> Track.from_api_response()} other -> msg = "Failed to fetch data from #{sanitize_url(url, api_key)}, reason: #{inspect(other)}" @@ -45,66 +47,6 @@ defmodule LastFm.API do end end - defmodule Artist do - defstruct [:musicbrainz_id, :name] - end - - defmodule Album do - defstruct [:musicbrainz_id, :title] - end - - defmodule Track do - @moduledoc """ - Data is not always guaranteed: - - - musicbrainz_id can be an empty string - """ - defstruct [ - :musicbrainz_id, - :title, - :artist, - :album, - :cover_url, - :scrobbled_at_uts, - :scrobbled_at_label - ] - end - - defp parse_tracks(raw_tracks) do - Enum.map(raw_tracks, fn t -> - album = %Album{ - musicbrainz_id: t["album"]["mbid"], - title: t["album"]["#text"] - } - - artist = %Artist{ - musicbrainz_id: t["artist"]["mbid"], - name: t["artist"]["#text"] - } - - %Track{ - musicbrainz_id: t["mbid"], - title: t["name"], - artist: artist, - album: album, - cover_url: parse_cover_url(t), - scrobbled_at_uts: parse_scrobble_at_uts(t), - scrobbled_at_label: t["date"]["#text"] - } - end) - end - - defp parse_cover_url(track) do - track["image"] - |> Enum.find(%{"#text" => nil}, fn i -> i["size"] == "small" end) - |> Map.get("#text") - end - - defp parse_scrobble_at_uts(track) do - track["date"]["uts"] - |> String.to_integer() - end - defp sanitize_url(url, api_key) do String.replace(url, api_key, "") end diff --git a/lib/last_fm/artist.ex b/lib/last_fm/artist.ex new file mode 100644 index 00000000..f88bd12b --- /dev/null +++ b/lib/last_fm/artist.ex @@ -0,0 +1,3 @@ +defmodule LastFm.Artist do + defstruct [:musicbrainz_id, :name] +end diff --git a/lib/last_fm/track.ex b/lib/last_fm/track.ex new file mode 100644 index 00000000..da36961e --- /dev/null +++ b/lib/last_fm/track.ex @@ -0,0 +1,54 @@ +defmodule LastFm.Track do + @moduledoc """ + Data is not always guaranteed: + + - musicbrainz_id can be an empty string + """ + + alias LastFm.{Album, Artist} + + defstruct [ + :musicbrainz_id, + :title, + :artist, + :album, + :cover_url, + :scrobbled_at_uts, + :scrobbled_at_label + ] + + def from_api_response(raw_tracks) do + Enum.map(raw_tracks, fn t -> + album = %Album{ + musicbrainz_id: t["album"]["mbid"], + title: t["album"]["#text"] + } + + artist = %Artist{ + musicbrainz_id: t["artist"]["mbid"], + name: t["artist"]["#text"] + } + + %__MODULE__{ + musicbrainz_id: t["mbid"], + title: t["name"], + artist: artist, + album: album, + cover_url: parse_cover_url(t), + scrobbled_at_uts: parse_scrobble_at_uts(t), + scrobbled_at_label: t["date"]["#text"] + } + end) + end + + defp parse_cover_url(track) do + track["image"] + |> Enum.find(%{"#text" => nil}, fn i -> i["size"] == "small" end) + |> Map.get("#text") + end + + defp parse_scrobble_at_uts(track) do + track["date"]["uts"] + |> String.to_integer() + end +end diff --git a/test/last_fm/track_test.exs b/test/last_fm/track_test.exs new file mode 100644 index 00000000..4124f3fc --- /dev/null +++ b/test/last_fm/track_test.exs @@ -0,0 +1,339 @@ +defmodule LastFm.TrackTest do + use ExUnit.Case, async: true + + @api_response_path Path.expand("../support/fixtures/user.getrecenttracks.json", __DIR__) + + describe "from_api_response/1" do + test "returns correct data" do + api_response = + @api_response_path + |> File.read!() + |> Jason.decode!() + |> get_in(["recenttracks", "track"]) + + assert [ + %LastFm.Track{ + musicbrainz_id: "190567f8-900e-44ce-a574-69adc10cf93a", + title: "Gameboy Tune", + artist: %LastFm.Artist{ + musicbrainz_id: "35ac1700-84f1-4bd9-924b-3792b742e618", + name: "Tomáš Dvořák" + }, + album: %LastFm.Album{ + musicbrainz_id: "4bad26f6-1b27-4554-93bd-40b91ed7866c", + title: "Machinarium Soundtrack" + }, + cover_url: + "https://lastfm.freetls.fastly.net/i/u/34s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg", + scrobbled_at_uts: 1_730_678_348, + scrobbled_at_label: "03 Nov 2024, 23:59" + }, + %LastFm.Track{ + musicbrainz_id: "21829902-c427-4eb5-b777-86d252d8591f", + title: "Mr. Handagote", + artist: %LastFm.Artist{ + musicbrainz_id: "35ac1700-84f1-4bd9-924b-3792b742e618", + name: "Tomáš Dvořák" + }, + album: %LastFm.Album{ + musicbrainz_id: "4bad26f6-1b27-4554-93bd-40b91ed7866c", + title: "Machinarium Soundtrack" + }, + cover_url: + "https://lastfm.freetls.fastly.net/i/u/34s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg", + scrobbled_at_uts: 1_730_592_942, + scrobbled_at_label: "03 Nov 2024, 00:15" + }, + %LastFm.Track{ + musicbrainz_id: "07efe704-e3d3-450f-b64d-906448101aa5", + title: "The Mezzanine", + artist: %LastFm.Artist{ + musicbrainz_id: "35ac1700-84f1-4bd9-924b-3792b742e618", + name: "Tomáš Dvořák" + }, + album: %LastFm.Album{ + musicbrainz_id: "4bad26f6-1b27-4554-93bd-40b91ed7866c", + title: "Machinarium Soundtrack" + }, + cover_url: + "https://lastfm.freetls.fastly.net/i/u/34s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg", + scrobbled_at_uts: 1_730_592_775, + scrobbled_at_label: "03 Nov 2024, 00:12" + }, + %LastFm.Track{ + musicbrainz_id: "09dc71fd-cf8a-4ad7-a3ed-5fd3dd2da143", + title: "Nanorobot Tune", + artist: %LastFm.Artist{ + musicbrainz_id: "35ac1700-84f1-4bd9-924b-3792b742e618", + name: "Tomáš Dvořák" + }, + album: %LastFm.Album{ + musicbrainz_id: "4bad26f6-1b27-4554-93bd-40b91ed7866c", + title: "Machinarium Soundtrack" + }, + cover_url: + "https://lastfm.freetls.fastly.net/i/u/34s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg", + scrobbled_at_uts: 1_730_587_431, + scrobbled_at_label: "02 Nov 2024, 22:43" + }, + %LastFm.Track{ + musicbrainz_id: "03a99f77-9da7-314b-8fdb-bfe1f3e9f6e6", + title: "Clockwise Operetta", + artist: %LastFm.Artist{ + musicbrainz_id: "35ac1700-84f1-4bd9-924b-3792b742e618", + name: "Tomáš Dvořák" + }, + album: %LastFm.Album{ + musicbrainz_id: "4bad26f6-1b27-4554-93bd-40b91ed7866c", + title: "Machinarium Soundtrack" + }, + cover_url: + "https://lastfm.freetls.fastly.net/i/u/34s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg", + scrobbled_at_uts: 1_730_587_213, + scrobbled_at_label: "02 Nov 2024, 22:40" + }, + %LastFm.Track{ + musicbrainz_id: "3525dfb3-fe86-4295-a1ad-332f00d7239a", + title: "The Sea", + artist: %LastFm.Artist{ + musicbrainz_id: "35ac1700-84f1-4bd9-924b-3792b742e618", + name: "Tomáš Dvořák" + }, + album: %LastFm.Album{ + musicbrainz_id: "4bad26f6-1b27-4554-93bd-40b91ed7866c", + title: "Machinarium Soundtrack" + }, + cover_url: + "https://lastfm.freetls.fastly.net/i/u/34s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg", + scrobbled_at_uts: 1_730_586_978, + scrobbled_at_label: "02 Nov 2024, 22:36" + }, + %LastFm.Track{ + musicbrainz_id: "2e468dc8-8734-42af-a820-201ab92835a7", + title: "The Bottom", + artist: %LastFm.Artist{ + musicbrainz_id: "35ac1700-84f1-4bd9-924b-3792b742e618", + name: "Tomáš Dvořák" + }, + album: %LastFm.Album{ + musicbrainz_id: "4bad26f6-1b27-4554-93bd-40b91ed7866c", + title: "Machinarium Soundtrack" + }, + cover_url: + "https://lastfm.freetls.fastly.net/i/u/34s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg", + scrobbled_at_uts: 1_730_586_696, + scrobbled_at_label: "02 Nov 2024, 22:31" + }, + %LastFm.Track{ + musicbrainz_id: "", + title: "The South Atlantic", + artist: %LastFm.Artist{ + musicbrainz_id: "", + name: "Public Service Broadcasting feat. This Is The Kit" + }, + album: %LastFm.Album{ + musicbrainz_id: "2157367e-bf73-48bb-8185-41023a54fa08", + title: "The Last Flight" + }, + cover_url: + "https://lastfm.freetls.fastly.net/i/u/34s/7272b50a02fb3e35c59376d2f96cad97.jpg", + scrobbled_at_uts: 1_730_583_124, + scrobbled_at_label: "02 Nov 2024, 21:32" + }, + %LastFm.Track{ + musicbrainz_id: "", + title: "The Fun Of It", + artist: %LastFm.Artist{ + musicbrainz_id: "", + name: "Public Service Broadcasting feat. Andreya Casablanca" + }, + album: %LastFm.Album{ + musicbrainz_id: "2157367e-bf73-48bb-8185-41023a54fa08", + title: "The Last Flight" + }, + cover_url: + "https://lastfm.freetls.fastly.net/i/u/34s/7272b50a02fb3e35c59376d2f96cad97.jpg", + scrobbled_at_uts: 1_730_582_915, + scrobbled_at_label: "02 Nov 2024, 21:28" + }, + %LastFm.Track{ + musicbrainz_id: "77719694-4c4a-4bb6-a20e-5852b3166b34", + title: "Towards The Dawn", + artist: %LastFm.Artist{ + musicbrainz_id: "93834e82-3a0b-4ec2-a2e4-6eca0a497e6d", + name: "Public Service Broadcasting" + }, + album: %LastFm.Album{ + musicbrainz_id: "2157367e-bf73-48bb-8185-41023a54fa08", + title: "The Last Flight" + }, + cover_url: + "https://lastfm.freetls.fastly.net/i/u/34s/7272b50a02fb3e35c59376d2f96cad97.jpg", + scrobbled_at_uts: 1_730_582_721, + scrobbled_at_label: "02 Nov 2024, 21:25" + }, + %LastFm.Track{ + musicbrainz_id: "", + title: "I Was Always Dreaming", + artist: %LastFm.Artist{ + musicbrainz_id: "93834e82-3a0b-4ec2-a2e4-6eca0a497e6d", + name: "Public Service Broadcasting" + }, + album: %LastFm.Album{ + musicbrainz_id: "2157367e-bf73-48bb-8185-41023a54fa08", + title: "The Last Flight" + }, + cover_url: + "https://lastfm.freetls.fastly.net/i/u/34s/7272b50a02fb3e35c59376d2f96cad97.jpg", + scrobbled_at_uts: 1_730_582_531, + scrobbled_at_label: "02 Nov 2024, 21:22" + }, + %LastFm.Track{ + musicbrainz_id: "", + title: "Howland", + artist: %LastFm.Artist{ + musicbrainz_id: "93834e82-3a0b-4ec2-a2e4-6eca0a497e6d", + name: "Public Service Broadcasting" + }, + album: %LastFm.Album{ + musicbrainz_id: "2157367e-bf73-48bb-8185-41023a54fa08", + title: "The Last Flight" + }, + cover_url: + "https://lastfm.freetls.fastly.net/i/u/34s/7272b50a02fb3e35c59376d2f96cad97.jpg", + scrobbled_at_uts: 1_730_582_162, + scrobbled_at_label: "02 Nov 2024, 21:16" + }, + %LastFm.Track{ + musicbrainz_id: "", + title: "A Different Kind Of Love", + artist: %LastFm.Artist{ + musicbrainz_id: "", + name: "Public Service Broadcasting Feat. EERA" + }, + album: %LastFm.Album{ + musicbrainz_id: "2157367e-bf73-48bb-8185-41023a54fa08", + title: "The Last Flight" + }, + cover_url: + "https://lastfm.freetls.fastly.net/i/u/34s/7272b50a02fb3e35c59376d2f96cad97.jpg", + scrobbled_at_uts: 1_730_581_791, + scrobbled_at_label: "02 Nov 2024, 21:09" + }, + %LastFm.Track{ + musicbrainz_id: "", + title: "Monsoons", + artist: %LastFm.Artist{ + musicbrainz_id: "93834e82-3a0b-4ec2-a2e4-6eca0a497e6d", + name: "Public Service Broadcasting" + }, + album: %LastFm.Album{ + musicbrainz_id: "2157367e-bf73-48bb-8185-41023a54fa08", + title: "The Last Flight" + }, + cover_url: + "https://lastfm.freetls.fastly.net/i/u/34s/7272b50a02fb3e35c59376d2f96cad97.jpg", + scrobbled_at_uts: 1_730_581_574, + scrobbled_at_label: "02 Nov 2024, 21:06" + }, + %LastFm.Track{ + musicbrainz_id: "", + title: "Arabian Flight", + artist: %LastFm.Artist{ + musicbrainz_id: "93834e82-3a0b-4ec2-a2e4-6eca0a497e6d", + name: "Public Service Broadcasting" + }, + album: %LastFm.Album{ + musicbrainz_id: "2157367e-bf73-48bb-8185-41023a54fa08", + title: "The Last Flight" + }, + cover_url: + "https://lastfm.freetls.fastly.net/i/u/34s/7272b50a02fb3e35c59376d2f96cad97.jpg", + scrobbled_at_uts: 1_730_581_335, + scrobbled_at_label: "02 Nov 2024, 21:02" + }, + %LastFm.Track{ + musicbrainz_id: "6b61f1d9-0323-43f3-a85e-b57e5094bbaf", + title: "Electra", + artist: %LastFm.Artist{ + musicbrainz_id: "93834e82-3a0b-4ec2-a2e4-6eca0a497e6d", + name: "Public Service Broadcasting" + }, + album: %LastFm.Album{ + musicbrainz_id: "2157367e-bf73-48bb-8185-41023a54fa08", + title: "The Last Flight" + }, + cover_url: + "https://lastfm.freetls.fastly.net/i/u/34s/7272b50a02fb3e35c59376d2f96cad97.jpg", + scrobbled_at_uts: 1_730_581_095, + scrobbled_at_label: "02 Nov 2024, 20:58" + }, + %LastFm.Track{ + musicbrainz_id: "", + title: "The South Atlantic", + artist: %LastFm.Artist{ + musicbrainz_id: "", + name: "Public Service Broadcasting feat. This Is The Kit" + }, + album: %LastFm.Album{ + musicbrainz_id: "2157367e-bf73-48bb-8185-41023a54fa08", + title: "The Last Flight" + }, + cover_url: + "https://lastfm.freetls.fastly.net/i/u/34s/7272b50a02fb3e35c59376d2f96cad97.jpg", + scrobbled_at_uts: 1_730_580_883, + scrobbled_at_label: "02 Nov 2024, 20:54" + }, + %LastFm.Track{ + musicbrainz_id: "", + title: "The Fun Of It", + artist: %LastFm.Artist{ + musicbrainz_id: "", + name: "Public Service Broadcasting feat. Andreya Casablanca" + }, + album: %LastFm.Album{ + musicbrainz_id: "2157367e-bf73-48bb-8185-41023a54fa08", + title: "The Last Flight" + }, + cover_url: + "https://lastfm.freetls.fastly.net/i/u/34s/7272b50a02fb3e35c59376d2f96cad97.jpg", + scrobbled_at_uts: 1_730_580_673, + scrobbled_at_label: "02 Nov 2024, 20:51" + }, + %LastFm.Track{ + musicbrainz_id: "77719694-4c4a-4bb6-a20e-5852b3166b34", + title: "Towards The Dawn", + artist: %LastFm.Artist{ + musicbrainz_id: "93834e82-3a0b-4ec2-a2e4-6eca0a497e6d", + name: "Public Service Broadcasting" + }, + album: %LastFm.Album{ + musicbrainz_id: "2157367e-bf73-48bb-8185-41023a54fa08", + title: "The Last Flight" + }, + cover_url: + "https://lastfm.freetls.fastly.net/i/u/34s/7272b50a02fb3e35c59376d2f96cad97.jpg", + scrobbled_at_uts: 1_730_580_481, + scrobbled_at_label: "02 Nov 2024, 20:48" + }, + %LastFm.Track{ + musicbrainz_id: "", + title: "I Was Always Dreaming", + artist: %LastFm.Artist{ + musicbrainz_id: "93834e82-3a0b-4ec2-a2e4-6eca0a497e6d", + name: "Public Service Broadcasting" + }, + album: %LastFm.Album{ + musicbrainz_id: "2157367e-bf73-48bb-8185-41023a54fa08", + title: "The Last Flight" + }, + cover_url: + "https://lastfm.freetls.fastly.net/i/u/34s/7272b50a02fb3e35c59376d2f96cad97.jpg", + scrobbled_at_uts: 1_730_580_290, + scrobbled_at_label: "02 Nov 2024, 20:44" + } + ] == + LastFm.Track.from_api_response(api_response) + end + end +end diff --git a/test/support/fixtures/user.getrecenttracks.json b/test/support/fixtures/user.getrecenttracks.json new file mode 100644 index 00000000..cb745544 --- /dev/null +++ b/test/support/fixtures/user.getrecenttracks.json @@ -0,0 +1,733 @@ +{ + "recenttracks": { + "track": [ + { + "artist": { + "mbid": "35ac1700-84f1-4bd9-924b-3792b742e618", + "#text": "Tomáš Dvořák" + }, + "streamable": "0", + "image": [ + { + "size": "small", + "#text": "https://lastfm.freetls.fastly.net/i/u/34s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + }, + { + "size": "medium", + "#text": "https://lastfm.freetls.fastly.net/i/u/64s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + }, + { + "size": "large", + "#text": "https://lastfm.freetls.fastly.net/i/u/174s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + }, + { + "size": "extralarge", + "#text": "https://lastfm.freetls.fastly.net/i/u/300x300/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + } + ], + "mbid": "190567f8-900e-44ce-a574-69adc10cf93a", + "album": { + "mbid": "4bad26f6-1b27-4554-93bd-40b91ed7866c", + "#text": "Machinarium Soundtrack" + }, + "name": "Gameboy Tune", + "url": "https://www.last.fm/music/Tom%C3%A1%C5%A1+Dvo%C5%99%C3%A1k/_/Gameboy+Tune", + "date": { + "uts": "1730678348", + "#text": "03 Nov 2024, 23:59" + } + }, + { + "artist": { + "mbid": "35ac1700-84f1-4bd9-924b-3792b742e618", + "#text": "Tomáš Dvořák" + }, + "streamable": "0", + "image": [ + { + "size": "small", + "#text": "https://lastfm.freetls.fastly.net/i/u/34s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + }, + { + "size": "medium", + "#text": "https://lastfm.freetls.fastly.net/i/u/64s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + }, + { + "size": "large", + "#text": "https://lastfm.freetls.fastly.net/i/u/174s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + }, + { + "size": "extralarge", + "#text": "https://lastfm.freetls.fastly.net/i/u/300x300/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + } + ], + "mbid": "21829902-c427-4eb5-b777-86d252d8591f", + "album": { + "mbid": "4bad26f6-1b27-4554-93bd-40b91ed7866c", + "#text": "Machinarium Soundtrack" + }, + "name": "Mr. Handagote", + "url": "https://www.last.fm/music/Tom%C3%A1%C5%A1+Dvo%C5%99%C3%A1k/_/Mr.+Handagote", + "date": { + "uts": "1730592942", + "#text": "03 Nov 2024, 00:15" + } + }, + { + "artist": { + "mbid": "35ac1700-84f1-4bd9-924b-3792b742e618", + "#text": "Tomáš Dvořák" + }, + "streamable": "0", + "image": [ + { + "size": "small", + "#text": "https://lastfm.freetls.fastly.net/i/u/34s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + }, + { + "size": "medium", + "#text": "https://lastfm.freetls.fastly.net/i/u/64s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + }, + { + "size": "large", + "#text": "https://lastfm.freetls.fastly.net/i/u/174s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + }, + { + "size": "extralarge", + "#text": "https://lastfm.freetls.fastly.net/i/u/300x300/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + } + ], + "mbid": "07efe704-e3d3-450f-b64d-906448101aa5", + "album": { + "mbid": "4bad26f6-1b27-4554-93bd-40b91ed7866c", + "#text": "Machinarium Soundtrack" + }, + "name": "The Mezzanine", + "url": "https://www.last.fm/music/Tom%C3%A1%C5%A1+Dvo%C5%99%C3%A1k/_/The+Mezzanine", + "date": { + "uts": "1730592775", + "#text": "03 Nov 2024, 00:12" + } + }, + { + "artist": { + "mbid": "35ac1700-84f1-4bd9-924b-3792b742e618", + "#text": "Tomáš Dvořák" + }, + "streamable": "0", + "image": [ + { + "size": "small", + "#text": "https://lastfm.freetls.fastly.net/i/u/34s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + }, + { + "size": "medium", + "#text": "https://lastfm.freetls.fastly.net/i/u/64s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + }, + { + "size": "large", + "#text": "https://lastfm.freetls.fastly.net/i/u/174s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + }, + { + "size": "extralarge", + "#text": "https://lastfm.freetls.fastly.net/i/u/300x300/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + } + ], + "mbid": "09dc71fd-cf8a-4ad7-a3ed-5fd3dd2da143", + "album": { + "mbid": "4bad26f6-1b27-4554-93bd-40b91ed7866c", + "#text": "Machinarium Soundtrack" + }, + "name": "Nanorobot Tune", + "url": "https://www.last.fm/music/Tom%C3%A1%C5%A1+Dvo%C5%99%C3%A1k/_/Nanorobot+Tune", + "date": { + "uts": "1730587431", + "#text": "02 Nov 2024, 22:43" + } + }, + { + "artist": { + "mbid": "35ac1700-84f1-4bd9-924b-3792b742e618", + "#text": "Tomáš Dvořák" + }, + "streamable": "0", + "image": [ + { + "size": "small", + "#text": "https://lastfm.freetls.fastly.net/i/u/34s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + }, + { + "size": "medium", + "#text": "https://lastfm.freetls.fastly.net/i/u/64s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + }, + { + "size": "large", + "#text": "https://lastfm.freetls.fastly.net/i/u/174s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + }, + { + "size": "extralarge", + "#text": "https://lastfm.freetls.fastly.net/i/u/300x300/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + } + ], + "mbid": "03a99f77-9da7-314b-8fdb-bfe1f3e9f6e6", + "album": { + "mbid": "4bad26f6-1b27-4554-93bd-40b91ed7866c", + "#text": "Machinarium Soundtrack" + }, + "name": "Clockwise Operetta", + "url": "https://www.last.fm/music/Tom%C3%A1%C5%A1+Dvo%C5%99%C3%A1k/_/Clockwise+Operetta", + "date": { + "uts": "1730587213", + "#text": "02 Nov 2024, 22:40" + } + }, + { + "artist": { + "mbid": "35ac1700-84f1-4bd9-924b-3792b742e618", + "#text": "Tomáš Dvořák" + }, + "streamable": "0", + "image": [ + { + "size": "small", + "#text": "https://lastfm.freetls.fastly.net/i/u/34s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + }, + { + "size": "medium", + "#text": "https://lastfm.freetls.fastly.net/i/u/64s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + }, + { + "size": "large", + "#text": "https://lastfm.freetls.fastly.net/i/u/174s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + }, + { + "size": "extralarge", + "#text": "https://lastfm.freetls.fastly.net/i/u/300x300/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + } + ], + "mbid": "3525dfb3-fe86-4295-a1ad-332f00d7239a", + "album": { + "mbid": "4bad26f6-1b27-4554-93bd-40b91ed7866c", + "#text": "Machinarium Soundtrack" + }, + "name": "The Sea", + "url": "https://www.last.fm/music/Tom%C3%A1%C5%A1+Dvo%C5%99%C3%A1k/_/The+Sea", + "date": { + "uts": "1730586978", + "#text": "02 Nov 2024, 22:36" + } + }, + { + "artist": { + "mbid": "35ac1700-84f1-4bd9-924b-3792b742e618", + "#text": "Tomáš Dvořák" + }, + "streamable": "0", + "image": [ + { + "size": "small", + "#text": "https://lastfm.freetls.fastly.net/i/u/34s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + }, + { + "size": "medium", + "#text": "https://lastfm.freetls.fastly.net/i/u/64s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + }, + { + "size": "large", + "#text": "https://lastfm.freetls.fastly.net/i/u/174s/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + }, + { + "size": "extralarge", + "#text": "https://lastfm.freetls.fastly.net/i/u/300x300/b301ac9a72f14eb4ce3ddd785eb562b2.jpg" + } + ], + "mbid": "2e468dc8-8734-42af-a820-201ab92835a7", + "album": { + "mbid": "4bad26f6-1b27-4554-93bd-40b91ed7866c", + "#text": "Machinarium Soundtrack" + }, + "name": "The Bottom", + "url": "https://www.last.fm/music/Tom%C3%A1%C5%A1+Dvo%C5%99%C3%A1k/_/The+Bottom", + "date": { + "uts": "1730586696", + "#text": "02 Nov 2024, 22:31" + } + }, + { + "artist": { + "mbid": "", + "#text": "Public Service Broadcasting feat. This Is The Kit" + }, + "streamable": "0", + "image": [ + { + "size": "small", + "#text": "https://lastfm.freetls.fastly.net/i/u/34s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "medium", + "#text": "https://lastfm.freetls.fastly.net/i/u/64s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "large", + "#text": "https://lastfm.freetls.fastly.net/i/u/174s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "extralarge", + "#text": "https://lastfm.freetls.fastly.net/i/u/300x300/7272b50a02fb3e35c59376d2f96cad97.jpg" + } + ], + "mbid": "", + "album": { + "mbid": "2157367e-bf73-48bb-8185-41023a54fa08", + "#text": "The Last Flight" + }, + "name": "The South Atlantic", + "url": "https://www.last.fm/music/Public+Service+Broadcasting+feat.+This+Is+The+Kit/_/The+South+Atlantic", + "date": { + "uts": "1730583124", + "#text": "02 Nov 2024, 21:32" + } + }, + { + "artist": { + "mbid": "", + "#text": "Public Service Broadcasting feat. Andreya Casablanca" + }, + "streamable": "0", + "image": [ + { + "size": "small", + "#text": "https://lastfm.freetls.fastly.net/i/u/34s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "medium", + "#text": "https://lastfm.freetls.fastly.net/i/u/64s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "large", + "#text": "https://lastfm.freetls.fastly.net/i/u/174s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "extralarge", + "#text": "https://lastfm.freetls.fastly.net/i/u/300x300/7272b50a02fb3e35c59376d2f96cad97.jpg" + } + ], + "mbid": "", + "album": { + "mbid": "2157367e-bf73-48bb-8185-41023a54fa08", + "#text": "The Last Flight" + }, + "name": "The Fun Of It", + "url": "https://www.last.fm/music/Public+Service+Broadcasting+feat.+Andreya+Casablanca/_/The+Fun+Of+It", + "date": { + "uts": "1730582915", + "#text": "02 Nov 2024, 21:28" + } + }, + { + "artist": { + "mbid": "93834e82-3a0b-4ec2-a2e4-6eca0a497e6d", + "#text": "Public Service Broadcasting" + }, + "streamable": "0", + "image": [ + { + "size": "small", + "#text": "https://lastfm.freetls.fastly.net/i/u/34s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "medium", + "#text": "https://lastfm.freetls.fastly.net/i/u/64s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "large", + "#text": "https://lastfm.freetls.fastly.net/i/u/174s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "extralarge", + "#text": "https://lastfm.freetls.fastly.net/i/u/300x300/7272b50a02fb3e35c59376d2f96cad97.jpg" + } + ], + "mbid": "77719694-4c4a-4bb6-a20e-5852b3166b34", + "album": { + "mbid": "2157367e-bf73-48bb-8185-41023a54fa08", + "#text": "The Last Flight" + }, + "name": "Towards The Dawn", + "url": "https://www.last.fm/music/Public+Service+Broadcasting/_/Towards+The+Dawn", + "date": { + "uts": "1730582721", + "#text": "02 Nov 2024, 21:25" + } + }, + { + "artist": { + "mbid": "93834e82-3a0b-4ec2-a2e4-6eca0a497e6d", + "#text": "Public Service Broadcasting" + }, + "streamable": "0", + "image": [ + { + "size": "small", + "#text": "https://lastfm.freetls.fastly.net/i/u/34s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "medium", + "#text": "https://lastfm.freetls.fastly.net/i/u/64s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "large", + "#text": "https://lastfm.freetls.fastly.net/i/u/174s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "extralarge", + "#text": "https://lastfm.freetls.fastly.net/i/u/300x300/7272b50a02fb3e35c59376d2f96cad97.jpg" + } + ], + "mbid": "", + "album": { + "mbid": "2157367e-bf73-48bb-8185-41023a54fa08", + "#text": "The Last Flight" + }, + "name": "I Was Always Dreaming", + "url": "https://www.last.fm/music/Public+Service+Broadcasting/_/I+Was+Always+Dreaming", + "date": { + "uts": "1730582531", + "#text": "02 Nov 2024, 21:22" + } + }, + { + "artist": { + "mbid": "93834e82-3a0b-4ec2-a2e4-6eca0a497e6d", + "#text": "Public Service Broadcasting" + }, + "streamable": "0", + "image": [ + { + "size": "small", + "#text": "https://lastfm.freetls.fastly.net/i/u/34s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "medium", + "#text": "https://lastfm.freetls.fastly.net/i/u/64s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "large", + "#text": "https://lastfm.freetls.fastly.net/i/u/174s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "extralarge", + "#text": "https://lastfm.freetls.fastly.net/i/u/300x300/7272b50a02fb3e35c59376d2f96cad97.jpg" + } + ], + "mbid": "", + "album": { + "mbid": "2157367e-bf73-48bb-8185-41023a54fa08", + "#text": "The Last Flight" + }, + "name": "Howland", + "url": "https://www.last.fm/music/Public+Service+Broadcasting/_/Howland", + "date": { + "uts": "1730582162", + "#text": "02 Nov 2024, 21:16" + } + }, + { + "artist": { + "mbid": "", + "#text": "Public Service Broadcasting Feat. EERA" + }, + "streamable": "0", + "image": [ + { + "size": "small", + "#text": "https://lastfm.freetls.fastly.net/i/u/34s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "medium", + "#text": "https://lastfm.freetls.fastly.net/i/u/64s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "large", + "#text": "https://lastfm.freetls.fastly.net/i/u/174s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "extralarge", + "#text": "https://lastfm.freetls.fastly.net/i/u/300x300/7272b50a02fb3e35c59376d2f96cad97.jpg" + } + ], + "mbid": "", + "album": { + "mbid": "2157367e-bf73-48bb-8185-41023a54fa08", + "#text": "The Last Flight" + }, + "name": "A Different Kind Of Love", + "url": "https://www.last.fm/music/Public+Service+Broadcasting+Feat.+EERA/_/A+Different+Kind+Of+Love", + "date": { + "uts": "1730581791", + "#text": "02 Nov 2024, 21:09" + } + }, + { + "artist": { + "mbid": "93834e82-3a0b-4ec2-a2e4-6eca0a497e6d", + "#text": "Public Service Broadcasting" + }, + "streamable": "0", + "image": [ + { + "size": "small", + "#text": "https://lastfm.freetls.fastly.net/i/u/34s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "medium", + "#text": "https://lastfm.freetls.fastly.net/i/u/64s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "large", + "#text": "https://lastfm.freetls.fastly.net/i/u/174s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "extralarge", + "#text": "https://lastfm.freetls.fastly.net/i/u/300x300/7272b50a02fb3e35c59376d2f96cad97.jpg" + } + ], + "mbid": "", + "album": { + "mbid": "2157367e-bf73-48bb-8185-41023a54fa08", + "#text": "The Last Flight" + }, + "name": "Monsoons", + "url": "https://www.last.fm/music/Public+Service+Broadcasting/_/Monsoons", + "date": { + "uts": "1730581574", + "#text": "02 Nov 2024, 21:06" + } + }, + { + "artist": { + "mbid": "93834e82-3a0b-4ec2-a2e4-6eca0a497e6d", + "#text": "Public Service Broadcasting" + }, + "streamable": "0", + "image": [ + { + "size": "small", + "#text": "https://lastfm.freetls.fastly.net/i/u/34s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "medium", + "#text": "https://lastfm.freetls.fastly.net/i/u/64s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "large", + "#text": "https://lastfm.freetls.fastly.net/i/u/174s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "extralarge", + "#text": "https://lastfm.freetls.fastly.net/i/u/300x300/7272b50a02fb3e35c59376d2f96cad97.jpg" + } + ], + "mbid": "", + "album": { + "mbid": "2157367e-bf73-48bb-8185-41023a54fa08", + "#text": "The Last Flight" + }, + "name": "Arabian Flight", + "url": "https://www.last.fm/music/Public+Service+Broadcasting/_/Arabian+Flight", + "date": { + "uts": "1730581335", + "#text": "02 Nov 2024, 21:02" + } + }, + { + "artist": { + "mbid": "93834e82-3a0b-4ec2-a2e4-6eca0a497e6d", + "#text": "Public Service Broadcasting" + }, + "streamable": "0", + "image": [ + { + "size": "small", + "#text": "https://lastfm.freetls.fastly.net/i/u/34s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "medium", + "#text": "https://lastfm.freetls.fastly.net/i/u/64s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "large", + "#text": "https://lastfm.freetls.fastly.net/i/u/174s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "extralarge", + "#text": "https://lastfm.freetls.fastly.net/i/u/300x300/7272b50a02fb3e35c59376d2f96cad97.jpg" + } + ], + "mbid": "6b61f1d9-0323-43f3-a85e-b57e5094bbaf", + "album": { + "mbid": "2157367e-bf73-48bb-8185-41023a54fa08", + "#text": "The Last Flight" + }, + "name": "Electra", + "url": "https://www.last.fm/music/Public+Service+Broadcasting/_/Electra", + "date": { + "uts": "1730581095", + "#text": "02 Nov 2024, 20:58" + } + }, + { + "artist": { + "mbid": "", + "#text": "Public Service Broadcasting feat. This Is The Kit" + }, + "streamable": "0", + "image": [ + { + "size": "small", + "#text": "https://lastfm.freetls.fastly.net/i/u/34s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "medium", + "#text": "https://lastfm.freetls.fastly.net/i/u/64s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "large", + "#text": "https://lastfm.freetls.fastly.net/i/u/174s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "extralarge", + "#text": "https://lastfm.freetls.fastly.net/i/u/300x300/7272b50a02fb3e35c59376d2f96cad97.jpg" + } + ], + "mbid": "", + "album": { + "mbid": "2157367e-bf73-48bb-8185-41023a54fa08", + "#text": "The Last Flight" + }, + "name": "The South Atlantic", + "url": "https://www.last.fm/music/Public+Service+Broadcasting+feat.+This+Is+The+Kit/_/The+South+Atlantic", + "date": { + "uts": "1730580883", + "#text": "02 Nov 2024, 20:54" + } + }, + { + "artist": { + "mbid": "", + "#text": "Public Service Broadcasting feat. Andreya Casablanca" + }, + "streamable": "0", + "image": [ + { + "size": "small", + "#text": "https://lastfm.freetls.fastly.net/i/u/34s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "medium", + "#text": "https://lastfm.freetls.fastly.net/i/u/64s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "large", + "#text": "https://lastfm.freetls.fastly.net/i/u/174s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "extralarge", + "#text": "https://lastfm.freetls.fastly.net/i/u/300x300/7272b50a02fb3e35c59376d2f96cad97.jpg" + } + ], + "mbid": "", + "album": { + "mbid": "2157367e-bf73-48bb-8185-41023a54fa08", + "#text": "The Last Flight" + }, + "name": "The Fun Of It", + "url": "https://www.last.fm/music/Public+Service+Broadcasting+feat.+Andreya+Casablanca/_/The+Fun+Of+It", + "date": { + "uts": "1730580673", + "#text": "02 Nov 2024, 20:51" + } + }, + { + "artist": { + "mbid": "93834e82-3a0b-4ec2-a2e4-6eca0a497e6d", + "#text": "Public Service Broadcasting" + }, + "streamable": "0", + "image": [ + { + "size": "small", + "#text": "https://lastfm.freetls.fastly.net/i/u/34s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "medium", + "#text": "https://lastfm.freetls.fastly.net/i/u/64s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "large", + "#text": "https://lastfm.freetls.fastly.net/i/u/174s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "extralarge", + "#text": "https://lastfm.freetls.fastly.net/i/u/300x300/7272b50a02fb3e35c59376d2f96cad97.jpg" + } + ], + "mbid": "77719694-4c4a-4bb6-a20e-5852b3166b34", + "album": { + "mbid": "2157367e-bf73-48bb-8185-41023a54fa08", + "#text": "The Last Flight" + }, + "name": "Towards The Dawn", + "url": "https://www.last.fm/music/Public+Service+Broadcasting/_/Towards+The+Dawn", + "date": { + "uts": "1730580481", + "#text": "02 Nov 2024, 20:48" + } + }, + { + "artist": { + "mbid": "93834e82-3a0b-4ec2-a2e4-6eca0a497e6d", + "#text": "Public Service Broadcasting" + }, + "streamable": "0", + "image": [ + { + "size": "small", + "#text": "https://lastfm.freetls.fastly.net/i/u/34s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "medium", + "#text": "https://lastfm.freetls.fastly.net/i/u/64s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "large", + "#text": "https://lastfm.freetls.fastly.net/i/u/174s/7272b50a02fb3e35c59376d2f96cad97.jpg" + }, + { + "size": "extralarge", + "#text": "https://lastfm.freetls.fastly.net/i/u/300x300/7272b50a02fb3e35c59376d2f96cad97.jpg" + } + ], + "mbid": "", + "album": { + "mbid": "2157367e-bf73-48bb-8185-41023a54fa08", + "#text": "The Last Flight" + }, + "name": "I Was Always Dreaming", + "url": "https://www.last.fm/music/Public+Service+Broadcasting/_/I+Was+Always+Dreaming", + "date": { + "uts": "1730580290", + "#text": "02 Nov 2024, 20:44" + } + } + ], + "@attr": { + "user": "cloud8421", + "totalPages": "4464", + "page": "1", + "total": "89262", + "perPage": "20" + } + } +}