#!/usr/bin/env python3 """Example usage of VLChan video player with synchan synchronization.""" import time import sys from vlchan import VLChanPlayer def main(): """Example demonstrating VLChan usage.""" # Check command line arguments if len(sys.argv) < 2: print("Usage: python example.py [synchan_url]") print("Example: python example.py /path/to/video.mp4 http://localhost:3000") sys.exit(1) video_path = sys.argv[1] synchan_url = sys.argv[2] if len(sys.argv) > 2 else "http://localhost:3000" print(f"VLChan Example") print(f"Video: {video_path}") print(f"Synchan: {synchan_url}") print("-" * 40) # Create player player = VLChanPlayer(synchan_url, video_path) # Set up state change callback def on_state_change(state): print(f"Synchan update: playing={state.playing}, " f"time={state.currentTime:.2f}s, " f"duration={state.duration:.2f}s, " f"latency={state.latency:.0f}ms") player.on_state_change = on_state_change try: # Start synchronization print("Starting synchan synchronization...") player.start_sync() # Wait a moment for connection time.sleep(1) # Start playback print("Starting video playback...") player.play() # Display controls print("\nControls:") print("- Press 'p' to pause/play") print("- Press 's' to stop") print("- Press 'f' to toggle fullscreen") print("- Press 'v' to change volume") print("- Press 'r' to show current rate") print("- Press 'l' to show latency info") print("- Press 'q' to quit") print("- Press 'j' to seek forward 10s") print("- Press 'k' to seek backward 10s") print("\nPress 'q' to quit...") # Interactive control loop while True: try: # Check for keyboard input (non-blocking) import select import tty import termios if sys.stdin in select.select([sys.stdin], [], [], 0)[0]: key = sys.stdin.read(1) if key == 'q': break elif key == 'p': if player.is_playing(): player.pause() else: player.play() elif key == 's': player.stop() elif key == 'f': player.set_fullscreen(not player.player.get_fullscreen()) elif key == 'v': current_vol = player.get_volume() new_vol = min(100, current_vol + 10) player.set_volume(new_vol) print(f"Volume: {new_vol}") elif key == 'r': current_rate = player.get_rate() print(f"Current playback rate: {current_rate:.3f}") elif key == 'l': pos = player.get_position() print(f"Position: {pos:.2f}s") elif key == 'j': current_pos = player.get_position() player.seek(current_pos + 10) print(f"Seeked forward to {current_pos + 10:.1f}s") elif key == 'k': current_pos = player.get_position() player.seek(max(0, current_pos - 10)) print(f"Seeked backward to {max(0, current_pos - 10):.1f}s") # Display current status if player.is_playing(): pos = player.get_position() dur = player.get_duration() print(f"\rPlaying: {pos:.1f}s / {dur:.1f}s", end="", flush=True) time.sleep(0.1) except KeyboardInterrupt: break except Exception as e: print(f"\nError: {e}") break except Exception as e: print(f"Error: {e}") finally: print("\nCleaning up...") player.cleanup() print("Done!") if __name__ == "__main__": main()