fix(op3): move op3 prefix to enclosure url instead of audio proxy

This commit is contained in:
Yassine Doghri 2024-02-12 16:55:09 +00:00
parent 94ceba6081
commit d580369235
4 changed files with 40 additions and 30 deletions

View File

@ -20,6 +20,7 @@ use CodeIgniter\HTTP\IncomingRequest;
use CodeIgniter\HTTP\RedirectResponse; use CodeIgniter\HTTP\RedirectResponse;
use CodeIgniter\HTTP\RequestInterface; use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface; use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\HTTP\URI;
use Config\Services; use Config\Services;
use Modules\Analytics\Config\Analytics; use Modules\Analytics\Config\Analytics;
use Modules\PremiumPodcasts\Entities\Subscription; use Modules\PremiumPodcasts\Entities\Subscription;
@ -166,6 +167,18 @@ class EpisodeAudioController extends Controller
$subscription instanceof Subscription ? $subscription->id : null $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);
} }
} }

View File

@ -21,6 +21,7 @@ use App\Models\PostModel;
use CodeIgniter\Entity\Entity; use CodeIgniter\Entity\Entity;
use CodeIgniter\Files\File; use CodeIgniter\Files\File;
use CodeIgniter\HTTP\Files\UploadedFile; use CodeIgniter\HTTP\Files\UploadedFile;
use CodeIgniter\HTTP\URI;
use CodeIgniter\I18n\Time; use CodeIgniter\I18n\Time;
use Config\Images; use Config\Images;
use Exception; use Exception;
@ -30,6 +31,7 @@ use League\CommonMark\Extension\CommonMark\CommonMarkCoreExtension;
use League\CommonMark\Extension\DisallowedRawHtml\DisallowedRawHtmlExtension; use League\CommonMark\Extension\DisallowedRawHtml\DisallowedRawHtmlExtension;
use League\CommonMark\Extension\SmartPunct\SmartPunctExtension; use League\CommonMark\Extension\SmartPunct\SmartPunctExtension;
use League\CommonMark\MarkdownConverter; use League\CommonMark\MarkdownConverter;
use Modules\Analytics\OP3;
use Modules\Media\Entities\Audio; use Modules\Media\Entities\Audio;
use Modules\Media\Entities\Chapters; use Modules\Media\Entities\Chapters;
use Modules\Media\Entities\Image; use Modules\Media\Entities\Image;
@ -344,7 +346,26 @@ class Episode extends Entity
public function getAudioUrl(): string 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 public function getAudioWebUrl(): string

View File

@ -4,10 +4,7 @@ declare(strict_types=1);
namespace Modules\Analytics\Config; namespace Modules\Analytics\Config;
use App\Entities\Episode;
use CodeIgniter\Config\BaseConfig; use CodeIgniter\Config\BaseConfig;
use CodeIgniter\HTTP\URI;
use Modules\Analytics\OP3;
class Analytics extends BaseConfig class Analytics extends BaseConfig
{ {
@ -53,24 +50,4 @@ class Analytics extends BaseConfig
]; ];
public bool $enableOP3 = false; 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;
}
} }

View File

@ -11,7 +11,6 @@ declare(strict_types=1);
namespace Modules\Analytics; namespace Modules\Analytics;
use App\Entities\Episode; use App\Entities\Episode;
use CodeIgniter\HTTP\URI;
class OP3 class OP3
{ {
@ -25,11 +24,11 @@ class OP3
$this->host = rtrim($config['host'], '/'); $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 // remove scheme from audioURI if https
$audioURI->setScheme(''); $audioURIWithoutHTTPS = preg_replace('(^https://)', '', $audioURL);
return $this->host . '/e,pg=' . $episode->podcast->guid . '/' . $audioURI; return $this->host . '/e,pg=' . $episode->podcast->guid . '/' . $audioURIWithoutHTTPS;
} }
} }