From 84ef8dfa32715287997f946522283a5a087f80ad Mon Sep 17 00:00:00 2001 From: PBX_g33k Date: Sun, 5 Apr 2026 02:57:44 +0200 Subject: [PATCH 1/2] OPT: remove Gallery-dl web downloader --- .../Downloader/GalleryDlWebDownloader.php | 438 ------------------ 1 file changed, 438 deletions(-) delete mode 100644 api/src/Service/Downloader/GalleryDlWebDownloader.php diff --git a/api/src/Service/Downloader/GalleryDlWebDownloader.php b/api/src/Service/Downloader/GalleryDlWebDownloader.php deleted file mode 100644 index f5f9938..0000000 --- a/api/src/Service/Downloader/GalleryDlWebDownloader.php +++ /dev/null @@ -1,438 +0,0 @@ -getUrl(); - $this->logger->info('Sending URL to gallery-dl web server', ['url' => (string) $uri]); - - $response = $this->httpClient->request('POST', $this->hostUrl.'/gallery-dl/q', [ - 'body' => [ - 'url' => (string) $uri, - ], - ]); - - if (200 !== $response->getStatusCode()) { - $this->logger->error('Failed to send URL to gallery-dl web server', [ - 'url' => (string) $uri, - 'status_code' => $response->getStatusCode(), - 'response' => $response->getContent(false), - ]); - throw new \RuntimeException('Failed to send URL to gallery-dl web server'); - } - - $this->logger->info('Successfully sent URL to gallery-dl web server', ['url' => (string) $uri]); - - return true; - } - - public function getLogFromServer() - { - $this->logger->info('Fetching log from gallery-dl web server'); - - $response = $this->httpClient->request('GET', $this->hostUrl.'/stream/logs'); - - if (200 !== $response->getStatusCode()) { - $this->logger->error('Failed to fetch log from gallery-dl web server', [ - 'status_code' => $response->getStatusCode(), - 'response' => $response->getContent(false), - ]); - throw new \RuntimeException('Failed to fetch log from gallery-dl web server'); - } - - $this->logger->info('Successfully fetched log from gallery-dl web server'); - - return $response->getContent(); - } - - public function getDownloaderType(): DownloaderTypeEnum - { - return DownloaderTypeEnum::WEB_DOWNLOADER; - } - - public function supportsUri(UriInterface $uri): bool - { - foreach ($this->getSupportedDomains() as $domain) { - if (str_contains($uri->getHost(), parse_url($domain, PHP_URL_HOST))) { - return true; - } - } - - return false; - } - - public function getSupportedDomains(): array - { - /* - * List of supported domains by gallery-dl as of 2025-09-12 - * Source: https://github.com/mikf/gallery-dl/blob/master/docs/supportedsites.md - * - * Note: This list may be outdated, please refer to the source for the most up-to-date list. - */ - - return [ - 'http://behoimi.org/', - 'http://blog.livedoor.jp/', - 'http://imgclick.net/', - 'http://joyreactor.cc/', - 'http://pornreactor.cc/', - 'http://reactor.cc/', - 'http://thatpervert.com/', - 'http://www.keenspot.com/', - 'http://www.poringa.net/', - 'https://2ch.hk/', - 'https://35photo.pro/', - 'https://4archive.org/', - 'https://4chanarchives.com/', - 'https://500px.com/', - 'https://8chan.moe/', - 'https://8kun.top/', - 'https://94chan.org/', - 'https://acidimg.cc/', - 'https://agn.ph/', - 'https://aibooru.online/', - 'https://allgirl.booru.org/', - 'https://arca.live/', - 'https://arch.b4k.dev/', - 'https://architizer.com/', - 'https://archive.4plebs.org/', - 'https://archive.palanq.win/', - 'https://archived.moe/', - 'https://archiveofourown.org/', - 'https://archiveofsins.com/', - 'https://aryion.com/', - 'https://azurlane.koumakan.jp/', - 'https://baraag.net/', - 'https://bato.to/', - 'https://bbc.co.uk/', - 'https://bbw-chan.link/', - 'https://bit.ly/', - 'https://blog.naver.com/', - 'https://boards.fireden.net/', - 'https://boards.guro.cx/', - 'https://booru.allthefallen.moe/', - 'https://booru.bcbnsfw.space/', - 'https://booru.borvar.art/', - 'https://booru.cavemanon.xyz/', - 'https://booth.pm/', - 'https://bsky.app/', - 'https://bulbapedia.bulbagarden.net/', - 'https://bunkr.si/', - 'https://catbox.moe/', - 'https://chelseacrew.com/', - 'https://chzzk.naver.com/', - 'https://ci-en.net/', - 'https://co.llection.pics/', - 'https://comic.naver.com/', - 'https://comick.io/', - 'https://comics.8muses.com/', - 'https://comicvine.gamespot.com/', - 'https://commons.wikimedia.org/', - 'https://coomer.st/', - 'https://cyberdrop.me/', - 'https://cyberfile.me/', - 'https://danbooru.donmai.us/', - 'https://danke.moe/', - 'https://derpibooru.org/', - 'https://desktopography.net/', - 'https://desuarchive.org/', - 'https://discord.com/', - 'https://downloads.khinsider.com/', - 'https://drawfriends.booru.org/', - 'https://dynasty-scans.com/', - 'https://e-hentai.org/', - 'https://e621.net/', - 'https://e6ai.net/', - 'https://e926.net/', - 'https://endchan.org/', - 'https://everia.club', - 'https://exhentai.org/', - 'https://fanfox.net/', - 'https://fansly.com/', - 'https://fantia.jp/', - 'https://fapachi.com/', - 'https://fapello.com/', - 'https://fappic.com/', - 'https://furbooru.org/', - 'https://furry34.com/', - 'https://fuskator.com/', - 'https://gelbooru.com/', - 'https://girlsreleased.com/', - 'https://gofile.io/', - 'https://hatenablog.com', - 'https://hentai-cosplay-xxx.com/', - 'https://hentai-img-xxx.com/', - 'https://hentai2read.com/', - 'https://hentaienvy.com/', - 'https://hentaiera.com/', - 'https://hentaifox.com/', - 'https://hentaihand.com/', - 'https://hentaihere.com/', - 'https://hentainexus.com/', - 'https://hentairox.com/', - 'https://hentaizap.com/', - 'https://hiperdex.com/', - 'https://hitomi.la/', - 'https://horne.red/', - 'https://hotleak.vip/', - 'https://hypnohub.net/', - 'https://illusioncards.booru.org/', - 'https://imagepond.net/', - 'https://imagetwist.com/', - 'https://img.kiwi/', - 'https://imgadult.com/', - 'https://imgbb.com/', - 'https://imgbox.com/', - 'https://imgchest.com/', - 'https://imgdrive.net/', - 'https://imgspice.com/', - 'https://imgtaxi.com/', - 'https://imgth.com/', - 'https://imgur.com/', - 'https://imgwallet.com/', - 'https://imhentai.xxx/', - 'https://imx.to/', - 'https://inkbunny.net/', - 'https://issuu.com/', - 'https://itaku.ee/', - 'https://itch.io/', - 'https://jpg6.su/', - 'https://kabe-uchiroom.com/', - 'https://kemono.cr/', - 'https://kohlchan.net/', - 'https://komikcast.li/', - 'https://konachan.com/', - 'https://leakgallery.com', - 'https://lensdump.com/', - 'https://lesbian.energy/', - 'https://lexica.art/', - 'https://lightroom.adobe.com/', - 'https://lolibooru.moe/', - 'https://loungeunderwear.com/', - 'https://manga.madokami.al/', - 'https://mangadex.org/', - 'https://mangapark.net/', - 'https://mangaread.org/', - 'https://mastodon.social/', - 'https://members.luscious.net/', - 'https://michaels.com.au/', - 'https://misskey.art/', - 'https://misskey.design/', - 'https://misskey.io/', - 'https://modcloth.com/', - 'https://motherless.com/', - 'https://myhentaigallery.com/', - 'https://nekohouse.su/', - 'https://news.sankakucomplex.com/', - 'https://nhentai.net/', - 'https://nijie.info/', - 'https://niyaniya.moe/', - 'https://noz.rip/booru/', - 'https://nozomi.la/', - 'https://nsfwalbum.com/', - 'https://nudostar.tv/', - 'https://pawoo.net/', - 'https://pexels.com/', - 'https://picarto.tv/', - 'https://picstate.com/', - 'https://pictoa.com/', - 'https://piczel.tv/', - 'https://pinupgirlclothing.com/', - 'https://pixeldrain.com/', - 'https://pixhost.to/', - 'https://poipiku.com/', - 'https://ponybooru.org/', - 'https://porn-image.com/', - 'https://postimages.org/', - 'https://raddle.me/', - 'https://raw.senmanga.com/', - 'https://rawkuma.net/', - 'https://rbt.asia/', - 'https://readcomiconline.li/', - 'https://realbooru.com/', - 'https://redbust.com/', - 'https://redgifs.com/', - 'https://rule34.paheal.net/', - 'https://rule34.us/', - 'https://rule34.xxx/', - 'https://rule34.xyz/', - 'https://rule34hentai.net/', - 'https://rule34vault.com/', - 'https://safebooru.org/', - 'https://saint2.su/', - 'https://sankaku.app/', - 'https://scrolller.com/', - 'https://seiga.nicovideo.jp/', - 'https://silverpic.com/', - 'https://simpcity.cr/', - 'https://sizebooru.com/', - 'https://skeb.jp/', - 'https://smuglo.li/', - 'https://snootbooru.com/', - 'https://soundgasm.net/', - 'https://speakerdeck.com/', - 'https://species.wikimedia.org/', - 'https://sturdychan.help/', - 'https://sushi.ski/', - 'https://t.co/', - 'https://tapas.io/', - 'https://tbib.org/', - 'https://tcbscans.me/', - 'https://telegra.ph/', - 'https://tenor.com/', - 'https://the-collection.booru.org/', - 'https://thebarchive.com/', - 'https://tmohentai.com/', - 'https://toyhou.se/', - 'https://tumblrgallery.xyz/', - 'https://tungsten.run/', - 'https://twibooru.org/', - 'https://unsplash.com/', - 'https://uploadir.com/', - 'https://urlgalleries.net/', - 'https://vanilla-rock.com/', - 'https://vidya.pics/', - 'https://vidyart2.booru.org/', - 'https://vipergirls.to/', - 'https://vipr.im/', - 'https://vk.com/', - 'https://vsco.co/', - 'https://wallhaven.cc/', - 'https://wallpapercave.com/', - 'https://warosu.org/', - 'https://webmshare.com/', - 'https://weebcentral.com/', - 'https://www.2chan.net/', - 'https://www.4chan.org/', - 'https://www.adultempire.com/', - 'https://www.artstation.com/', - 'https://www.behance.net/', - 'https://www.bellazon.com/', - 'https://www.bilibili.com/', - 'https://www.blogger.com/', - 'https://www.boosty.to/', - 'https://www.civitai.com/', - 'https://www.deviantart.com/', - 'https://www.erome.com/', - 'https://www.facebook.com/', - 'https://www.fanbox.cc/', - 'https://www.fandom.com/', - 'https://www.fashionnova.com/', - 'https://www.flickr.com/', - 'https://www.furaffinity.net/', - 'https://www.girlswithmuscle.com/', - 'https://www.hentai-foundry.com/', - 'https://www.idolcomplex.com/', - 'https://www.imagebam.com/', - 'https://www.imagefap.com/', - 'https://www.imagevenue.com/', - 'https://www.instagram.com/', - 'https://www.iwara.tv/', - 'https://www.lofter.com/', - 'https://www.mangahere.cc/', - 'https://www.mangakakalot.gg/', - 'https://www.manganato.gg/', - 'https://www.mangoxo.com/', - 'https://www.mariowiki.com/', - 'https://www.mediawiki.org/', - 'https://www.myportfolio.com/', - 'https://www.natomanga.com/', - 'https://www.nelomanga.net/', - 'https://www.newgrounds.com/', - 'https://www.ohpolly.com/', - 'https://www.omgmiamiswimwear.com/', - 'https://www.patreon.com/', - 'https://www.pidgi.net/', - 'https://www.pillowfort.social/', - 'https://www.pinterest.com/', - 'https://www.pixiv.net/', - 'https://www.pixiv.net/novel', - 'https://www.pixnet.net/', - 'https://www.plurk.com/', - 'https://www.pornhub.com/', - 'https://www.pornpics.com/', - 'https://www.raidlondon.com/', - 'https://www.reddit.com/', - 'https://www.sakugabooru.com/', - 'https://www.sex.com/', - 'https://www.simply-hentai.com/', - 'https://www.slickpic.com/', - 'https://www.slideshare.net/', - 'https://www.smugmug.com/', - 'https://www.steamgriddb.com', - 'https://www.subscribestar.com/', - 'https://www.tiktok.com/', - 'https://www.tsumino.com/', - 'https://www.tumblr.com/', - 'https://www.turboimagehost.com/', - 'https://www.unique-vintage.com/', - 'https://www.visuabusters.com/booru/', - 'https://www.vogue.com/photovogue/', - 'https://www.weasyl.com/', - 'https://www.webtoons.com/', - 'https://www.weibo.com/', - 'https://www.wiki.gg/', - 'https://www.wikiart.org/', - 'https://www.wikifeet.com/', - 'https://www.wikifeetx.com/', - 'https://www.wikimedia.org/', - 'https://www.windsorstore.com/', - 'https://www.xasiat.com', - 'https://www.xvideos.com/', - 'https://www.zerochan.net/', - 'https://x.com/', - 'https://xbooru.com/', - 'https://xfolio.jp/', - 'https://xhamster.com/', - 'https://yande.re/', - 'https://yiffverse.com/', - ]; - } - - public function getIdentifier(): string - { - return 'gallery-dl-web'; - } - - public function getCurrentVersion(): string - { - // Since gallery-dl-web does not provide an endpoint to get the version, - // we'll get the HTML body and extract it from there using symfony's DomCrawler - $response = $this->httpClient->request('GET', $this->hostUrl.'/gallery-dl'); - - $galleryDlWebVersionXPath = '//*[@id="header-right"]/text()[2]'; - $galleryDLCliVersionXPath = '//footer/div/text()[2]'; - $ytDlpVersionXPath = '//footer/div/text()[3]'; - - $html = $response->getContent(); - - $crawler = new Crawler($html); - $galleryDlWebVersion = trim($crawler->filterXPath($galleryDlWebVersionXPath)->text()); - $galleryDlCliVersion = trim(trim($crawler->filterXPath($galleryDLCliVersionXPath)->text()), ' with'); - $ytDlpVersion = trim($crawler->filterXPath($ytDlpVersionXPath)->text()); - - return "gallery-dl-web: $galleryDlWebVersion | gallery-dl-cli: $galleryDlCliVersion | yt-dlp: $ytDlpVersion"; - } - - public function getLatestVersion(): string - { - return $this->getCurrentVersion(); - } -} From 36ef367831c096c3a0d5e00300cc730dc6073199 Mon Sep 17 00:00:00 2001 From: PBX_g33k Date: Sun, 5 Apr 2026 02:59:41 +0200 Subject: [PATCH 2/2] FIX: add download artifacts step to reports workflow --- .github/workflows/report.yml | 4 ++++ pwa/public/icon/128.png | Bin 0 -> 5496 bytes pwa/public/icon/16.png | Bin 0 -> 605 bytes pwa/public/icon/32.png | Bin 0 -> 1213 bytes pwa/public/icon/48.png | Bin 0 -> 1859 bytes pwa/public/icon/96.png | Bin 0 -> 3963 bytes 6 files changed, 4 insertions(+) create mode 100644 pwa/public/icon/128.png create mode 100644 pwa/public/icon/16.png create mode 100644 pwa/public/icon/32.png create mode 100644 pwa/public/icon/48.png create mode 100644 pwa/public/icon/96.png diff --git a/.github/workflows/report.yml b/.github/workflows/report.yml index 3068fce..bf37aac 100644 --- a/.github/workflows/report.yml +++ b/.github/workflows/report.yml @@ -14,6 +14,10 @@ jobs: report: runs-on: ubuntu-latest steps: + - name: Download test results artifact + uses: actions/download-artifact@v4 + with: + name: test-results - uses: dorny/test-reporter@v2 with: artifact: test-results diff --git a/pwa/public/icon/128.png b/pwa/public/icon/128.png new file mode 100644 index 0000000000000000000000000000000000000000..8798ea1442c102649d93accc065f8c2e4bb35f7c GIT binary patch literal 5496 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 literal 0 HcmV?d00001 diff --git a/pwa/public/icon/96.png b/pwa/public/icon/96.png new file mode 100644 index 0000000000000000000000000000000000000000..b0ecd1b5d464540ab071a2e6756dacc4e05dfc72 GIT binary patch literal 3963 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 V8cqAH9jE{R002ovPDHLkV1l99rtbg% literal 0 HcmV?d00001