diff --git a/README.md b/README.md index f890618b..f317ef2b 100644 --- a/README.md +++ b/README.md @@ -239,6 +239,8 @@ and less common features: ![Sync or create missing metadata files](https://github.com/meeb/tubesync/blob/main/docs/create-missing-metadata.md) +![Reset tasks from the command line](https://github.com/meeb/tubesync/blob/main/docs/reset-tasks.md) + # Warnings diff --git a/docs/reset-tasks.md b/docs/reset-tasks.md new file mode 100644 index 00000000..a1b6de4e --- /dev/null +++ b/docs/reset-tasks.md @@ -0,0 +1,33 @@ +# TubeSync + +## Advanced usage guide - reset tasks from the command line + +This is a new feature in v1.0 of TubeSync and later. It allows you to reset all +scheduled tasks from the command line as well as the "reset tasks" button in the +"tasks" tab of the dashboard. + +This is useful for TubeSync installations where you may have a lot of media and +sources added and the "reset tasks" button may take too long to the extent where +the page times out (with a 502 error or similar issue). + +## Requirements + +You have added some sources and media + +## Steps + +### 1. Run the reset tasks command + +Execute the following Django command: + +`./manage.py reset-tasks` + +When deploying TubeSync inside a container, you can execute this with: + +`docker exec -ti tubesync python3 /app/manage.py reset-tasks` + +This command will log what its doing to the terminal when you run it. + +When this is run, new tasks will be immediately created so all your sources will be +indexed again straight away, any missing information such as thumbnails will be +redownloaded, etc. diff --git a/tubesync/sync/management/commands/reset-tasks.py b/tubesync/sync/management/commands/reset-tasks.py new file mode 100644 index 00000000..ff44e2eb --- /dev/null +++ b/tubesync/sync/management/commands/reset-tasks.py @@ -0,0 +1,30 @@ +from django.core.management.base import BaseCommand, CommandError +from background_task.models import Task +from sync.models import Source + + +from common.logger import log + + +class Command(BaseCommand): + + help = 'Resets all tasks' + + def handle(self, *args, **options): + log.info('Resettings all tasks...') + # Delete all tasks + Task.objects.all().delete() + # Iter all tasks + for source in Source.objects.all(): + # Recreate the initial indexing task + verbose_name = _('Index media from source "{}"') + index_source_task( + str(source.pk), + repeat=source.index_schedule, + queue=str(source.pk), + priority=5, + verbose_name=verbose_name.format(source.name) + ) + # This also chains down to call each Media objects .save() as well + source.save() + log.info('Done')