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)