0% found this document useful (0 votes)
29 views56 pages

Sonore: Modern Music Player Project

Uploaded by

abdulshihar2
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
29 views56 pages

Sonore: Modern Music Player Project

Uploaded by

abdulshihar2
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd

COMPUTER PROJECT

SONORE: THE ULTIMATE MUSIC


PLAYER

BY: MOHAMMED NIHAAL K S


CLASS: XII A
ACKNOWLEDGEMENT

I, Mohammed Nihaal K S, would like to


express my profound gratitude to the key
individuals whose guidance and partnership
were instrumental in the successful
completion of our project, Sonore. First and
foremost, I am deeply grateful to my
teacher, Sunitha Ravindran, whose guidance
and unwavering support provided the
essential technical foundation and direction
for this project. Last but not the least, I
extend my sincere appreciation to my
dedicated team members, Rishith and
Salman. Their collective effort, invaluable
contributions, and shared commitment were
a vital driving force behind our success.
TEAM MEMBERS
 Mohammed Nihaal K S
 Rishith R Nair
 Salman Ali K M
SL NO CONTENTS PAGE
NO.
1. Introduction to Python and SQL

2. Our Project

3. Functions Used

4. Modules Used

5. Tables Created

6. System Requirements

7. Source Code

8. Output

9. Conclusions

10. Bibliography

INDEX
Introduction to Python
and SQL

Python:
Python is a versatile high-level programming
language known for its user-friendliness and
adaptability. It’s an ideal choice for beginners and
finds applications in diverse fields, including web
development and data analysis.
Python’s open-source nature fosters a strong
community of developers who readily share
resources and provide support. This collaboration
and sharing of knowledge are at the core of
Python’s success.

With cross-platform compatibility, Python code can


run seamlessly on various operating systems,
enhancing its versatility and practicality for
different projects.

The language’s simplicity and ease of use have


made it a top choice for programmers, promoting
efficiency and sparking creativity in the digital
realm.

My SQL:
SQL (Structured Query Language) is a fundamental
tool for data management in relational databases.
It provides a standardized way to interact with
databases, facilitating data retrieval, manipulation,
and maintenance.
SQL’s simplicity and universality make it
indispensable for various applications, including
web development and data analysis, ensuring
efficient data handling.

It serves as the backbone of modern information


systems, allowing organizations to store, and
access their data seamlessly.

Proficiency in SQL is highly valued in technology


and data-related fields, making it an essential skill
for professionals in these industries.

OUR PROJECT
Our project, Sonore, is a modern and minimalistic
music player system designed to provide users
with a seamless and distraction-free listening
experience.
The device runs a custom-built application that
supports local storage and playback of audio
files. Users can browse through their music
library, create playlists, and control playback
using simple and intuitive controls. The interface
focuses on simplicity and elegance, ensuring that
users can access their favourite tracks quickly
and easily.
The main goal of Sonore is to create a dedicated
environment for pure music enjoyment,
eliminating the distractions commonly found in
smartphones and streaming apps. Through this
project, we aim to highlight the importance of
mindful listening and focus on delivering an
immersive and clutter-free musical experience.

FUNCTIONS USED
[Link]() – main function that runs the whole
Sonore music player app
2.load_icon() – loads an icon image from file and
converts it to CTkImage
3.load_cover_icon() – loads a circular cropped version of
a cover image for playlists
4.make_circle_image() – creates a circular colored
CTkImage (used as placeholders or defaults)
5.update_player_info() – updates song details, cover
images, and starts playing the selected song
6.update_progress() – updates the progress bar as the
current song plays
7.show_popup() – displays a small popup message
window
8.show_create_playlist() – opens a popup to create a
new playlist in the database
9.refresh_playlists() – refreshes and displays all
available playlists in the sidebar
10.load_and_play_playlist() – loads songs from a
selected playlist and starts playback
11.on_search() – searches for a song by name and
plays it if found
12.play_song_command() – plays a song when selected
from the main song grid
13.add_song_to_playlist() – adds the currently playing
song to a selected playlist
14.show_add_to_playlist_popup() – opens a popup to
choose a playlist to add the current song
15.on_prev() – plays the previous song in the current
queue
16.on_play_pause() – toggles between play and pause
for the current song
17.on_next() – plays the next song in the current queue
18.user_id() – fetches and returns the user ID for a
given username and password from the database
[Link]() – launches the main Sonore app
interface for a logged-in user
[Link]() – provides admin control panel for
managing users and songs
[Link]() – displays all users and optionally allows
searching by user ID
22.add_song() – inserts a new song entry into the song
table
23.delete_song() – deletes a song from the song table
by name
24.search_user() – searches for a specific user by ID
and displays their data
[Link]() – deletes a user and optionally their
playlists from the database

MODULES USED
1. [Link] : To connect MySQL
database with Python
2. pwinput : To securely take hidden
password input from the user
3. customtkinter : To design and create
a modern GUI (graphical user interface)
4. PIL (Pillow) : To handle image loading,
resizing, and manipulation
5. os : To handle file and directory
operations
6. math : To perform mathematical
calculations where needed
7. pygame : To play and control audio
(used for music playback)
8. admin : Custom module to manage
users and songs (admin control panel)
9. app (application) : Custom module
that runs the main Sonore music player
interface
TABLES CREATED

[Link]

[Link]

[Link]
SYSTEM REQUIREMENT
1. CPU: Intel(R) CPU 3825U @ 1.90
GHz,1901 Mhz, 2 Core(s), 4 Logical
Processor(s) SYSTEM REQUIREMENTS
2. Installed RAM: 4.00 GB
3. Motherboard: HP 80C1 96.42
4. Keyboard and mouse
5. Printer SOFTWARE REQUIREMENTS:
 Windows OS
 “Python”
 MySQL
SOURCE CODE
[Link]:
from app import application
import [Link] as m
import admin
import pwinput

mydb=[Link](host="localhost",user="root",password="1234",databa
se="SONORE")
c=[Link]()

def user_id(name,password): #function to get id of the user


[Link]("select user_id from user where name='{}' and
password='{}'".format(name,password))
user_id=[Link]()
if user_id!=None:
return user_id[0]
else:
return user_id

print('1: CREATE ACCOUNT\n2: LOGIN')


a=int(input("ENTER YOUR CHOICE: "))

if a!=1 and a!=2:


print("WRONG INPUT")

while a==1:
name=input("ENTER YOUR NAME: ")
password=[Link]("ENTER YOUR PASSWORD: ")
password1=[Link]("ENTER YOUR PASSWORD AGAIN: ")

if password!=password1: #checks if both the password entered is


the same
print("SORRY YOU HAVE TYPED THE WRONG [Link] TRY
AGAIN")
elif password==password1:
id1=user_id(name,password)
dict_user={}
if id1!=None: #checks if user already exists
print("USER ALREADY EXISTS!")
else: #creates account
try:
[Link]("insert into user(name,password)
values('{}','{}')".format(name,password))
[Link]()

id1=user_id(name,password)
dict_user[id1]=name
print("YOUR ACCOUNT HAS BEEN CREATED")
application(dict_user)
break
except:
[Link]()
else:
print("ERROR")

while a==2:
name=input("ENTER YOUR NAME: ")
password=[Link]("ENTER YOUR PASSWORD: ")
id1=user_id(name,password)
if id1==None: #checks if user already exists
print("WRONG USERNAME/PASSWORD")
else: #loggin in
dict_user={}
dict_user[id1]=name
if id1==1: #if user is admin
[Link]()
else: #normal user
application(dict_user)
break

[Link]()
[Link]()

[Link]:
import [Link] as m
mydb=[Link](host="localhost",user="root",password="1234",databa
se="SONORE")
c=[Link]()

def user_id(name,password):
[Link]("select user_id from user where name='{}' and
password='{}'".format(name,password))
user_id=[Link]()
if user_id==None:
return user_id
else:
return user_id[0]

def admin():
ans="yes"
while [Link]()=="yes":
def viewusers():
[Link]("SELECT * FROM USER")
f=[Link]()

for i in f:
print(i)
viewuser1=input("DO YOU WANT TO SEARCH?yes/no:")

if [Link]()=="yes":
d=int(input("ENTER THE ID TO BE SEARCHED:"))

for j in f:
if j[0]==d:
print(j)

[Link]('SELECT table_name FROM


information_schema.tables WHERE table_schema = "SONORE" AND
table_name NOT IN ("user", "song");')
playlists = [Link]()
print("Playlists:")
for i in playlists:
print(i)

def add_song():
N=input("ENTER NAME OF THE SONG: ")
P=input("ENTER PATH OF THE SONG: ")
A=input("ENTER NAME OF THE ARTIST: ")
D=input("ENTER DESCRIPTION IF ANY: ")
L=input("ENTER THE PATH OF THE LOGO: ")
[Link]("insert into song values(%s,%s,%s,%s,%s,)"%
(N,P,A,D,L,))
def delete_song():
S=input('ENTER SONG NAME TO BE DELETED')
[Link]("delete from song where name=%s"%(S,))

def search_user():

id1=int(input("ENTER THE ID TO BE SEARCHED:"))


[Link]("select * from user where user_id={}".format(id1))
f=[Link]()
for i in f:
print(i)

[Link]('SELECT table_name FROM


information_schema.tables WHERE table_schema = "SONORE" AND
table_name NOT IN ("user", "song");')
playlists = [Link]()
print("Playlists:")
for i in playlists:
print(i)

def delete():

if c.with_rows: #used to clear unused rows


_ = [Link]()

id1=int(input("ENTER THE ID TO DELETE:"))


[Link]("delete from user where user_id={}".format(id1))
_ = [Link]()
[Link]("select name from user where user_id={}".format(id1))
name=[Link]()
print(name,"HAS BEEN DELETED SUCCESSFULLY")
[Link]()

x=input("Do u want to delete any playlists(yes/no):")


if [Link]()=="yes":
nm=input("Enter name of playlist:")
[Link]("drop table {}".format(nm))
print(nm,"DELETED SUCCESSFULLY")
else:
pass
ch=int(input("Enter your choice: [Link] user data, [Link] song
data:, [Link]:"))
if ch==1:
n=int(input("Enter your choice: [Link] user, [Link] user,
[Link], [Link]:"))
if n==1:
viewusers()
elif n==2:
search_user()
elif n==3:
delete()
elif n==4:
break
else:
print("WRONG INPUT")
elif ch==2:
n=int(input("Enter your choice: [Link] song, [Link], [Link]:"))
if n==1:
add_song()
elif n==2:
delete_song()
elif n==3:
break
else:
print("WRONG INPUT")
elif ch==3:
break
else:
print("WRONG INPUT")
ans=input('Do you want to coninue?yes/no:')

[Link]:
import customtkinter as ctk
from PIL import Image, ImageTk, ImageOps, ImageDraw
import os
import [Link] as m
import math

[Link]['PYGAME_HIDE_SUPPORT_PROMPT'] = "hide"

import pygame
[Link]()

mydb = [Link](host="localhost", user="root", password="1234",


database="SONORE")
cursor = [Link]()

current_song_index = -1
current_playing_queue = []
all_songs_data = []
is_playing = False

now_playing_title_label = None
now_playing_artist_label = None
now_playing_img_label = None
player_title_label = None
player_artist_label = None
player_img_widget = None
play_btn = None
progress = None
app = None
pause_icon = None
play_icon = None
search_bar = None
playlist_scroll = None
current_song_length = 0

def application(dict_user):
keys_list = list(dict_user.keys())
id1=keys_list[0]
global now_playing_title_label, now_playing_artist_label,
now_playing_img_label
global player_title_label, player_artist_label, player_img_widget,
play_btn, progress
global is_playing, current_playing_queue, app, pause_icon, play_icon,
search_bar, playlist_scroll, all_songs_data

# ------------------ CONFIG ------------------


ctk.set_appearance_mode("dark")
ctk.set_default_color_theme("green")

# Color variables
MAIN_BG = "#151515"
SECTION_BG = "#1f1f1f"
BLUE = "#A3BCF9"
WINDOW_W, WINDOW_H = 1280, 720
ICON_DIR = "icons"

# --------------- HELPERS --------------------


def load_icon(name, size=(64, 64)): #function to load icons
if [Link](name):
path = name
else:
path = [Link](ICON_DIR, name)
if not [Link](path):
return None
pil = [Link](path).convert("RGBA")
pil = [Link](pil, size, method=[Link],
centering=(0.5, 0.5))
return [Link](pil, size=size)

def load_cover_icon(path, size=(44, 44)): #function to load image on


playlists
try:
pil = [Link](path).convert("RGBA")
mask = [Link]("L", size, 0)
draw = [Link](mask)
[Link]((0, 0) + size, fill=255)
pil = [Link](pil, [Link], method=[Link])
[Link](mask)
return [Link](pil, size=size)
except Exception:
return None

def make_circle_image(w, h): #function to create a circle object


img = [Link]("RGBA", (w, h), (0, 0, 0, 0))
mask = [Link]("L", (w, h), 0)
draw = [Link](mask)
[Link]((0, 0, w - 1, h - 1), fill=BLUE)
draw2 = [Link](img)
[Link]((0, 0, w - 1, h - 1), fill=BLUE)
return [Link](img, size=(w, h))

def update_player_info(song_info): #updates current player info


global is_playing, current_song_length
name, artist, logo_path, song_path = song_info
now_playing_title_label.configure(text=name)
now_playing_artist_label.configure(text=artist)

player_title_label.configure(text=name)
player_artist_label.configure(text=artist)

try:
if logo_path and [Link](logo_path):
pil_img = [Link](logo_path).convert("RGBA")
pil_img_side = [Link](pil_img, (240, 240))
pil_img_bottom = [Link](pil_img, (56, 56))

now_playing_img_label.configure(image=[Link](pil_img_side,
size=(240, 240)))

player_img_widget.configure(image=[Link](pil_img_bottom,
size=(56, 56)))
else:
default_img = make_circle_image(240, 240)
now_playing_img_label.configure(image=default_img)
player_img_widget.configure(image=make_circle_image(56,
56))
except Exception as e:
print(f"Error updating image: {e}")
default_img = make_circle_image(240, 240)
now_playing_img_label.configure(image=default_img)
player_img_widget.configure(image=make_circle_image(56, 56))

try:
[Link](song_path)
[Link]()
is_playing = True
if pause_icon:
play_btn.configure(image=pause_icon)

snd = [Link](song_path)
current_song_length = snd.get_length()

update_progress() # start progress loop


except [Link] as e:
print(f"Error playing music: {e}")
def update_progress(): #function to update the progress bar
if is_playing and current_song_index != -1:
pos_ms = [Link].get_pos()
if pos_ms >= 0 and current_song_length > 0:
[Link](pos_ms / 1000 / current_song_length)
[Link](1000, update_progress)

# --------------- POPUP HELPERS --------------------


def show_popup(title, message): #function for popups
popup = [Link](app)
[Link](title)
[Link]("300x150")
[Link](False, False)
popup.grab_set()
x = app.winfo_x() + (app.winfo_width() // 2) - 150
y = app.winfo_y() + (app.winfo_height() // 2) - 75
[Link](f"+{x}+{y}")
label = [Link](popup, text=message, font=("Manjari", 14))
[Link](pady=20)
close_btn = [Link](
popup, text="OK", command=[Link], width=80,
corner_radius=10
)
close_btn.pack(pady=10)

# --------------- MAIN APP -------------------


app = [Link]()
[Link]("Sonore")
[Link](f"{WINDOW_W}x{WINDOW_H}")
[Link](False, False)
[Link](fg_color=MAIN_BG)

def show_create_playlist():
popup = [Link](app)
[Link]("Create Playlist")
[Link]("400x200")
[Link](app)
popup.grab_set()
x = app.winfo_x() + (WINDOW_W // 2) - 200
y = app.winfo_y() + (WINDOW_H // 2) - 100
[Link](f"400x200+{x}+{y}")
[Link](fg_color=MAIN_BG)

[Link](
popup,
text="Enter Playlist Name",
text_color="white",
font=("Manjari", 24, "bold")
).pack(pady=15)

playlist_name_entry = [Link](
popup,
placeholder_text="Playlist Name",
width=250,
fg_color=SECTION_BG,
text_color="white"
)
playlist_name_entry.pack(pady=10)

def confirm_playlist():
name = playlist_name_entry.get().strip()
if name:
[Link](
f"create table `{name}`(user_id INT(3), name VARCHAR(30),
path VARCHAR(100), artist VARCHAR(15), description VARCHAR(30), logo
VARCHAR(100))"
)
[Link]()
[Link]()
show_popup("Success", f"Playlist '{name}' created
successfully!")
refresh_playlists()

confirm_btn = [Link](
popup,
text="Confirm",
fg_color=BLUE,
text_color="black",
command=confirm_playlist
)
confirm_btn.pack(pady=15)

def refresh_playlists():
for widget in playlist_scroll.winfo_children():
[Link]()

[Link](
'SELECT table_name FROM information_schema.tables '
'WHERE table_schema = "SONORE" AND table_name NOT IN
("user", "song");'
)
playlist_data = [Link]()

for playlist in playlist_data:


playlist_name = playlist[0]
[Link](f"SELECT logo FROM `{playlist_name}` LIMIT 1")
logo_data = [Link]()

icon = None
if logo_data and logo_data[0] and [Link](logo_data[0]):
icon = load_cover_icon(logo_data[0], (44, 44))

if icon:
btn = [Link](
playlist_scroll,
image=icon,
text="",
width=44,
height=44,
fg_color=SECTION_BG,
corner_radius=20,
command=lambda name=playlist_name:
load_and_play_playlist(name)
)
else:
btn = [Link](
playlist_scroll,
text=playlist_name[:3].upper(),
width=44,
height=44,
fg_color=BLUE,
corner_radius=20,
text_color="black",
font=("Manjari", 16, "bold"),
command=lambda name=playlist_name:
load_and_play_playlist(name)
)
[Link](pady=12)

def load_and_play_playlist(playlist_name):
global current_playing_queue, current_song_index
try:
[Link](f"SELECT name, artist, logo, path FROM
`{playlist_name}`")
playlist_songs = [Link]()

if not playlist_songs:
show_popup("Playlist Empty", "This playlist does not contain any
songs.")
return

current_playing_queue = [(row[3], (row[0], row[1], row[2], row[3]))


for row in playlist_songs]
current_song_index = 0

song_path, song_info =
current_playing_queue[current_song_index]
update_player_info(song_info)

except [Link] as err:


show_popup("Database Error", f"Failed to load playlist: {err}")

# ---------- Search Bar ----------


def on_search(event=None):
global current_song_index, current_playing_queue
query = search_bar.get().strip()

if not query:
show_popup("Search Error", "Please enter a song name to
search.")
return

[Link]("SELECT name, artist, logo, path FROM song")


fetched_output = [Link]()
found_song_info = None

current_playing_queue = []
for i, row in enumerate(fetched_output):
current_playing_queue.append((row[3], (row[0], row[1], row[2],
row[3])))
name, artist, logo, path = row
if [Link]() == [Link]():
found_song_info = (name, artist, logo, path)
current_song_index = i

if found_song_info:
print(f"Playing song: {found_song_info[0]}")
update_player_info(found_song_info)
else:
show_popup("Song Not Found", f"No song found with the name
'{query}'")
current_playing_queue = [] # Clear queue if not found
search_bar.delete(0, "end")

search_bar = [Link](
app,
placeholder_text="Search",
width=350,
height=36,
corner_radius=20,
fg_color=SECTION_BG,
placeholder_text_color="#fff",
border_width=0,
text_color="white",
font=("Manjari", 18, 'bold'),
)
search_bar.place(x=(WINDOW_W - 350) // 2, y=18)
search_bar.bind("<Return>", on_search)

# ---------------- Sidebar -----------------


sidebar = [Link](
app, fg_color=SECTION_BG, width=80, height=WINDOW_H - 188,
corner_radius=20
)
[Link](x=10, y=70)

plus_icon = load_icon("plus_small.png", (17, 17))


if plus_icon:
plus_btn = [Link](
sidebar,
image=plus_icon,
text="",
width=35,
height=40,
fg_color=BLUE,
corner_radius=20,
command=show_create_playlist
)
else:
plus_btn = [Link](
sidebar,
text="+",
width=44,
height=44,
fg_color=BLUE,
corner_radius=20,
text_color="black",
font=("Manjari", 18, "bold"),
command=show_create_playlist
)
plus_btn.place(x=11, y=18)

playlist_scroll = [Link](
sidebar, width=55, height=WINDOW_H - 188 - 80,
fg_color=SECTION_BG
)
playlist_scroll.place(x=8, y=80)
refresh_playlists()

# ---------------- Main content ----------------


main_frame = [Link](
app, fg_color=SECTION_BG, width=815, height=WINDOW_H - 225,
corner_radius=20
)
main_frame.place(x=95, y=70)

[Link](
main_frame,
text="Music Displayed",
text_color="white",
font=("Manjari", 28, "bold")
).pack(pady=(10, 20), anchor="w", padx=20)

[Link]("select name,artist,logo,path from song")


all_songs_data = [Link]()
current_playing_queue = [(row[3], (row[0], row[1], row[2], row[3])) for
row in all_songs_data]

def play_song_command(index):
global current_song_index, current_playing_queue
current_playing_queue = [(row[3], (row[0], row[1], row[2], row[3]))
for row in all_songs_data] # Reset queue to all songs
current_song_index = index
song_path, song_info = current_playing_queue[current_song_index]
update_player_info(song_info)

thumb_w, thumb_h = 110, 110


cols = 5
rows = [Link](len(all_songs_data) / cols)
gap_x = (850 - (cols * thumb_w)) / (cols + 1)
gap_y = 180
index = 0

for r in range(rows):
row_frame = [Link](main_frame, fg_color=SECTION_BG)
row_frame.pack(pady=(0, gap_y - thumb_h), anchor='w')
for c in range(cols):
if index >= len(all_songs_data):
break
song_name, song_artist, song_logo, song_path =
all_songs_data[index]

try:
if song_logo and [Link](song_logo):
pil_img = [Link](song_logo).convert("RGBA")
pil_img = [Link](pil_img, (thumb_w, thumb_h))
logo_ctk = [Link](pil_img, size=(thumb_w, thumb_h))
tile_btn = [Link](
row_frame,
image=logo_ctk,
text="",
width=thumb_w,
height=thumb_h,
corner_radius=8,
fg_color=SECTION_BG,
hover_color="#333",
command=lambda idx=index: play_song_command(idx)
)
else:
tile_btn = [Link](
row_frame,
text="",
width=thumb_w,
height=thumb_h,
corner_radius=8,
fg_color=BLUE,
hover_color="#333",
command=lambda idx=index: play_song_command(idx)
)
tile_btn.grid(row=0, column=c, padx=(gap_x / 2, 0))
except Exception as e:
print("Error loading logo:", e)
tile_btn = [Link](
row_frame,
text="",
width=thumb_w,
height=thumb_h,
corner_radius=8,
fg_color=BLUE,
hover_color="#333",
command=lambda idx=index: play_song_command(idx)
)
tile_btn.grid(row=0, column=c, padx=(gap_x / 2, gap_x / 2))

[Link](
row_frame, text=song_name, text_color="white",
font=("Manjari", 17, "bold")
).grid(row=1, column=c, pady=(5, 0))
[Link](
row_frame, text=song_artist, text_color="#fff", font=("Manjari",
14)
).grid(row=2, column=c)
index += 1

# --------------- Now Playing(music info) ---------------


def add_song_to_playlist(playlist_name):
if current_song_index == -1:
show_popup("Error", "No song is currently playing.")
return

try:
song_info = current_playing_queue[current_song_index][1]
song_name, artist, logo_path, song_path = song_info

# Corrected INSERT statement


insert_query = f"INSERT INTO `{playlist_name}` (user_id, name,
path, artist, description, logo) VALUES (%s, %s, %s, %s, %s, %s)"
song_data = (id1, song_name, song_path, artist, "No description",
logo_path)

[Link](insert_query, song_data)
[Link]()
show_popup("Success", f"Song '{song_name}' added to playlist
'{playlist_name}'.")

except Exception as e:
show_popup("Error", f"Failed to add song to playlist: {e}")

def show_add_to_playlist_popup():
if current_song_index == -1:
show_popup("Error", "No song is currently playing. Please select a
song first.")
return

popup = [Link](app)
[Link]("Add to Playlist")
[Link]("350x400")
[Link](app)
popup.grab_set()
x = app.winfo_x() + (app.winfo_width() // 2) - 175
y = app.winfo_y() + (app.winfo_height() // 2) - 200
[Link](f"+{x}+{y}")
[Link](fg_color=MAIN_BG)

[Link](
popup,
text="Select a Playlist",
text_color="white",
font=("Manjari", 20, "bold")
).pack(pady=10)

playlist_frame = [Link](popup,
fg_color=SECTION_BG, corner_radius=10)
playlist_frame.pack(fill="both", expand=True, padx=20, pady=10)

[Link](
'SELECT table_name FROM information_schema.tables '
'WHERE table_schema = "SONORE" AND table_name NOT IN
("user", "song");'
)
playlists = [Link]()

if not playlists:
[Link](playlist_frame, text="No playlists found.",
text_color="white").pack(pady=20)
else:
for playlist in playlists:
playlist_name = playlist[0]
[Link](
playlist_frame,
text=playlist_name,
fg_color=BLUE,
text_color="black",
font=("Manjari", 16, "bold"),
command=lambda name=playlist_name:
add_song_to_playlist(name)
).pack(pady=5, padx=10, fill="x")

right_frame = [Link](
app, fg_color=SECTION_BG, width=315, height=WINDOW_H - 188,
corner_radius=20
)
right_frame.place(x=953, y=70)

[Link](
right_frame,
text="Now Playing",
text_color="white",
font=("Manjari", 22, "bold")
).place(x=20, y=14)

now_playing_img_label = [Link](right_frame,
image=make_circle_image(240, 240), text="")
now_playing_img_label.place(x=30, y=70)

now_playing_title_label = [Link](
right_frame,
text="Song Title - Artist",
text_color="white",
font=("Manjari", 20, "bold")
)
now_playing_title_label.place(x=20, y=322)
now_playing_artist_label = [Link](
right_frame,
text="Album • Year",
text_color="#cfcfcf",
font=("Manjari", 18)
)
now_playing_artist_label.place(x=20, y=348)

add_icon = load_icon("plus_small.png", (18, 18))


if add_icon:
[Link](
right_frame,
image=add_icon,
text="",
width=35,
height=40,
fg_color=BLUE,
corner_radius=20,
command=show_add_to_playlist_popup
).place(x=240, y=320)
else:
[Link](
right_frame,
text="+",
width=34,
height=34,
fg_color=BLUE,
corner_radius=20,
text_color="black",
command=show_add_to_playlist_popup
).place(x=250, y=360)

# ---------------- Bottom Player ------------------


player_h = 100
player_frame = [Link](
app, fg_color=SECTION_BG, width=WINDOW_W - 20,
height=player_h, corner_radius=12
)
player_frame.place(x=10, y=WINDOW_H - player_h - 10)

player_img_widget = [Link](
player_frame, image=make_circle_image(56, 56), text=""
)
player_img_widget.place(x=12, y=20)

player_title_label = [Link](
player_frame,
text="Song Title",
text_color="white",
font=("Manjari", 20, "bold")
)
player_title_label.place(x=80, y=22)
player_artist_label = [Link](
player_frame,
text="Artist Name",
text_color="#cfcfcf",
font=("Manjari", 18)
)
player_artist_label.place(x=80, y=50)

prev_icon = load_icon("[Link]", (20, 20))


play_icon = load_icon("[Link]", (20, 20))
pause_icon = load_icon("[Link]", (20, 20))
next_icon = load_icon("[Link]", (20, 20))

control_x_center = WINDOW_W // 2
start_x = control_x_center - 70

def on_prev():
global current_song_index
if not current_playing_queue: return
current_song_index = (current_song_index - 1 +
len(current_playing_queue)) % len(current_playing_queue)
song_path, song_info = current_playing_queue[current_song_index]
update_player_info(song_info)

def on_play_pause():
global is_playing
if not current_playing_queue or current_song_index == -1: return

if is_playing:
[Link]()
is_playing = False
if play_icon:
play_btn.configure(image=play_icon)
else:
[Link]()
is_playing = True
if pause_icon:
play_btn.configure(image=pause_icon)

def on_next():
global current_song_index
if not current_playing_queue: return
current_song_index = (current_song_index + 1) %
len(current_playing_queue)
song_path, song_info = current_playing_queue[current_song_index]
update_player_info(song_info)

if prev_icon:
prev_btn = [Link](
player_frame, image=prev_icon, text="", width=30, height=40,
fg_color=BLUE,
corner_radius=20, command=on_prev, text_color="#151515"
)
else:
prev_btn = [Link](player_frame, text="⏮", width=30,
height=40, fg_color=BLUE,
corner_radius=20, command=on_prev, text_color="#151515"
)
prev_btn.place(x=start_x, y=24)

if play_icon:
play_btn = [Link](
player_frame, image=play_icon, text="", width=30, height=40,
fg_color=BLUE,
corner_radius=20, command=on_play_pause,
text_color="#151515"
)
else:
play_btn = [Link](
player_frame, text="▶", width=30, height=40, fg_color=BLUE,
corner_radius=20, command=on_play_pause,
text_color="#151515"
)
play_btn.place(x=start_x + 70, y=24)
if next_icon:
next_btn = [Link](
player_frame, image=next_icon, text="", width=30, height=40,
fg_color=BLUE,
corner_radius=20, command=on_next, text_color="#151515"
)
else:
next_btn = [Link](
player_frame, text="⏭", width=30, height=40, fg_color=BLUE,
corner_radius=20, command=on_next, text_color="#151515"
)
next_btn.place(x=start_x + 140, y=24)

[Link](player_frame, text="00:00", text_color="white",


font=("Manjari", 10)).place(x=start_x - 150, y=64)
progress = [Link](player_frame, width=380, height=6,
progress_color=BLUE)
[Link](x=start_x - 110, y=74)
[Link](0)
[Link](player_frame, text="03:45", text_color="white",
font=("Manjari", 10)).place(x=start_x + 290, y=64)

[Link]()
import customtkinter as ctk
from PIL import Image, ImageTk, ImageOps, ImageDraw
import os
import [Link] as m
import math

[Link]['PYGAME_HIDE_SUPPORT_PROMPT'] = "hide"

import pygame

[Link]()

mydb = [Link](host="localhost", user="root", password="1234",


database="SONORE")
cursor = [Link]()

current_song_index = -1
current_playing_queue = []
all_songs_data = []
is_playing = False
now_playing_title_label = None
now_playing_artist_label = None
now_playing_img_label = None
player_title_label = None
player_artist_label = None
player_img_widget = None
play_btn = None
progress = None
app = None
pause_icon = None
play_icon = None
search_bar = None
playlist_scroll = None
current_song_length = 0

def application(dict_user):
keys_list = list(dict_user.keys())
id1=keys_list[0]
global now_playing_title_label, now_playing_artist_label,
now_playing_img_label
global player_title_label, player_artist_label, player_img_widget,
play_btn, progress
global is_playing, current_playing_queue, app, pause_icon, play_icon,
search_bar, playlist_scroll, all_songs_data

# ------------------ CONFIG ------------------


ctk.set_appearance_mode("dark")
ctk.set_default_color_theme("green")

# Color variables
MAIN_BG = "#151515"
SECTION_BG = "#1f1f1f"
BLUE = "#A3BCF9"
WINDOW_W, WINDOW_H = 1280, 720
ICON_DIR = "icons"

# --------------- HELPERS --------------------


def load_icon(name, size=(64, 64)): #function to load icons
if [Link](name):
path = name
else:
path = [Link](ICON_DIR, name)
if not [Link](path):
return None
pil = [Link](path).convert("RGBA")
pil = [Link](pil, size, method=[Link],
centering=(0.5, 0.5))
return [Link](pil, size=size)

def load_cover_icon(path, size=(44, 44)): #function to load image on


playlists
try:
pil = [Link](path).convert("RGBA")
mask = [Link]("L", size, 0)
draw = [Link](mask)
[Link]((0, 0) + size, fill=255)
pil = [Link](pil, [Link], method=[Link])
[Link](mask)
return [Link](pil, size=size)
except Exception:
return None

def make_circle_image(w, h): #function to create a circle object


img = [Link]("RGBA", (w, h), (0, 0, 0, 0))
mask = [Link]("L", (w, h), 0)
draw = [Link](mask)
[Link]((0, 0, w - 1, h - 1), fill=BLUE)
draw2 = [Link](img)
[Link]((0, 0, w - 1, h - 1), fill=BLUE)
return [Link](img, size=(w, h))

def update_player_info(song_info): #updates current player info


global is_playing, current_song_length
name, artist, logo_path, song_path = song_info

now_playing_title_label.configure(text=name)
now_playing_artist_label.configure(text=artist)

player_title_label.configure(text=name)
player_artist_label.configure(text=artist)

try:
if logo_path and [Link](logo_path):
pil_img = [Link](logo_path).convert("RGBA")
pil_img_side = [Link](pil_img, (240, 240))
pil_img_bottom = [Link](pil_img, (56, 56))

now_playing_img_label.configure(image=[Link](pil_img_side,
size=(240, 240)))

player_img_widget.configure(image=[Link](pil_img_bottom,
size=(56, 56)))
else:
default_img = make_circle_image(240, 240)
now_playing_img_label.configure(image=default_img)
player_img_widget.configure(image=make_circle_image(56,
56))
except Exception as e:
print(f"Error updating image: {e}")
default_img = make_circle_image(240, 240)
now_playing_img_label.configure(image=default_img)
player_img_widget.configure(image=make_circle_image(56, 56))

try:
[Link](song_path)
[Link]()
is_playing = True
if pause_icon:
play_btn.configure(image=pause_icon)

snd = [Link](song_path)
current_song_length = snd.get_length()

update_progress() # start progress loop


except [Link] as e:
print(f"Error playing music: {e}")
def update_progress(): #function to update the progress bar
if is_playing and current_song_index != -1:
pos_ms = [Link].get_pos()
if pos_ms >= 0 and current_song_length > 0:
[Link](pos_ms / 1000 / current_song_length)
[Link](1000, update_progress)

# --------------- POPUP HELPERS --------------------


def show_popup(title, message): #function for popups
popup = [Link](app)
[Link](title)
[Link]("300x150")
[Link](False, False)
popup.grab_set()
x = app.winfo_x() + (app.winfo_width() // 2) - 150
y = app.winfo_y() + (app.winfo_height() // 2) - 75
[Link](f"+{x}+{y}")
label = [Link](popup, text=message, font=("Manjari", 14))
[Link](pady=20)
close_btn = [Link](
popup, text="OK", command=[Link], width=80,
corner_radius=10
)
close_btn.pack(pady=10)

# --------------- MAIN APP -------------------


app = [Link]()
[Link]("Sonore")
[Link](f"{WINDOW_W}x{WINDOW_H}")
[Link](False, False)
[Link](fg_color=MAIN_BG)

def show_create_playlist():
popup = [Link](app)
[Link]("Create Playlist")
[Link]("400x200")
[Link](app)
popup.grab_set()
x = app.winfo_x() + (WINDOW_W // 2) - 200
y = app.winfo_y() + (WINDOW_H // 2) - 100
[Link](f"400x200+{x}+{y}")
[Link](fg_color=MAIN_BG)

[Link](
popup,
text="Enter Playlist Name",
text_color="white",
font=("Manjari", 24, "bold")
).pack(pady=15)

playlist_name_entry = [Link](
popup,
placeholder_text="Playlist Name",
width=250,
fg_color=SECTION_BG,
text_color="white"
)
playlist_name_entry.pack(pady=10)

def confirm_playlist():
name = playlist_name_entry.get().strip()
if name:
[Link](
f"create table `{name}`(user_id INT(3), name VARCHAR(30),
path VARCHAR(100), artist VARCHAR(15), description VARCHAR(30), logo
VARCHAR(100))"
)
[Link]()
[Link]()
show_popup("Success", f"Playlist '{name}' created
successfully!")
refresh_playlists()

confirm_btn = [Link](
popup,
text="Confirm",
fg_color=BLUE,
text_color="black",
command=confirm_playlist
)
confirm_btn.pack(pady=15)

def refresh_playlists():
for widget in playlist_scroll.winfo_children():
[Link]()

[Link](
'SELECT table_name FROM information_schema.tables '
'WHERE table_schema = "SONORE" AND table_name NOT IN
("user", "song");'
)
playlist_data = [Link]()

for playlist in playlist_data:


playlist_name = playlist[0]
[Link](f"SELECT logo FROM `{playlist_name}` LIMIT 1")
logo_data = [Link]()
icon = None
if logo_data and logo_data[0] and [Link](logo_data[0]):
icon = load_cover_icon(logo_data[0], (44, 44))

if icon:
btn = [Link](
playlist_scroll,
image=icon,
text="",
width=44,
height=44,
fg_color=SECTION_BG,
corner_radius=20,
command=lambda name=playlist_name:
load_and_play_playlist(name)
)
else:
btn = [Link](
playlist_scroll,
text=playlist_name[:3].upper(),
width=44,
height=44,
fg_color=BLUE,
corner_radius=20,
text_color="black",
font=("Manjari", 16, "bold"),
command=lambda name=playlist_name:
load_and_play_playlist(name)
)
[Link](pady=12)

def load_and_play_playlist(playlist_name):
global current_playing_queue, current_song_index
try:
[Link](f"SELECT name, artist, logo, path FROM
`{playlist_name}`")
playlist_songs = [Link]()

if not playlist_songs:
show_popup("Playlist Empty", "This playlist does not contain any
songs.")
return
current_playing_queue = [(row[3], (row[0], row[1], row[2], row[3]))
for row in playlist_songs]
current_song_index = 0

song_path, song_info =
current_playing_queue[current_song_index]
update_player_info(song_info)

except [Link] as err:


show_popup("Database Error", f"Failed to load playlist: {err}")

# ---------- Search Bar ----------


def on_search(event=None):
global current_song_index, current_playing_queue
query = search_bar.get().strip()

if not query:
show_popup("Search Error", "Please enter a song name to
search.")
return

[Link]("SELECT name, artist, logo, path FROM song")


fetched_output = [Link]()
found_song_info = None

current_playing_queue = []
for i, row in enumerate(fetched_output):
current_playing_queue.append((row[3], (row[0], row[1], row[2],
row[3])))
name, artist, logo, path = row
if [Link]() == [Link]():
found_song_info = (name, artist, logo, path)
current_song_index = i

if found_song_info:
print(f"Playing song: {found_song_info[0]}")
update_player_info(found_song_info)
else:
show_popup("Song Not Found", f"No song found with the name
'{query}'")
current_playing_queue = [] # Clear queue if not found
search_bar.delete(0, "end")
search_bar = [Link](
app,
placeholder_text="Search",
width=350,
height=36,
corner_radius=20,
fg_color=SECTION_BG,
placeholder_text_color="#fff",
border_width=0,
text_color="white",
font=("Manjari", 18, 'bold'),
)
search_bar.place(x=(WINDOW_W - 350) // 2, y=18)
search_bar.bind("<Return>", on_search)

# ---------------- Sidebar -----------------


sidebar = [Link](
app, fg_color=SECTION_BG, width=80, height=WINDOW_H - 188,
corner_radius=20
)
[Link](x=10, y=70)

plus_icon = load_icon("plus_small.png", (17, 17))


if plus_icon:
plus_btn = [Link](
sidebar,
image=plus_icon,
text="",
width=35,
height=40,
fg_color=BLUE,
corner_radius=20,
command=show_create_playlist
)
else:
plus_btn = [Link](
sidebar,
text="+",
width=44,
height=44,
fg_color=BLUE,
corner_radius=20,
text_color="black",
font=("Manjari", 18, "bold"),
command=show_create_playlist
)
plus_btn.place(x=11, y=18)

playlist_scroll = [Link](
sidebar, width=55, height=WINDOW_H - 188 - 80,
fg_color=SECTION_BG
)
playlist_scroll.place(x=8, y=80)
refresh_playlists()

# ---------------- Main content ----------------


main_frame = [Link](
app, fg_color=SECTION_BG, width=815, height=WINDOW_H - 225,
corner_radius=20
)
main_frame.place(x=95, y=70)

[Link](
main_frame,
text="Music Displayed",
text_color="white",
font=("Manjari", 28, "bold")
).pack(pady=(10, 20), anchor="w", padx=20)

[Link]("select name,artist,logo,path from song")


all_songs_data = [Link]()
current_playing_queue = [(row[3], (row[0], row[1], row[2], row[3])) for
row in all_songs_data]

def play_song_command(index):
global current_song_index, current_playing_queue
current_playing_queue = [(row[3], (row[0], row[1], row[2], row[3]))
for row in all_songs_data] # Reset queue to all songs
current_song_index = index
song_path, song_info = current_playing_queue[current_song_index]
update_player_info(song_info)

thumb_w, thumb_h = 110, 110


cols = 5
rows = [Link](len(all_songs_data) / cols)
gap_x = (850 - (cols * thumb_w)) / (cols + 1)
gap_y = 180
index = 0

for r in range(rows):
row_frame = [Link](main_frame, fg_color=SECTION_BG)
row_frame.pack(pady=(0, gap_y - thumb_h), anchor='w')
for c in range(cols):
if index >= len(all_songs_data):
break
song_name, song_artist, song_logo, song_path =
all_songs_data[index]

try:
if song_logo and [Link](song_logo):
pil_img = [Link](song_logo).convert("RGBA")
pil_img = [Link](pil_img, (thumb_w, thumb_h))
logo_ctk = [Link](pil_img, size=(thumb_w, thumb_h))
tile_btn = [Link](
row_frame,
image=logo_ctk,
text="",
width=thumb_w,
height=thumb_h,
corner_radius=8,
fg_color=SECTION_BG,
hover_color="#333",
command=lambda idx=index: play_song_command(idx)
)
else:
tile_btn = [Link](
row_frame,
text="",
width=thumb_w,
height=thumb_h,
corner_radius=8,
fg_color=BLUE,
hover_color="#333",
command=lambda idx=index: play_song_command(idx)
)
tile_btn.grid(row=0, column=c, padx=(gap_x / 2, 0))
except Exception as e:
print("Error loading logo:", e)
tile_btn = [Link](
row_frame,
text="",
width=thumb_w,
height=thumb_h,
corner_radius=8,
fg_color=BLUE,
hover_color="#333",
command=lambda idx=index: play_song_command(idx)
)
tile_btn.grid(row=0, column=c, padx=(gap_x / 2, gap_x / 2))

[Link](
row_frame, text=song_name, text_color="white",
font=("Manjari", 17, "bold")
).grid(row=1, column=c, pady=(5, 0))
[Link](
row_frame, text=song_artist, text_color="#fff", font=("Manjari",
14)
).grid(row=2, column=c)
index += 1

# --------------- Now Playing(music info) ---------------


def add_song_to_playlist(playlist_name):
if current_song_index == -1:
show_popup("Error", "No song is currently playing.")
return

try:
song_info = current_playing_queue[current_song_index][1]
song_name, artist, logo_path, song_path = song_info

# Corrected INSERT statement


insert_query = f"INSERT INTO `{playlist_name}` (user_id, name,
path, artist, description, logo) VALUES (%s, %s, %s, %s, %s, %s)"
song_data = (id1, song_name, song_path, artist, "No description",
logo_path)

[Link](insert_query, song_data)
[Link]()
show_popup("Success", f"Song '{song_name}' added to playlist
'{playlist_name}'.")

except Exception as e:
show_popup("Error", f"Failed to add song to playlist: {e}")

def show_add_to_playlist_popup():
if current_song_index == -1:
show_popup("Error", "No song is currently playing. Please select a
song first.")
return

popup = [Link](app)
[Link]("Add to Playlist")
[Link]("350x400")
[Link](app)
popup.grab_set()
x = app.winfo_x() + (app.winfo_width() // 2) - 175
y = app.winfo_y() + (app.winfo_height() // 2) - 200
[Link](f"+{x}+{y}")
[Link](fg_color=MAIN_BG)

[Link](
popup,
text="Select a Playlist",
text_color="white",
font=("Manjari", 20, "bold")
).pack(pady=10)

playlist_frame = [Link](popup,
fg_color=SECTION_BG, corner_radius=10)
playlist_frame.pack(fill="both", expand=True, padx=20, pady=10)

[Link](
'SELECT table_name FROM information_schema.tables '
'WHERE table_schema = "SONORE" AND table_name NOT IN
("user", "song");'
)
playlists = [Link]()

if not playlists:
[Link](playlist_frame, text="No playlists found.",
text_color="white").pack(pady=20)
else:
for playlist in playlists:
playlist_name = playlist[0]
[Link](
playlist_frame,
text=playlist_name,
fg_color=BLUE,
text_color="black",
font=("Manjari", 16, "bold"),
command=lambda name=playlist_name:
add_song_to_playlist(name)
).pack(pady=5, padx=10, fill="x")

right_frame = [Link](
app, fg_color=SECTION_BG, width=315, height=WINDOW_H - 188,
corner_radius=20
)
right_frame.place(x=953, y=70)

[Link](
right_frame,
text="Now Playing",
text_color="white",
font=("Manjari", 22, "bold")
).place(x=20, y=14)

now_playing_img_label = [Link](right_frame,
image=make_circle_image(240, 240), text="")
now_playing_img_label.place(x=30, y=70)

now_playing_title_label = [Link](
right_frame,
text="Song Title - Artist",
text_color="white",
font=("Manjari", 20, "bold")
)
now_playing_title_label.place(x=20, y=322)
now_playing_artist_label = [Link](
right_frame,
text="Album • Year",
text_color="#cfcfcf",
font=("Manjari", 18)
)
now_playing_artist_label.place(x=20, y=348)

add_icon = load_icon("plus_small.png", (18, 18))


if add_icon:
[Link](
right_frame,
image=add_icon,
text="",
width=35,
height=40,
fg_color=BLUE,
corner_radius=20,
command=show_add_to_playlist_popup
).place(x=240, y=320)
else:
[Link](
right_frame,
text="+",
width=34,
height=34,
fg_color=BLUE,
corner_radius=20,
text_color="black",
command=show_add_to_playlist_popup
).place(x=250, y=360)

# ---------------- Bottom Player ------------------


player_h = 100
player_frame = [Link](
app, fg_color=SECTION_BG, width=WINDOW_W - 20,
height=player_h, corner_radius=12
)
player_frame.place(x=10, y=WINDOW_H - player_h - 10)

player_img_widget = [Link](
player_frame, image=make_circle_image(56, 56), text=""
)
player_img_widget.place(x=12, y=20)

player_title_label = [Link](
player_frame,
text="Song Title",
text_color="white",
font=("Manjari", 20, "bold")
)
player_title_label.place(x=80, y=22)
player_artist_label = [Link](
player_frame,
text="Artist Name",
text_color="#cfcfcf",
font=("Manjari", 18)
)
player_artist_label.place(x=80, y=50)

prev_icon = load_icon("[Link]", (20, 20))


play_icon = load_icon("[Link]", (20, 20))
pause_icon = load_icon("[Link]", (20, 20))
next_icon = load_icon("[Link]", (20, 20))

control_x_center = WINDOW_W // 2
start_x = control_x_center - 70

def on_prev():
global current_song_index
if not current_playing_queue: return
current_song_index = (current_song_index - 1 +
len(current_playing_queue)) % len(current_playing_queue)
song_path, song_info = current_playing_queue[current_song_index]
update_player_info(song_info)

def on_play_pause():
global is_playing
if not current_playing_queue or current_song_index == -1: return

if is_playing:
[Link]()
is_playing = False
if play_icon:
play_btn.configure(image=play_icon)
else:
[Link]()
is_playing = True
if pause_icon:
play_btn.configure(image=pause_icon)

def on_next():
global current_song_index
if not current_playing_queue: return
current_song_index = (current_song_index + 1) %
len(current_playing_queue)
song_path, song_info = current_playing_queue[current_song_index]
update_player_info(song_info)

if prev_icon:
prev_btn = [Link](
player_frame, image=prev_icon, text="", width=30, height=40,
fg_color=BLUE,
corner_radius=20, command=on_prev, text_color="#151515"
)
else:
prev_btn = [Link](player_frame, text="⏮", width=30,
height=40, fg_color=BLUE,
corner_radius=20, command=on_prev, text_color="#151515"
)
prev_btn.place(x=start_x, y=24)

if play_icon:
play_btn = [Link](
player_frame, image=play_icon, text="", width=30, height=40,
fg_color=BLUE,
corner_radius=20, command=on_play_pause,
text_color="#151515"
)
else:
play_btn = [Link](
player_frame, text="▶", width=30, height=40, fg_color=BLUE,
corner_radius=20, command=on_play_pause,
text_color="#151515"
)
play_btn.place(x=start_x + 70, y=24)

if next_icon:
next_btn = [Link](
player_frame, image=next_icon, text="", width=30, height=40,
fg_color=BLUE,
corner_radius=20, command=on_next, text_color="#151515"
)
else:
next_btn = [Link](
player_frame, text="⏭", width=30, height=40, fg_color=BLUE,
corner_radius=20, command=on_next, text_color="#151515"
)
next_btn.place(x=start_x + 140, y=24)
[Link](player_frame, text="00:00", text_color="white",
font=("Manjari", 10)).place(x=start_x - 150, y=64)
progress = [Link](player_frame, width=380, height=6,
progress_color=BLUE)
[Link](x=start_x - 110, y=74)
[Link](0)
[Link](player_frame, text="03:45", text_color="white",
font=("Manjari", 10)).place(x=start_x + 290, y=64)

[Link]()

OUTPUT
CONCLUSION

The Sonore project successfully


demonstrates the integration of
technology and music to create an
engaging and user-friendly music player.
Through this project, we explored key
concepts of sound management,
interface design, and interactive
features, making music more accessible
and enjoyable. It highlights the potential
of combining creativity with technical
skills to develop practical applications.
Overall, Sonore not only fulfills its
functional purpose but also provides a
platform for enhancing the user’s
musical experience.
BIBLIOGRAPHY

1. Class 11 textbook – Preeti Arora

2. Class 12 textbook – Preeti Arora

3. [Link]
python/introduction-to-python-tabulate-
library/

You might also like