Compare commits
5 Commits
v0.24.4
...
dev-turbo-
| Author | SHA1 | Date | |
|---|---|---|---|
| c09c7ad030 | |||
| f610297294 | |||
| f2971eee9c | |||
| 47108af1f8 | |||
| f7163b5e00 |
@@ -24,23 +24,15 @@ export default class extends Controller {
|
|||||||
|
|
||||||
async connect() {
|
async connect() {
|
||||||
this.resultCountEl = document.querySelector('#movie_results_count');
|
this.resultCountEl = document.querySelector('#movie_results_count');
|
||||||
await this.setOptions();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async setOptions() {
|
async listTargetConnected() {
|
||||||
if (false === this.optionsLoaded) {
|
|
||||||
this.optionsLoaded = true;
|
this.optionsLoaded = true;
|
||||||
await fetch(`/torrentio/movies/${this.tmdbIdValue}/${this.imdbIdValue}`)
|
|
||||||
.then(res => res.text())
|
|
||||||
.then(response => {
|
|
||||||
this.element.innerHTML = response;
|
|
||||||
this.options = this.element.querySelectorAll('tbody tr');
|
this.options = this.element.querySelectorAll('tbody tr');
|
||||||
this.options.forEach((option) => option.querySelector('.download-btn').dataset['title'] = this.titleValue);
|
this.options.forEach((option) => option.querySelector('.download-btn').dataset['title'] = this.titleValue);
|
||||||
this.dispatch('optionsLoaded', {detail: {options: this.options}})
|
this.dispatch('optionsLoaded', {detail: {options: this.options}})
|
||||||
this.loadingIconOutlet.toggleIcon();
|
this.loadingIconOutlet.toggleIcon();
|
||||||
this.resultCountEl.innerText = this.options.length;
|
this.resultCountEl.innerText = this.options.length;
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Keeps compatible with Filter & TV Shows
|
// Keeps compatible with Filter & TV Shows
|
||||||
|
|||||||
@@ -25,37 +25,18 @@ export default class extends Controller {
|
|||||||
optionsLoaded = false
|
optionsLoaded = false
|
||||||
isOpen = false
|
isOpen = false
|
||||||
|
|
||||||
async connect() {
|
async listTargetConnected() {
|
||||||
await this.setOptions();
|
|
||||||
}
|
|
||||||
|
|
||||||
async setOptions() {
|
|
||||||
if (this.optionsLoaded === false) {
|
|
||||||
this.optionsLoaded = true;
|
|
||||||
let response;
|
|
||||||
|
|
||||||
try {
|
|
||||||
response = await fetch(`/torrentio/tvshows/${this.tmdbIdValue}/${this.imdbIdValue}/${this.seasonValue}/${this.episodeValue}`)
|
|
||||||
} catch (error) {
|
|
||||||
console.log('There was an error', error);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (response?.ok) {
|
|
||||||
response = await response.text()
|
|
||||||
this.listContainerTarget.innerHTML = response;
|
|
||||||
this.options = this.element.querySelectorAll('tbody tr');
|
this.options = this.element.querySelectorAll('tbody tr');
|
||||||
if (this.options.length > 0) {
|
if (this.options.length > 0) {
|
||||||
this.options.forEach((option) => option.querySelector('.download-btn').dataset['title'] = this.titleValue);
|
this.options.forEach((option) =>
|
||||||
|
option.querySelector('.download-btn').dataset['title'] = this.titleValue
|
||||||
|
);
|
||||||
this.options[0].querySelector('input[type="checkbox"]').checked = true;
|
this.options[0].querySelector('input[type="checkbox"]').checked = true;
|
||||||
} else {
|
|
||||||
this.countTarget.innerText = 0;
|
|
||||||
this.episodeSelectorTarget.disabled = true;
|
|
||||||
}
|
|
||||||
this.dispatch('optionsLoaded', {detail: {options: this.options}})
|
this.dispatch('optionsLoaded', {detail: {options: this.options}})
|
||||||
this.loadingIconOutlet.increaseCount();
|
this.loadingIconOutlet.increaseCount();
|
||||||
} else {
|
} else {
|
||||||
console.log(`HTTP Response Code: ${response?.status}`)
|
this.countTarget.innerText = 0;
|
||||||
}
|
this.episodeSelectorTarget.disabled = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -134,6 +115,7 @@ export default class extends Controller {
|
|||||||
"codec": option.querySelector('#codec').textContent.trim(),
|
"codec": option.querySelector('#codec').textContent.trim(),
|
||||||
"provider": option.querySelector('#provider').textContent.trim(),
|
"provider": option.querySelector('#provider').textContent.trim(),
|
||||||
"languages": JSON.parse(option.dataset['languages']),
|
"languages": JSON.parse(option.dataset['languages']),
|
||||||
|
"quality": option.dataset['quality'],
|
||||||
}
|
}
|
||||||
|
|
||||||
let include = true;
|
let include = true;
|
||||||
|
|||||||
@@ -9,12 +9,14 @@ use App\Torrentio\Action\Input\GetMovieOptionsInput;
|
|||||||
use App\Torrentio\Action\Input\GetTvShowOptionsInput;
|
use App\Torrentio\Action\Input\GetTvShowOptionsInput;
|
||||||
use App\Torrentio\Exception\TorrentioRateLimitException;
|
use App\Torrentio\Exception\TorrentioRateLimitException;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
|
use OneToMany\RichBundle\Contract\ResultInterface;
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
use Symfony\Component\HttpFoundation\Response;
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
use Symfony\Component\Routing\Attribute\Route;
|
use Symfony\Component\Routing\Attribute\Route;
|
||||||
use Symfony\Contracts\Cache\CacheInterface;
|
use Symfony\Contracts\Cache\CacheInterface;
|
||||||
use Symfony\Contracts\Cache\ItemInterface;
|
use Symfony\Contracts\Cache\ItemInterface;
|
||||||
|
use Symfony\UX\Turbo\TurboBundle;
|
||||||
|
|
||||||
final class WebController extends AbstractController
|
final class WebController extends AbstractController
|
||||||
{
|
{
|
||||||
@@ -25,7 +27,7 @@ final class WebController extends AbstractController
|
|||||||
) {}
|
) {}
|
||||||
|
|
||||||
#[Route('/torrentio/movies/{tmdbId}/{imdbId}', name: 'app_torrentio_movies')]
|
#[Route('/torrentio/movies/{tmdbId}/{imdbId}', name: 'app_torrentio_movies')]
|
||||||
public function movieOptions(GetMovieOptionsInput $input, CacheInterface $cache): Response
|
public function movieOptions(GetMovieOptionsInput $input, CacheInterface $cache, Request $request): Response
|
||||||
{
|
{
|
||||||
$cacheId = sprintf(
|
$cacheId = sprintf(
|
||||||
"page.torrentio.movies.%s.%s",
|
"page.torrentio.movies.%s.%s",
|
||||||
@@ -33,9 +35,14 @@ final class WebController extends AbstractController
|
|||||||
$input->imdbId
|
$input->imdbId
|
||||||
);
|
);
|
||||||
|
|
||||||
return $cache->get($cacheId, function (ItemInterface $item) use ($input) {
|
return $cache->get($cacheId, function (ItemInterface $item) use ($input, $request) {
|
||||||
$item->expiresAt(Carbon::now()->addHour()->setMinute(0)->setSecond(0));
|
$item->expiresAt(Carbon::now()->addHour()->setMinute(0)->setSecond(0));
|
||||||
$results = $this->getMovieOptionsHandler->handle($input->toCommand());
|
$results = $this->getMovieOptionsHandler->handle($input->toCommand());
|
||||||
|
|
||||||
|
if ($request->headers->get('Turbo-Frame')) {
|
||||||
|
return $this->sendFragmentResponse($results, $request);
|
||||||
|
}
|
||||||
|
|
||||||
return $this->render('torrentio/movies.html.twig', [
|
return $this->render('torrentio/movies.html.twig', [
|
||||||
'results' => $results,
|
'results' => $results,
|
||||||
]);
|
]);
|
||||||
@@ -43,7 +50,7 @@ final class WebController extends AbstractController
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/torrentio/tvshows/{tmdbId}/{imdbId}/{season?}/{episode?}', name: 'app_torrentio_tvshows')]
|
#[Route('/torrentio/tvshows/{tmdbId}/{imdbId}/{season?}/{episode?}', name: 'app_torrentio_tvshows')]
|
||||||
public function tvShowOptions(GetTvShowOptionsInput $input, CacheInterface $cache): Response
|
public function tvShowOptions(GetTvShowOptionsInput $input, CacheInterface $cache, Request $request): Response
|
||||||
{
|
{
|
||||||
$cacheId = sprintf(
|
$cacheId = sprintf(
|
||||||
"page.torrentio.tvshows.%s.%s.%s.%s",
|
"page.torrentio.tvshows.%s.%s.%s.%s",
|
||||||
@@ -54,13 +61,18 @@ final class WebController extends AbstractController
|
|||||||
);
|
);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// return $cache->get($cacheId, function (ItemInterface $item) use ($input) {
|
return $cache->get($cacheId, function (ItemInterface $item) use ($input, $request) {
|
||||||
// $item->expiresAt(Carbon::now()->addHour()->setMinute(0)->setSecond(0));
|
$item->expiresAt(Carbon::now()->addHour()->setMinute(0)->setSecond(0));
|
||||||
$results = $this->getTvShowOptionsHandler->handle($input->toCommand());
|
$results = $this->getTvShowOptionsHandler->handle($input->toCommand());
|
||||||
|
|
||||||
|
if ($request->headers->get('Turbo-Frame')) {
|
||||||
|
return $this->sendFragmentResponse($results, $request);
|
||||||
|
}
|
||||||
|
|
||||||
return $this->render('torrentio/tvshows.html.twig', [
|
return $this->render('torrentio/tvshows.html.twig', [
|
||||||
'results' => $results,
|
'results' => $results,
|
||||||
]);
|
]);
|
||||||
// });
|
});
|
||||||
} catch (TorrentioRateLimitException $exception) {
|
} catch (TorrentioRateLimitException $exception) {
|
||||||
$this->broadcaster->alert('Warning', 'Torrentio has rate limited your requests. Please wait a few minutes before trying again.', 'warning');
|
$this->broadcaster->alert('Warning', 'Torrentio has rate limited your requests. Please wait a few minutes before trying again.', 'warning');
|
||||||
return $this->render('bare.html.twig',
|
return $this->render('bare.html.twig',
|
||||||
@@ -73,29 +85,16 @@ final class WebController extends AbstractController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/torrentio/tvshows/clear/{tmdbId}/{imdbId}/{season?}/{episode?}', name: 'app_clear_torrentio_tvshows')]
|
private function sendFragmentResponse(ResultInterface $result, Request $request): Response
|
||||||
public function clearTvShowOptions(GetTvShowOptionsInput $input, CacheInterface $cache, Request $request): Response
|
|
||||||
{
|
{
|
||||||
$cacheId = sprintf(
|
$request->setRequestFormat(TurboBundle::STREAM_FORMAT);
|
||||||
"page.torrentio.tvshows.%s.%s.%s.%s",
|
return $this->renderBlock(
|
||||||
$input->tmdbId,
|
'torrentio/fragments.html.twig',
|
||||||
$input->imdbId,
|
$request->query->get('block'),
|
||||||
$input->season,
|
[
|
||||||
$input->episode,
|
'results' => $result,
|
||||||
|
'target' => $request->query->get('target')
|
||||||
|
]
|
||||||
);
|
);
|
||||||
$cache->delete($cacheId);
|
|
||||||
|
|
||||||
$this->broadcaster->alert(
|
|
||||||
title: 'Success',
|
|
||||||
message: 'Torrentio cache Cleared.'
|
|
||||||
);
|
|
||||||
|
|
||||||
return $cache->get($cacheId, function (ItemInterface $item) use ($input) {
|
|
||||||
$item->expiresAt(Carbon::now()->addHour()->setMinute(0)->setSecond(0));
|
|
||||||
$results = $this->getTvShowOptionsHandler->handle($input->toCommand());
|
|
||||||
return $this->render('torrentio/tvshows.html.twig', [
|
|
||||||
'results' => $results,
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
</a>
|
</a>
|
||||||
|
|
||||||
{% if download.mediaType == "tvshows" and download.episodeId != null %}
|
{% if download.mediaType == "tvshows" and download.episodeId != null %}
|
||||||
— <span class="ml-1">(S{{ download.episodeId }})</span>
|
— <span class="ml-1">({{ download.episodeId }})</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
mediaType: mediaType,
|
mediaType: mediaType,
|
||||||
imdbId: imdbId
|
imdbId: imdbId
|
||||||
}) }}">
|
}) }}">
|
||||||
<img src="{{ image }}" class="w-full md:w-40 rounded-md" />
|
<img src="{{ preload(image) }}" class="w-full md:w-40 rounded-md" />
|
||||||
</a>
|
</a>
|
||||||
<a href="{{ path('app_search_result', {
|
<a href="{{ path('app_search_result', {
|
||||||
mediaType: mediaType,
|
mediaType: mediaType,
|
||||||
imdbId: imdbId
|
imdbId: imdbId
|
||||||
}) }}">
|
}) }}">
|
||||||
<h3 class="text-center text-white md:text-xl md:text-base md:max-w-[16ch]">{{ title }}</h3>
|
<h3 class="text-center text-white md:text-md md:text-base md:max-w-[16ch]">{{ title }}</h3>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -74,8 +74,15 @@
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div {{ stimulus_target('tv-results', 'listContainer') }} class="inline-block overflow-hidden rounded-lg">
|
<div class="inline-block overflow-hidden rounded-lg">
|
||||||
|
<twig:Turbo:Frame id="results_{{ episode_id(episode['season_number'], episode['episode_number']) }}" src="{{ path('app_torrentio_tvshows', {
|
||||||
|
tmdbId: this.tmdbId,
|
||||||
|
imdbId: this.imdbId,
|
||||||
|
season: episode['season_number'],
|
||||||
|
episode: episode['episode_number'],
|
||||||
|
target: 'results_' ~ episode_id(episode['season_number'], episode['episode_number']),
|
||||||
|
block: 'tvshow_results'
|
||||||
|
}) }}" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -85,6 +85,12 @@
|
|||||||
{{ stimulus_controller('movie_results', {title: results.media.title, tmdbId: results.media.tmdbId, imdbId: results.media.imdbId}) }}
|
{{ stimulus_controller('movie_results', {title: results.media.title, tmdbId: results.media.tmdbId, imdbId: results.media.imdbId}) }}
|
||||||
data-movie-results-loading-icon-outlet=".loading-icon"
|
data-movie-results-loading-icon-outlet=".loading-icon"
|
||||||
>
|
>
|
||||||
|
<twig:Turbo:Frame id="movie_results_frame" src="{{ path('app_torrentio_movies', {
|
||||||
|
tmdbId: results.media.tmdbId,
|
||||||
|
imdbId: results.media.imdbId,
|
||||||
|
target: 'movie_results_frame',
|
||||||
|
block: 'movie_results'
|
||||||
|
}) }}" />
|
||||||
</div>
|
</div>
|
||||||
{% elseif "tvshows" == results.media.mediaType %}
|
{% elseif "tvshows" == results.media.mediaType %}
|
||||||
<twig:TvEpisodeList
|
<twig:TvEpisodeList
|
||||||
|
|||||||
19
templates/torrentio/fragments.html.twig
Normal file
19
templates/torrentio/fragments.html.twig
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{% block movie_results %}
|
||||||
|
<turbo-stream action="replace" targets="#{{ target }}">
|
||||||
|
<template>
|
||||||
|
<div class="p-4 flex flex-col gap-6 bg-orange-500 bg-clip-padding backdrop-filter backdrop-blur-md bg-opacity-60 rounded-md">
|
||||||
|
<div class="overflow-hidden rounded-md">
|
||||||
|
{{ include('torrentio/partial/option-table.html.twig', {controller: 'movie-results'}) }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</turbo-stream>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block tvshow_results %}
|
||||||
|
<turbo-stream action="replace" targets="#{{ target }}">
|
||||||
|
<template>
|
||||||
|
{{ include('torrentio/partial/option-table.html.twig', {controller: 'tv-results'}) }}
|
||||||
|
</template>
|
||||||
|
</turbo-stream>
|
||||||
|
{% endblock %}
|
||||||
Reference in New Issue
Block a user