
    i!(                         S r SSKJrJr  SSKJrJrJr  SSKJr  Sr	 " S S\5      r
 " S	 S
\
5      r " S S\
5      r " S S\
5      rSSSSSSS.rg)z%Extractors for https://scrolller.com/   )	ExtractorMessage   )textutil	exception)cachez&(?:https?://)?(?:www\.)?scrolller\.comc                       \ rS rSrSrSrSrSrSrSr	Sr
S	 rS
 rS rS rS r\" SSS9S 5       rSS jrSS jrS rSrg)ScrolllerExtractor   z#Base class for scrolller extractors	scrolllerzhttps://scrolller.com)z
{category}z{subredditTitle}z/{id}{num:?_//>03}{title:? //[:230]}.{extension}z
{id}_{num})g      ?g      ?c                     S U l         g N
auth_tokenselfs    K/app/mltbenv/lib/python3.13/site-packages/gallery_dl/extractor/scrolller.py_initScrolllerExtractor._init   s	        c              #   R  #    U R                  5         U R                  5        H  nU R                  U5      n[        U5      US'   [        R
                  SU4v   U HB  nUS   nUR                  U5        [        R                  U[        R                  " XA5      4v   MD     M     g 7f)Ncount url)
loginposts_extract_fileslenr   	DirectoryupdateUrlr   nameext_from_url)r   postfilesfiler   s        r   itemsScrolllerExtractor.items   s     

JJLD''-EJDM##R--5kD!kk3(=(=c(HHH  !s   B%B'c                     g)N r*   r   s    r   r   ScrolllerExtractor.posts+   s    r   c                     UR                  SS 5      nU(       d_  UR                  S5      nU(       d,  U R                  R                  SUR                  S5      5        g[	        X0R
                  S9nSUS'   U4$ / n[        US	5       Hs  u  pgUR                  S5      nU(       d.  U R                  R                  S
UR                  S5      U5        MK  [	        X0R
                  S9nXdS'   UR                  U5        Mu     U$ )NalbumContentmediaSourcesz%s: No media filesidr*   )key    numr   z%s/%s: Missing media file)popgetlogwarningmax	_sort_key	enumerateappend)r   r$   albumsourcessrcr%   r2   medias           r   r   !ScrolllerExtractor._extract_files.   s    .hh~.G  !5txx~Fg>>2CCJ6M#E1-JCii/G  !<!%$6g>>2CJLL . r   c                 d    U R                  5       u  pU(       a  U R                  X5      U l        g g r   )_get_auth_info_login_implr   )r   usernamepasswords      r   r   ScrolllerExtractor.loginE   s-    !002"..xBDO r   i $ r   )maxagekeyargc                     U R                   R                  SU5        UUS.n U R                  SUS5      nUS   S   $ ! [        R                   a+  nUR
                  S:X  a  [        R                  " 5       ee S nAff = f)NzLogging in as %s)rC   rD   
LoginQueryFi  r   token)r5   info_request_graphqlr   	HttpErrorstatusAuthenticationError)r   rC   rD   	variablesdataexcs         r   rB   ScrolllerExtractor._login_implJ   s    ((3 ! 
	
	((y%HD G}W%% "" 	zzS 3355	s   > A=&A88A=c                     S U R                   SSSS.n[        U   UU R                  S.nU(       a  SnSUS'   OS	nS
US'   U R                  USU[        R
                  " U5      S9S   $ )Nemptycorsz	same-site)Content-TypeOriginzSec-Fetch-DestzSec-Fetch-ModezSec-Fetch-Site)queryrP   authorizationzhttps://api.scrolller.com/adminzapplication/jsonrW   z(https://api.scrolller.com/api/v2/graphqlztext/plain;charset=UTF-8POST)methodheadersrQ   rQ   )rootQUERIESr   request_jsonr   
json_dumps)r   opnamerP   adminr]   rQ   r   s          r   rL   #ScrolllerExtractor._request_graphql\   s    ""ii%$)
 %V_&!__
 3C&8GN#<C&@GN#  dood6K ! 

 	r   Nc              #     #    Ub  UR                  S5      (       d  U R                  X5      n SU;  a  UR                  5       S   nSU;  a  M  US    S h  vN   US   (       d  g US   US'   U R                  X5      nMT   N*7f)Nr'   r   iterator)r4   rL   popitem)r   rb   rP   rQ   s       r   _paginationScrolllerExtractor._paginationu   s     <txx00((;D%||~a( %G}$$
#$($4Ij!((;D  %s   ABBB+Bc                      US   US   (       + 4$ )NwidthisOptimizedr*   )r   r=   s     r   r8   ScrolllerExtractor._sort_key   s    7|]!3333r   r   )Tr   )__name__
__module____qualname____firstlineno____doc__categoryr^   directory_fmtfilename_fmtarchive_fmtrequest_intervalr   r'   r   r   r   r	   rB   rL   rh   r8   __static_attributes__r*   r   r   r   r      si    -H"D6MDLK!I.C
 (1%& &&"2<4r   r   c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	ScrolllerSubredditExtractor   z.Extractor for media from a scrolller subreddit	subredditz(/r/[^/?#]+)(?:/?\?([^#]+))?z!https://scrolller.com/r/SUBREDDITc                 0   U R                   u  pS nSnU(       a>  [        R                  " U5      nSU;   a"  US   R                  5       R	                  S5      nUUUSS.nU R                  SU5      S   nUS   S UUSUS	   S
.nU R                  SXgS   5      $ )NRANDOMfilterS2   )r   r   sortBylimitSubredditQuerygetSubredditr/   isNsfw)subredditIdrf   r   r   r   r   SubredditChildrenQuerychildren)groupsr   parse_queryupperrstriprL   rh   )r   r   rY   r   sortparamsrP   r|   s           r   r   !ScrolllerSubredditExtractor.posts   s    [[
%%e,F6!)//188= 	
	 ))i))79	 %T?!(+
	 $i:1FH 	Hr   r*   Nrn   ro   rp   rq   rr   subcategoryBASE_PATTERNpatternexampler   rx   r*   r   r   rz   rz      s     8K<<G1GHr   rz   c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	ScrolllerFollowingExtractor   z+Extractor for followed scrolller subreddits	followingz
/followingzhttps://scrolller.com/followingc              #     #    U R                  5         U R                  (       d  [        R                  " S5      eS S SSSS.nU R	                  SU5       H2  nU R
                  US   -   n[        US'   [        R                  X24v   M4     g 7f)	NzLogin required
   Fr~   )rf   r   r   r   r   GetFollowingSubredditsr   
_extractor)	r   r   r   AuthorizationErrorrh   r^   rz   r   Queue)r   rP   r|   r   s       r   r'   !ScrolllerFollowingExtractor.items   s     

../?@@  
	 ))*BINI))i..C&AIl#--// Os   B	Br*   N)rn   ro   rp   rq   rr   r   r   r   r   r'   rx   r*   r   r   r   r      s    5K]*G/G0r   r   c                   0    \ rS rSrSrSr\S-   rSrS r	Sr
g)	ScrolllerPostExtractor   z0Extractor for media from a single scrolller postr$   z/(?!r/|following$)([^/?#]+)z+https://scrolller.com/TITLE-SLUG-a1b2c3d4f5c                 Z    SSU R                   S   -   0nU R                  SU5      nUS   4$ )Nr   /r1   SubredditPostQuerygetPost)r   rL   )r   rP   rQ   s      r   r   ScrolllerPostExtractor.posts   s9    C$++a.01	$$%99EY!!r   r*   Nr   r*   r   r   r   r      s    :K;;G;G"r   r   a3  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 }
    }
}
a  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 }
            }
        }
    }
}
a  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 }
        }
    }
}
aG  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
        }
    }
}
zquery LoginQuery(
    $username: String!,
    $password: String!
) {
    login(
        username: $username,
        password: $password
    ) {
        username token expiresAt isAdmin status isPremium
    }
}
zVquery ItemTypeQuery(
    $url: String!
) {
    getItemType(
        url: $url
    )
}
)r   r   r   r   rI   ItemTypeQueryN)rr   commonr   r   r   r   r   r   r	   r   r   rz   r   r   r_   r*   r   r   <module>r      s}    , & $ $ 8s4 s4l"H"4 "HJ0"4 04	"/ 	"$"H@4AJr   