AnimeVideoEditot/gui/video_item.py
stirelshka8_BigARM 41beee6283 INIT
2025-11-26 16:06:40 +03:00

108 lines
3.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import tkinter as tk
from tkinter import ttk
import os
from moviepy.editor import VideoFileClip
class VideoItem(ttk.Frame):
def __init__(self, parent, file_path):
super().__init__(parent)
self.file_path = file_path
self.time_ranges = []
self.setup_ui()
def setup_ui(self):
# File info
file_name = os.path.basename(self.file_path)
ttk.Label(self, text=file_name, font=('Arial', 9, 'bold')).grid(row=0, column=0, sticky=tk.W)
# Duration info
try:
with VideoFileClip(self.file_path) as clip:
duration = clip.duration
duration_str = self.format_time(duration)
ttk.Label(self, text=f"Длительность: {duration_str}").grid(row=1, column=0, sticky=tk.W)
except:
duration_str = "Неизвестно"
ttk.Label(self, text="Ошибка чтения файла").grid(row=1, column=0, sticky=tk.W)
# Time ranges frame
ranges_frame = ttk.LabelFrame(self, text="Временные диапазоны")
ranges_frame.grid(row=2, column=0, columnspan=3, sticky=(tk.W, tk.E), pady=5)
self.ranges_container = ttk.Frame(ranges_frame)
self.ranges_container.pack(fill=tk.X, padx=5, pady=5)
# Add range button
ttk.Button(ranges_frame, text="+ Добавить диапазон",
command=self.add_time_range).pack(pady=5)
# Buttons
ttk.Button(self, text="Удалить",
command=self.destroy).grid(row=0, column=2, rowspan=2, padx=5)
self.columnconfigure(0, weight=1)
def format_time(self, seconds):
hours = int(seconds // 3600)
minutes = int((seconds % 3600) // 60)
seconds = int(seconds % 60)
return f"{hours:02d}:{minutes:02d}:{seconds:02d}"
def add_time_range(self, start_time=0, end_time=0):
range_frame = ttk.Frame(self.ranges_container)
range_frame.pack(fill=tk.X, pady=2)
ttk.Label(range_frame, text="От:").pack(side=tk.LEFT)
start_var = tk.StringVar(value=self.format_time(start_time))
start_entry = ttk.Entry(range_frame, textvariable=start_var, width=8)
start_entry.pack(side=tk.LEFT, padx=(0, 10))
ttk.Label(range_frame, text="До:").pack(side=tk.LEFT)
end_var = tk.StringVar(value=self.format_time(end_time))
end_entry = ttk.Entry(range_frame, textvariable=end_var, width=8)
end_entry.pack(side=tk.LEFT, padx=(0, 10))
def remove_range():
range_frame.destroy()
self.time_ranges = [r for r in self.time_ranges if r['frame'] != range_frame]
ttk.Button(range_frame, text="×", width=3,
command=remove_range).pack(side=tk.LEFT)
self.time_ranges.append({
'frame': range_frame,
'start_var': start_var,
'end_var': end_var
})
def get_time_ranges(self):
ranges = []
for range_data in self.time_ranges:
try:
start_time = self.parse_time(range_data['start_var'].get())
end_time = self.parse_time(range_data['end_var'].get())
if start_time < end_time:
ranges.append((start_time, end_time))
except:
continue
return ranges
def parse_time(self, time_str):
parts = time_str.split(':')
if len(parts) == 3: # HH:MM:SS
hours, minutes, seconds = map(int, parts)
return hours * 3600 + minutes * 60 + seconds
elif len(parts) == 2: # MM:SS
minutes, seconds = map(int, parts)
return minutes * 60 + seconds
else: # SS
return int(time_str)
def get_duration(self):
try:
with VideoFileClip(self.file_path) as clip:
return clip.duration
except:
return 0