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.
191 lines
7.5 KiB
191 lines
7.5 KiB
import os
|
|
import base64
|
|
import requests
|
|
from dotenv import load_dotenv
|
|
import urllib.parse
|
|
import pandas as pd
|
|
import qrcode
|
|
from PIL import Image, ImageDraw, ImageFont
|
|
|
|
# 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
|
|
CLIENT_ID = os.getenv('SPOTIFY_CLIENT_ID')
|
|
CLIENT_SECRET = os.getenv('SPOTIFY_CLIENT_SECRET')
|
|
|
|
|
|
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:
|
|
access_token = response.json().get('access_token')
|
|
return access_token
|
|
else:
|
|
print("Fout bij het verkrijgen van Spotify toegangstoken")
|
|
return None
|
|
|
|
# Functie om de Spotify track link te verkrijgen
|
|
|
|
|
|
def get_spotify_track_url(title, artist):
|
|
access_token = get_spotify_access_token()
|
|
if access_token is None:
|
|
return None
|
|
|
|
# Encodeer de titel en artiest voor de zoekopdracht
|
|
query = f"{title} {artist}"
|
|
encoded_query = urllib.parse.quote_plus(query)
|
|
|
|
# Voer de zoekopdracht uit via de Spotify API
|
|
search_url = f"https://api.spotify.com/v1/search?q={encoded_query}&type=track&limit=1"
|
|
search_headers = {
|
|
'Authorization': f"Bearer {access_token}"
|
|
}
|
|
response = requests.get(search_url, headers=search_headers)
|
|
|
|
if response.status_code == 200:
|
|
results = response.json()
|
|
tracks = results.get('tracks', {}).get('items', [])
|
|
|
|
if tracks:
|
|
track_url = tracks[0]['external_urls']['spotify']
|
|
return track_url
|
|
print(f"Fout bij het zoeken naar track voor '{title} - {artist}'")
|
|
return None
|
|
|
|
# Functie om QR-codes te genereren met titels
|
|
|
|
|
|
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 Spotify link voor het nummer
|
|
url = get_spotify_track_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 Spotify 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)
|