Loading app/Config/Routes.php +21 −3 Original line number Diff line number Diff line Loading @@ -326,6 +326,14 @@ $routes->group( 'filter' => 'permission:podcast_episodes-edit', ] ); $routes->get( 'embeddable-player', 'Episode::embeddablePlayer/$1/$2', [ 'as' => 'embeddable-player-add', 'filter' => 'permission:podcast_episodes-edit', ] ); $routes->group('persons', function ($routes) { $routes->get('/', 'EpisodePerson/$1/$2', [ Loading Loading @@ -565,9 +573,19 @@ $routes->group(config('App')->authGateway, function ($routes) { // Public routes $routes->group('@(:podcastName)', function ($routes) { $routes->get('/', 'Podcast/$1', ['as' => 'podcast']); $routes->get('(:slug)', 'Episode/$1/$2', [ $routes->group('(:slug)', function ($routes) { $routes->get('/', 'Episode/$1/$2', [ 'as' => 'episode', ]); $routes->group('embeddable-player', function ($routes) { $routes->get('/', 'Episode::embeddablePlayer/$1/$2', [ 'as' => 'embeddable-player', ]); $routes->get('(:slug)', 'Episode::embeddablePlayer/$1/$2/$3', [ 'as' => 'embeddable-player-theme', ]); }); }); $routes->head('feed.xml', 'Feed/$1', ['as' => 'podcast_feed']); $routes->get('feed.xml', 'Feed/$1', ['as' => 'podcast_feed']); }); Loading app/Controllers/Admin/Episode.php +17 −0 Original line number Diff line number Diff line Loading @@ -420,4 +420,21 @@ class Episode extends BaseController $this->episode->id, ]); } public function embeddablePlayer() { helper(['form']); $data = [ 'podcast' => $this->podcast, 'episode' => $this->episode, 'themes' => EpisodeModel::$themes, ]; replace_breadcrumb_params([ 0 => $this->podcast->title, 1 => $this->episode->title, ]); return view('admin/episode/embeddable_player', $data); } } app/Controllers/Admin/PodcastPlatform.php +6 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,12 @@ class PodcastPlatform extends BaseController ) ? $podcastPlatform['visible'] == 'yes' : false, 'is_on_embeddable_player' => array_key_exists( 'on_embeddable_player', $podcastPlatform ) ? $podcastPlatform['on_embeddable_player'] == 'yes' : false, ]); } } Loading app/Controllers/Analytics.php +10 −2 Original line number Diff line number Diff line Loading @@ -49,8 +49,16 @@ class Analytics extends Controller public function hit($base64EpisodeData, ...$filename) { helper('media', 'analytics'); $serviceName = isset($_GET['_from']) ? $_GET['_from'] : ''; $session = \Config\Services::session(); $session->start(); $serviceName = ''; if (isset($_GET['_from'])) { $serviceName = $_GET['_from']; } elseif (!empty($session->get('embeddable_player_domain'))) { $serviceName = $session->get('embeddable_player_domain'); } elseif ($session->get('referer') !== '- Direct -') { $serviceName = parse_url($session->get('referer'), PHP_URL_HOST); } $episodeData = unpack( 'IpodcastId/IepisodeId/IbytesThreshold/IfileSize/Iduration/IpublicationDate', Loading app/Controllers/Episode.php +62 −43 Original line number Diff line number Diff line Loading @@ -36,8 +36,9 @@ class Episode extends BaseController ) { throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); } return $this->$method(); unset($params[1]); unset($params[0]); return $this->$method(...$params); } public function index() Loading @@ -54,48 +55,12 @@ class Episode extends BaseController $this->podcast->type ); helper(['persons']); $persons = []; foreach ($this->episode->episode_persons as $episodePerson) { if (array_key_exists($episodePerson->person->id, $persons)) { $persons[$episodePerson->person->id]['roles'] .= empty($episodePerson->person_group) || empty($episodePerson->person_role) ? '' : (empty( $persons[$episodePerson->person->id][ 'roles' ] ) ? '' : ', ') . lang( 'PersonsTaxonomy.persons.' . $episodePerson->person_group . '.roles.' . $episodePerson->person_role . '.label' construct_episode_person_array( $this->episode->episode_persons, $persons ); } else { $persons[$episodePerson->person->id] = [ 'full_name' => $episodePerson->person->full_name, 'information_url' => $episodePerson->person->information_url, 'thumbnail_url' => $episodePerson->person->image->thumbnail_url, 'roles' => empty($episodePerson->person_group) || empty($episodePerson->person_role) ? '' : lang( 'PersonsTaxonomy.persons.' . $episodePerson->person_group . '.roles.' . $episodePerson->person_role . '.label' ), ]; } } $data = [ 'previousEpisode' => $previousNextEpisodes['previous'], Loading @@ -120,4 +85,58 @@ class Episode extends BaseController return $cachedView; } public function embeddablePlayer($theme = 'light-transparent') { self::triggerWebpageHit($this->episode->podcast_id); $session = \Config\Services::session(); $session->start(); if (isset($_SERVER['HTTP_REFERER'])) { $session->set( 'embeddable_player_domain', parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST) ); } $locale = service('request')->getLocale(); $cacheName = "page_podcast{$this->episode->podcast_id}_episode{$this->episode->id}_embeddable_player_{$theme}_{$locale}"; if (!($cachedView = cache($cacheName))) { $episodeModel = new EpisodeModel(); $theme = EpisodeModel::$themes[$theme]; helper(['persons']); $persons = []; construct_episode_person_array( $this->episode->episode_persons, $persons ); constructs_podcast_person_array( $this->podcast->podcast_persons, $persons ); $data = [ 'podcast' => $this->podcast, 'episode' => $this->episode, 'persons' => $persons, 'theme' => $theme, ]; $secondsToNextUnpublishedEpisode = $episodeModel->getSecondsToNextUnpublishedEpisode( $this->podcast->id ); // The page cache is set to a decade so it is deleted manually upon podcast update return view('embeddable_player', $data, [ 'cache' => $secondsToNextUnpublishedEpisode ? $secondsToNextUnpublishedEpisode : DECADE, 'cache_name' => $cacheName, ]); } return $cachedView; } } Loading
app/Config/Routes.php +21 −3 Original line number Diff line number Diff line Loading @@ -326,6 +326,14 @@ $routes->group( 'filter' => 'permission:podcast_episodes-edit', ] ); $routes->get( 'embeddable-player', 'Episode::embeddablePlayer/$1/$2', [ 'as' => 'embeddable-player-add', 'filter' => 'permission:podcast_episodes-edit', ] ); $routes->group('persons', function ($routes) { $routes->get('/', 'EpisodePerson/$1/$2', [ Loading Loading @@ -565,9 +573,19 @@ $routes->group(config('App')->authGateway, function ($routes) { // Public routes $routes->group('@(:podcastName)', function ($routes) { $routes->get('/', 'Podcast/$1', ['as' => 'podcast']); $routes->get('(:slug)', 'Episode/$1/$2', [ $routes->group('(:slug)', function ($routes) { $routes->get('/', 'Episode/$1/$2', [ 'as' => 'episode', ]); $routes->group('embeddable-player', function ($routes) { $routes->get('/', 'Episode::embeddablePlayer/$1/$2', [ 'as' => 'embeddable-player', ]); $routes->get('(:slug)', 'Episode::embeddablePlayer/$1/$2/$3', [ 'as' => 'embeddable-player-theme', ]); }); }); $routes->head('feed.xml', 'Feed/$1', ['as' => 'podcast_feed']); $routes->get('feed.xml', 'Feed/$1', ['as' => 'podcast_feed']); }); Loading
app/Controllers/Admin/Episode.php +17 −0 Original line number Diff line number Diff line Loading @@ -420,4 +420,21 @@ class Episode extends BaseController $this->episode->id, ]); } public function embeddablePlayer() { helper(['form']); $data = [ 'podcast' => $this->podcast, 'episode' => $this->episode, 'themes' => EpisodeModel::$themes, ]; replace_breadcrumb_params([ 0 => $this->podcast->title, 1 => $this->episode->title, ]); return view('admin/episode/embeddable_player', $data); } }
app/Controllers/Admin/PodcastPlatform.php +6 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,12 @@ class PodcastPlatform extends BaseController ) ? $podcastPlatform['visible'] == 'yes' : false, 'is_on_embeddable_player' => array_key_exists( 'on_embeddable_player', $podcastPlatform ) ? $podcastPlatform['on_embeddable_player'] == 'yes' : false, ]); } } Loading
app/Controllers/Analytics.php +10 −2 Original line number Diff line number Diff line Loading @@ -49,8 +49,16 @@ class Analytics extends Controller public function hit($base64EpisodeData, ...$filename) { helper('media', 'analytics'); $serviceName = isset($_GET['_from']) ? $_GET['_from'] : ''; $session = \Config\Services::session(); $session->start(); $serviceName = ''; if (isset($_GET['_from'])) { $serviceName = $_GET['_from']; } elseif (!empty($session->get('embeddable_player_domain'))) { $serviceName = $session->get('embeddable_player_domain'); } elseif ($session->get('referer') !== '- Direct -') { $serviceName = parse_url($session->get('referer'), PHP_URL_HOST); } $episodeData = unpack( 'IpodcastId/IepisodeId/IbytesThreshold/IfileSize/Iduration/IpublicationDate', Loading
app/Controllers/Episode.php +62 −43 Original line number Diff line number Diff line Loading @@ -36,8 +36,9 @@ class Episode extends BaseController ) { throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound(); } return $this->$method(); unset($params[1]); unset($params[0]); return $this->$method(...$params); } public function index() Loading @@ -54,48 +55,12 @@ class Episode extends BaseController $this->podcast->type ); helper(['persons']); $persons = []; foreach ($this->episode->episode_persons as $episodePerson) { if (array_key_exists($episodePerson->person->id, $persons)) { $persons[$episodePerson->person->id]['roles'] .= empty($episodePerson->person_group) || empty($episodePerson->person_role) ? '' : (empty( $persons[$episodePerson->person->id][ 'roles' ] ) ? '' : ', ') . lang( 'PersonsTaxonomy.persons.' . $episodePerson->person_group . '.roles.' . $episodePerson->person_role . '.label' construct_episode_person_array( $this->episode->episode_persons, $persons ); } else { $persons[$episodePerson->person->id] = [ 'full_name' => $episodePerson->person->full_name, 'information_url' => $episodePerson->person->information_url, 'thumbnail_url' => $episodePerson->person->image->thumbnail_url, 'roles' => empty($episodePerson->person_group) || empty($episodePerson->person_role) ? '' : lang( 'PersonsTaxonomy.persons.' . $episodePerson->person_group . '.roles.' . $episodePerson->person_role . '.label' ), ]; } } $data = [ 'previousEpisode' => $previousNextEpisodes['previous'], Loading @@ -120,4 +85,58 @@ class Episode extends BaseController return $cachedView; } public function embeddablePlayer($theme = 'light-transparent') { self::triggerWebpageHit($this->episode->podcast_id); $session = \Config\Services::session(); $session->start(); if (isset($_SERVER['HTTP_REFERER'])) { $session->set( 'embeddable_player_domain', parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST) ); } $locale = service('request')->getLocale(); $cacheName = "page_podcast{$this->episode->podcast_id}_episode{$this->episode->id}_embeddable_player_{$theme}_{$locale}"; if (!($cachedView = cache($cacheName))) { $episodeModel = new EpisodeModel(); $theme = EpisodeModel::$themes[$theme]; helper(['persons']); $persons = []; construct_episode_person_array( $this->episode->episode_persons, $persons ); constructs_podcast_person_array( $this->podcast->podcast_persons, $persons ); $data = [ 'podcast' => $this->podcast, 'episode' => $this->episode, 'persons' => $persons, 'theme' => $theme, ]; $secondsToNextUnpublishedEpisode = $episodeModel->getSecondsToNextUnpublishedEpisode( $this->podcast->id ); // The page cache is set to a decade so it is deleted manually upon podcast update return view('embeddable_player', $data, [ 'cache' => $secondsToNextUnpublishedEpisode ? $secondsToNextUnpublishedEpisode : DECADE, 'cache_name' => $cacheName, ]); } return $cachedView; } }