# Developer Quickstart Quick reference for developers contributing to or extending VidPly. --- ## ๐Ÿš€ Setup ```bash # Clone repository git clone https://github.com/MatthiasPeltzer/vidply.git cd vidply # Install dependencies npm install # Build production files npm run build # Start dev server npm run dev ``` Dev server runs at `http://localhost:3000` --- ## ๐Ÿ“ Directory Structure ``` vidply/ โ”œโ”€โ”€ build/ # Build scripts โ”‚ โ”œโ”€โ”€ build.js # TypeScript bundling (esbuild โ†’ ESM + IIFE) โ”‚ โ”œโ”€โ”€ build-css.js # CSS build (clean-css) โ”‚ โ”œโ”€โ”€ watch.js # Watch mode โ”‚ โ””โ”€โ”€ clean.js # Clean dist โ”œโ”€โ”€ demo/ # Demo pages โ”‚ โ”œโ”€โ”€ demo.html # Main demo โ”‚ โ”œโ”€โ”€ playlist-audio.html # Audio playlist demo โ”‚ โ”œโ”€โ”€ playlist-video.html # Video playlist demo โ”‚ โ”œโ”€โ”€ hls-test.html # HLS streaming demo โ”‚ โ”œโ”€โ”€ dash-test.html # DASH streaming demo โ”‚ โ””โ”€โ”€ single-player-dash.html # Single DASH player demo โ”œโ”€โ”€ dist/ # Built files (generated) โ”‚ โ”œโ”€โ”€ prod/vidply.esm.min.js # ES Module (production) โ”‚ โ”œโ”€โ”€ legacy/vidply.min.js # IIFE (production) โ”‚ โ”œโ”€โ”€ types/index.d.ts # TypeScript declarations โ”‚ โ””โ”€โ”€ vidply.min.css # Styles (production) โ”œโ”€โ”€ docs/ # Documentation โ”œโ”€โ”€ src/ # Source code (strict TypeScript) โ”‚ โ”œโ”€โ”€ core/ โ”‚ โ”‚ โ””โ”€โ”€ Player.ts # Main Player class โ”‚ โ”œโ”€โ”€ controls/ โ”‚ โ”‚ โ”œโ”€โ”€ ControlBar.ts # Control bar UI (incl. download button, buffering spinner) โ”‚ โ”‚ โ”œโ”€โ”€ CaptionManager.ts # Caption handling โ”‚ โ”‚ โ”œโ”€โ”€ KeyboardManager.ts # Keyboard shortcuts โ”‚ โ”‚ โ”œโ”€โ”€ SettingsDialog.ts # Settings menu โ”‚ โ”‚ โ””โ”€โ”€ TranscriptManager.ts โ”‚ โ”œโ”€โ”€ features/ โ”‚ โ”‚ โ””โ”€โ”€ PlaylistManager.ts # Playlist support โ”‚ โ”œโ”€โ”€ i18n/ โ”‚ โ”‚ โ”œโ”€โ”€ i18n.ts # i18n system โ”‚ โ”‚ โ”œโ”€โ”€ translations.ts # Translation loader โ”‚ โ”‚ โ””โ”€โ”€ languages/ # Built-in languages โ”‚ โ”‚ โ”œโ”€โ”€ en.ts โ”‚ โ”‚ โ”œโ”€โ”€ de.ts โ”‚ โ”‚ โ”œโ”€โ”€ es.ts โ”‚ โ”‚ โ”œโ”€โ”€ fr.ts โ”‚ โ”‚ โ””โ”€โ”€ ja.ts โ”‚ โ”œโ”€โ”€ icons/ โ”‚ โ”‚ โ””โ”€โ”€ Icons.ts # SVG icon definitions โ”‚ โ”œโ”€โ”€ renderers/ โ”‚ โ”‚ โ”œโ”€โ”€ HTML5Renderer.ts # Native HTML5 video/audio โ”‚ โ”‚ โ”œโ”€โ”€ YouTubeRenderer.ts # YouTube iframe API โ”‚ โ”‚ โ”œโ”€โ”€ VimeoRenderer.ts # Vimeo Player API โ”‚ โ”‚ โ”œโ”€โ”€ SoundCloudRenderer.ts# SoundCloud Widget API โ”‚ โ”‚ โ”œโ”€โ”€ HLSRenderer.ts # hls.js integration + native iOS bridge โ”‚ โ”‚ โ””โ”€โ”€ DASHRenderer.ts # dash.js integration โ”‚ โ”œโ”€โ”€ styles/ โ”‚ โ”‚ โ””โ”€โ”€ vidply.css # Main stylesheet โ”‚ โ”œโ”€โ”€ types/ # Shared TypeScript types โ”‚ โ”‚ โ”œโ”€โ”€ options.ts # PlayerOptions โ”‚ โ”‚ โ””โ”€โ”€ globals.d.ts # Ambient declarations (Hls, dashjs, โ€ฆ) โ”‚ โ”œโ”€โ”€ utils/ โ”‚ โ”‚ โ”œโ”€โ”€ DOMUtils.ts # DOM helpers โ”‚ โ”‚ โ”œโ”€โ”€ EventEmitter.ts # Event system โ”‚ โ”‚ โ”œโ”€โ”€ TimeUtils.ts # Time formatting โ”‚ โ”‚ โ”œโ”€โ”€ FocusUtils.ts # Focus management โ”‚ โ”‚ โ”œโ”€โ”€ MenuUtils.ts # Menu helpers โ”‚ โ”‚ โ”œโ”€โ”€ StorageManager.ts # localStorage wrapper โ”‚ โ”‚ โ””โ”€โ”€ ... โ”‚ โ””โ”€โ”€ index.ts # Main entry point โ”œโ”€โ”€ index.html # Development page โ”œโ”€โ”€ tsconfig.json # Strict TypeScript config โ”œโ”€โ”€ package.json โ””โ”€โ”€ server.js # Dev server ``` --- ## โšก NPM Scripts | Script | Description | |--------|-------------| | `npm run build` | Build everything (TypeScript bundles + types + CSS) | | `npm run build:js` | Bundle TypeScript with esbuild (ESM + IIFE) | | `npm run build:types` | Emit `.d.ts` type declarations to `dist/types/` | | `npm run build:css` | Build CSS only | | `npm run typecheck` | `tsc --noEmit` strict type-check across `src/` | | `npm run watch` | Watch mode (auto-rebuild) | | `npm run dev` | Start dev server | | `npm run clean` | Clean dist directory | | `npm run start` | Build + start dev server | | `npm run test` | Vitest unit tests | | `npm run test:e2e` | Playwright end-to-end tests | --- ## ๐Ÿ—๏ธ Build System ### TypeScript bundles (esbuild) `build/build.js` consumes the TypeScript sources directly (esbuild handles transpilation) and produces: | File | Format | Use | |------|--------|-----| | `dev/vidply.esm.js` | ES Module | Development | | `prod/vidply.esm.min.js` | ES Module | Production | | `legacy/vidply.js` | IIFE | Development | | `legacy/vidply.min.js` | IIFE | Production | **Features:** - Code splitting (renderers loaded on demand) - Tree shaking - Source maps (development) - Minification (production) ### Type declarations (tsc) `npm run build:types` runs `tsc --emitDeclarationOnly` against `tsconfig.build.json` and emits: | File | Use | |------|-----| | `dist/types/index.d.ts` | Public type entry, referenced from `package.json#types` | | `dist/types/**/*.d.ts` | Per-module declarations for tree-shakable named imports | ### CSS (clean-css) `build/build-css.js` produces: | File | Use | |------|-----| | `vidply.css` | Development | | `vidply.min.css` | Production | --- ## ๐ŸŽฏ Architecture ### Core Components ``` Player โ”œโ”€โ”€ ControlBar # UI controls โ”‚ โ”œโ”€โ”€ PlayButton โ”‚ โ”œโ”€โ”€ ProgressBar โ”‚ โ”œโ”€โ”€ VolumeControl โ”‚ โ”œโ”€โ”€ DownloadButton # opt-in via downloadButton/downloadUrl โ”‚ โ”œโ”€โ”€ PipButton # native PiP, or pin/unpin custom floating player when floating: true โ”‚ โ”œโ”€โ”€ SettingsButton โ”‚ โ””โ”€โ”€ FullscreenButton โ”œโ”€โ”€ BufferingOverlay # Centered loading spinner (.vidply-loading) โ”œโ”€โ”€ CaptionManager # Captions/subtitles โ”œโ”€โ”€ KeyboardManager # Keyboard shortcuts โ”œโ”€โ”€ TranscriptManager # Interactive transcript โ”œโ”€โ”€ FloatingPlayerManager # Custom in-page miniplayer ("own PiP"), opt-in via floating: true โ”œโ”€โ”€ Renderer # Media playback โ”‚ โ”œโ”€โ”€ HTML5Renderer โ”‚ โ”œโ”€โ”€ YouTubeRenderer โ”‚ โ”œโ”€โ”€ VimeoRenderer โ”‚ โ”œโ”€โ”€ SoundCloudRenderer โ”‚ โ”œโ”€โ”€ HLSRenderer # hls.js + native iOS TextTrack bridge โ”‚ โ””โ”€โ”€ DASHRenderer โ””โ”€โ”€ PlaylistManager # Playlist handling ``` ### Event Flow ``` User Action โ†’ KeyboardManager/ControlBar โ†’ Player โ†’ Renderer โ†’ DOM โ†“ EventEmitter โ†’ External Listeners ``` ### Renderer Selection ```typescript // src/core/Player.ts selectRenderer(src: string): RendererCtor { if (isYouTubeUrl(src)) return YouTubeRenderer; if (isVimeoUrl(src)) return VimeoRenderer; if (src.includes('soundcloud.com')) return SoundCloudRenderer; if (isHLSUrl(src)) return HLSRenderer; // hls.js (or native HLS on iOS/iPadOS) if (isDASHUrl(src)) return DASHRenderer; return HTML5Renderer; } ``` > The HLS renderer self-decides whether to use `hls.js` (Chrome / Firefox / Edge / desktop Safari) or the native `