Last active
July 25, 2025 09:51
-
-
Save ZdenekM/38fe2578df33aef6f87e0d6f25bee749 to your computer and use it in GitHub Desktop.
Qualitative coding block video player
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import vlc | |
import tkinter as tk | |
from tkinter import filedialog | |
import argparse | |
import time | |
import threading | |
import os | |
# --- Parametry --- | |
block_length = 10 # sekund | |
player = None | |
media = None | |
current_block = None | |
current_index = 0 | |
block_label = None | |
start_block = 0 | |
track_id = 1 | |
# --- GUI --- | |
def update_block_label(): | |
start = current_index * block_length | |
end = start + block_length | |
block_label.config(text=f"{time.strftime('%H:%M:%S', time.gmtime(start))} - {time.strftime('%H:%M:%S', time.gmtime(end))} ({track_id})") | |
def on_key(event): | |
global current_index | |
key = event.keysym | |
if key in ["Right", "Left", "space"]: | |
pos = player.get_time() // 1000 | |
current_index = pos // block_length | |
if key == "Right": | |
next_block() | |
elif key == "Left": | |
prev_block() | |
elif key == "space": | |
replay_block() | |
elif key.isdigit(): | |
change_audio_track(int(key)) | |
elif key.startswith("KP_") and key[3:].isdigit(): | |
change_audio_track(int(key[3:])) | |
def change_audio_track(index): | |
global track_id | |
if index == 0: | |
player.audio_set_track(-1) | |
track_id = -1 | |
else: | |
track_id = index | |
player.audio_set_track(index) | |
update_block_label() | |
def next_block(): | |
global current_index | |
current_index += 1 | |
player.set_time(current_index * block_length * 1000) | |
player.play() | |
update_block_label() | |
def prev_block(): | |
global current_index | |
current_index = max(0, current_index - 1) | |
player.set_time(current_index * block_length * 1000) | |
player.play() | |
update_block_label() | |
def replay_block(): | |
player.set_time(current_index * block_length * 1000) | |
player.play() | |
def update(): | |
global current_index | |
while True: | |
time.sleep(0.2) | |
state = player.get_state() | |
if state == vlc.State.Playing: | |
pos = player.get_time() // 1000 | |
new_block = pos // block_length | |
if new_block != current_index: | |
current_index = new_block | |
update_block_label() | |
if pos % block_length == block_length - 1: | |
player.pause() | |
# --- Hlavní část --- | |
parser = argparse.ArgumentParser() | |
parser.add_argument("file", help="Video soubor") | |
parser.add_argument("--start", type=int, default=0, help="Startovní čas v sekundách") | |
args = parser.parse_args() | |
start_block = args.start // block_length | |
current_index = start_block | |
instance = vlc.Instance() | |
player = instance.media_player_new() | |
media = instance.media_new(args.file) | |
player.set_media(media) | |
player.play() | |
# Počkej, až se player přepne do Playing | |
for _ in range(100): | |
if player.get_state() == vlc.State.Playing: | |
break | |
time.sleep(0.05) | |
player.set_time(start_block * block_length * 1000) | |
# GUI | |
root = tk.Tk() | |
root.title("Block Player") | |
root.geometry("400x100") | |
root.bind("<Key>", on_key) | |
block_label = tk.Label(root, text="", font=("Courier", 18)) | |
block_label.pack(pady=20) | |
update_block_label() | |
threading.Thread(target=update, daemon=True).start() | |
root.mainloop() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment