-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
117 lines (98 loc) · 4.32 KB
/
app.py
File metadata and controls
117 lines (98 loc) · 4.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import tkinter as tk
from tkinter import filedialog, messagebox
from mutagen.mp3 import MP3
from mutagen.id3 import ID3, APIC, TIT2, TPE1, TALB
from PIL import Image, ImageTk
import io
# Function to select an MP3 file
def select_file():
global mp3_file
mp3_file = filedialog.askopenfilename(filetypes=[("MP3 files", "*.mp3")])
if mp3_file:
file_label.config(text=mp3_file, fg="#2C3E50")
# Function to select cover image
def select_cover():
global cover_file, cover_preview_img
cover_file = filedialog.askopenfilename(filetypes=[("Image files", "*.jpg;*.jpeg;*.png")])
if cover_file:
cover_label.config(text=cover_file, fg="#2C3E50")
# Show preview in fixed frame
img = Image.open(cover_file)
img.thumbnail((150, 150), Image.Resampling.LANCZOS)
cover_preview_img = ImageTk.PhotoImage(img)
cover_canvas.delete("all")
cover_canvas.create_image(75, 75, image=cover_preview_img) # center in canvas
# Process image to embed
def process_image(image_path):
with Image.open(image_path) as img:
img = img.convert('RGB')
img.thumbnail((500, 500), Image.Resampling.LANCZOS)
img_byte_arr = io.BytesIO()
img.save(img_byte_arr, format='JPEG', quality=85)
return img_byte_arr.getvalue()
# Save metadata
def save_metadata():
if not mp3_file:
messagebox.showerror("Error", "No MP3 file selected")
return
try:
audio = MP3(mp3_file, ID3=ID3)
try:
audio.add_tags()
except:
pass
audio.tags.add(TIT2(encoding=3, text=song_name_entry.get()))
audio.tags.add(TPE1(encoding=3, text=artist_entry.get()))
audio.tags.add(TALB(encoding=3, text=album_entry.get()))
if cover_file:
img_data = process_image(cover_file)
audio.tags.delall('APIC')
audio.tags.add(APIC(
encoding=3,
mime='image/jpeg',
type=3,
desc='Cover',
data=img_data
))
audio.save(v2_version=3)
messagebox.showinfo("Success", "Metadata updated successfully!")
except Exception as e:
messagebox.showerror("Error", f"Failed to update metadata: {e}")
# --- GUI Setup ---
root = tk.Tk()
root.title("MP3 Metadata Editor")
root.geometry("800x640")
root.configure(bg="#ECF0F1")
# Title
title_label = tk.Label(root, text="🎵 MP3 Metadata Editor", font=("Helvetica", 18, "bold"), bg="#ECF0F1", fg="#34495E")
title_label.pack(pady=15)
# MP3 File Selection Frame
file_frame = tk.Frame(root, bg="#ECF0F1")
file_frame.pack(pady=10, fill="x", padx=20)
tk.Button(file_frame, text="Select MP3 File", command=select_file, bg="#2980B9", fg="white", font=("Helvetica", 11), relief="flat", padx=10, pady=5).pack(side="left")
file_label = tk.Label(file_frame, text="No file selected", bg="#ECF0F1", fg="#7F8C8D", anchor="w")
file_label.pack(side="left", padx=10)
# Metadata Frame
meta_frame = tk.Frame(root, bg="#ECF0F1")
meta_frame.pack(pady=10, fill="x", padx=20)
tk.Label(meta_frame, text="Song Name", bg="#ECF0F1", fg="#2C3E50").pack(anchor="w")
song_name_entry = tk.Entry(meta_frame, width=50, font=("Helvetica", 11))
song_name_entry.pack(pady=5)
tk.Label(meta_frame, text="Artist", bg="#ECF0F1", fg="#2C3E50").pack(anchor="w")
artist_entry = tk.Entry(meta_frame, width=50, font=("Helvetica", 11))
artist_entry.pack(pady=5)
tk.Label(meta_frame, text="Album", bg="#ECF0F1", fg="#2C3E50").pack(anchor="w")
album_entry = tk.Entry(meta_frame, width=50, font=("Helvetica", 11))
album_entry.pack(pady=5)
# Cover Image Frame
cover_frame = tk.Frame(root, bg="#ECF0F1")
cover_frame.pack(pady=10, padx=20, fill="x")
tk.Button(cover_frame, text="Select Cover Image", command=select_cover, bg="#27AE60", fg="white", font=("Helvetica", 11), relief="flat", padx=10, pady=5).pack(side="left")
cover_label = tk.Label(cover_frame, text="No cover selected", bg="#ECF0F1", fg="#7F8C8D")
cover_label.pack(side="left", padx=10)
# Fixed-size canvas for cover preview
cover_canvas = tk.Canvas(root, width=150, height=160, bg="#BDC3C7", highlightthickness=1, highlightbackground="#7F8C8D")
cover_canvas.pack(pady=10)
# Save Button
tk.Button(root, text="💾 Save Metadata", command=save_metadata, bg="#E67E22", fg="white", font=("Helvetica", 12, "bold"), relief="flat", padx=10, pady=10).pack(pady=20)
root.mainloop()