You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
6.8 KiB
165 lines
6.8 KiB
import pandas as pd
|
|
import qrcode
|
|
from PIL import Image, ImageDraw, ImageFont
|
|
from dotenv import load_dotenv
|
|
import os
|
|
import requests
|
|
import urllib.parse
|
|
|
|
# Geef het absolute pad op naar je .env bestand
|
|
env_path = "./.env" # Pas dit pad aan!
|
|
|
|
# Laad de .env bestand expliciet
|
|
load_dotenv(env_path)
|
|
|
|
# Controleer of de variabelen goed zijn geladen
|
|
YOUTUBE_API_KEY = os.getenv('YOUTUBE_API_KEY')
|
|
|
|
|
|
# Functie om de YouTube video link te verkrijgen
|
|
|
|
|
|
def get_youtube_video_url(title, artist):
|
|
# Encodeer de titel en artiest voor de zoekopdracht
|
|
query = f"{title} {artist}"
|
|
encoded_query = urllib.parse.quote_plus(query)
|
|
|
|
# Zoek naar de video op YouTube via de API
|
|
search_url = f"https://www.googleapis.com/youtube/v3/search?part=snippet&q={encoded_query}&key={YOUTUBE_API_KEY}&maxResults=1"
|
|
response = requests.get(search_url)
|
|
|
|
if response.status_code == 200:
|
|
results = response.json()
|
|
items = results.get('items', [])
|
|
|
|
if items:
|
|
# Haal de video-ID op van het zoekresultaat
|
|
video_id = items[0]['id'].get('videoId')
|
|
if video_id:
|
|
video_url = f"https://www.youtube.com/watch?v={video_id}"
|
|
return video_url
|
|
print(f"Fout bij het zoeken naar video voor '{title} - {artist}'")
|
|
return None
|
|
|
|
|
|
def generate_qr_codes_with_titles(csv_file, output_folder, position_column, title_column, artist_column, year_column):
|
|
# Maak de outputmap aan als die nog niet bestaat
|
|
os.makedirs(output_folder, exist_ok=True)
|
|
|
|
# Lees het CSV-bestand
|
|
try:
|
|
data = pd.read_csv(csv_file, delimiter=";")
|
|
except Exception as e:
|
|
print(f"Fout bij het lezen van de CSV: {e}")
|
|
return
|
|
|
|
# Controleer of de benodigde kolommen bestaan
|
|
if position_column not in data.columns or title_column not in data.columns or artist_column not in data.columns or year_column not in data.columns:
|
|
print(
|
|
f"Kolommen '{position_column}', '{title_column}', '{artist_column}' en/of '{year_column}' niet gevonden in CSV-bestand.")
|
|
return
|
|
|
|
# Loop door de rijen in de CSV
|
|
for index, row in data.iterrows():
|
|
position = row[position_column]
|
|
title = row[title_column]
|
|
artist = row[artist_column]
|
|
year = row[year_column]
|
|
|
|
# Verkrijg de YouTube link voor het nummer
|
|
url = get_youtube_video_url(title, artist)
|
|
|
|
if url:
|
|
# Print de URL in de console
|
|
print(f"Genereerde URL voor '{title} - {artist}': {url}")
|
|
|
|
try:
|
|
# Maak QR-code
|
|
qr = qrcode.QRCode(
|
|
version=1, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=4)
|
|
qr.add_data(url)
|
|
qr.make(fit=True)
|
|
qr_img = qr.make_image(
|
|
fill='black', back_color='white').convert("RGB")
|
|
|
|
# Maak een nieuwe afbeelding met ruimte voor de titel en URL
|
|
title_height = 50 # Hoogte voor de titeltekst
|
|
url_height = 30 # Hoogte voor de URL
|
|
total_width = qr_img.size[0]
|
|
total_height = qr_img.size[1] + title_height + url_height
|
|
|
|
img_with_title_and_url = Image.new(
|
|
"RGB", (total_width, total_height), "white")
|
|
draw = ImageDraw.Draw(img_with_title_and_url)
|
|
|
|
# Voeg de titel toe boven de QR-code
|
|
font_size = 20
|
|
try:
|
|
# Probeer een systeemfont te laden (je kunt dit aanpassen aan je systeem)
|
|
font = ImageFont.truetype("arial.ttf", font_size)
|
|
except:
|
|
# Gebruik een standaardfont als `arial.ttf` niet beschikbaar is
|
|
font = ImageFont.load_default()
|
|
|
|
# Gebruik textbbox() om de breedte en hoogte van de tekst te berekenen
|
|
text_bbox = draw.textbbox((0, 0), title, font=font)
|
|
text_width = text_bbox[2] - \
|
|
text_bbox[0] # breedte van de tekst
|
|
text_height = text_bbox[3] - \
|
|
text_bbox[1] # hoogte van de tekst
|
|
|
|
# Bereken de positie om de titel in het midden te plaatsen
|
|
text_x = (total_width - text_width) // 2
|
|
text_y = (title_height - text_height) // 2
|
|
draw.text((text_x, text_y), title, fill="black", font=font)
|
|
|
|
# Voeg de QR-code toe onder de titel
|
|
img_with_title_and_url.paste(qr_img, (0, title_height))
|
|
|
|
# Voeg de URL onder de QR-code toe
|
|
url_font_size = 15 # Kleinere tekst voor de URL
|
|
try:
|
|
# Probeer een systeemfont te laden voor de URL
|
|
url_font = ImageFont.truetype("arial.ttf", url_font_size)
|
|
except:
|
|
# Gebruik een standaardfont als `arial.ttf` niet beschikbaar is
|
|
url_font = ImageFont.load_default()
|
|
|
|
# Gebruik textbbox() om de breedte van de URL te berekenen
|
|
url_bbox = draw.textbbox((0, 0), url, font=url_font)
|
|
url_width = url_bbox[2] - url_bbox[0] # breedte van de URL
|
|
url_height = url_bbox[3] - url_bbox[1] # hoogte van de URL
|
|
|
|
# Bereken de positie om de URL in het midden te plaatsen
|
|
url_x = (total_width - url_width) // 2
|
|
url_y = total_height - url_height - 10 # 10 pixels van de onderkant
|
|
draw.text((url_x, url_y), url, fill="black", font=url_font)
|
|
|
|
# Maak de bestandsnaam: positie_titel.png
|
|
filename = f"{position}_{title}.png"
|
|
# Verwijder ongewenste tekens uit de bestandsnaam (zoals slashes, dubbele punten, enz.)
|
|
filename = filename.replace("/", "_").replace(":", "_")
|
|
|
|
# Sla de afbeelding op
|
|
img_with_title_and_url.save(
|
|
os.path.join(output_folder, filename))
|
|
print(
|
|
f"QR-code met titel '{title}' gegenereerd als '{filename}'")
|
|
except Exception as e:
|
|
print(
|
|
f"Fout bij het genereren van QR-code voor '{title}': {e}")
|
|
else:
|
|
print(f"Geen YouTube link gevonden voor '{title} - {artist}'")
|
|
|
|
|
|
# Voorbeeldgebruik
|
|
csv_file = "nummers.csv" # Vervang door je eigen CSV-bestand
|
|
output_folder = "qr_codes_with_titles" # Map waar QR-codes worden opgeslagen
|
|
position_column = "positie" # De kolomnaam in de CSV met de posities
|
|
title_column = "titel" # De kolomnaam in de CSV met de titels
|
|
artist_column = "artiest" # De kolomnaam in de CSV met de artiesten
|
|
year_column = "jaar" # De kolomnaam in de CSV met de jaren
|
|
|
|
generate_qr_codes_with_titles(
|
|
csv_file, output_folder, position_column, title_column, artist_column, year_column)
|