Compare commits

..

3 Commits

4 changed files with 46 additions and 11 deletions

View File

@@ -25,6 +25,7 @@ export default class extends Controller {
static outlets = ['movie-results', 'tv-results', 'tv-episode-list'] static outlets = ['movie-results', 'tv-results', 'tv-episode-list']
static targets = ['resolution', 'codec', 'language', 'provider', 'season', 'quality', 'selectAll', 'downloadSelected'] static targets = ['resolution', 'codec', 'language', 'provider', 'season', 'quality', 'selectAll', 'downloadSelected']
static values = { static values = {
'imdbId': String,
'media-type': String, 'media-type': String,
'episodes': Array, 'episodes': Array,
'reverseMappedQualities': Object, 'reverseMappedQualities': Object,
@@ -156,6 +157,14 @@ export default class extends Controller {
this.selectAllTarget.checked = false; this.selectAllTarget.checked = false;
} }
downloadSeason() {
fetch(`/api/download/${this.imdbIdValue}/${this.activeFilter['season']}`, {
headers: {
'Content-Type': 'application/json'
}
})
}
selectAllEpisodes() { selectAllEpisodes() {
this.tvResultsOutlets.forEach((episode) => { this.tvResultsOutlets.forEach((episode) => {
if (episode.isActive()) { if (episode.isActive()) {

View File

@@ -2,15 +2,20 @@
namespace App\Base\Framework\Command; namespace App\Base\Framework\Command;
use App\User\Framework\Entity\Preference;
use App\User\Framework\Entity\UserPreference; use App\User\Framework\Entity\UserPreference;
use App\User\Framework\Repository\PreferenceOptionRepository; use App\User\Framework\Repository\PreferenceOptionRepository;
use App\User\Framework\Repository\PreferencesRepository; use App\User\Framework\Repository\PreferencesRepository;
use App\User\Framework\Repository\UserRepository; use App\User\Framework\Repository\UserRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bridge\Doctrine\PropertyInfo\DoctrineExtractor;
use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle; use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor;
use Symfony\Component\PropertyInfo\PropertyInfoExtractor;
#[AsCommand( #[AsCommand(
name: 'db:seed', name: 'db:seed',
@@ -50,17 +55,23 @@ class SeedDatabaseCommand extends Command
$preferences = $this->getPreferences(); $preferences = $this->getPreferences();
foreach ($preferences as $preference) { foreach ($preferences as $preference) {
if ($this->preferenceRepository->find($preference['id'])) { $isNewRecord = false;
continue; $preferenceRecord = $this->preferenceRepository->findOneBy(['id' => $preference['id']]);
if (null === $preferenceRecord) {
$isNewRecord = true;
$preferenceRecord = new Preference();
} }
$this->preferenceRepository->getEntityManager()->persist((new \App\User\Framework\Entity\Preference()) $preferenceRecord
->setId($preference['id']) ->setId($preference['id'])
->setName($preference['name']) ->setName($preference['name'])
->setDescription($preference['description']) ->setDescription($preference['description'])
->setEnabled($preference['enabled']) ->setEnabled($preference['enabled'])
->setType($preference['type']) ->setType($preference['type']);
);
if (true === $isNewRecord) {
$this->preferenceRepository->getEntityManager()->persist($preferenceRecord);
}
} }
$this->preferenceRepository->getEntityManager()->flush(); $this->preferenceRepository->getEntityManager()->flush();

View File

@@ -1,7 +1,13 @@
<button <button
class="h-8 bg-{{ color|default('orange') }}-500/80 hover:bg-{{ color|default('orange') }}-600/80 px-2 text-{{ text_color|default('white') }} rounded text-sm font-semibold" class="h-6 bg-{{ color|default('orange') }}-500/80 hover:bg-{{ color|default('orange') }}-600/80 px-2 text-{{ text_color|default('white') }} rounded-ms text-sm font-semibold"
{{ attributes.defaults(stimulus_controller('action_button')) }}
{{ stimulus_action('action_button', action|default('default')) }} {% if custom_controller|default and custom_action|default %}
{{ attributes.defaults(stimulus_controller(custom_controller, custom_controller_vars|default({}))) }}
{{ stimulus_action(custom_controller, custom_action|default('default'), custom_action_event|default('click'), custom_action_params|default({})) }}
{% else %}
{{ attributes.defaults(stimulus_controller('action_button')) }}
{{ stimulus_action('action_button', action|default('default')) }}
{% endif %}
> >
{{ text|default('button') }} {{ text|default('button') }}
</button> </button>

View File

@@ -1,10 +1,10 @@
<div id="filter" class="flex flex-col gap-4" <div id="filter" class="flex flex-col gap-4"
{{ stimulus_controller('result_filter', {reverseMappedQualities: this.reverseMappedQualities}) }} {{ stimulus_controller('result_filter', {reverseMappedQualities: this.reverseMappedQualities, imdbId: results.media.imdbId}) }}
data-result-filter-media-type-value="{{ results.media.mediaType }}" data-result-filter-media-type-value="{{ results.media.mediaType }}"
data-result-filter-movie-results-outlet=".results" data-result-filter-movie-results-outlet=".results"
data-result-filter-tv-results-outlet=".results" data-result-filter-tv-results-outlet=".results"
data-result-filter-tv-episode-list-outlet=".episode-list" data-result-filter-tv-episode-list-outlet=".episode-list"
data-action="change->result-filter#filter movie-results:optionsLoaded@window->result-filter#loadOptions tv-results:optionsLoaded@window->result-filter#loadOptions" data-action="change->result-filter#filter movie-results:optionsLoaded@window->result-filter#loadOptions tv-results:optionsLoaded@window->result-filter#loadOptions action-button:downloadSeason@window->result-filter#downloadSeason"
> >
<div class="w-full p-4 flex flex-col md:flex-row gap-4 bg-stone-500 text-md text-gray-500 dark:text-gray-50 rounded-lg"> <div class="w-full p-4 flex flex-col md:flex-row gap-4 bg-stone-500 text-md text-gray-500 dark:text-gray-50 rounded-lg">
<label for="resolution"> <label for="resolution">
@@ -94,10 +94,19 @@
{% if results.media.mediaType == "tvshows" %} {% if results.media.mediaType == "tvshows" %}
<div class="flex flex-row gap-2 justify-end px-8"> <div class="flex flex-row gap-2 justify-end px-8">
<button class="px-1.5 py-1 bg-green-600 hover:bg-green-700 rounded-md text-sm" <twig:Modal heading="Back up a sec!" button_text="Download Season" submit_action="{{ stimulus_action('result_filter', 'downloadSeason', 'click')|stimulus_action('dialog', 'close') }}" button_class="px-1.5 py-1 bg-green-600 rounded-ms text-sm font-semibold" show_cancel show_submit>
Downloading an entire season this way will use the filter from your
<a href="{{ path('app_user_preferences') }}" class="text-underline">preferences</a> to choose
the appropriate file(s).
<br /><br />
Do you wish to download <strong>season {{ results.season }}</strong> of "<strong>{{ results.media.title }}</strong>"?
</twig:Modal>
<button class="px-1.5 py-1 bg-green-600 hover:bg-green-700 rounded-ms text-sm font-semibold"
{{ stimulus_target('result_filter', 'downloadSelected') }} {{ stimulus_target('result_filter', 'downloadSelected') }}
{{ stimulus_action('result_filter', 'downloadSelectedEpisodes', 'click') }} {{ stimulus_action('result_filter', 'downloadSelectedEpisodes', 'click') }}
>Download Selected</button> >Download Selected</button>
<input type="checkbox" name="selectAll" id="selectAll" <input type="checkbox" name="selectAll" id="selectAll"
{{ stimulus_target('result_filter', 'selectAll') }} {{ stimulus_target('result_filter', 'selectAll') }}
{{ stimulus_action('result_filter', 'selectAllEpisodes', 'change') }} {{ stimulus_action('result_filter', 'selectAllEpisodes', 'change') }}