The core conversion helper is in [includes/db.php (line
1161)](/Users/tyemeclifford/Documents/GH/mediaplayer/includes/db.php:1161).
The upload flows insert the converted MP4 first for playback and retain
the original M4A as a separate source in [admin/add.php (line
129)](/Users/tyemeclifford/Documents/GH/mediaplayer/admin/add.php:129)
and [admin/edit.php (line
172)](/Users/tyemeclifford/Documents/GH/mediaplayer/admin/edit.php:172).
I also updated the admin upload hints, [README.md (line
77)](/Users/tyemeclifford/Documents/GH/mediaplayer/README.md:77), and
[changelog.md (line
14)](/Users/tyemeclifford/Documents/GH/mediaplayer/changelog.md:14).
What changed:
Added uploaded/direct audio playback paths in
[index.php](/Users/tyemeclifford/Documents/GH/mediaplayer/index.php) and
[embed.php](/Users/tyemeclifford/Documents/GH/mediaplayer/embed.php).
Added common audio upload support: MP3, M4A, AAC, WAV, FLAC, OGG, OGA,
OPUS.
Added waveform poster generation for uploaded audio via ffmpeg, stored
like normal thumbnails under media/thumbs/.
Updated add/edit forms to accept media files, not just video files.
Added audio-friendly labels like Audio, 320kbps, 256kbps, 128kbps.
Updated docs and changelog.
It now recalculates video sort_order from created_at newest-first, so
videos with corrected/original publish dates appear first in the
homepage and public catalogue. I also updated
catalogue/admin/latest-video ordering to use publish date as a
tie-breaker after stored sort order.
Removed the Imgur-specific provider handling from
[includes/db.php](/Users/tyemeclifford/Documents/GH/mediaplayer/includes/db.php),
removed the admin upkeep Imgur counter/copy from
[admin/index.php](/Users/tyemeclifford/Documents/GH/mediaplayer/admin/index.php),
updated the upload hint in
[admin/add.php](/Users/tyemeclifford/Documents/GH/mediaplayer/admin/add.php),
cleaned the README mentions, and deleted provider_embed.php.
Imgur now uses a local wrapper page,
[provider_embed.php](/Users/tyemeclifford/Documents/GH/mediaplayer/provider_embed.php),
that renders Imgur’s official blockquote +
https://s.imgur.com/min/embed.js snippet instead of trying to iframe
Imgur directly. That should avoid the “refuses to connect” issue for
albums, galleries, images, GIFs, GIFV, and videos.
Also updated:
[includes/db.php](/Users/tyemeclifford/Documents/GH/mediaplayer/includes/db.php):
Imgur embed URLs now point to the wrapper, and Imgur view-count scraping
has dedicated fallback patterns.
[admin/index.php](/Users/tyemeclifford/Documents/GH/mediaplayer/admin/index.php):
Upkeeping → Correct Views now explicitly counts Imgur-backed items in
the candidate summary.
[README.md](/Users/tyemeclifford/Documents/GH/mediaplayer/README.md):
documented the Imgur wrapper behavior.
Added default Live settings in
[includes/db.php](/Users/tyemeclifford/Documents/GH/mediaplayer/includes/db.php)
using https://stream.place/embed/tyclifford.com.
Added Admin → Settings → Live Section controls in
[admin/settings.php](/Users/tyemeclifford/Documents/GH/mediaplayer/admin/settings.php):
enable/disable, live title, and embed URL/iframe input.
Added a homepage Videos / Live toggle in
[index.php](/Users/tyemeclifford/Documents/GH/mediaplayer/index.php).
Videos remains the default view, so the homepage behaves normally until
Live is selected.
Imgur:
Added Imgur URL normalization, embed support, oEmbed/thumbnail hooks,
and external view count scraping support in
[includes/db.php](/Users/tyemeclifford/Documents/GH/mediaplayer/includes/db.php).
Supports imgur.com, albums/galleries, and direct i.imgur.com
photos/GIFs/videos by routing them through Imgur embeds.
Imgur external views now flow into external_view_count, so per-item and
overall site totals include readable Imgur provider counts.
Updated the add-video hint and README docs.
Added external_view_count so provider totals from YouTube/Vimeo/etc are
added to the site’s total without double-counting local plays.
Updated public totals and per-video public view displays to use site
views + external views.
Changed Upkeeping action to Correct external view counts with a Correct
Views button.
Expanded provider scraping beyond YouTube with generic
page/JSON-LD/oEmbed patterns for readable Vimeo, Dailymotion, and
similar pages.
Improved Add Video:Title no longer has to be manually entered first.
External URL rows now have Fetch Info.
Metadata can fill title, description, duration, source label, and
external view count.
Save also retries metadata extraction server-side.
Added authenticated metadata endpoint:
[admin/media_info.php](/Users/tyemeclifford/Documents/GH/mediaplayer/admin/media_info.php).
Updated docs in
[README.md](/Users/tyemeclifford/Documents/GH/mediaplayer/README.md).
Added view_count database migration/defaults and shared helpers in
[includes/db.php](/Users/tyemeclifford/Documents/GH/mediaplayer/includes/db.php).
Public player and embed.php now increment views.
Homepage and catalogue can display per-video views, total views, and
public stats based on admin settings.
Added Admin → Settings toggles for public view/stat display.
Added Admin → Upkeeping action to restore external view counts from
readable provider pages, with YouTube scraping support first.
Added manual per-video view-count editing in
[admin/edit.php](/Users/tyemeclifford/Documents/GH/mediaplayer/admin/edit.php)
for older local uploads or corrections.
Updated
[README.md](/Users/tyemeclifford/Documents/GH/mediaplayer/README.md)
with the new behavior.
What changed:
Added shared YouTube publish-date scraping helpers in
[includes/db.php](/Users/tyemeclifford/Documents/GH/mediaplayer/includes/db.php).
New YouTube imports now set videos.created_at to the original YouTube
publish date when available.
Manual Add/Edit saves now also try to correct timestamps for
YouTube-backed videos.
Added Admin Dashboard → Upkeeping → Correct YouTube timestamps in
[admin/index.php](/Users/tyemeclifford/Documents/GH/mediaplayer/admin/index.php),
with batch size control for backfilling existing records.
Renamed the admin table column from Added to Date, since it may now
reflect original publish date.
Documented the behavior in
[README.md](/Users/tyemeclifford/Documents/GH/mediaplayer/README.md).
What changed:
Added shared thumbnail helpers in
[includes/db.php](/Users/tyemeclifford/Documents/GH/mediaplayer/includes/db.php):YouTube
direct thumbnails
Dailymotion direct thumbnails
oEmbed thumbnails for Vimeo, Wistia, TikTok, SoundCloud, Spotify, etc.
optional first-frame thumbnail generation for local uploads when ffmpeg
is installed
Added an “Auto-grab thumbnail” checkbox to
[admin/add.php](/Users/tyemeclifford/Documents/GH/mediaplayer/admin/add.php)
and
[admin/edit.php](/Users/tyemeclifford/Documents/GH/mediaplayer/admin/edit.php).
Reused the new shared downloader in
[admin/youtube_import.php](/Users/tyemeclifford/Documents/GH/mediaplayer/admin/youtube_import.php).
Documented the behavior in
[README.md](/Users/tyemeclifford/Documents/GH/mediaplayer/README.md).
What changed:
Added pretty URL helpers/default setting in
[includes/db.php](/Users/tyemeclifford/Documents/GH/mediaplayer/includes/db.php).
Added root rewrite rules in
[.htaccess](/Users/tyemeclifford/Documents/GH/mediaplayer/.htaccess):/v/<slug>
/all
/search/<query>
Added Admin → Settings “Public URL Style” toggle in
[admin/settings.php](/Users/tyemeclifford/Documents/GH/mediaplayer/admin/settings.php),
defaulting to pretty URLs.
Updated public/player/catalogue/embed/admin preview links to use the
configured URL style.
Added redirects from legacy ?v= and ?q= URLs to pretty routes when
rewriting is enabled.
Documented deployment and fallback behavior in
[README.md](/Users/tyemeclifford/Documents/GH/mediaplayer/README.md).
It now handles more YouTube layouts:
Classic videoRenderer, gridVideoRenderer, and compactVideoRenderer
Shorts-style reelItemRenderer
Newer lockupViewModel channel grid objects
Raw HTML fallback by extracting watch?v=, /shorts/, /embed/, and
"videoId" matches
A second scrape attempt using YouTube’s older grid query:
view=0&sort=dd&flow=grid
So instead of stopping at “no videos found” when YouTube changes the
JSON shape, it now tries multiple extraction strategies and can still
import proper YouTube embed URLs with fallback thumbnails.
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.
What changed:
[includes/db.php (line
227)](/Users/tyemeclifford/Documents/GH/mediaplayer/includes/db.php:227)
now classifies YouTube, Vimeo, Dailymotion, Twitch, Facebook, TikTok,
Instagram, X/Twitter, SoundCloud, Spotify, Google Drive, Wistia,
Streamable, Loom, plus direct Dropbox/GitHub media rewrites.
[index.php (line
235)](/Users/tyemeclifford/Documents/GH/mediaplayer/index.php:235)
renders provider URLs as iframe embeds, while uploaded/direct files
still use Video.js.
[embed.php (line
198)](/Users/tyemeclifford/Documents/GH/mediaplayer/embed.php:198) now
supports those provider embeds too.
[admin/add.php (line
260)](/Users/tyemeclifford/Documents/GH/mediaplayer/admin/add.php:260)
and [admin/edit.php (line
383)](/Users/tyemeclifford/Documents/GH/mediaplayer/admin/edit.php:383)
now describe external URLs as embed-capable and store recognized
provider URLs as text/html.
[README.md (line
63)](/Users/tyemeclifford/Documents/GH/mediaplayer/README.md:63)
documents provider embed support.
Changed:
[includes/db.php (line
43)](/Users/tyemeclifford/Documents/GH/mediaplayer/includes/db.php:43)
adds source_type and source_url, with an automatic migration for
existing SQLite databases.
[admin/add.php (line
260)](/Users/tyemeclifford/Documents/GH/mediaplayer/admin/add.php:260)
and [admin/edit.php (line
383)](/Users/tyemeclifford/Documents/GH/mediaplayer/admin/edit.php:383)
now let each source be an upload or an external URL.
[index.php (line
226)](/Users/tyemeclifford/Documents/GH/mediaplayer/index.php:226) and
[embed.php (line
193)](/Users/tyemeclifford/Documents/GH/mediaplayer/embed.php:193)
resolve playback URLs based on where the source lives.
[catalogue.php (line
79)](/Users/tyemeclifford/Documents/GH/mediaplayer/catalogue.php:79) now
has public search for published videos only.
[README.md (line
63)](/Users/tyemeclifford/Documents/GH/mediaplayer/README.md:63)
documents local vs remote sources and public search.