Essential Mix Player
What about mobile support?
lolz, it works.. sorta? But good luck moving / resizing the playlist around. I don’t know maybe just grab the m3u from Internet Archive or something.
Favorites¶
- 148 - 1993-12-04 - Future Sound Of London
- 124 - 1998-07-12 - Deep Dish
- 470 - 1999-10-03 - Nick Warren
- 616 - 2002-03-17 - James Zabiela
- 552 - 2002-04 - Jan Driver
- 554 - 2002-18 - Scott Bond
- 722 - 2004-02-22 - James Zabiela
- 732 - 2004-05-02 - Rob da bank
- 748 - 2004-08-22 - Scratch Perverts
- 762 - 2004-11-18 - Blackstrobe
- 789 - 2005-06-19 - Deep Dish
- 825 - 2005-12-18 - DJ Hell
- 923 - 2007-06-17 - Skream
- 956 - 2008-02-22 - Benga
- 963 - 2008-03-29 - Deep Dish & Cedric Gervais
- 1008 - 2008-12-13 - Rusko
- 1039 - 2009-07-11 - Caspa
- 1077 - 2010-04-03 - James Zabiela
Missing Favorites¶
- Tiesto 2001-09-09 https://www.youtube.com/watch?v=zJhB4O6IoqU
- Daft Punk New Years 1998-12-31 https://www.youtube.com/watch?v=P7osBEqJLN8
- Agnelli & Nelson 2001-04-29 https://www.youtube.com/watch?v=gINps59afn8
Notes¶
It looks like all of 2001 is missing, sadly. But if I find a collection on archive I’ll append it to the end of the playlist so as not to change the existing track order. I had to generate the playlist to stop it from trying to load each track to get the metadata when the page loads:
1import json
2import urllib.parse
3open("tracks.json", 'w').write(json.dumps({"initialTracks": [(lambda a, b: {"url": b.strip(),
4"duration": 99999, "metaData": {"title": a, "artist": a}})(urllib.parse.unquote(x)
5.strip().split("/")[-1].replace(".mp3", "").replace(".", " ").replace(" ", " ")
6.replace("01-", "").replace("Essential Mix", ""), x) for x in open("raw").readlines()]}))
The file ‘raw’ is just a list of urls, eg: https://archive.org/download/BBC_Essential_Mix_Collection/01-Paul%20Kalkbrenner%20-%20Essential%20Mix-Sat-07-30-2011-Talion.mp3
Ranged requests¶
WebAmp wouldn’t be so bad if it did ranged fetches to get the IDv3 tag header, instead of fetching the whole file, but the offset of the header is not entirely trivial either:
- Let OFFSET = 0.
- Read and remember the first 10 bytes of the file.
- If bytes 0-2 are not ASCII “ID3”, stop. An ID3v2 segment is not present.
- Let OFFSET = 10 (for the 10-byte header).
- Decode bytes 6-9 as a 32-bit “synchsafe int” (refer to any ID3v2 spec). Let OFFSET = OFFSET + this decoded int.
- If the 0x10 bit of byte 5 is set, let OFFSET = OFFSET + 10 (for the footer).
Of course it needs to do this asynchronously. Looks like archive.org supports ranged requests, too:
1curl -H 'Range: bytes=0-1' -s -L -k https://archive.org/download/hardcore.-techno.-collection.-flac.-2010/VA-Vet_Hard_Ultimate_Collection_Vol_01-3CD-FLAC-2010-JLM/324-qatja_s-krak.mp3 | hexdump -C
200000000 49 44 |ID|
300000002
IPFS¶
I know for a fact the HTTP gateways support ranged requests.