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.
kmftools/qrcodegen/qrcodegen-youtube.py

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)