Ниже будет достаточно большой код, но я считаю, что ошибка в функции
extract_cover. Тут я пытаюсь передать информацию базе данных SQLite об обложке альбома, к которому эта обложка принадлежит, и сохранить ее в определенной папке, если обложки к альбому с такими тегами еще нет. Но появляется сообщение о том, что запрос неправильный. Оно тоже будет ниже. Пожалуйста, подскажите, как исправить запрос SQLite?
UPD:я кое-что поправил с учетом слов человека, который ответил мне комментарием. Все равно не работает, но ошибка уже не возникает, папка, куда должны попадать обложки остается пустой
import mutagen
import datetime
import os
os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = 'hide'
# import pygame
import sqlite3
from mutagen.id3 import ID3
from tkinter import *
from tkinter.filedialog import askdirectory
con = sqlite3.connect('tagsdatabase.db')
cur = con.cursor()
cur.execute('''CREATE TABLE IF NOT EXISTS tags_db(File_Path TEXT,
Song_Title TEXT,
Album_Title TEXT,
Song_Artist TEXT,
Album_Artist TEXT,
Year_of_Publishing INTEGER,
Track_Number INTEGER,
Length REAL,
Bitrate INTEGER)''')
cur.execute('''CREATE TABLE IF NOT EXISTS covers_db(File_Path TEXT,
Cover_Path TEXT,
Album_Title TEXT,
Album_Artist TEXT,
Year_of_Publishing INTEGER)''')
con.commit()
ban = str.maketrans('', '', '\:')
folder_path = os.path.dirname(__file__)
root = Tk()
root.minsize(300, 300)
def extract_cover(path: str, album_title: str, album_artist: str, year_of_publishing:str) -> None:
'''Извлекает обложку из файла.'''
music = ID3(path)
data = music.getall('APIC')[0].data
cover_name_f = path.translate(ban)
cover_name_s = cover_name_f.replace('.mp3', '')
cover_path = folder_path + '/Covers/' + cover_name_s + '.png'
record_one = cur.execute('SELECT * FROM covers_db WHERE File_Path=? AND Album_Title=? AND Album_Artist=? AND Year_of_Publishing=?', (path, album_title, album_artist, year_of_publishing))
duplicate_one = record_one.fetchall()
record_two = cur.execute('SELECT * FROM covers_db WHERE File_Path=?', (path, ))
duplicate_two = record_two.fetchall()
if not duplicate_one:
cur.execute('INSERT INTO covers_db VALUES(?, ?, ?, ?, ?)', (path, cover_path, album_title, album_artist, year_of_publishing))
with open(cover_path, 'wb') as cover:
cover.write(data)
if duplicate_two:
cur.execute('UPDATE covers_db SET Cover_Path=?, Album_Title=?, Album_Artist=?, Year_of_Publishing=? WHERE Cover_Path=?', (cover_path, album_title, album_artist, year_of_publishing, cover_path))
con.commit()
con.commit()
def extract_tags(path: str) -> str:
'''Извлекает теги из файла и заполняет ими базу данных.'''
audiofile = mutagen.File(path)
if audiofile.tags:
song_title_f = audiofile.tags.getall('TIT2')
song_title = str(song_title_f[0]) if song_title_f else None
# Извлекает из MP3-файла название композиции
album_title_f = audiofile.tags.getall('TALB')
album_title = str(album_title_f[0]) if album_title_f else None
# Извлекает из MP3-файла название альбома
song_artist_f = audiofile.tags.getall('TPE1')
song_artist = str(song_artist_f[0]) if song_artist_f else None
# Извлекает из MP3-файла имя исполнителя композиции
album_artist_f = audiofile.tags.getall('TPE2')
album_artist = str(album_artist_f[0]) if album_artist_f else None
# Извлекает из MP3-файла имя исполнителя альбома
year_of_publishing_f = audiofile.tags.getall('TDRC')
year_of_publishing = str(year_of_publishing_f[0]) if year_of_publishing_f else None
# Извлекает из MP3-файла имя исполнителя альбома
track_number_f = audiofile.tags.getall('TRCK')
track_number = str(track_number_f[0]) if track_number_f else None
# Извлекает из MP3-файла порядковый номер композиции
length = str(datetime.timedelta(seconds = audiofile.info.length))
# Извлекает из MP3-файла длину композиции
bitrate = audiofile.info.bitrate
# Извлекает из MP3-файла битрейт композиции
song_tags = (path, song_title, album_title, song_artist, album_artist, year_of_publishing, track_number, length, bitrate)
record = cur.execute('SELECT * FROM tags_db WHERE File_Path=?', (path, ))
duplicate = record.fetchall()
if not duplicate:
cur.execute('INSERT INTO tags_db VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)', song_tags)
else:
cur.execute('UPDATE tags_db SET Song_Title=?, Album_Title=?, Song_Artist=?, Album_Artist=?, Year_of_Publishing=?, Track_Number=?, Length=?, Bitrate=? WHERE File_Path=?', (song_title, album_title, song_artist, album_artist, year_of_publishing, track_number, length, bitrate, path))
con.commit()
extract_cover(path, album_title, album_artist, year_of_publishing)
def choose_files(directory: str) -> None:
'''Отбирает MP3-файлы из ввыбранной директории, применяет extract_tags к каждому из них.'''
for file in os.listdir(directory):
if file.endswith('.mp3'):
path = os.path.realpath(file)
extract_tags(path)
def choose_directory(event) -> None:
'''Открывает диалоговое окно выбора директории с MP3-файлами'''
directory = askdirectory()
os.chdir(directory)
choose_files(directory)
# exit()
choosedirectory = Button(root, text = 'Choose Directory')
choosedirectory.pack()
choosedirectory.bind('<Button-1>', choose_directory)
root.mainloop()
Вот
ошибка:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\101ap\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 1705, in __call__
return self.func(*args)
File "c:/Users/101ap/Desktop/Player/extract_tags_DB.py", line 124, in choose_directory
choose_files(directory)
File "c:/Users/101ap/Desktop/Player/extract_tags_DB.py", line 117, in choose_files
extract_tags(path)
File "c:/Users/101ap/Desktop/Player/extract_tags_DB.py", line 109, in extract_tags
extract_cover(path, album_title, album_artist, year_of_publishing)
File "c:/Users/101ap/Desktop/Player/extract_tags_DB.py", line 47, in extract_cover
record = cur.execute('SELECT * FROM covers_db WHERE File_Path=?, Album_Title=?, Album_Artist=?, Year_of_Publishing=?', (path, album_title, album_artist, year_of_publishing))
File "c:/Users/101ap/Desktop/Player/extract_tags_DB.py", line 109, in extract_tags
extract_cover(path, album_title, album_artist, year_of_publishing)
File "c:/Users/101ap/Desktop/Player/extract_tags_DB.py", line 47, in extract_cover
record = cur.execute('SELECT * FROM covers_db WHERE File_Path=?, Album_Title=?, Album_Artist=?, Year_of_Publishing=?', (path, album_title, album_artist, year_of_publishing))
sqlite3.OperationalError: near ",": syntax error