skip to content
carldmitchell.com
← all projects

Year-End Charts

The top 100 songs of every year since 1959 on the Hot 100 and Country charts, each linked to its video, with one-click playlists.

details

status
live
group
music
stack
Python, BeautifulSoup, yt-dlp, static HTML/JS
since
2026-08

readme

Pick a chart and a year, see that year's top 100, and click any song to watch it. Two charts, Billboard's Hot 100 and Country, 67 years each (1959–2025), 13,400 chart entries. It started as a Hot 100 index and grew a second chart and playlists.

Playing a year

Each year has Play 1–50, Play 51–100 and Shuffle buttons. They open a temporary YouTube playlist from a plain link, with no API key and no login. YouTube caps those playlists at 50 videos, which is why a year is split in two. Shuffle picks 50 at random on every click, and only from songs whose video match is confirmed or high confidence.

The Country chart

Billboard publishes a full 100-song country year-end list only from 2011. For 1959–2010 its online lists are short or missing, so I built my own ranking from 2,719 of its weekly country charts. Each week a song earns points for its position, squared so the big hits count most, and the top 100 for the chart year are kept.

I fitted the scoring rule and the chart-year start date per decade against the partial year-end lists Billboard does publish. Where its list is close to complete (1988 on), my ranking matches 90–95% of its songs. For 1970–1987 its lists have under 50 songs and the match is 71%. For 1959–1969 it has nothing online to check against.

The pipeline

  1. Scrape: Wikipedia's year-end Hot 100 lists, Billboard's country year-end lists, and Billboard's weekly country charts.
  2. Rank: the weekly charts become a year-end top 100 for 1959–2010.
  3. Sweep: for each song, a yt-dlp search for "title artist official video". The sweep can be resumed, and slow retries pick up the searches YouTube throttled.
  4. Score: each match is graded high, medium, low or missing by comparing the title and artist against the video and channel.
  5. Build: charts, matches and my fixes become one static data file.

A song that charted in several years, or on both charts, is searched once and fixed once.

Fixing it in place

Automated matching can't be perfect across 13,400 entries, so the live page has a moderation mode behind an admin code. It filters to flagged songs, shows each match's confidence, and lets me confirm a match, paste a better video, or mark a song as having no usable video. Fixes are live on the next page load. Visitors never see the controls, and the server refuses saves without the admin cookie.

Data ownership

The server owns the fixes and my laptop owns the code and the scraped data. Deploying never overwrites fixes, and a pull script brings them back down. That split exists so a deploy can never undo an hour of moderation.