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 |