- Added ?land=live support for the homepage in [index.php](/Users/tyemeclifford/Documents/GH/mediaplayer/index.php). When live is enabled, visiting the homepage with ?land=live now renders the Live tab active first, hides the normal video player initially, preserves the live mode through homepage pagination, and updates the URL when switching between Videos and Live.

Also updated 
[README.md](/Users/tyemeclifford/Documents/GH/mediaplayer/README.md) and 
[changelog.md](/Users/tyemeclifford/Documents/GH/mediaplayer/changelog.md).
This commit is contained in:
Ty Clifford
2026-06-25 09:32:51 -04:00
parent d6359ceffa
commit 7375613e63
3 changed files with 52 additions and 27 deletions
+1 -1
View File
@@ -85,7 +85,7 @@ If no thumbnail image is uploaded, the add/edit forms can auto-grab one from the
### Live Homepage Option
The homepage can show a **Videos / Live** switch above the main player. Configure it in **Admin → Settings → Live Section** with either a direct embeddable URL or an iframe snippet. The default live embed is `https://stream.place/embed/tyclifford.com`. Disable the setting to return the homepage to the normal video-only layout.
The homepage can show a **Videos / Live** switch above the main player. Configure it in **Admin → Settings → Live Section** with either a direct embeddable URL or an iframe snippet. The default live embed is `https://stream.place/embed/tyclifford.com`. Use `?land=live` on the homepage URL to open with the live embed displayed first. Disable the setting to return the homepage to the normal video-only layout.
### Importing YouTube Channels
+1
View File
@@ -19,6 +19,7 @@ All notable changes to this media player project.
- Added public search for published videos.
- Added configurable URL rewriting, defaulting to `/v/<slug>`, `/all`, and `/search/<query>`.
- Added a configurable homepage live section with a Videos/Live toggle and default Stream.Place embed support.
- Added `?land=live` homepage support so the live embed can be displayed first from a shareable landing URL.
- Added social sharing metadata so video pages expose title, description, and thumbnail image data for link previews.
### Changed
+50 -26
View File
@@ -20,8 +20,16 @@ if (!$video) {
if ($latest) $video = get_video_by_slug($latest['slug']);
}
$live_enabled = live_enabled();
$live_url = $live_enabled ? live_embed_url() : '';
$live_title = live_embed_title();
$requested_land = strtolower(trim(is_scalar($_GET['land'] ?? '') ? (string)$_GET['land'] : ''));
$home_live_first = $live_enabled && $requested_land === 'live';
if ($video) {
$video['view_count'] = increment_video_view_count((int)$video['id']);
$video['view_count'] = $home_live_first
? (int)($video['view_count'] ?? 0)
: increment_video_view_count((int)$video['id']);
}
$show_video_views = setting_bool('public_show_video_views', true);
@@ -33,9 +41,6 @@ $public_stats = $show_page_stats ? public_page_stats() : [
'sources' => 0,
'views' => $total_public_views,
];
$live_enabled = live_enabled();
$live_url = $live_enabled ? live_embed_url() : '';
$live_title = live_embed_title();
$per_page = (int)setting('catalogue_per_page', '10');
$page = max(1, (int)($_GET['page'] ?? 1));
@@ -55,15 +60,22 @@ foreach ($player_sources as $player_source) {
}
$site_title = setting('site_title', 'Ty Clifford');
$share_title = $video ? $video['title'] . ' — ' . $site_title : 'Media — ' . $site_title;
$share_description = $video && trim($video['description'] ?? '') !== ''
? trim($video['description'])
: setting('site_sub', 'tyclifford.com / media');
$share_url = $video ? public_absolute_url(public_video_url($video['slug'])) : public_absolute_url(public_home_url());
$share_image = ($video && !empty($video['thumbnail'])) ? public_absolute_url(public_media_url($video['thumbnail'])) : '';
if ($home_live_first) {
$share_title = $live_title . ' — ' . $site_title;
$share_description = setting('site_sub', 'tyclifford.com / media');
$share_url = public_absolute_url(media_append_query(public_home_url(), ['land' => 'live']));
$share_image = '';
} else {
$share_title = $video ? $video['title'] . ' — ' . $site_title : 'Media — ' . $site_title;
$share_description = $video && trim($video['description'] ?? '') !== ''
? trim($video['description'])
: setting('site_sub', 'tyclifford.com / media');
$share_url = $video ? public_absolute_url(public_video_url($video['slug'])) : public_absolute_url(public_home_url());
$share_image = ($video && !empty($video['thumbnail'])) ? public_absolute_url(public_media_url($video['thumbnail'])) : '';
}
$share_image_width = 0;
$share_image_height = 0;
if ($video && !empty($video['thumbnail']) && function_exists('getimagesize')) {
if (!$home_live_first && $video && !empty($video['thumbnail']) && function_exists('getimagesize')) {
$share_image_file = MEDIA_DIR . ltrim($video['thumbnail'], '/');
if (is_file($share_image_file)) {
$share_image_size = @getimagesize($share_image_file);
@@ -76,9 +88,9 @@ if ($video && !empty($video['thumbnail']) && function_exists('getimagesize')) {
$share_meta = [
'description' => $share_description,
'url' => $share_url,
'type' => $video ? 'video.other' : 'website',
'type' => ($video && !$home_live_first) ? 'video.other' : 'website',
'image' => $share_image,
'image_alt' => $video ? $video['title'] : $site_title,
'image_alt' => $home_live_first ? $live_title : ($video ? $video['title'] : $site_title),
'image_width' => $share_image_width,
'image_height' => $share_image_height,
];
@@ -304,11 +316,11 @@ render_head($share_title, '
<?php if ($live_enabled): ?>
<div class="home-mode-toggle" role="tablist" aria-label="Homepage media mode">
<button type="button" class="active" data-home-mode="videos" role="tab" aria-selected="true" aria-controls="home-video-panel">Videos</button>
<button type="button" data-home-mode="live" role="tab" aria-selected="false" aria-controls="home-live-panel">Live</button>
<button type="button" class="<?= $home_live_first ? '' : 'active' ?>" data-home-mode="videos" role="tab" aria-selected="<?= $home_live_first ? 'false' : 'true' ?>" aria-controls="home-video-panel">Videos</button>
<button type="button" class="<?= $home_live_first ? 'active' : '' ?>" data-home-mode="live" role="tab" aria-selected="<?= $home_live_first ? 'true' : 'false' ?>" aria-controls="home-live-panel">Live</button>
</div>
<section class="stream-card home-mode-panel" id="home-live-panel" aria-label="Live stream" hidden>
<section class="stream-card home-mode-panel" id="home-live-panel" aria-label="Live stream" <?= $home_live_first ? '' : 'hidden' ?>>
<div class="stream-ratio">
<iframe class="provider-embed-frame"
src="<?= h($live_url) ?>"
@@ -325,7 +337,7 @@ render_head($share_title, '
<?php endif; ?>
<!-- ═══════════════════════════ PLAYER CARD ════════════════════════════════ -->
<section class="stream-card home-mode-panel" id="home-video-panel" aria-label="Media player">
<section class="stream-card home-mode-panel" id="home-video-panel" aria-label="Media player" <?= $home_live_first ? 'hidden' : '' ?>>
<div class="stream-ratio">
<?php if ($primary_player_source && ($primary_player_source['kind'] ?? '') === 'iframe'): ?>
<iframe class="provider-embed-frame"
@@ -476,7 +488,9 @@ render_head($share_title, '
· page <?= $paged['page'] ?> of <?= $paged['total_pages'] ?>
</span>
<?php
render_pagination($paged['page'], $paged['total_pages'], public_player_page_url_pattern($video['slug'] ?? ''));
$player_page_base = ($slug !== '' && $video) ? public_video_url($video['slug']) : public_home_url();
if ($home_live_first) $player_page_base = media_append_query($player_page_base, ['land' => 'live']);
render_pagination($paged['page'], $paged['total_pages'], public_page_url_pattern($player_page_base));
?>
</div>
<?php endif; ?>
@@ -578,16 +592,26 @@ document.addEventListener('DOMContentLoaded', function() {
var modeButtons = document.querySelectorAll('[data-home-mode]');
var livePanel = document.getElementById('home-live-panel');
var videoPanel = document.getElementById('home-video-panel');
function setHomeMode(mode, updateUrl) {
modeButtons.forEach(function(other) {
var active = other.getAttribute('data-home-mode') === mode;
other.classList.toggle('active', active);
other.setAttribute('aria-selected', active ? 'true' : 'false');
});
if (livePanel) livePanel.hidden = mode !== 'live';
if (videoPanel) videoPanel.hidden = mode === 'live';
if (updateUrl && window.history && typeof window.URL !== 'undefined') {
var url = new URL(window.location.href);
if (mode === 'live') url.searchParams.set('land', 'live');
else url.searchParams.delete('land');
window.history.replaceState({}, '', url.pathname + url.search + url.hash);
}
}
modeButtons.forEach(function(btn) {
btn.addEventListener('click', function() {
var mode = btn.getAttribute('data-home-mode');
modeButtons.forEach(function(other) {
var active = other === btn;
other.classList.toggle('active', active);
other.setAttribute('aria-selected', active ? 'true' : 'false');
});
if (livePanel) livePanel.hidden = mode !== 'live';
if (videoPanel) videoPanel.hidden = mode === 'live';
setHomeMode(btn.getAttribute('data-home-mode'), true);
});
});
});