diff --git a/API.md b/API.md index 1e48143..b82aa32 100644 --- a/API.md +++ b/API.md @@ -33,7 +33,7 @@ connect_to_player(config: ConnectionConfig) -> Result, **参数:** ```json { - "host": "192.168.1.100", + "host": "127.0.0.1", "port": 8080, "timeout": 10, "autoReconnect": true, diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..b85fcbd --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,165 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +**Video Player with Remote Control** - A desktop video player built with Nuxt 4 and Tauri 2 that supports WebSocket-based remote control. The application automatically searches for and plays `video.mp4` files from multiple locations and provides a fullscreen video experience with remote control capabilities. + +## Architecture + +### Tech Stack +- **Frontend**: Nuxt 4 (Vue 3) with TypeScript +- **Backend**: Rust with Tauri 2 framework +- **UI Framework**: NuxtUI v3 with TailwindCSS v4 +- **Communication**: WebSocket server (port 6666) for remote control +- **Package Manager**: pnpm (enforced) + +### Key Components + +#### Frontend (`app/`) +- **Main Page**: `app/pages/index.vue` - Fullscreen video player with connection status +- **Tauri Module**: `app/modules/tauri.ts` - Auto-imports Tauri APIs +- **Assets**: `app/assets/` - CSS and icons +- **Layouts**: `app/layouts/` - Application layouts +- **Components**: `app/components/` - Reusable UI components + +#### Backend (`src-tauri/`) +- **Main Entry**: `src-tauri/src/main.rs` - Application bootstrap +- **Library**: `src-tauri/src/lib.rs` - Tauri application setup and state management +- **WebSocket Server**: `src-tauri/src/websocket_server.rs` - Remote control server on port 6666 +- **Player State**: `src-tauri/src/player_state.rs` - Video playback state management +- **Commands**: `src-tauri/src/commands.rs` - Tauri commands for frontend interaction +- **Permissions**: `src-tauri/capabilities/main.json` - Tauri v2 permission configuration + +### Communication Flow +1. **Backend-to-Frontend**: Tauri events (`player-command`, `connection-status`) +2. **Frontend-to-Backend**: Tauri commands (`get_player_state`, `load_video`, etc.) +3. **Remote Control**: WebSocket server accepts JSON commands for playback control +4. **Auto-discovery**: Backend searches for `video.mp4` in multiple directories on startup + +## Development Commands + +### Setup & Installation +```bash +# Install dependencies (requires Node.js 23+) +pnpm install + +# Verify Rust toolchain is installed for Tauri +rustc --version # Should be >= 1.70 +cargo --version +``` + +### Development +```bash +# Start development server with Tauri +pnpm tauri:dev + +# Frontend only (port 3000) +pnpm dev + +# Lint and fix code +pnpm lint +``` + +### Build & Distribution +```bash +# Build production application +pnpm tauri:build + +# Build with debug symbols +pnpm tauri:build:debug + +# Generate static site only +pnpm generate + +# Version bump +pnpm bump +``` + +### Testing WebSocket Control +```bash +# Test WebSocket connection (requires Node.js) +node test_websocket.js +``` + +## Key Features + +### Video Playback +- **Auto-loading**: Searches for `video.mp4` in current directory, public folder, and executable path +- **Fullscreen**: Auto-fullscreen mode configurable via `app.config.ts` +- **Controls**: Play/pause, seek, volume, loop, fullscreen toggle +- **Format Support**: MP4 with fallback handling + +### Remote Control +- **WebSocket Server**: Runs on port 6666 +- **JSON Protocol**: Standardized message format for all commands +- **Connection Status**: Real-time connection indicator in UI +- **Playlist Support**: Load and play from video playlists + +### State Management +- **PlayerState**: Comprehensive video state including position, volume, loop status +- **VideoInfo**: Metadata tracking for loaded videos +- **Real-time Sync**: Frontend/backend state synchronization via Tauri events + +## Configuration Files + +### Application Config +- `app.config.ts` - Player settings (volume, fullscreen, etc.) +- `player_config.json` - Runtime configuration +- `nuxt.config.ts` - Nuxt and Tauri integration settings + +### Build Configuration +- `src-tauri/tauri.conf.json` - Tauri application settings +- `src-tauri/Cargo.toml` - Rust dependencies and features +- `package.json` - Node.js dependencies and scripts + +## Important Notes + +### Permissions +- Tauri v2 uses capabilities-based permissions in `src-tauri/capabilities/main.json` +- Required permissions: file system access, notifications, OS info, shell commands +- WebSocket server runs on port 6666 (configurable in `src-tauri/src/lib.rs`) + +### Development Gotchas +- **SSR Disabled**: `ssr: false` in nuxt.config.ts is required for Tauri +- **Asset URLs**: Uses `asset://localhost/` protocol for local file access +- **Auto-fullscreen**: Configurable but may be disabled in some environments +- **Video Discovery**: Searches up to 6 directory levels up from executable + +### File Structure +``` +video-player/ +├── app/ # Nuxt frontend +│ ├── pages/index.vue # Main video player +│ ├── modules/tauri.ts # Tauri API auto-imports +│ └── assets/ # Static assets +├── src-tauri/ # Rust backend +│ ├── src/ +│ │ ├── lib.rs # Main Tauri app +│ │ ├── websocket_server.rs # Remote control +│ │ └── player_state.rs # Video state +│ └── capabilities/ # Tauri permissions +├── public/ # Static files (video.mp4) +└── types/ # TypeScript definitions +``` + +### Environment Requirements +- **Node.js**: >= 23.0.0 +- **Rust**: >= 1.70.0 +- **pnpm**: >= 10.13.1 (enforced) +- **Platform**: Windows, macOS, or Linux with Tauri prerequisites + +## Common Development Tasks + +### Adding New Tauri Commands +1. Add command function in `src-tauri/src/commands.rs` +2. Register command in `src-tauri/src/lib.rs` invoke_handler +3. Add TypeScript bindings in frontend +4. Update capabilities if new permissions needed + +### WebSocket Protocol +- **Connect**: `ws://localhost:6666` +- **Commands**: JSON format `{"type":"command","data":{"type":"play"}}` +- **Status**: Real-time updates after each command +- **Playlist**: Support for multiple video files \ No newline at end of file diff --git a/app/app.config.ts b/app/app.config.ts index 28186cd..b332fbd 100644 --- a/app/app.config.ts +++ b/app/app.config.ts @@ -9,7 +9,7 @@ export default defineAppConfig({ defaultVolume: 50, autoFullscreen: true, showControls: false, - webSocketPort: 8080, + webSocketPort: 6666, reconnectInterval: 5000 }, ui: { diff --git a/app/pages/index.vue b/app/pages/index.vue index 8e34b21..61d486f 100644 --- a/app/pages/index.vue +++ b/app/pages/index.vue @@ -15,9 +15,12 @@ v-if="currentVideo" ref="videoElement" class="w-full h-full object-contain" - :src="currentVideo.path" + :src="videoSrc" :volume="volume / 100" :loop="isLooping" + playsinline + :muted="isMuted" + preload="auto" autoplay @loadedmetadata="onVideoLoaded" @timeupdate="onTimeUpdate" @@ -75,6 +78,7 @@