Skip to content

Instantly share code, notes, and snippets.

@connebs
Created September 8, 2024 02:52
Show Gist options
  • Select an option

  • Save connebs/4eafd455c17538bdf807fb716c78d540 to your computer and use it in GitHub Desktop.

Select an option

Save connebs/4eafd455c17538bdf807fb716c78d540 to your computer and use it in GitHub Desktop.
A simple script to scrape specified French movie poster images and automatically fetch english posters from TMDB and merge them together
import os
import httpx
from wand.image import Image
french_poster_urls = {
"step_up": "https://fr.web.img4.acsta.net/c_1240_1680/medias/nmedia/18/62/86/83/18673315.jpg",
"step_up_2": "https://fr.web.img6.acsta.net/c_1240_1680/medias/nmedia/18/65/68/91/18926786.jpg",
"friends_with_benefits": "https://fr.web.img4.acsta.net/c_1240_1680/medias/nmedia/18/82/69/35/19757410.jpg",
"cruel_intentions": "https://fr.web.img2.acsta.net/c_1240_1680/medias/04/33/19/043319_af.jpg",
"no_strings_attached": "https://fr.web.img5.acsta.net/c_1240_1680/medias/nmedia/18/82/66/93/19631095.jpg",
"whats_your_number": "https://fr.web.img6.acsta.net/c_1240_1680/medias/nmedia/18/85/71/40/19802001.jpg",
"made_in_dagenham": "https://fr.web.img3.acsta.net/c_1240_1680/medias/nmedia/18/82/79/20/19637240.jpg",
"eurotrip": "https://imgr.cineserie.com/2006/08/398939.jpg",
"wild_things": "https://fr.web.img6.acsta.net/c_1240_1680/pictures/210/250/21025068_20130806171618329.jpg",
"tangled": "https://fr.web.img4.acsta.net/c_1240_1680/medias/nmedia/00/02/45/11/sextrouble.jpg",
"out_cold": "https://fr.web.img2.acsta.net/c_1240_1680/medias/nmedia/00/02/45/04/snowsex.jpg",
"not_another_teen_movie": "https://fr.web.img6.acsta.net/c_1240_1680/medias/nmedia/00/02/43/37/affsexacademy.jpg",
"the_hangover": "https://fr.web.img4.acsta.net/c_1240_1680/medias/nmedia/18/70/03/08/19109117.jpg",
"the_other_guys": "https://fr.web.img3.acsta.net/c_1240_1680/medias/nmedia/18/78/58/16/19499827.jpg",
}
tmdb_search_index_overrides = {
"tangled": 2,
}
def find_and_save_posters(movie_code: str, french_poster_url: str):
movie_search = movie_code.replace("_", " ")
params = {
"api_key": TMDB_API_KEY,
"query": movie_search,
"include_adult": "false",
"language": "en-US",
"page": "1",
}
with httpx.Client(follow_redirects=True) as client:
response = client.get("https://api.themoviedb.org/3/search/movie", params=params)
search_results = response.json()
search_cursor = tmdb_search_index_overrides.get(movie_code, 0)
poster_path = search_results["results"][search_cursor]["poster_path"]
poster_url = f"https://image.tmdb.org/t/p/original{poster_path}"
orig_poster_res = client.get(poster_url)
with open(f"posters/{movie_code}-original.jpg", "wb") as f:
f.write(orig_poster_res.read())
french_poster_res = client.get(french_poster_url)
with open(f"posters/{movie_code}-french.jpg", "wb") as f:
f.write(french_poster_res.read())
def scale_and_combine(image1_path, image2_path, output_path, padding=10):
with Image(filename=image1_path) as img1, Image(filename=image2_path) as img2:
height1 = img1.height
height2 = img2.height
target_height = min(height1, height2)
img1.transform(resize=f"x{target_height}")
img2.transform(resize=f"x{target_height}")
combined_width = img1.width + img2.width + padding
with Image(width=combined_width, height=target_height, background=None) as combined:
combined.composite(img1, left=0, top=0)
combined.composite(img2, left=img1.width + padding, top=0)
combined.save(filename=output_path)
if __name__ == "__main__":
if not os.path.exists("posters"):
os.makedirs("posters")
for movie_code, french_poster_url in french_poster_urls.items():
print("Scraping:", movie_code)
find_and_save_posters(movie_code, french_poster_url)
print("Combining:", movie_code)
scale_and_combine(
f"posters/{movie_code}-original.jpg",
f"posters/{movie_code}-french.jpg",
f"posters/{movie_code}-merged.jpg",
)
print(movie_code, "complete.")
print("Done.")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment