diff --git a/.woodpecker/publish_docker_amd64.yml b/.woodpecker/publish_docker_amd64.yml index 1464e05..56c7687 100644 --- a/.woodpecker/publish_docker_amd64.yml +++ b/.woodpecker/publish_docker_amd64.yml @@ -11,20 +11,18 @@ depends_on: clone: git: - when: - #branch: master - event: tag image: woodpeckerci/plugin-git:v1.6.0 + when: + event: tag pipeline: # build and publish docker image for amd64 - x86 build-amd64: - when: - #branch: master - event: tag image: plugins/docker pull: true + when: + event: tag settings: repo: olofvndrhr/manga-dlp platforms: linux/amd64 diff --git a/.woodpecker/publish_docker_arm64.yml b/.woodpecker/publish_docker_arm64.yml index 2206d10..aa456ca 100644 --- a/.woodpecker/publish_docker_arm64.yml +++ b/.woodpecker/publish_docker_arm64.yml @@ -11,20 +11,18 @@ depends_on: clone: git: - when: - #branch: master - event: tag image: woodpeckerci/plugin-git:v1.6.0 + when: + event: tag pipeline: # build and publish docker image for arm64 build-arm64: - when: - #branch: master - event: tag image: plugins/docker pull: true + when: + event: tag settings: repo: olofvndrhr/manga-dlp platforms: linux/arm64 diff --git a/.woodpecker/publish_docker_manifest.yml b/.woodpecker/publish_docker_manifest.yml index 8455298..9ff58e8 100644 --- a/.woodpecker/publish_docker_manifest.yml +++ b/.woodpecker/publish_docker_manifest.yml @@ -12,20 +12,20 @@ depends_on: clone: git: - when: - #branch: master - event: tag image: woodpeckerci/plugin-git:v1.6.0 + when: + event: tag + branch: master pipeline: # publish docker manifest for automatic multi arch pulls publish-manifest: - when: - #branch: master - event: tag image: plugins/manifest pull: true + when: + event: tag + branch: master settings: spec: docker/manifest.tmpl auto_tag: true diff --git a/.woodpecker/publish_pre_release.yml b/.woodpecker/publish_pre_release.yml new file mode 100644 index 0000000..d90e041 --- /dev/null +++ b/.woodpecker/publish_pre_release.yml @@ -0,0 +1,85 @@ +################### +# publish pre-release # +################### +# branch: dev +# event: tag + +platform: linux/amd64 + +depends_on: + - tests + +clone: + git: + image: woodpeckerci/plugin-git:v1.6.0 + when: + event: tag + tag: "*-dev" + +pipeline: + + # build wheel and dist + build-pypi: + image: cr.44net.ch/ci-plugins/tests + pull: true + when: + event: tag + tag: "*-dev" + commands: + - python3 -m hatch build --clean + + # create pre-release-notes + create-pre-release-notes: + image: cr.44net.ch/baseimages/debian-base + pull: true + when: + event: tag + tag: "*-dev" + commands: + - bash get_release_notes.sh ${CI_COMMIT_TAG%%-dev} + + # publish pre-release on github (github.com/olofvndrhr/manga-dlp) + publish-pre-release-github: + image: woodpeckerci/plugin-github-release + pull: true + when: + event: tag + tag: "*-dev" + settings: + api_key: + from_secret: github-olofvndrhr-token + files: dist/* + title: ${CI_COMMIT_TAG} + note: RELEASENOTES.md + prerelease: true + + # publish pre-release on gitea (git.44net.ch/olofvndrhr/manga-dlp) + publish-pre-release-gitea: + image: woodpeckerci/plugin-gitea-release + pull: true + when: + event: tag + tag: "*-dev" + settings: + api_key: + from_secret: gitea-olofvndrhr-token + base_url: https://git.44net.ch + files: dist/* + title: ${CI_COMMIT_TAG} + note: RELEASENOTES.md + prerelease: true + +# # pre-release pypi +# pre-release-pypi: +# image: cr.44net.ch/ci-plugins/tests +# pull: true +# when: +# event: tag +# tag: "*-dev" +# secrets: +# - source: pypi_username +# target: HATCH_INDEX_USER +# - source: pypi_token +# target: HATCH_INDEX_AUTH +# commands: +# - python3 -m hatch publish --no-prompt --yes diff --git a/.woodpecker/publish_release.yml b/.woodpecker/publish_release.yml index e8be3d1..2c85999 100644 --- a/.woodpecker/publish_release.yml +++ b/.woodpecker/publish_release.yml @@ -11,40 +11,54 @@ depends_on: clone: git: - when: - #branch: master - event: tag image: woodpeckerci/plugin-git:v1.6.0 + when: + event: tag + branch: master pipeline: # build wheel and dist build-pypi: - when: - #branch: master - event: tag image: cr.44net.ch/ci-plugins/tests pull: true + when: + event: tag + branch: master commands: - python3 -m hatch build --clean # create release-notes create-release-notes: - when: - #branch: master - event: tag image: cr.44net.ch/baseimages/debian-base pull: true + when: + event: tag + branch: master commands: - bash get_release_notes.sh ${CI_COMMIT_TAG} + # publish release on github (github.com/olofvndrhr/manga-dlp) + publish-release-github: + image: woodpeckerci/plugin-github-release + pull: true + when: + event: tag + branch: master + settings: + api_key: + from_secret: github-olofvndrhr-token + files: dist/* + title: ${CI_COMMIT_TAG} + note: RELEASENOTES.md + # publish release on gitea (git.44net.ch/olofvndrhr/manga-dlp) publish-release-gitea: - when: - #branch: master - event: tag - image: plugins/gitea-release + image: woodpeckerci/plugin-gitea-release pull: true + when: + event: tag + branch: master settings: api_key: from_secret: gitea-olofvndrhr-token @@ -53,27 +67,13 @@ pipeline: title: ${CI_COMMIT_TAG} note: RELEASENOTES.md - # publish release on github (github.com/olofvndrhr/manga-dlp) - publish-release-github: - when: - #branch: master - event: tag - image: woodpeckerci/plugin-github-release - pull: true - settings: - api_key: - from_secret: github-olofvndrhr-token - files: dist/* - title: ${CI_COMMIT_TAG} - note: RELEASENOTES.md - # release pypi release-pypi: - when: - #branch: master - event: tag image: cr.44net.ch/ci-plugins/tests pull: true + when: + event: tag + branch: master secrets: - source: pypi_username target: HATCH_INDEX_USER diff --git a/.woodpecker/test_docker_amd64.yml b/.woodpecker/test_docker_amd64.yml index cf38c7d..e0bd53d 100644 --- a/.woodpecker/test_docker_amd64.yml +++ b/.woodpecker/test_docker_amd64.yml @@ -11,20 +11,20 @@ depends_on: clone: git: + image: woodpeckerci/plugin-git:v1.6.0 when: branch: master event: pull_request - image: woodpeckerci/plugin-git:v1.6.0 pipeline: # build docker image for amd64 - x86 test-build-amd64: + image: plugins/docker + pull: true when: branch: master event: pull_request - image: plugins/docker - pull: true settings: dry_run: true repo: olofvndrhr/manga-dlp diff --git a/.woodpecker/test_docker_arm64.yml b/.woodpecker/test_docker_arm64.yml index b4f9685..a367f65 100644 --- a/.woodpecker/test_docker_arm64.yml +++ b/.woodpecker/test_docker_arm64.yml @@ -11,20 +11,20 @@ depends_on: clone: git: + image: woodpeckerci/plugin-git:v1.6.0 when: branch: master event: pull_request - image: woodpeckerci/plugin-git:v1.6.0 pipeline: # build docker image for arm64 test-build-arm64: + image: plugins/docker + pull: true when: branch: master event: pull_request - image: plugins/docker - pull: true settings: dry_run: true repo: olofvndrhr/manga-dlp diff --git a/.woodpecker/test_release.yml b/.woodpecker/test_release.yml index 7029aec..ef64caa 100644 --- a/.woodpecker/test_release.yml +++ b/.woodpecker/test_release.yml @@ -11,30 +11,30 @@ depends_on: clone: git: + image: woodpeckerci/plugin-git:v1.6.0 when: branch: master event: pull_request - image: woodpeckerci/plugin-git:v1.6.0 pipeline: # build wheel and dist test-build-pypi: + image: cr.44net.ch/ci-plugins/tests + pull: true when: branch: master event: pull_request - image: cr.44net.ch/ci-plugins/tests - pull: true commands: - python3 -m hatch build --clean # create release-notes test-create-release-notes: + image: cr.44net.ch/baseimages/debian-base + pull: true when: branch: master event: pull_request - image: cr.44net.ch/baseimages/debian-base - pull: true commands: - bash get_release_notes.sh latest - cat RELEASENOTES.md diff --git a/.woodpecker/test_tox_amd64.yml b/.woodpecker/test_tox_amd64.yml index 01b4da8..342fe15 100644 --- a/.woodpecker/test_tox_amd64.yml +++ b/.woodpecker/test_tox_amd64.yml @@ -11,19 +11,19 @@ depends_on: clone: git: + image: woodpeckerci/plugin-git:v1.6.0 when: branch: master event: pull_request - image: woodpeckerci/plugin-git:v1.6.0 pipeline: # test code with different python versions - amd64 test-tox-amd64: + image: cr.44net.ch/ci-plugins/multipy + pull: true when: branch: master event: pull_request - image: cr.44net.ch/ci-plugins/multipy - pull: true commands: - python3 -m tox diff --git a/.woodpecker/test_tox_arm64.yml b/.woodpecker/test_tox_arm64.yml index 5c42ce5..87a9a20 100644 --- a/.woodpecker/test_tox_arm64.yml +++ b/.woodpecker/test_tox_arm64.yml @@ -11,20 +11,20 @@ depends_on: clone: git: + image: woodpeckerci/plugin-git:v1.6.0 when: branch: master event: pull_request - image: woodpeckerci/plugin-git:v1.6.0 pipeline: # test code with different python versions - arm64 test-tox-arm64: + image: cr.44net.ch/ci-plugins/multipy + pull: true when: branch: master event: pull_request - image: cr.44net.ch/ci-plugins/multipy - pull: true commands: - grep -v img2pdf contrib/requirements_dev.txt > contrib/requirements_dev_arm64.txt - rm -f contrib/requirements_dev.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 0744542..65b713f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,12 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Add support for more sites +## [2.2.20] - 2023-02-12 + +### Fixed + +- Script now doesn't exit if multiple mangas were requested and one had an error + ## [2.2.19] - 2023-02-11 ### Added diff --git a/mangadlp/__about__.py b/mangadlp/__about__.py index 47f9cd6..97eeff4 100644 --- a/mangadlp/__about__.py +++ b/mangadlp/__about__.py @@ -1 +1 @@ -__version__ = "2.2.19" +__version__ = "2.2.20" diff --git a/mangadlp/app.py b/mangadlp/app.py index 34e6560..f5a0744 100644 --- a/mangadlp/app.py +++ b/mangadlp/app.py @@ -1,6 +1,5 @@ import re import shutil -import sys from pathlib import Path from typing import Any, Union @@ -78,9 +77,9 @@ class MangaDLP: try: log.debug("Initializing api") self.api = self.api_used(self.url_uuid, self.language, self.forcevol) - except Exception: + except Exception as exc: log.error("Can't initialize api. Exiting") - sys.exit(1) + raise exc # get manga title and uuid self.manga_uuid = self.api.manga_uuid self.manga_title = self.api.manga_title @@ -96,7 +95,7 @@ class MangaDLP: log.error( 'You need to specify a manga url/uuid with "-u" or a list with "--read"' ) - sys.exit(1) + raise ValueError # checks if --list is not used if not self.list_chapters: if not self.chapters: @@ -104,15 +103,15 @@ class MangaDLP: log.error( 'You need to specify one or more chapters to download. To see all chapters use "--list"' ) - sys.exit(1) + raise ValueError # if forcevol is used, but didn't specify a volume in the chapters selected if self.forcevol and ":" not in self.chapters: log.error("You need to specify the volume if you use --forcevol") - sys.exit(1) + raise ValueError # if forcevol is not used, but a volume is specified if not self.forcevol and ":" in self.chapters: log.error("Don't specify the volume without --forcevol") - sys.exit(1) + raise ValueError # check the api which needs to be used def check_api(self, url_uuid: str) -> type: @@ -129,11 +128,11 @@ class MangaDLP: # this is only for testing multiple apis if api_test.search(url_uuid): log.critical("Not supported yet") - sys.exit(1) + raise ValueError # no supported api found log.error(f"No supported api in link/uuid found: {url_uuid}") - sys.exit(1) + raise ValueError # once called per manga def get_manga(self) -> None: @@ -206,6 +205,8 @@ class MangaDLP: try: chapter_path = self.get_chapter(chapter) + except KeyboardInterrupt as exc: + raise exc except FileExistsError: skipped_chapters.append(chapter) # update cache @@ -273,9 +274,9 @@ class MangaDLP: chapter_image_urls = self.api.get_chapter_images( chapter, self.download_wait ) - except KeyboardInterrupt: - log.critical("Stopping") - sys.exit(1) + except KeyboardInterrupt as exc: + log.critical("Keyboard interrupt. Stopping") + raise exc # check if the image urls are empty. if yes skip this chapter (for mass downloads) if not chapter_image_urls: @@ -364,9 +365,9 @@ class MangaDLP: downloader.download_chapter( chapter_image_urls, chapter_path, self.download_wait ) - except KeyboardInterrupt: - log.critical("Stopping") - sys.exit(1) + except KeyboardInterrupt as exc: + log.critical("Keyboard interrupt. Stopping") + raise exc except Exception as exc: log.error(f"Cant download: '{chapter_filename}'. Skipping") diff --git a/mangadlp/cli.py b/mangadlp/cli.py index e2e3be9..7f8361c 100644 --- a/mangadlp/cli.py +++ b/mangadlp/cli.py @@ -1,3 +1,4 @@ +import sys from pathlib import Path import click @@ -256,24 +257,32 @@ def main( requested_mangas = [url_uuid] if url_uuid else read_mangas for manga in requested_mangas: - mdlp = app.MangaDLP( - url_uuid=manga, - language=lang, - chapters=chapters, - list_chapters=list_chapters, - file_format=chapter_format, - name_format=name_format, - name_format_none=name_format_none, - forcevol=forcevol, - download_path=path, - download_wait=wait_time, - manga_pre_hook_cmd=hook_manga_pre, - manga_post_hook_cmd=hook_manga_post, - chapter_pre_hook_cmd=hook_chapter_pre, - chapter_post_hook_cmd=hook_chapter_post, - cache_path=cache_path, - ) - mdlp.get_manga() + try: + mdlp = app.MangaDLP( + url_uuid=manga, + language=lang, + chapters=chapters, + list_chapters=list_chapters, + file_format=chapter_format, + name_format=name_format, + name_format_none=name_format_none, + forcevol=forcevol, + download_path=path, + download_wait=wait_time, + manga_pre_hook_cmd=hook_manga_pre, + manga_post_hook_cmd=hook_manga_post, + chapter_pre_hook_cmd=hook_chapter_pre, + chapter_post_hook_cmd=hook_chapter_post, + cache_path=cache_path, + ) + mdlp.get_manga() + except (KeyboardInterrupt, Exception) as exc: + # if only a single manga is requested and had an error, then exit + if len(requested_mangas) == 1: + log.error(f"Error with manga: {manga}") + sys.exit(1) + # else continue with the other ones + log.error(f"Skipping: {manga}. Reason={exc}") if __name__ == "__main__": diff --git a/mangadlp/downloader.py b/mangadlp/downloader.py index 749b712..3826531 100644 --- a/mangadlp/downloader.py +++ b/mangadlp/downloader.py @@ -1,6 +1,5 @@ import logging import shutil -import sys from pathlib import Path from time import sleep from typing import Union @@ -35,9 +34,8 @@ def download_chapter( if r.status_code != 200: log.error(f"Request for image {image} failed, retrying") raise ConnectionError - except KeyboardInterrupt: - log.critical("Stopping") - sys.exit(1) + except KeyboardInterrupt as exc: + raise exc except Exception as exc: if counter >= 3: log.error("Maybe the MangaDex Servers are down?") diff --git a/tests/test_01_app.py b/tests/test_01_app.py index 3da6ee6..bad76bc 100644 --- a/tests/test_01_app.py +++ b/tests/test_01_app.py @@ -13,7 +13,6 @@ def test_check_api_mangadex(): def test_check_api_none(): url = "https://abc.defghjk/title/abc/def" - with pytest.raises(SystemExit) as e: + with pytest.raises(ValueError) as e: MangaDLP(url_uuid=url, list_chapters=True, download_wait=2) - assert e.type == SystemExit - assert e.value.code == 1 + assert e.type == ValueError