Birazdaha geliştirip Yayınlayacağım Şuan Kısa Bir Tanıtımı.
....... ::::::: TANITIM VİDEOSU ::::::: .......
v1
https://www.dailymotion.com/video/x8ltl9n
V2
https://www.dailymotion.com/video/x8luh8f
Aşağıdaki kod, basit bir YouTube MP3 indirici uygulaması oluşturur. İşlevleri aşağıdaki gibi özetlenebilir:
- Tkinter kütüphanesinden gerekli modüller ve sınıflar içe aktarılır.
download_audio
işlevi, kullanıcının girdiği YouTube video URL'sini alır, videoyu indirir ve MP3 formatına dönüştürür. İndirme işlemi ayrı bir iş parçacığında gerçekleştirilir.download_thread
işlevi, videoyu indirirken ilerlemeyi izlemek ve indirme süresini hesaplamak için çağrılan geriçağırım işlevini içerir.- İndirme ilerlemesi, bir
Progressbar
bileşeniyle görsel olarak gösterilir. - İndirilen dosyanın bilgileri, bir
Treeview
bileşenine eklenerek gösterilir. - Kullanıcı, indirilen dosyalardan birini seçerek oynatabilir.
- Süreleri daha okunabilir hale getirmek için zaman biçimlendirme işlevi (
format_time
) kullanılır. - Tkinter arayüzü oluşturulur ve uygulama çalıştırılır. Arayüz, bir giriş kutusu, bir indirme düğmesi, bir durum etiketi, bir ilerleme çubuğu ve bir dosya ağacı içerir.
Burada Biraz Daha Gelişmiş V2
import tkinter as tk
from tkinter import filedialog
from tkinter import Label
from pytube import YouTube
import threading
import os
from tkinter.ttk import Progressbar, Treeview, Scrollbar
import datetime
def download_audio():
url = entry.get()
try:
yt = YouTube(url)
title = yt.title
filename = title + ".mp3"
save_path = filedialog.asksaveasfilename(defaultextension=".mp3", initialfile=filename)
if save_path:
status_label.config(text="İndirme Başladı")
thread = threading.Thread(target=download_thread, args=(yt, save_path))
thread.start()
except Exception as e:
status_label.config(text="Hata: Video indirilemedi: " + str(e))
def download_thread(yt, save_path):
stream = yt.streams.filter(only_audio=True).first()
total_bytes = stream.filesize
bytes_downloaded = 0
start_time = datetime.datetime.now()
def progress_callback(stream, chunk, bytes_remaining):
nonlocal bytes_downloaded
bytes_downloaded = total_bytes - bytes_remaining
percent = (bytes_downloaded / total_bytes) * 100
progress_bar['value'] = percent
elapsed_time = (datetime.datetime.now() - start_time).total_seconds()
remaining_time = (elapsed_time / percent) * (100 - percent) if percent != 0 else 0
status_label.config(text="İndirme Başladı: %{:.1f} Tamamlandı - Kalan Süre: {}".format(percent, format_time(remaining_time)))
root.update()
yt.register_on_progress_callback(progress_callback)
stream.download(output_path="temp")
temp_filename = stream.default_filename
temp_path = os.path.join("temp", temp_filename)
os.rename(temp_path, save_path)
os.rmdir("temp")
status_label.config(text="İndirme Tamamlandı: " + save_path)
progress_bar['value'] = 0
# İndirme tamamlandığında dosya bilgilerini treeview'a ekle
file_info = [os.path.basename(save_path), datetime.datetime.now().strftime("%H:%M:%S"), datetime.datetime.now().strftime("%Y-%m-%d")]
add_to_treeview(file_info)
def add_to_treeview(file_info):
treeview.insert("", "end", values=file_info)
def play_selected_file(event):
selected_item = treeview.focus()
values = treeview.item(selected_item, "values")
if values:
filename = values[0]
os.startfile(filename) # Bu sadece Windows için çalışır, diğer işletim sistemlerinde uygun bir yöntem kullanılmalı
def format_time(seconds):
return str(datetime.timedelta(seconds=int(seconds)))
root = tk.Tk()
root.title("YouTube Mp3 İndirici")
entry = tk.Entry(root, width=50)
entry.pack(pady=10)
button = tk.Button(root, text="İndir", command=download_audio)
button.pack(pady=10)
status_label = Label(root, text="", bd=1, relief=tk.SUNKEN, anchor=tk.W)
status_label.pack(side=tk.BOTTOM, fill=tk.X)
# Treeview oluştur
treeview = Treeview(root, columns=("dosya adı", "saati", "tarihi"))
treeview.heading("dosya adı", text="Dosya Adı")
treeview.heading("saati", text="Saat")
treeview.heading("tarihi", text="Tarih")
treeview.pack(pady=10)
# Treeview'da bir öğeye tıklandığında play_selected_file fonksiyonunu çağır
treeview.bind("<ButtonRelease-1>", play_selected_file)
# Treeview'ın yatay kaydırma çubuğunu ekle
scrollbar = Scrollbar(root, orient="horizontal", command=treeview.xview)
scrollbar.pack(fill="x")
treeview.configure(xscrollcommand=scrollbar.set)
progress_bar = Progressbar(root, orient=tk.HORIZONTAL, length=200, mode='determinate')
progress_bar.pack(pady=10)
root.mainloop()
Burada ki V1 isteyenler için
import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox
from pytube import YouTube
import threading
import os
from tkinter.ttk import Progressbar
def download_audio():
url = entry.get()
try:
yt = YouTube(url)
title = yt.title
filename = title + ".mp3"
save_path = filedialog.asksaveasfilename(defaultextension=".mp3", initialfile=filename)
if save_path:
messagebox.showinfo("İndirme Başladı", "İndirme işlemi başlatıldı.")
thread = threading.Thread(target=download_thread, args=(yt, save_path))
thread.start()
except Exception as e:
messagebox.showerror("Hata", "Video indirilemedi: " + str(e))
def download_thread(yt, save_path):
stream = yt.streams.filter(only_audio=True).first()
total_bytes = stream.filesize
bytes_downloaded = 0
def progress_callback(stream, chunk, bytes_remaining):
nonlocal bytes_downloaded
bytes_downloaded = total_bytes - bytes_remaining
percent = (bytes_downloaded / total_bytes) * 100
progress_bar['value'] = percent
root.update()
yt.register_on_progress_callback(progress_callback)
stream.download(output_path="temp")
temp_filename = stream.default_filename
temp_path = os.path.join("temp", temp_filename)
os.rename(temp_path, save_path)
os.rmdir("temp")
messagebox.showinfo("İndirme Tamamlandı", "Dosya başarıyla indirildi: " + save_path)
progress_bar['value'] = 0
root = tk.Tk()
root.title("YouTube Mp3 İndirici")
entry = tk.Entry(root, width=50)
entry.pack(pady=10)
button = tk.Button(root, text="İndir", command=download_audio)
button.pack(pady=10)
status_bar = tk.Label(root, text="", bd=1, relief=tk.SUNKEN, anchor=tk.W)
status_bar.pack(side=tk.BOTTOM, fill=tk.X)
progress_bar = Progressbar(root, orient=tk.HORIZONTAL, length=200, mode='determinate')
progress_bar.pack(pady=10)
root.mainloop()