Commit 141788fa authored by Benjamin Bellamy's avatar Benjamin Bellamy 💬
Browse files

feat(embeddable-player): add embeddable player widget

parent 526809ef
Loading
Loading
Loading
Loading
Loading
+21 −3
Original line number Diff line number Diff line
@@ -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', [
@@ -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']);
});
+17 −0
Original line number Diff line number Diff line
@@ -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);
    }
}
+6 −0
Original line number Diff line number Diff line
@@ -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,
                ]);
            }
        }
+10 −2
Original line number Diff line number Diff line
@@ -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',
+62 −43
Original line number Diff line number Diff line
@@ -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()
@@ -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'],
@@ -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