Compare commits

...

8 Commits

Author SHA1 Message Date
Brock H Caldwell
ed69ed61b8 fix: sentry release 2025-11-09 10:08:41 -06:00
Brock H Caldwell
9c8e625316 fix(Sentry): uses correct version parameter 2025-11-09 10:00:46 -06:00
Brock H Caldwell
ef6ed20a0b fix: adds sentry release 2025-11-09 09:53:21 -06:00
Brock H Caldwell
da0eab652b test(Sentry): enables logs 2025-11-08 23:14:30 -06:00
Brock H Caldwell
17de41dc57 fix(Calendar): null attachment 2025-11-08 22:23:49 -06:00
Brock H Caldwell
d2eaccaf93 test: removes sentry release config 2025-11-08 18:44:00 -06:00
Brock H Caldwell
37e13347b2 feat(Download): adds streaming and local download options 2025-11-08 16:26:38 -06:00
Brock H Caldwell
7dd40b4525 feat: makes sentry more configurable 2025-11-08 14:38:55 -06:00
16 changed files with 101 additions and 16 deletions

1
.env
View File

@@ -61,6 +61,7 @@ NTFY_DSN=
###> sentry/sentry-symfony ###
SENTRY_DSN=
SENTRY_JS_URL=
###< sentry/sentry-symfony ###
# TMDB 'with_original_language' option

View File

@@ -0,0 +1 @@
<svg xmlns="https://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill="currentColor" fill-rule="evenodd" d="M0 5a2 2 0 0 1 2-2h7.5a2 2 0 0 1 1.983 1.738l3.11-1.382A1 1 0 0 1 16 4.269v7.462a1 1 0 0 1-1.406.913l-3.111-1.382A2 2 0 0 1 9.5 13H2a2 2 0 0 1-2-2zm11.5 5.175l3.5 1.556V4.269l-3.5 1.556zM2 4a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h7.5a1 1 0 0 0 1-1V5a1 1 0 0 0-1-1z"/></svg>

After

Width:  |  Height:  |  Size: 374 B

View File

@@ -0,0 +1 @@
<svg xmlns="https://www.w3.org/2000/svg" viewBox="0 0 16 16"><g fill="currentColor"><path d="M4.406 1.342A5.53 5.53 0 0 1 8 0c2.69 0 4.923 2 5.166 4.579C14.758 4.804 16 6.137 16 7.773C16 9.569 14.502 11 12.687 11H10a.5.5 0 0 1 0-1h2.688C13.979 10 15 8.988 15 7.773c0-1.216-1.02-2.228-2.313-2.228h-.5v-.5C12.188 2.825 10.328 1 8 1a4.53 4.53 0 0 0-2.941 1.1c-.757.652-1.153 1.438-1.153 2.055v.448l-.445.049C2.064 4.805 1 5.952 1 7.318C1 8.785 2.23 10 3.781 10H6a.5.5 0 0 1 0 1H3.781C1.708 11 0 9.366 0 7.318c0-1.763 1.266-3.223 2.942-3.593c.143-.863.698-1.723 1.464-2.383"/><path d="M7.646 15.854a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 14.293V5.5a.5.5 0 0 0-1 0v8.793l-2.146-2.147a.5.5 0 0 0-.708.708z"/></g></svg>

After

Width:  |  Height:  |  Size: 720 B

View File

@@ -0,0 +1 @@
<svg xmlns="https://www.w3.org/2000/svg" viewBox="0 0 16 16"><g fill="currentColor"><path d="M.5 9.9a.5.5 0 0 1 .5.5v2.5a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-2.5a.5.5 0 0 1 1 0v2.5a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2v-2.5a.5.5 0 0 1 .5-.5"/><path d="M7.646 11.854a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V1.5a.5.5 0 0 0-1 0v8.793L5.354 8.146a.5.5 0 1 0-.708.708z"/></g></svg>

After

Width:  |  Height:  |  Size: 377 B

View File

@@ -4,19 +4,20 @@ when@prod:
register_error_handler: true # Disables the ErrorListener, ExceptionListener and FatalErrorListener integrations of the base PHP SDK
options:
release: '%app.version%'
traces_sample_rate: 0
profiles_sample_rate: 0
release: 'torsearch@%app.version%'
enable_logs: true
traces_sample_rate: 1
profiles_sample_rate: 1
attach_stacktrace: true
# tracing:
# enabled: true
# dbal: # DB queries
# enabled: true
# cache: # cache pools
# enabled: true
# twig: # templating engine
# enabled: true
tracing:
enabled: true
dbal: # DB queries
enabled: true
cache: # cache pools
enabled: true
twig: # templating engine
enabled: true
services:
# (Optionally) Configure the breadcrumb handler as a service (needed for the breadcrumb Monolog handler)

View File

@@ -1,6 +1,7 @@
twig:
globals:
version: '%app.version%'
sentry_javascript_url: '%sentry.javascript_url%'
file_name_pattern: '*.twig'
date:
format: 'm/d/Y'

View File

@@ -48,6 +48,10 @@ parameters:
notification.transport: '%env(NOTIFICATION_TRANSPORT)%'
notification.ntfy.dsn: '%env(NTFY_DSN)%'
# Sentry
sentry.dsn: '%env(SENTRY_DSN)%'
sentry.javascript_url: '%env(SENTRY_JS_URL)%'
services:
# default configuration for services in *this* file
_defaults:

View File

@@ -53,6 +53,15 @@ final class ConfigResolver
#[Autowire(param: 'notification.ntfy.dsn')]
private ?string $notificationNtfyDsn = null,
#[Autowire(param: 'sentry.dsn')]
private ?string $sentryDsn = null,
#[Autowire(param: 'sentry.environment')]
private ?string $sentryEnvironment = null,
#[Autowire(param: 'sentry.javascript_url')]
private ?string $sentryJavascriptUrl = null,
) {}
public function validate(): bool
@@ -120,4 +129,13 @@ final class ConfigResolver
]
];
}
public function getSentryConfig()
{
return [
'dsn' => $this->sentryDsn,
'environment' => $this->sentryEnvironment,
'javascript_url' => $this->sentryJavascriptUrl,
];
}
}

View File

@@ -29,10 +29,13 @@ class CalendarController extends AbstractController
$monitors = $monitorRepository->whereAirDateNotNull();
$calendar->event(Map::from($monitors)->map(function (Monitor $monitor) {
return new Event($monitor->getTitle())
$event = new Event($monitor->getTitle())
->startsAt($monitor->getAirDate())
->attachment($monitor->getPoster())
->fullDay();
if (null !== $monitor->getPoster()) {
$event->attachment($monitor->getPoster());
}
return $event;
})->toArray());
return new Response($calendar->get(), 200, [

View File

@@ -68,4 +68,10 @@ class Torrentio
return $results;
}
public function getDestinationUrl(string $url)
{
$request = get_headers($url)[8];
return explode(' ', $request)[1];
}
}

View File

@@ -7,6 +7,7 @@ use App\Torrentio\Action\Handler\GetMovieOptionsHandler;
use App\Torrentio\Action\Handler\GetTvShowOptionsHandler;
use App\Torrentio\Action\Input\GetMovieOptionsInput;
use App\Torrentio\Action\Input\GetTvShowOptionsInput;
use App\Torrentio\Client\Torrentio;
use App\Torrentio\Exception\TorrentioRateLimitException;
use Carbon\Carbon;
use OneToMany\RichBundle\Contract\ResultInterface;
@@ -21,6 +22,8 @@ use Symfony\UX\Turbo\TurboBundle;
final class WebController extends AbstractController
{
const REAL_DEBRID_STREAM_URL = 'https://real-debrid.com/streaming-%s';
public function __construct(
private readonly GetMovieOptionsHandler $getMovieOptionsHandler,
private readonly GetTvShowOptionsHandler $getTvShowOptionsHandler,
@@ -99,4 +102,14 @@ final class WebController extends AbstractController
]
);
}
#[Route('/torrentio/stream/{url}', name: 'app.torrentio.stream')]
public function streamVideo(string $url, Torrentio $torrentio): Response
{
$destinationUrl = $torrentio->getDestinationUrl(\base64_decode($url));
$urlPathParts = explode('/', parse_url($destinationUrl)['path']);
$videoId = $urlPathParts[2];
$url = sprintf(self::REAL_DEBRID_STREAM_URL, $videoId);
return $this->redirect($url);
}
}

View File

@@ -112,4 +112,18 @@ class UtilExtension
return new EpisodeIdDto($season, $episode);
}
#[AsTwigFunction('sentry_enabled')]
public function sentryEnabled(): bool
{
$sentryConfig = $this->config->getSentryConfig();
return $sentryConfig['javascript_url'] !== null &&
$sentryConfig['javascript_url'] !== '';
}
#[AsTwigFilter('base64_encode')]
public function base64_encode(string $data): string
{
return \base64_encode($data);
}
}

View File

@@ -12,6 +12,7 @@
{% block javascripts %}
{% block importmap %}{{ importmap('app') }}{% endblock %}
<script src="https://bugs.caldwell.digital/js-sdk-loader/8dddf7fb26fbec602ad212173a942450.min.js" crossorigin="anonymous"></script>
{% endblock %}
</head>
<body class="bg-cyan-950 flex flex-col h-full">

View File

@@ -12,6 +12,10 @@
{% block javascripts %}
{% block importmap %}{{ importmap('app') }}{% endblock %}
{% if sentry_enabled() %}
<script src="{{ sentry_javascript_url }}" crossorigin="anonymous"></script>
{% endif %}
<script src='https://cdn.jsdelivr.net/npm/fullcalendar@6.1.19/index.global.min.js'></script>
{% endblock %}
</head>

View File

@@ -86,9 +86,18 @@
{{ result.languageFlags|raw }}
</td>
<td class="px-4 py-4 whitespace-nowrap text-sm text-end text-gray-800 dark:text-gray-50 flex flex-row gap-2 items-center justify-start mb:justify-end">
<button class="download-btn p-1.5 bg-green-600 rounded-md text-gray-50">
Download
</button>
<a href="{{ url('app.torrentio.stream', {url: result.url|base64_encode}) }}" title="Stream in your browser." class="p-1.5 bg-blue-600 rounded-md text-gray-50">
<twig:ux:icon name="bi:camera-video" width="20"/>
</a>
<button class="download-btn p-1.5 bg-green-600 rounded-md text-gray-50" title="Download to your mounted directory.">
<twig:ux:icon name="bi:cloud-download" width="20" />
</button>
<a href="{{ result.url }}" title="Download to your local device." class="p-1.5 bg-orange-500 rounded-md text-gray-50">
<twig:ux:icon name="bi:download" width="20" />
</a>
<label for="select">
<input id="select" type="checkbox" name="select" />
</label>

View File

@@ -0,0 +1,7 @@
{% extends 'base.html.twig' %}
{% block title %}Streaming &mdash; Torrentio{% endblock %}
{% block body %}
<iframe width="100%" height="100%" src="{{ stream_url }}"></iframe>
{% endblock %}