De top2000 gaat weer beginnen (of is al begonnen)

Ingediend door Dirk Hornstra op 24-dec-2019 22:59

Al flink wat jaren volg ik de top 2000 op npo radio 2. Natuurlijk met de papieren versie, maar omdat ik ook zelf snel wilde kunnen zien welk nummer er nu gedraaid wordt en welke het komende uur gedraaid worden heb ik in 2013 voor het eerst de website https://top2000.solution4u.nl/ gemaakt. Inmiddels heeft radio 2 ook een app die je zou kunnen gebruiken, maar volgens mij toont dat niet het overzicht per uur.

Hoe pak ik het aan? Ik moet natuurlijk een digitale versie hebben van de lijst. Die wordt een aantal dagen voor de start op de website van radio 2 gezet, in dit geval een excel-bestand en een PDF. In het excel-bestand staat de positie, naam artiest en de titel van het nummer. In de PDF staat het overzicht per blok van een uur.

Het excel-bestand is een mooie start, maar ik moet per nummer dus nog het tijdsblok hebben wanneer het afgespeeld wordt, daarvoor heb ik de PDF nodig. Ik open de PDF, kopieer alle tekst en plak dit in een tekstbestand. Vervolgens heb je een tekstbestand wat er niet echt goed leesbaar uit ziet:


25 december 8.00-9.00 uur2000Suite: Judy Blue EyesCrosby, Stills & Nash1999Violet HillColdplay1998Water Of LoveDire Straits1997Grounds For DivorceElbow

Daar moeten we dus wat mee doen. In Visual Studio maak ik een console-applicatie die het bestand inleest en zorgt dat alle [dag maand start-eind uur]-blokken op een regel zet:


            string dateTimeMatch = @"([0-9\s]+)([a-z\s]+)([0-9\.\-\s]+)uur";

            string contents = File.ReadAllText(@"c:\temporary\totaallijst.txt");
            // 25 december 8.00-9.00 uur
            var matches = Regex.Matches(contents, dateTimeMatch);
            foreach (Match match in matches)
            {
                contents = contents.Replace(match.Value, "\r\n" + match.Value + "\r\n");
            }
            File.WriteAllText(@"c:\temporary\stap1.txt", contents);

Nu we dat hebben, gaan we alle nummers van 2000 naar 1 aflopen in de tekst, elk nummer dat we vinden voegen we in een lijst toe met het tijdsblok wat boven dat nummer staat:


            string dateTimeMatch = @"([0-9\s]+)([a-z\s]+)([0-9\.\-\s]+)uur";
            string[] contents = File.ReadAllLines(@"c:\temporary\stap1.txt");
            Dictionary<int, string> outputList = new Dictionary<int, string>();
            StringBuilder output = new StringBuilder();
            string dateTime = "";
            int startCounter = 2000;
            foreach (string c in contents)
            {
                if (c.Trim() == string.Empty)
                {
                    continue;
                }
                if (Regex.IsMatch(c, dateTimeMatch))
                {
                    dateTime = c;
                }
                else
                {
                    while (Regex.IsMatch(c, startCounter.ToString()) && startCounter > 0)
                    {
                        outputList.Add(startCounter, dateTime);
                        startCounter--;
                    }
                }
            }
            for (int m = 1; m <= 2000; m++)
            {
                output.AppendLine(outputList[m]);
            }
            File.WriteAllText(@"c:\temporary\stap2.txt", output.ToString());

Je ziet dat ik in bovenstaande nog een keer door de lijst loop. Dat komt omdat in de PDF we van nummer 2000 naar nummer 1 gaan, in het excel-bestand beginnen we echter bij 1 en gaan we naar 2000. Het resultaat moet dus "omgedraaid" worden.

Hierna voer ik wat handmatige stappen door. Ik maak in het excel-bestand de eerstvolgende lege kolom van type tekst en plak daar de waardes in. Vervolgens kopieer ik alles terug naar Visual Studio Code. Ik ga hier SQL-statements van maken.

Eerste wat ik doe is dat ik het ' teken vervang door een \'
Je moet quotes namelijk "escapen", omdat je de quote gebruikt om de waarden die je gaat doorvoeren van elkaar scheidt.

Uiteindelijk krijg ik dus 2000 SQL-statements met de volgende opmaak:


INSERT INTO tabel (position, artist, song, starttime) SELECT '1574', 'The Road Ahead (Miles Of The Unknown)', 'City To City', '2019-12-26 17:00';
INSERT INTO tabel (position, artist, song, starttime) SELECT '1575', 'Mary Jane\'s Last Dance', 'Tom Petty And The Heartbreakers', '2019-12-26 17:00';
INSERT INTO tabel (position, artist, song, starttime) SELECT '1576', 'Need You Now', 'Lady Antebellum', '2019-12-26 17:00';

En dan gaan we het nu ook goed doen. De site is HTTPS, maar zoals een tijdje geleden aangegeven, dat is niet voldoende. De security-headers gaven me ook hier een F-score, door de .htaccess goed in te stellen krijg ik nu aan A-score! (link naar mijn artikel hierover). Vervolgens zag ik dat ik nog op PHP 5.3 draaide (die is oud!). Bijgewerkt naar PHP 7.3, maar toen werkte de site niet meer: ik gebruik namelijk nog mysql-commando's, die worden niet meer ondersteund, je moet de mysqli gebruiken. Ik had hier al een wrapper voor gemaakt, deze kon ik hergebruiken.

Ook meteen op Github geplaatst, zodat iedereen die (snel) een wrapper nodig heeft om problemen met PHP7/mysql_ te fixen dit kan gebruiken. Let op, het is niet kopieren-plakken-klaar, soms zul je nog aanroepende code moeten aanpassen of missen er nog functies (omdat ik die zelf in mijn code nog niet tegengekomen ben): https://github.com/lordofcode/mysql.fixphp7

In voorgaande jaren ben ik ook nog alle nummers gaan opvragen via de API van Last FM (link), zodat ik ongeveer kon schatten wanneer het nummer tijdens het uur-blok gedraaid zou worden. Omdat over 8 uur de top2000 al van start gaat, sla ik dat deze keer over. Daar kon ik trouwens ook de covers downloaden die je bij enkele nummers voorbij ziet komen.

Je ziet nog een kolom CD, daarmee kun je doorklikken naar de website van BOL waar de CD van de artiest staat (als het goed is ook met het nummer erop waar de CD bij staat in de lijst). Dit zijn oude linkjes (doorklikken werkt bij mij nog wel), maar de prijzen kunnen afwijken. Ik zag dat een aantal nu goedkoper geworden waren. Een CD van Frank Boeijen kon je alleen nog maar de 2e-hands versie kopen, dus gewoon doorklikken en kijken of je wat leuks tegen komt!

De komende dagen genieten van mooie muziek, terwijl ik op mijn computer alweer met andere projecten bezig ben. Never a dull moment :)

Iedereen fijne dagen en ik hoop in 2020 hier weer wat vaker wat interessant leesvoer te plaatsen!