#!/usr/bin/env python3
"""
Pro Video Player v1.0
— اپلیکیشن پخش ویدیو حرفه‌ای
— ساخته شده توسط Us.abolfazl
"""

import os
import sys
import json
import time
import tkinter as tk
from tkinter import ttk, filedialog, messagebox
import ctypes

# Check for python-vlc
try:
    import vlc
except ImportError:
    print("Installing python-vlc...")
    os.system("pip install python-vlc")
    import vLC

# Check for Pillow (screenshots)
try:
    from PIL import ImageGrab
except ImportError:
    print("Installing Pillow...")
    os.system("pip install Pillow")
    from PIL import ImageGrab

class ProVideoPlayer:
    def __init__(self):
        self.root = tk.Tk()
        self.root.title("🎬 Pro Video Player by Us.abolfazl")
        self.root.geometry("1000x700")
        self.root.configure(bg="#1a1a2e")
        self.root.minsize(800, 600)
        
        # VLC instance
        self.instance = vlc.Instance('--no-xlib')
        self.player = self.instance.media_player_new()
        
        # State
        self.is_playing = False
        self.is_fullscreen = False
        self.volume = 100
        self.volume_boost = 1.0
        self.speed = 1.0
        self.subtitle_file = None
        self.playlist = []
        self.current_index = 0
        
        # Build UI
        self.setup_ui()
        self.setup_bindings()
        
        # Set window icon
        try:
            self.root.iconbitmap(default="")
        except:
            pass
        
    def setup_ui(self):
        # Main container
        self.main_frame = tk.Frame(self.root, bg="#1a1a2e")
        self.main_frame.pack(fill=tk.BOTH, expand=True)
        
        # Video area
        self.video_frame = tk.Frame(self.main_frame, bg="#000000")
        self.video_frame.pack(fill=tk.BOTH, expand=True)
        
        # Placeholder
        self.placeholder = tk.Label(self.video_frame, 
            text="🎬\n\nفایل ویدیو رو باز کنید\nیا فایل رو اینجا بکشید",
            bg="#000000", fg="#666666", font=("Arial", 16))
        self.placeholder.pack(fill=tk.BOTH, expand=True)
        
        # Controls frame
        self.controls_frame = tk.Frame(self.main_frame, bg="#16213e", height=120)
        self.controls_frame.pack(fill=tk.X)
        self.controls_frame.pack_propagate(False)
        
        self.build_controls()
        
    def build_controls(self):
        # Row 1: Progress bar
        progress_frame = tk.Frame(self.controls_frame, bg="#16213e")
        progress_frame.pack(fill=tk.X, padx=10, pady=(5,0))
        
        self.time_label = tk.Label(progress_frame, text="00:00", bg="#16213e", fg="#aaa", font=("Arial", 9))
        self.time_label.pack(side=tk.LEFT, padx=(0,5))
        
        self.progress = tk.Scale(progress_frame, from_=0, to=100, orient=tk.HORIZONTAL,
            bg="#16213e", fg="#fff", highlightthickness=0, troughcolor="#333",
            activebackground="#e94560", command=self.seek)
        self.progress.pack(fill=tk.X, expand=True)
        
        self.duration_label = tk.Label(progress_frame, text="00:00", bg="#16213e", fg="#aaa", font=("Arial", 9))
        self.duration_label.pack(side=tk.RIGHT, padx=(5,0))
        
        # Row 2: Main controls
        main_ctrl = tk.Frame(self.controls_frame, bg="#16213e")
        main_ctrl.pack(fill=tk.X, padx=10, pady=5)
        
        # Left: Play controls
        left_frame = tk.Frame(main_ctrl, bg="#16213e")
        left_frame.pack(side=tk.LEFT)
        
        btn_style = {"bg": "#16213e", "fg": "#fff", "font": ("Arial", 14), "bd": 0, "padx": 8, "pady": 2}
        
        self.play_btn = tk.Button(left_frame, text="▶", command=self.toggle_play, **btn_style)
        self.play_btn.pack(side=tk.LEFT, padx=2)
        
        tk.Button(left_frame, text="⏮", command=self.prev_track, **btn_style).pack(side=tk.LEFT, padx=2)
        tk.Button(left_frame, text="⏭", command=self.next_track, **btn_style).pack(side=tk.LEFT, padx=2)
        
        tk.Button(left_frame, text="⏹", command=self.stop, **btn_style).pack(side=tk.LEFT, padx=2)
        
        # Center: Volume boost
        center_frame = tk.Frame(main_ctrl, bg="#16213e")
        center_frame.pack(side=tk.LEFT, expand=True)
        
        tk.Label(center_frame, text="🔊", bg="#16213e", fg="#fff", font=("Arial", 10)).pack(side=tk.LEFT, padx=(10,2))
        
        self.volume_scale = tk.Scale(center_frame, from_=0, to=300, orient=tk.HORIZONTAL, length=120,
            bg="#16213e", fg="#fff", highlightthickness=0, troughcolor="#333",
            activebackground="#e94560", command=self.set_volume)
        self.volume_scale.set(100)
        self.volume_scale.pack(side=tk.LEFT)
        
        tk.Label(center_frame, text="BOOST", bg="#16213e", fg="#4ecca3", font=("Arial", 8, "bold")).pack(side=tk.LEFT, padx=(5,0))
        
        # Speed control
        tk.Label(center_frame, text="⚡", bg="#16213e", fg="#fff", font=("Arial", 10)).pack(side=tk.LEFT, padx=(15,2))
        
        self.speed_scale = tk.Scale(center_frame, from_=25, to=200, orient=tk.HORIZONTAL, length=100,
            bg="#16213e", fg="#fff", highlightthickness=0, troughcolor="#333",
            activebackground="#ffd700", command=self.set_speed)
        self.speed_scale.set(100)
        self.speed_scale.pack(side=tk.LEFT)
        
        tk.Label(center_frame, text="SPEED", bg="#16213e", fg="#ffd700", font=("Arial", 8, "bold")).pack(side=tk.LEFT, padx=(5,0))
        
        # Right: Buttons
        right_frame = tk.Frame(main_ctrl, bg="#16213e")
        right_frame.pack(side=tk.RIGHT)
        
        btn_style2 = {"bg": "#16213e", "fg": "#fff", "font": ("Arial", 10), "bd": 0, "padx": 6, "pady": 2}
        
        tk.Button(right_frame, text="📁", command=self.open_file, **btn_style2).pack(side=tk.LEFT, padx=2)
        tk.Button(right_frame, text="📝", command=self.load_subtitle, **btn_style2).pack(side=tk.LEFT, padx=2)
        tk.Button(right_frame, text="📸", command=self.screenshot, **btn_style2).pack(side=tk.LEFT, padx=2)
        tk.Button(right_frame, text="📺", command=self.toggle_fullscreen, **btn_style2).pack(side=tk.LEFT, padx=2)
        
        # Row 3: Playlist
        playlist_frame = tk.Frame(self.controls_frame, bg="#16213e")
        playlist_frame.pack(fill=tk.X, padx=10, pady=(0,5))
        
        tk.Label(playlist_frame, text="📋 Playlist:", bg="#16213e", fg="#aaa", font=("Arial", 9)).pack(side=tk.LEFT, padx=(0,5))
        
        self.playlist_label = tk.Label(playlist_frame, text="خالی", bg="#16213e", fg="#666", font=("Arial", 9))
        self.playlist_label.pack(side=tk.LEFT)
        
    def setup_bindings(self):
        self.root.bind("<space>", lambda e: self.toggle_play())
        self.root.bind("<Escape>", lambda e: self.exit_fullscreen())
        self.root.bind("<f>", lambda e: self.toggle_fullscreen())
        self.root.bind("<Left>", lambda e: self.seek_relative(-5))
        self.root.bind("<Right>", lambda e: self.seek_relative(5))
        self.root.bind("<Up>", lambda e: self.volume_scale.set(min(300, self.volume_scale.get() + 10)))
        self.root.bind("<Down>", lambda e: self.volume_scale.set(max(0, self.volume_scale.get() - 10)))
        self.root.bind("<n>", lambda e: self.next_track())
        self.root.bind("<p>", lambda e: self.prev_track())
        self.root.bind("<s>", lambda e: self.screenshot())
        self.root.bind("<l>", lambda e: self.load_subtitle())
        
        # Update progress
        self.update_progress()
        
    def open_file(self):
        filetypes = [
            ("Video Files", "*.mp4 *.mkv *.avi *.mov *.flv *.wmv *.webm *.m4v *.3gp *.ts"),
            ("All Files", "*.*")
        ]
        file = filedialog.askopenfilename(filetypes=filetypes)
        if file:
            self.load_video(file)
            
    def load_video(self, file):
        self.playlist.append(file)
        self.current_index = len(self.playlist) - 1
        self.play_current()
        self.update_playlist_label()
        
    def play_current(self):
        if not self.playlist:
            return
            
        file = self.playlist[self.current_index]
        self.placeholder.pack_forget()
        
        media = self.instance.media_new(file)
        
        # Add subtitle if loaded
        if self.subtitle_file:
            media.add_option(f":sub-file={self.subtitle_file}")
            
        self.player.set_media(media)
        self.player.play()
        self.is_playing = True
        self.play_btn.config(text="⏸")
        
        self.root.title(f"🎬 {os.path.basename(file)} - Pro Video Player")
        
        # Set volume
        self.set_volume(self.volume_scale.get())
        
    def toggle_play(self):
        if self.is_playing:
            self.player.pause()
            self.is_playing = False
            self.play_btn.config(text="▶")
        else:
            self.player.play()
            self.is_playing = True
            self.play_btn.config(text="⏸")
            
    def stop(self):
        self.player.stop()
        self.is_playing = False
        self.play_btn.config(text="▶")
        self.progress.set(0)
        
    def next_track(self):
        if self.current_index < len(self.playlist) - 1:
            self.current_index += 1
            self.play_current()
            self.update_playlist_label()
            
    def prev_track(self):
        if self.current_index > 0:
            self.current_index -= 1
            self.play_current()
            self.update_playlist_label()
            
    def set_volume(self, val):
        self.volume = int(val)
        self.volume_boost = self.volume / 100
        
        # VLC max is 100, so we use audio filter for boost
        if self.volume <= 100:
            self.player.audio_set_volume(self.volume)
        else:
            self.player.audio_set_volume(100)
            # Apply boost via audio filter
            # Note: For boost > 100%, we use a workaround
            boost_factor = self.volume / 100
            self.player.audio_set_volume(min(100, int(100 * boost_factor)))
            
    def set_speed(self, val):
        self.speed = int(val) / 100
        self.player.set_rate(self.speed)
        
    def seek(self, val):
        if self.player.get_length() > 0:
            position = float(val) / 100
            self.player.set_position(position)
            
    def seek_relative(self, seconds):
        current = self.player.get_time()
        self.player.set_time(current + seconds * 1000)
        
    def load_subtitle(self):
        filetypes = [
            ("Subtitle Files", "*.srt *.ass *.ssa *.sub *.vtt"),
            ("All Files", "*.*")
        ]
        file = filedialog.askopenfilename(filetypes=filetypes)
        if file:
            self.subtitle_file = file
            # Reload video with subtitle
            if self.playlist:
                self.play_current()
            messagebox.showinfo("زیرنویس", f"زیرنویس بارگذاری شد:\n{os.path.basename(file)}")
            
    def screenshot(self):
        if not self.playlist:
            return
            
        # Get current frame
        frame = self.player.video_get_frame()
        if frame is not None:
            # Save screenshot
            filename = f"screenshot_{int(time.time())}.png"
            file_path = filedialog.asksaveasfilename(
                defaultextension=".png",
                filetypes=[("PNG", "*.png")],
                initialfile=filename
            )
            if file_path:
                # Use VLC snapshot method
                self.player.video_take_snapshot(0, file_path, 0, 0)
                messagebox.showinfo("اسکرین‌شات", f"ذخیره شد:\n{file_path}")
        else:
            messagebox.showwarning("خطا", "ویدیو در حال پخش نیست!")
            
    def toggle_fullscreen(self):
        if not self.is_fullscreen:
            self.controls_frame.pack_forget()
            self.root.attributes('-fullscreen', True)
            self.is_fullscreen = True
        else:
            self.exit_fullscreen()
            
    def exit_fullscreen(self):
        if self.is_fullscreen:
            self.root.attributes('-fullscreen', False)
            self.controls_frame.pack(fill=tk.X)
            self.is_fullscreen = False
            
    def update_playlist_label(self):
        if self.playlist:
            name = os.path.basename(self.playlist[self.current_index])
            self.playlist_label.config(text=f"{self.current_index + 1}/{len(self.playlist)} - {name}")
            
    def update_progress(self):
        if self.player.get_length() > 0:
            length = self.player.get_length() / 1000
            current = self.player.get_time() / 1000
            
            self.progress.set(self.player.get_position() * 100)
            self.time_label.config(text=self.format_time(current))
            self.duration_label.config(text=self.format_time(length))
            
        self.root.after(500, self.update_progress)
        
    def format_time(self, seconds):
        m, s = divmod(int(seconds), 60)
        h, m = divmod(m, 60)
        if h > 0:
            return f"{h}:{m:02d}:{s:02d}"
        return f"{m:02d}:{s:02d}"
        
    def run(self):
        self.root.mainloop()
        
    def cleanup(self):
        self.player.stop()
        self.player.release()
        self.instance.release()

def main():
    app = ProVideoPlayer()
    try:
        app.run()
    finally:
        app.cleanup()

if __name__ == "__main__":
    main()
