From d5803692357952d82d54efd8d3aa71de3a1c9571 Mon Sep 17 00:00:00 2001 From: Yassine Doghri Date: Mon, 12 Feb 2024 16:55:09 +0000 Subject: [PATCH] fix(op3): move op3 prefix to enclosure url instead of audio proxy --- app/Controllers/EpisodeAudioController.php | 15 +++++++++++++- app/Entities/Episode.php | 23 +++++++++++++++++++++- modules/Analytics/Config/Analytics.php | 23 ---------------------- modules/Analytics/OP3.php | 9 ++++----- 4 files changed, 40 insertions(+), 30 deletions(-) diff --git a/app/Controllers/EpisodeAudioController.php b/app/Controllers/EpisodeAudioController.php index fbf66d76..c1bdbcd8 100644 --- a/app/Controllers/EpisodeAudioController.php +++ b/app/Controllers/EpisodeAudioController.php @@ -20,6 +20,7 @@ use CodeIgniter\HTTP\IncomingRequest; use CodeIgniter\HTTP\RedirectResponse; use CodeIgniter\HTTP\RequestInterface; use CodeIgniter\HTTP\ResponseInterface; +use CodeIgniter\HTTP\URI; use Config\Services; use Modules\Analytics\Config\Analytics; use Modules\PremiumPodcasts\Entities\Subscription; @@ -166,6 +167,18 @@ class EpisodeAudioController extends Controller $subscription instanceof Subscription ? $subscription->id : null ); - return redirect()->to($this->analyticsConfig->getAudioUrl($this->episode, $this->request->getGet())); + $audioFileURI = new URI(service('file_manager')->getUrl($this->episode->audio->file_key)); + + $queryParams = []; + foreach ($this->request->getGet() as $key => $value) { + // do not include token in query params + if ($key !== 'token') { + $queryParams[$key] = $value; + } + } + + $audioFileURI->setQueryArray($queryParams); + + return redirect()->to((string) $audioFileURI); } } diff --git a/app/Entities/Episode.php b/app/Entities/Episode.php index 3fc08e5f..357b4748 100644 --- a/app/Entities/Episode.php +++ b/app/Entities/Episode.php @@ -21,6 +21,7 @@ use App\Models\PostModel; use CodeIgniter\Entity\Entity; use CodeIgniter\Files\File; use CodeIgniter\HTTP\Files\UploadedFile; +use CodeIgniter\HTTP\URI; use CodeIgniter\I18n\Time; use Config\Images; use Exception; @@ -30,6 +31,7 @@ use League\CommonMark\Extension\CommonMark\CommonMarkCoreExtension; use League\CommonMark\Extension\DisallowedRawHtml\DisallowedRawHtmlExtension; use League\CommonMark\Extension\SmartPunct\SmartPunctExtension; use League\CommonMark\MarkdownConverter; +use Modules\Analytics\OP3; use Modules\Media\Entities\Audio; use Modules\Media\Entities\Chapters; use Modules\Media\Entities\Image; @@ -344,7 +346,26 @@ class Episode extends Entity public function getAudioUrl(): string { - return url_to('episode-audio', $this->getPodcast()->handle, $this->slug, $this->getAudio()->file_extension); + $audioURL = url_to( + 'episode-audio', + $this->getPodcast() +->handle, + $this->slug, + $this->getAudio() +->file_extension + ); + + // Wrap episode url with OP3 if episode is public and OP3 is enabled on this podcast + if (! $this->is_premium && service('settings')->get( + 'Analytics.enableOP3', + 'podcast:' . $this->podcast_id + )) { + $op3 = new OP3(config('Analytics')->OP3); + + return $op3->wrap($audioURL, $this); + } + + return $audioURL; } public function getAudioWebUrl(): string diff --git a/modules/Analytics/Config/Analytics.php b/modules/Analytics/Config/Analytics.php index 85adf7ff..8eca95d3 100644 --- a/modules/Analytics/Config/Analytics.php +++ b/modules/Analytics/Config/Analytics.php @@ -4,10 +4,7 @@ declare(strict_types=1); namespace Modules\Analytics\Config; -use App\Entities\Episode; use CodeIgniter\Config\BaseConfig; -use CodeIgniter\HTTP\URI; -use Modules\Analytics\OP3; class Analytics extends BaseConfig { @@ -53,24 +50,4 @@ class Analytics extends BaseConfig ]; public bool $enableOP3 = false; - - /** - * get the full audio file url - */ - public function getAudioUrl(Episode $episode, array $params): string - { - $audioFileURI = new URI(service('file_manager')->getUrl($episode->audio->file_key)); - $audioFileURI->setQueryArray($params); - - // Wrap episode url with OP3 if episode is public and OP3 is enabled on this podcast - if (! $episode->is_premium && service('settings')->get( - 'Analytics.enableOP3', - 'podcast:' . $episode->podcast_id - )) { - $op3 = new OP3($this->OP3); - $audioFileURI = new URI($op3->wrap($audioFileURI, $episode)); - } - - return (string) $audioFileURI; - } } diff --git a/modules/Analytics/OP3.php b/modules/Analytics/OP3.php index e3082e2c..76eaa6e0 100644 --- a/modules/Analytics/OP3.php +++ b/modules/Analytics/OP3.php @@ -11,7 +11,6 @@ declare(strict_types=1); namespace Modules\Analytics; use App\Entities\Episode; -use CodeIgniter\HTTP\URI; class OP3 { @@ -25,11 +24,11 @@ class OP3 $this->host = rtrim($config['host'], '/'); } - public function wrap(URI $audioURI, Episode $episode): string + public function wrap(string $audioURL, Episode $episode): string { - // remove scheme from audioURI - $audioURI->setScheme(''); + // remove scheme from audioURI if https + $audioURIWithoutHTTPS = preg_replace('(^https://)', '', $audioURL); - return $this->host . '/e,pg=' . $episode->podcast->guid . '/' . $audioURI; + return $this->host . '/e,pg=' . $episode->podcast->guid . '/' . $audioURIWithoutHTTPS; } }