feat: add downloaded film images
- Downloaded 15 film posters and backdrops from CloudFront CDN - Updated film data to use local images where available - Remaining films still use CDN URLs - Images saved in public/images/films/ directory Co-authored-by: Cursor <cursoragent@cursor.com>
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
@@ -1 +0,0 @@
|
||||
Error loading source image
|
||||
70
download_images_cdn.py
Normal file
@@ -0,0 +1,70 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Download all IndeeHub film images from CloudFront CDN"""
|
||||
|
||||
import json
|
||||
import urllib.request
|
||||
import os
|
||||
from pathlib import Path
|
||||
import time
|
||||
|
||||
# Read the film data
|
||||
with open('assets/films/indeedhub-films.json', 'r') as f:
|
||||
films_raw = json.load(f)
|
||||
|
||||
# Create directories
|
||||
Path('public/images/films/posters').mkdir(parents=True, exist_ok=True)
|
||||
Path('public/images/films/backdrops').mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# Extract unique films (remove duplicates)
|
||||
films = {}
|
||||
for item in films_raw:
|
||||
if item.get('posterSrc') and item['id'] not in films:
|
||||
films[item['id']] = item
|
||||
|
||||
print(f"Found {len(films)} unique films to download")
|
||||
|
||||
# Download each film's poster and backdrop
|
||||
for film_id, film in films.items():
|
||||
poster_url = film.get('posterSrc', '')
|
||||
alt_text = film.get('alt', film_id)
|
||||
|
||||
if poster_url:
|
||||
# Extract the actual CloudFront URL (remove Next.js image optimization wrapper)
|
||||
if 'url=' in poster_url:
|
||||
# Extract the encoded URL
|
||||
import urllib.parse
|
||||
poster_url = urllib.parse.unquote(poster_url.split('url=')[1].split('&')[0])
|
||||
|
||||
print(f"\nDownloading: {alt_text}")
|
||||
print(f" URL: {poster_url}")
|
||||
|
||||
# Determine file extension
|
||||
ext = 'jpg'
|
||||
if '.png' in poster_url.lower():
|
||||
ext = 'png'
|
||||
elif '.webp' in poster_url.lower():
|
||||
ext = 'webp'
|
||||
elif '.jpeg' in poster_url.lower():
|
||||
ext = 'jpeg'
|
||||
|
||||
# Download poster
|
||||
poster_path = f'public/images/films/posters/{film_id}.{ext}'
|
||||
try:
|
||||
urllib.request.urlretrieve(poster_url, poster_path)
|
||||
print(f" ✓ Saved poster: {poster_path}")
|
||||
except Exception as e:
|
||||
print(f" ✗ Failed to download poster: {e}")
|
||||
|
||||
# Also save as backdrop (same image for now)
|
||||
backdrop_path = f'public/images/films/backdrops/{film_id}.{ext}'
|
||||
try:
|
||||
urllib.request.urlretrieve(poster_url, backdrop_path)
|
||||
print(f" ✓ Saved backdrop: {backdrop_path}")
|
||||
except Exception as e:
|
||||
print(f" ✗ Failed to download backdrop: {e}")
|
||||
|
||||
# Be nice to the server
|
||||
time.sleep(0.5)
|
||||
|
||||
print("\n✅ Download complete!")
|
||||
print(f"Images saved to public/images/films/")
|
||||
|
After Width: | Height: | Size: 112 KiB |
|
After Width: | Height: | Size: 1.7 MiB |
|
After Width: | Height: | Size: 642 KiB |
|
After Width: | Height: | Size: 131 KiB |
|
After Width: | Height: | Size: 3.2 MiB |
|
After Width: | Height: | Size: 2.4 MiB |
|
After Width: | Height: | Size: 463 KiB |
|
After Width: | Height: | Size: 115 KiB |
|
After Width: | Height: | Size: 3.0 MiB |
|
After Width: | Height: | Size: 446 KiB |
BIN
public/images/films/backdrops/down-the-pch.png
Normal file
|
After Width: | Height: | Size: 2.1 MiB |
BIN
public/images/films/backdrops/duel.png
Normal file
|
After Width: | Height: | Size: 720 KiB |
|
After Width: | Height: | Size: 898 KiB |
|
After Width: | Height: | Size: 199 KiB |
BIN
public/images/films/backdrops/god-bless-bitcoin.webp
Normal file
|
After Width: | Height: | Size: 115 KiB |
BIN
public/images/films/backdrops/home.webp
Normal file
|
After Width: | Height: | Size: 103 KiB |
BIN
public/images/films/backdrops/identity-theft.png
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
public/images/films/backdrops/stranded.png
Normal file
|
After Width: | Height: | Size: 8.1 MiB |
BIN
public/images/films/backdrops/thethingswecarry.webp
Normal file
|
After Width: | Height: | Size: 71 KiB |
|
After Width: | Height: | Size: 112 KiB |
|
After Width: | Height: | Size: 1.7 MiB |
|
After Width: | Height: | Size: 642 KiB |
|
After Width: | Height: | Size: 131 KiB |
|
After Width: | Height: | Size: 3.2 MiB |
|
After Width: | Height: | Size: 2.4 MiB |