diff --git a/gallery_dl/extractor/scrolller.py b/gallery_dl/extractor/scrolller.py index 3fce2cf6..a48fdb60 100644 --- a/gallery_dl/extractor/scrolller.py +++ b/gallery_dl/extractor/scrolller.py @@ -98,7 +98,7 @@ class ScrolllerExtractor(Extractor): "Sec-Fetch-Site": "same-site", } data = { - "query" : QUERIES[opname], + "query" : self.utils("graphql", opname), "variables" : variables, "authorization": self.auth_token, } @@ -206,144 +206,3 @@ class ScrolllerPostExtractor(ScrolllerExtractor): variables = {"url": "/" + self.groups[0]} data = self._request_graphql("SubredditPostQuery", variables) return (data["getPost"],) - - -QUERIES = { - - "SubredditPostQuery": """\ -query SubredditPostQuery( - $url: String! -) { - getPost( - data: { url: $url } - ) { - __typename id url title subredditId subredditTitle subredditUrl - redditPath isNsfw hasAudio fullLengthSource gfycatSource redgifsSource - ownerAvatar username displayName favoriteCount isPaid tags - commentsCount commentsRepliesCount isFavorite - albumContent { mediaSources { url width height isOptimized } } - mediaSources { url width height isOptimized } - blurredMediaSources { url width height isOptimized } - } -} -""", - - "SubredditQuery": """\ -query SubredditQuery( - $url: String! - $iterator: String - $sortBy: GallerySortBy - $filter: GalleryFilter - $limit: Int! -) { - getSubreddit( - data: { - url: $url, - iterator: $iterator, - filter: $filter, - limit: $limit, - sortBy: $sortBy - } - ) { - __typename id url title secondaryTitle description createdAt isNsfw - subscribers isComplete itemCount videoCount pictureCount albumCount - isPaid username tags isFollowing - banner { url width height isOptimized } - children { - iterator items { - __typename id url title subredditId subredditTitle subredditUrl - redditPath isNsfw hasAudio fullLengthSource gfycatSource - redgifsSource ownerAvatar username displayName favoriteCount - isPaid tags commentsCount commentsRepliesCount isFavorite - albumContent { mediaSources { url width height isOptimized } } - mediaSources { url width height isOptimized } - blurredMediaSources { url width height isOptimized } - } - } - } -} -""", - - "SubredditChildrenQuery": """\ -query SubredditChildrenQuery( - $subredditId: Int! - $iterator: String - $filter: GalleryFilter - $sortBy: GallerySortBy - $limit: Int! - $isNsfw: Boolean -) { - getSubredditChildren( - data: { - subredditId: $subredditId, - iterator: $iterator, - filter: $filter, - sortBy: $sortBy, - limit: $limit, - isNsfw: $isNsfw - }, - ) { - iterator items { - __typename id url title subredditId subredditTitle subredditUrl - redditPath isNsfw hasAudio fullLengthSource gfycatSource - redgifsSource ownerAvatar username displayName favoriteCount isPaid - tags commentsCount commentsRepliesCount isFavorite - albumContent { mediaSources { url width height isOptimized } } - mediaSources { url width height isOptimized } - blurredMediaSources { url width height isOptimized } - } - } -} -""", - - "GetFollowingSubreddits": """\ -query GetFollowingSubreddits( - $iterator: String, - $limit: Int!, - $filter: GalleryFilter, - $isNsfw: Boolean, - $sortBy: GallerySortBy -) { - getFollowingSubreddits( - data: { - isNsfw: $isNsfw - limit: $limit - filter: $filter - iterator: $iterator - sortBy: $sortBy - } - ) { - iterator items { - __typename id url title secondaryTitle description createdAt isNsfw - subscribers isComplete itemCount videoCount pictureCount albumCount - isFollowing - } - } -} -""", - - "LoginQuery": """\ -query LoginQuery( - $username: String!, - $password: String! -) { - login( - username: $username, - password: $password - ) { - username token expiresAt isAdmin status isPremium - } -} -""", - - "ItemTypeQuery": """\ -query ItemTypeQuery( - $url: String! -) { - getItemType( - url: $url - ) -} -""", - -} diff --git a/gallery_dl/extractor/utils/scrolller_graphql.py b/gallery_dl/extractor/utils/scrolller_graphql.py new file mode 100644 index 00000000..bb7d1d7d --- /dev/null +++ b/gallery_dl/extractor/utils/scrolller_graphql.py @@ -0,0 +1,144 @@ +# -*- coding: utf-8 -*- + +# Copyright 2026 Mike Fährmann +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation. + + +SubredditPostQuery = """\ +query SubredditPostQuery( + $url: String! +) { + getPost( + data: { url: $url } + ) { + __typename id url title subredditId subredditTitle subredditUrl + redditPath isNsfw hasAudio fullLengthSource gfycatSource redgifsSource + ownerAvatar username displayName favoriteCount isPaid tags + commentsCount commentsRepliesCount isFavorite + albumContent { mediaSources { url width height isOptimized } } + mediaSources { url width height isOptimized } + blurredMediaSources { url width height isOptimized } + } +} +""" + +SubredditQuery = """\ +query SubredditQuery( + $url: String! + $iterator: String + $sortBy: GallerySortBy + $filter: GalleryFilter + $limit: Int! +) { + getSubreddit( + data: { + url: $url, + iterator: $iterator, + filter: $filter, + limit: $limit, + sortBy: $sortBy + } + ) { + __typename id url title secondaryTitle description createdAt isNsfw + subscribers isComplete itemCount videoCount pictureCount albumCount + isPaid username tags isFollowing + banner { url width height isOptimized } + children { + iterator items { + __typename id url title subredditId subredditTitle subredditUrl + redditPath isNsfw hasAudio fullLengthSource gfycatSource + redgifsSource ownerAvatar username displayName favoriteCount + isPaid tags commentsCount commentsRepliesCount isFavorite + albumContent { mediaSources { url width height isOptimized } } + mediaSources { url width height isOptimized } + blurredMediaSources { url width height isOptimized } + } + } + } +} +""" + +SubredditChildrenQuery = """\ +query SubredditChildrenQuery( + $subredditId: Int! + $iterator: String + $filter: GalleryFilter + $sortBy: GallerySortBy + $limit: Int! + $isNsfw: Boolean +) { + getSubredditChildren( + data: { + subredditId: $subredditId, + iterator: $iterator, + filter: $filter, + sortBy: $sortBy, + limit: $limit, + isNsfw: $isNsfw + }, + ) { + iterator items { + __typename id url title subredditId subredditTitle subredditUrl + redditPath isNsfw hasAudio fullLengthSource gfycatSource + redgifsSource ownerAvatar username displayName favoriteCount isPaid + tags commentsCount commentsRepliesCount isFavorite + albumContent { mediaSources { url width height isOptimized } } + mediaSources { url width height isOptimized } + blurredMediaSources { url width height isOptimized } + } + } +} +""" + +GetFollowingSubreddits = """\ +query GetFollowingSubreddits( + $iterator: String, + $limit: Int!, + $filter: GalleryFilter, + $isNsfw: Boolean, + $sortBy: GallerySortBy +) { + getFollowingSubreddits( + data: { + isNsfw: $isNsfw + limit: $limit + filter: $filter + iterator: $iterator + sortBy: $sortBy + } + ) { + iterator items { + __typename id url title secondaryTitle description createdAt isNsfw + subscribers isComplete itemCount videoCount pictureCount albumCount + isFollowing + } + } +} +""" + +LoginQuery = """\ +query LoginQuery( + $username: String!, + $password: String! +) { + login( + username: $username, + password: $password + ) { + username token expiresAt isAdmin status isPremium + } +} +""" + +ItemTypeQuery = """\ +query ItemTypeQuery( + $url: String! +) { + getItemType( + url: $url + ) +} +"""