Advertisement
egor230

mp4 в mp3.py

May 14th, 2024
469
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.16 KB | Source Code | 0 0
  1. import os, subprocess
  2. import tkinter as tk
  3. from tkinter import messagebox, ttk
  4. a =[]
  5. def move_up():
  6.   selected = listbox.curselection()
  7.   if selected:
  8.     index = selected[0]
  9.     if index > 0:
  10.       item = listbox.get(index)
  11.       listbox.delete(index)
  12.       listbox.insert(index - 1, item)
  13.       listbox.selection_set(index - 1)
  14.  
  15. def move_down():
  16.   selected = listbox.curselection()
  17.   if selected:
  18.    index = selected[0]
  19.    if index < listbox.size() - 1:
  20.     item = listbox.get(index)
  21.     listbox.delete(index)
  22.     listbox.insert(index + 1, item)
  23.     listbox.selection_set(index + 1)
  24.  
  25. # Пусть selected_files будет списком путей к файлам, который вы получаете
  26. selected_files = []
  27.  
  28.  
  29. # Ваша инициализация Tkinter и создание списка a (selected_files)
  30. def update_progress_bar(progress_bar, value, maximum):
  31.   """Обновляет прогресс бар на заданное значение."""
  32.   progress_bar['value'] = value
  33.   progress_bar['maximum'] = maximum
  34.   root.update_idletasks()
  35.  
  36. def merge_mp4_to_mp3():  # Получить список всех выбранных файлов
  37.   selected_files = a
  38.   if not selected_files:
  39.     messagebox.showerror("Ошибка", "Список файлов пуст")
  40.     return
  41.  
  42.   # Определяем путь сохранения
  43.   cmd = ['zenity', '--file-selection', '--directory']
  44.   result = subprocess.run(cmd, check=True, stdout=subprocess.PIPE, text=True)
  45.   save_directory = result.stdout.strip()
  46.  
  47.   if not save_directory:
  48.     messagebox.showerror("Ошибка", "Папка для сохранения не выбрана")
  49.     return
  50.  
  51.   total_files = len(selected_files)
  52.   selected_files = sorted(selected_files)
  53.   # Инициализируем прогресс-бар
  54.   progress_bar = ttk.Progressbar(root, orient='horizontal', length=300, mode='determinate')
  55.   progress_bar.pack(pady=20)
  56.   progress_bar['maximum'] = total_files
  57.  
  58.   for index, mp4_path in enumerate(selected_files, start=1):
  59.     mp3_path = os.path.join(save_directory, os.path.basename(mp4_path).rsplit('.', 1)[0] + '.mp3')
  60.     ffmpeg_command = '''#!/bin/bash
  61.    gnome-terminal -- bash -c '
  62.    ffmpeg -i "{mp4_path}" -q:a 0 -map a "{mp3_path}" -y
  63.    echo "Файл {mp4_name} был конвертирован в {mp3_name}"
  64.    exit
  65.    exec bash'
  66.    '''.format(mp4_path=mp4_path, mp3_path=mp3_path, mp4_name=os.path.basename(mp4_path), mp3_name=os.path.basename(mp3_path))
  67.    
  68.     subprocess.run(['bash', '-c', ffmpeg_command])
  69.     # Обновляем прогресс-бар
  70.     progress_bar['value'] = index
  71.     root.update_idletasks()
  72.  
  73.   progress_bar.pack_forget()  # Убираем прогресс-бар по завершению работы
  74.   messagebox.showinfo("Завершено", "Все файлы были конвертированы и сохранены в выбранную папку")
  75.  
  76. def open_file_explorer():
  77.   # Команда для запуска Zenity с фильтром для mp4 файлов.
  78.   cmd = ['zenity', '--file-selection', '--multiple', '--separator=|', '--file-filter=mp4 files | *.mp4']
  79.  
  80.   # Вызов Zenity и получение выбранных путей
  81.   result = subprocess.run(cmd, check=True, stdout=subprocess.PIPE, text=True)
  82.     # Удаляем лишние пробельные символы и разделяем строки по '|' вместо запятой
  83.     # Затем разделяем каждый путь, убирая символы новой строки
  84.   file_paths = [path for path in result.stdout.strip().replace('\n', '').split('|') if path]    # Выводим очищенные пути
  85.  
  86.   for filepath in file_paths:
  87.     file_name = os.path.basename(filepath)
  88.     a.append(filepath)    # print(filepath, end="\n\n")
  89.     listbox.insert(tk.END, file_name)
  90.  
  91. def delete_selected():  # Получаем индекс (-ы) выбранного элемента
  92.   selected_indices = listbox.curselection()  # Удаляем выбранный элемент из списка
  93.   for index in selected_indices[::-1]:  # Итерируем в обратном порядке, чтобы избежать ошибок индексации
  94.     listbox.delete(index)
  95. root = tk.Tk()
  96. root.title("mp4 в mp3")
  97. root.geometry("740x236+580+330")  # Первые 2 определяют ширину высоту. Пос 2 x и y координаты на экране.
  98. # Фрейм для Listbox и Scrollbar
  99. frame = tk.Frame(root)
  100. frame.pack(pady=10, padx=20, fill=tk.BOTH, expand=True)
  101. # Фрейм для Listbox и Scrollbar
  102. listbox_frame = tk.Frame(root)
  103. listbox_frame.pack(side=tk.LEFT, pady=10, padx=20, fill=tk.BOTH, expand=True)
  104.  
  105. # Listbox с возможностью масштабирования
  106. listbox = tk.Listbox(listbox_frame, height=15)
  107. listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
  108.  
  109. # Scrollbar для Listbox
  110. scrollbar = tk.Scrollbar(listbox_frame, orient="vertical", command=listbox.yview)
  111. scrollbar.pack(side=tk.LEFT, fill=tk.Y)
  112.  
  113. # Связываем Scrollbar с Listbox
  114. listbox.config(yscrollcommand=scrollbar.set)
  115.  
  116. # Фрейм для кнопок перемещения
  117. move_frame = tk.Frame(listbox_frame)
  118. move_frame.pack(side=tk.LEFT, padx=10, fill=tk.Y)
  119.  
  120. # Кнопки "Вверх" и "Вниз"
  121. move_up_btn = tk.Button(move_frame, text="Вверх", command=move_up)
  122. move_up_btn.pack(pady=40)
  123.  
  124. move_down_btn = tk.Button(move_frame, text="Вниз", command=move_down)
  125. move_down_btn.pack(pady=5)
  126.  
  127. # Кнопка "Конвертация MP4 в MP3"
  128. add_file_btn = tk.Button(root,  text="Конвертация MP4 в MP3", command=merge_mp4_to_mp3)
  129. add_file_btn.pack(side=tk.BOTTOM, fill=tk.X, padx=20, pady=5)
  130.  
  131. # Кнопка "Добавить файл" ниже всего остального контента
  132. merge_pdf_btn = tk.Button(root,text="Добавить файлы", command=open_file_explorer)
  133. merge_pdf_btn.pack(fill=tk.X, padx=20, pady=5)
  134.  
  135. # Кнопка "Удалить из списка"
  136. delete_btn = tk.Button(root, text="Удалить", command=delete_selected)
  137. delete_btn.pack( fill=tk.X,padx=20, pady=25)
  138. root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement