├── .editorconfig ├── .github ├── FUNDING.yml └── workflows │ ├── docker.yml │ ├── executables.yml │ ├── pages.yml │ └── tests.yml ├── .gitignore ├── CHANGELOG.md ├── Dockerfile ├── LICENSE ├── MANIFEST.in ├── Makefile ├── README.rst ├── bin └── gallery-dl ├── docs ├── _layouts │ └── default.html ├── configuration.rst ├── formatting.md ├── gallery-dl-example.conf ├── gallery-dl.conf ├── index.md ├── links.js ├── oauth-redirect.html ├── options.md └── supportedsites.md ├── gallery_dl ├── __init__.py ├── __main__.py ├── actions.py ├── aes.py ├── archive.py ├── cache.py ├── config.py ├── cookies.py ├── downloader │ ├── __init__.py │ ├── common.py │ ├── http.py │ ├── text.py │ └── ytdl.py ├── exception.py ├── extractor │ ├── 2ch.py │ ├── 2chan.py │ ├── 2chen.py │ ├── 35photo.py │ ├── 3dbooru.py │ ├── 4archive.py │ ├── 4chan.py │ ├── 4chanarchives.py │ ├── 500px.py │ ├── 8chan.py │ ├── 8muses.py │ ├── __init__.py │ ├── adultempire.py │ ├── agnph.py │ ├── ao3.py │ ├── arcalive.py │ ├── architizer.py │ ├── artstation.py │ ├── aryion.py │ ├── batoto.py │ ├── bbc.py │ ├── behance.py │ ├── bilibili.py │ ├── blogger.py │ ├── bluesky.py │ ├── booru.py │ ├── boosty.py │ ├── bunkr.py │ ├── catbox.py │ ├── chevereto.py │ ├── cien.py │ ├── civitai.py │ ├── comicvine.py │ ├── common.py │ ├── cyberdrop.py │ ├── danbooru.py │ ├── desktopography.py │ ├── deviantart.py │ ├── directlink.py │ ├── discord.py │ ├── dynastyscans.py │ ├── e621.py │ ├── erome.py │ ├── everia.py │ ├── exhentai.py │ ├── facebook.py │ ├── fanbox.py │ ├── fantia.py │ ├── fapachi.py │ ├── fapello.py │ ├── flickr.py │ ├── foolfuuka.py │ ├── foolslide.py │ ├── furaffinity.py │ ├── furry34.py │ ├── fuskator.py │ ├── gelbooru.py │ ├── gelbooru_v01.py │ ├── gelbooru_v02.py │ ├── generic.py │ ├── gofile.py │ ├── hatenablog.py │ ├── hentai2read.py │ ├── hentaicosplays.py │ ├── hentaifoundry.py │ ├── hentaihand.py │ ├── hentaihere.py │ ├── hentainexus.py │ ├── hiperdex.py │ ├── hitomi.py │ ├── hotleak.py │ ├── idolcomplex.py │ ├── imagebam.py │ ├── imagechest.py │ ├── imagefap.py │ ├── imagehosts.py │ ├── imgbb.py │ ├── imgbox.py │ ├── imgth.py │ ├── imgur.py │ ├── imhentai.py │ ├── inkbunny.py │ ├── instagram.py │ ├── issuu.py │ ├── itaku.py │ ├── itchio.py │ ├── jschan.py │ ├── kabeuchi.py │ ├── keenspot.py │ ├── kemono.py │ ├── khinsider.py │ ├── komikcast.py │ ├── lensdump.py │ ├── lexica.py │ ├── lightroom.py │ ├── livedoor.py │ ├── lofter.py │ ├── lolisafe.py │ ├── luscious.py │ ├── lynxchan.py │ ├── mangadex.py │ ├── mangafox.py │ ├── mangahere.py │ ├── manganelo.py │ ├── mangapark.py │ ├── mangaread.py │ ├── mangoxo.py │ ├── mastodon.py │ ├── message.py │ ├── misskey.py │ ├── moebooru.py │ ├── motherless.py │ ├── myhentaigallery.py │ ├── myportfolio.py │ ├── naver.py │ ├── naverwebtoon.py │ ├── nekohouse.py │ ├── newgrounds.py │ ├── nhentai.py │ ├── nijie.py │ ├── nitter.py │ ├── noop.py │ ├── nozomi.py │ ├── nsfwalbum.py │ ├── oauth.py │ ├── paheal.py │ ├── patreon.py │ ├── pexels.py │ ├── philomena.py │ ├── photovogue.py │ ├── picarto.py │ ├── pictoa.py │ ├── piczel.py │ ├── pillowfort.py │ ├── pinterest.py │ ├── pixeldrain.py │ ├── pixiv.py │ ├── pixnet.py │ ├── plurk.py │ ├── poipiku.py │ ├── poringa.py │ ├── pornhub.py │ ├── pornpics.py │ ├── postmill.py │ ├── rawkuma.py │ ├── reactor.py │ ├── readcomiconline.py │ ├── realbooru.py │ ├── recursive.py │ ├── reddit.py │ ├── redgifs.py │ ├── rule34us.py │ ├── rule34vault.py │ ├── rule34xyz.py │ ├── saint.py │ ├── sankaku.py │ ├── sankakucomplex.py │ ├── schalenetwork.py │ ├── scrolller.py │ ├── seiga.py │ ├── senmanga.py │ ├── sexcom.py │ ├── shimmie2.py │ ├── shopify.py │ ├── simplyhentai.py │ ├── skeb.py │ ├── slickpic.py │ ├── slideshare.py │ ├── smugmug.py │ ├── soundgasm.py │ ├── speakerdeck.py │ ├── steamgriddb.py │ ├── subscribestar.py │ ├── szurubooru.py │ ├── tapas.py │ ├── tcbscans.py │ ├── telegraph.py │ ├── tenor.py │ ├── tiktok.py │ ├── tmohentai.py │ ├── toyhouse.py │ ├── tsumino.py │ ├── tumblr.py │ ├── tumblrgallery.py │ ├── twibooru.py │ ├── twitter.py │ ├── unsplash.py │ ├── uploadir.py │ ├── urlgalleries.py │ ├── urlshortener.py │ ├── vanillarock.py │ ├── vichan.py │ ├── vipergirls.py │ ├── vk.py │ ├── vsco.py │ ├── wallhaven.py │ ├── wallpapercave.py │ ├── warosu.py │ ├── weasyl.py │ ├── webmshare.py │ ├── webtoons.py │ ├── weebcentral.py │ ├── weibo.py │ ├── wikiart.py │ ├── wikifeet.py │ ├── wikimedia.py │ ├── xfolio.py │ ├── xhamster.py │ ├── xvideos.py │ ├── yiffverse.py │ ├── ytdl.py │ ├── zerochan.py │ └── zzup.py ├── formatter.py ├── job.py ├── oauth.py ├── option.py ├── output.py ├── path.py ├── postprocessor │ ├── __init__.py │ ├── classify.py │ ├── common.py │ ├── compare.py │ ├── directory.py │ ├── exec.py │ ├── hash.py │ ├── metadata.py │ ├── mtime.py │ ├── python.py │ ├── rename.py │ ├── ugoira.py │ └── zip.py ├── text.py ├── transaction_id.py ├── update.py ├── util.py ├── version.py └── ytdl.py ├── pyproject.toml ├── requirements.txt ├── scripts ├── build_testresult_db.py ├── completion_bash.py ├── completion_fish.py ├── completion_zsh.py ├── create_test_data.py ├── docs_compare.py ├── export_tests.py ├── hook-gallery_dl.py ├── man.py ├── options.py ├── pull-request ├── pyinstaller.py ├── pyprint.py ├── release.sh ├── run_tests.py ├── supportedsites.py └── util.py ├── setup.cfg ├── setup.py ├── snap ├── local │ └── launchers │ │ └── gallery-dl-launch └── snapcraft.yaml └── test ├── __init__.py ├── results ├── 2ch.py ├── 2chan.py ├── 2chen.py ├── 35photo.py ├── 3dbooru.py ├── 4archive.py ├── 4chan.py ├── 4chanarchives.py ├── 4plebs.py ├── 500px.py ├── 8chan.py ├── 8kun.py ├── 8muses.py ├── 94chan.py ├── __init__.py ├── acidimg.py ├── adultempire.py ├── agnph.py ├── aibooru.py ├── allgirlbooru.py ├── animereactor.py ├── ao3.py ├── arcalive.py ├── architizer.py ├── archivedmoe.py ├── archiveofsins.py ├── artstation.py ├── aryion.py ├── atfbooru.py ├── azurlanewiki.py ├── b4k.py ├── baraag.py ├── batoto.py ├── bbc.py ├── bbw-chan.py ├── bcbnsfw.py ├── behance.py ├── bilibili.py ├── bitly.py ├── blogger.py ├── blogspot.py ├── bluesky.py ├── booruvar.py ├── boosty.py ├── bulbapedia.py ├── bunkr.py ├── catbox.py ├── cavemanon.py ├── chelseacrew.py ├── cien.py ├── civitai.py ├── comicvine.py ├── coomer.py ├── cyberdrop.py ├── danbooru.py ├── derpibooru.py ├── desktopography.py ├── desuarchive.py ├── deviantart.py ├── directlink.py ├── discord.py ├── drawfriends.py ├── dynastyscans.py ├── e621.py ├── e6ai.py ├── e926.py ├── endchan.py ├── erome.py ├── everia.py ├── exhentai.py ├── facebook.py ├── fanbox.py ├── fandom.py ├── fantia.py ├── fapachi.py ├── fapello.py ├── fappic.py ├── fashionnova.py ├── fireden.py ├── flickr.py ├── furaffinity.py ├── furbooru.py ├── furry34.py ├── fuskator.py ├── gelbooru.py ├── generic.py ├── giantessbooru.py ├── gofile.py ├── hatenablog.py ├── hentai2read.py ├── hentaicosplays.py ├── hentaienvy.py ├── hentaiera.py ├── hentaifoundry.py ├── hentaifox.py ├── hentaihand.py ├── hentaihere.py ├── hentainexus.py ├── hentairox.py ├── hentaizap.py ├── hiperdex.py ├── hitomi.py ├── horne.py ├── hotleak.py ├── hypnohub.py ├── idolcomplex.py ├── illusioncardsbooru.py ├── imagebam.py ├── imagechest.py ├── imagefap.py ├── imagepond.py ├── imagetwist.py ├── imagevenue.py ├── imgbb.py ├── imgbox.py ├── imgclick.py ├── imgkiwi.py ├── imgspice.py ├── imgth.py ├── imgur.py ├── imhentai.py ├── imxto.py ├── inkbunny.py ├── instagram.py ├── issuu.py ├── itaku.py ├── itchio.py ├── joyreactor.py ├── jpgfish.py ├── kabeuchi.py ├── keenspot.py ├── kemono.py ├── khinsider.py ├── kohlchan.py ├── komikcast.py ├── konachan.py ├── lensdump.py ├── lesbianenergy.py ├── lexica.py ├── lightroom.py ├── livedoor.py ├── lofter.py ├── lolibooru.py ├── loungeunderwear.py ├── luscious.py ├── mangadex.py ├── mangafox.py ├── mangahere.py ├── mangakakalot.py ├── manganato.py ├── mangapark.py ├── mangaread.py ├── mangoxo.py ├── mariowiki.py ├── mastodon.py ├── mastodonsocial.py ├── mediawiki.py ├── michaelscameras.py ├── misskeydesign.py ├── misskeyio.py ├── modcloth.py ├── motherless.py ├── myhentaigallery.py ├── myportfolio.py ├── natomanga.py ├── naver.py ├── naverwebtoon.py ├── nekohouse.py ├── nelomanga.py ├── newgrounds.py ├── nhentai.py ├── nijie.py ├── noop.py ├── nozomi.py ├── nsfwalbum.py ├── ohpolly.py ├── omgmiamiswimwear.py ├── paheal.py ├── palanq.py ├── patreon.py ├── pawoo.py ├── pexels.py ├── philomena.py ├── photovogue.py ├── picarto.py ├── pictoa.py ├── piczel.py ├── pidgiwiki.py ├── pillowfort.py ├── pinterest.py ├── pinupgirlclothing.py ├── pixeldrain.py ├── pixhost.py ├── pixiv.py ├── pixnet.py ├── plurk.py ├── poipiku.py ├── ponybooru.py ├── poringa.py ├── pornhub.py ├── pornpics.py ├── pornreactor.py ├── postimg.py ├── raddle.py ├── raidlondon.py ├── rawkuma.py ├── rbt.py ├── reactor.py ├── readcomiconline.py ├── realbooru.py ├── recursive.py ├── reddit.py ├── redgifs.py ├── rule34.py ├── rule34hentai.py ├── rule34us.py ├── rule34vault.py ├── rule34xyz.py ├── safebooru.py ├── saint.py ├── sakugabooru.py ├── sankaku.py ├── sankakucomplex.py ├── schalenetwork.py ├── scrolller.py ├── seiga.py ├── senmanga.py ├── sexcom.py ├── simplyhentai.py ├── skeb.py ├── slickpic.py ├── slideshare.py ├── smugloli.py ├── smugmug.py ├── snootbooru.py ├── soundgasm.py ├── speakerdeck.py ├── steamgriddb.py ├── subscribestar.py ├── sushiski.py ├── tapas.py ├── tbib.py ├── tcbscans.py ├── tco.py ├── telegraph.py ├── tenor.py ├── thebarchive.py ├── thecollection.py ├── tiktok.py ├── tmohentai.py ├── toyhouse.py ├── tsumino.py ├── tumblr.py ├── tumblrgallery.py ├── turboimagehost.py ├── twibooru.py ├── twitter.py ├── unique-vintage.py ├── unsplash.py ├── uploadir.py ├── urlgalleries.py ├── vanillarock.py ├── vidyapics.py ├── vidyart2.py ├── vipergirls.py ├── vipr.py ├── visuabusters.py ├── vk.py ├── vsco.py ├── wallhaven.py ├── wallpapercave.py ├── warosu.py ├── weasyl.py ├── webmshare.py ├── webtoons.py ├── weebcentral.py ├── weibo.py ├── wikiart.py ├── wikibooks.py ├── wikidata.py ├── wikifeet.py ├── wikifeetx.py ├── wikigg.py ├── wikimediacommons.py ├── wikinews.py ├── wikipedia.py ├── wikiquote.py ├── wikisource.py ├── wikispecies.py ├── wikiversity.py ├── wikivoyage.py ├── wiktionary.py ├── windsorstore.py ├── xbooru.py ├── xfolio.py ├── xhamster.py ├── xvideos.py ├── yandere.py ├── yiffverse.py ├── ytdl.py ├── zerochan.py └── zzup.py ├── test_cache.py ├── test_config.py ├── test_cookies.py ├── test_downloader.py ├── test_extractor.py ├── test_formatter.py ├── test_job.py ├── test_oauth.py ├── test_output.py ├── test_postprocessor.py ├── test_results.py ├── test_text.py ├── test_util.py └── test_ytdl.py /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | insert_final_newline = true 7 | trim_trailing_whitespace = true 8 | 9 | [**.py] 10 | indent_size = 4 11 | indent_style = space 12 | max_line_length = 79 13 | 14 | [Makefile] 15 | indent_style = tab 16 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | ko_fi: mikefaehrmann 2 | custom: https://www.paypal.me/mikefaehrmann 3 | -------------------------------------------------------------------------------- /.github/workflows/docker.yml: -------------------------------------------------------------------------------- 1 | name: Docker Images 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: 7 | - master 8 | tags: 9 | - v[0-9]+.[0-9]+.[0-9]+ 10 | 11 | 12 | permissions: 13 | packages: write 14 | 15 | concurrency: 16 | group: docker 17 | cancel-in-progress: false 18 | 19 | jobs: 20 | build: 21 | 22 | runs-on: ubuntu-latest 23 | 24 | # on release commits, run only for tag event 25 | if: ${{ 26 | github.repository == 'mikf/gallery-dl' && 27 | ( ! startsWith( github.event.head_commit.message , 'release version ' ) || 28 | startsWith( github.ref , 'refs/tags/v' ) ) 29 | }} 30 | 31 | steps: 32 | - uses: actions/checkout@v4 33 | 34 | - uses: docker/metadata-action@v5 35 | id: metadata 36 | with: 37 | images: | 38 | mikf123/gallery-dl 39 | ghcr.io/mikf/gallery-dl 40 | tags: | 41 | type=ref,event=tag 42 | type=raw,value=dev 43 | type=sha,format=long,prefix= 44 | type=raw,priority=500,value={{date 'YYYY.MM.DD'}} 45 | 46 | - uses: docker/setup-qemu-action@v3 47 | 48 | - uses: docker/setup-buildx-action@v3 49 | 50 | - name: Login to DockerHub 51 | uses: docker/login-action@v3 52 | with: 53 | username: ${{ secrets.DOCKERHUB_USERNAME }} 54 | password: ${{ secrets.DOCKERHUB_TOKEN }} 55 | 56 | - name: Login to GitHub Container Registry 57 | uses: docker/login-action@v3 58 | with: 59 | registry: ghcr.io 60 | username: ${{ github.repository_owner }} 61 | password: ${{ secrets.GHCR_TOKEN }} 62 | 63 | - uses: docker/build-push-action@v5 64 | with: 65 | context: . 66 | push: true 67 | tags: ${{ steps.metadata.outputs.tags }} 68 | labels: ${{ steps.metadata.outputs.labels }} 69 | platforms: linux/amd64,linux/arm64 70 | -------------------------------------------------------------------------------- /.github/workflows/pages.yml: -------------------------------------------------------------------------------- 1 | name: GitHub Pages 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: 7 | - master 8 | paths: 9 | - docs/** 10 | 11 | permissions: 12 | contents: read 13 | pages: write 14 | id-token: write 15 | 16 | concurrency: 17 | group: pages 18 | cancel-in-progress: false 19 | 20 | jobs: 21 | dispatch: 22 | 23 | if: github.repository == 'mikf/gallery-dl' 24 | runs-on: ubuntu-latest 25 | 26 | steps: 27 | - name: Dispatch to gdl-org/docs 28 | run: > 29 | curl -L 30 | -X POST 31 | -H "Accept: application/vnd.github+json" 32 | -H "Authorization: Bearer ${{ secrets.REPO_TOKEN }}" 33 | -H "X-GitHub-Api-Version: 2022-11-28" 34 | https://api.github.com/repos/gdl-org/docs/actions/workflows/pages.yml/dispatches 35 | -d '{"ref":"master"}' 36 | 37 | deploy: 38 | 39 | if: github.repository == 'mikf/gallery-dl' 40 | runs-on: ubuntu-latest 41 | 42 | environment: 43 | name: github-pages 44 | url: ${{ steps.deployment.outputs.page_url }} 45 | 46 | steps: 47 | - uses: actions/checkout@v4 48 | - uses: actions/configure-pages@v4 49 | 50 | - name: Copy static files 51 | run: | 52 | mkdir --parents -- ./_site 53 | cp --archive --target-directory=./_site -- \ 54 | ./docs/oauth-redirect.html 55 | 56 | - uses: actions/upload-pages-artifact@v3 57 | - uses: actions/deploy-pages@v4 58 | id: deployment 59 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | archive/ 2 | 3 | # Byte-compiled / optimized / DLL files 4 | __pycache__/ 5 | *.py[cod] 6 | 7 | # C extensions 8 | *.so 9 | 10 | # Distribution / packaging 11 | .Python 12 | env/ 13 | data/ 14 | build/ 15 | develop-eggs/ 16 | dist/ 17 | downloads/ 18 | eggs/ 19 | .eggs/ 20 | lib/ 21 | lib64/ 22 | parts/ 23 | sdist/ 24 | var/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .coverage 43 | .coverage.* 44 | .cache 45 | nosetests.xml 46 | coverage.xml 47 | *,cover 48 | 49 | # Translations 50 | *.mo 51 | *.pot 52 | 53 | # Django stuff: 54 | *.log 55 | 56 | # Sphinx documentation 57 | docs/_build/ 58 | 59 | # PyBuilder 60 | target/ 61 | 62 | # Snap packaging specific 63 | /snap/.snapcraft/ 64 | /parts/ 65 | /stage/ 66 | /prime/ 67 | 68 | /*.snap 69 | /*_source.tar.bz2 70 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:alpine 2 | ENV LANG=C.UTF-8 3 | 4 | RUN : \ 5 | && apk --no-interactive update \ 6 | && apk --no-cache --no-interactive add ffmpeg \ 7 | && rm -rf /var/cache/apk \ 8 | && : 9 | 10 | RUN : \ 11 | && python3 -B -m pip --no-cache-dir --no-input --disable-pip-version-check install -U \ 12 | pip \ 13 | && python3 -B -m pip --no-cache-dir --no-input --disable-pip-version-check install -U \ 14 | https://github.com/mikf/gallery-dl/archive/refs/heads/master.tar.gz \ 15 | yt-dlp[default] \ 16 | && ( rm -rf /root/.cache/pip || true ) \ 17 | && ( find /usr/local/lib/python3.*/site-packages/setuptools -name __pycache__ -exec rm -rf {} + || true ) \ 18 | && ( find /usr/local/lib/python3.*/site-packages/wheel -name __pycache__ -exec rm -rf {} + || true ) \ 19 | && : 20 | 21 | ENTRYPOINT [ "gallery-dl" ] 22 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include README.rst CHANGELOG.md LICENSE scripts/run_tests.py 2 | recursive-include docs *.conf 3 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | 2 | PREFIX ?= /usr/local 3 | BINDIR ?= $(PREFIX)/bin 4 | MANDIR ?= $(PREFIX)/man 5 | SHAREDIR ?= $(PREFIX)/share 6 | PYTHON ?= /usr/bin/env python3 7 | 8 | 9 | all: man completion supportedsites options 10 | 11 | clean: 12 | $(RM) -r build/ 13 | $(RM) -r data/ 14 | 15 | install: man completion 16 | $(PYTHON) setup.py install 17 | 18 | release: man completion supportedsites 19 | scripts/release.sh 20 | 21 | test: 22 | scripts/run_tests.py 23 | 24 | executable: 25 | scripts/pyinstaller.py 26 | 27 | completion: data/completion/gallery-dl data/completion/_gallery-dl data/completion/gallery-dl.fish 28 | 29 | man: data/man/gallery-dl.1 data/man/gallery-dl.conf.5 30 | 31 | supportedsites: docs/supportedsites.md 32 | 33 | options: docs/options.md 34 | 35 | .PHONY: all clean install release test executable completion man supportedsites options 36 | 37 | docs/supportedsites.md: gallery_dl/*/*.py scripts/supportedsites.py 38 | $(PYTHON) scripts/supportedsites.py 39 | 40 | docs/options.md: gallery_dl/option.py scripts/options.py 41 | $(PYTHON) scripts/options.py 42 | 43 | data/man/gallery-dl.1: gallery_dl/option.py gallery_dl/version.py scripts/man.py 44 | $(PYTHON) scripts/man.py 45 | 46 | data/man/gallery-dl.conf.5: docs/configuration.rst gallery_dl/version.py scripts/man.py 47 | $(PYTHON) scripts/man.py 48 | 49 | data/completion/gallery-dl: gallery_dl/option.py scripts/completion_bash.py 50 | $(PYTHON) scripts/completion_bash.py 51 | 52 | data/completion/_gallery-dl: gallery_dl/option.py scripts/completion_zsh.py 53 | $(PYTHON) scripts/completion_zsh.py 54 | 55 | data/completion/gallery-dl.fish: gallery_dl/option.py scripts/completion_fish.py 56 | $(PYTHON) scripts/completion_fish.py 57 | -------------------------------------------------------------------------------- /bin/gallery-dl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | 4 | import sys 5 | import gallery_dl 6 | sys.exit(gallery_dl.main()) 7 | -------------------------------------------------------------------------------- /docs/_layouts/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | {% seo %} 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | {{ content }} 17 | 18 |
19 | 20 | 21 | -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | # gallery-dl Documentation 2 | 3 | - ## [Supported Sites](supportedsites.md) 4 | - ## [Command Line Options](options.md) 5 | - ## [Configuration File Options](configuration.rst) 6 | - ### [gallery-dl.conf](gallery-dl.conf) 7 | - ### [gallery-dl-example.conf](gallery-dl-example.conf) 8 | - ## [String Formatting](formatting.md) 9 | -------------------------------------------------------------------------------- /docs/links.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | 4 | function add_header_links() 5 | { 6 | let style = document.createElement("style"); 7 | style.id = "headerlinks" 8 | document.head.appendChild(style); 9 | style.sheet.insertRule( 10 | "a.headerlink {" + 11 | " visibility: hidden;" + 12 | " text-decoration: none;" + 13 | " font-size: 0.8em;" + 14 | " padding: 0 4px 0 4px;" + 15 | "}"); 16 | style.sheet.insertRule( 17 | ":hover > a.headerlink {" + 18 | " visibility: visible;" + 19 | "}"); 20 | 21 | let headers = document.querySelectorAll("h2, h3, h4, h5, h6"); 22 | for (let i = 0, len = headers.length; i < len; ++i) 23 | { 24 | let header = headers[i]; 25 | 26 | let id = header.id || header.parentNode.id; 27 | if (!id) 28 | continue; 29 | 30 | let link = document.createElement("a"); 31 | link.href = "#" + id; 32 | link.className = "headerlink"; 33 | link.textContent = "¶"; 34 | 35 | header.appendChild(link); 36 | } 37 | } 38 | 39 | 40 | if (document.readyState !== "loading") { 41 | add_header_links(); 42 | } else { 43 | document.addEventListener("DOMContentLoaded", add_header_links); 44 | } 45 | -------------------------------------------------------------------------------- /docs/oauth-redirect.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | gallery-dl - OAuth Redirect 6 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /gallery_dl/__main__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | 4 | # Copyright 2017-2023 Mike Fährmann 5 | # 6 | # This program is free software; you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License version 2 as 8 | # published by the Free Software Foundation. 9 | 10 | import sys 11 | 12 | if not __package__ and not hasattr(sys, "frozen"): 13 | import os.path 14 | path = os.path.realpath(os.path.abspath(__file__)) 15 | sys.path.insert(0, os.path.dirname(os.path.dirname(path))) 16 | 17 | import gallery_dl 18 | 19 | if __name__ == "__main__": 20 | raise SystemExit(gallery_dl.main()) 21 | -------------------------------------------------------------------------------- /gallery_dl/downloader/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Copyright 2015-2021 Mike Fährmann 4 | # 5 | # This program is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License version 2 as 7 | # published by the Free Software Foundation. 8 | 9 | """Downloader modules""" 10 | 11 | modules = [ 12 | "http", 13 | "text", 14 | "ytdl", 15 | ] 16 | 17 | 18 | def find(scheme): 19 | """Return downloader class suitable for handling the given scheme""" 20 | try: 21 | return _cache[scheme] 22 | except KeyError: 23 | pass 24 | 25 | cls = None 26 | if scheme == "https": 27 | scheme = "http" 28 | if scheme in modules: # prevent unwanted imports 29 | try: 30 | module = __import__(scheme, globals(), None, (), 1) 31 | except ImportError: 32 | pass 33 | else: 34 | cls = module.__downloader__ 35 | 36 | if scheme == "http": 37 | _cache["http"] = _cache["https"] = cls 38 | else: 39 | _cache[scheme] = cls 40 | return cls 41 | 42 | 43 | # -------------------------------------------------------------------- 44 | # internals 45 | 46 | _cache = {} 47 | -------------------------------------------------------------------------------- /gallery_dl/downloader/text.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Copyright 2014-2019 Mike Fährmann 4 | # 5 | # This program is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License version 2 as 7 | # published by the Free Software Foundation. 8 | 9 | """Downloader module for text: URLs""" 10 | 11 | from .common import DownloaderBase 12 | 13 | 14 | class TextDownloader(DownloaderBase): 15 | scheme = "text" 16 | 17 | def download(self, url, pathfmt): 18 | if self.part: 19 | pathfmt.part_enable(self.partdir) 20 | self.out.start(pathfmt.path) 21 | with pathfmt.open("wb") as fp: 22 | fp.write(url.encode()[5:]) 23 | return True 24 | 25 | 26 | __downloader__ = TextDownloader 27 | -------------------------------------------------------------------------------- /gallery_dl/extractor/directlink.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Copyright 2017-2023 Mike Fährmann 4 | # 5 | # This program is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License version 2 as 7 | # published by the Free Software Foundation. 8 | 9 | """Direct link handling""" 10 | 11 | from .common import Extractor, Message 12 | from .. import text 13 | 14 | 15 | class DirectlinkExtractor(Extractor): 16 | """Extractor for direct links to images and other media files""" 17 | category = "directlink" 18 | filename_fmt = "{domain}/{path}/{filename}.{extension}" 19 | archive_fmt = filename_fmt 20 | pattern = (r"(?i)https?://(?P[^/?#]+)/(?P[^?#]+\." 21 | r"(?:jpe?g|jpe|png|gif|bmp|svg|web[mp]|avif|heic|psd" 22 | r"|mp4|m4v|mov|mkv|og[gmv]|wav|mp3|opus|zip|rar|7z|pdf|swf))" 23 | r"(?:\?(?P[^#]*))?(?:#(?P.*))?$") 24 | example = "https://en.wikipedia.org/static/images/project-logos/enwiki.png" 25 | 26 | def __init__(self, match): 27 | self.data = data = match.groupdict() 28 | self.subcategory = ".".join(data["domain"].rsplit(".", 2)[-2:]) 29 | Extractor.__init__(self, match) 30 | 31 | def items(self): 32 | data = self.data 33 | for key, value in data.items(): 34 | if value: 35 | data[key] = text.unquote(value) 36 | 37 | data["path"], _, name = data["path"].rpartition("/") 38 | data["filename"], _, ext = name.rpartition(".") 39 | data["extension"] = ext.lower() 40 | data["_http_headers"] = { 41 | "Referer": self.url.encode("latin-1", "ignore")} 42 | 43 | yield Message.Directory, data 44 | yield Message.Url, self.url, data 45 | -------------------------------------------------------------------------------- /gallery_dl/extractor/noop.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Copyright 2024 Mike Fährmann 4 | # 5 | # This program is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License version 2 as 7 | # published by the Free Software Foundation. 8 | 9 | """noop extractor""" 10 | 11 | from .common import Extractor, Message 12 | 13 | 14 | class NoopExtractor(Extractor): 15 | category = "noop" 16 | pattern = r"(?i)noo?p$" 17 | example = "noop" 18 | 19 | def items(self): 20 | # yield *something* to prevent a 'No results' message 21 | yield Message.Version, 1 22 | 23 | # Save cookies manually, since it happens automatically only after 24 | # extended extractor initialization, i.e. Message.Directory, which 25 | # itself might cause some unintended effects. 26 | if self.cookies: 27 | self.cookies_store() 28 | -------------------------------------------------------------------------------- /gallery_dl/extractor/photovogue.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | """Extractors for https://www.vogue.com/photovogue/""" 8 | 9 | from .common import Extractor, Message 10 | from .. import text 11 | 12 | BASE_PATTERN = r"(?:https?://)?(?:www\.)?vogue\.com/photovogue" 13 | 14 | 15 | class PhotovogueUserExtractor(Extractor): 16 | category = "photovogue" 17 | subcategory = "user" 18 | directory_fmt = ("{category}", "{photographer[id]} {photographer[name]}") 19 | filename_fmt = "{id} {title}.{extension}" 20 | archive_fmt = "{id}" 21 | pattern = BASE_PATTERN + r"/photographers/(\d+)" 22 | example = "https://www.vogue.com/photovogue/photographers/12345" 23 | 24 | def __init__(self, match): 25 | Extractor.__init__(self, match) 26 | self.user_id = match.group(1) 27 | 28 | def items(self): 29 | for photo in self.photos(): 30 | url = photo["gallery_image"] 31 | photo["title"] = photo["title"].strip() 32 | photo["date"] = text.parse_datetime( 33 | photo["date"], "%Y-%m-%dT%H:%M:%S.%f%z") 34 | 35 | yield Message.Directory, photo 36 | yield Message.Url, url, text.nameext_from_url(url, photo) 37 | 38 | def photos(self): 39 | url = "https://api.vogue.com/production/photos" 40 | params = { 41 | "count": "50", 42 | "order_by": "DESC", 43 | "page": 0, 44 | "photographer_id": self.user_id, 45 | } 46 | 47 | while True: 48 | data = self.request(url, params=params).json() 49 | yield from data["items"] 50 | 51 | if not data["has_next"]: 52 | break 53 | params["page"] += 1 54 | -------------------------------------------------------------------------------- /gallery_dl/extractor/recursive.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Copyright 2015-2023 Mike Fährmann 4 | # 5 | # This program is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License version 2 as 7 | # published by the Free Software Foundation. 8 | 9 | """Recursive extractor""" 10 | 11 | from .common import Extractor, Message 12 | from .. import text 13 | import re 14 | 15 | 16 | class RecursiveExtractor(Extractor): 17 | """Extractor that fetches URLs from a remote or local source""" 18 | category = "recursive" 19 | pattern = r"r(?:ecursive)?:" 20 | example = "recursive:https://pastebin.com/raw/FLwrCYsT" 21 | 22 | def items(self): 23 | url = self.url.partition(":")[2] 24 | 25 | if url.startswith("file://"): 26 | with open(url[7:]) as fp: 27 | page = fp.read() 28 | else: 29 | page = self.request(text.ensure_http_scheme(url)).text 30 | 31 | for match in re.finditer(r"https?://[^\s\"']+", page): 32 | yield Message.Queue, match.group(0), {} 33 | -------------------------------------------------------------------------------- /gallery_dl/extractor/senmanga.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Copyright 2016-2023 Mike Fährmann 4 | # 5 | # This program is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License version 2 as 7 | # published by the Free Software Foundation. 8 | 9 | """Extractors for https://raw.senmanga.com/""" 10 | 11 | from .common import ChapterExtractor 12 | from .. import text 13 | 14 | 15 | class SenmangaChapterExtractor(ChapterExtractor): 16 | """Extractor for manga chapters from raw.senmanga.com""" 17 | category = "senmanga" 18 | root = "https://raw.senmanga.com" 19 | pattern = r"(?:https?://)?raw\.senmanga\.com(/[^/?#]+/[^/?#]+)" 20 | example = "https://raw.senmanga.com/MANGA/CHAPTER" 21 | 22 | def _init(self): 23 | self.session.headers["Referer"] = self.gallery_url 24 | 25 | # select "All pages" viewer 26 | self.cookies.set("viewer", "1", domain="raw.senmanga.com") 27 | 28 | def metadata(self, page): 29 | title = text.extr(page, "", "") 30 | manga, _, chapter = title.partition(" - Chapter ") 31 | 32 | return { 33 | "manga" : text.unescape(manga).replace("-", " "), 34 | "chapter" : chapter.partition(" - Page ")[0], 35 | "chapter_minor": "", 36 | "lang" : "ja", 37 | "language" : "Japanese", 38 | } 39 | 40 | def images(self, page): 41 | return [ 42 | (text.ensure_http_scheme(url), None) 43 | for url in text.extract_iter( 44 | page, '", "<").strip()), 39 | "artists" : text.split_html(extr( 40 | "", "")), 41 | "genres" : text.split_html(extr( 42 | "", "")), 43 | "tags" : text.split_html(extr( 44 | "", "")), 45 | "uploader" : text.remove_html(extr( 46 | "", "")), 47 | "language" : extr(" ", "\n"), 48 | } 49 | -------------------------------------------------------------------------------- /gallery_dl/extractor/urlshortener.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | """Extractors for general-purpose URL shorteners""" 8 | 9 | from .common import BaseExtractor, Message 10 | from .. import exception 11 | 12 | 13 | class UrlshortenerExtractor(BaseExtractor): 14 | """Base class for URL shortener extractors""" 15 | basecategory = "urlshortener" 16 | 17 | 18 | BASE_PATTERN = UrlshortenerExtractor.update({ 19 | "bitly": { 20 | "root": "https://bit.ly", 21 | "pattern": r"bit\.ly", 22 | }, 23 | "tco": { 24 | # t.co sends 'http-equiv="refresh"' (200) when using browser UA 25 | "headers": {"User-Agent": None}, 26 | "root": "https://t.co", 27 | "pattern": r"t\.co", 28 | }, 29 | }) 30 | 31 | 32 | class UrlshortenerLinkExtractor(UrlshortenerExtractor): 33 | """Extractor for general-purpose URL shorteners""" 34 | subcategory = "link" 35 | pattern = BASE_PATTERN + r"(/[^/?#]+)" 36 | example = "https://bit.ly/abcde" 37 | 38 | def items(self): 39 | url = self.root + self.groups[-1] 40 | location = self.request_location( 41 | url, headers=self.config_instance("headers"), notfound="URL") 42 | if not location: 43 | raise exception.StopExtraction("Unable to resolve short URL") 44 | yield Message.Queue, location, {} 45 | -------------------------------------------------------------------------------- /gallery_dl/extractor/wallpapercave.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Copyright 2021 David Hoppenbrouwers 4 | # Copyright 2023 Mike Fährmann 5 | # 6 | # This program is free software; you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License version 2 as 8 | # published by the Free Software Foundation. 9 | 10 | """Extractors for https://wallpapercave.com/""" 11 | 12 | from .common import Extractor, Message 13 | from .. import text 14 | 15 | 16 | class WallpapercaveImageExtractor(Extractor): 17 | """Extractor for images on wallpapercave.com""" 18 | category = "wallpapercave" 19 | subcategory = "image" 20 | root = "https://wallpapercave.com" 21 | pattern = r"(?:https?://)?(?:www\.)?wallpapercave\.com/" 22 | example = "https://wallpapercave.com/w/wp12345" 23 | 24 | def items(self): 25 | page = self.request(text.ensure_http_scheme(self.url)).text 26 | 27 | path = None 28 | for path in text.extract_iter(page, 'class="download" href="', '"'): 29 | image = text.nameext_from_url(path) 30 | yield Message.Directory, image 31 | yield Message.Url, self.root + path, image 32 | 33 | if path is None: 34 | try: 35 | path = text.rextr( 36 | page, 'href="', '"', page.index('id="tdownload"'), None) 37 | except Exception: 38 | pass 39 | else: 40 | image = text.nameext_from_url(path) 41 | yield Message.Directory, image 42 | yield Message.Url, self.root + path, image 43 | 44 | if path is None: 45 | for wp in text.extract_iter( 46 | page, 'class="wallpaper" id="wp', ''): 47 | path = text.rextr(wp, ' src="', '"') 48 | if path: 49 | image = text.nameext_from_url(path) 50 | yield Message.Directory, image 51 | yield Message.Url, self.root + path, image 52 | -------------------------------------------------------------------------------- /gallery_dl/postprocessor/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Copyright 2018-2023 Mike Fährmann 4 | # 5 | # This program is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License version 2 as 7 | # published by the Free Software Foundation. 8 | 9 | """Post-processing modules""" 10 | 11 | modules = [ 12 | "classify", 13 | "compare", 14 | "directory", 15 | "exec", 16 | "hash", 17 | "metadata", 18 | "mtime", 19 | "python", 20 | "rename", 21 | "ugoira", 22 | "zip", 23 | ] 24 | 25 | 26 | def find(name): 27 | """Return a postprocessor class with the given name""" 28 | try: 29 | return _cache[name] 30 | except KeyError: 31 | pass 32 | 33 | cls = None 34 | if name in modules: # prevent unwanted imports 35 | try: 36 | module = __import__(name, globals(), None, (), 1) 37 | except ImportError: 38 | pass 39 | else: 40 | cls = module.__postprocessor__ 41 | _cache[name] = cls 42 | return cls 43 | 44 | 45 | # -------------------------------------------------------------------- 46 | # internals 47 | 48 | _cache = {} 49 | -------------------------------------------------------------------------------- /gallery_dl/postprocessor/directory.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Copyright 2025 Mike Fährmann 4 | # 5 | # This program is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License version 2 as 7 | # published by the Free Software Foundation. 8 | 9 | """Trigger directory format string evaluation""" 10 | 11 | from .common import PostProcessor 12 | 13 | 14 | class DirectoryPP(PostProcessor): 15 | 16 | def __init__(self, job, options): 17 | PostProcessor.__init__(self, job) 18 | 19 | events = options.get("event") 20 | if events is None: 21 | events = ("prepare",) 22 | elif isinstance(events, str): 23 | events = events.split(",") 24 | job.register_hooks({event: self.run for event in events}, options) 25 | 26 | def run(self, pathfmt): 27 | pathfmt.set_directory(pathfmt.kwdict) 28 | 29 | 30 | __postprocessor__ = DirectoryPP 31 | -------------------------------------------------------------------------------- /gallery_dl/postprocessor/mtime.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Copyright 2019-2022 Mike Fährmann 4 | # 5 | # This program is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License version 2 as 7 | # published by the Free Software Foundation. 8 | 9 | """Use metadata as file modification time""" 10 | 11 | from .common import PostProcessor 12 | from .. import text, util, formatter 13 | from datetime import datetime 14 | 15 | 16 | class MtimePP(PostProcessor): 17 | 18 | def __init__(self, job, options): 19 | PostProcessor.__init__(self, job) 20 | value = options.get("value") 21 | if value: 22 | self._get = formatter.parse(value, None, util.identity).format_map 23 | else: 24 | key = options.get("key", "date") 25 | self._get = lambda kwdict: kwdict.get(key) 26 | 27 | events = options.get("event") 28 | if events is None: 29 | events = ("file",) 30 | elif isinstance(events, str): 31 | events = events.split(",") 32 | job.register_hooks({event: self.run for event in events}, options) 33 | 34 | def run(self, pathfmt): 35 | mtime = self._get(pathfmt.kwdict) 36 | if mtime is None: 37 | return 38 | 39 | pathfmt.kwdict["_mtime"] = ( 40 | util.datetime_to_timestamp(mtime) 41 | if isinstance(mtime, datetime) else 42 | text.parse_int(mtime) 43 | ) 44 | 45 | 46 | __postprocessor__ = MtimePP 47 | -------------------------------------------------------------------------------- /gallery_dl/postprocessor/python.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Copyright 2023 Mike Fährmann 4 | # 5 | # This program is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License version 2 as 7 | # published by the Free Software Foundation. 8 | 9 | """Run Python functions""" 10 | 11 | from .common import PostProcessor 12 | from .. import util 13 | 14 | 15 | class PythonPP(PostProcessor): 16 | 17 | def __init__(self, job, options): 18 | PostProcessor.__init__(self, job) 19 | 20 | spec = options["function"] 21 | module_name, _, function_name = spec.rpartition(":") 22 | module = util.import_file(module_name) 23 | self.function = getattr(module, function_name) 24 | 25 | if self._init_archive(job, options): 26 | self.run = self.run_archive 27 | 28 | events = options.get("event") 29 | if events is None: 30 | events = ("file",) 31 | elif isinstance(events, str): 32 | events = events.split(",") 33 | job.register_hooks({event: self.run for event in events}, options) 34 | 35 | def run(self, pathfmt): 36 | self.function(pathfmt.kwdict) 37 | 38 | def run_archive(self, pathfmt): 39 | kwdict = pathfmt.kwdict 40 | if self.archive.check(kwdict): 41 | return 42 | self.function(kwdict) 43 | self.archive.add(kwdict) 44 | 45 | 46 | __postprocessor__ = PythonPP 47 | -------------------------------------------------------------------------------- /gallery_dl/version.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Copyright 2016-2025 Mike Fährmann 4 | # 5 | # This program is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License version 2 as 7 | # published by the Free Software Foundation. 8 | 9 | __version__ = "1.30.0-dev" 10 | __variant__ = None 11 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = ["setuptools"] 3 | build-backend = "setuptools.build_meta" 4 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | requests>=2.11.0 2 | -------------------------------------------------------------------------------- /scripts/build_testresult_db.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | 4 | """Collect results of extractor unit tests""" 5 | 6 | import sys 7 | import os.path 8 | import datetime 9 | 10 | import util 11 | from gallery_dl import extractor, job, config 12 | from test.test_results import setup_test_config 13 | 14 | 15 | # filter test cases 16 | 17 | tests = [ 18 | (idx, extr, url, result) 19 | 20 | for extr in extractor.extractors() 21 | if hasattr(extr, "test") and extr.test 22 | if len(sys.argv) <= 1 or extr.category in sys.argv 23 | 24 | for idx, (url, result) in enumerate(extr._get_tests()) 25 | if result 26 | ] 27 | 28 | 29 | # setup target directory 30 | 31 | path = util.path("archive", "testdb", str(datetime.date.today())) 32 | os.makedirs(path, exist_ok=True) 33 | 34 | 35 | for idx, extr, url, result in tests: 36 | 37 | # filename 38 | name = "{}-{}-{}.json".format(extr.category, extr.subcategory, idx) 39 | print(name) 40 | 41 | # config values 42 | setup_test_config() 43 | 44 | if "options" in result: 45 | for key, value in result["options"]: 46 | key = key.split(".") 47 | config.set(key[:-1], key[-1], value) 48 | if "range" in result: 49 | config.set((), "image-range" , result["range"]) 50 | config.set((), "chapter-range", result["range"]) 51 | 52 | # write test data 53 | try: 54 | with open(os.path.join(path, name), "w") as outfile: 55 | job.DataJob(url, file=outfile, ensure_ascii=False).run() 56 | except KeyboardInterrupt: 57 | sys.exit() 58 | -------------------------------------------------------------------------------- /scripts/completion_bash.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | 4 | # Copyright 2019 Mike Fährmann 5 | # 6 | # This program is free software; you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License version 2 as 8 | # published by the Free Software Foundation. 9 | 10 | """Generate bash completion script from gallery-dl's argument parser""" 11 | 12 | import util 13 | from gallery_dl import option 14 | 15 | 16 | TEMPLATE = """_gallery_dl() 17 | { 18 | local cur prev 19 | COMPREPLY=() 20 | cur="${COMP_WORDS[COMP_CWORD]}" 21 | prev="${COMP_WORDS[COMP_CWORD-1]}" 22 | 23 | if [[ "${prev}" =~ ^(%(fileopts)s)$ ]]; then 24 | COMPREPLY=( $(compgen -f -- "${cur}") ) 25 | elif [[ "${prev}" =~ ^(%(diropts)s)$ ]]; then 26 | COMPREPLY=( $(compgen -d -- "${cur}") ) 27 | else 28 | COMPREPLY=( $(compgen -W "%(opts)s" -- "${cur}") ) 29 | fi 30 | } 31 | 32 | complete -F _gallery_dl gallery-dl 33 | """ 34 | 35 | opts = [] 36 | diropts = [] 37 | fileopts = [] 38 | for action in option.build_parser()._actions: 39 | 40 | if action.metavar in ("DEST",): 41 | diropts.extend(action.option_strings) 42 | 43 | elif action.metavar in ("FILE", "CFG"): 44 | fileopts.extend(action.option_strings) 45 | 46 | for opt in action.option_strings: 47 | if opt.startswith("--"): 48 | opts.append(opt) 49 | 50 | PATH = util.path("data/completion/gallery-dl") 51 | with util.lazy(PATH) as fp: 52 | fp.write(TEMPLATE % { 53 | "opts" : " ".join(opts), 54 | "diropts" : "|".join(diropts), 55 | "fileopts": "|".join(fileopts), 56 | }) 57 | -------------------------------------------------------------------------------- /scripts/completion_fish.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | 4 | # This program is free software; you can redistribute it and/or modify 5 | # it under the terms of the GNU General Public License version 2 as 6 | # published by the Free Software Foundation. 7 | 8 | """Generate fish completion script from gallery-dl's argument parser""" 9 | 10 | import util 11 | from gallery_dl import option 12 | 13 | 14 | TEMPLATE = """complete -c gallery-dl -x 15 | %(opts)s 16 | """ 17 | 18 | opts = [] 19 | for action in option.build_parser()._actions: 20 | if not action.option_strings: 21 | continue 22 | 23 | opt = "complete -c gallery-dl" 24 | 25 | if action.metavar: 26 | if action.metavar == "FILE": 27 | opt += " -r -F" 28 | elif action.metavar == "PATH": 29 | opt += " -x -a '(__fish_complete_directories)'" 30 | else: 31 | opt += " -x" 32 | 33 | for optstr in action.option_strings: 34 | if optstr.startswith("--"): 35 | opt += " -l '" + optstr[2:] + "'" 36 | else: 37 | opt += " -s '" + optstr[1:] + "'" 38 | 39 | opt += " -d '" + action.help.replace("'", '"') + "'" 40 | 41 | opts.append(opt) 42 | 43 | PATH = util.path("data/completion/gallery-dl.fish") 44 | with util.lazy(PATH) as fp: 45 | fp.write(TEMPLATE % {"opts": "\n".join(opts)}) 46 | -------------------------------------------------------------------------------- /scripts/completion_zsh.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | 4 | # Copyright 2020 Mike Fährmann 5 | # 6 | # This program is free software; you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License version 2 as 8 | # published by the Free Software Foundation. 9 | 10 | """Generate zsh completion script from gallery-dl's argument parser""" 11 | 12 | import util 13 | import argparse 14 | from gallery_dl import option 15 | 16 | TEMPLATE = """#compdef gallery-dl 17 | 18 | local curcontext="$curcontext" 19 | typeset -A opt_args 20 | 21 | local rc=1 22 | _arguments -s -S \\ 23 | %(opts)s && rc=0 24 | 25 | return rc 26 | """ 27 | 28 | TR = str.maketrans({ 29 | "'": "'\\''", 30 | "[": "\\[", 31 | "]": "\\]", 32 | }) 33 | 34 | 35 | opts = [] 36 | for action in option.build_parser()._actions: 37 | 38 | if not action.option_strings or action.help == argparse.SUPPRESS: 39 | continue 40 | elif len(action.option_strings) == 1: 41 | opt = action.option_strings[0] 42 | else: 43 | opt = "{" + ",".join(action.option_strings) + "}" 44 | 45 | opt += "'[" + action.help.translate(TR) + "]'" 46 | 47 | if action.metavar: 48 | opt += ":'<" + action.metavar.lower() + ">'" 49 | if action.metavar in ("FILE", "CFG", "DEST"): 50 | opt += ":_files" 51 | 52 | opts.append(opt) 53 | 54 | 55 | PATH = util.path("data/completion/_gallery-dl") 56 | with util.lazy(PATH) as fp: 57 | fp.write(TEMPLATE % {"opts": " \\\n".join(opts)}) 58 | -------------------------------------------------------------------------------- /scripts/create_test_data.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | 4 | # Copyright 2015-2019 Mike Fährmann 5 | # 6 | # This program is free software; you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License version 2 as 8 | # published by the Free Software Foundation. 9 | 10 | """Create testdata for extractor tests""" 11 | 12 | import argparse 13 | 14 | import util # noqa 15 | from gallery_dl import extractor 16 | from test.test_results import ResultJob, setup_test_config 17 | 18 | 19 | TESTDATA_FMT = """ 20 | test = ("{}", {{ 21 | "url": "{}", 22 | "keyword": "{}", 23 | "content": "{}", 24 | }}) 25 | """ 26 | 27 | TESTDATA_EXCEPTION_FMT = """ 28 | test = ("{}", {{ 29 | "exception": exception.{}, 30 | }}) 31 | """ 32 | 33 | 34 | def main(): 35 | parser = argparse.ArgumentParser() 36 | parser.add_argument("--content", action="store_true") 37 | parser.add_argument("--recreate", action="store_true") 38 | parser.add_argument("urls", nargs="*") 39 | args = parser.parse_args() 40 | 41 | if args.recreate: 42 | urls = [ 43 | test[0] 44 | for extr in extractor.extractors() if extr.category in args.urls 45 | for test in extr.test 46 | ] 47 | else: 48 | urls = args.urls 49 | 50 | setup_test_config() 51 | 52 | for url in urls: 53 | tjob = ResultJob(url, content=args.content) 54 | try: 55 | tjob.run() 56 | except Exception as exc: 57 | fmt = TESTDATA_EXCEPTION_FMT 58 | data = (exc.__class__.__name__,) 59 | else: 60 | fmt = TESTDATA_FMT 61 | data = (tjob.url_hash.hexdigest(), 62 | tjob.kwdict_hash.hexdigest(), 63 | tjob.content_hash.hexdigest()) 64 | print(tjob.extractor.__class__.__name__) 65 | print(fmt.format(url, *data)) 66 | 67 | 68 | if __name__ == '__main__': 69 | main() 70 | -------------------------------------------------------------------------------- /scripts/hook-gallery_dl.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from gallery_dl import extractor, downloader, postprocessor 4 | 5 | hiddenimports = [ 6 | package.__name__ + "." + module 7 | for package in (extractor, downloader, postprocessor) 8 | for module in package.modules 9 | ] 10 | 11 | hiddenimports.append("yt_dlp") 12 | -------------------------------------------------------------------------------- /scripts/options.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | 4 | # Copyright 2023 Mike Fährmann 5 | # 6 | # This program is free software; you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License version 2 as 8 | # published by the Free Software Foundation. 9 | 10 | """Generate a document listing gallery-dl's command-line arguments""" 11 | 12 | import os 13 | import re 14 | import sys 15 | 16 | import util 17 | 18 | import gallery_dl.util 19 | gallery_dl.util.EXECUTABLE = True 20 | from gallery_dl import option # noqa E402 21 | 22 | 23 | TEMPLATE = """# Command-Line Options 24 | 25 | 26 | 27 | {}""" 28 | 29 | 30 | parser = option.build_parser() 31 | parser.usage = "" 32 | 33 | opts = parser.format_help() 34 | opts = opts[8:] # strip 'usage' 35 | opts = re.sub(r"(?m)^(\w+.*)", "## \\1", opts) # group names to headings 36 | opts = opts.replace("\n ", "\n ") # indent by 4 37 | 38 | 39 | PATH = (sys.argv[1] if len(sys.argv) > 1 else 40 | util.path("docs", "options.md")) 41 | with util.lazy(PATH) as fp: 42 | fp.write(TEMPLATE.format( 43 | "/".join(os.path.normpath(__file__).split(os.sep)[-2:]), 44 | opts, 45 | )) 46 | -------------------------------------------------------------------------------- /scripts/pull-request: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | RE="https://github.com/([^/?#]+)/([^/?#]+)(/tree/(.+))?" 5 | if [[ "$1" =~ $RE ]]; then 6 | USER="${BASH_REMATCH[1]}" 7 | REPO="${BASH_REMATCH[2]}" 8 | BRANCH="${BASH_REMATCH[4]:-master}" 9 | 10 | else 11 | echo "invalid github repository identifier: '$1'" 12 | exit 1 13 | 14 | fi 15 | 16 | 17 | call() { echo "$@"; "$@"; echo; } 18 | 19 | # {x,,} transforms value to lowercase 20 | case "${2,,}" in 21 | 22 | ""|"f"|"fetch") 23 | call git remote add "$USER" git@github.com:"$USER"/"$REPO".git || true 24 | call git fetch "$USER" "$BRANCH" 25 | call git branch "$USER-$BRANCH" "$USER/$BRANCH" || true 26 | call git switch "$USER-$BRANCH" 27 | ;; 28 | 29 | "m"|"merge") 30 | RE='\s*(.+)\s+#([0-9]+)' 31 | if [[ "$3" =~ $RE ]]; then 32 | TITLE="${BASH_REMATCH[1]}" 33 | PULL="${BASH_REMATCH[2]}" 34 | fi 35 | 36 | call git switch master 37 | call git merge --no-ff --edit -m "merge #${PULL-_}: ${TITLE-_}" "$USER-$BRANCH" 38 | call git branch -d "$USER-$BRANCH" 39 | ;; 40 | 41 | "p"|"push") 42 | call git push "$USER" HEAD:"$BRANCH" 43 | ;; 44 | 45 | "pf"|"push-force") 46 | call git push --force "$USER" HEAD:"$BRANCH" 47 | ;; 48 | 49 | "d"|"delete") 50 | call git switch master 51 | call git branch -D "$USER-$BRANCH" 52 | call git remote remove "$USER" 53 | ;; 54 | 55 | *) 56 | echo "invalid action: '$2'" 57 | exit 2 58 | ;; 59 | 60 | esac 61 | -------------------------------------------------------------------------------- /scripts/pyinstaller.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | 4 | """Build a standalone executable using PyInstaller""" 5 | 6 | import argparse 7 | import util 8 | import sys 9 | 10 | 11 | def main(): 12 | parser = argparse.ArgumentParser() 13 | parser.add_argument("-o", "--os") 14 | parser.add_argument("-a", "--arch") 15 | parser.add_argument("-l", "--label") 16 | parser.add_argument("-e", "--extension") 17 | parser.add_argument("-p", "--print", action="store_true") 18 | args = parser.parse_args() 19 | 20 | if args.label: 21 | label = args.label 22 | else: 23 | label = "" 24 | if args.os: 25 | os = args.os.partition("-")[0].lower() 26 | if os == "ubuntu": 27 | os = "linux" 28 | label += os 29 | if args.arch == "x86": 30 | label += "_x86" 31 | 32 | if args.print: 33 | return print(label) 34 | 35 | name = "gallery-dl" 36 | if label: 37 | name = "{}_{}".format(name, label) 38 | if args.extension: 39 | name = "{}.{}".format(name, args.extension.lower()) 40 | 41 | import PyInstaller.__main__ 42 | return PyInstaller.__main__.run([ 43 | "--onefile", 44 | "--console", 45 | "--name", name, 46 | 47 | # https://github.com/pyinstaller/pyinstaller/issues/9149 48 | "--exclude-module", "pkg_resources", 49 | 50 | "--additional-hooks-dir", util.path("scripts"), 51 | "--distpath", util.path("dist"), 52 | "--workpath", util.path("build"), 53 | "--specpath", util.path("build"), 54 | util.path("gallery_dl", "__main__.py"), 55 | ]) 56 | 57 | 58 | if __name__ == "__main__": 59 | sys.exit(main()) 60 | -------------------------------------------------------------------------------- /scripts/run_tests.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | 4 | # Copyright 2021 Mike Fährmann 5 | # 6 | # This program is free software; you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License version 2 as 8 | # published by the Free Software Foundation. 9 | 10 | import os 11 | import sys 12 | import unittest 13 | 14 | TEST_DIRECTORY = os.path.join( 15 | os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "test") 16 | 17 | sys.path.insert(0, TEST_DIRECTORY) 18 | 19 | if len(sys.argv) <= 1: 20 | TESTS = [ 21 | file.rpartition(".")[0] 22 | for file in os.listdir(TEST_DIRECTORY) 23 | if file.startswith("test_") and file != "test_results.py" 24 | ] 25 | else: 26 | TESTS = [ 27 | name if name.startswith("test_") else "test_" + name 28 | for name in sys.argv[1:] 29 | ] 30 | 31 | 32 | suite = unittest.TestSuite() 33 | 34 | for test in TESTS: 35 | try: 36 | module = __import__(test) 37 | except ImportError: 38 | print("unable to import", test) 39 | else: 40 | tests = unittest.defaultTestLoader.loadTestsFromModule(module) 41 | suite.addTests(tests) 42 | 43 | if __name__ == "__main__": 44 | result = unittest.TextTestRunner(verbosity=2).run(suite) 45 | if result.errors or result.failures: 46 | sys.exit(1) 47 | -------------------------------------------------------------------------------- /scripts/util.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | import os 8 | import io 9 | import sys 10 | 11 | ROOTDIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 12 | sys.path.insert(0, os.path.realpath(ROOTDIR)) 13 | 14 | 15 | def path(*segments, join=os.path.join): 16 | result = join(ROOTDIR, *segments) 17 | os.makedirs(os.path.dirname(result), exist_ok=True) 18 | return result 19 | 20 | 21 | class lazy(): 22 | 23 | def __init__(self, path): 24 | self.path = path 25 | self.buffer = io.StringIO() 26 | 27 | def __enter__(self): 28 | return self.buffer 29 | 30 | def __exit__(self, exc_type, exc_value, traceback): 31 | # get content of old file 32 | try: 33 | with open(self.path, encoding="utf-8") as fp: 34 | old = fp.read() 35 | except Exception: 36 | old = None 37 | 38 | # get new content 39 | new = self.buffer.getvalue() 40 | 41 | if new != old: 42 | # rewrite entire file 43 | with open(self.path, "w", encoding="utf-8") as fp: 44 | fp.write(new) 45 | else: 46 | # only update atime and mtime 47 | os.utime(self.path) 48 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [flake8] 2 | exclude = .git,__pycache__,build,dist,archive 3 | ignore = E203,E226,W504 4 | per-file-ignores = 5 | setup.py: E501 6 | gallery_dl/extractor/500px.py: E501 7 | gallery_dl/extractor/mangapark.py: E501 8 | test/results/*.py: E122,E241,E402,E501 9 | -------------------------------------------------------------------------------- /snap/local/launchers/gallery-dl-launch: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # This is the maintenance launcher for the snap, make necessary runtime environment changes to make the snap work here. You may also insert security confinement/deprecation/obsoletion notice of the snap here. 3 | 4 | set \ 5 | -o errexit \ 6 | -o errtrace \ 7 | -o nounset \ 8 | -o pipefail 9 | 10 | # Use user's real home directory for canonical configuration path access 11 | declare REALHOME="$( 12 | getent passwd "${USER}" \ 13 | | cut --delimiter=: --fields=6 14 | )" 15 | HOME="${REALHOME}" 16 | 17 | if ! test -f "${SNAP_USER_COMMON}"/marker_disable_interface_warning; then 18 | # Warn if the `removable-media` interface isn't connected 19 | if ! ls /media &>/dev/null; then 20 | printf -- \ 21 | "It seems that this snap isn't connected to the \`removable-media\` security confinement interface. If you want to save the files under \`/media\`, \`/run/media\`, or \`/mnt\` directories you need to connect this snap to the \`removable-media\` interface by running the following command in a terminal:\\n\\n sudo snap connect %s:removable-media\\n\\n" \ 22 | "${SNAP_NAME}" \ 23 | >&2 24 | printf -- \ 25 | "To disable this warning create an empty file at the following path:\\n\\n %s/marker_disable_interface_warning\\n\\n" \ 26 | "${SNAP_USER_COMMON}" \ 27 | >&2 28 | fi 29 | fi 30 | 31 | # Finally run the next part of the command chain 32 | exec "${@}" 33 | -------------------------------------------------------------------------------- /test/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mikf/gallery-dl/0b0152b3475f0c3a8ae283840e327c2c3d52859c/test/__init__.py -------------------------------------------------------------------------------- /test/results/2ch.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | gallery_dl = __import__("gallery_dl.extractor.2ch") 8 | _2ch = getattr(gallery_dl.extractor, "2ch") 9 | 10 | 11 | __tests__ = ( 12 | { 13 | "#url" : "https://2ch.hk/a/res/6202876.html", 14 | "#category": ("", "2ch", "thread"), 15 | "#class" : _2ch._2chThreadExtractor, 16 | "#pattern" : r"https://2ch\.hk/a/src/6202876/\d+\.\w+", 17 | "#count" : range(450, 1000), 18 | 19 | "banned" : 0, 20 | "board" : "a", 21 | "closed" : 0, 22 | "comment" : str, 23 | "date" : "type:datetime", 24 | "displayname": str, 25 | "email" : str, 26 | "endless" : 1, 27 | "extension": str, 28 | "filename" : str, 29 | "fullname" : str, 30 | "height" : int, 31 | "lasthit" : range(1705000000, 1900000000), 32 | "md5" : r"re:[0-9a-f]{32}", 33 | "name" : r"re:\d+\.\w+", 34 | "num" : int, 35 | "number" : range(1, 1000), 36 | "op" : 0, 37 | "parent" : int, 38 | "path" : r"re:/a/src/6202876/\d+\.\w+", 39 | "post_name": str, 40 | "size" : int, 41 | "sticky" : 0, 42 | "subject" : str, 43 | "thread" : "6202876", 44 | "thumbnail": str, 45 | "tim" : r"re:\d+", 46 | "timestamp": int, 47 | "title" : "MP4/WEBM", 48 | "tn_height": int, 49 | "tn_width" : int, 50 | "trip" : "", 51 | "type" : int, 52 | "views" : int, 53 | "width" : int, 54 | }, 55 | 56 | { 57 | "#url" : "https://2ch.hk/a/", 58 | "#category": ("", "2ch", "board"), 59 | "#class" : _2ch._2chBoardExtractor, 60 | "#pattern" : _2ch._2chThreadExtractor.pattern, 61 | "#count" : range(200, 400), 62 | }, 63 | 64 | ) 65 | -------------------------------------------------------------------------------- /test/results/2chan.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | gallery_dl = __import__("gallery_dl.extractor.2chan") 8 | _2chan = getattr(gallery_dl.extractor, "2chan") 9 | 10 | 11 | __tests__ = ( 12 | { 13 | "#url" : "https://dec.2chan.net/70/res/17222.htm", 14 | "#category": ("", "2chan", "thread"), 15 | "#class" : _2chan._2chanThreadExtractor, 16 | "#pattern" : r"https://dec\.2chan\.net/70/src/\d{13}\.jpg", 17 | "#count" : ">= 2", 18 | 19 | "board" : "70", 20 | "board_name": "新板提案", 21 | "com" : str, 22 | "fsize" : r"re:\d+", 23 | "name" : "名無し", 24 | "no" : r"re:17\d\d\d", 25 | "now" : r"re:2[34]/../..\(.\)..:..:..", 26 | "post" : "無題", 27 | "server" : "dec", 28 | "thread" : "17222", 29 | "tim" : r"re:^\d{13}$", 30 | "time" : r"re:^\d{10}$", 31 | "title" : "画像会話板", 32 | }, 33 | 34 | ) 35 | -------------------------------------------------------------------------------- /test/results/2chen.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | gallery_dl = __import__("gallery_dl.extractor.2chen") 8 | _2chen = getattr(gallery_dl.extractor, "2chen") 9 | import datetime 10 | 11 | 12 | __tests__ = ( 13 | { 14 | "#url" : "https://sturdychan.help/tv/268929", 15 | "#category": ("", "2chen", "thread"), 16 | "#class" : _2chen._2chenThreadExtractor, 17 | "#pattern" : r"https://sturdychan\.help/assets/images/src/\w{40}\.\w+$", 18 | "#count" : ">= 179", 19 | 20 | "board" : "tv", 21 | "date" : datetime.datetime, 22 | "hash" : r"re:[0-9a-f]{40}", 23 | "name" : "Anonymous", 24 | "no" : r"re:\d+", 25 | "thread": "268929", 26 | "time" : int, 27 | "title" : "「/ttg/ #118: 🇧🇷 edition」", 28 | "url" : str, 29 | }, 30 | 31 | { 32 | "#url" : "https://2chen.club/tv/1", 33 | "#category": ("", "2chen", "thread"), 34 | "#class" : _2chen._2chenThreadExtractor, 35 | }, 36 | 37 | { 38 | "#url" : "https://2chen.moe/jp/303786", 39 | "#category": ("", "2chen", "thread"), 40 | "#class" : _2chen._2chenThreadExtractor, 41 | }, 42 | 43 | { 44 | "#url" : "https://sturdychan.help/co/", 45 | "#category": ("", "2chen", "board"), 46 | "#class" : _2chen._2chenBoardExtractor, 47 | "#pattern" : _2chen._2chenThreadExtractor.pattern, 48 | }, 49 | 50 | { 51 | "#url" : "https://2chen.moe/co", 52 | "#category": ("", "2chen", "board"), 53 | "#class" : _2chen._2chenBoardExtractor, 54 | }, 55 | 56 | { 57 | "#url" : "https://2chen.club/tv", 58 | "#category": ("", "2chen", "board"), 59 | "#class" : _2chen._2chenBoardExtractor, 60 | }, 61 | 62 | { 63 | "#url" : "https://2chen.moe/co/catalog", 64 | "#category": ("", "2chen", "board"), 65 | "#class" : _2chen._2chenBoardExtractor, 66 | }, 67 | 68 | ) 69 | -------------------------------------------------------------------------------- /test/results/3dbooru.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | gallery_dl = __import__("gallery_dl.extractor.3dbooru") 8 | _3dbooru = getattr(gallery_dl.extractor, "3dbooru") 9 | 10 | 11 | __tests__ = ( 12 | { 13 | "#url" : "http://behoimi.org/post?tags=himekawa_azuru+dress", 14 | "#category": ("booru", "3dbooru", "tag"), 15 | "#class" : _3dbooru._3dbooruTagExtractor, 16 | "#sha1_url" : "ecb30c6aaaf8a6ff8f55255737a9840832a483c1", 17 | "#sha1_content": "11cbda40c287e026c1ce4ca430810f761f2d0b2a", 18 | }, 19 | 20 | { 21 | "#url" : "http://behoimi.org/pool/show/27", 22 | "#category": ("booru", "3dbooru", "pool"), 23 | "#class" : _3dbooru._3dbooruPoolExtractor, 24 | "#sha1_url" : "da75d2d1475449d5ef0c266cb612683b110a30f2", 25 | "#sha1_content": "fd5b37c5c6c2de4b4d6f1facffdefa1e28176554", 26 | }, 27 | 28 | { 29 | "#url" : "http://behoimi.org/post/show/140852", 30 | "#category": ("booru", "3dbooru", "post"), 31 | "#class" : _3dbooru._3dbooruPostExtractor, 32 | "#options" : {"tags": True}, 33 | "#sha1_url" : "ce874ea26f01d6c94795f3cc3aaaaa9bc325f2f6", 34 | "#sha1_content": "26549d55b82aa9a6c1686b96af8bfcfa50805cd4", 35 | 36 | "tags_character": "furude_rika", 37 | "tags_copyright": "higurashi_no_naku_koro_ni", 38 | "tags_model" : "himekawa_azuru", 39 | "tags_general" : str, 40 | }, 41 | 42 | { 43 | "#url" : "http://behoimi.org/post/popular_by_month?month=2&year=2013", 44 | "#category": ("booru", "3dbooru", "popular"), 45 | "#class" : _3dbooru._3dbooruPopularExtractor, 46 | "#pattern" : r"http://behoimi\.org/data/../../[0-9a-f]{32}\.jpg", 47 | "#count" : 20, 48 | }, 49 | 50 | ) 51 | -------------------------------------------------------------------------------- /test/results/4archive.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | gallery_dl = __import__("gallery_dl.extractor.4archive") 8 | _4archive = getattr(gallery_dl.extractor, "4archive") 9 | import datetime 10 | 11 | 12 | __tests__ = ( 13 | { 14 | "#url" : "https://4archive.org/board/u/thread/2397221", 15 | "#category": ("", "4archive", "thread"), 16 | "#class" : _4archive._4archiveThreadExtractor, 17 | "#pattern" : r"https://(cdn\.4archive\.org/u/image/150\d/\d\d\d/\d+\.\w+|4archive\.org/image/image-404\.png)", 18 | "#count" : 16, 19 | 20 | "board" : "u", 21 | "com" : str, 22 | "date" : datetime.datetime, 23 | "name" : "Anonymous", 24 | "no" : range(2397221, 2418158), 25 | "thread": 2397221, 26 | "time" : int, 27 | "title" : "best anime", 28 | "url" : str, 29 | "width" : int, 30 | "height": int, 31 | "size" : int, 32 | }, 33 | 34 | { 35 | "#url" : "https://4archive.org/board/jp/thread/17611798", 36 | "#category": ("", "4archive", "thread"), 37 | "#class" : _4archive._4archiveThreadExtractor, 38 | "#pattern" : r"https://(cdn\.4archive\.org/jp/image/\d\d\d\d/\d\d\d/\d+\.\w+|4archive\.org/image/image-404\.png)", 39 | "#count" : 85, 40 | }, 41 | 42 | { 43 | "#url" : "https://4archive.org/board/u", 44 | "#category": ("", "4archive", "board"), 45 | "#class" : _4archive._4archiveBoardExtractor, 46 | "#pattern" : _4archive._4archiveThreadExtractor.pattern, 47 | "#range" : "1-20", 48 | "#count" : 20, 49 | }, 50 | 51 | { 52 | "#url" : "https://4archive.org/board/jp/10", 53 | "#category": ("", "4archive", "board"), 54 | "#class" : _4archive._4archiveBoardExtractor, 55 | "#pattern" : _4archive._4archiveThreadExtractor.pattern, 56 | "#range" : "1-50", 57 | "#count" : 50, 58 | } 59 | 60 | ) 61 | -------------------------------------------------------------------------------- /test/results/4chan.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | gallery_dl = __import__("gallery_dl.extractor.4chan") 8 | _4chan = getattr(gallery_dl.extractor, "4chan") 9 | 10 | 11 | __tests__ = ( 12 | { 13 | "#url" : "https://boards.4chan.org/tg/thread/15396072/", 14 | "#category": ("", "4chan", "thread"), 15 | "#class" : _4chan._4chanThreadExtractor, 16 | "#sha1_url" : "39082ad166161966d7ba8e37f2173a824eb540f0", 17 | "#sha1_metadata": "2cadd32796492baca25f5060dc95e9f4e24a0ff2", 18 | "#sha1_content" : "742c6d256c813b29f246e1d765bba949fc3ac453", 19 | }, 20 | 21 | { 22 | "#url" : "https://boards.4channel.org/tg/thread/15396072/", 23 | "#category": ("", "4chan", "thread"), 24 | "#class" : _4chan._4chanThreadExtractor, 25 | "#sha1_url" : "39082ad166161966d7ba8e37f2173a824eb540f0", 26 | "#sha1_metadata": "2cadd32796492baca25f5060dc95e9f4e24a0ff2", 27 | }, 28 | 29 | { 30 | "#url" : "https://boards.4channel.org/po/", 31 | "#category": ("", "4chan", "board"), 32 | "#class" : _4chan._4chanBoardExtractor, 33 | "#pattern" : _4chan._4chanThreadExtractor.pattern, 34 | "#count" : ">= 100", 35 | }, 36 | 37 | ) 38 | -------------------------------------------------------------------------------- /test/results/4chanarchives.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | gallery_dl = __import__("gallery_dl.extractor.4chanarchives") 8 | _4chanarchives = getattr(gallery_dl.extractor, "4chanarchives") 9 | 10 | 11 | __tests__ = ( 12 | { 13 | "#url" : "https://4chanarchives.com/board/c/thread/2707110", 14 | "#category": ("", "4chanarchives", "thread"), 15 | "#class" : _4chanarchives._4chanarchivesThreadExtractor, 16 | "#pattern" : r"https://i\.imgur\.com/(0wLGseE|qbByWDc)\.jpg", 17 | "#count" : 2, 18 | 19 | "board" : "c", 20 | "com" : str, 21 | "name" : "Anonymous", 22 | "no" : int, 23 | "thread": "2707110", 24 | "time" : r"re:2016-07-1\d \d\d:\d\d:\d\d", 25 | "title" : "Ren Kagami from 'Oyako Neburi'", 26 | }, 27 | 28 | { 29 | "#url" : "https://4chanarchives.com/board/c/", 30 | "#category": ("", "4chanarchives", "board"), 31 | "#class" : _4chanarchives._4chanarchivesBoardExtractor, 32 | "#pattern" : _4chanarchives._4chanarchivesThreadExtractor.pattern, 33 | "#range" : "1-40", 34 | "#count" : 40, 35 | }, 36 | 37 | { 38 | "#url" : "https://4chanarchives.com/board/c", 39 | "#category": ("", "4chanarchives", "board"), 40 | "#class" : _4chanarchives._4chanarchivesBoardExtractor, 41 | }, 42 | 43 | { 44 | "#url" : "https://4chanarchives.com/board/c/10", 45 | "#category": ("", "4chanarchives", "board"), 46 | "#class" : _4chanarchives._4chanarchivesBoardExtractor, 47 | }, 48 | 49 | ) 50 | -------------------------------------------------------------------------------- /test/results/4plebs.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import foolfuuka 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://archive.4plebs.org/tg/thread/54059290", 13 | "#category": ("foolfuuka", "4plebs", "thread"), 14 | "#class" : foolfuuka.FoolfuukaThreadExtractor, 15 | "#pattern" : r"https://i\.4pcdn\.org/tg/1[34]\d{11}\.(jpg|png|gif)", 16 | "#count" : 30, 17 | }, 18 | 19 | { 20 | "#url" : "https://archive.4plebs.org/tg/", 21 | "#category": ("foolfuuka", "4plebs", "board"), 22 | "#class" : foolfuuka.FoolfuukaBoardExtractor, 23 | }, 24 | 25 | { 26 | "#url" : "https://archive.4plebs.org/_/search/text/test/", 27 | "#category": ("foolfuuka", "4plebs", "search"), 28 | "#class" : foolfuuka.FoolfuukaSearchExtractor, 29 | }, 30 | 31 | { 32 | "#url" : "https://archive.4plebs.org/tg/gallery/1", 33 | "#category": ("foolfuuka", "4plebs", "gallery"), 34 | "#class" : foolfuuka.FoolfuukaGalleryExtractor, 35 | }, 36 | 37 | ) 38 | -------------------------------------------------------------------------------- /test/results/8kun.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import vichan 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://8kun.top/test/res/65248.html", 13 | "#category": ("vichan", "8kun", "thread"), 14 | "#class" : vichan.VichanThreadExtractor, 15 | "#pattern" : r"https://media\.128ducks\.com/file_store/\w{64}\.\w+", 16 | "#count" : ">= 8", 17 | }, 18 | 19 | { 20 | "#url" : "https://8kun.top/v/index.html", 21 | "#category": ("vichan", "8kun", "board"), 22 | "#class" : vichan.VichanBoardExtractor, 23 | "#pattern" : vichan.VichanThreadExtractor.pattern, 24 | "#count" : ">= 100", 25 | }, 26 | 27 | { 28 | "#url" : "https://8kun.top/v/2.html", 29 | "#category": ("vichan", "8kun", "board"), 30 | "#class" : vichan.VichanBoardExtractor, 31 | }, 32 | 33 | { 34 | "#url" : "https://8kun.top/v/index.html?PageSpeed=noscript", 35 | "#category": ("vichan", "8kun", "board"), 36 | "#class" : vichan.VichanBoardExtractor, 37 | }, 38 | 39 | ) 40 | -------------------------------------------------------------------------------- /test/results/94chan.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import jschan 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://94chan.org/art/thread/25.html", 13 | "#category": ("jschan", "94chan", "thread"), 14 | "#class" : jschan.JschanThreadExtractor, 15 | "#pattern" : r"https://94chan.org/file/[0-9a-f]{64}(\.\w+)?", 16 | "#count" : ">= 15", 17 | }, 18 | 19 | { 20 | "#url" : "https://94chan.org/art/", 21 | "#category": ("jschan", "94chan", "board"), 22 | "#class" : jschan.JschanBoardExtractor, 23 | "#pattern" : jschan.JschanThreadExtractor.pattern, 24 | "#count" : ">= 30", 25 | }, 26 | 27 | { 28 | "#url" : "https://94chan.org/art/2.html", 29 | "#category": ("jschan", "94chan", "board"), 30 | "#class" : jschan.JschanBoardExtractor, 31 | }, 32 | 33 | { 34 | "#url" : "https://94chan.org/art/catalog.html", 35 | "#category": ("jschan", "94chan", "board"), 36 | "#class" : jschan.JschanBoardExtractor, 37 | }, 38 | 39 | { 40 | "#url" : "https://94chan.org/art/index.html", 41 | "#category": ("jschan", "94chan", "board"), 42 | "#class" : jschan.JschanBoardExtractor, 43 | }, 44 | 45 | ) 46 | -------------------------------------------------------------------------------- /test/results/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | import os 8 | import functools 9 | 10 | __directory__ = os.path.dirname(__file__) 11 | 12 | 13 | @functools.lru_cache(maxsize=None) 14 | def tests(name): 15 | module = __import__(name, globals(), None, (), 1) 16 | return module.__tests__ 17 | 18 | 19 | def all(): 20 | ignore = ("__init__.py", "__pycache__") 21 | for filename in os.listdir(__directory__): 22 | if filename not in ignore: 23 | yield from tests(filename[:-3]) 24 | 25 | 26 | def category(category): 27 | return tests(category.replace(".", "")) 28 | -------------------------------------------------------------------------------- /test/results/acidimg.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import imagehosts 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://acidimg.cc/img-5acb6b9de4640.html", 13 | "#category": ("imagehost", "acidimg", "image"), 14 | "#class" : imagehosts.AcidimgImageExtractor, 15 | "#sha1_url" : "f132a630006e8d84f52d59555191ed82b3b64c04", 16 | "#sha1_metadata": "135347ab4345002fc013863c0d9419ba32d98f78", 17 | "#sha1_content" : "0c8768055e4e20e7c7259608b67799171b691140", 18 | }, 19 | 20 | ) 21 | -------------------------------------------------------------------------------- /test/results/adultempire.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import adultempire 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://www.adultempire.com/5998/gallery.html", 13 | "#category": ("", "adultempire", "gallery"), 14 | "#class" : adultempire.AdultempireGalleryExtractor, 15 | "#range" : "1", 16 | "#sha1_metadata": "5b3266e69801db0d78c22181da23bc102886e027", 17 | "#sha1_content" : "5c6beb31e5e3cdc90ee5910d5c30f9aaec977b9e", 18 | }, 19 | 20 | { 21 | "#url" : "https://www.adultdvdempire.com/5683/gallery.html", 22 | "#category": ("", "adultempire", "gallery"), 23 | "#class" : adultempire.AdultempireGalleryExtractor, 24 | "#sha1_url" : "b12cd1a65cae8019d837505adb4d6a2c1ed4d70d", 25 | "#sha1_metadata": "8d448d79c4ac5f5b10a3019d5b5129ddb43655e5", 26 | }, 27 | 28 | ) 29 | -------------------------------------------------------------------------------- /test/results/aibooru.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import danbooru 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://aibooru.online/posts?tags=center_frills&z=1", 13 | "#category": ("Danbooru", "aibooru", "tag"), 14 | "#class" : danbooru.DanbooruTagExtractor, 15 | "#pattern" : r"https://cdn\.aibooru\.download/original/[0-9a-f]{2}/[0-9a-f]{2}/[0-9a-f]{32}\.\w+", 16 | "#count" : ">= 50", 17 | }, 18 | 19 | { 20 | "#url" : "https://safe.aibooru.online/posts?tags=center_frills", 21 | "#category": ("Danbooru", "aibooru", "tag"), 22 | "#class" : danbooru.DanbooruTagExtractor, 23 | }, 24 | 25 | { 26 | "#url" : "https://aibooru.online/pools/1", 27 | "#category": ("Danbooru", "aibooru", "pool"), 28 | "#class" : danbooru.DanbooruPoolExtractor, 29 | }, 30 | 31 | { 32 | "#url" : "https://aibooru.online/posts/1", 33 | "#category": ("Danbooru", "aibooru", "post"), 34 | "#class" : danbooru.DanbooruPostExtractor, 35 | "#sha1_content": "54d548743cd67799a62c77cbae97cfa0fec1b7e9", 36 | }, 37 | 38 | { 39 | "#url" : "https://aibooru.online/explore/posts/popular", 40 | "#category": ("Danbooru", "aibooru", "popular"), 41 | "#class" : danbooru.DanbooruPopularExtractor, 42 | }, 43 | 44 | ) 45 | -------------------------------------------------------------------------------- /test/results/allgirlbooru.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import gelbooru_v01 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://allgirl.booru.org/index.php?page=post&s=list&tags=dress", 13 | "#category": ("gelbooru_v01", "allgirlbooru", "tag"), 14 | "#class" : gelbooru_v01.GelbooruV01TagExtractor, 15 | "#range" : "1-25", 16 | "#count" : 25, 17 | }, 18 | 19 | { 20 | "#url" : "https://allgirl.booru.org/index.php?page=favorites&s=view&id=380", 21 | "#category": ("gelbooru_v01", "allgirlbooru", "favorite"), 22 | "#class" : gelbooru_v01.GelbooruV01FavoriteExtractor, 23 | "#count" : 4, 24 | }, 25 | 26 | { 27 | "#url" : "https://allgirl.booru.org/index.php?page=post&s=view&id=107213", 28 | "#category": ("gelbooru_v01", "allgirlbooru", "post"), 29 | "#class" : gelbooru_v01.GelbooruV01PostExtractor, 30 | "#sha1_url" : "b416800d2d2b072f80d3b37cfca9cb806fb25d51", 31 | "#sha1_content": "3e3c65e0854a988696e11adf0de52f8fa90a51c7", 32 | 33 | "created_at": "2021-02-13 16:27:39", 34 | "date" : "dt:2021-02-13 16:27:39", 35 | "file_url" : "https://img.booru.org/allgirl//images/107/2aaa0438d58fc7baa75a53b4a9621bb89a9d3fdb.jpg", 36 | "height" : "1200", 37 | "id" : "107213", 38 | "md5" : "2aaa0438d58fc7baa75a53b4a9621bb89a9d3fdb", 39 | "rating" : "s", 40 | "score" : str, 41 | "source" : "", 42 | "tags" : "blush dress green_eyes green_hair hatsune_miku long_hair twintails vocaloid", 43 | "uploader" : "Honochi31", 44 | "width" : "1600", 45 | }, 46 | 47 | ) 48 | -------------------------------------------------------------------------------- /test/results/animereactor.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import reactor 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "http://anime.reactor.cc/tag/Anime+Art", 13 | "#category": ("reactor", "anime.reactor", "tag"), 14 | "#class" : reactor.ReactorTagExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "http://anime.reactor.cc/user/Shuster", 19 | "#category": ("reactor", "anime.reactor", "user"), 20 | "#class" : reactor.ReactorUserExtractor, 21 | }, 22 | 23 | { 24 | "#url" : "http://anime.reactor.cc/post/3576250", 25 | "#category": ("reactor", "anime.reactor", "post"), 26 | "#class" : reactor.ReactorPostExtractor, 27 | }, 28 | 29 | ) 30 | -------------------------------------------------------------------------------- /test/results/architizer.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import architizer 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://architizer.com/projects/house-lo/", 13 | "#category": ("", "architizer", "project"), 14 | "#class" : architizer.ArchitizerProjectExtractor, 15 | "#pattern" : r"https://architizer-prod\.imgix\.net/media/mediadata/uploads/.+\.jpg$", 16 | 17 | "count" : 27, 18 | "description": str, 19 | "firm" : "Atelier Lina Bellovicova", 20 | "gid" : "225496", 21 | "location" : "Czechia", 22 | "num" : int, 23 | "size" : "1000 sqft - 3000 sqft", 24 | "slug" : "house-lo", 25 | "status" : "Built", 26 | "subcategory": "project", 27 | "title" : "House LO", 28 | "type" : "Residential › Private House", 29 | "year" : "2020", 30 | }, 31 | 32 | { 33 | "#url" : "https://architizer.com/firms/olson-kundig/", 34 | "#category": ("", "architizer", "firm"), 35 | "#class" : architizer.ArchitizerFirmExtractor, 36 | "#pattern" : architizer.ArchitizerProjectExtractor.pattern, 37 | "#count" : ">= 90", 38 | }, 39 | 40 | ) 41 | -------------------------------------------------------------------------------- /test/results/archiveofsins.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import foolfuuka 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://archiveofsins.com/h/thread/4668813/", 13 | "#category": ("foolfuuka", "archiveofsins", "thread"), 14 | "#class" : foolfuuka.FoolfuukaThreadExtractor, 15 | "#sha1_url" : "f612d287087e10a228ef69517cf811539db9a102", 16 | "#sha1_content": "0dd92d0d8a7bf6e2f7d1f5ac8954c1bcf18c22a4", 17 | }, 18 | 19 | { 20 | "#url" : "https://archiveofsins.com/h/", 21 | "#category": ("foolfuuka", "archiveofsins", "board"), 22 | "#class" : foolfuuka.FoolfuukaBoardExtractor, 23 | }, 24 | 25 | { 26 | "#url" : "https://archiveofsins.com/_/search/text/test/", 27 | "#category": ("foolfuuka", "archiveofsins", "search"), 28 | "#class" : foolfuuka.FoolfuukaSearchExtractor, 29 | }, 30 | 31 | { 32 | "#url" : "https://archiveofsins.com/_/search/text/test/", 33 | "#category": ("foolfuuka", "archiveofsins", "search"), 34 | "#class" : foolfuuka.FoolfuukaSearchExtractor, 35 | }, 36 | 37 | { 38 | "#url" : "https://archiveofsins.com/h/gallery/3", 39 | "#category": ("foolfuuka", "archiveofsins", "gallery"), 40 | "#class" : foolfuuka.FoolfuukaGalleryExtractor, 41 | }, 42 | 43 | ) 44 | -------------------------------------------------------------------------------- /test/results/atfbooru.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import danbooru 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://booru.allthefallen.moe/posts?tags=yume_shokunin", 13 | "#category": ("Danbooru", "atfbooru", "tag"), 14 | "#class" : danbooru.DanbooruTagExtractor, 15 | "#count" : 12, 16 | }, 17 | 18 | { 19 | "#url" : "https://booru.allthefallen.moe/pools/9", 20 | "#category": ("Danbooru", "atfbooru", "pool"), 21 | "#class" : danbooru.DanbooruPoolExtractor, 22 | "#count" : 6, 23 | "#sha1_url": "902549ffcdb00fe033c3f63e12bc3cb95c5fd8d5", 24 | }, 25 | 26 | { 27 | "#url" : "https://booru.allthefallen.moe/posts/22", 28 | "#category": ("Danbooru", "atfbooru", "post"), 29 | "#class" : danbooru.DanbooruPostExtractor, 30 | "#sha1_content": "21dda68e1d7e0a554078e62923f537d8e895cac8", 31 | }, 32 | 33 | { 34 | "#url" : "https://booru.allthefallen.moe/explore/posts/popular", 35 | "#category": ("Danbooru", "atfbooru", "popular"), 36 | "#class" : danbooru.DanbooruPopularExtractor, 37 | }, 38 | 39 | ) 40 | -------------------------------------------------------------------------------- /test/results/azurlanewiki.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import wikimedia 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://azurlane.koumakan.jp/wiki/Azur_Lane_Wiki", 13 | "#category": ("wikimedia", "azurlanewiki", "article"), 14 | "#class" : wikimedia.WikimediaArticleExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://azurlane.koumakan.jp/wiki/Louisville/Gallery", 19 | "#comment" : "entries with missing 'imageinfo' (#5384)", 20 | "#category": ("wikimedia", "azurlanewiki", "article"), 21 | "#class" : wikimedia.WikimediaArticleExtractor, 22 | "#count" : "> 10", 23 | }, 24 | 25 | ) 26 | -------------------------------------------------------------------------------- /test/results/b4k.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import foolfuuka 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://arch.b4k.dev/meta/thread/196/", 13 | "#category": ("foolfuuka", "b4k", "thread"), 14 | "#class" : foolfuuka.FoolfuukaThreadExtractor, 15 | "#urls" : "https://arch.b4k.dev/media/meta/image/1481/33/14813348737492.jpg", 16 | }, 17 | 18 | { 19 | "#url" : "https://arch.b4k.co/meta/thread/196/", 20 | "#category": ("foolfuuka", "b4k", "thread"), 21 | "#class" : foolfuuka.FoolfuukaThreadExtractor, 22 | "#urls" : "https://arch.b4k.dev/media/meta/image/1481/33/14813348737492.jpg", 23 | }, 24 | 25 | { 26 | "#url" : "https://arch.b4k.dev/meta/", 27 | "#category": ("foolfuuka", "b4k", "board"), 28 | "#class" : foolfuuka.FoolfuukaBoardExtractor, 29 | }, 30 | 31 | { 32 | "#url" : "https://arch.b4k.dev/meta/gallery/", 33 | "#category": ("foolfuuka", "b4k", "gallery"), 34 | "#class" : foolfuuka.FoolfuukaGalleryExtractor, 35 | }, 36 | 37 | ) 38 | -------------------------------------------------------------------------------- /test/results/baraag.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import mastodon 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://baraag.net/@pumpkinnsfw", 13 | "#category": ("mastodon", "baraag", "user"), 14 | "#class" : mastodon.MastodonUserExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://baraag.net/bookmarks", 19 | "#category": ("mastodon", "baraag", "bookmark"), 20 | "#class" : mastodon.MastodonBookmarkExtractor, 21 | }, 22 | 23 | { 24 | "#url" : "https://baraag.net/users/pumpkinnsfw/following", 25 | "#category": ("mastodon", "baraag", "following"), 26 | "#class" : mastodon.MastodonFollowingExtractor, 27 | }, 28 | 29 | { 30 | "#url" : "https://baraag.net/@pumpkinnsfw/104364170556898443", 31 | "#category": ("mastodon", "baraag", "status"), 32 | "#class" : mastodon.MastodonStatusExtractor, 33 | "#sha1_content": "67748c1b828c58ad60d0fe5729b59fb29c872244", 34 | }, 35 | 36 | ) 37 | -------------------------------------------------------------------------------- /test/results/bbw-chan.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import lynxchan 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://bbw-chan.link/bbwdraw/res/499.html", 13 | "#category": ("lynxchan", "bbw-chan", "thread"), 14 | "#class" : lynxchan.LynxchanThreadExtractor, 15 | "#pattern" : r"https://bbw-chan\.link/\.media/[0-9a-f]{64}(\.\w+)?$", 16 | "#count" : ">= 352", 17 | }, 18 | 19 | { 20 | "#url" : "https://bbw-chan.nl/bbwdraw/res/489.html", 21 | "#category": ("lynxchan", "bbw-chan", "thread"), 22 | "#class" : lynxchan.LynxchanThreadExtractor, 23 | }, 24 | 25 | { 26 | "#url" : "https://bbw-chan.link/bbwdraw/", 27 | "#category": ("lynxchan", "bbw-chan", "board"), 28 | "#class" : lynxchan.LynxchanBoardExtractor, 29 | "#pattern" : lynxchan.LynxchanThreadExtractor.pattern, 30 | "#count" : ">= 148", 31 | }, 32 | 33 | { 34 | "#url" : "https://bbw-chan.nl/bbwdraw/2.html", 35 | "#category": ("lynxchan", "bbw-chan", "board"), 36 | "#class" : lynxchan.LynxchanBoardExtractor, 37 | }, 38 | 39 | ) 40 | -------------------------------------------------------------------------------- /test/results/bcbnsfw.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import szurubooru 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://booru.bcbnsfw.space/posts/query=simple_background", 13 | "#category": ("szurubooru", "bcbnsfw", "tag"), 14 | "#class" : szurubooru.SzurubooruTagExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://booru.bcbnsfw.space/post/1599", 19 | "#comment" : "now only available as WebP", 20 | "#category": ("szurubooru", "bcbnsfw", "post"), 21 | "#class" : szurubooru.SzurubooruPostExtractor, 22 | "#pattern" : r"https://booru\.bcbnsfw\.space/data/posts/1599_53784518e92086bd\.png", 23 | "#sha1_content": "55f8b8d187adc82f2dcaf2aa89db0ae21b08c0b0", 24 | }, 25 | 26 | ) 27 | -------------------------------------------------------------------------------- /test/results/bitly.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import urlshortener 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://bit.ly/3cWIUgq", 13 | "#category": ("urlshortener", "bitly", "link"), 14 | "#class" : urlshortener.UrlshortenerLinkExtractor, 15 | "#pattern" : "^https://gumroad.com/l/storm_b1", 16 | "#count" : 1, 17 | }, 18 | 19 | ) 20 | -------------------------------------------------------------------------------- /test/results/blogger.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import blogger 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "blogger:http://www.julianbunker.com/2010/12/moon-rise.html", 13 | "#category": ("blogger", "www.julianbunker.com", "post"), 14 | "#class" : blogger.BloggerPostExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "blogger:https://www.kefblog.com.ng/", 19 | "#category": ("blogger", "www.kefblog.com.ng", "blog"), 20 | "#class" : blogger.BloggerBlogExtractor, 21 | "#range" : "1-25", 22 | "#count" : 25, 23 | }, 24 | 25 | { 26 | "#url" : "blogger:http://www.julianbunker.com/search?q=400mm", 27 | "#category": ("blogger", "www.julianbunker.com", "search"), 28 | "#class" : blogger.BloggerSearchExtractor, 29 | }, 30 | 31 | { 32 | "#url" : "blogger:http://www.julianbunker.com/search/label/D%26D", 33 | "#category": ("blogger", "www.julianbunker.com", "label"), 34 | "#class" : blogger.BloggerLabelExtractor, 35 | }, 36 | 37 | ) 38 | -------------------------------------------------------------------------------- /test/results/booruvar.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import danbooru 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://booru.borvar.art/posts?tags=chibi&z=1", 13 | "#category": ("Danbooru", "booruvar", "tag"), 14 | "#class" : danbooru.DanbooruTagExtractor, 15 | "#pattern" : r"https://booru\.borvar\.art/data/original/[0-9a-f]{2}/[0-9a-f]{2}/[0-9a-f]{32}\.\w+", 16 | "#count" : ">= 3", 17 | }, 18 | 19 | { 20 | "#url" : "https://booru.borvar.art/pools/2", 21 | "#category": ("Danbooru", "booruvar", "pool"), 22 | "#class" : danbooru.DanbooruPoolExtractor, 23 | "#count" : 4, 24 | "#sha1_url": "77fa3559a3fc919f72611f4e3dd0f919d19d3e0d", 25 | }, 26 | 27 | { 28 | "#url" : "https://booru.borvar.art/posts/1487", 29 | "#category": ("Danbooru", "booruvar", "post"), 30 | "#class" : danbooru.DanbooruPostExtractor, 31 | "#sha1_content": "91273ac1ea413a12be468841e2b5804656a50bff", 32 | }, 33 | 34 | { 35 | "#url" : "https://booru.borvar.art/explore/posts/popular", 36 | "#category": ("Danbooru", "booruvar", "popular"), 37 | "#class" : danbooru.DanbooruPopularExtractor, 38 | }, 39 | 40 | ) 41 | -------------------------------------------------------------------------------- /test/results/bulbapedia.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import wikimedia 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://bulbapedia.bulbagarden.net/wiki/Jet", 13 | "#category": ("wikimedia", "bulbapedia", "article"), 14 | "#class" : wikimedia.WikimediaArticleExtractor, 15 | "#pattern" : r"https://archives\.bulbagarden\.net/media/upload/\w+/\w+/[^/?#]+", 16 | "#count" : range(10, 30), 17 | }, 18 | 19 | { 20 | "#url" : "https://archives.bulbagarden.net/wiki/File:0460Abomasnow-Mega.png", 21 | "#category": ("wikimedia", "bulbapedia", "file"), 22 | "#class" : wikimedia.WikimediaArticleExtractor, 23 | "#pattern" : r"https://archives\.bulbagarden\.net/media/upload/\w+/\w+/[^/?#]+", 24 | "#count" : range(8, 12), 25 | "#archive" : False, 26 | }, 27 | 28 | ) 29 | -------------------------------------------------------------------------------- /test/results/catbox.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import catbox 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://catbox.moe/c/1igcbe", 13 | "#category": ("", "catbox", "album"), 14 | "#class" : catbox.CatboxAlbumExtractor, 15 | "#pattern" : r"https://files\.catbox\.moe/\w+\.\w{3}$", 16 | "#count" : 3, 17 | "#sha1_url" : "35866a88c29462814f103bc22ec031eaeb380f8a", 18 | "#sha1_content": "70ddb9de3872e2d17cc27e48e6bf395e5c8c0b32", 19 | 20 | "album_id" : "1igcbe", 21 | "album_name" : "test", 22 | "date" : "dt:2022-08-18 00:00:00", 23 | "description": "album test &>", 24 | }, 25 | 26 | { 27 | "#url" : "https://www.catbox.moe/c/cd90s1", 28 | "#category": ("", "catbox", "album"), 29 | "#class" : catbox.CatboxAlbumExtractor, 30 | }, 31 | 32 | { 33 | "#url" : "https://catbox.moe/c/w7tm47#", 34 | "#category": ("", "catbox", "album"), 35 | "#class" : catbox.CatboxAlbumExtractor, 36 | }, 37 | 38 | { 39 | "#url" : "https://files.catbox.moe/8ih3y7.png", 40 | "#category": ("", "catbox", "file"), 41 | "#class" : catbox.CatboxFileExtractor, 42 | "#pattern" : r"^https://files\.catbox\.moe/8ih3y7\.png$", 43 | "#count" : 1, 44 | "#sha1_content": "0c8768055e4e20e7c7259608b67799171b691140", 45 | }, 46 | 47 | { 48 | "#url" : "https://litter.catbox.moe/t8v3n9.png", 49 | "#category": ("", "catbox", "file"), 50 | "#class" : catbox.CatboxFileExtractor, 51 | }, 52 | 53 | { 54 | "#url" : "https://de.catbox.moe/bjdmz1.jpg", 55 | "#category": ("", "catbox", "file"), 56 | "#class" : catbox.CatboxFileExtractor, 57 | }, 58 | 59 | ) 60 | -------------------------------------------------------------------------------- /test/results/cavemanon.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import shimmie2 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://booru.cavemanon.xyz/index.php?q=post/list/Amber/1", 13 | "#category": ("shimmie2", "cavemanon", "tag"), 14 | "#class" : shimmie2.Shimmie2TagExtractor, 15 | "#pattern" : r"https://booru\.cavemanon\.xyz/index\.php\?q=image/\d+\.\w+", 16 | "#range" : "1-100", 17 | "#count" : 100, 18 | }, 19 | 20 | { 21 | "#url" : "https://booru.cavemanon.xyz/post/list/Amber/1", 22 | "#category": ("shimmie2", "cavemanon", "tag"), 23 | "#class" : shimmie2.Shimmie2TagExtractor, 24 | }, 25 | 26 | { 27 | "#url" : "https://booru.cavemanon.xyz/index.php?q=post/view/8335", 28 | "#category": ("shimmie2", "cavemanon", "post"), 29 | "#class" : shimmie2.Shimmie2PostExtractor, 30 | "#pattern" : r"https://booru\.cavemanon\.xyz/index\.php\?q=image/8335\.png", 31 | "#sha1_content": "7158f7e4abbbf143bad5835eb93dbe4d68c1d4ab", 32 | 33 | "extension": "png", 34 | "file_url" : "https://booru.cavemanon.xyz/index.php?q=image/8335.png", 35 | "filename" : "8335", 36 | "height" : 460, 37 | "id" : 8335, 38 | "md5" : "", 39 | "size" : 0, 40 | "tags" : "Color discord_emote Fang Food Pterodactyl transparent", 41 | "width" : 459, 42 | }, 43 | 44 | ) 45 | -------------------------------------------------------------------------------- /test/results/chelseacrew.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import shopify 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://chelseacrew.com/collections/flats", 13 | "#category": ("shopify", "chelseacrew", "collection"), 14 | "#class" : shopify.ShopifyCollectionExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://chelseacrew.com/collections/flats/products/dora", 19 | "#category": ("shopify", "chelseacrew", "product"), 20 | "#class" : shopify.ShopifyProductExtractor, 21 | }, 22 | 23 | ) 24 | -------------------------------------------------------------------------------- /test/results/comicvine.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import comicvine 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://comicvine.gamespot.com/jock/4040-5653/images/", 13 | "#category": ("", "comicvine", "tag"), 14 | "#class" : comicvine.ComicvineTagExtractor, 15 | "#pattern" : r"https://comicvine\.gamespot\.com/a/uploads/original/\d+/\d+/\d+-.+\.(jpe?g|png)", 16 | "#count" : ">= 140", 17 | }, 18 | 19 | { 20 | "#url" : "https://comicvine.gamespot.com/batman/4005-1699/images/?tag=Fan%20Art%20%26%20Cosplay", 21 | "#category": ("", "comicvine", "tag"), 22 | "#class" : comicvine.ComicvineTagExtractor, 23 | "#pattern" : r"https://comicvine\.gamespot\.com/a/uploads/original/\d+/\d+/\d+-.+", 24 | "#count" : ">= 400", 25 | }, 26 | 27 | ) 28 | -------------------------------------------------------------------------------- /test/results/coomer.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import kemono 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://coomer.su/onlyfans/user/alinity/post/125962203", 13 | "#comment" : "coomer (#2100)", 14 | "#category": ("", "coomer", "onlyfans"), 15 | "#class" : kemono.KemonoPostExtractor, 16 | "#urls" : "https://coomer.su/data/7d/3f/7d3fd9804583dc224968c0591163ec91794552b04f00a6c2f42a15b68231d5a8.jpg", 17 | }, 18 | 19 | { 20 | "#url" : "https://coomer.party/onlyfans/user/alinity/post/125962203", 21 | "#category": ("", "coomer", "onlyfans"), 22 | "#class" : kemono.KemonoPostExtractor, 23 | "#urls" : "https://coomer.party/data/7d/3f/7d3fd9804583dc224968c0591163ec91794552b04f00a6c2f42a15b68231d5a8.jpg", 24 | }, 25 | 26 | ) 27 | -------------------------------------------------------------------------------- /test/results/desktopography.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import desktopography 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://desktopography.net/", 13 | "#category": ("", "desktopography", "site"), 14 | "#class" : desktopography.DesktopographySiteExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://desktopography.net/exhibition-2020/", 19 | "#category": ("", "desktopography", "exhibition"), 20 | "#class" : desktopography.DesktopographyExhibitionExtractor, 21 | }, 22 | 23 | { 24 | "#url" : "https://desktopography.net/portfolios/new-era/", 25 | "#category": ("", "desktopography", "entry"), 26 | "#class" : desktopography.DesktopographyEntryExtractor, 27 | }, 28 | 29 | ) 30 | -------------------------------------------------------------------------------- /test/results/desuarchive.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import foolfuuka 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://desuarchive.org/a/thread/159542679/", 13 | "#category": ("foolfuuka", "desuarchive", "thread"), 14 | "#class" : foolfuuka.FoolfuukaThreadExtractor, 15 | "#sha1_url": "e7d624aded15a069194e38dc731ec23217a422fb", 16 | }, 17 | 18 | { 19 | "#url" : "https://desuarchive.org/a", 20 | "#category": ("foolfuuka", "desuarchive", "board"), 21 | "#class" : foolfuuka.FoolfuukaBoardExtractor, 22 | }, 23 | 24 | { 25 | "#url" : "https://desuarchive.org/a/", 26 | "#category": ("foolfuuka", "desuarchive", "board"), 27 | "#class" : foolfuuka.FoolfuukaBoardExtractor, 28 | }, 29 | 30 | { 31 | "#url" : "https://desuarchive.org/a/2", 32 | "#category": ("foolfuuka", "desuarchive", "board"), 33 | "#class" : foolfuuka.FoolfuukaBoardExtractor, 34 | }, 35 | 36 | { 37 | "#url" : "https://desuarchive.org/a/page/2", 38 | "#category": ("foolfuuka", "desuarchive", "board"), 39 | "#class" : foolfuuka.FoolfuukaBoardExtractor, 40 | "#pattern" : foolfuuka.FoolfuukaThreadExtractor.pattern, 41 | "#count" : 10, 42 | }, 43 | 44 | { 45 | "#url" : "https://desuarchive.org/_/search/text/test/", 46 | "#category": ("foolfuuka", "desuarchive", "search"), 47 | "#class" : foolfuuka.FoolfuukaSearchExtractor, 48 | }, 49 | 50 | { 51 | "#url" : "https://desuarchive.org/a/gallery/5", 52 | "#category": ("foolfuuka", "desuarchive", "gallery"), 53 | "#class" : foolfuuka.FoolfuukaGalleryExtractor, 54 | }, 55 | 56 | ) 57 | -------------------------------------------------------------------------------- /test/results/drawfriends.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import gelbooru_v01 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://drawfriends.booru.org/index.php?page=post&s=list&tags=all", 13 | "#category": ("gelbooru_v01", "drawfriends", "tag"), 14 | "#class" : gelbooru_v01.GelbooruV01TagExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://drawfriends.booru.org/index.php?page=favorites&s=view&id=1", 19 | "#category": ("gelbooru_v01", "drawfriends", "favorite"), 20 | "#class" : gelbooru_v01.GelbooruV01FavoriteExtractor, 21 | }, 22 | 23 | { 24 | "#url" : "https://drawfriends.booru.org/index.php?page=post&s=view&id=107474", 25 | "#category": ("gelbooru_v01", "drawfriends", "post"), 26 | "#class" : gelbooru_v01.GelbooruV01PostExtractor, 27 | }, 28 | 29 | ) 30 | -------------------------------------------------------------------------------- /test/results/e6ai.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import e621 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://e6ai.net/posts?tags=anry", 13 | "#category": ("E621", "e6ai", "tag"), 14 | "#class" : e621.E621TagExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://e6ai.net/post/index/1/anry", 19 | "#category": ("E621", "e6ai", "tag"), 20 | "#class" : e621.E621TagExtractor, 21 | }, 22 | 23 | { 24 | "#url" : "https://e6ai.net/post?tags=anry", 25 | "#category": ("E621", "e6ai", "tag"), 26 | "#class" : e621.E621TagExtractor, 27 | }, 28 | 29 | { 30 | "#url" : "https://e6ai.net/pools/3", 31 | "#category": ("E621", "e6ai", "pool"), 32 | "#class" : e621.E621PoolExtractor, 33 | "#sha1_url": "a6d1ad67a3fa9b9f73731d34d5f6f26f7e85855f", 34 | }, 35 | 36 | { 37 | "#url" : "https://e6ai.net/pool/show/3", 38 | "#category": ("E621", "e6ai", "pool"), 39 | "#class" : e621.E621PoolExtractor, 40 | }, 41 | 42 | { 43 | "#url" : "https://e6ai.net/posts/23", 44 | "#category": ("E621", "e6ai", "post"), 45 | "#class" : e621.E621PostExtractor, 46 | "#sha1_url" : "3c85a806b3d9eec861948af421fe0e8ad6b8f881", 47 | "#sha1_content": "a05a484e4eb64637d56d751c02e659b4bc8ea5d5", 48 | }, 49 | 50 | { 51 | "#url" : "https://e6ai.net/post/show/23", 52 | "#category": ("E621", "e6ai", "post"), 53 | "#class" : e621.E621PostExtractor, 54 | }, 55 | 56 | { 57 | "#url" : "https://e6ai.net/explore/posts/popular", 58 | "#category": ("E621", "e6ai", "popular"), 59 | "#class" : e621.E621PopularExtractor, 60 | }, 61 | 62 | { 63 | "#url" : "https://e6ai.net/favorites", 64 | "#category": ("E621", "e6ai", "favorite"), 65 | "#class" : e621.E621FavoriteExtractor, 66 | }, 67 | 68 | ) 69 | -------------------------------------------------------------------------------- /test/results/endchan.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import lynxchan 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://endchan.org/yuri/res/33621.html", 13 | "#category": ("lynxchan", "endchan", "thread"), 14 | "#class" : lynxchan.LynxchanThreadExtractor, 15 | "#urls" : "https://endchan.org/.media/358c089df4be990e9f7b636e1ce83d3e-imagejpeg.jpg", 16 | }, 17 | 18 | { 19 | "#url" : "https://endchan.org/yuri/res/33621.html", 20 | "#category": ("lynxchan", "endchan", "thread"), 21 | "#class" : lynxchan.LynxchanThreadExtractor, 22 | }, 23 | 24 | { 25 | "#url" : "https://endchan.org/yuri/", 26 | "#category": ("lynxchan", "endchan", "board"), 27 | "#class" : lynxchan.LynxchanBoardExtractor, 28 | "#pattern" : lynxchan.LynxchanThreadExtractor.pattern, 29 | "#count" : ">= 8", 30 | }, 31 | 32 | { 33 | "#url" : "https://endchan.org/yuri/catalog.html", 34 | "#category": ("lynxchan", "endchan", "board"), 35 | "#class" : lynxchan.LynxchanBoardExtractor, 36 | }, 37 | 38 | ) 39 | -------------------------------------------------------------------------------- /test/results/erome.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import erome 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://www.erome.com/a/NQgdlWvk", 13 | "#category": ("", "erome", "album"), 14 | "#class" : erome.EromeAlbumExtractor, 15 | "#pattern" : r"https://v\d+\.erome\.com/\d+/NQgdlWvk/j7jlzmYB_480p\.mp4", 16 | "#count" : 1, 17 | 18 | "album_id": "NQgdlWvk", 19 | "date" : None, 20 | "count" : 1, 21 | "num" : 1, 22 | "title" : "porn", 23 | "user" : "yYgWBZw8o8qsMzM", 24 | }, 25 | 26 | { 27 | "#url" : "https://www.erome.com/a/TdbZ4ogi", 28 | "#category": ("", "erome", "album"), 29 | "#class" : erome.EromeAlbumExtractor, 30 | "#pattern" : r"https://s\d+\.erome\.com/\d+/TdbZ4ogi/\w+", 31 | "#count" : 6, 32 | 33 | "album_id": "TdbZ4ogi", 34 | "date" : "dt:2024-03-18 00:01:56", 35 | "count" : 6, 36 | "num" : int, 37 | "title" : "82e78cfbb461ad87198f927fcb1fda9a1efac9ff.", 38 | "user" : "yYgWBZw8o8qsMzM", 39 | }, 40 | 41 | { 42 | "#url" : "https://www.erome.com/yYgWBZw8o8qsMzM", 43 | "#category": ("", "erome", "user"), 44 | "#class" : erome.EromeUserExtractor, 45 | "#range" : "1-25", 46 | "#count" : 25, 47 | }, 48 | 49 | { 50 | "#url" : "https://www.erome.com/search?q=cute", 51 | "#category": ("", "erome", "search"), 52 | "#class" : erome.EromeSearchExtractor, 53 | "#range" : "1-25", 54 | "#count" : 25, 55 | }, 56 | 57 | ) 58 | -------------------------------------------------------------------------------- /test/results/fapachi.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import fapachi 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://fapachi.com/sonson/media/0082", 13 | "#comment" : "NSFW", 14 | "#category": ("", "fapachi", "post"), 15 | "#class" : fapachi.FapachiPostExtractor, 16 | "#pattern" : r"https://fapachi\.com/models/s/o/sonson/1/full/sonson_0082\.jpeg", 17 | 18 | "user": "sonson", 19 | "id" : "0082", 20 | }, 21 | 22 | { 23 | "#url" : "https://fapachi.com/ferxiita/media/0159", 24 | "#comment" : "NSFW", 25 | "#category": ("", "fapachi", "post"), 26 | "#class" : fapachi.FapachiPostExtractor, 27 | }, 28 | 29 | { 30 | "#url" : "https://fapachi.com/sonson", 31 | "#category": ("", "fapachi", "user"), 32 | "#class" : fapachi.FapachiUserExtractor, 33 | "#pattern" : fapachi.FapachiPostExtractor.pattern, 34 | "#range" : "1-50", 35 | "#count" : 50, 36 | }, 37 | 38 | { 39 | "#url" : "https://fapachi.com/ferxiita/page/3", 40 | "#category": ("", "fapachi", "user"), 41 | "#class" : fapachi.FapachiUserExtractor, 42 | }, 43 | 44 | ) 45 | -------------------------------------------------------------------------------- /test/results/fappic.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import imagehosts 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://fappic.com/98wxqcklyh8k/test.png", 13 | "#category": ("imagehost", "fappic", "image"), 14 | "#class" : imagehosts.FappicImageExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://www.fappic.com/98wxqcklyh8k/test.png", 19 | "#category": ("imagehost", "fappic", "image"), 20 | "#class" : imagehosts.FappicImageExtractor, 21 | "#pattern" : r"https://img\d+\.fappic\.com/img/\w+/test\.png", 22 | "#sha1_metadata": "433b1d310b0ff12ad8a71ac7b9d8ba3f8cd1e898", 23 | "#sha1_content" : "0c8768055e4e20e7c7259608b67799171b691140", 24 | }, 25 | 26 | ) 27 | -------------------------------------------------------------------------------- /test/results/fashionnova.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import shopify 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://www.fashionnova.com/collections/mini-dresses", 13 | "#category": ("shopify", "fashionnova", "collection"), 14 | "#class" : shopify.ShopifyCollectionExtractor, 15 | "#range" : "1-20", 16 | "#count" : 20, 17 | }, 18 | 19 | { 20 | "#url" : "https://www.fashionnova.com/collections/mini-dresses/?page=1", 21 | "#category": ("shopify", "fashionnova", "collection"), 22 | "#class" : shopify.ShopifyCollectionExtractor, 23 | }, 24 | 25 | { 26 | "#url" : "https://www.fashionnova.com/collections/mini-dresses#1", 27 | "#category": ("shopify", "fashionnova", "collection"), 28 | "#class" : shopify.ShopifyCollectionExtractor, 29 | }, 30 | 31 | { 32 | "#url" : "https://www.fashionnova.com/products/all-my-life-legging-black", 33 | "#category": ("shopify", "fashionnova", "product"), 34 | "#class" : shopify.ShopifyProductExtractor, 35 | "#pattern" : r"https?://cdn\d*\.shopify\.com/s/files/", 36 | "#count" : 8, 37 | }, 38 | 39 | { 40 | "#url" : "https://www.fashionnova.com/collections/flats/products/name", 41 | "#category": ("shopify", "fashionnova", "product"), 42 | "#class" : shopify.ShopifyProductExtractor, 43 | }, 44 | 45 | ) 46 | -------------------------------------------------------------------------------- /test/results/fireden.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import foolfuuka 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://boards.fireden.net/sci/thread/11264294/", 13 | "#category": ("foolfuuka", "fireden", "thread"), 14 | "#class" : foolfuuka.FoolfuukaThreadExtractor, 15 | "#sha1_url": "61cab625c95584a12a30049d054931d64f8d20aa", 16 | }, 17 | 18 | { 19 | "#url" : "https://boards.fireden.net/sci/", 20 | "#category": ("foolfuuka", "fireden", "board"), 21 | "#class" : foolfuuka.FoolfuukaBoardExtractor, 22 | }, 23 | 24 | { 25 | "#url" : "https://boards.fireden.net/_/search/text/test/", 26 | "#category": ("foolfuuka", "fireden", "search"), 27 | "#class" : foolfuuka.FoolfuukaSearchExtractor, 28 | }, 29 | 30 | { 31 | "#url" : "https://boards.fireden.net/sci/gallery/6", 32 | "#category": ("foolfuuka", "fireden", "gallery"), 33 | "#class" : foolfuuka.FoolfuukaGalleryExtractor, 34 | }, 35 | 36 | ) 37 | -------------------------------------------------------------------------------- /test/results/furbooru.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import philomena 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://furbooru.org/images/1", 13 | "#category": ("philomena", "furbooru", "post"), 14 | "#class" : philomena.PhilomenaPostExtractor, 15 | "#sha1_content": "9eaa1e1b32fa0f16520912257dbefaff238d5fd2", 16 | }, 17 | 18 | { 19 | "#url" : "https://furbooru.org/search?q=cute", 20 | "#category": ("philomena", "furbooru", "search"), 21 | "#class" : philomena.PhilomenaSearchExtractor, 22 | "#range" : "40-60", 23 | "#count" : 21, 24 | }, 25 | 26 | { 27 | "#url" : "https://furbooru.org/galleries/27", 28 | "#category": ("philomena", "furbooru", "gallery"), 29 | "#class" : philomena.PhilomenaGalleryExtractor, 30 | "#count" : ">= 13", 31 | }, 32 | 33 | ) 34 | -------------------------------------------------------------------------------- /test/results/fuskator.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import fuskator 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://fuskator.com/thumbs/d0GnIzXrSKU/", 13 | "#category": ("", "fuskator", "gallery"), 14 | "#class" : fuskator.FuskatorGalleryExtractor, 15 | "#pattern" : r"https://i\d+.fuskator.com/large/d0GnIzXrSKU/.+\.jpg", 16 | "#count" : 22, 17 | 18 | "gallery_id" : 473023, 19 | "gallery_hash": "d0GnIzXrSKU", 20 | "title" : r"re:Shaved Brunette Babe Maria Ryabushkina with ", 21 | "views" : int, 22 | "score" : float, 23 | "count" : 22, 24 | "tags" : list, 25 | }, 26 | 27 | { 28 | "#url" : "https://fuskator.com/expanded/gXpKzjgIidA/index.html", 29 | "#category": ("", "fuskator", "gallery"), 30 | "#class" : fuskator.FuskatorGalleryExtractor, 31 | }, 32 | 33 | { 34 | "#url" : "https://fuskator.com/search/red_swimsuit/", 35 | "#category": ("", "fuskator", "search"), 36 | "#class" : fuskator.FuskatorSearchExtractor, 37 | "#pattern" : fuskator.FuskatorGalleryExtractor.pattern, 38 | "#count" : ">= 40", 39 | }, 40 | 41 | { 42 | "#url" : "https://fuskator.com/page/3/swimsuit/quality/", 43 | "#category": ("", "fuskator", "search"), 44 | "#class" : fuskator.FuskatorSearchExtractor, 45 | }, 46 | 47 | ) 48 | -------------------------------------------------------------------------------- /test/results/illusioncardsbooru.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import gelbooru_v01 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://illusioncards.booru.org/index.php?page=post&s=list&tags=koikatsu", 13 | "#category": ("gelbooru_v01", "illusioncardsbooru", "tag"), 14 | "#class" : gelbooru_v01.GelbooruV01TagExtractor, 15 | "#range" : "1-25", 16 | "#count" : 25, 17 | }, 18 | 19 | { 20 | "#url" : "https://illusioncards.booru.org/index.php?page=favorites&s=view&id=84887", 21 | "#category": ("gelbooru_v01", "illusioncardsbooru", "favorite"), 22 | "#class" : gelbooru_v01.GelbooruV01FavoriteExtractor, 23 | "#count" : 2, 24 | }, 25 | 26 | { 27 | "#url" : "https://illusioncards.booru.org/index.php?page=post&s=view&id=82746", 28 | "#category": ("gelbooru_v01", "illusioncardsbooru", "post"), 29 | "#class" : gelbooru_v01.GelbooruV01PostExtractor, 30 | "#sha1_url" : "3f9cd2fadf78869b90bc5422f27b48f1af0e0909", 31 | "#sha1_content": "159e60b92d05597bd1bb63510c2c3e4a4bada1dc", 32 | }, 33 | 34 | ) 35 | -------------------------------------------------------------------------------- /test/results/imagechest.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import imagechest 8 | from gallery_dl import exception 9 | 10 | 11 | __tests__ = ( 12 | { 13 | "#url" : "https://imgchest.com/p/3na7kr3by8d", 14 | "#category": ("", "imagechest", "gallery"), 15 | "#class" : imagechest.ImagechestGalleryExtractor, 16 | "#pattern" : r"https://cdn\.imgchest\.com/files/\w+\.(jpg|png)", 17 | "#count" : 3, 18 | "#sha1_url" : "7328ca4ec2459378d725e3be19f661d2b045feda", 19 | "#sha1_content": "076959e65be30249a2c651fbe6090dc30ba85193", 20 | 21 | "count" : 3, 22 | "gallery_id": "3na7kr3by8d", 23 | "num" : int, 24 | "title" : "Wizardry - Video Game From The Mid 80's", 25 | }, 26 | 27 | { 28 | "#url" : "https://imgchest.com/p/9p4n3q2z7nq", 29 | "#comment" : "'Load More Files' button (#4028)", 30 | "#category": ("", "imagechest", "gallery"), 31 | "#class" : imagechest.ImagechestGalleryExtractor, 32 | "#pattern" : r"https://cdn\.imgchest\.com/files/\w+\.(jpg|png)", 33 | "#count" : 52, 34 | "#sha1_url": "f5674e8ba79d336193c9f698708d9dcc10e78cc7", 35 | }, 36 | 37 | { 38 | "#url" : "https://imgchest.com/p/xxxxxxxxxxx", 39 | "#category": ("", "imagechest", "gallery"), 40 | "#class" : imagechest.ImagechestGalleryExtractor, 41 | "#exception": exception.NotFoundError, 42 | }, 43 | 44 | { 45 | "#url" : "https://imgchest.com/u/LunarLandr", 46 | "#category": ("", "imagechest", "user"), 47 | "#class" : imagechest.ImagechestUserExtractor, 48 | "#pattern" : imagechest.ImagechestGalleryExtractor.pattern, 49 | "#count" : range(280, 290), 50 | }, 51 | 52 | ) 53 | -------------------------------------------------------------------------------- /test/results/imagepond.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import chevereto 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://imagepond.net/image/IMG-20250217-160622.TJNphg", 13 | "#category": ("chevereto", "imagepond", "image"), 14 | "#class" : chevereto.CheveretoImageExtractor, 15 | "#urls" : "https://media.imagepond.net/media/IMG_20250217_1606226b345a5dbd0e8971.jpg", 16 | "#sha1_content": "ec7fac6b427f7af01038619208cd69478e91ddef", 17 | 18 | "album" : "", 19 | "date" : "dt:2025-02-17 19:15:25", 20 | "extension": "jpg", 21 | "filename" : "IMG_20250217_1606226b345a5dbd0e8971", 22 | "id" : "TJNphg", 23 | "url" : "https://media.imagepond.net/media/IMG_20250217_1606226b345a5dbd0e8971.jpg", 24 | "user" : "dariusbbb24", 25 | 26 | }, 27 | 28 | { 29 | "#url" : "https://imagepond.net/album/CDilP/?sort=date_desc&page=1", 30 | "#category": ("chevereto", "imagepond", "album"), 31 | "#class" : chevereto.CheveretoAlbumExtractor, 32 | }, 33 | 34 | { 35 | "#url" : "https://imagepond.net/dariusbbb24", 36 | "#category": ("chevereto", "imagepond", "user"), 37 | "#class" : chevereto.CheveretoUserExtractor, 38 | "#range" : "1-30", 39 | "#count" : 30, 40 | }, 41 | 42 | ) 43 | -------------------------------------------------------------------------------- /test/results/imagetwist.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import imagehosts 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://imagetwist.com/f1i2s4vhvbrq/test.png", 13 | "#category": ("imagehost", "imagetwist", "image"), 14 | "#class" : imagehosts.ImagetwistImageExtractor, 15 | "#sha1_url" : "8d5e168c0bee30211f821c6f3b2116e419d42671", 16 | "#sha1_metadata": "d1060a4c2e3b73b83044e20681712c0ffdd6cfef", 17 | "#sha1_content" : "0c8768055e4e20e7c7259608b67799171b691140", 18 | }, 19 | 20 | { 21 | "#url" : "https://www.imagetwist.com/f1i2s4vhvbrq/test.png", 22 | "#category": ("imagehost", "imagetwist", "image"), 23 | "#class" : imagehosts.ImagetwistImageExtractor, 24 | }, 25 | 26 | { 27 | "#url" : "https://phun.imagetwist.com/f1i2s4vhvbrq/test.png", 28 | "#category": ("imagehost", "imagetwist", "image"), 29 | "#class" : imagehosts.ImagetwistImageExtractor, 30 | }, 31 | 32 | { 33 | "#url" : "https://imagehaha.com/f1i2s4vhvbrq/test.png", 34 | "#category": ("imagehost", "imagetwist", "image"), 35 | "#class" : imagehosts.ImagetwistImageExtractor, 36 | }, 37 | 38 | { 39 | "#url" : "https://www.imagehaha.com/f1i2s4vhvbrq/test.png", 40 | "#category": ("imagehost", "imagetwist", "image"), 41 | "#class" : imagehosts.ImagetwistImageExtractor, 42 | }, 43 | 44 | { 45 | "#url" : "https://imagetwist.com/p/gdldev/747223/digits", 46 | "#category": ("imagehost", "imagetwist", "gallery"), 47 | "#class" : imagehosts.ImagetwistGalleryExtractor, 48 | "#urls" : ( 49 | "https://imagetwist.com/j6eu91sbl9bs", 50 | "https://imagetwist.com/vx4oh119izyr", 51 | "https://imagetwist.com/n3td3a6vzzed", 52 | "https://imagetwist.com/8uz6lmg31nmc", 53 | ), 54 | }, 55 | 56 | ) 57 | -------------------------------------------------------------------------------- /test/results/imgbox.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import imgbox 8 | from gallery_dl import exception 9 | 10 | 11 | __tests__ = ( 12 | { 13 | "#url" : "https://imgbox.com/g/JaX5V5HX7g", 14 | "#category": ("", "imgbox", "gallery"), 15 | "#class" : imgbox.ImgboxGalleryExtractor, 16 | "#sha1_url" : "da4f15b161461119ee78841d4b8e8d054d95f906", 17 | "#sha1_metadata": "4b1e62820ac2c6205b7ad0b6322cc8e00dbe1b0c", 18 | "#sha1_content" : "d20307dc8511ac24d688859c55abf2e2cc2dd3cc", 19 | }, 20 | 21 | { 22 | "#url" : "https://imgbox.com/g/cUGEkRbdZZ", 23 | "#category": ("", "imgbox", "gallery"), 24 | "#class" : imgbox.ImgboxGalleryExtractor, 25 | "#sha1_url" : "76506a3aab175c456910851f66227e90484ca9f7", 26 | "#sha1_metadata": "fb0427b87983197849fb2887905e758f3e50cb6e", 27 | }, 28 | 29 | { 30 | "#url" : "https://imgbox.com/g/JaX5V5HX7h", 31 | "#category": ("", "imgbox", "gallery"), 32 | "#class" : imgbox.ImgboxGalleryExtractor, 33 | "#exception": exception.NotFoundError, 34 | }, 35 | 36 | { 37 | "#url" : "https://imgbox.com/qHhw7lpG", 38 | "#category": ("", "imgbox", "image"), 39 | "#class" : imgbox.ImgboxImageExtractor, 40 | "#sha1_url" : "ee9cdea6c48ad0161c1b5f81f6b0c9110997038c", 41 | "#sha1_metadata": "dfc72310026b45f3feb4f9cada20c79b2575e1af", 42 | "#sha1_content" : "0c8768055e4e20e7c7259608b67799171b691140", 43 | }, 44 | 45 | { 46 | "#url" : "https://imgbox.com/qHhw7lpH", 47 | "#category": ("", "imgbox", "image"), 48 | "#class" : imgbox.ImgboxImageExtractor, 49 | "#exception": exception.NotFoundError, 50 | }, 51 | 52 | ) 53 | -------------------------------------------------------------------------------- /test/results/imgclick.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import imagehosts 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "http://imgclick.net/4tbrre1oxew9/test-_-_.png.html", 13 | "#category": ("imagehost", "imgclick", "image"), 14 | "#class" : imagehosts.ImgclickImageExtractor, 15 | "#sha1_url" : "140dcb250a325f2d26b2d918c18b8ac6a2a0f6ab", 16 | "#sha1_metadata": "6895256143eab955622fc149aa367777a8815ba3", 17 | "#sha1_content" : "0c8768055e4e20e7c7259608b67799171b691140", 18 | }, 19 | 20 | ) 21 | -------------------------------------------------------------------------------- /test/results/imgkiwi.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import chevereto 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://img.kiwi/image/79de2c41-70f9-4a87-bd6d-00fe9997c0c4.JR2wZz", 13 | "#category": ("chevereto", "imgkiwi", "image"), 14 | "#class" : chevereto.CheveretoImageExtractor, 15 | "#urls" : "https://img.kiwi/images/2023/02/28/11ac1ebf28a2eae8265026b28e9c4413.jpg", 16 | "#sha1_content": "9ea704a77e2038b9008350682cfad53a614a60bd", 17 | 18 | "album" : "Kins3y Wolansk1", 19 | "extension": "jpg", 20 | "filename" : "11ac1ebf28a2eae8265026b28e9c4413", 21 | "id" : "JR2wZz", 22 | "url" : "https://img.kiwi/images/2023/02/28/11ac1ebf28a2eae8265026b28e9c4413.jpg", 23 | "user" : "johnirl", 24 | }, 25 | 26 | { 27 | "#url" : "https://img.kiwi/album/kins3y-wolansk1.8Jxc", 28 | "#category": ("chevereto", "imgkiwi", "album"), 29 | "#class" : chevereto.CheveretoAlbumExtractor, 30 | "#pattern" : chevereto.CheveretoImageExtractor.pattern, 31 | "#count" : 19, 32 | }, 33 | 34 | { 35 | "#url" : "https://img.kiwi/johnirl", 36 | "#category": ("chevereto", "imgkiwi", "user"), 37 | "#class" : chevereto.CheveretoUserExtractor, 38 | "#pattern" : chevereto.CheveretoImageExtractor.pattern, 39 | "#range" : "1-20", 40 | "#count" : 20, 41 | }, 42 | 43 | { 44 | "#url" : "https://img.kiwi/johnirl/albums", 45 | "#category": ("chevereto", "imgkiwi", "user"), 46 | "#class" : chevereto.CheveretoUserExtractor, 47 | "#pattern" : chevereto.CheveretoAlbumExtractor.pattern, 48 | "#count" : range(155, 175), 49 | }, 50 | 51 | ) 52 | -------------------------------------------------------------------------------- /test/results/imgspice.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import imagehosts 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://imgspice.com/q1taxkhxprrn/58410038_cal022jsp_308191001.jpg.html", 13 | "#category": ("imagehost", "imgspice", "image"), 14 | "#class" : imagehosts.ImgspiceImageExtractor, 15 | "#urls" : "https://img30.imgspice.com/i/03792/q1taxkhxprrn.jpg", 16 | "#sha1_content" : "f1de8e58a7c2ef747a206a38f96c5623b8a83edc", 17 | 18 | "extension": "jpg", 19 | "filename" : "58410038_cal022jsp_308191001", 20 | "token" : "q1taxkhxprrn", 21 | }, 22 | 23 | ) 24 | -------------------------------------------------------------------------------- /test/results/imgth.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import imgth 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://imgth.com/gallery/37/wallpaper-anime", 13 | "#category": ("", "imgth", "gallery"), 14 | "#class" : imgth.ImgthGalleryExtractor, 15 | "#pattern" : r"https://imgth\.com/images/2009/11/25/wallpaper-anime_\w+\.jpg", 16 | "#sha1_url": "4ae1d281ca2b48952cf5cca57e9914402ad72748", 17 | 18 | "count" : 12, 19 | "date" : "dt:2009-11-25 18:21:00", 20 | "extension" : "jpg", 21 | "filename" : r"re:wallpaper-anime_\w+", 22 | "gallery_id": 37, 23 | "num" : int, 24 | "title" : "Wallpaper anime", 25 | "user" : "celebrities", 26 | }, 27 | 28 | { 29 | "#url" : "https://www.imgth.com/gallery/37/wallpaper-anime", 30 | "#category": ("", "imgth", "gallery"), 31 | "#class" : imgth.ImgthGalleryExtractor, 32 | }, 33 | 34 | ) 35 | -------------------------------------------------------------------------------- /test/results/itchio.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import itchio 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://sirtartarus.itch.io/a-craft-of-mine", 13 | "#category": ("", "itchio", "game"), 14 | "#class" : itchio.ItchioGameExtractor, 15 | "#pattern" : r"https://(dl.itch.zone|itchio-mirror.\w+.r2.cloudflarestorage.com)/upload2/game/1983311/\d+\?", 16 | "#count" : 3, 17 | 18 | "extension": "", 19 | "filename" : r"re:\d+", 20 | "game" : { 21 | "id" : 1983311, 22 | "noun" : "game", 23 | "title": "A Craft Of Mine", 24 | "url" : "https://sirtartarus.itch.io/a-craft-of-mine", 25 | }, 26 | "user" : { 27 | "id" : 4060052, 28 | "name": "SirTartarus", 29 | "url" : "https://sirtartarus.itch.io", 30 | }, 31 | }, 32 | 33 | ) 34 | -------------------------------------------------------------------------------- /test/results/kabeuchi.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import kabeuchi 8 | from gallery_dl import exception 9 | 10 | 11 | __tests__ = ( 12 | { 13 | "#url" : "https://kabe-uchiroom.com/mypage/?id=919865303848255493", 14 | "#category": ("", "kabeuchi", "user"), 15 | "#class" : kabeuchi.KabeuchiUserExtractor, 16 | "#pattern" : r"https://kabe-uchiroom\.com/accounts/upfile/3/919865303848255493/\w+\.jpe?g", 17 | "#count" : ">= 24", 18 | }, 19 | 20 | { 21 | "#url" : "https://kabe-uchiroom.com/mypage/?id=123456789", 22 | "#category": ("", "kabeuchi", "user"), 23 | "#class" : kabeuchi.KabeuchiUserExtractor, 24 | "#exception": exception.NotFoundError, 25 | }, 26 | 27 | ) 28 | -------------------------------------------------------------------------------- /test/results/keenspot.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import keenspot 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "http://marksmen.keenspot.com/", 13 | "#comment" : "link", 14 | "#category": ("", "keenspot", "comic"), 15 | "#class" : keenspot.KeenspotComicExtractor, 16 | "#range" : "1-3", 17 | "#sha1_url": "83bcf029103bf8bc865a1988afa4aaeb23709ba6", 18 | }, 19 | 20 | { 21 | "#url" : "http://barkercomic.keenspot.com/", 22 | "#comment" : "id", 23 | "#category": ("", "keenspot", "comic"), 24 | "#class" : keenspot.KeenspotComicExtractor, 25 | "#range" : "1-3", 26 | "#sha1_url": "c4080926db18d00bac641fdd708393b7d61379e6", 27 | }, 28 | 29 | { 30 | "#url" : "http://crowscare.keenspot.com/", 31 | "#comment" : "id v2", 32 | "#category": ("", "keenspot", "comic"), 33 | "#class" : keenspot.KeenspotComicExtractor, 34 | "#range" : "1-3", 35 | "#sha1_url": "a00e66a133dd39005777317da90cef921466fcaa", 36 | }, 37 | 38 | { 39 | "#url" : "http://supernovas.keenspot.com/", 40 | "#comment" : "ks", 41 | "#category": ("", "keenspot", "comic"), 42 | "#class" : keenspot.KeenspotComicExtractor, 43 | "#range" : "1-3", 44 | "#sha1_url": "de21b12887ef31ff82edccbc09d112e3885c3aab", 45 | }, 46 | 47 | { 48 | "#url" : "http://twokinds.keenspot.com/comic/1066/", 49 | "#category": ("", "keenspot", "comic"), 50 | "#class" : keenspot.KeenspotComicExtractor, 51 | "#range" : "1-3", 52 | "#sha1_url": "6a784e11370abfb343dcad9adbb7718f9b7be350", 53 | }, 54 | 55 | ) 56 | -------------------------------------------------------------------------------- /test/results/kohlchan.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import lynxchan 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://kohlchan.net/a/res/4594.html", 13 | "#category": ("lynxchan", "kohlchan", "thread"), 14 | "#class" : lynxchan.LynxchanThreadExtractor, 15 | "#pattern" : r"https://kohlchan\.net/\.media/[0-9a-f]{64}(\.\w+)?$", 16 | "#count" : ">= 80", 17 | }, 18 | 19 | { 20 | "#url" : "https://kohlchan.net/a/", 21 | "#category": ("lynxchan", "kohlchan", "board"), 22 | "#class" : lynxchan.LynxchanBoardExtractor, 23 | "#pattern" : lynxchan.LynxchanThreadExtractor.pattern, 24 | "#count" : ">= 100", 25 | }, 26 | 27 | { 28 | "#url" : "https://kohlchan.net/a/2.html", 29 | "#category": ("lynxchan", "kohlchan", "board"), 30 | "#class" : lynxchan.LynxchanBoardExtractor, 31 | }, 32 | 33 | { 34 | "#url" : "https://kohlchan.net/a/catalog.html", 35 | "#category": ("lynxchan", "kohlchan", "board"), 36 | "#class" : lynxchan.LynxchanBoardExtractor, 37 | }, 38 | 39 | ) 40 | -------------------------------------------------------------------------------- /test/results/lesbianenergy.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import misskey 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://lesbian.energy/@rerorero", 13 | "#category": ("misskey", "lesbian.energy", "user"), 14 | "#class" : misskey.MisskeyUserExtractor, 15 | "#pattern" : r"https://(lesbian.energy/files/\w+|.+/media_attachments/files/.+)", 16 | "#range" : "1-50", 17 | "#count" : 50, 18 | }, 19 | 20 | { 21 | "#url" : "https://lesbian.energy/@nano@mk.yopo.work", 22 | "#category": ("misskey", "lesbian.energy", "user"), 23 | "#class" : misskey.MisskeyUserExtractor, 24 | }, 25 | 26 | { 27 | "#url" : "https://lesbian.energy/notes/995ig09wqy", 28 | "#category": ("misskey", "lesbian.energy", "note"), 29 | "#class" : misskey.MisskeyNoteExtractor, 30 | "#count" : 1, 31 | }, 32 | 33 | { 34 | "#url" : "https://lesbian.energy/notes/96ynd9w5kc", 35 | "#category": ("misskey", "lesbian.energy", "note"), 36 | "#class" : misskey.MisskeyNoteExtractor, 37 | }, 38 | 39 | { 40 | "#url" : "https://lesbian.energy/my/favorites", 41 | "#category": ("misskey", "lesbian.energy", "favorite"), 42 | "#class" : misskey.MisskeyFavoriteExtractor, 43 | }, 44 | 45 | ) 46 | -------------------------------------------------------------------------------- /test/results/lexica.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import lexica 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://lexica.art/?q=tree", 13 | "#category": ("", "lexica", "search"), 14 | "#class" : lexica.LexicaSearchExtractor, 15 | "#pattern" : r"https://lexica-serve-encoded-images2\.sharif\.workers.dev/full_jpg/[0-9a-f-]{36}$", 16 | "#range" : "1-80", 17 | "#count" : 80, 18 | 19 | "height" : int, 20 | "id" : str, 21 | "upscaled_height": int, 22 | "upscaled_width" : int, 23 | "userid" : str, 24 | "width" : int, 25 | "prompt" : { 26 | "c" : int, 27 | "grid" : bool, 28 | "height" : int, 29 | "id" : str, 30 | "images" : list, 31 | "initImage" : None, 32 | "initImageStrength": None, 33 | "model" : "lexica-aperture-v2", 34 | "negativePrompt" : str, 35 | "prompt" : str, 36 | "seed" : str, 37 | "timestamp" : r"re:\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d.\d\d\dZ", 38 | "width" : int, 39 | }, 40 | }, 41 | 42 | ) 43 | -------------------------------------------------------------------------------- /test/results/lightroom.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import lightroom 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://lightroom.adobe.com/shares/0c9cce2033f24d24975423fe616368bf", 13 | "#category": ("", "lightroom", "gallery"), 14 | "#class" : lightroom.LightroomGalleryExtractor, 15 | "#count" : ">= 55", 16 | 17 | "title": "Sterne und Nachtphotos", 18 | "user" : "Christian Schrang", 19 | }, 20 | 21 | { 22 | "#url" : "https://lightroom.adobe.com/shares/7ba68ad5a97e48608d2e6c57e6082813", 23 | "#category": ("", "lightroom", "gallery"), 24 | "#class" : lightroom.LightroomGalleryExtractor, 25 | "#count" : ">= 180", 26 | 27 | "title": "HEBFC Snr/Res v Brighton", 28 | "user" : "", 29 | }, 30 | 31 | ) 32 | -------------------------------------------------------------------------------- /test/results/lolibooru.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import moebooru 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://lolibooru.moe/post/show/281305/", 13 | "#category": ("moebooru", "lolibooru", "post"), 14 | "#class" : moebooru.MoebooruPostExtractor, 15 | "#options" : {"notes": True}, 16 | "#sha1_content": "a331430223ffc5b23c31649102e7d49f52489b57", 17 | 18 | "notes": list, 19 | }, 20 | 21 | { 22 | "#url" : "https://lolibooru.moe/post/show/287835", 23 | "#category": ("moebooru", "lolibooru", "post"), 24 | "#class" : moebooru.MoebooruPostExtractor, 25 | }, 26 | 27 | { 28 | "#url" : "https://lolibooru.moe/post?tags=ruu_%28tksymkw%29", 29 | "#category": ("moebooru", "lolibooru", "tag"), 30 | "#class" : moebooru.MoebooruTagExtractor, 31 | }, 32 | 33 | { 34 | "#url" : "https://lolibooru.moe/pool/show/239", 35 | "#category": ("moebooru", "lolibooru", "pool"), 36 | "#class" : moebooru.MoebooruPoolExtractor, 37 | }, 38 | 39 | { 40 | "#url" : "https://lolibooru.moe/post/popular_recent", 41 | "#category": ("moebooru", "lolibooru", "popular"), 42 | "#class" : moebooru.MoebooruPopularExtractor, 43 | }, 44 | 45 | ) 46 | -------------------------------------------------------------------------------- /test/results/loungeunderwear.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import shopify 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://loungeunderwear.com/collections/apparel", 13 | "#category": ("shopify", "loungeunderwear", "collection"), 14 | "#class" : shopify.ShopifyCollectionExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://de.loungeunderwear.com/products/ribbed-crop-top-black", 19 | "#category": ("shopify", "loungeunderwear", "product"), 20 | "#class" : shopify.ShopifyProductExtractor, 21 | }, 22 | 23 | ) 24 | -------------------------------------------------------------------------------- /test/results/mangoxo.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import mangoxo 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://www.mangoxo.com/album/lzVOv1Q9", 13 | "#category": ("", "mangoxo", "album"), 14 | "#class" : mangoxo.MangoxoAlbumExtractor, 15 | "#sha1_url": "ad921fe62663b06e7d73997f7d00646cab7bdd0d", 16 | 17 | "channel": { 18 | "id" : "gaxO16d8", 19 | "name" : "Phoenix", 20 | "cover": str, 21 | }, 22 | "album" : { 23 | "id" : "lzVOv1Q9", 24 | "name" : r"re:池永康晟 Ikenaga Yasunari 透出古朴", 25 | "date" : "dt:2019-03-22 14:42:00", 26 | "description": str, 27 | }, 28 | "id" : int, 29 | "num" : int, 30 | "count" : 65, 31 | }, 32 | 33 | { 34 | "#url" : "https://www.mangoxo.com/phoenix/album", 35 | "#category": ("", "mangoxo", "channel"), 36 | "#class" : mangoxo.MangoxoChannelExtractor, 37 | "#pattern" : mangoxo.MangoxoAlbumExtractor.pattern, 38 | "#range" : "1-30", 39 | "#count" : "> 20", 40 | }, 41 | 42 | ) 43 | -------------------------------------------------------------------------------- /test/results/mariowiki.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import wikimedia 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://www.mariowiki.com/Rabbit", 13 | "#category": ("wikimedia", "mariowiki", "article"), 14 | "#class" : wikimedia.WikimediaArticleExtractor, 15 | "#pattern" : r"https://mario\.wiki\.gallery/images/.+", 16 | "#count" : range(20, 50), 17 | }, 18 | 19 | ) 20 | -------------------------------------------------------------------------------- /test/results/mediawiki.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import wikimedia 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://www.mediawiki.org/wiki/Help:Navigation", 13 | "#category": ("wikimedia", "mediawiki", "help"), 14 | "#class" : wikimedia.WikimediaArticleExtractor, 15 | "#urls" : ( 16 | "https://upload.wikimedia.org/wikipedia/commons/e/ec/OOjs_UI_icon_information-progressive.svg", 17 | "https://upload.wikimedia.org/wikipedia/commons/6/62/PD-icon.svg", 18 | "https://upload.wikimedia.org/wikipedia/commons/0/0e/Vector_Sidebar.png", 19 | "https://upload.wikimedia.org/wikipedia/commons/7/77/Vector_page_tabs.png", 20 | "https://upload.wikimedia.org/wikipedia/commons/6/6e/Vector_user_links.png", 21 | ), 22 | }, 23 | 24 | ) 25 | -------------------------------------------------------------------------------- /test/results/michaelscameras.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import shopify 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://michaels.com.au/collections/microphones", 13 | "#category": ("shopify", "michaelscameras", "collection"), 14 | "#class" : shopify.ShopifyCollectionExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://michaels.com.au/collections/audio/products/boya-by-wm4-pro-k5-2-4ghz-mic-android-1-1-101281", 19 | "#category": ("shopify", "michaelscameras", "product"), 20 | "#class" : shopify.ShopifyProductExtractor, 21 | }, 22 | 23 | ) 24 | -------------------------------------------------------------------------------- /test/results/misskeydesign.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import misskey 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://misskey.design/@machina_3D", 13 | "#category": ("misskey", "misskey.design", "user"), 14 | "#class" : misskey.MisskeyUserExtractor, 15 | "#pattern" : r"https://file\.misskey\.design/post/[\w-]{36}\.\w+", 16 | "#range" : "1-50", 17 | "#count" : 50, 18 | }, 19 | 20 | { 21 | "#url" : "https://misskey.design/@blooddj@pawoo.net", 22 | "#category": ("misskey", "misskey.design", "user"), 23 | "#class" : misskey.MisskeyUserExtractor, 24 | "#count" : "> 30", 25 | }, 26 | 27 | { 28 | "#url" : "https://misskey.design/@kujyo_t/following", 29 | "#category": ("misskey", "misskey.design", "following"), 30 | "#class" : misskey.MisskeyFollowingExtractor, 31 | "#count" : ">= 250", 32 | }, 33 | 34 | { 35 | "#url" : "https://misskey.design/notes/9jva1danjc", 36 | "#category": ("misskey", "misskey.design", "note"), 37 | "#class" : misskey.MisskeyNoteExtractor, 38 | "#urls" : "https://file.misskey.design/post/a8d27901-24e1-42ab-b8a6-1e09c98c6f55.webp", 39 | }, 40 | 41 | { 42 | "#url" : "https://misskey.design/my/favorites", 43 | "#category": ("misskey", "misskey.design", "favorite"), 44 | "#class" : misskey.MisskeyFavoriteExtractor, 45 | }, 46 | 47 | { 48 | "#url" : "https://misskey.design/api/i/favorites", 49 | "#category": ("misskey", "misskey.design", "favorite"), 50 | "#class" : misskey.MisskeyFavoriteExtractor, 51 | }, 52 | 53 | ) 54 | -------------------------------------------------------------------------------- /test/results/modcloth.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import shopify 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://modcloth.com/collections/shoes", 13 | "#category": ("shopify", "modcloth", "collection"), 14 | "#class" : shopify.ShopifyCollectionExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://modcloth.com/collections/shoes/products/heidii-brn", 19 | "#category": ("shopify", "modcloth", "product"), 20 | "#class" : shopify.ShopifyProductExtractor, 21 | }, 22 | 23 | ) 24 | -------------------------------------------------------------------------------- /test/results/myhentaigallery.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import myhentaigallery 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://myhentaigallery.com/g/16247", 13 | "#category": ("", "myhentaigallery", "gallery"), 14 | "#class" : myhentaigallery.MyhentaigalleryGalleryExtractor, 15 | "#pattern" : r"https://(cdn|images)\.myhentaicomics\.com/m\w\w/images/[^/]+/original/\d+\.jpg", 16 | 17 | "artist" : list, 18 | "count" : 11, 19 | "gallery_id": 16247, 20 | "group" : list, 21 | "parodies" : list, 22 | "tags" : ["Giantess"], 23 | "title" : "Attack Of The 50ft Woman 1", 24 | }, 25 | 26 | { 27 | "#url" : "https://myhentaigallery.com/gallery/thumbnails/16247", 28 | "#category": ("", "myhentaigallery", "gallery"), 29 | "#class" : myhentaigallery.MyhentaigalleryGalleryExtractor, 30 | }, 31 | 32 | { 33 | "#url" : "https://myhentaigallery.com/gallery/show/16247/1", 34 | "#category": ("", "myhentaigallery", "gallery"), 35 | "#class" : myhentaigallery.MyhentaigalleryGalleryExtractor, 36 | }, 37 | 38 | ) 39 | -------------------------------------------------------------------------------- /test/results/myportfolio.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import myportfolio 8 | from gallery_dl import exception 9 | 10 | 11 | __tests__ = ( 12 | { 13 | "#url" : "https://andrewling.myportfolio.com/volvo-xc-90-hybrid", 14 | "#category": ("", "myportfolio", "gallery"), 15 | "#class" : myportfolio.MyportfolioGalleryExtractor, 16 | "#sha1_url" : "acea0690c76db0e5cf267648cefd86e921bc3499", 17 | "#sha1_metadata": "6ac6befe2ee0af921d24cf1dd4a4ed71be06db6d", 18 | }, 19 | 20 | { 21 | "#url" : "https://andrewling.myportfolio.com/", 22 | "#category": ("", "myportfolio", "gallery"), 23 | "#class" : myportfolio.MyportfolioGalleryExtractor, 24 | "#pattern" : r"https://andrewling\.myportfolio\.com/[^/?#+]+$", 25 | "#count" : ">= 6", 26 | }, 27 | 28 | { 29 | "#url" : "https://stevenilousphotography.myportfolio.com/society", 30 | "#category": ("", "myportfolio", "gallery"), 31 | "#class" : myportfolio.MyportfolioGalleryExtractor, 32 | "#exception": exception.NotFoundError, 33 | }, 34 | 35 | { 36 | "#url" : "myportfolio:https://tooco.com.ar/6-of-diamonds-paradise-bird", 37 | "#comment" : "custom domain", 38 | "#category": ("", "myportfolio", "gallery"), 39 | "#class" : myportfolio.MyportfolioGalleryExtractor, 40 | "#count" : 3, 41 | }, 42 | 43 | { 44 | "#url" : "myportfolio:https://tooco.com.ar/", 45 | "#category": ("", "myportfolio", "gallery"), 46 | "#class" : myportfolio.MyportfolioGalleryExtractor, 47 | "#pattern" : myportfolio.MyportfolioGalleryExtractor.pattern, 48 | "#count" : ">= 40", 49 | }, 50 | 51 | ) 52 | -------------------------------------------------------------------------------- /test/results/noop.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import noop 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "noop", 13 | "#class" : noop.NoopExtractor, 14 | "#urls" : (), 15 | "#count" : 0, 16 | }, 17 | 18 | { 19 | "#url" : "nop", 20 | "#class" : noop.NoopExtractor, 21 | }, 22 | 23 | { 24 | "#url" : "NOOP", 25 | "#class" : noop.NoopExtractor, 26 | }, 27 | 28 | ) 29 | -------------------------------------------------------------------------------- /test/results/nsfwalbum.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import nsfwalbum 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://nsfwalbum.com/album/401611", 13 | "#category": ("", "nsfwalbum", "album"), 14 | "#class" : nsfwalbum.NsfwalbumAlbumExtractor, 15 | "#range" : "1-5", 16 | "#urls" : ( 17 | "https://img70.imgspice.com/i/05457/mio2bu5xbrxe.jpg", 18 | "https://img70.imgspice.com/i/05457/zgpxa8kr4h1d.jpg", 19 | "https://img70.imgspice.com/i/05457/3379nxsm9lx8.jpg", 20 | "https://img70.imgspice.com/i/05457/pncrkhspuoa3.jpg", 21 | "https://img70.imgspice.com/i/05457/128b2odt216a.jpg", 22 | ), 23 | 24 | "album_id" : 401611, 25 | "extension": "jpg", 26 | "filename" : str, 27 | "height" : range(1365, 2048), 28 | "id" : int, 29 | "models" : [], 30 | "num" : range(1, 5), 31 | "studio" : "Met-Art", 32 | "title" : "Met-Art - Katherine A - Difuza 25.05.2014 (134 photos)(4368 X 2912)", 33 | "width" : range(1365, 2048), 34 | }, 35 | 36 | ) 37 | -------------------------------------------------------------------------------- /test/results/ohpolly.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import shopify 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://www.ohpolly.com/collections/dresses-mini-dresses", 13 | "#category": ("shopify", "ohpolly", "collection"), 14 | "#class" : shopify.ShopifyCollectionExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://www.ohpolly.com/products/edonia-ruched-triangle-cup-a-line-mini-dress-brown", 19 | "#category": ("shopify", "ohpolly", "product"), 20 | "#class" : shopify.ShopifyProductExtractor, 21 | }, 22 | 23 | ) 24 | -------------------------------------------------------------------------------- /test/results/omgmiamiswimwear.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import shopify 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://www.omgmiamiswimwear.com/collections/fajas", 13 | "#category": ("shopify", "omgmiamiswimwear", "collection"), 14 | "#class" : shopify.ShopifyCollectionExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://www.omgmiamiswimwear.com/products/snatch-me-waist-belt", 19 | "#category": ("shopify", "omgmiamiswimwear", "product"), 20 | "#class" : shopify.ShopifyProductExtractor, 21 | "#pattern" : r"https://cdn\.shopify\.com/s/files/1/1819/6171/", 22 | "#count" : 3, 23 | }, 24 | 25 | ) 26 | -------------------------------------------------------------------------------- /test/results/palanq.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import foolfuuka 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://archive.palanq.win/c/thread/4209598/", 13 | "#category": ("foolfuuka", "palanq", "thread"), 14 | "#class" : foolfuuka.FoolfuukaThreadExtractor, 15 | "#sha1_url": "1f9b5570d228f1f2991c827a6631030bc0e5933c", 16 | }, 17 | 18 | { 19 | "#url" : "https://archive.palanq.win/c/", 20 | "#category": ("foolfuuka", "palanq", "board"), 21 | "#class" : foolfuuka.FoolfuukaBoardExtractor, 22 | }, 23 | 24 | { 25 | "#url" : "https://archive.palanq.win/_/search/text/test/", 26 | "#category": ("foolfuuka", "palanq", "search"), 27 | "#class" : foolfuuka.FoolfuukaSearchExtractor, 28 | }, 29 | 30 | { 31 | "#url" : "https://archive.palanq.win/c/gallery", 32 | "#category": ("foolfuuka", "palanq", "gallery"), 33 | "#class" : foolfuuka.FoolfuukaGalleryExtractor, 34 | }, 35 | 36 | ) 37 | -------------------------------------------------------------------------------- /test/results/pawoo.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import mastodon 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://pawoo.net/@yoru_nine/", 13 | "#category": ("mastodon", "pawoo", "user"), 14 | "#class" : mastodon.MastodonUserExtractor, 15 | "#range" : "1-60", 16 | "#count" : 60, 17 | }, 18 | 19 | { 20 | "#url" : "https://pawoo.net/bookmarks", 21 | "#category": ("mastodon", "pawoo", "bookmark"), 22 | "#class" : mastodon.MastodonBookmarkExtractor, 23 | }, 24 | 25 | { 26 | "#url" : "https://pawoo.net/users/yoru_nine/following", 27 | "#category": ("mastodon", "pawoo", "following"), 28 | "#class" : mastodon.MastodonFollowingExtractor, 29 | }, 30 | 31 | { 32 | "#url" : "https://pawoo.net/@yoru_nine/105038878897832922", 33 | "#category": ("mastodon", "pawoo", "status"), 34 | "#class" : mastodon.MastodonStatusExtractor, 35 | "#sha1_content": "b52e807f8ab548d6f896b09218ece01eba83987a", 36 | }, 37 | 38 | ) 39 | -------------------------------------------------------------------------------- /test/results/philomena.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import philomena 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "philomena:https://manebooru.art/307071", 13 | "#comment" : "'view_url' yields 404 (#6922)", 14 | "#category": ("philomena", "manebooru.art", "post"), 15 | "#class" : philomena.PhilomenaPostExtractor, 16 | "#urls" : "https://static.manebooru.art/img/view/2020/10/27/307071.png", 17 | "#sha1_content": "82c21bfb2675449893fa4b2546546f404019b3c8", 18 | 19 | "date" : "dt:2020-10-27 11:58:40" 20 | }, 21 | 22 | { 23 | "#url" : "philomena:https://ponerpics.org/images/1", 24 | "#category": ("philomena", "ponerpics.org", "post"), 25 | "#class" : philomena.PhilomenaPostExtractor, 26 | "#urls" : "https://ponerpics.org/img/view/2012/1/2/1.png", 27 | 28 | "date" : "dt:2012-01-02 03:12:33" 29 | }, 30 | 31 | ) 32 | -------------------------------------------------------------------------------- /test/results/photovogue.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import photovogue 8 | import datetime 9 | 10 | 11 | __tests__ = ( 12 | { 13 | "#url" : "https://www.vogue.com/photovogue/photographers/221252", 14 | "#category": ("", "photovogue", "user"), 15 | "#class" : photovogue.PhotovogueUserExtractor, 16 | }, 17 | 18 | { 19 | "#url" : "https://vogue.com/photovogue/photographers/221252", 20 | "#category": ("", "photovogue", "user"), 21 | "#class" : photovogue.PhotovogueUserExtractor, 22 | "#pattern" : "https://images.vogue.it/Photovogue/[^/]+_gallery.jpg", 23 | 24 | "date" : datetime.datetime, 25 | "favorite_count" : int, 26 | "favorited" : list, 27 | "id" : int, 28 | "image_id" : str, 29 | "is_favorite" : False, 30 | "orientation" : r"re:portrait|landscape", 31 | "photographer" : { 32 | "biography" : "Born in 1995. Live in Bologna.", 33 | "city" : "Bologna", 34 | "country_id" : 106, 35 | "favoritedCount": int, 36 | "id" : 221252, 37 | "isGold" : bool, 38 | "isPro" : bool, 39 | "latitude" : str, 40 | "longitude" : str, 41 | "name" : "Arianna Mattarozzi", 42 | "user_id" : "38cb0601-4a85-453c-b7dc-7650a037f2ab", 43 | "websites" : list, 44 | }, 45 | "photographer_id": 221252, 46 | "tags" : list, 47 | "title" : str, 48 | }, 49 | 50 | ) 51 | -------------------------------------------------------------------------------- /test/results/picarto.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import picarto 8 | import datetime 9 | 10 | 11 | __tests__ = ( 12 | { 13 | "#url" : "https://picarto.tv/fnook/gallery/default/", 14 | "#category": ("", "picarto", "gallery"), 15 | "#class" : picarto.PicartoGalleryExtractor, 16 | "#pattern" : r"https://images\.picarto\.tv/gallery/\d/\d\d/\d+/artwork/[0-9a-f-]+/large-[0-9a-f]+\.(jpg|png|gif)", 17 | "#count" : ">= 7", 18 | 19 | "date": datetime.datetime, 20 | }, 21 | 22 | ) 23 | -------------------------------------------------------------------------------- /test/results/pidgiwiki.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import wikimedia 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://www.pidgi.net/wiki/File:Key_art_-_Fight_Knight.png", 13 | "#category": ("wikimedia", "pidgiwiki", "file"), 14 | "#class" : wikimedia.WikimediaArticleExtractor, 15 | "#urls" : "https://cdn.pidgi.net/images/0/0c/Key_art_-_Fight_Knight.png", 16 | }, 17 | 18 | { 19 | "#url" : "https://pidgi.net/wiki/File:Key_art_-_Fight_Knight.png", 20 | "#category": ("wikimedia", "pidgiwiki", "file"), 21 | "#class" : wikimedia.WikimediaArticleExtractor, 22 | }, 23 | 24 | ) 25 | -------------------------------------------------------------------------------- /test/results/pinupgirlclothing.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import shopify 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://pinupgirlclothing.com/collections/evening", 13 | "#category": ("shopify", "pinupgirlclothing", "collection"), 14 | "#class" : shopify.ShopifyCollectionExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://pinupgirlclothing.com/collections/evening/products/clarice-coat-dress-in-olive-green-poly-crepe-laura-byrnes-design", 19 | "#category": ("shopify", "pinupgirlclothing", "product"), 20 | "#class" : shopify.ShopifyProductExtractor, 21 | }, 22 | 23 | ) 24 | -------------------------------------------------------------------------------- /test/results/pixhost.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import imagehosts 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://pixhost.to/show/190/130327671_test-.png", 13 | "#category": ("imagehost", "pixhost", "image"), 14 | "#class" : imagehosts.PixhostImageExtractor, 15 | "#sha1_url" : "4e5470dcf6513944773044d40d883221bbc46cff", 16 | "#sha1_metadata": "3bad6d59db42a5ebbd7842c2307e1c3ebd35e6b0", 17 | "#sha1_content" : "0c8768055e4e20e7c7259608b67799171b691140", 18 | }, 19 | 20 | { 21 | "#url" : "https://pixhost.to/gallery/jSMFq", 22 | "#category": ("imagehost", "pixhost", "gallery"), 23 | "#class" : imagehosts.PixhostGalleryExtractor, 24 | "#pattern" : imagehosts.PixhostImageExtractor.pattern, 25 | "#count" : 3, 26 | }, 27 | 28 | ) 29 | -------------------------------------------------------------------------------- /test/results/plurk.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import plurk 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://www.plurk.com/plurkapi", 13 | "#category": ("", "plurk", "timeline"), 14 | "#class" : plurk.PlurkTimelineExtractor, 15 | "#pattern" : "https?://.+", 16 | "#count" : ">= 23", 17 | }, 18 | 19 | { 20 | "#url" : "https://www.plurk.com/p/i701j1", 21 | "#category": ("", "plurk", "post"), 22 | "#class" : plurk.PlurkPostExtractor, 23 | "#count" : 3, 24 | "#sha1_url": "2115f208564591b8748525c2807a84596aaaaa5f", 25 | }, 26 | 27 | { 28 | "#url" : "https://www.plurk.com/p/i701j1", 29 | "#category": ("", "plurk", "post"), 30 | "#class" : plurk.PlurkPostExtractor, 31 | "#options" : {"comments": True}, 32 | "#count" : ">= 210", 33 | }, 34 | 35 | ) 36 | -------------------------------------------------------------------------------- /test/results/ponybooru.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import philomena 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://ponybooru.org/images/1", 13 | "#category": ("philomena", "ponybooru", "post"), 14 | "#class" : philomena.PhilomenaPostExtractor, 15 | "#sha1_content": "bca26f58fafd791fe07adcd2a28efd7751824605", 16 | }, 17 | 18 | { 19 | "#url" : "https://www.ponybooru.org/images/1", 20 | "#category": ("philomena", "ponybooru", "post"), 21 | "#class" : philomena.PhilomenaPostExtractor, 22 | }, 23 | 24 | { 25 | "#url" : "https://ponybooru.org/search?q=cute", 26 | "#category": ("philomena", "ponybooru", "search"), 27 | "#class" : philomena.PhilomenaSearchExtractor, 28 | "#range" : "40-60", 29 | "#count" : 21, 30 | }, 31 | 32 | { 33 | "#url" : "https://ponybooru.org/galleries/27", 34 | "#category": ("philomena", "ponybooru", "gallery"), 35 | "#class" : philomena.PhilomenaGalleryExtractor, 36 | "#count" : ">= 24", 37 | }, 38 | 39 | ) 40 | -------------------------------------------------------------------------------- /test/results/poringa.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import poringa 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "http://www.poringa.net/posts/imagenes/3051081/Turrita-alto-ojete.html", 13 | "#category": ("", "poringa", "post"), 14 | "#class" : poringa.PoringaPostExtractor, 15 | "#count" : 26, 16 | 17 | "count" : 26, 18 | "num" : range(1, 26), 19 | "post_id" : "3051081", 20 | "title" : "turrita alto ojete...", 21 | "user" : "vipower1top", 22 | }, 23 | 24 | { 25 | "#url" : "http://www.poringa.net/posts/imagenes/3095554/Otra-culona-de-instagram.html", 26 | "#category": ("", "poringa", "post"), 27 | "#class" : poringa.PoringaPostExtractor, 28 | "#count" : 15, 29 | 30 | "count" : 15, 31 | "num" : range(1, 15), 32 | "post_id" : "3095554", 33 | "title" : "Otra culona de instagram", 34 | "user" : "Expectro007", 35 | }, 36 | 37 | { 38 | "#url" : "http://www.poringa.net/Expectro007", 39 | "#category": ("", "poringa", "user"), 40 | "#class" : poringa.PoringaUserExtractor, 41 | "#pattern" : r"https?://img-\d+\.poringa\.net/poringa/img/././././././Expectro007/\w{3}\.(jpg|png|gif)", 42 | "#count" : range(500, 600), 43 | }, 44 | 45 | { 46 | "#url" : "http://www.poringa.net/buscar/?&q=yuslopez", 47 | "#category": ("", "poringa", "search"), 48 | "#class" : poringa.PoringaSearchExtractor, 49 | "#pattern" : r"https?://img-\d+\.poringa\.net/poringa/img/././././././\w+/\w{3}\.(jpg|png|gif)", 50 | "#range" : "1-50", 51 | "#count" : 50, 52 | }, 53 | 54 | ) 55 | -------------------------------------------------------------------------------- /test/results/postimg.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import imagehosts 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://postimages.org/Wtn2b3hC", 13 | "#category": ("imagehost", "postimg", "image"), 14 | "#class" : imagehosts.PostimgImageExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://www.postimages.org/Wtn2b3hC", 19 | "#category": ("imagehost", "postimg", "image"), 20 | "#class" : imagehosts.PostimgImageExtractor, 21 | }, 22 | 23 | { 24 | "#url" : "https://pixxxels.cc/Wtn2b3hC", 25 | "#category": ("imagehost", "postimg", "image"), 26 | "#class" : imagehosts.PostimgImageExtractor, 27 | }, 28 | 29 | { 30 | "#url" : "https://postimg.cc/Wtn2b3hC", 31 | "#category": ("imagehost", "postimg", "image"), 32 | "#class" : imagehosts.PostimgImageExtractor, 33 | "#sha1_url" : "72f3c8b1d6c6601a20ad58f35635494b4891a99e", 34 | "#sha1_metadata": "2d05808d04e4e83e33200db83521af06e3147a84", 35 | "#sha1_content" : "cfaa8def53ed1a575e0c665c9d6d8cf2aac7a0ee", 36 | }, 37 | 38 | { 39 | "#url" : "https://postimg.cc/gallery/wxpDLgX", 40 | "#category": ("imagehost", "postimg", "gallery"), 41 | "#class" : imagehosts.PostimgGalleryExtractor, 42 | "#pattern" : imagehosts.PostimgImageExtractor.pattern, 43 | "#count" : 22, 44 | }, 45 | 46 | ) 47 | -------------------------------------------------------------------------------- /test/results/raidlondon.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import shopify 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://www.raidlondon.com/collections/flats", 13 | "#category": ("shopify", "raidlondon", "collection"), 14 | "#class" : shopify.ShopifyCollectionExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://www.raidlondon.com/collections/flats/products/raid-addyson-chunky-flat-shoe-in-white", 19 | "#category": ("shopify", "raidlondon", "product"), 20 | "#class" : shopify.ShopifyProductExtractor, 21 | }, 22 | 23 | ) 24 | -------------------------------------------------------------------------------- /test/results/rbt.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import foolfuuka 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://rbt.asia/g/thread/61487650/", 13 | "#category": ("foolfuuka", "rbt", "thread"), 14 | "#class" : foolfuuka.FoolfuukaThreadExtractor, 15 | "#sha1_url": "fadd274b25150a1bdf03a40c58db320fa3b617c4", 16 | }, 17 | 18 | { 19 | "#url" : "https://archive.rebeccablacktech.com/g/thread/61487650/", 20 | "#category": ("foolfuuka", "rbt", "thread"), 21 | "#class" : foolfuuka.FoolfuukaThreadExtractor, 22 | "#sha1_url": "fadd274b25150a1bdf03a40c58db320fa3b617c4", 23 | }, 24 | 25 | { 26 | "#url" : "https://rbt.asia/g/", 27 | "#category": ("foolfuuka", "rbt", "board"), 28 | "#class" : foolfuuka.FoolfuukaBoardExtractor, 29 | }, 30 | 31 | { 32 | "#url" : "https://rbt.asia/_/search/text/test/", 33 | "#category": ("foolfuuka", "rbt", "search"), 34 | "#class" : foolfuuka.FoolfuukaSearchExtractor, 35 | }, 36 | 37 | { 38 | "#url" : "https://rbt.asia/g/gallery/8", 39 | "#category": ("foolfuuka", "rbt", "gallery"), 40 | "#class" : foolfuuka.FoolfuukaGalleryExtractor, 41 | }, 42 | 43 | ) 44 | -------------------------------------------------------------------------------- /test/results/reactor.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import reactor 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "http://reactor.cc/tag/gif", 13 | "#category": ("reactor", "reactor", "tag"), 14 | "#class" : reactor.ReactorTagExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "http://reactor.cc/search?q=Art", 19 | "#category": ("reactor", "reactor", "search"), 20 | "#class" : reactor.ReactorSearchExtractor, 21 | }, 22 | 23 | { 24 | "#url" : "http://reactor.cc/user/Dioklet", 25 | "#category": ("reactor", "reactor", "user"), 26 | "#class" : reactor.ReactorUserExtractor, 27 | }, 28 | 29 | { 30 | "#url" : "http://reactor.cc/post/4999736", 31 | "#category": ("reactor", "reactor", "post"), 32 | "#class" : reactor.ReactorPostExtractor, 33 | "#sha1_url": "dfc74d150d7267384d8c229c4b82aa210755daa0", 34 | }, 35 | 36 | ) 37 | -------------------------------------------------------------------------------- /test/results/readcomiconline.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import readcomiconline 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://readcomiconline.li/Comic/W-i-t-c-h/Issue-130?id=22289", 13 | "#category": ("", "readcomiconline", "issue"), 14 | "#class" : readcomiconline.ReadcomiconlineIssueExtractor, 15 | "#pattern" : r"https://2\.bp\.blogspot\.com/[\w-]+=s0\?.+", 16 | "#count" : 36, 17 | "#sha1_metadata": "2d9ec81ce1b11fac06ebf96ce33cdbfca0e85eb5", 18 | }, 19 | 20 | { 21 | "#url" : "https://readcomiconline.li/Comic/W-i-t-c-h", 22 | "#category": ("", "readcomiconline", "comic"), 23 | "#class" : readcomiconline.ReadcomiconlineComicExtractor, 24 | "#sha1_url" : "74eb8b9504b4084fcc9367b341300b2c52260918", 25 | "#sha1_metadata": "3986248e4458fa44a201ec073c3684917f48ee0c", 26 | }, 27 | 28 | { 29 | "#url" : "https://readcomiconline.to/Comic/Bazooka-Jules", 30 | "#category": ("", "readcomiconline", "comic"), 31 | "#class" : readcomiconline.ReadcomiconlineComicExtractor, 32 | "#sha1_url" : "2f66a467a772df4d4592e97a059ddbc3e8991799", 33 | "#sha1_metadata": "f5ba5246cd787bb750924d9690cb1549199bd516", 34 | }, 35 | 36 | ) 37 | -------------------------------------------------------------------------------- /test/results/recursive.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import recursive 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "recursive:https://pastebin.com/raw/FLwrCYsT", 13 | "#category": ("", "recursive", ""), 14 | "#class" : recursive.RecursiveExtractor, 15 | "#sha1_url": "eee86d65c346361b818e8f4b2b307d9429f136a2", 16 | }, 17 | 18 | ) 19 | -------------------------------------------------------------------------------- /test/results/rule34us.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import rule34us 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://rule34.us/index.php?r=posts/index&q=[terios]_elysion", 13 | "#category": ("booru", "rule34us", "tag"), 14 | "#class" : rule34us.Rule34usTagExtractor, 15 | "#pattern" : r"https://img\d*\.rule34\.us/images/../../[0-9a-f]{32}\.\w+", 16 | "#count" : 10, 17 | }, 18 | 19 | { 20 | "#url" : "https://rule34.us/index.php?r=posts/view&id=3709005", 21 | "#category": ("booru", "rule34us", "post"), 22 | "#class" : rule34us.Rule34usPostExtractor, 23 | "#pattern" : r"https://img\d*\.rule34\.us/images/14/7b/147bee6fc2e13f73f5f9bac9d4930b13\.png", 24 | "#sha1_content": "d714342ea84050f82dda5f0c194d677337abafc5", 25 | }, 26 | 27 | { 28 | "#url" : "https://rule34.us/index.php?r=posts/view&id=4576310", 29 | "#category": ("booru", "rule34us", "post"), 30 | "#class" : rule34us.Rule34usPostExtractor, 31 | "#pattern" : r"https://video-cdn\d\.rule34\.us/images/a2/94/a294ff8e1f8e0efa041e5dc9d1480011\.mp4", 32 | 33 | "extension" : "mp4", 34 | "file_url" : str, 35 | "filename" : "a294ff8e1f8e0efa041e5dc9d1480011", 36 | "height" : "3982", 37 | "id" : "4576310", 38 | "md5" : "a294ff8e1f8e0efa041e5dc9d1480011", 39 | "score" : r"re:\d+", 40 | "tags" : "tagme, video", 41 | "tags_general" : "video", 42 | "tags_metadata": "tagme", 43 | "uploader" : "Anonymous", 44 | "width" : "3184", 45 | }, 46 | 47 | ) 48 | -------------------------------------------------------------------------------- /test/results/slickpic.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import slickpic 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://mattcrandall.slickpic.com/albums/LamborghiniMurcielago/", 13 | "#category": ("", "slickpic", "album"), 14 | "#class" : slickpic.SlickpicAlbumExtractor, 15 | "#pattern" : r"https://stored-cf\.slickpic\.com/NDk5MjNmYTc1MzU0MQ,,/20160807/\w+/p/o/JSBFSS-\d+\.jpg", 16 | "#count" : 102, 17 | "#sha1_metadata": "c37c4ce9c54c09abc6abdf295855d46f11529cbf", 18 | }, 19 | 20 | { 21 | "#url" : "https://mattcrandall.slickpic.com/albums/LamborghiniMurcielago/", 22 | "#category": ("", "slickpic", "album"), 23 | "#class" : slickpic.SlickpicAlbumExtractor, 24 | "#range" : "34", 25 | "#sha1_content": [ 26 | "276eb2c902187bb177ae8013e310e1d6641fba9a", 27 | "52b5a310587de1048030ab13a912f6a3a9cc7dab", 28 | "cec6630e659dc72db1ee1a9a6f3b525189261988", 29 | "6f81e1e74c6cd6db36844e7211eef8e7cd30055d", 30 | "22e83645fc242bc3584eca7ec982c8a53a4d8a44", 31 | ], 32 | }, 33 | 34 | { 35 | "#url" : "https://mattcrandall.slickpic.com/gallery/", 36 | "#category": ("", "slickpic", "user"), 37 | "#class" : slickpic.SlickpicUserExtractor, 38 | "#pattern" : slickpic.SlickpicAlbumExtractor.pattern, 39 | "#count" : ">= 358", 40 | }, 41 | 42 | { 43 | "#url" : "https://mattcrandall.slickpic.com/", 44 | "#category": ("", "slickpic", "user"), 45 | "#class" : slickpic.SlickpicUserExtractor, 46 | }, 47 | 48 | ) 49 | -------------------------------------------------------------------------------- /test/results/smugloli.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import vichan 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://smuglo.li/a/res/1143245.html", 13 | "#category": ("vichan", "smugloli", "thread"), 14 | "#class" : vichan.VichanThreadExtractor, 15 | "#pattern" : r"https://smug.+/a/src/\d+(-\d)?\.\w+", 16 | "#count" : ">= 50", 17 | 18 | "board" : "a", 19 | "thread": "1143245", 20 | "title": "Rabbit Rabbit Thread #4", 21 | }, 22 | 23 | { 24 | "#url" : "https://smugloli.net/a/res/1145409.html", 25 | "#category": ("vichan", "smugloli", "thread"), 26 | "#class" : vichan.VichanThreadExtractor, 27 | }, 28 | 29 | { 30 | "#url" : "https://smuglo.li/a", 31 | "#category": ("vichan", "smugloli", "board"), 32 | "#class" : vichan.VichanBoardExtractor, 33 | "#pattern" : vichan.VichanThreadExtractor.pattern, 34 | "#count" : ">= 100", 35 | }, 36 | 37 | { 38 | "#url" : "https://smuglo.li/a/1.html", 39 | "#category": ("vichan", "smugloli", "board"), 40 | "#class" : vichan.VichanBoardExtractor, 41 | }, 42 | 43 | { 44 | "#url" : "https://smugloli.net/cute/catalog.html", 45 | "#category": ("vichan", "smugloli", "board"), 46 | "#class" : vichan.VichanBoardExtractor, 47 | }, 48 | 49 | ) 50 | -------------------------------------------------------------------------------- /test/results/soundgasm.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import soundgasm 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://soundgasm.net/u/ClassWarAndPuppies2/687-Otto-von-Toontown-12822", 13 | "#category": ("", "soundgasm", "audio"), 14 | "#class" : soundgasm.SoundgasmAudioExtractor, 15 | "#pattern" : r"https://media\.soundgasm\.net/sounds/26cb2b23b2f2c6094b40ee3a9167271e274b570a\.m4a", 16 | 17 | "description": "We celebrate today’s important prisoner swap, and finally bring the 2022 mid-terms to a close with Raphael Warnock’s defeat of Herschel Walker in Georgia. Then, we take a look at the Qanon-addled attempt to overthrow the German government and install Heinrich XIII Prince of Reuss as kaiser.", 18 | "extension" : "m4a", 19 | "filename" : "26cb2b23b2f2c6094b40ee3a9167271e274b570a", 20 | "slug" : "687-Otto-von-Toontown-12822", 21 | "title" : "687 - Otto von Toontown (12/8/22)", 22 | "user" : "ClassWarAndPuppies2", 23 | }, 24 | 25 | { 26 | "#url" : "https://www.soundgasm.net/user/ClassWarAndPuppies2/687-Otto-von-Toontown-12822", 27 | "#category": ("", "soundgasm", "audio"), 28 | "#class" : soundgasm.SoundgasmAudioExtractor, 29 | }, 30 | 31 | { 32 | "#url" : "https://soundgasm.net/u/fierce-aphrodite", 33 | "#category": ("", "soundgasm", "user"), 34 | "#class" : soundgasm.SoundgasmUserExtractor, 35 | "#pattern" : r"https://media\.soundgasm\.net/sounds/[0-9a-f]{40}\.m4a", 36 | "#count" : ">= 15", 37 | 38 | "description": str, 39 | "extension" : "m4a", 40 | "filename" : r"re:^[0-9a-f]{40}$", 41 | "slug" : str, 42 | "title" : str, 43 | "url" : str, 44 | "user" : "fierce-aphrodite", 45 | }, 46 | 47 | ) 48 | -------------------------------------------------------------------------------- /test/results/speakerdeck.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import speakerdeck 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://speakerdeck.com/speakerdeck/introduction-to-speakerdeck", 13 | "#category": ("", "speakerdeck", "presentation"), 14 | "#class" : speakerdeck.SpeakerdeckPresentationExtractor, 15 | "#pattern" : r"https://files.speakerdeck.com/presentations/50021f75cf1db900020005e7/slide_\d+.jpg", 16 | "#count" : 6, 17 | "#sha1_content": "75c7abf0969b0bcab23e0da9712c95ee5113db3a", 18 | 19 | "author" : "Speaker Deck", 20 | "count" : 6, 21 | "num" : range(1, 6), 22 | "presentation" : "introduction-to-speakerdeck", 23 | "presentation_id": "50021f75cf1db900020005e7", 24 | "title" : "Introduction to SpeakerDeck", 25 | "user" : "speakerdeck", 26 | }, 27 | 28 | ) 29 | -------------------------------------------------------------------------------- /test/results/sushiski.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import misskey 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://sushi.ski/@ui@misskey.04.si", 13 | "#category": ("misskey", "sushi.ski", "user"), 14 | "#class" : misskey.MisskeyUserExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://sushi.ski/@hatusimo_sigure/following", 19 | "#category": ("misskey", "sushi.ski", "following"), 20 | "#class" : misskey.MisskeyFollowingExtractor, 21 | }, 22 | 23 | { 24 | "#url" : "https://sushi.ski/notes/9bm3x4ksqw", 25 | "#category": ("misskey", "sushi.ski", "note"), 26 | "#class" : misskey.MisskeyNoteExtractor, 27 | "#pattern" : r"https://media\.sushi\.ski/files/[\w-]+\.png", 28 | "#count" : 1, 29 | }, 30 | 31 | { 32 | "#url" : "https://sushi.ski/my/favorites", 33 | "#category": ("misskey", "sushi.ski", "favorite"), 34 | "#class" : misskey.MisskeyFavoriteExtractor, 35 | }, 36 | 37 | ) 38 | -------------------------------------------------------------------------------- /test/results/tbib.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import gelbooru_v02 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://tbib.org/index.php?page=post&s=list&tags=yuyaiyaui", 13 | "#category": ("gelbooru_v02", "tbib", "tag"), 14 | "#class" : gelbooru_v02.GelbooruV02TagExtractor, 15 | "#count" : ">= 120", 16 | }, 17 | 18 | { 19 | "#url" : "https://tbib.org/index.php?page=favorites&s=view&id=7881", 20 | "#category": ("gelbooru_v02", "tbib", "favorite"), 21 | "#class" : gelbooru_v02.GelbooruV02FavoriteExtractor, 22 | "#count" : 3, 23 | }, 24 | 25 | { 26 | "#url" : "https://tbib.org/index.php?page=post&s=view&id=9233957", 27 | "#category": ("gelbooru_v02", "tbib", "post"), 28 | "#class" : gelbooru_v02.GelbooruV02PostExtractor, 29 | "#sha1_url" : "5a6ebe07bfff8e6d27f7c30b5480f27abcb577d2", 30 | "#sha1_content": "1c3831b6fbaa4686e3c79035b5d98460b1c85c43", 31 | }, 32 | 33 | ) 34 | -------------------------------------------------------------------------------- /test/results/tco.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import urlshortener 8 | from gallery_dl import exception 9 | 10 | 11 | __tests__ = ( 12 | { 13 | "#url" : "https://t.co/bCgBY8Iv5n", 14 | "#category": ("urlshortener", "tco", "link"), 15 | "#class" : urlshortener.UrlshortenerLinkExtractor, 16 | "#pattern" : "^https://twitter.com/elonmusk/status/1421395561324896257/photo/1", 17 | "#count" : 1, 18 | }, 19 | 20 | { 21 | "#url" : "https://t.co/abcdefghij", 22 | "#category": ("urlshortener", "tco", "link"), 23 | "#class" : urlshortener.UrlshortenerLinkExtractor, 24 | "#exception": exception.NotFoundError, 25 | }, 26 | 27 | ) 28 | -------------------------------------------------------------------------------- /test/results/thebarchive.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import foolfuuka 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://thebarchive.com/b/thread/739772332/", 13 | "#category": ("foolfuuka", "thebarchive", "thread"), 14 | "#class" : foolfuuka.FoolfuukaThreadExtractor, 15 | "#sha1_url": "e8b18001307d130d67db31740ce57c8561b5d80c", 16 | }, 17 | 18 | { 19 | "#url" : "https://thebarchive.com/b/", 20 | "#category": ("foolfuuka", "thebarchive", "board"), 21 | "#class" : foolfuuka.FoolfuukaBoardExtractor, 22 | }, 23 | 24 | { 25 | "#url" : "https://thebarchive.com/_/search/text/test/", 26 | "#category": ("foolfuuka", "thebarchive", "search"), 27 | "#class" : foolfuuka.FoolfuukaSearchExtractor, 28 | }, 29 | 30 | { 31 | "#url" : "https://thebarchive.com/b/gallery/9", 32 | "#category": ("foolfuuka", "thebarchive", "gallery"), 33 | "#class" : foolfuuka.FoolfuukaGalleryExtractor, 34 | }, 35 | 36 | ) 37 | -------------------------------------------------------------------------------- /test/results/thecollection.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import gelbooru_v01 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://the-collection.booru.org/index.php?page=post&s=list&tags=parody", 13 | "#category": ("gelbooru_v01", "thecollection", "tag"), 14 | "#class" : gelbooru_v01.GelbooruV01TagExtractor, 15 | "#range" : "1-25", 16 | "#count" : 25, 17 | }, 18 | 19 | { 20 | "#url" : "https://the-collection.booru.org/index.php?page=favorites&s=view&id=1166", 21 | "#category": ("gelbooru_v01", "thecollection", "favorite"), 22 | "#class" : gelbooru_v01.GelbooruV01FavoriteExtractor, 23 | "#count" : 2, 24 | }, 25 | 26 | { 27 | "#url" : "https://the-collection.booru.org/index.php?page=post&s=view&id=100520", 28 | "#category": ("gelbooru_v01", "thecollection", "post"), 29 | "#class" : gelbooru_v01.GelbooruV01PostExtractor, 30 | "#sha1_url" : "0329ac8588bb93cf242ca0edbe3e995b4ba554e8", 31 | "#sha1_content": "1e585874e7b874f7937df1060dd1517fef2f4dfb", 32 | }, 33 | 34 | ) 35 | -------------------------------------------------------------------------------- /test/results/tmohentai.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import tmohentai 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://tmohentai.com/contents/653c2aeaa693c", 13 | "#category": ("", "tmohentai", "gallery"), 14 | "#class" : tmohentai.TmohentaiGalleryExtractor, 15 | "#pattern" : r"https://imgrojo\.tmohentai\.com/contents/653c2aeaa693c/\d\d\d\.webp", 16 | "#count" : 46, 17 | 18 | "artists" : ["Andoryu"], 19 | "genres" : [ 20 | "Big Breasts", 21 | "BlowJob", 22 | "Cheating", 23 | "Mature", 24 | "Milf", 25 | "Student", 26 | ], 27 | "count" : 46, 28 | "extension" : "webp", 29 | "gallery_id": "653c2aeaa693c", 30 | "language" : "Español", 31 | "num" : int, 32 | "tags" : [ 33 | "milf", 34 | "Madre", 35 | "enormes pechos", 36 | "Peluda", 37 | "nakadashi", 38 | "cheating", 39 | "madura", 40 | "sexo a escondidas", 41 | "Ama de casa", 42 | "mamada", 43 | ], 44 | "title" : "La Mama de mi Novia es tan Pervertida que no Pude Soportarlo mas", 45 | "uploader" : "NekoCreme Fansub", 46 | }, 47 | 48 | { 49 | "#url" : "https://tmohentai.com/reader/653c2aeaa693c/paginated/1", 50 | "#category": ("", "tmohentai", "gallery"), 51 | "#class" : tmohentai.TmohentaiGalleryExtractor, 52 | }, 53 | 54 | ) 55 | -------------------------------------------------------------------------------- /test/results/tumblrgallery.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import tumblrgallery 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://tumblrgallery.xyz/tumblrblog/gallery/103975.html", 13 | "#category": ("", "tumblrgallery", "tumblrblog"), 14 | "#class" : tumblrgallery.TumblrgalleryTumblrblogExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://tumblrgallery.xyz/post/405674.html", 19 | "#category": ("", "tumblrgallery", "post"), 20 | "#class" : tumblrgallery.TumblrgalleryPostExtractor, 21 | "#pattern" : r"https://78\.media\.tumblr\.com/bec67072219c1f3bc04fd9711dec42ef/tumblr_p51qq1XCHS1txhgk3o1_1280\.jpg", 22 | "#count" : 3, 23 | }, 24 | 25 | { 26 | "#url" : "https://tumblrgallery.xyz/s.php?q=everyday-life", 27 | "#category": ("", "tumblrgallery", "search"), 28 | "#class" : tumblrgallery.TumblrgallerySearchExtractor, 29 | "#pattern" : r"https://\d+\.media\.tumblr\.com/.+", 30 | "#count" : "< 1000", 31 | }, 32 | 33 | ) 34 | -------------------------------------------------------------------------------- /test/results/turboimagehost.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import imagehosts 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://www.turboimagehost.com/p/39078423/test--.png.html", 13 | "#category": ("imagehost", "turboimagehost", "image"), 14 | "#class" : imagehosts.TurboimagehostImageExtractor, 15 | "#sha1_url" : "b94de43612318771ced924cb5085976f13b3b90e", 16 | "#sha1_metadata": "704757ca8825f51cec516ec44c1e627c1f2058ca", 17 | "#sha1_content" : ( 18 | "f38b54b17cd7462e687b58d83f00fca88b1b105a", 19 | "0c8768055e4e20e7c7259608b67799171b691140", 20 | "961b25d85b5f5bd18cbe3e847ac55925f14d0286" 21 | ), 22 | }, 23 | 24 | { 25 | "#url" : "https://www.turboimagehost.com/album/344597/testimagegallery", 26 | "#category": ("imagehost", "turboimagehost", "gallery"), 27 | "#class" : imagehosts.TurboimagehostGalleryExtractor, 28 | "#pattern" : imagehosts.TurboimagehostImageExtractor.pattern, 29 | "#sha1_url": "f2d4fe102fdd71dd1f595cdb0c16ce999d6bb19b", 30 | "#count" : 110, 31 | }, 32 | 33 | ) 34 | -------------------------------------------------------------------------------- /test/results/unique-vintage.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import shopify 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://www.unique-vintage.com/collections/flapper-1920s", 13 | "#category": ("shopify", "unique-vintage", "collection"), 14 | "#class" : shopify.ShopifyCollectionExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://www.unique-vintage.com/collections/flapper-1920s/products/unique-vintage-plus-size-black-silver-beaded-troyes-flapper-dress", 19 | "#category": ("shopify", "unique-vintage", "product"), 20 | "#class" : shopify.ShopifyProductExtractor, 21 | }, 22 | 23 | ) 24 | -------------------------------------------------------------------------------- /test/results/uploadir.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import uploadir 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://uploadir.com/u/rd3t46ry", 13 | "#comment" : "image", 14 | "#category": ("", "uploadir", "file"), 15 | "#class" : uploadir.UploadirFileExtractor, 16 | "#pattern" : r"https://uploadir\.com/u/rd3t46ry", 17 | "#count" : 1, 18 | 19 | "extension": "jpg", 20 | "filename" : "Chloe and Rachel 4K jpg", 21 | "id" : "rd3t46ry", 22 | }, 23 | 24 | { 25 | "#url" : "https://uploadir.com/uploads/gxe8ti9v/downloads/new", 26 | "#comment" : "archive", 27 | "#category": ("", "uploadir", "file"), 28 | "#class" : uploadir.UploadirFileExtractor, 29 | "#pattern" : r"https://uploadir\.com/uploads/gxe8ti9v/downloads", 30 | "#count" : 1, 31 | 32 | "extension": "zip", 33 | "filename" : "NYAN-Mods-Pack#1", 34 | "id" : "gxe8ti9v", 35 | }, 36 | 37 | { 38 | "#url" : "https://uploadir.com/u/fllda6xl", 39 | "#comment" : "utf-8 filename", 40 | "#category": ("", "uploadir", "file"), 41 | "#class" : uploadir.UploadirFileExtractor, 42 | "#pattern" : r"https://uploadir\.com/u/fllda6xl", 43 | "#count" : 1, 44 | 45 | "extension": "png", 46 | "filename" : "_圖片_🖼_image_", 47 | "id" : "fllda6xl", 48 | }, 49 | 50 | { 51 | "#url" : "https://uploadir.com/uploads/rd3t46ry", 52 | "#category": ("", "uploadir", "file"), 53 | "#class" : uploadir.UploadirFileExtractor, 54 | }, 55 | 56 | { 57 | "#url" : "https://uploadir.com/user/uploads/rd3t46ry", 58 | "#category": ("", "uploadir", "file"), 59 | "#class" : uploadir.UploadirFileExtractor, 60 | }, 61 | 62 | ) 63 | -------------------------------------------------------------------------------- /test/results/vanillarock.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import vanillarock 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://vanilla-rock.com/mizuhashi_parsee-5", 13 | "#category": ("", "vanillarock", "post"), 14 | "#class" : vanillarock.VanillarockPostExtractor, 15 | "#sha1_url" : "7fb9a4d18d9fa22d7295fee8d94ab5a7a52265dd", 16 | "#sha1_metadata": "b91df99b714e1958d9636748b1c81a07c3ef52c9", 17 | }, 18 | 19 | { 20 | "#url" : "https://vanilla-rock.com/tag/%e5%b0%84%e5%91%bd%e4%b8%b8%e6%96%87", 21 | "#category": ("", "vanillarock", "tag"), 22 | "#class" : vanillarock.VanillarockTagExtractor, 23 | "#pattern" : vanillarock.VanillarockPostExtractor.pattern, 24 | "#count" : ">= 12", 25 | }, 26 | 27 | { 28 | "#url" : "https://vanilla-rock.com/category/%e4%ba%8c%e6%ac%a1%e3%82%a8%e3%83%ad%e7%94%bb%e5%83%8f/%e8%90%8c%e3%81%88%e3%83%bb%e3%82%bd%e3%83%95%e3%83%88%e3%82%a8%e3%83%ad", 29 | "#category": ("", "vanillarock", "tag"), 30 | "#class" : vanillarock.VanillarockTagExtractor, 31 | "#pattern" : vanillarock.VanillarockPostExtractor.pattern, 32 | "#count" : ">= 5", 33 | }, 34 | 35 | ) 36 | -------------------------------------------------------------------------------- /test/results/vidyapics.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import shimmie2 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://vidya.pics/post/list/kirby/1", 13 | "#category": ("shimmie2", "vidyapics", "tag"), 14 | "#class" : shimmie2.Shimmie2TagExtractor, 15 | "#pattern" : r"https://vidya.pics/_images/[0-9a-f]{32}/\d+", 16 | "#range" : "1-100", 17 | "#count" : 100, 18 | }, 19 | 20 | { 21 | "#url" : "https://vidya.pics/post/view/108820", 22 | "#category": ("shimmie2", "vidyapics", "post"), 23 | "#class" : shimmie2.Shimmie2PostExtractor, 24 | "#pattern" : r"https://vidya\.pics/_images/277ecdb90285bfa6e0c4cd46d9515b11/108820.+\.png", 25 | "#sha1_content": "7d2fe9327759c231ff17f6e341df749b70b191ce", 26 | 27 | "extension": "png", 28 | "file_url" : "https://vidya.pics/_images/277ecdb90285bfa6e0c4cd46d9515b11/108820%20-%201boy%20artist%3Aunknown%20flag%20kirby%20kirby_%28series%29.png", 29 | "filename" : "108820 - 1boy artist:unknown flag kirby kirby_(series)", 30 | "height" : 700, 31 | "id" : 108820, 32 | "md5" : "277ecdb90285bfa6e0c4cd46d9515b11", 33 | "size" : 0, 34 | "tags" : "1boy artist:unknown flag kirby kirby_(series", 35 | "width" : 700, 36 | }, 37 | 38 | ) 39 | -------------------------------------------------------------------------------- /test/results/vidyart2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import gelbooru_v01 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://vidyart2.booru.org/index.php?page=post&s=list&tags=all", 13 | "#category": ("gelbooru_v01", "vidyart2", "tag"), 14 | "#class" : gelbooru_v01.GelbooruV01TagExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://vidyart2.booru.org/index.php?page=favorites&s=view&id=1", 19 | "#category": ("gelbooru_v01", "vidyart2", "favorite"), 20 | "#class" : gelbooru_v01.GelbooruV01FavoriteExtractor, 21 | }, 22 | 23 | { 24 | "#url" : "https://vidyart2.booru.org/index.php?page=post&s=view&id=39168", 25 | "#category": ("gelbooru_v01", "vidyart2", "post"), 26 | "#class" : gelbooru_v01.GelbooruV01PostExtractor, 27 | }, 28 | 29 | ) 30 | -------------------------------------------------------------------------------- /test/results/vipr.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import imagehosts 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://vipr.im/kcd5jcuhgs3v.html", 13 | "#category": ("imagehost", "vipr", "image"), 14 | "#class" : imagehosts.ViprImageExtractor, 15 | "#sha1_url" : "88f6a3ecbf3356a11ae0868b518c60800e070202", 16 | "#sha1_metadata": "c432e8a1836b0d97045195b745731c2b1bb0e771", 17 | }, 18 | 19 | ) 20 | -------------------------------------------------------------------------------- /test/results/visuabusters.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import szurubooru 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://www.visuabusters.com/booru/posts/query=mincy_mouse", 13 | "#category": ("szurubooru", "visuabusters", "tag"), 14 | "#class" : szurubooru.SzurubooruTagExtractor, 15 | "#pattern" : r"https://www\.visuabusters\.com/booru/data/posts/visuabusters_\d+_\w{16}\.\w+", 16 | "#count" : range(2, 5), 17 | }, 18 | 19 | { 20 | "#url" : "https://www.visuabusters.com/booru/posts/query=", 21 | "#category": ("szurubooru", "visuabusters", "tag"), 22 | "#class" : szurubooru.SzurubooruTagExtractor, 23 | }, 24 | 25 | { 26 | "#url" : "https://visuabusters.com/booru/posts", 27 | "#category": ("szurubooru", "visuabusters", "tag"), 28 | "#class" : szurubooru.SzurubooruTagExtractor, 29 | }, 30 | 31 | { 32 | "#url" : "https://www.visuabusters.com/booru/post/2485", 33 | "#category": ("szurubooru", "visuabusters", "post"), 34 | "#class" : szurubooru.SzurubooruPostExtractor, 35 | "#urls" : "https://www.visuabusters.com/booru/data/posts/visuabusters_2485_ynmXFhNmBs3x0cCm.gif", 36 | "#sha1_content": "781fc0f063503d9d3f282558b9fcd69e37045e88", 37 | }, 38 | 39 | ) 40 | -------------------------------------------------------------------------------- /test/results/wallpapercave.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import wallpapercave 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://wallpapercave.com/w/wp10270355", 13 | "#category": ("", "wallpapercave", "image"), 14 | "#class" : wallpapercave.WallpapercaveImageExtractor, 15 | "#urls" : "https://wallpapercave.com/download/sekai-saikou-no-ansatsusha-isekai-kizoku-ni-tensei-suru-wallpapers-wp10270355", 16 | "#sha1_content": "58b088aaa1cf1a60e347015019eb0c5a22b263a6", 17 | }, 18 | 19 | { 20 | "#url" : "https://wallpapercave.com/apple-wwdc-2024-wallpapers", 21 | "#comment" : "album listing", 22 | "#category": ("", "wallpapercave", "image"), 23 | "#class" : wallpapercave.WallpapercaveImageExtractor, 24 | "#archive" : False, 25 | "#urls" : [ 26 | "https://wallpapercave.com/wp/wp13775438.jpg", 27 | "https://wallpapercave.com/wp/wp13775439.jpg", 28 | "https://wallpapercave.com/wp/wp13775440.jpg", 29 | "https://wallpapercave.com/wp/wp13775441.jpg", 30 | ], 31 | }, 32 | 33 | ) 34 | -------------------------------------------------------------------------------- /test/results/webmshare.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import webmshare 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://webmshare.com/O9mWY", 13 | "#category": ("", "webmshare", "video"), 14 | "#class" : webmshare.WebmshareVideoExtractor, 15 | 16 | "date" : "dt:2022-12-04 00:00:00", 17 | "extension": "webm", 18 | "filename" : "O9mWY", 19 | "height" : 568, 20 | "id" : "O9mWY", 21 | "thumb" : "https://s1.webmshare.com/t/O9mWY.jpg", 22 | "title" : "Yeah buddy over here", 23 | "url" : "https://s1.webmshare.com/O9mWY.webm", 24 | "views" : int, 25 | "width" : 320, 26 | }, 27 | 28 | { 29 | "#url" : "https://s1.webmshare.com/zBGAg.webm", 30 | "#category": ("", "webmshare", "video"), 31 | "#class" : webmshare.WebmshareVideoExtractor, 32 | 33 | "date" : "dt:2018-12-07 00:00:00", 34 | "height": 1080, 35 | "id" : "zBGAg", 36 | "thumb" : "https://s1.webmshare.com/t/zBGAg.jpg", 37 | "title" : "", 38 | "url" : "https://s1.webmshare.com/zBGAg.webm", 39 | "views" : int, 40 | "width" : 1920, 41 | }, 42 | 43 | { 44 | "#url" : "https://webmshare.com/play/zBGAg", 45 | "#category": ("", "webmshare", "video"), 46 | "#class" : webmshare.WebmshareVideoExtractor, 47 | }, 48 | 49 | { 50 | "#url" : "https://webmshare.com/download-webm/zBGAg", 51 | "#category": ("", "webmshare", "video"), 52 | "#class" : webmshare.WebmshareVideoExtractor, 53 | }, 54 | 55 | ) 56 | -------------------------------------------------------------------------------- /test/results/wikibooks.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import wikimedia 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://www.wikibooks.org/wiki/Title", 13 | "#category": ("wikimedia", "wikibooks", "article"), 14 | "#class" : wikimedia.WikimediaArticleExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://en.wikibooks.org/wiki/Category:Title", 19 | "#category": ("wikimedia", "wikibooks", "category"), 20 | "#class" : wikimedia.WikimediaArticleExtractor, 21 | }, 22 | 23 | ) 24 | -------------------------------------------------------------------------------- /test/results/wikidata.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import wikimedia 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://www.wikidata.org/wiki/Title", 13 | "#category": ("wikimedia", "wikidata", "article"), 14 | "#class" : wikimedia.WikimediaArticleExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://en.wikidata.org/wiki/Category:Title", 19 | "#category": ("wikimedia", "wikidata", "category"), 20 | "#class" : wikimedia.WikimediaArticleExtractor, 21 | }, 22 | 23 | ) 24 | -------------------------------------------------------------------------------- /test/results/wikifeet.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import wikifeet 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://www.wikifeet.com/Madison_Beer", 13 | "#category": ("", "wikifeet", "gallery"), 14 | "#class" : wikifeet.WikifeetGalleryExtractor, 15 | "#pattern" : r"https://pics\.wikifeet\.com/Madison_Beer-Feet-\d+\.jpg", 16 | "#count" : ">= 352", 17 | 18 | "celeb" : "Madison_Beer", 19 | "celebrity" : "Madison Beer", 20 | "birthday" : "dt:1999-03-05 00:00:00", 21 | "birthplace": "United States", 22 | "rating" : float, 23 | "pid" : int, 24 | "width" : int, 25 | "height" : int, 26 | "shoesize" : r"re:\d+", 27 | "type" : "women", 28 | "tags" : list, 29 | }, 30 | 31 | { 32 | "#url" : "https://men.wikifeet.com/Chris_Hemsworth", 33 | "#category": ("", "wikifeet", "gallery"), 34 | "#class" : wikifeet.WikifeetGalleryExtractor, 35 | "#pattern" : r"https://pics\.wikifeet\.com/Chris_Hemsworth-Feet-\d+\.jpg", 36 | "#count" : ">= 860", 37 | 38 | "celeb" : "Chris_Hemsworth", 39 | "celebrity" : "Chris Hemsworth", 40 | "birthday" : "dt:1983-08-11 00:00:00", 41 | "birthplace": "Australia", 42 | "rating" : float, 43 | "pid" : int, 44 | "width" : int, 45 | "height" : int, 46 | "shoesize" : "22", 47 | "type" : "men", 48 | "tags" : list, 49 | }, 50 | 51 | ) 52 | -------------------------------------------------------------------------------- /test/results/wikifeetx.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import wikifeet 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://www.wikifeetx.com/Tifa_Quinn", 13 | "#category": ("", "wikifeetx", "gallery"), 14 | "#class" : wikifeet.WikifeetGalleryExtractor, 15 | "#pattern" : r"https://pics\.wikifeet\.com/Tifa_Quinn-Feet-\d+\.jpg", 16 | "#count" : ">= 9", 17 | 18 | "celeb" : "Tifa_Quinn", 19 | "celebrity" : "Tifa Quinn", 20 | "birthday" : "", 21 | "birthplace": "United States", 22 | "rating" : float, 23 | "pid" : int, 24 | "width" : int, 25 | "height" : int, 26 | "shoesize" : "5", 27 | "type" : "women", 28 | "tags" : list, 29 | }, 30 | 31 | ) 32 | -------------------------------------------------------------------------------- /test/results/wikigg.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import wikimedia 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://www.wiki.gg/wiki/Title", 13 | "#comment" : "for scripts/supportedsites.py", 14 | "#category": ("wikimedia", "wikigg-www", "article"), 15 | "#class" : wikimedia.WikimediaArticleExtractor, 16 | }, 17 | 18 | { 19 | "#url" : "https://hearthstone.wiki.gg/wiki/Flame_Juggler", 20 | "#category": ("wikimedia", "wikigg-hearthstone", "article"), 21 | "#class" : wikimedia.WikimediaArticleExtractor, 22 | }, 23 | 24 | { 25 | "#url" : "https://terraria.wiki.gg/de/wiki/Golem", 26 | "#comment" : "non-English language prefix (#6370)", 27 | "#category": ("wikimedia", "wikigg-terraria", "article"), 28 | "#class" : wikimedia.WikimediaArticleExtractor, 29 | "#count" : "> 45", 30 | "#archive" : False, 31 | }, 32 | 33 | ) 34 | -------------------------------------------------------------------------------- /test/results/wikinews.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import wikimedia 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://www.wikinews.org/wiki/Title", 13 | "#category": ("wikimedia", "wikinews", "article"), 14 | "#class" : wikimedia.WikimediaArticleExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://en.wikinews.org/wiki/Category:Title", 19 | "#category": ("wikimedia", "wikinews", "category"), 20 | "#class" : wikimedia.WikimediaArticleExtractor, 21 | }, 22 | 23 | ) 24 | -------------------------------------------------------------------------------- /test/results/wikipedia.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import wikimedia 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://www.wikipedia.org/wiki/Title", 13 | "#category": ("wikimedia", "wikipedia", "article"), 14 | "#class" : wikimedia.WikimediaArticleExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://en.wikipedia.org/wiki/Athena", 19 | "#category": ("wikimedia", "wikipedia", "article"), 20 | "#class" : wikimedia.WikimediaArticleExtractor, 21 | "#pattern" : r"https://upload.wikimedia.org/wikipedia/.+", 22 | "#count" : range(50, 100), 23 | 24 | "bitdepth" : int, 25 | "canonicaltitle": str, 26 | "comment" : str, 27 | "commonmetadata": dict, 28 | "date" : "type:datetime", 29 | "descriptionshorturl": str, 30 | "descriptionurl": str, 31 | "extension" : str, 32 | "extmetadata" : dict, 33 | "filename" : str, 34 | "height" : int, 35 | "metadata" : dict, 36 | "mime" : r"re:image/\w+", 37 | "page" : "Athena", 38 | "sha1" : r"re:^[0-9a-f]{40}$", 39 | "size" : int, 40 | "timestamp" : str, 41 | "url" : str, 42 | "user" : str, 43 | "userid" : int, 44 | "width" : int, 45 | }, 46 | 47 | { 48 | "#url" : "https://en.wikipedia.org/wiki/Category:Physics", 49 | "#category": ("wikimedia", "wikipedia", "category"), 50 | "#class" : wikimedia.WikimediaArticleExtractor, 51 | }, 52 | 53 | { 54 | "#url" : "https://en.wikipedia.org", 55 | "#category": ("wikimedia", "wikipedia", "wiki"), 56 | "#class" : wikimedia.WikimediaWikiExtractor, 57 | "#range" : "1-10", 58 | "#count" : 10, 59 | }, 60 | 61 | ) 62 | -------------------------------------------------------------------------------- /test/results/wikiquote.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import wikimedia 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://www.wikiquote.org/wiki/Title", 13 | "#category": ("wikimedia", "wikiquote", "article"), 14 | "#class" : wikimedia.WikimediaArticleExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://en.wikiquote.org/wiki/Category:Title", 19 | "#category": ("wikimedia", "wikiquote", "category"), 20 | "#class" : wikimedia.WikimediaArticleExtractor, 21 | }, 22 | 23 | ) 24 | -------------------------------------------------------------------------------- /test/results/wikisource.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import wikimedia 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://www.wikisource.org/wiki/Title", 13 | "#category": ("wikimedia", "wikisource", "article"), 14 | "#class" : wikimedia.WikimediaArticleExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://en.wikisource.org/wiki/Category:Title", 19 | "#category": ("wikimedia", "wikisource", "category"), 20 | "#class" : wikimedia.WikimediaArticleExtractor, 21 | }, 22 | 23 | ) 24 | -------------------------------------------------------------------------------- /test/results/wikispecies.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import wikimedia 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://species.wikimedia.org/wiki/Geranospiza", 13 | "#category": ("wikimedia", "wikispecies", "article"), 14 | "#class" : wikimedia.WikimediaArticleExtractor, 15 | "#urls" : "https://upload.wikimedia.org/wikipedia/commons/0/01/Geranospiza_caerulescens.jpg", 16 | "#sha1_content": "3a17c14b15489928e4154f826af1c42afb5a523e", 17 | }, 18 | 19 | { 20 | "#url" : "https://species.wikimedia.org/wiki/Category:Names", 21 | "#category": ("wikimedia", "wikispecies", "category"), 22 | "#class" : wikimedia.WikimediaArticleExtractor, 23 | }, 24 | 25 | ) 26 | -------------------------------------------------------------------------------- /test/results/wikiversity.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import wikimedia 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://www.wikiversity.org/wiki/Title", 13 | "#category": ("wikimedia", "wikiversity", "article"), 14 | "#class" : wikimedia.WikimediaArticleExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://en.wikiversity.org/wiki/Category:Title", 19 | "#category": ("wikimedia", "wikiversity", "category"), 20 | "#class" : wikimedia.WikimediaArticleExtractor, 21 | }, 22 | 23 | ) 24 | -------------------------------------------------------------------------------- /test/results/wikivoyage.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import wikimedia 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://www.wikivoyage.org/wiki/Title", 13 | "#category": ("wikimedia", "wikivoyage", "article"), 14 | "#class" : wikimedia.WikimediaArticleExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://en.wikivoyage.org/wiki/Category:Title", 19 | "#category": ("wikimedia", "wikivoyage", "category"), 20 | "#class" : wikimedia.WikimediaArticleExtractor, 21 | }, 22 | 23 | ) 24 | -------------------------------------------------------------------------------- /test/results/wiktionary.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import wikimedia 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://www.wiktionary.org/wiki/Word", 13 | "#category": ("wikimedia", "wiktionary", "article"), 14 | "#class" : wikimedia.WikimediaArticleExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://en.wiktionary.org/wiki/Category:Words", 19 | "#category": ("wikimedia", "wiktionary", "category"), 20 | "#class" : wikimedia.WikimediaArticleExtractor, 21 | }, 22 | 23 | ) 24 | -------------------------------------------------------------------------------- /test/results/windsorstore.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import shopify 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://www.windsorstore.com/collections/dresses-ball-gowns", 13 | "#category": ("shopify", "windsorstore", "collection"), 14 | "#class" : shopify.ShopifyCollectionExtractor, 15 | }, 16 | 17 | { 18 | "#url" : "https://www.windsorstore.com/collections/accessories-belts/products/rhine-buckle-dbl-o-ring-pu-strap-belt-073010158001", 19 | "#category": ("shopify", "windsorstore", "product"), 20 | "#class" : shopify.ShopifyProductExtractor, 21 | }, 22 | 23 | ) 24 | -------------------------------------------------------------------------------- /test/results/xbooru.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import gelbooru_v02 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "https://xbooru.com/index.php?page=post&s=list&tags=konoyan", 13 | "#category": ("gelbooru_v02", "xbooru", "tag"), 14 | "#class" : gelbooru_v02.GelbooruV02TagExtractor, 15 | "#count" : range(28, 40), 16 | }, 17 | 18 | { 19 | "#url" : "https://xbooru.com/index.php?page=pool&s=show&id=757", 20 | "#category": ("gelbooru_v02", "xbooru", "pool"), 21 | "#class" : gelbooru_v02.GelbooruV02PoolExtractor, 22 | "#urls": ( 23 | "https://img.xbooru.com/images/154/aeca160f8c7131f6a93033adac5416d7.jpeg", 24 | "https://img.xbooru.com/images/278/6185a8a71547568020e45e8319c02978.jpeg", 25 | "https://img.xbooru.com/images/524/0fc2b1e2e3cc8be259e9712ca3f48b0b.jpeg", 26 | "https://img.xbooru.com/images/253/74412b59a60fac5040c6cfe8efe7a625.jpeg", 27 | "https://img.xbooru.com/images/590/2eacd900958a467fb053b8a92145b55b.jpeg", 28 | ), 29 | }, 30 | 31 | { 32 | "#url" : "https://xbooru.com/index.php?page=favorites&s=view&id=45206", 33 | "#category": ("gelbooru_v02", "xbooru", "favorite"), 34 | "#class" : gelbooru_v02.GelbooruV02FavoriteExtractor, 35 | "#count" : 4, 36 | }, 37 | 38 | { 39 | "#url" : "https://xbooru.com/index.php?page=post&s=view&id=1025649", 40 | "#category": ("gelbooru_v02", "xbooru", "post"), 41 | "#class" : gelbooru_v02.GelbooruV02PostExtractor, 42 | "#pattern" : r"https://img\.xbooru\.com/images/444/f3eda549ad8b9db244ac335c7406c92f\.jpeg", 43 | "#sha1_content": "086668afd445438d491ecc11cee3ac69b4d65530", 44 | }, 45 | 46 | ) 47 | -------------------------------------------------------------------------------- /test/results/ytdl.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # This program is free software; you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License version 2 as 5 | # published by the Free Software Foundation. 6 | 7 | from gallery_dl.extractor import ytdl 8 | 9 | 10 | __tests__ = ( 11 | { 12 | "#url" : "ytdl:https://www.youtube.com/watch?v=BaW_jenozKc&t=1s&end=9", 13 | "#category": ("", "ytdl", "Youtube"), 14 | "#class" : ytdl.YoutubeDLExtractor, 15 | }, 16 | 17 | ) 18 | --------------------------------------------------------------------------------