You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

137 lines
5.6 KiB
Python

11 months ago
import tkinter as tk
from tkinter import ttk
import tkinter.simpledialog as sd
import time
import os
from utils import search_youtube, download_audio
class UIEngine:
def __init__(self, db):
self.db = db
self.root = tk.Tk()
self.root.title("celaigia")
self.root.geometry("400x300") # Set a fixed size
11 months ago
# Create a PanedWindow to split the UI vertically
self.paned_window = tk.PanedWindow(self.root, orient=tk.VERTICAL)
self.paned_window.pack(expand=True, fill='both')
# Create the top part of the UI
self.top_frame = ttk.Frame(self.paned_window)
self.paned_window.add(self.top_frame)
self.status_label = tk.Label(self.top_frame, text="Ready")
11 months ago
self.status_label.pack()
11 months ago
self.search_frame = ttk.Frame(self.top_frame)
11 months ago
self.search_frame.pack()
11 months ago
self.download_frame = ttk.Frame(self.top_frame)
self.download_frame.pack()
11 months ago
self.search_status_label = tk.Label(self.search_frame, text="Enter search query:")
self.search_status_label.grid(row=0, column=0)
self.search_entry = tk.Entry(self.search_frame)
self.search_entry.grid(row=0, column=1)
self.search_button = tk.Button(self.search_frame, text="Search", command=lambda: self.search_and_display())
self.search_button.grid(row=0, column=2)
11 months ago
self.download_status_label = tk.Label(self.download_frame, text="Enter URL to download:")
self.download_status_label.grid(row=0, column=0)
self.download_entry = tk.Entry(self.download_frame)
self.download_entry.grid(row=0,column=1)
self.download_button = tk.Button(self.download_frame, text="Download", command=lambda: self.handle_download(self.download_entry.get()))
self.download_button.grid(row=0, column=2)
# Create the bottom part of the UI with tabs
self.bottom_frame = ttk.Frame(self.paned_window)
self.paned_window.add(self.bottom_frame)
self.notebook = ttk.Notebook(self.bottom_frame)
self.notebook.pack(fill='both', expand=True)
self.create_search_tab()
self.create_database_tab(db)
def create_search_tab(self):
search_tab = ttk.Frame(self.notebook)
self.notebook.add(search_tab, text='Search&Download')
self.status_label = tk.Label(search_tab, text="Ready")
self.status_label.pack()
# Create a frame for displaying search results
self.results_frame = ttk.Frame(search_tab)
11 months ago
self.results_frame.pack()
11 months ago
def create_database_tab(self, db):
database_tab = ttk.Frame(self.notebook)
self.notebook.add(database_tab, text='Database')
tree = ttk.Treeview(database_tab, columns=("title", "artist", "filename", "tags", "timestamp"))
tree.heading("#0", text="ID")
tree.heading("title", text="Title")
tree.heading("artist", text="Artist")
tree.heading("filename", text="Filename")
tree.heading("tags", text="Tags")
tree.heading("timestamp", text="Timestamp")
# Populate the treeview with data from the database
for entry in db.get_all_entries():
tree.insert("", "end", text=entry["id"], values=(entry["title"], entry["artist"], entry["filename"], ", ".join(entry["tags"]), entry["timestamp"]))
tree.pack(fill='both', expand=True)
11 months ago
def search_and_display(self):
self.set_status("searching")
query = self.search_entry.get()
# Clear the existing results
for widget in self.results_frame.winfo_children():
widget.destroy()
results = search_youtube(query)
self.display_results(results)
self.set_status("Enter search query or select item to download")
def set_status(self, status):
self.status_label.config(text=status)
self.root.update() # Force GUI update
11 months ago
# Modify the display_results method to use the results_frame in the search_tab
11 months ago
def display_results(self, results):
for i, result in enumerate(results):
11 months ago
if self.db.downloadable(result['webpage_url'], result['title']):
result_button = ttk.Button(self.results_frame, text=result['title'], command=lambda url=result['webpage_url'], filename=result['title']: self.handle_download(url, filename))
result_button.pack()
else:
result_button = tk.Label(self.results_frame, text=f"celaigia: {result['title']}")
result_button.pack()
11 months ago
def handle_download(self, url, filename):
if self.db.downloadable(url, filename):
self.set_status("Downloading...")
success = download_audio(url, self.db.base_path)
if success:
self.set_status("Download completed, adding to db")
self.prompt_user_for_details(url, filename)
self.set_status("Enter search query or select item to download")
# Modify the prompt_user_for_details method
def prompt_user_for_details(self,url, filename):
title = sd.askstring("Enter Title", "Enter Title:", initialvalue=filename)
artist = sd.askstring("Enter Artist", "Enter Artist:")
tags = sd.askstring("Enter Tags", "Enter Tags (comma separated):")
entry = {
"id": url.split('https://www.youtube.com/watch?v=')[-1].strip(),
"title": title.strip(),
"artist": artist.strip(),
"filename": filename.strip(),
"tags": [tag.strip() for tag in tags.split(",")] if tags else [],
"timestamp": time.time()
}
self.add_to_db(entry)
def add_to_db(self, entry):
self.db.add_entry(entry)
def run(self):
self.root.mainloop()