Added [admin/youtube_import.php (line 1)](/Users/tyemeclifford/Documents/GH/mediaplayer/admin/youtube_import.php:1), which: Accepts a channel URL, @handle, or UC... channel ID. Scrapes the channel /videos page. Extracts videos from ytInitialData. Shows a preview with checkboxes. Imports selected videos into videos and video_sources. Stores each video as a canonical YouTube watch URL with mime_type = text/html, so the existing YouTube embed playback path handles it correctly. Downloads scraped thumbnails into media/thumbs/ when possible. Skips duplicates by matching existing remote YouTube URLs. Also wired it into the admin navigation in [admin/index.php (line 172)](/Users/tyemeclifford/Documents/GH/mediaplayer/admin/index.php:172), [admin/add.php (line 199)](/Users/tyemeclifford/Documents/GH/mediaplayer/admin/add.php:199), [admin/edit.php (line 267)](/Users/tyemeclifford/Documents/GH/mediaplayer/admin/edit.php:267), and [admin/settings.php (line 109)](/Users/tyemeclifford/Documents/GH/mediaplayer/admin/settings.php:109). Updated [README.md (line 81)](/Users/tyemeclifford/Documents/GH/mediaplayer/README.md:81) with usage notes.
5.0 KiB
TyClifford.com — Media Player
A self-hosted multimedia player website built with PHP + SQLite + Video.js.
Styled to match the existing gate.php / index.php dark theme exactly.
Requirements
- PHP 8.0+ with
pdo_sqlite,fileinfoextensions - Write permissions on the
data/andmedia/directories
Installation
-
Upload all files to your web server (e.g.
/live/or wherever/index.phplives). -
Set permissions so PHP can write to these directories:
mkdir -p data media/videos media/thumbs chmod 755 data media media/videos media/thumbs -
Visit
index.php— the SQLite database is created automatically on first load. -
Log into admin at
admin/login.php- Default password:
admin - ⚠️ Change it immediately in Admin → Settings → Change Password
- Default password:
File Structure
/ ← web root (deploy here)
├── index.php ← Main player + catalogue (home page)
├── catalogue.php ← Full video catalogue browse page
├── includes/
│ ├── db.php ← SQLite bootstrap + helper functions
│ └── layout.php ← Shared HTML head, topbar, footer, pagination
├── admin/
│ ├── index.php ← Video list with search + pagination
│ ├── add.php ← Add new video with uploaded or external URL sources
│ ├── edit.php ← Edit video metadata + manage local/remote sources
│ ├── youtube_import.php ← Scrape a YouTube channel and import videos
│ ├── settings.php ← Site settings, per-page count, password
│ ├── login.php ← Admin login
│ ├── logout.php ← Session destroy + redirect
│ └── auth.php ← Session auth helpers
├── media/ ← All media files (created automatically)
│ ├── videos/ ← Uploaded video files
│ └── thumbs/ ← Uploaded thumbnail images
└── data/
└── media.db ← SQLite database (auto-created)
Usage
Adding Videos (Admin)
- Go to
admin/add.php - Fill in title, description, duration, sort order
- Upload a thumbnail (JPG/PNG/WebP)
- Add one or more video sources. Each source can be either:
- an uploaded local video file, stored under
media/videos/ - an external URL, stored in SQLite and played as a direct media source or provider embed
- an uploaded local video file, stored under
- For uploaded files, supported formats include:
- MP4 (H.264) — widest compatibility
- WebM (VP9) — smaller size, modern browsers
- OGV — Firefox fallback (legacy)
- Set quality labels (1080p, 720p, 480p, etc.)
- Save — Video.js will use the stored source location and auto-select the best format the browser supports
External URLs must use http:// or https://. Uploaded files and remote URLs can be mixed on the same video. Recognized provider URLs such as YouTube, Vimeo, Dailymotion, Twitch, Facebook, TikTok, Instagram, X/Twitter, SoundCloud, Spotify, Google Drive, Wistia, Streamable, and Loom render through their embed players.
Importing YouTube Channels
Use Admin → YouTube Importer to paste a YouTube channel URL, @handle, or UC... channel ID. The importer scrapes the channel's /videos page, extracts video data from ytInitialData, previews the results, and imports selected videos as remote YouTube embed sources. Duplicate YouTube watch URLs are skipped.
Public Search
The full catalogue page includes a public search for published videos only. Search matches video title, description, and slug; draft videos remain hidden.
Catalogue Per-Page
Configurable in Admin → Settings → Videos per page (1–50). The home page catalogue and the full catalogue page both respect this setting.
Publishing
Videos can be toggled between Published and Draft from the admin list. Only published videos appear on the public-facing pages.
Sorting
Use the Sort Order field — lower numbers appear first. Default is 0.
Player Features
- Video.js 8.x — responsive, accessible HTML5 player
- Custom skin matching the site's dark purple/green theme
- Playback rate controls: 0.5×, 1×, 1.25×, 1.5×, 2×
- Multiple source fallback — browser picks best format automatically
- Local uploaded sources and remote URL sources
- Provider embeds for popular video and audio platforms
- Thumbnail posters
- Keyboard accessible
Security Notes
- Change the default admin password (
admin) immediately after setup - Consider adding
.htaccessHTTP auth or IP restriction to/admin/ - The
data/directory should not be web-accessible; add to.htaccess:<Directory data> Require all denied </Directory> - For production, consider adding CSRF tokens to admin forms
Customisation
- Branding: Edit site title/subtitle in Admin → Settings
- Theme colours: All CSS variables are in
includes/layout.php:root {} - Social links: Edit the About/Links cards in
index.php