import os import sys import base64 import requests import urllib.parse import pandas as pd import qrcode import logging from PIL import Image, ImageDraw, ImageFont from dotenv import load_dotenv from reportlab.pdfgen import canvas env_path = "./.env" # Laad de .env bestand expliciet load_dotenv(env_path) # Haal API-sleutels op CLIENT_ID = os.getenv('SPOTIFY_CLIENT_ID') CLIENT_SECRET = os.getenv('SPOTIFY_CLIENT_SECRET') YOUTUBE_API_KEY = os.getenv('YOUTUBE_API_KEY') # # Configureren van logging # logging.basicConfig(filename="log.txt", level=logging.INFO, # format="%(asctime)s - %(message)s") # Configureren van logging (naar bestand en console) logger = logging.getLogger() logger.setLevel(logging.INFO) # Log naar bestand file_handler = logging.FileHandler("log.txt") file_handler.setFormatter(logging.Formatter("%(asctime)s - %(message)s")) logger.addHandler(file_handler) # Log naar console (stdout) console_handler = logging.StreamHandler(sys.stdout) console_handler.setFormatter(logging.Formatter("%(asctime)s - %(message)s")) logger.addHandler(console_handler) def log_message(message): logging.info(f"{sys.argv[0]} - {message}") def get_spotify_access_token(): auth_url = "https://accounts.spotify.com/api/token" auth_data = {'grant_type': 'client_credentials'} auth_headers = { 'Authorization': f"Basic {base64.b64encode(f'{CLIENT_ID}:{CLIENT_SECRET}'.encode('utf-8')).decode('utf-8')}" } response = requests.post(auth_url, data=auth_data, headers=auth_headers) if response.status_code == 200: log_message(f"Succesvol Spotify toegangstoken verkregen.") return response.json().get('access_token') else: log_message( f"Fout bij het verkrijgen van Spotify toegangstoken: {response.status_code}") return None def get_spotify_track_url(title, artist): access_token = get_spotify_access_token() if not access_token: log_message( f"Geen toegangstoken voor Spotify beschikbaar voor {title} - {artist}.") return None query = urllib.parse.quote_plus(f"{title} {artist}") search_url = f"https://api.spotify.com/v1/search?q={query}&type=track&limit=1" headers = {'Authorization': f"Bearer {access_token}"} response = requests.get(search_url, headers=headers) tracks = response.json().get('tracks', {}).get( 'items', []) if response.status_code == 200 else [] if tracks: log_message(f"URL voor '{title} - {artist}' gevonden.") return tracks[0]['external_urls']['spotify'] else: log_message(f"Geen URL gevonden voor '{title} - {artist}' op Spotify.") return None def get_youtube_video_url(title, artist): query = urllib.parse.quote_plus(f"{title} {artist}") search_url = f"https://www.googleapis.com/youtube/v3/search?part=snippet&q={query}&key={YOUTUBE_API_KEY}&maxResults=1&type=video" response = requests.get(search_url) items = response.json().get('items', []) if response.status_code == 200 else [] if items and 'videoId' in items[0]['id']: log_message(f"URL voor '{title} - {artist}' gevonden op YouTube.") return f"https://www.youtube.com/watch?v={items[0]['id']['videoId']}" else: log_message(f"Geen URL gevonden voor '{title} - {artist}' op YouTube.") return None def get_x_pos(text, c, font, fontsize): text = "Dit is gecentreerde tekst" text_width = c.stringWidth(text, font, fontsize) # Bereken tekstbreedte page_width, _ = c._pagesize # Haal pagina-afmetingen op x_position = (page_width - text_width) / 2 # Horizontaal centreren return x_position def generate_qr_codes_and_pdf(csv_file, output_pdf, position_col, title_col, artist_col, year_col, platform): data = pd.read_csv(csv_file, delimiter=";") c = canvas.Canvas(output_pdf) total = data.shape[0] i = 0 for _, row in data.iterrows(): position, title, artist, year = row[position_col], row[title_col], row[artist_col], row[year_col] url = get_spotify_track_url( title, artist) if platform == "spotify" else get_youtube_video_url(title, artist) if url: 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") qr_image_path = f"{i}.png" qr_img.save(qr_image_path) i = i + 1 log_message(f" saving -- {qr_image_path}, {i} out of {total}") qr_width, qr_height = qr_img.size page_width = qr_width + 100 page_height = qr_height + 200 c.setPageSize((page_width, page_height)) c.drawImage(qr_image_path, 0, page_height - qr_height, width=qr_width, height=qr_height) c.showPage() text_artist = f" {artist}" text_title = f" {title}" text_year = f" {year}" # text_url = f"Link: {url}" c.setFont("Helvetica", 12) c.drawString(get_x_pos(text_artist, c, "Helvetica", 12), page_height - qr_height - 20, text_artist) c.setFont("Helvetica-Bold", 50) c.drawString(140, page_height - qr_height - 80, text_year) c.setFont("Courier", 11) c.drawString(get_x_pos(text_title, c, "Courier", 11), page_height - qr_height - 100, text_title) c.showPage() os.remove(qr_image_path) else: log_message(f"Geen link gevonden voor '{title} - {artist}'.") c.save() log_message(f"PDF succesvol gegenereerd: {output_pdf}") if __name__ == "__main__": if len(sys.argv) != 2 or sys.argv[1] not in ["spotify", "youtube"]: log_message("Gebruik: python scriptnaam.py ") log_message(" moet 'spotify' of 'youtube' zijn.") print("Gebruik: python scriptnaam.py ") sys.exit(1) platform = sys.argv[1] csv_file = "nummers.csv" output_pdf = "nummers_met_qr.pdf" position_col, title_col, artist_col, year_col = "positie", "titel", "artiest", "jaar" log_message( f"Script gestart voor platform: {platform}. CSV bestand: {csv_file}, Output PDF: {output_pdf}") generate_qr_codes_and_pdf(csv_file, output_pdf, position_col, title_col, artist_col, year_col, platform)