L
LastChaosTyp
Guest
Hallo PCGHler,
ich habe mich jetzt mal an ein Projekt gewagt, welches ein eigener "MP3-Player" werden soll. Im Moment beschäftige ich mich noch nicht mit dem Interface etc. sondern erstmal mit den interen Basics wie z.B. das Eintragen aller MP3 Dateien in eine Datenbank mit Künseltername, Länge, ... Das klappt soweit ganz gut, jedoch bin ich jetzt auf ein Problem mit der SQL-Syntax gestoßen :/ Erstmal hier der Code, ich weiß, dass man den noch an vielen Stellen optimieren kann, aber Optimierungen mach ich erst am Ende
Das Problem taucht jetzt auf, wenn ich einen Ordner einlesen will, welcher ' enthält. So gibt es z.B. den Künstler K'naan, welcher eben dieses Zeichen enthält. Das Problem ist jetzt, dass SQL denkt, dass der String mit dem Künstlernamen bereits nach K' zu Ende ist und den Rest naan nicht mehr zuordnen kann, ich erhalte folgenden Fehler:
(Die Zeilenangaben sind falsch, ich habe hier im Forum ein paar private und experimentelle Teile entfernt ) Jetzt frage ich mich, wie man solche Fehler umgehen kann. Gibt es dazu in der SQL-Syntax direkt einen Fix? Oder muss ich vorher im Programm solche Zeichen abfangen und dann entfernen/durch etwas anderes ersetzen? Zweiteres finde ich nicht so toll, da ja dann der Künstlername im Prinzip verfälscht wird.
Schonmal vielen Dank für Vorschläge Vielleicht finde ich selber noch eine Lösung, dann schreibe ich das natürlich hier
Henri
ich habe mich jetzt mal an ein Projekt gewagt, welches ein eigener "MP3-Player" werden soll. Im Moment beschäftige ich mich noch nicht mit dem Interface etc. sondern erstmal mit den interen Basics wie z.B. das Eintragen aller MP3 Dateien in eine Datenbank mit Künseltername, Länge, ... Das klappt soweit ganz gut, jedoch bin ich jetzt auf ein Problem mit der SQL-Syntax gestoßen :/ Erstmal hier der Code, ich weiß, dass man den noch an vielen Stellen optimieren kann, aber Optimierungen mach ich erst am Ende
Code:
# -------------------------- Imports --------------------------
import os
import sys
import sqlite3
import pyglet
from mutagen.mp3 import MP3
from mutagen.easyid3 import EasyID3
# -------------------------- Klassen --------------------------
class Database(object):
def __init__(self, path, name):
self.path = path
self.name = name
self.cursor = None
self.connection = None
def connect(self):
self.connection = sqlite3.connect(self.path)
self.cursor = self.connection.cursor()
print("Verbindung zur Datenbank wurde erfolgreich hergestellt!")
def disconnect(self):
self.connection.commit()
self.connection.close()
print("Verbindung zur Datenbank wurde erfolgreich geschlossen!")
def execute(self, code):
self.cursor.execute(code)
self.connection.commit()
# -------------------------- Methoden --------------------------
def checkPath(path):
if not os.path.exists(path):
os.makedirs(path)
def createDatabase(path, name):
return Database(path, name)
def createTable(database):
database.execute("CREATE TABLE songs(song_index INTEGER PRIMARY KEY ASC, path TEXT(500) NOT NULL, title TEXT(200) NOT NULL, artist TEXT(200), duration INTEGER NOT NULL, counter INT DEFAULT 0);")
def checkTable(database):
database.execute("SELECT name FROM sqlite_master WHERE type='table';")
result = database.cursor.fetchall()
if result == []:
createTable(database)
print("Die Tabelle wurde erfolgreich angelegt!")
def titleExistsInDatabase(database, path):
database.execute("SELECT title FROM songs WHERE path='" + path + "';")
result = database.cursor.fetchall()
if(result != []):
return True
else:
return False
def addTitleToDatabase(database, path, title, artist, duration):
if not titleExistsInDatabase (database, path):
database.execute("INSERT INTO songs (song_index, path, title, artist, duration, counter) VALUES (NULL, '" + path + "', '" + title + "', '" + artist + "', " + str(duration) + ", 0);")
print("Der Musiktitel '" + title + "' wurde erfolgreich zur Datenbank hinzugefügt!")
return True
else:
print("Dieser Musiktitel ist bereits in der Datenbank eingetragen und wurde nicht erneut hinzugefügt!")
return False
def scanFiles(path):
print("Scanne Dateisystem nach Musikdateien! Dies kann einen Moment dauern...")
songs = []
count = 0
for root, subdirs, files in os.walk(path):
for item in files:
if item[-4:] == ".mp3":
songs.append(root + "\\" + item)
count += 1
print("Der Scan nach Musikdateien wurde erfolgreich abgeschlossen und es wurden " + str(count) + " Dateien gefunden!\n")
return songs
def addFilesToDatabase(database, songs):
for item in songs:
addFileToDatabase(database, item)
def addFileToDatabase(database, path):
song = MP3(path, EasyID3)
if 'title' in song:
title = str(song['title'][0])
else:
return
if 'artist' in song:
artist = str(song['artist'][0])
else:
artist = ""
duration = int(song.info.length)
addTitleToDatabase(database, path, title, artist, duration)
# -------------------------- Programm --------------------------
# Musikspeicherort
musicpath = 'D:\\Musik\\iTunes\\iTunes Media\\Music'
# Lokale Datenbank anlegen
dbpath = 'C:\\Users\\MEIN NAME\\AppData\\Roaming\\Music Manager'
name = 'Music.db'
checkPath(dbpath)
# Verbindungsaufbau zur Datenbank
db = createDatabase(dbpath + '\\' + name, name)
db.connect()
checkTable(db)
# Scannen der lokalen Musikdateien
files = scanFiles(musicpath)
addFilesToDatabase(db, files)
# Beenden der Verbindung
db.disconnect()
print("Music Manager wurde erfolgreich beendet!")
Das Problem taucht jetzt auf, wenn ich einen Ordner einlesen will, welcher ' enthält. So gibt es z.B. den Künstler K'naan, welcher eben dieses Zeichen enthält. Das Problem ist jetzt, dass SQL denkt, dass der String mit dem Künstlernamen bereits nach K' zu Ende ist und den Rest naan nicht mehr zuordnen kann, ich erhalte folgenden Fehler:
Code:
Traceback (most recent call last):
File "D:\Sonstiges\Python\MusicManager.py", line 159, in <module>
addFilesToDatabase(db, files)
File "D:\Sonstiges\Python\MusicManager.py", line 125, in addFilesToDatabase
addFileToDatabase(database, item)
File "D:\Sonstiges\Python\MusicManager.py", line 140, in addFileToDatabase
addTitleToDatabase(database, path, title, artist, duration)
File "D:\Sonstiges\Python\MusicManager.py", line 104, in addTitleToDatabase
database.execute("INSERT INTO songs (song_index, path, title, artist, duration, counter) VALUES (NULL, '" + path + "', '" + title + "', '" + artist + "', " + str(duration) + ", 0);")
File "D:\Sonstiges\Python\MusicManager.py", line 39, in execute
self.cursor.execute(code)
sqlite3.OperationalError: near "naan": syntax error
(Die Zeilenangaben sind falsch, ich habe hier im Forum ein paar private und experimentelle Teile entfernt ) Jetzt frage ich mich, wie man solche Fehler umgehen kann. Gibt es dazu in der SQL-Syntax direkt einen Fix? Oder muss ich vorher im Programm solche Zeichen abfangen und dann entfernen/durch etwas anderes ersetzen? Zweiteres finde ich nicht so toll, da ja dann der Künstlername im Prinzip verfälscht wird.
Schonmal vielen Dank für Vorschläge Vielleicht finde ich selber noch eine Lösung, dann schreibe ich das natürlich hier
Henri