Enhance album cards with improved layout, Wikipedia links, and mobile optimization

- Redesigned album card layout with grid-based header (rank + details)
- Added Wikipedia links for all albums with accurate URL mappings
- Improved description formatting with proper paragraphs and typography
- Made stats cards clickable filters that maintain static numbers
- Significantly increased album art size on mobile devices (280px/240px vs 120px)
- Enhanced visual feedback for interactive elements

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Johan Lundberg 2025-07-01 20:57:52 +02:00
parent 88a6434132
commit ed8ad3c02a
3 changed files with 724 additions and 29 deletions

140
script.js
View file

@ -4,6 +4,7 @@ let filteredData = [];
let currentPage = 1;
const itemsPerPage = 50;
let isReversed = false;
let wikipediaUrlMappings = {};
// DOM elements
const albumsGrid = document.getElementById('albumsGrid');
@ -19,11 +20,24 @@ const stats = document.getElementById('stats');
// Initialize the application
document.addEventListener('DOMContentLoaded', function() {
loadWikipediaMapping();
loadAlbumsData();
setupEventListeners();
handleUrlParams();
});
// Load Wikipedia URL mappings
async function loadWikipediaMapping() {
try {
const response = await fetch('wikipedia_urls_mapping.json');
if (response.ok) {
wikipediaUrlMappings = await response.json();
}
} catch (err) {
console.warn('Could not load Wikipedia URL mappings:', err);
}
}
// Setup event listeners
function setupEventListeners() {
searchInput.addEventListener('input', debounce(handleSearch, 300));
@ -35,6 +49,53 @@ function setupEventListeners() {
// Add scroll listener for infinite scroll
window.addEventListener('scroll', handleScroll);
// Add click listeners to stats cards
setupStatsClickHandlers();
}
// Setup click handlers for stats cards
function setupStatsClickHandlers() {
const totalAlbumsCard = document.querySelector('.stat-item:has(#totalAlbums)') ||
document.querySelector('#totalAlbums').closest('.stat-item');
const newAlbumsCard = document.querySelector('.stat-item:has(#newAlbums)') ||
document.querySelector('#newAlbums').closest('.stat-item');
const improvedAlbumsCard = document.querySelector('.stat-item:has(#improvedAlbums)') ||
document.querySelector('#improvedAlbums').closest('.stat-item');
const droppedAlbumsCard = document.querySelector('.stat-item:has(#droppedAlbums)') ||
document.querySelector('#droppedAlbums').closest('.stat-item');
if (totalAlbumsCard) {
totalAlbumsCard.addEventListener('click', () => handleStatsCardClick(''));
totalAlbumsCard.style.cursor = 'pointer';
}
if (newAlbumsCard) {
newAlbumsCard.addEventListener('click', () => handleStatsCardClick('New in 2023'));
newAlbumsCard.style.cursor = 'pointer';
}
if (improvedAlbumsCard) {
improvedAlbumsCard.addEventListener('click', () => handleStatsCardClick('improved'));
improvedAlbumsCard.style.cursor = 'pointer';
}
if (droppedAlbumsCard) {
droppedAlbumsCard.addEventListener('click', () => handleStatsCardClick('dropped'));
droppedAlbumsCard.style.cursor = 'pointer';
}
}
// Handle stats card clicks
function handleStatsCardClick(filterValue) {
// Update the status filter dropdown
statusFilter.value = filterValue;
// Trigger the filter change
statusFilter.dispatchEvent(new Event('change'));
// Scroll to the albums grid
albumsGrid.scrollIntoView({ behavior: 'smooth' });
}
// Load albums data from CSV
@ -51,7 +112,7 @@ async function loadAlbumsData() {
hideLoading();
renderAlbums();
updateStats();
initializeStats();
} catch (err) {
console.error('Error loading data:', err);
@ -155,13 +216,13 @@ function createAlbumCard(album) {
const coverImagePath = getCoverImagePath(album);
card.innerHTML = `
<div class="album-header-grid">
<div class="album-rank">#${album.Rank}</div>
<div class="album-content">
<div class="album-details">
<div class="album-title">${escapeHtml(album.Album)}</div>
<div class="album-artist">${escapeHtml(album.Artist)}</div>
${album.Info ? `<div class="album-info">${escapeHtml(album.Info)}</div>` : ''}
<div class="album-status ${statusClass}">${statusText}</div>
${album.Description ? `<div class="album-description">${escapeHtml(album.Description)}</div>` : ''}
</div>
</div>
<div class="album-cover">
${coverImagePath ?
@ -170,6 +231,13 @@ function createAlbumCard(album) {
`<div class="album-cover-icon">🎵</div>`
}
</div>
<div class="album-status ${statusClass}">${statusText}</div>
${album.Description ? `<div class="album-description">${formatDescription(album.Description)}</div>` : ''}
<div class="album-links">
<a href="${generateWikipediaUrl(album.Album, album.Artist)}" target="_blank" rel="noopener noreferrer" class="wikipedia-link">
View on Wikipedia
</a>
</div>
<button class="album-share" title="Share this album" data-rank="${album.Rank}">🔗</button>
`;
@ -315,11 +383,12 @@ function handleScroll() {
}
// Update statistics
function updateStats() {
const total = filteredData.length;
const newAlbums = filteredData.filter(album => album.Status === 'New in 2023').length;
const improved = filteredData.filter(album => album.Status.startsWith('+')).length;
const dropped = filteredData.filter(album => album.Status.startsWith('-') || album.Status.startsWith('Dropped')).length;
// Initialize stats with static values from the full dataset (called only once)
function initializeStats() {
const total = albumsData.length;
const newAlbums = albumsData.filter(album => album.Status === 'New in 2023').length;
const improved = albumsData.filter(album => album.Status.startsWith('+')).length;
const dropped = albumsData.filter(album => album.Status.startsWith('-') || album.Status.startsWith('Dropped')).length;
document.getElementById('totalAlbums').textContent = total;
document.getElementById('newAlbums').textContent = newAlbums;
@ -327,6 +396,11 @@ function updateStats() {
document.getElementById('droppedAlbums').textContent = dropped;
}
// Update stats function (now empty but kept for compatibility)
function updateStats() {
// Stats remain static and don't update when filtering
}
// Utility functions
function debounce(func, wait) {
let timeout;
@ -347,6 +421,54 @@ function escapeHtml(text) {
return div.innerHTML;
}
function formatDescription(text) {
if (!text) return '';
// Split by double line breaks or periods followed by capital letters
const paragraphs = text
.split(/\n\n|\. (?=[A-Z])/)
.map(p => p.trim())
.filter(p => p.length > 0)
.map(p => p.endsWith('.') ? p : p + '.');
// If we only have one paragraph, try to split by sentences for better formatting
if (paragraphs.length === 1 && text.length > 200) {
const sentences = text.match(/[^.!?]+[.!?]+/g) || [text];
if (sentences.length > 3) {
// Group sentences into 2-3 paragraphs
const third = Math.ceil(sentences.length / 3);
return [
sentences.slice(0, third).join(' '),
sentences.slice(third, third * 2).join(' '),
sentences.slice(third * 2).join(' ')
].filter(p => p.trim()).map(p => `<p>${escapeHtml(p.trim())}</p>`).join('');
}
}
return paragraphs.map(p => `<p>${escapeHtml(p)}</p>`).join('');
}
function generateWikipediaUrl(album, artist) {
// Clean up album and artist names
const albumName = album.trim();
const artistName = artist.trim();
// Check if we have the exact Wikipedia URL from our mapping
if (wikipediaUrlMappings[albumName]) {
return `https://en.wikipedia.org/wiki/${wikipediaUrlMappings[albumName]}`;
}
// Remove "The" from the beginning of artist names for URL formatting
const artistForUrl = artistName.replace(/^The /, '');
// Format for Wikipedia URL - replace spaces with underscores
const albumUrl = albumName.replace(/ /g, '_');
const artistUrl = artistForUrl.replace(/ /g, '_');
// Default pattern: Album_Name_(Artist_Name_album)
return `https://en.wikipedia.org/wiki/${encodeURIComponent(albumUrl)}_(${encodeURIComponent(artistUrl)}_album)`;
}
function hideLoading() {
loading.style.display = 'none';
albumsGrid.style.display = 'grid';

View file

@ -222,11 +222,14 @@ body {
border-radius: 12px;
text-align: center;
box-shadow: 0 4px 20px rgba(0,0,0,0.1);
transition: transform 0.3s ease;
transition: all 0.3s ease;
cursor: pointer;
}
.stat-item:hover {
transform: translateY(-2px);
box-shadow: 0 6px 24px rgba(0,0,0,0.15);
background: rgba(102, 126, 234, 0.05);
}
.stat-number {
@ -260,14 +263,15 @@ body {
transition: all 0.3s ease;
cursor: pointer;
display: flex;
align-items: center;
gap: 1.5rem;
flex-direction: column;
gap: 1rem;
position: relative;
}
.album-cover {
width: 180px;
height: 180px;
width: 600px;
height: 600px;
max-width: 100%;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border-radius: 8px;
flex-shrink: 0;
@ -280,6 +284,8 @@ body {
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
position: relative;
overflow: hidden;
margin: 0 auto;
align-self: center;
}
.album-cover:has(.album-cover-image) {
@ -308,7 +314,7 @@ body {
}
.album-cover-icon {
font-size: 4rem;
font-size: 6rem;
opacity: 0.8;
z-index: 1;
position: relative;
@ -366,22 +372,31 @@ body {
box-shadow: 0 8px 32px rgba(0,0,0,0.15);
}
.album-header-grid {
display: grid;
grid-template-columns: 100px 1fr;
gap: 1.5rem;
align-items: center;
}
.album-rank {
font-size: 2.5rem;
font-weight: 700;
color: #667eea;
min-width: 80px;
text-align: center;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
height: 100%;
}
.album-content {
flex: 1;
.album-details {
display: flex;
flex-direction: column;
gap: 0.5rem;
gap: 0.25rem;
}
.album-title {
font-size: 1.3rem;
font-weight: 600;
@ -432,9 +447,60 @@ body {
}
.album-description {
font-size: 0.9rem;
font-size: 0.95rem;
color: #555;
line-height: 1.5;
line-height: 1.7;
margin-top: 1rem;
text-align: justify;
max-width: 800px;
margin-left: auto;
margin-right: auto;
}
.album-description p {
margin: 0 0 1rem 0;
text-indent: 1.5em;
}
.album-description p:first-child {
text-indent: 0;
}
.album-description p:last-child {
margin-bottom: 0;
}
.album-links {
margin-top: 1.5rem;
text-align: center;
padding-top: 1rem;
border-top: 1px solid #eee;
}
.wikipedia-link {
display: inline-block;
color: #667eea;
text-decoration: none;
font-size: 0.9rem;
font-weight: 500;
padding: 0.5rem 1rem;
border-radius: 20px;
background: rgba(102, 126, 234, 0.1);
transition: all 0.3s ease;
}
.wikipedia-link::before {
content: "🔗 ";
font-size: 0.8rem;
}
.wikipedia-link:hover {
background: rgba(102, 126, 234, 0.2);
transform: translateY(-1px);
}
.wikipedia-link:active {
transform: translateY(0);
}
@ -531,13 +597,13 @@ body {
}
.album-cover {
width: 120px;
height: 120px;
width: 280px;
height: 280px;
align-self: center;
}
.album-cover-icon {
font-size: 3rem;
font-size: 5rem;
}
.stats {
@ -561,4 +627,13 @@ body {
.stats {
grid-template-columns: 1fr;
}
.album-cover {
width: 240px;
height: 240px;
}
.album-cover-icon {
font-size: 4.5rem;
}
}

498
wikipedia_urls_mapping.json Normal file
View file

@ -0,0 +1,498 @@
{
"What's Going On": "What%27s_Going_On_(Marvin_Gaye_album)",
"Pet Sounds": "Pet_Sounds",
"Blue": "Blue_(Joni_Mitchell_album)",
"Songs in the Key of Life": "Songs_in_the_Key_of_Life",
"Abbey Road": "Abbey_Road",
"Nevermind": "Nevermind",
"Rumours": "Rumours_(album)",
"Purple Rain": "Purple_Rain_(album)",
"Blood on the Tracks": "Blood_on_the_Tracks",
"The Miseducation of Lauryn Hill": "The_Miseducation_of_Lauryn_Hill",
"Revolver": "Revolver_(Beatles_album)",
"Thriller": "Thriller_(Michael_Jackson_album)",
"I Never Loved a Man the Way I Love You": "I_Never_Loved_a_Man_the_Way_I_Love_You",
"Exile on Main St.": "Exile_on_Main_St.",
"It Takes a Nation of Millions to Hold Us Back": "It_Takes_a_Nation_of_Millions_to_Hold_Us_Back",
"London Calling": "London_Calling",
"My Beautiful Dark Twisted Fantasy": "My_Beautiful_Dark_Twisted_Fantasy",
"Highway 61 Revisited": "Highway_61_Revisited",
"To Pimp a Butterfly": "To_Pimp_a_Butterfly",
"Kid A": "Kid_A",
"Born to Run": "Born_to_Run",
"Ready to Die": "Ready_to_Die",
"The Velvet Underground & Nico": "The_Velvet_Underground_%26_Nico",
"Sgt. Pepper's Lonely Hearts Club Band": "Sgt._Pepper%27s_Lonely_Hearts_Club_Band",
"Tapestry": "Tapestry_(Carole_King_album)",
"Horses": "Horses_(album)",
"Enter the Wu-Tang (36 Chambers)": "Enter_the_Wu-Tang_(36_Chambers)",
"Voodoo": "Voodoo_(D%27Angelo_album)",
"The Beatles": "The_Beatles_(album)",
"Are You Experienced": "Are_You_Experienced",
"Kind of Blue": "Kind_of_Blue",
"Lemonade": "Lemonade_(Beyonc%C3%A9_album)",
"Back to Black": "Back_to_Black",
"Innervisions": "Innervisions",
"Rubber Soul": "Rubber_Soul",
"Off the Wall": "Off_the_Wall",
"The Chronic": "The_Chronic",
"Blonde on Blonde": "Blonde_on_Blonde",
"Remain in Light": "Remain_in_Light",
"The Rise and Fall of Ziggy Stardust and the Spiders from Mars": "The_Rise_and_Fall_of_Ziggy_Stardust_and_the_Spiders_from_Mars",
"Let It Bleed": "Let_It_Bleed",
"OK Computer": "OK_Computer",
"The Low End Theory": "The_Low_End_Theory",
"Illmatic": "Illmatic",
"Sign o' the Times": "Sign_o%27_the_Times",
"Graceland": "Graceland_(album)",
"Ramones": "Ramones_(album)",
"Exodus": "Exodus_(Bob_Marley_and_the_Wailers_album)",
"Aquemini": "Aquemini",
"The Blueprint": "The_Blueprint",
"The Great Twenty-Eight": "The_Great_Twenty-Eight",
"Station to Station": "Station_to_Station",
"Electric Ladyland": "Electric_Ladyland",
"Star Time": "Star_Time_(album)",
"The Dark Side of the Moon": "The_Dark_Side_of_the_Moon",
"Exile in Guyville": "Exile_in_Guyville",
"The Band": "The_Band_(album)",
"Led Zeppelin IV": "Led_Zeppelin_IV",
"Talking Book": "Talking_Book",
"Astral Weeks": "Astral_Weeks",
"Paid in Full": "Paid_in_Full_(album)",
"Appetite for Destruction": "Appetite_for_Destruction",
"Aja": "Aja_(album)",
"Stankonia": "Stankonia",
"Live at the Apollo": "Live_at_the_Apollo_(1963_album)",
"A Love Supreme": "A_Love_Supreme",
"Reasonable Doubt": "Reasonable_Doubt_(album)",
"Hounds of Love": "Hounds_of_Love",
"Jagged Little Pill": "Jagged_Little_Pill",
"Straight Outta Compton": "Straight_Outta_Compton",
"Renaissance": "Renaissance_(Beyonce_album)",
"Harvest": "Harvest_(Neil_Young_album)",
"Loveless": "Loveless_(album)",
"The College Dropout": "The_College_Dropout",
"Lady Soul": "Lady_Soul",
"Super Fly": "Super_Fly_(soundtrack)",
"Who's Next": "Who%27s_Next",
"The Sun Sessions": "The_Sun_Sessions",
"Blonde": "Blonde_(Frank_Ocean_album)",
"Never Mind the Bollocks, Here's the Sex Pistols": "Never_Mind_the_Bollocks,_Here%27s_the_Sex_Pistols",
"Beyoncé": "Beyonc%C3%A9_(album)",
"There's a Riot Goin' On": "There%27s_a_Riot_Goin%27_On",
"Dusty in Memphis": "Dusty_in_Memphis",
"Back in Black": "Back_in_Black",
"John Lennon/Plastic Ono Band": "John_Lennon/Plastic_Ono_Band",
"The Doors": "The_Doors_(album)",
"Bitches Brew": "Bitches_Brew",
"Hunky Dory": "Hunky_Dory",
"Baduizm": "Baduizm",
"After the Gold Rush": "After_the_Gold_Rush",
"Darkness on the Edge of Town": "Darkness_on_the_Edge_of_Town",
"Axis: Bold as Love": "Axis:_Bold_as_Love",
"Supa Dupa Fly": "Supa_Dupa_Fly",
"Fun House": "Fun_House_(The_Stooges_album)",
"Take Care": "Take_Care_(album)",
"Automatic for the People": "Automatic_for_the_People",
"Master of Puppets": "Master_of_Puppets",
"Car Wheels on a Gravel Road": "Car_Wheels_on_a_Gravel_Road",
"Red": "Red_(Black_Uhuru_album)",
"Music from Big Pink": "Music_from_Big_Pink",
"Led Zeppelin": "Led_Zeppelin_(album)",
"The Clash": "The_Clash_(album)",
"3 Feet High and Rising": "3_Feet_High_and_Rising",
"Sticky Fingers": "Sticky_Fingers",
"At Fillmore East": "At_Fillmore_East",
"Live Through This": "Live_Through_This",
"Marquee Moon": "Marquee_Moon",
"When the Pawn...": "When_the_Pawn...",
"Transformer": "Transformer_(Lou_Reed_album)",
"Court and Spark": "Court_and_Spark",
"Control": "Control_(Janet_Jackson_album)",
"Goodbye Yellow Brick Road": "Goodbye_Yellow_Brick_Road",
"The Queen Is Dead": "The_Queen_Is_Dead",
"Is This It": "Is_This_It",
"Good Kid, M.A.A.D City": "Good_Kid,_M.A.A.D_City",
"Disintegration": "Disintegration_(The_Cure_album)",
"Late Registration": "Late_Registration",
"Hotel California": "Hotel_California_(Eagles_album)",
"Stand!": "Stand!",
"Moondance": "Moondance",
"This Year's Model": "This_Year%27s_Model",
"The Downward Spiral": "The_Downward_Spiral",
"Led Zeppelin II": "Led_Zeppelin_II",
"Achtung Baby": "Achtung_Baby",
"Paul's Boutique": "Paul%27s_Boutique",
"My Life": "My_Life_(Mary_J._Blige_album)",
"Modern Sounds in Country and Western Music": "Modern_Sounds_in_Country_and_Western_Music",
"A Night at the Opera": "A_Night_at_the_Opera_(Queen_album)",
"The Wall": "The_Wall",
"1999": "1999_(Prince_album)",
"Dummy": "Dummy_(album)",
"40 Greatest Hits": "40_Greatest_Hits_(Hank_Williams_album)",
"Hejira": "Hejira_(album)",
"The Score": "The_Score_(Fugees_album)",
"The Joshua Tree": "The_Joshua_Tree",
"Maggot Brain": "Maggot_Brain",
"21": "21_(Adele_album)",
"The Immaculate Collection": "The_Immaculate_Collection",
"Paranoid": "Paranoid_(album)",
"Catch a Fire": "Catch_a_Fire",
"Doolittle": "Doolittle_(album)",
"Born in the U.S.A.": "Born_in_the_U.S.A.",
"The Velvet Underground": "The_Velvet_Underground_(album)",
"Physical Graffiti": "Physical_Graffiti",
"The Marshall Mathers LP": "The_Marshall_Mathers_LP",
"Parallel Lines": "Parallel_Lines",
"Grace": "Grace_(Jeff_Buckley_album)",
"Channel Orange": "Channel_Orange",
"John Prine": "John_Prine_(album)",
"Nebraska": "Nebraska_(album)",
"Faith": "Faith_(George_Michael_album)",
"Pretenders": "Pretenders_(album)",
"Rid of Me": "Rid_of_Me",
"Amazing Grace": "Amazing_Grace_(Aretha_Franklin_album)",
"The Black Album": "The_Black_Album_(Jay-Z_album)",
"Let It Be": "Let_It_Be_(album)",
"(What's the Story) Morning Glory?": "(What%27s_the_Story)_Morning_Glory%3F",
"Mama's Gun": "Mama%27s_Gun",
"Synchronicity": "Synchronicity_(The_Police_album)",
"Ten": "Ten_(Pearl_Jam_album)",
"Crosby, Stills & Nash": "Crosby,_Stills_%26_Nash_(album)",
"Different Class": "Different_Class",
"Saturday Night Fever": "Saturday_Night_Fever_(soundtrack)",
"At Folsom Prison": "At_Folsom_Prison",
"Murmur": "Murmur_(album)",
"20 Golden Greats": "20_Golden_Greats_(Buddy_Holly_%26_The_Crickets_album)",
"Violator": "Violator_(album)",
"Can't Buy a Thrill": "Can%27t_Buy_a_Thrill",
"The Stranger": "The_Stranger_(album)",
"Folklore": "Folklore_(Taylor_Swift_album)",
"Daydream Nation": "Daydream_Nation",
"Bridge over Troubled Water": "Bridge_over_Troubled_Water",
"In Utero": "In_Utero_(album)",
"The Harder They Come": "The_Harder_They_Come_(soundtrack)",
"Damn": "Damn_(Kendrick_Lamar_album)",
"Fear of a Black Planet": "Fear_of_a_Black_Planet",
"Every Picture Tells a Story": "Every_Picture_Tells_a_Story",
"Otis Blue/Otis Redding Sings Soul": "Otis_Blue/Otis_Redding_Sings_Soul",
"Life After Death": "Life_After_Death",
"Forever Changes": "Forever_Changes",
"Bringing It All Back Home": "Bringing_It_All_Back_Home",
"Sweet Baby James": "Sweet_Baby_James",
"Brown Sugar": "Brown_Sugar_(D%27Angelo_album)",
"She's So Unusual": "She%27s_So_Unusual",
"Beggars Banquet": "Beggars_Banquet",
"Blood Sugar Sex Magik": "Blood_Sugar_Sex_Magik",
"AmeriKKKa's Most Wanted": "AmeriKKKa%27s_Most_Wanted",
"Electric Warrior": "Electric_Warrior",
"Dig Me Out": "Dig_Me_Out",
"Tommy": "Tommy_(The_Who_album)",
"At Last!": "At_Last!",
"Licensed to Ill": "Licensed_to_Ill",
"Willy and the Poor Boys": "Willy_and_the_Poor_Boys",
"Bad": "Bad_(album)",
"Songs of Leonard Cohen": "Songs_of_Leonard_Cohen",
"Body Talk": "Body_Talk_(Robyn_album)",
"Meet the Beatles!": "Meet_the_Beatles!",
"The B-52's": "The_B-52%27s_(album)",
"Slanted and Enchanted": "Slanted_and_Enchanted",
"Diamond Life": "Diamond_Life",
"Midnight Marauders": "Midnight_Marauders",
"Homogenic": "Homogenic",
"Pink Moon": "Pink_Moon",
"Graduation": "Graduation_(album)",
"Tea for the Tillerman": "Tea_for_the_Tillerman",
"Low": "Low_(David_Bowie_album)",
"Eagles": "Eagles_(album)",
"Tha Carter III": "Tha_Carter_III",
"Raising Hell": "Raising_Hell_(album)",
"The Birth of Soul": "The_Birth_of_Soul",
"Unknown Pleasures": "Unknown_Pleasures",
"Wild Is the Wind": "Wild_Is_the_Wind_(album)",
"The Idler Wheel...": "The_Idler_Wheel...",
"Wildflowers": "Wildflowers_(Tom_Petty_album)",
"American Beauty": "American_Beauty_(album)",
"Either/Or": "Either/Or_(album)",
"Definitely Maybe": "Definitely_Maybe",
"CrazySexyCool": "CrazySexyCool",
"Only Built 4 Cuban Linx...": "Only_Built_4_Cuban_Linx...",
"Déjà Vu": "D%C3%A9j%C3%A0_Vu_(Crosby,_Stills,_Nash_%26_Young_album)",
"Rage Against the Machine": "Rage_Against_the_Machine_(album)",
"Ray of Light": "Ray_of_Light",
"Imagine": "Imagine_(John_Lennon_album)",
"Fly": "Fly_(Dixie_Chicks_album)",
"Yankee Hotel Foxtrot": "Yankee_Hotel_Foxtrot",
"Layla and Other Assorted Love Songs": "Layla_and_Other_Assorted_Love_Songs",
"Here's Little Richard": "Here%27s_Little_Richard",
"De La Soul Is Dead": "De_La_Soul_Is_Dead",
"The Ultimate Collection": "The_Ultimate_Collection_(2000_Patsy_Cline_album)",
"Anti": "Anti_(album)",
"Damn the Torpedoes": "Damn_the_Torpedoes_(album)",
"Giant Steps": "Giant_Steps",
"Little Earthquakes": "Little_Earthquakes",
"Master of Reality": "Master_of_Reality",
"Metallica": "Metallica_(album)",
"Discovery": "Discovery_(Daft_Punk_album)",
"Red Headed Stranger": "Red_Headed_Stranger",
"Trans-Europe Express": "Trans-Europe_Express_(album)",
"Criminal Minded": "Criminal_Minded",
"Live at the Harlem Square Club, 1963": "Live_at_the_Harlem_Square_Club,_1963",
"Blue Lines": "Blue_Lines",
"Loaded": "Loaded_(The_Velvet_Underground_album)",
"Odessey and Oracle": "Odessey_and_Oracle",
"808s & Heartbreak": "808s_%26_Heartbreak",
"Heaven or Las Vegas": "Heaven_or_Las_Vegas",
"Mama Said Knock You Out": "Mama_Said_Knock_You_Out",
"Love Deluxe": "Love_Deluxe",
"American Idiot": "American_Idiot",
"Whitney Houston": "Whitney_Houston_(album)",
"Singles Going Steady": "Singles_Going_Steady",
"Honky Château": "Honky_Ch%C3%A2teau",
"Q: Are We Not Men? A: We Are Devo!": "Q._Are_We_Not_Men%3F_A:_We_Are_Devo!",
"The Piper at the Gates of Dawn": "The_Piper_at_the_Gates_of_Dawn",
"Head Hunters": "Head_Hunters",
"The Freewheelin' Bob Dylan": "The_Freewheelin%27_Bob_Dylan",
"Tracy Chapman": "Tracy_Chapman_(album)",
"Coat of Many Colors": "Coat_of_Many_Colors",
"The Hissing of Summer Lawns": "The_Hissing_of_Summer_Lawns",
"Pearl": "Pearl_(Janis_Joplin_album)",
"Cut": "Cut_(The_Slits_album)",
"Check Your Head": "Check_Your_Head",
"Power, Corruption & Lies": "Power,_Corruption_%26_Lies",
"A Hard Day's Night": "A_Hard_Day%27s_Night_(album)",
"Wish You Were Here": "Wish_You_Were_Here_(Pink_Floyd_album)",
"Wowee Zowee": "Wowee_Zowee",
"Help!": "Help!",
"Double Nickels on the Dime": "Double_Nickels_on_the_Dime",
"Sail Away": "Sail_Away_(Randy_Newman_album)",
"Yeezus": "Yeezus",
"Golden Hour": "Golden_Hour_(Kacey_Musgraves_album)",
"What's the 411?": "What%27s_the_411%3F",
"White Light/White Heat": "White_Light/White_Heat",
"Entertainment!": "Entertainment!",
"Sweetheart of the Rodeo": "Sweetheart_of_the_Rodeo",
"Curtis": "Curtis_(Curtis_Mayfield_album)",
"The Bends": "The_Bends_(album)",
"The Diary of Alicia Keys": "The_Diary_of_Alicia_Keys",
"Houses of the Holy": "Houses_of_the_Holy",
"MTV Unplugged in New York": "MTV_Unplugged_in_New_York",
"Get Rich or Die Tryin'": "Get_Rich_or_Die_Tryin%27",
"Nilsson Schmilsson": "Nilsson_Schmilsson",
"In the Wee Small Hours": "In_the_Wee_Small_Hours",
"Bad Girls": "Bad_Girls_(Donna_Summer_album)",
"Down Every Road 19621994": "Down_Every_Road_1962%E2%80%931994",
"Third/Sister Lovers": "Third/Sister_Lovers",
"Californication": "Californication_(album)",
"Mr. Tambourine Man": "Mr._Tambourine_Man_(album)",
"The Modern Lovers": "The_Modern_Lovers_(album)",
"Post": "Post_(Bj%C3%B6rk_album)",
"Speakerboxxx/The Love Below": "Speakerboxxx/The_Love_Below",
"The Writing's on the Wall": "The_Writing%27s_on_the_Wall",
"Van Halen": "Van_Halen_(album)",
"Last Splash": "Last_Splash",
"Weezer": "Weezer_(Blue_Album)",
"Random Access Memories": "Random_Access_Memories",
"Rust Never Sleeps": "Rust_Never_Sleeps",
"So": "So_(album)",
"Full Moon Fever": "Full_Moon_Fever",
"Live at the Regal": "Live_at_the_Regal",
"Come On Over": "Come_On_Over",
"New York Dolls": "New_York_Dolls_(album)",
"Tonight's the Night": "Tonight%27s_the_Night_(Neil_Young_album)",
"The Definitive Collection": "The_Definitive_Collection_(ABBA_album)",
"Just as I Am": "Just_as_I_Am_(Bill_Withers_album)",
"Alive!": "Alive!_(Kiss_album)",
"I'm Still in Love with You": "I%27m_Still_in_Love_with_You_(Al_Green_album)",
"Portrait of a Legend: 19511964": "Portrait_of_a_Legend:_1951%E2%80%931964",
"Here Come the Warm Jets": "Here_Come_the_Warm_Jets",
"Closer": "Closer_(Joy_Division_album)",
"Pink Flag": "Pink_Flag",
"On the Beach": "On_the_Beach_(Neil_Young_album)",
"A Seat at the Table": "A_Seat_at_the_Table",
"Stories from the City, Stories from the Sea": "Stories_from_the_City,_Stories_from_the_Sea",
"One in a Million": "One_in_a_Million_(Aaliyah_album)",
"El Mal Querer": "El_mal_querer",
"The Who Sell Out": "The_Who_Sell_Out",
"Lady in Satin": "Lady_in_Satin",
"The Velvet Rope": "The_Velvet_Rope",
"The Stone Roses": "The_Stone_Roses_(album)",
"Los Angeles": "Los_Angeles_(X_album)",
"Norman Fucking Rockwell!": "Norman_Fucking_Rockwell!",
"From Elvis in Memphis": "From_Elvis_in_Memphis",
"Sandinista!": "Sandinista!",
"A Rush of Blood to the Head": "A_Rush_of_Blood_to_the_Head",
"All Killer, No Filler: The Anthology": "All_Killer,_No_Filler:_The_Anthology",
"Dirty Mind": "Dirty_Mind",
"Live at Leeds": "Live_at_Leeds",
"Modern Vampires of the City": "Modern_Vampires_of_the_City",
"Endtroducing.....": "Endtroducing.....",
"Aftermath": "Aftermath_(Rolling_Stones_album)",
"Like a Prayer": "Like_a_Prayer_(album)",
"Elvis Presley": "Elvis_Presley_(album)",
"Still Bill": "Still_Bill",
"Abraxas": "Abraxas_(album)",
"The Basement Tapes": "The_Basement_Tapes",
"Avalon": "Avalon_(Roxy_Music_album)",
"John Wesley Harding": "John_Wesley_Harding",
"Another Green World": "Another_Green_World",
"Janet Jackson's Rhythm Nation 1814": "Janet_Jackson%27s_Rhythm_Nation_1814",
"Doggystyle": "Doggystyle",
"Siamese Dream": "Siamese_Dream",
"Greatest Hits": "Greatest_Hits_(Sly_and_the_Family_Stone_album)",
"Funky Kingston": "Funky_Kingston",
"The Wild, the Innocent & the E Street Shuffle": "The_Wild,_the_Innocent_%26_the_E_Street_Shuffle",
"AM": "AM_(Arctic_Monkeys_album)",
"Liquid Swords": "Liquid_Swords",
"Time (The Revelator)": "Time_(The_Revelator)",
"Kick Out the Jams": "Kick_Out_the_Jams",
"Music of My Mind": "Music_of_My_Mind",
"SOS": "SOS_(SZA_album)",
"The Slim Shady LP": "The_Slim_Shady_LP",
"The Cars": "The_Cars_(album)",
"Germfree Adolescents": "Germfree_Adolescents",
"Black Sabbath": "Black_Sabbath_(album)",
"Gris-Gris": "Gris-Gris",
"Rain Dogs": "Rain_Dogs",
"Sour": "Sour_(album)",
"Radio City": "Radio_City_(album)",
"One Nation Under a Groove": "One_Nation_Under_a_Groove",
"The Black Parade": "The_Black_Parade",
"Never Too Much": "Never_Too_Much_(album)",
"Mothership Connection": "Mothership_Connection",
"More Songs About Buildings and Food": "More_Songs_About_Buildings_and_Food",
"Madvillainy": "Madvillainy",
"Rocks": "Rocks_(Aerosmith_album)",
"If You're Reading This It's Too Late": "If_You%27re_Reading_This_It%27s_Too_Late",
"All Things Must Pass": "All_Things_Must_Pass",
"The Infamous": "The_Infamous",
"Tha Carter II": "Tha_Carter_II",
"Anthology": "Anthology_(The_Supremes_album)",
"Cheap Thrills": "Cheap_Thrills_(Big_Brother_and_the_Holding_Company_album)",
"Hot Buttered Soul": "Hot_Buttered_Soul",
"King of the Delta Blues Singers": "King_of_the_Delta_Blues_Singers",
"Dookie": "Dookie",
"In the Aeroplane Over the Sea": "In_the_Aeroplane_Over_the_Sea",
"Fever to Tell": "Fever_to_Tell",
"Run-D.M.C.": "Run-D.M.C._(album)",
"Moving Pictures": "Moving_Pictures_(Rush_album)",
"Mingus Ah Um": "Mingus_Ah_Um",
"(Pronounced 'Lĕh-'nérd 'Skin-'nérd)": "(Pronounced_%27L%C4%95h-%27n%C3%A9rd_%27Skin-%27n%C3%A9rd)",
"Currents": "Currents_(Tame_Impala_album)",
"Mezzanine": "Mezzanine_(album)",
"The Kinks Are the Village Green Preservation Society": "The_Kinks_Are_the_Village_Green_Preservation_Society",
"Rocket to Russia": "Rocket_to_Russia",
"Donuts": "Donuts_(album)",
"In Rainbows": "In_Rainbows",
"Young, Gifted and Black": "Young,_Gifted_and_Black",
"The Emancipation of Mimi": "The_Emancipation_of_Mimi",
"Surfer Rosa": "Surfer_Rosa",
"Kaleidoscope": "Kaleidoscope_(Kelis_album)",
"Proud Mary: The Best of Ike & Tina Turner": "Proud_Mary:_The_Best_of_Ike_%26_Tina_Turner",
"1989": "1989_(Taylor_Swift_album)",
"Diana": "Diana_(album)",
"Black Messiah": "Black_Messiah_(album)",
"Something/Anything?": "Something/Anything%3F",
"When We All Fall Asleep, Where Do We Go?": "When_We_All_Fall_Asleep,_Where_Do_We_Go%3F",
"The Raincoats": "The_Raincoats_(album)",
"Brian Wilson Presents Smile": "Brian_Wilson_Presents_Smile",
"Beauty and the Beat": "Beauty_and_the_Beat_(The_Go-Go%27s_album)",
"Blondie": "Blondie_(album)",
"Expensive Shit": "Expensive_Shit",
"Supreme Clientele": "Supreme_Clientele",
"Rapture": "Rapture_(Anita_Baker_album)",
"Nuggets: Original Artyfacts from the First Psychedelic Era, 19651968": "Nuggets:_Original_Artyfacts_from_the_First_Psychedelic_Era,_1965%E2%80%931968",
"69 Love Songs": "69_Love_Songs",
"Everybody Knows This Is Nowhere": "Everybody_Knows_This_Is_Nowhere",
"Ace of Spades": "Ace_of_Spades_(Mot%C3%B6rhead_album)",
"Workingman's Dead": "Workingman%27s_Dead",
"Wild Honey": "Wild_Honey_(album)",
"Love and Theft": "Love_and_Theft_(Bob_Dylan_album)",
"Going to a Go-Go": "Going_to_a_Go-Go",
"Cosmo's Factory": "Cosmo%27s_Factory",
"Risqué": "Risqu%C3%A9_(album)",
"Look-Ka Py Py": "Look-Ka_Py_Py",
"Things Fall Apart": "Things_Fall_Apart_(album)",
"The Shape of Jazz to Come": "The_Shape_of_Jazz_to_Come",
"Brothers in Arms": "Brothers_in_Arms_(album)",
"Chief": "Chief_(album)",
"That's the Way of the World": "That%27s_the_Way_of_the_World",
"Arular": "Arular",
"Let's Get It On": "Let%27s_Get_It_On",
"I Can Hear the Heart Beating as One": "I_Can_Hear_the_Heart_Beating_as_One",
"Odelay": "Odelay",
"Paul Simon": "Paul_Simon_(album)",
"Lucinda Williams": "Lucinda_Williams_(album)",
"Call Me": "Call_Me_(Al_Green_album)",
"New Day Rising": "New_Day_Rising",
"Reach Out": "Reach_Out_(Four_Tops_album)",
"Un Verano Sin Ti": "Un_Verano_Sin_Ti",
"How Will the Wolf Survive?": "How_Will_the_Wolf_Survive%3F",
"Confessions": "Confessions_(Usher_album)",
"Sound of Silver": "Sound_of_Silver",
"Crooked Rain, Crooked Rain": "Crooked_Rain,_Crooked_Rain",
"Actually": "Actually",
"All Eyez on Me": "All_Eyez_on_Me",
"Demon Days": "Demon_Days",
"Parklife": "Parklife",
"Sex Machine": "Sex_Machine_(album)",
"Coal Miner's Daughter": "Coal_Miner%27s_Daughter_(album)",
"Blackout": "Blackout_(Britney_Spears_album)",
"Beauty Behind the Madness": "Beauty_Behind_the_Madness",
"Scary Monsters (and Super Creeps)": "Scary_Monsters_(and_Super_Creeps)",
"Extraordinary Machine": "Extraordinary_Machine",
"Close to the Edge": "Close_to_the_Edge",
"Journey in Satchidananda": "Journey_in_Satchidananda",
"X 100pre": "X_100pre",
"Complete & Unbelievable: The Otis Redding Dictionary of Soul": "Complete_%26_Unbelievable:_The_Otis_Redding_Dictionary_of_Soul",
"Elephant": "Elephant_(album)",
"Ram": "Ram_(album)",
"First Take": "First_Take_(album)",
"Pretty Hate Machine": "Pretty_Hate_Machine",
"Ege Bamyası": "Ege_Bamyas%C4%B1",
"Al Green's Greatest Hits": "Al_Green%27s_Greatest_Hits",
"I Do Not Want What I Haven't Got": "I_Do_Not_Want_What_I_Haven%27t_Got",
"Southeastern": "Southeastern_(album)",
"Man on the Moon: The End of Day": "Man_on_the_Moon:_The_End_of_Day",
"Melodrama": "Melodrama_(Lorde_album)",
"For Emma, Forever Ago": "For_Emma,_Forever_Ago",
"The Gilded Palace of Sin": "The_Gilded_Palace_of_Sin",
"Eli and the Thirteenth Confession": "Eli_and_the_Thirteenth_Confession",
"3 + 3": "3_%2B_3",
"The Best of the Classic Years": "The_Best_of_the_Classic_Years",
"BLACKsummers'night": "BLACKsummers%27night",
"Some Girls": "Some_Girls",
"Clandestino": "Clandestino",
"400 Degreez": "400_Degreez",
"Surrealistic Pillow": "Surrealistic_Pillow",
"Ctrl": "Ctrl_(SZA_album)",
"Barrio Fino": "Barrio_Fino",
"#1 Record": "Number_1_Record",
"Sheryl Crow": "Sheryl_Crow_(album)",
"Kimono My House": "Kimono_My_House",
"Moanin' in the Moonlight": "Moanin%27_in_the_Moonlight",
"Something Else by the Kinks": "Something_Else_by_the_Kinks",
"Amor Prohibido": "Amor_Prohibido",
"The Weight of These Wings": "The_Weight_of_These_Wings",
"If You're Feeling Sinister": "If_You%27re_Feeling_Sinister",
"Bizarre Ride II the Pharcyde": "Bizarre_Ride_II_the_Pharcyde",
"The Anthology: 19471972": "The_Anthology:_1947%E2%80%931972",
"Born This Way": "Born_This_Way_(album)",
"I Want to See the Bright Lights Tonight": "I_Want_to_See_the_Bright_Lights_Tonight",
"Continuum": "Continuum_(John_Mayer_album)",
"Damaged": "Damaged_(Black_Flag_album)",
"The Stooges": "The_Stooges_(album)",
"Back to Mono (19581969)": "Back_to_Mono_(1958%E2%80%931969)",
"Heart Like a Wheel": "Heart_Like_a_Wheel",
"Harry's House": "Harry%27s_House",
"Nick of Time": "Nick_of_Time_(album)",
"Here, My Dear": "Here,_My_Dear",
"Presenting the Fabulous Ronettes Featuring Veronica": "Presenting_the_Fabulous_Ronettes_Featuring_Veronica",
"II": "II_(Boyz_II_Men_album)",
"¿Dónde Están los Ladrones?": "D%C3%B3nde_Est%C3%A1n_los_Ladrones%3F",
"The Indestructible Beat of Soweto": "The_Indestructible_Beat_of_Soweto",
"Suicide": "Suicide_(1977_album)",
"Ask Rufus": "Ask_Rufus",
"Funeral": "Funeral_(Arcade_Fire_album)"
}