diff --git a/assets/extract_tunes.py b/assets/extract_tunes.py new file mode 100644 index 0000000..ee25201 --- /dev/null +++ b/assets/extract_tunes.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +"""Extract the trainspotting tune pools from local discogs_full -> public/tunes.json. + +Canon = most-pressed masters (repress count across 10.4M releases = mass-owned classic). +The club pool additionally requires the main release to be a 12" — keeps it club wax, +not Madonna albums tagged House. Grail flag = top ~8% of each chunk (certified classics, +gold flash in-game). Null label renders as "White Label", which is exactly right. + +Read-only against discogs_full (canonical). release.master_id is indexed; each chunk +query returns in ~1s. + + python3 assets/extract_tunes.py +""" +import json +import subprocess +from pathlib import Path + +PSQL = "/opt/homebrew/opt/postgresql@16/bin/psql" +OUT = Path(__file__).resolve().parent.parent / "public" / "tunes.json" + +# pool -> chunks of (tag, is_genre, year_lo, year_hi, n, twelve_inch_only) +POOLS = { + "shop": [ # RECORD SHOP: disco / soul / funk + ("Disco", False, 1968, 1989, 70, False), + ("Soul", False, 1962, 1985, 70, False), + ("Funk", False, 1968, 1985, 70, False), + ], + "fair": [ # RECORD FAIR: hip hop / jazz-funk + ("Hip Hop", True, 1979, 2005, 100, False), + ("Jazz-Funk", False, 1968, 1995, 70, False), + ], + "club": [ # CLUB NIGHT: house / techno / jungle, 12"s only + ("House", False, 1985, 2005, 70, True), + ("Techno", False, 1985, 2005, 70, True), + ("Jungle", False, 1990, 2000, 50, True), + ], +} +GRAIL_FRACTION = 0.08 # top of each ranked chunk = certified classic + + +def q(sql): + r = subprocess.run([PSQL, "-d", "discogs_full", "--csv", "-t", "-c", sql], + capture_output=True, text=True, check=True) + import csv, io + return list(csv.reader(io.StringIO(r.stdout))) + + +def fetch(tag, is_genre, ylo, yhi, limit, twelve): + join = ("JOIN master_genre mg ON mg.master_id=m.id AND mg.genre=" if is_genre + else "JOIN master_style ms ON ms.master_id=m.id AND ms.style=") + twelve_sql = ("""AND EXISTS (SELECT 1 FROM release_format rf + WHERE rf.release_id=m.main_release AND rf.descriptions LIKE '%12"%')""" + if twelve else "") + rows = q(f""" + SELECT m.title, m.year, COUNT(r.id) AS presses, + (SELECT ma.artist_name FROM master_artist ma WHERE ma.master_id=m.id + ORDER BY ma.position NULLS LAST LIMIT 1), + (SELECT rl.label_name FROM release_label rl WHERE rl.release_id=m.main_release LIMIT 1) + FROM master m {join}'{tag}' + JOIN release r ON r.master_id=m.id + WHERE m.year BETWEEN {ylo} AND {yhi} {twelve_sql} + GROUP BY m.id ORDER BY presses DESC LIMIT {limit}""") + grails = max(1, int(len(rows) * GRAIL_FRACTION)) + out = [] + for i, r in enumerate(rows): + if len(r) < 5 or not r[0] or not r[3]: + continue + out.append({ + "a": r[3], "t": r[0], + "l": r[4] or "White Label", + "y": int(r[1]) if r[1] else None, + **({"g": 1} if i < grails else {}), + }) + return out + + +pools = {} +for pool, chunks in POOLS.items(): + seen = set() + tunes = [] + for chunk in chunks: + for tune in fetch(*chunk): + key = (tune["a"].lower(), tune["t"].lower()) + if key in seen: + continue + seen.add(key) + tunes.append(tune) + pools[pool] = tunes + print(f"{pool}: {len(tunes)} tunes ({sum(1 for t in tunes if t.get('g'))} grails)") + +OUT.write_text(json.dumps(pools, ensure_ascii=False, separators=(",", ":"))) +print(f"wrote {OUT} ({OUT.stat().st_size // 1024}KB, {sum(len(v) for v in pools.values())} total)") diff --git a/public/tunes.json b/public/tunes.json new file mode 100644 index 0000000..b37e12e --- /dev/null +++ b/public/tunes.json @@ -0,0 +1 @@ +{"shop":[{"a":"Michael Jackson","t":"Thriller","l":"Epic","y":1982,"g":1},{"a":"Michael Jackson","t":"Bad","l":"Epic","y":1987,"g":1},{"a":"Madonna","t":"Like A Virgin","l":"Sire","y":1984,"g":1},{"a":"Michael Jackson","t":"Off The Wall","l":"Epic","y":1979,"g":1},{"a":"ABBA","t":"Voulez-Vous","l":"Polar","y":1979,"g":1},{"a":"Various","t":"Saturday Night Fever (The Original Movie Sound Track)","l":"RSO","y":1977},{"a":"ABBA","t":"Arrival","l":"Polar","y":1976},{"a":"Kraftwerk","t":"Die Mensch·Maschine","l":"Kling Klang","y":1978},{"a":"ABBA","t":"The Album","l":"Polar","y":1977},{"a":"ABBA","t":"Super Trouper","l":"Polar","y":1980},{"a":"Blondie","t":"Parallel Lines","l":"Chrysalis","y":1978},{"a":"Kiss","t":"Dynasty","l":"Casablanca","y":1979},{"a":"Stevie Wonder","t":"Songs In The Key Of Life","l":"Tamla","y":1976},{"a":"ABBA","t":"ABBA","l":"Polar","y":1975},{"a":"Bee Gees","t":"Spirits Having Flown","l":"RSO","y":1979},{"a":"Madonna","t":"You Can Dance","l":"Sire","y":1987},{"a":"Electric Light Orchestra","t":"Discovery","l":"Jet Records","y":1979},{"a":"ABBA","t":"Greatest Hits Vol. 2","l":"White Label","y":1979},{"a":"ABBA","t":"Waterloo","l":"Polar","y":1974},{"a":"Stevie Wonder","t":"Hotter Than July","l":"Tamla","y":1980},{"a":"Boney M.","t":"Nightflight To Venus","l":"Hansa International","y":1978},{"a":"Алла Пугачева","t":"Зеркало Души","l":"White Label","y":1977},{"a":"Donna Summer","t":"Bad Girls","l":"Casablanca","y":1979},{"a":"Blondie","t":"Autoamerican","l":"Chrysalis","y":1980},{"a":"Blondie","t":"Heart Of Glass","l":"White Label","y":1978},{"a":"Sugarhill Gang","t":"Rapper's Delight","l":"Sugar Hill Records","y":1979},{"a":"Barbra Streisand","t":"Guilty","l":"Columbia","y":1980},{"a":"Diana Ross","t":"Diana","l":"Motown","y":1980},{"a":"Donna Summer","t":"On The Radio - Greatest Hits Vol. I & II","l":"Casablanca","y":1979},{"a":"Barry White","t":"Barry White's Greatest Hits","l":"20th Century Records","y":1975},{"a":"Boney M.","t":"Take The Heat Off Me","l":"Hansa International","y":1976},{"a":"Donna Summer","t":"Love To Love You Baby","l":"Oasis","y":1975},{"a":"Boney M.","t":"Oceans Of Fantasy","l":"White Label","y":1979},{"a":"ABBA","t":"Chiquitita c/w Lovelight","l":"Polar","y":1979},{"a":"Earth, Wind & Fire","t":"The Best Of Earth Wind & Fire Vol. I","l":"ARC (3)","y":1978},{"a":"ABBA","t":"The Singles (The First Ten Years)","l":"Polar","y":1982},{"a":"Patrick Hernandez","t":"Born To Be Alive","l":"Aquarius","y":1979},{"a":"Grace Jones","t":"Nightclubbing","l":"Island Records","y":1981},{"a":"Donna Summer","t":"I Remember Yesterday","l":"Casablanca","y":1977},{"a":"Boney M.","t":"Love For Sale","l":"Hansa International","y":1977},{"a":"Paul McCartney","t":"All The Best !","l":"MPL (2)","y":1987},{"a":"Blondie","t":"Call Me","l":"Chrysalis","y":1980},{"a":"Bee Gees","t":"Greatest","l":"RSO","y":1979},{"a":"Donna Summer","t":"A Love Trilogy","l":"Oasis","y":1976},{"a":"Gloria Gaynor","t":"Substitute / I Will Survive","l":"Polydor","y":1978},{"a":"Space","t":"Magic Fly","l":"Vogue","y":1977},{"a":"Various","t":"Fame (The Original Soundtrack From The Motion Picture)","l":"Polydor","y":1980},{"a":"Chic","t":"Good Times","l":"White Label","y":1979},{"a":"Cerrone","t":"Supernature","l":"Malligator","y":1977},{"a":"Boney M.","t":"Rivers Of Babylon / Brown Girl In The Ring","l":"Hansa International","y":1978},{"a":"Stevie Wonder","t":"The Original Musiquarium I","l":"White Label","y":1982},{"a":"Earth, Wind & Fire","t":"I Am","l":"ARC (3)","y":1979},{"a":"Tina Turner","t":"Break Every Rule","l":"Capitol Records","y":1986},{"a":"Herb Alpert","t":"Rise","l":"A&M Records","y":1979},{"a":"Bee Gees","t":"Children Of The World","l":"RSO","y":1976},{"a":"George McCrae","t":"Rock Your Baby","l":"T.K. Records","y":1974},{"a":"Stevie Wonder","t":"The Woman In Red (Selections From The Original Motion Picture Soundtrack)","l":"Motown","y":1984},{"a":"Giorgio Moroder","t":"Midnight Express (Music From The Original Motion Picture Soundtrack)","l":"White Label","y":1979},{"a":"Marvin Gaye","t":"Midnight Love","l":"Columbia","y":1982},{"a":"Robert Palmer","t":"Riptide","l":"Island Records","y":1985},{"a":"Earth, Wind & Fire","t":"All 'N All","l":"White Label","y":1977},{"a":"Chic","t":"Le Freak / Savoir Faire","l":"Atlantic","y":1978},{"a":"Eartha Kitt","t":"Where Is My Man","l":"White Label","y":1983},{"a":"Donna Summer","t":"Four Seasons Of Love","l":"Casablanca","y":1976},{"a":"ABBA","t":"Dancing Queen & That's Me","l":"Polar","y":1976},{"a":"Grace Jones","t":"Portfolio","l":"White Label","y":1977},{"a":"Michael Jackson","t":"Billie Jean","l":"Epic","y":1983},{"a":"Quincy Jones","t":"The Dude","l":"A&M Records","y":1981},{"a":"Santa Esmeralda","t":"Don't Let Me Be Misunderstood","l":"Philips","y":1977},{"a":"Zodiac (3)","t":"Disco Alliance","l":"Мелодия","y":1980},{"a":"Bob Marley & The Wailers","t":"Exodus","l":"Island Records","y":1977,"g":1},{"a":"Janis Joplin","t":"Pearl","l":"Columbia","y":1971,"g":1},{"a":"Stevie Wonder","t":"Innervisions","l":"White Label","y":1973},{"a":"Marvin Gaye","t":"What's Going On","l":"White Label","y":1971},{"a":"Stevie Wonder","t":"Talking Book","l":"Tamla","y":1972},{"a":"David Bowie","t":"Station To Station","l":"RCA","y":1976},{"a":"David Bowie","t":"Young Americans","l":"RCA","y":1975},{"a":"Sade","t":"Diamond Life","l":"Epic","y":1984},{"a":"Stevie Wonder","t":"Fulfillingness' First Finale","l":"White Label","y":1974},{"a":"Wham!","t":"Make It Big","l":"Epic","y":1984},{"a":"The Blues Brothers","t":"The Blues Brothers (Original Soundtrack Recording)","l":"Atlantic","y":1980},{"a":"Marvin Gaye","t":"Let's Get It On","l":"Tamla","y":1973},{"a":"Isaac Hayes","t":"Shaft","l":"Enterprise","y":1971},{"a":"Sade","t":"Promise","l":"Epic","y":1985},{"a":"David Bowie","t":"ChangesOneBowie","l":"RCA","y":1976},{"a":"Curtis Mayfield","t":"Super Fly (The Original Motion Picture Soundtrack)","l":"Curtom","y":1972},{"a":"Christopher Cross","t":"Christopher Cross","l":"Warner Bros. Records","y":1979},{"a":"Joe Cocker","t":"With A Little Help From My Friends","l":"White Label","y":1969},{"a":"Roberta Flack","t":"Killing Me Softly","l":"Atlantic","y":1973},{"a":"Isaac Hayes","t":"Hot Buttered Soul","l":"Enterprise","y":1969},{"a":"Elvis Presley","t":"On Stage (February, 1970)","l":"RCA Victor","y":1970},{"a":"Simply Red","t":"Picture Book","l":"Elektra","y":1985},{"a":"Sly & The Family Stone","t":"Greatest Hits","l":"Epic","y":1970},{"a":"Lionel Richie","t":"Lionel Richie","l":"Motown","y":1982},{"a":"Diana Ross","t":"Diana & Marvin","l":"Motown","y":1973},{"a":"Roberta Flack","t":"First Take","l":"Atlantic","y":1969},{"a":"Daryl Hall & John Oates","t":"Rock 'N Soul Part 1","l":"RCA","y":1983},{"a":"Stevie Wonder","t":"In Square Circle","l":"Tamla","y":1985},{"a":"Otis Redding","t":"The Dock Of The Bay","l":"Volt","y":1968},{"a":"Sly & The Family Stone","t":"There's A Riot Goin' On","l":"Epic","y":1971},{"a":"Various","t":"A Christmas Gift For You From Philles Records","l":"Philles Records","y":1963},{"a":"The Jacksons","t":"Victory","l":"Epic","y":1984},{"a":"The Temptations","t":"Masterpiece","l":"Gordy","y":1973},{"a":"Paul Young","t":"No Parlez","l":"CBS","y":1983},{"a":"Prince","t":"Prince","l":"Warner Bros. Records","y":1979},{"a":"Various","t":"The Big Chill (Original Motion Picture Soundtrack)","l":"Motown","y":1983},{"a":"Elvis Presley","t":"From Elvis In Memphis","l":"RCA Victor","y":1969},{"a":"Ike & Tina Turner","t":"River Deep-Mountain High","l":"London Records","y":1966},{"a":"Traffic","t":"Best Of Traffic","l":"Island Records","y":1969},{"a":"Sly & The Family Stone","t":"Stand!","l":"Epic","y":1969},{"a":"James Brown","t":"Sex Machine","l":"King Records (3)","y":1970},{"a":"Marvin Gaye","t":"I Want You","l":"Tamla","y":1976},{"a":"Billy Ocean","t":"Suddenly","l":"Jive","y":1984},{"a":"Aretha Franklin","t":"Lady Soul","l":"Atlantic","y":1968},{"a":"Kevin Rowland","t":"Too-Rye-Ay","l":"Mercury","y":1982},{"a":"James Brown","t":"The James Brown Show (Live At The Apollo)","l":"King Records (3)","y":1963},{"a":"Galt MacDermot","t":"Hair (Original Soundtrack Recording)","l":"RCA Victor","y":1979},{"a":"George Michael","t":"Careless Whisper","l":"Epic","y":1984},{"a":"The Temptations","t":"All Directions","l":"Gordy","y":1972},{"a":"Michael Jackson","t":"The Best Of Michael Jackson","l":"Motown","y":1975},{"a":"Donna Summer","t":"Donna Summer","l":"Geffen Records","y":1982},{"a":"Michael Jackson","t":"Ben","l":"Motown","y":1972},{"a":"Al Green","t":"Greatest Hits","l":"Hi Records","y":1975},{"a":"Curtis Mayfield","t":"Curtis","l":"Curtom","y":1970},{"a":"Diana Ross","t":"Touch Me In The Morning","l":"Motown","y":1973},{"a":"Chicago (2)","t":"Chicago X","l":"Columbia","y":1976},{"a":"Prince And The Revolution","t":"Purple Rain","l":"Warner Bros. Records","y":1984,"g":1},{"a":"Deep Purple","t":"Stormbringer","l":"Purple Records","y":1974,"g":1},{"a":"The Clash","t":"Combat Rock","l":"CBS","y":1982},{"a":"Prince","t":"1999","l":"Warner Bros. Records","y":1982},{"a":"Talking Heads","t":"Stop Making Sense","l":"Sire","y":1984},{"a":"Jeff Beck","t":"Wired","l":"Epic","y":1976},{"a":"Talking Heads","t":"Speaking In Tongues","l":"Sire","y":1983},{"a":"Prince And The Revolution","t":"Around The World In A Day","l":"Paisley Park","y":1985},{"a":"Santana","t":"Amigos","l":"Columbia","y":1976},{"a":"Wham!","t":"Fantastic","l":"Innervision Records (2)","y":1983},{"a":"Prince","t":"Controversy","l":"Warner Bros. Records","y":1981},{"a":"Prince","t":"Dirty Mind","l":"Warner Bros. Records","y":1980},{"a":"Grace Jones","t":"Warm Leatherette","l":"Island Records","y":1980},{"a":"Brian Eno","t":"My Life In The Bush Of Ghosts","l":"EG","y":1981},{"a":"Grand Funk Railroad","t":"E Pluribus Funk","l":"Capitol Records","y":1971},{"a":"KC & The Sunshine Band","t":"KC And The Sunshine Band","l":"T.K. Records","y":1975},{"a":"Veit Marvos","t":"Summernight","l":"Boom Germany","y":1984},{"a":"Kool & The Gang","t":"Celebrate!","l":"De-Lite Records","y":1980},{"a":"Herbie Hancock","t":"Future Shock","l":"Columbia","y":1983},{"a":"The Jacksons","t":"Triumph","l":"Epic","y":1980},{"a":"Various","t":"Rocky IV (Original Motion Picture Soundtrack)","l":"Scotti Bros. Records","y":1985},{"a":"Booker T & The MG's","t":"The Best Of Booker T. & The MG's","l":"Atlantic","y":1968},{"a":"Indeep","t":"Last Night A D.J. Saved My Life","l":"Sound Of New York","y":1982},{"a":"Earth, Wind & Fire","t":"Raise!","l":"ARC (3)","y":1981},{"a":"John Williams (4)","t":"Star Wars / Return Of The Jedi (The Original Motion Picture Soundtrack)","l":"RSO","y":1983},{"a":"Commodores","t":"Midnight Magic","l":"Motown","y":1979},{"a":"Marc Bolan","t":"Zinc Alloy And The Hidden Riders Of Tomorrow Or A Creamed Cage In August","l":"T. Rex","y":1974},{"a":"Al Green","t":"Let's Stay Together","l":"Hi Records","y":1972},{"a":"Donna Summer","t":"She Works Hard For The Money","l":"Mercury","y":1983},{"a":"Average White Band","t":"AWB","l":"Atlantic","y":1974},{"a":"Prince","t":"For You","l":"Warner Bros. Records","y":1978},{"a":"Earth, Wind & Fire","t":"Spirit","l":"Columbia","y":1976},{"a":"War","t":"The World Is A Ghetto","l":"United Artists Records","y":1972},{"a":"Osibisa","t":"Osibisa","l":"MCA Records","y":1971},{"a":"The Jackson 5","t":"ABC","l":"Motown","y":1970},{"a":"Joe Cocker","t":"Joe Cocker","l":"A&M Records","y":1972},{"a":"Talking Heads","t":"The Name Of This Band Is Talking Heads","l":"Sire","y":1982},{"a":"Rick James","t":"Street Songs","l":"Gordy","y":1981},{"a":"Earth, Wind & Fire","t":"That's The Way Of The World","l":"Columbia","y":1975},{"a":"Grand Funk Railroad","t":"On Time","l":"Capitol Records","y":1969},{"a":"Stevie Wonder","t":"Stevie Wonder's Greatest Hits Vol. 2","l":"Tamla","y":1971}],"fair":[{"a":"Michael Jackson","t":"Dangerous","l":"Epic","y":1991,"g":1},{"a":"Beastie Boys","t":"Licensed To Ill","l":"Def Jam Recordings","y":1986,"g":1},{"a":"Michael Jackson","t":"HIStory - Past, Present And Future - Book I","l":"White Label","y":1995,"g":1},{"a":"Eminem","t":"The Marshall Mathers LP","l":"Interscope Records","y":2000,"g":1},{"a":"Britney Spears","t":"Oops!...I Did It Again","l":"Jive","y":2000,"g":1},{"a":"Sugarhill Gang","t":"Rapper's Delight","l":"Sugar Hill Records","y":1979,"g":1},{"a":"Michael Jackson","t":"Invincible","l":"Epic","y":2001,"g":1},{"a":"Prince","t":"The Black Album","l":"Warner Bros. Records","y":1987,"g":1},{"a":"Falco","t":"Rock Me Amadeus","l":"GiG Records","y":1985},{"a":"Beastie Boys","t":"Paul's Boutique","l":"Beastie Boys Records","y":1989},{"a":"Linkin Park","t":"Hybrid Theory","l":"Warner Bros. Records","y":2000},{"a":"Gorillaz","t":"Gorillaz","l":"Parlophone","y":2001},{"a":"Gorillaz","t":"Demon Days","l":"Parlophone","y":2005},{"a":"Mariah Carey","t":"Butterfly","l":"Columbia","y":1997},{"a":"Madonna","t":"Bedtime Stories","l":"Maverick","y":1994},{"a":"Eminem","t":"The Eminem Show","l":"Aftermath Entertainment","y":2002},{"a":"Various","t":"Pretty Woman (Original Motion Picture Soundtrack)","l":"EMI USA","y":1990},{"a":"Massive Attack","t":"Blue Lines","l":"Circa","y":1991},{"a":"Beastie Boys","t":"Ill Communication","l":"Capitol Records","y":1994},{"a":"Public Enemy","t":"It Takes A Nation Of Millions To Hold Us Back","l":"Def Jam Recordings","y":1988},{"a":"Afrika Bambaataa & Soulsonic Force","t":"Planet Rock","l":"Tommy Boy","y":1982},{"a":"Dr. Dre","t":"The Chronic","l":"Interscope Records","y":1992},{"a":"Eminem","t":"The Slim Shady LP","l":"Aftermath Entertainment","y":1999},{"a":"Snoop Dogg","t":"Doggystyle","l":"Death Row Records (2)","y":1993},{"a":"2Pac","t":"All Eyez On Me","l":"Death Row Records (2)","y":1996},{"a":"The Prodigy","t":"The Dirtchamber Sessions Volume One","l":"XL Recordings","y":1999},{"a":"Freeez","t":"I.O.U.","l":"Streetwise","y":1982},{"a":"Fugees","t":"The Score","l":"Columbia","y":1996},{"a":"De La Soul","t":"3 Feet High And Rising","l":"Tommy Boy","y":1989},{"a":"MC Hammer","t":"Please Hammer Don't Hurt 'Em","l":"Capitol Records","y":1990},{"a":"Mariah Carey","t":"Daydream","l":"Columbia","y":1995},{"a":"The KLF","t":"3 A.M. Eternal","l":"Arista","y":1991},{"a":"Dr. Dre","t":"2001","l":"Aftermath Entertainment","y":1999},{"a":"N.W.A.","t":"Straight Outta Compton","l":"Ruthless Records","y":1989},{"a":"Public Enemy","t":"Fear Of A Black Planet","l":"Def Jam Recordings","y":1990},{"a":"Anthrax","t":"Attack Of The Killer B's","l":"Island Records","y":1991},{"a":"Grandmaster Flash & Melle Mel","t":"White Lines (Don't Don't Do It)","l":"Sugar Hill Records","y":1983},{"a":"Boyz II Men","t":"Cooleyhighharmony","l":"Motown","y":1991},{"a":"Beastie Boys","t":"Check Your Head","l":"Capitol Records","y":1992},{"a":"Notorious B.I.G.","t":"Ready To Die","l":"Bad Boy Entertainment","y":1994},{"a":"Various","t":"Miami Vice (Music From The Television Series)","l":"MCA Records","y":1985},{"a":"Run-DMC","t":"Raising Hell","l":"Profile Records","y":1986},{"a":"House Of Pain","t":"Jump Around & House Of Pain Anthem","l":"White Label","y":1992},{"a":"Backstreet Boys","t":"Backstreet Boys","l":"Jive","y":1996},{"a":"Janet Jackson","t":"Design Of A Decade 1986 / 1996","l":"A&M Records","y":1995},{"a":"Limp Bizkit","t":"Significant Other","l":"Flip Records (2)","y":1999},{"a":"New Kids On The Block","t":"Hangin' Tough","l":"White Label","y":1988},{"a":"Beastie Boys","t":"Hello Nasty","l":"Capitol Records","y":1998},{"a":"Rage Against The Machine","t":"Evil Empire","l":"Epic","y":1996},{"a":"Tone Loc","t":"Lōc'ed After Dark","l":"Delicious Vinyl","y":1989},{"a":"Herbie Hancock","t":"Future Shock","l":"Columbia","y":1983},{"a":"The Chemical Brothers","t":"Push The Button","l":"Freestyle Dust","y":2005},{"a":"Nas","t":"Illmatic","l":"Columbia","y":1994},{"a":"Mariah Carey","t":"Rainbow","l":"Columbia","y":1999},{"a":"Alicia Keys","t":"Songs In A Minor","l":"J Records","y":2001},{"a":"Boogie Down Productions","t":"Criminal Minded","l":"B-Boy Records","y":1987},{"a":"Various","t":"Music From And Inspired By The Motion Picture 8 Mile","l":"White Label","y":2002},{"a":"Run-DMC","t":"Tougher Than Leather","l":"Profile Records","y":1988},{"a":"Vanilla Ice","t":"To The Extreme","l":"SBK Records","y":1990},{"a":"Craig David","t":"Born To Do It","l":"Wildstar Records","y":2000},{"a":"Gwen Stefani","t":"Love.Angel.Music.Baby.","l":"Interscope Records","y":2004},{"a":"2Pac","t":"Me Against The World","l":"Interscope Records","y":1995},{"a":"Britney Spears","t":"In The Zone","l":"Jive","y":2003},{"a":"New Kids On The Block","t":"Step By Step","l":"Columbia","y":1990},{"a":"House Of Pain","t":"House Of Pain (Fine Malt Lyrics)","l":"Tommy Boy","y":1992},{"a":"Various","t":"A Very Special Christmas","l":"A&M Records","y":1987},{"a":"Eminem","t":"Encore","l":"White Label","y":2004},{"a":"Wu-Tang Clan","t":"Enter The Wu-Tang (36 Chambers)","l":"RCA Records Label","y":1993},{"a":"Janet Jackson","t":"Just A Little While","l":"Virgin","y":2004},{"a":"Milli Vanilli","t":"All Or Nothing (The First Album)","l":"Hansa","y":1988},{"a":"Madonna","t":"Justify My Love","l":"Sire","y":1990},{"a":"The Pharcyde","t":"Bizarre Ride II The Pharcyde","l":"Delicious Vinyl","y":1992},{"a":"Joe Bataan","t":"Rap-O Clap-O","l":"Salsoul Records","y":1979},{"a":"De La Soul","t":"De La Soul Is Dead","l":"Tommy Boy","y":1991},{"a":"50 Cent","t":"The Massacre","l":"Shady Records","y":2005},{"a":"Various","t":"Breakin' - Original Motion Picture Soundtrack","l":"Polydor","y":1984},{"a":"2Pac","t":"2Pacalypse Now","l":"Interscope Records","y":1991},{"a":"Faithless","t":"Reverence","l":"Cheeky Records","y":1996},{"a":"Frankie Smith","t":"Double Dutch Bus","l":"WMOT Records","y":1980},{"a":"Rage Against The Machine","t":"Renegades","l":"Epic","y":2000},{"a":"Mariah Carey","t":"Loverboy","l":"Virgin","y":2001},{"a":"Linkin Park","t":"Reanimation","l":"Warner Bros. Records","y":2002},{"a":"Black Eyed Peas","t":"Elephunk","l":"A&M Records","y":2003},{"a":"De La Soul","t":"Ring Ring Ring (Ha Ha Hey)","l":"Tommy Boy","y":1991},{"a":"Run-DMC","t":"Walk This Way","l":"Profile Records","y":1986},{"a":"Soul II Soul","t":"Vol. II (1990 - A New Decade)","l":"10 Records","y":1990},{"a":"Cypress Hill","t":"Black Sunday","l":"Ruffhouse Records","y":1993},{"a":"Black Eyed Peas","t":"Monkey Business","l":"A&M Records","y":2005},{"a":"Grandmaster Flash & The Furious Five","t":"The Message","l":"Sugar Hill Records","y":1982},{"a":"2Pac","t":"Greatest Hits","l":"Virgin","y":1998},{"a":"Eric B. & Rakim","t":"Paid In Full","l":"4th & Broadway","y":1987},{"a":"Amy Winehouse","t":"Frank","l":"White Label","y":2003},{"a":"The Simpsons","t":"The Simpsons Sing The Blues","l":"Geffen Records","y":1990},{"a":"2Pac","t":"Strictly 4 My N.I.G.G.A.Z...","l":"TNT Recordings (2)","y":1993},{"a":"A Tribe Called Quest","t":"Midnight Marauders","l":"Jive","y":1993},{"a":"The Genius","t":"Liquid Swords","l":"Geffen Records","y":1995},{"a":"Us3","t":"Hand On The Torch","l":"Blue Note","y":1993},{"a":"C + C Music Factory","t":"Gonna Make You Sweat","l":"Columbia","y":1990},{"a":"50 Cent","t":"Get Rich Or Die Tryin'","l":"Shady Records","y":2003},{"a":"Michael Jackson","t":"They Don't Care About Us","l":"Epic","y":1996},{"a":"George Benson","t":"Breezin'","l":"Warner Bros. Records","y":1976,"g":1},{"a":"Isaac Hayes","t":"Shaft","l":"Enterprise","y":1971,"g":1},{"a":"Jeff Beck","t":"Blow By Blow","l":"Epic","y":1975,"g":1},{"a":"Herbie Hancock","t":"Head Hunters","l":"White Label","y":1973,"g":1},{"a":"Blood, Sweat And Tears","t":"Blood, Sweat And Tears","l":"Columbia","y":1969,"g":1},{"a":"Eumir Deodato","t":"Prelude","l":"CTI Records","y":1973},{"a":"Grover Washington, Jr.","t":"Winelight","l":"Elektra","y":1980},{"a":"Stevie Wonder","t":"Music Of My Mind","l":"Tamla","y":1972},{"a":"Billy Cobham","t":"Spectrum","l":"Atlantic","y":1973},{"a":"Santana","t":"Borboletta","l":"Columbia","y":1974},{"a":"George Benson","t":"Jazz Giants","l":"RCA","y":1981},{"a":"Spyro Gyra","t":"Morning Dance","l":"Infinity Records (2)","y":1979},{"a":"Eumir Deodato","t":"Deodato 2","l":"CTI Records","y":1973},{"a":"Level 42","t":"World Machine","l":"Polydor","y":1985},{"a":"Miles Davis","t":"Tutu","l":"Warner Bros. Records","y":1986},{"a":"Herbie Mann","t":"Memphis Underground","l":"Atlantic","y":1969},{"a":"George Benson","t":"In Flight","l":"Warner Bros. Records","y":1977},{"a":"Stevie Wonder","t":"Stevie Wonder's Journey Through The Secret Life Of Plants","l":"Tamla","y":1979},{"a":"Chicago (2)","t":"Chicago III","l":"Columbia","y":1971},{"a":"Stanley Clarke","t":"School Days","l":"Nemperor Records","y":1976},{"a":"Bob James","t":"One","l":"CTI Records","y":1974},{"a":"Spyro Gyra","t":"Catching The Sun","l":"MCA Records","y":1980},{"a":"Miles Davis","t":"On The Corner","l":"Columbia","y":1972},{"a":"Jamiroquai","t":"Emergency On Planet Earth","l":"White Label","y":1993},{"a":"George Benson","t":"The George Benson Collection","l":"Warner Bros. Records","y":1981},{"a":"Herb Alpert","t":"Rise","l":"A&M Records","y":1979},{"a":"Isaac Hayes","t":"Theme From Shaft","l":"Enterprise","y":1971},{"a":"Quincy Jones","t":"Walking In Space","l":"A&M Records","y":1969},{"a":"Marvin Gaye","t":"Trouble Man","l":"Tamla","y":1972},{"a":"Bob James","t":"Two","l":"CTI Records","y":1975},{"a":"Jaco Pastorius","t":"Jaco Pastorius","l":"Epic","y":1976},{"a":"Chicago (2)","t":"Chicago 13","l":"Columbia","y":1979},{"a":"Shakatak","t":"Night Birds","l":"Polydor","y":1982},{"a":"George Benson","t":"Body Talk","l":"CTI Records","y":1973},{"a":"George Benson","t":"The Other Side Of Abbey Road","l":"A&M Records","y":1970},{"a":"Miles Davis","t":"The Man With The Horn","l":"Columbia","y":1981},{"a":"Grover Washington, Jr.","t":"Mister Magic","l":"Kudu","y":1975},{"a":"George Benson","t":"In Your Eyes","l":"Warner Bros. Records","y":1983},{"a":"Stanley Clarke","t":"Stanley Clarke","l":"Nemperor Records","y":1974},{"a":"Little Feat","t":"Time Loves A Hero","l":"White Label","y":1977},{"a":"Quincy Jones","t":"Body Heat","l":"A&M Records","y":1974},{"a":"Level 42","t":"Standing In The Light","l":"Polydor","y":1983},{"a":"Level 42","t":"Running In The Family","l":"Polydor","y":1987},{"a":"Quincy Jones","t":"Sounds ... And Stuff Like That!!","l":"A&M Records","y":1978},{"a":"The Crusaders","t":"Those Southern Knights","l":"ABC Blue Thumb","y":1976},{"a":"Stanley Clarke","t":"Journey To Love","l":"Nemperor Records","y":1975},{"a":"Level 42","t":"Level 42","l":"Polydor","y":1981},{"a":"George Benson","t":"Bad Benson","l":"CTI Records","y":1974},{"a":"Herbie Mann","t":"Push Push","l":"Embryo Records","y":1971},{"a":"Quincy Jones","t":"Smackwater Jack","l":"A&M Records","y":1971},{"a":"Vinicius De Moraes","t":"En La Fusa (Mar Del Plata)","l":"Trova","y":1971},{"a":"Eumir Deodato","t":"Whirlwinds","l":"MCA Records","y":1974},{"a":"Love Unlimited Orchestra","t":"Rhapsody In White","l":"20th Century Records","y":1974},{"a":"Prince","t":"My Name Is Prince","l":"Paisley Park","y":1992},{"a":"Sting","t":"...Nada Como El Sol (Selecciones Especiales En Espanol Y Portugues)","l":"A&M Records","y":1988},{"a":"Bernard Herrmann","t":"Taxi Driver - Original Soundtrack Recording","l":"Arista","y":1976},{"a":"Eric Burdon & War","t":"The Black-Man's Burdon","l":"MGM Records","y":1970},{"a":"Shakatak","t":"Invitations","l":"Polydor","y":1982},{"a":"Herbie Hancock","t":"Secrets","l":"White Label","y":1976},{"a":"Level 42","t":"A Physical Presence","l":"Polydor","y":1985},{"a":"James Last","t":"Well Kept Secret","l":"Polydor","y":1975},{"a":"The Crusaders","t":"Images","l":"ABC Blue Thumb","y":1978},{"a":"Level 42","t":"The Pursuit Of Accidents","l":"Polydor","y":1982},{"a":"Spyro Gyra","t":"Carnaval","l":"MCA Records","y":1980},{"a":"Osibisa","t":"Heads","l":"MCA Records","y":1972},{"a":"War","t":"Deliver The Word","l":"United Artists Records","y":1973},{"a":"Lee Ritenour","t":"Rit","l":"Elektra","y":1981},{"a":"Gato Barbieri","t":"Caliente!","l":"A&M Records","y":1976},{"a":"Level 42","t":"True Colours","l":"Polydor","y":1984}],"club":[{"a":"Jaydee","t":"Plastic Dreams","l":"R & S Records","y":1992,"g":1},{"a":"Robin S.","t":"Show Me Love","l":"Champion","y":1992,"g":1},{"a":"Moby","t":"Go (Remixes)","l":"Instinct Records","y":1991,"g":1},{"a":"M|A|R|R|S","t":"Pump Up The Volume","l":"4AD","y":1987,"g":1},{"a":"Nomad","t":"(I Wanna Give You) Devotion","l":"Rumour Records","y":1990,"g":1},{"a":"Rozalla","t":"Everybody's Free (To Feel Good)","l":"Pulse-8 Records","y":1991},{"a":"Ultra Naté","t":"Free (The Mood II Swing Mixes)","l":"Strictly Rhythm","y":1997},{"a":"Kristine W","t":"Feel What You Want","l":"Champion","y":1994},{"a":"Duke","t":"So In Love With You","l":"Virgin","y":1994},{"a":"Raze","t":"Break 4 Love","l":"Grove St.","y":1988},{"a":"Adventures Of Stevie V.","t":"Dirty Cash","l":"Mercury","y":1989},{"a":"Felix","t":"Don't You Want Me","l":"Hooj Choons","y":1992},{"a":"Jesus Loves You","t":"Generations Of Love","l":"More Protein","y":1990},{"a":"Inner City","t":"Big Fun","l":"KMS","y":1988},{"a":"Yazz","t":"The Only Way Is Up","l":"Big Life","y":1988},{"a":"The KLF","t":"Justified & Ancient","l":"KLF Communications","y":1991},{"a":"The Timelords","t":"Doctorin' The Tardis","l":"KLF Communications","y":1988},{"a":"Hithouse","t":"Jack To The Sound Of The Underground","l":"ARS Benelux","y":1988},{"a":"Ruffneck","t":"Everybody Be Somebody","l":"MAW Records","y":1995},{"a":"Coldcut","t":"People Hold On","l":"Ahead Of Our Time","y":1989},{"a":"Crystal Waters","t":"Gypsy Woman (She's Homeless)","l":"Mercury","y":1991},{"a":"Afro Medusa","t":"Pasilda","l":"Foreign Policy (2)","y":1999},{"a":"Gusto","t":"Disco's Revenge","l":"Bumble Beats Records","y":1995},{"a":"Bass Bumpers","t":"The Music's Got Me!","l":"Dance Street","y":1992},{"a":"Urban Cookie Collective","t":"The Key : The Secret","l":"Pulse-8 Records","y":1993},{"a":"Shakedown","t":"At Night","l":"Naïve","y":2001},{"a":"Blaze","t":"Most Precious Love (Dennis Ferrer Remixes)","l":"BPM King Street Sounds","y":2004},{"a":"Alison Limerick","t":"Where Love Lives","l":"Arista","y":1990},{"a":"Yazz","t":"Stand Up For Your Love Rights","l":"Big Life","y":1988},{"a":"Deep Dish","t":"Say Hello","l":"Deep Dish Records","y":2005},{"a":"Tony Di Bart","t":"The Real Thing","l":"Cleveland City Blues","y":1993},{"a":"Atlantic Ocean","t":"Waterfall","l":"Pegasus Records","y":1993},{"a":"De La Soul","t":"A Roller Skating Jam Named \"Saturdays\"","l":"Tommy Boy","y":1991},{"a":"Bomb The Bass","t":"Beat Dis","l":"Mister-Ron Records","y":1988},{"a":"Snap!","t":"The Power","l":"Logic Records","y":1989},{"a":"Kraze","t":"The Party","l":"Big Beat","y":1988},{"a":"U.S.U.R.A.","t":"Open Your Mind","l":"Italian Style Production","y":1992},{"a":"Boris Dlugosch","t":"Keep Pushin'","l":"Peppermint Jam","y":1996},{"a":"The O.T. Quartet","t":"Hold That Sucker Down","l":"Cheeky Records","y":1994},{"a":"Rozalla","t":"Are You Ready To Fly","l":"Pulse-8 Records","y":1992},{"a":"Shapeshifters","t":"Lola's Theme","l":"Nocturnal Groove","y":2003},{"a":"Fleetwood Mac","t":"Big Love","l":"Warner Bros. Records","y":1987},{"a":"The Original","t":"I Love You Baby","l":"WT Records","y":1994},{"a":"Rebel MC","t":"Street Tuff","l":"Desire Records","y":1989},{"a":"Milk & Sugar","t":"Let The Sunshine In","l":"Milk & Sugar Recordings","y":2003},{"a":"Byron Stingily","t":"Get Up","l":"Nervous Records","y":1996},{"a":"Kenny \"Dope\" Gonzalez","t":"The Bomb! (These Sounds Fall Into My Mind)","l":"Henry Street Music","y":1994},{"a":"Madonna","t":"Deeper And Deeper","l":"Maverick","y":1992},{"a":"Stardust","t":"Music Sounds Better With You","l":"Roulé","y":1998},{"a":"Room 5","t":"Make Luv","l":"Noise Traxx","y":2001},{"a":"Hatiras","t":"Spaced Invader","l":"Defected","y":2000},{"a":"The Good Men","t":"Give It Up","l":"Fresh Fruit Records","y":1992},{"a":"Milk & Sugar","t":"Higher & Higher - Edition 1","l":"Milk & Sugar Recordings","y":2000},{"a":"Afrika Bambaataa","t":"Just Get Up And Dance","l":"DFC","y":1991},{"a":"Lonnie Gordon","t":"Gonna Catch You","l":"Supreme Records (3)","y":1991},{"a":"Guru Josh","t":"Infinity (1990's...Time For The Guru)","l":"Deconstruction","y":1990},{"a":"Rob 'N' Raz","t":"Got To Get","l":"Arista","y":1989},{"a":"Eddie Amador","t":"House Music","l":"Yoshitoshi Recordings","y":1997},{"a":"Marshall Jefferson","t":"The House Music Anthem","l":"Trax Records","y":1986},{"a":"Sandy B","t":"Make The World Go Round","l":"Champion","y":1996},{"a":"Xpansions","t":"Elevation","l":"Optimism Records","y":1990},{"a":"Sonique","t":"It Feels So Good","l":"Serious Records","y":1998},{"a":"Bel Amour","t":"Bel Amour","l":"KLR Records","y":2000},{"a":"Bob Sinclar","t":"I Feel For You","l":"Yellow Productions","y":2000},{"a":"Electribe 101","t":"Talking With Myself","l":"Club","y":1988},{"a":"Bizarre Inc","t":"Playing With Knives","l":"Vinyl Solution","y":1991},{"a":"Deep Dish","t":"Flashdance","l":"Deep Dish Records","y":2004},{"a":"Mel & Kim","t":"That's The Way It Is","l":"Supreme Records (3)","y":1988},{"a":"Heller & Farley Project","t":"Ultra Flava","l":"AM:PM","y":1996},{"a":"Dominica (2)","t":"Gotta Let You Go","l":"Micmac Records, Inc.","y":1994},{"a":"Age Of Love","t":"The Age Of Love","l":"DiKi Records","y":1990,"g":1},{"a":"N-Trance","t":"Set You Free (Mixes)","l":"380 Records","y":1992,"g":1},{"a":"Josh Wink","t":"Don't Laugh","l":"Sorted Records","y":1995,"g":1},{"a":"The Prodigy","t":"Firestarter","l":"XL Recordings","y":1996},{"a":"Humanoid","t":"Stakker Humanoid","l":"Westside Records (2)","y":1988},{"a":"L.A. Style","t":"James Brown Is Dead","l":"Decadance Records","y":1991},{"a":"Mauro Picotto","t":"Like This Like That","l":"BXR","y":2001},{"a":"The Future Sound Of London","t":"Papua New Guinea","l":"Jumpin' & Pumpin'","y":1991},{"a":"The Prodigy","t":"No Good (Start The Dance)","l":"XL Recordings","y":1994},{"a":"Rotterdam Termination Source","t":"Poing","l":"Rotterdam Records","y":1992},{"a":"Tom Wilson","t":"Techno Cat","l":"Steppin' Out Records","y":1994},{"a":"Ramirez","t":"La Musika Tremenda","l":"DFC","y":1991},{"a":"Praga Khan","t":"Injected With A Poison (Remixes)","l":"Beat Box (4)","y":1992},{"a":"DHS","t":"The House Of God","l":"Hangman Records","y":1990},{"a":"DJ Tiësto","t":"Lethal Industry","l":"Magik Muzik","y":2002},{"a":"The Shamen","t":"L.S.I. (Love Sex Intelligence)","l":"One Little Indian","y":1992},{"a":"Chimo Bayo","t":"Asi Me Gusta A Mi","l":"Area International","y":1991},{"a":"DJ Misjah & DJ Tim","t":"Access","l":"Heads Or Tails","y":1996},{"a":"D-Shake","t":"Yaaaaaaaaaah (Freestyle Club Mix) / Techno Trance (Paradise Is Now)","l":"Go Bang! Records","y":1990},{"a":"The Prodigy","t":"Poison","l":"XL Recordings","y":1995},{"a":"The Shamen","t":"Phorever People","l":"One Little Indian","y":1992},{"a":"Ramirez","t":"¡Hablando!","l":"DFC","y":1992},{"a":"K.W.S.","t":"Please Don't Go","l":"Network Records","y":1992},{"a":"Yves Deruyter","t":"IV","l":"Bonzai Records","y":1994},{"a":"Roman Flügel","t":"Geht's Noch?","l":"Cocoon Recordings","y":2004},{"a":"Ferry Corsten","t":"Rock Your Body, Rock","l":"Tsunami","y":2003},{"a":"Mario Più","t":"Communication","l":"BXR","y":1999},{"a":"Ayla","t":"Ayla","l":"Maddog","y":1996},{"a":"Francesco Zappalà","t":"We Gotta Do It","l":"Media Records","y":1991},{"a":"Phenomania","t":"Who Is Elvis?","l":"No Respect Records","y":1991},{"a":"Interactive","t":"Who Is Elvis","l":"Dance Street","y":1992},{"a":"The Shamen","t":"Move Any Mountain (Progen 91)","l":"One Little Indian","y":1991},{"a":"DJ Sandy (4)","t":"Overdrive","l":"Nitric","y":1998},{"a":"Adamski","t":"Killer","l":"MCA Records","y":1990},{"a":"New Atlantic","t":"I Know","l":"3 Beat Music","y":1992},{"a":"Sparks","t":"When Do I Get To Sing \"My Way\"","l":"Logic Records","y":1994},{"a":"Jens","t":"Loops & Tings (Remixes)","l":"Superstition","y":1993},{"a":"Queen","t":"Flash (The Official Club Mixes)","l":"Virgin","y":2002},{"a":"B.B.E.","t":"Deeper Love","l":"Triangle","y":1997},{"a":"Quadrophonia","t":"Quadrophonia","l":"Streetbeats","y":1990},{"a":"Mo-Do","t":"Super Gut","l":"Plastika","y":1994},{"a":"Joy Kitikonti","t":"Joyenergizer","l":"BXR","y":2001},{"a":"3 Phase","t":"Der Klang Der Familie","l":"Tresor","y":1992},{"a":"Ramirez","t":"Orgasmico","l":"DFC","y":1992},{"a":"Fierce Ruling Diva","t":"Rubb It In","l":"Music Man Records","y":1991},{"a":"Signum","t":"What Ya Got 4 Me","l":"Jinx Records","y":1998},{"a":"Ace The Space","t":"9 Is A Classic","l":"Dance Ecstasy 2001","y":1992},{"a":"The Shamen","t":"Ebeneezer Goode","l":"One Little Indian","y":1992},{"a":"Westbam","t":"Wizards Of The Sonic","l":"Low Spirit Recordings","y":1994},{"a":"Baby Ford","t":"Children Of The Revolution","l":"Rhythm King","y":1989},{"a":"The Horrorist","t":"One Night In NYC","l":"A1 Records","y":1997},{"a":"Sir Mix-A-Lot","t":"Baby Got Back","l":"Def American Recordings","y":1992},{"a":"Orbital","t":"Chime / Deeper","l":"Oh'Zone Records","y":1989},{"a":"Yello","t":"Call It Love","l":"Mercury","y":1987},{"a":"Ramirez","t":"Bomba","l":"DFC","y":1994},{"a":"Congress","t":"40 Miles / Better Grooves","l":"Inner Rhythm","y":1991},{"a":"Rhythm Masters","t":"The Underground","l":"Tommy Boy Silver Label","y":2001},{"a":"Paul van Dyk","t":"Columbia EP","l":"Vandit Records","y":2001},{"a":"Gigi D'Agostino","t":"Gin Lemon E.P.","l":"BXR","y":1997},{"a":"Âme","t":"Rej EP","l":"Innervisions","y":2005},{"a":"Underworld","t":"King Of Snake","l":"JBO","y":1999},{"a":"Transformer 2","t":"Pacific Symphony","l":"Round And Round","y":1992},{"a":"Lil' Devious","t":"Come Home","l":"Rulin Records","y":2001},{"a":"James Brown","t":"I Got You (I Feel Good) (The Remixes)","l":"FBI Records","y":1992},{"a":"D-Shake","t":"My Heart The Beat / Dance The Night Away","l":"White Label","y":1991},{"a":"Inner City","t":"Do You Love What You Feel","l":"10 Records","y":1989},{"a":"Cubic 22","t":"Night In Motion","l":"Big Time International","y":1991},{"a":"Goldie","t":"Inner City Life","l":"FFRR","y":1994,"g":1},{"a":"Wildchild","t":"Renegade Master","l":"Hi Life Recordings","y":1995,"g":1},{"a":"Alabama 3","t":"Woke Up This Morning","l":"Elemental Records","y":1997,"g":1},{"a":"Goldie","t":"Digital","l":"FFRR","y":1997,"g":1},{"a":"M-Beat","t":"Incredible","l":"Renk Records","y":1994},{"a":"Q Project","t":"Return Of Q. Project","l":"Legend Records (16)","y":1993},{"a":"Shaggy","t":"Boombastic","l":"Virgin","y":1995},{"a":"Patra","t":"Pull Up To The Bumper","l":"550 Music","y":1995},{"a":"Johnny Jungle","t":"Johnny / I Like To Cry","l":"Face Records","y":1993},{"a":"Adam F","t":"Circles","l":"Section 5","y":1995},{"a":"Orca","t":"4AM","l":"Lucky Spin Recordings","y":1993},{"a":"Soundman","t":"Greater Love","l":"SOUR","y":1995},{"a":"Splash","t":"Babylon / Heaven","l":"Dee Jay Recordings","y":1995},{"a":"Sound Of The Future","t":"The Lighter","l":"Formation Records","y":1995},{"a":"Baby D","t":"Take Me To Heaven","l":"Systematic","y":1996},{"a":"Adam F","t":"Music In My Mind","l":"F-Jams","y":1998},{"a":"DJ Hype","t":"Shot In The Dark","l":"Suburban Base Records","y":1993},{"a":"Inta Warriors","t":"Volume 1 - Your Love Is Yours / Aqua-Pura","l":"Dee Jay Recordings","y":1993},{"a":"Fallen Angels","t":"Oh Yeah / Hello Lover","l":"IQ Records","y":1994},{"a":"Praga Khan","t":"Gun Buck","l":"Logic Records","y":1995},{"a":"Cloud 9","t":"Snow / Jazzmin","l":"Moving Shadow","y":1995},{"a":"Rockers Hi-Fi","t":"Push Push","l":"4th & Broadway","y":1995},{"a":"Genaside II","t":"Mr. Maniac","l":"Northwestside","y":1997},{"a":"Tango","t":"Future Followers","l":"Formation Records","y":1993},{"a":"Maxine Francis","t":"Let It Flow","l":"Renk Records","y":1994},{"a":"Marvellous Cain","t":"Hitman / Believe It","l":"IQ Records","y":1994},{"a":"Deee-Lite","t":"Picnic In The Summertime","l":"Elektra","y":1994},{"a":"Origin Unknown","t":"Valley Of The Shadows","l":"RAM Records","y":1996},{"a":"DJ Red Alert & Mike Slammer","t":"You Are The One / Let's Do It","l":"Slammin' Vinyl","y":1994},{"a":"M-Beat","t":"Sweet Love","l":"Renk Records","y":1994},{"a":"MA2","t":"Rollers Music / Hearing Is Believing","l":"Formation Records","y":1995},{"a":"DJ Trax","t":"High Time / Blackmore","l":"Moving Shadow","y":1993},{"a":"Phuture Assassins","t":"Roots 'N Future","l":"Suburban Base Records","y":1993},{"a":"Rufige Kru","t":"Terminator","l":"Reinforced Records","y":1992},{"a":"Hyper On Experience","t":"The Family We Never Had","l":"Moving Shadow","y":1994},{"a":"Rob Playford","t":"Distorted Dreams / The Shadow","l":"Moving Shadow","y":1997},{"a":"Rampage","t":"Monkeys - Here We Come","l":"Rampage The Label","y":1995},{"a":"B-Jam","t":"Funkula / Scandalous","l":"No Smoking Records","y":1995},{"a":"Blame","t":"Feel The Energy","l":"Moving Shadow","y":1993},{"a":"JMJ & Richie","t":"Case Closed / Hall Of Mirrors","l":"Moving Shadow","y":1993},{"a":"Black Grape","t":"Reverend Black Grape","l":"Radioactive","y":1995},{"a":"Bodysnatch","t":"Euphony","l":"Big City Records (3)","y":1992},{"a":"John B","t":"Visions","l":"New Identity Recordings","y":1998},{"a":"Leviticus","t":"Burial","l":"Philly Blunt Records","y":1994},{"a":"Dance Conspiracy","t":"Dub War","l":"Metamorphosis Records Inc","y":1992},{"a":"DJ Vibes","t":"Sing It Loud / Obsession","l":"Asylum Music Inc","y":1993},{"a":"DJ Solo","t":"Axis / Darkage","l":"Production House","y":1993},{"a":"DJ Pulse","t":"Stay Calm (Foul Play Remix)","l":"Moving Shadow","y":1994},{"a":"Alex Reece","t":"Candles","l":"4th & Broadway","y":1996},{"a":"E-Z Rollers","t":"Rolled Into 1 / Believe","l":"Moving Shadow","y":1994}]} \ No newline at end of file diff --git a/src/GameScene.js b/src/GameScene.js index 086cf8b..ac001cd 100644 --- a/src/GameScene.js +++ b/src/GameScene.js @@ -45,10 +45,13 @@ const ENEMY_TYPES = { // Level themes cycle with level index; mix = weighted generator spawn table. const THEMES = [ - { name: 'RECORD SHOP', floor: 'floor', wall: 'wall', mix: [['poser', 0.7], ['nerd', 0.3]] }, - { name: 'RECORD FAIR', floor: 'floor_carpet', wall: 'wall_shelf', mix: [['poser', 0.5], ['nerd', 0.25], ['pirate', 0.25]] }, - { name: 'CLUB NIGHT', floor: 'floor_checker', wall: 'wall_poster', mix: [['poser', 0.4], ['nerd', 0.2], ['pirate', 0.2], ['ghoul', 0.2]] }, + { name: 'RECORD SHOP', pool: 'shop', floor: 'floor', wall: 'wall', mix: [['poser', 0.7], ['nerd', 0.3]] }, + { name: 'RECORD FAIR', pool: 'fair', floor: 'floor_carpet', wall: 'wall_shelf', mix: [['poser', 0.5], ['nerd', 0.25], ['pirate', 0.25]] }, + { name: 'CLUB NIGHT', pool: 'club', floor: 'floor_checker', wall: 'wall_poster', mix: [['poser', 0.4], ['nerd', 0.2], ['pirate', 0.2], ['ghoul', 0.2]] }, ]; +const ID_SCORE = 100; // re-identifying a tune you already know +const FIRST_ID_SCORE = 1000; // new notebook entry +const GRAIL_ID_SCORE = 2000; // first ID of a certified classic export default class GameScene extends Phaser.Scene { constructor() { @@ -59,6 +62,7 @@ export default class GameScene extends Phaser.Scene { // BASE_URL makes assets resolve under the deploy subpath (partly.party/vinylgauntlet/) const base = import.meta.env.BASE_URL; for (const key of TEXTURE_KEYS) this.load.image(key, `${base}sprites/${key}.png`); + this.load.json('tunes', `${base}tunes.json`); // real records from discogs_full } create() { @@ -115,6 +119,8 @@ export default class GameScene extends Phaser.Scene { fontSize: '40px', color: '#ff00ff', align: 'center', + backgroundColor: '#000000c0', + padding: { x: 16, y: 8 }, }) .setOrigin(0.5) .setScrollFactor(0) @@ -125,6 +131,8 @@ export default class GameScene extends Phaser.Scene { fontSize: '20px', color: '#ffffff', align: 'center', + backgroundColor: '#000000c0', + padding: { x: 14, y: 8 }, }) .setOrigin(0.5) .setScrollFactor(0) @@ -631,6 +639,43 @@ export default class GameScene extends Phaser.Scene { else if (this.vibe < 500) this.say(LINES.lowVibe); } + // --- the Trainspotter's Notebook (localStorage) --- + + tuneKey(tune) { + return `${tune.a}|${tune.t}`; + } + + loadNotebook() { + try { + return new Set(JSON.parse(localStorage.getItem('vg_notebook')) || []); + } catch { + return new Set(); + } + } + + notebookTotals() { + const pools = this.cache.json.get('tunes'); + if (!pools) return null; + const total = Object.values(pools).reduce((n, p) => n + p.length, 0); + return { spotted: this.loadNotebook().size, total }; + } + + // Pick a tune from this theme's pool, preferring ones not yet in the notebook. + spotTune() { + const pools = this.cache.json.get('tunes'); + const pool = pools && pools[this.theme.pool]; + if (!pool || !pool.length) return null; + const notebook = this.loadNotebook(); + const fresh = pool.filter((t) => !notebook.has(this.tuneKey(t))); + const pick = Phaser.Utils.Array.GetRandom(fresh.length ? fresh : pool); + const first = !notebook.has(this.tuneKey(pick)); + if (first) { + notebook.add(this.tuneKey(pick)); + localStorage.setItem('vg_notebook', JSON.stringify([...notebook])); + } + return { ...pick, first }; + } + levelClear() { if (this.state !== 'PLAYING') return; this.state = 'LEVEL_CLEAR'; @@ -639,10 +684,25 @@ export default class GameScene extends Phaser.Scene { this.barBg.setVisible(false); this.barFill.setVisible(false); const next = (this.levelIndex + 1) % LEVELS.length; - this.showOverlay('TUNE IDENTIFIED'); - this.sub.setText(`next: ${THEMES[next % THEMES.length].name}`).setVisible(true); - this.say(LINES.levelClear); - this.time.delayedCall(1500, () => { + const tune = this.spotTune(); + if (tune) { + this.score += tune.first ? (tune.g ? GRAIL_ID_SCORE : FIRST_ID_SCORE) : ID_SCORE; + if (tune.g) this.cameras.main.flash(600, 255, 215, 0); // gold flash for a classic + this.showOverlay(tune.g ? 'CERTIFIED CLASSIC' : 'TUNE IDENTIFIED'); + const nb = this.notebookTotals(); + this.sub + .setText( + `${tune.a} — ${tune.t}\n(${tune.l}, ${tune.y || '????'})\n\n` + + `${tune.first ? `+${tune.g ? GRAIL_ID_SCORE : FIRST_ID_SCORE} NEW ENTRY` : 'already in the notebook'}` + + (nb ? ` notebook ${nb.spotted}/${nb.total}` : ''), + ) + .setVisible(true); + announce('tune', `Tune identified. ${tune.a}. ${tune.t}.`, this.time.now); + } else { + this.showOverlay('TUNE IDENTIFIED'); + this.say(LINES.levelClear); + } + this.time.delayedCall(2800, () => { this.physics.resume(); if (this.levelIndex + 1 >= LEVELS.length) this.densityBase += 0.5; // loop back harder this.hideOverlay(); @@ -666,7 +726,12 @@ export default class GameScene extends Phaser.Scene { const scores = this.loadScores(); if (scores.length >= 5 && this.score <= scores[scores.length - 1].score) return; // ponytail: window.prompt beats building a text-entry widget; revisit if it grates - const raw = window.prompt(`High score: ${this.score}! Your initials:`, 'AAA'); + let raw = 'YOU'; + try { + raw = window.prompt(`High score: ${this.score}! Your initials:`, 'AAA'); + } catch { + /* some webviews lack prompt() — default initials */ + } const initials = (raw || 'AAA').toUpperCase().replace(/[^A-Z0-9]/g, '').slice(0, 3) || 'AAA'; scores.push({ initials, score: this.score }); scores.sort((a, b) => b.score - a.score); @@ -691,8 +756,12 @@ export default class GameScene extends Phaser.Scene { const hs = this.loadScores() .map((s, i) => `${i + 1}. ${s.initials} ${s.score}`) .join('\n'); + const nb = this.notebookTotals(); + const nbLine = nb && nb.spotted ? `\n\nNOTEBOOK ${nb.spotted}/${nb.total} tunes spotted` : ''; this.showOverlay('VINYL GAUNTLET'); - this.sub.setText(hs ? `HIGH SCORES\n${hs}` : 'dig deep. name every tune.').setVisible(true); + this.sub + .setText((hs ? `HIGH SCORES\n${hs}` : 'dig deep. name every tune.') + nbLine) + .setVisible(true); this.classButtons.forEach((b) => b.setVisible(true)); }