
    i#                     j    S r SSKJrJr  SSKJrJr   " S S\5      r " S S\5      r " S	 S
\5      r	g)z,Extractors for https://members.luscious.net/   )	ExtractorMessage   )text	exceptionc                   *    \ rS rSrSrSrSrSrS rSr	g)	LusciousExtractor   z"Base class for luscious extractorslusciousz.luscious.netzhttps://members.luscious.netc                 F   SUUUS.nU R                  U R                   SU 3SUSS9nUR                  S:  aW  U R                  R	                  SUR
                  5        [        R                  " S	UR                   S
UR                   S35      eUR                  5       S   $ )Nr   )idoperationNamequery	variablesz /graphql/nobatch/?operationName=POSTF)methodjsonfatali  zServer response: %szGraphQL query failed (' z')data)
requestrootstatus_codelogdebugr   r   AbortExtractionreasonr   )selfopr   r   r   responses         J/app/mltbenv/lib/python3.13/site-packages/gallery_dl/extractor/luscious.py_graphqlLusciousExtractor._graphql   s    "&	
 <<yyk9">E   

 3&HHNN0(--@++))*!HOO+<B@A A }}v&&     N)
__name__
__module____qualname____firstlineno____doc__categorycookies_domainr   r"   __static_attributes__r%   r$   r!   r	   r	      s    ,H$N)D'r$   r	   c                   N    \ 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rg)LusciousAlbumExtractor*   z,Extractor for image albums from luscious.netalbumz,{category}_{album[id]}_{num:>03}.{extension})z
{category}z{album[id]} {album[title]}z{album[id]}_{id}za(?:https?://)?(?:www\.|members\.)?luscious\.net/(?:albums|pictures/c/[^/?#]+/album)/[^/?#]+_(\d+)z(https://luscious.net/albums/TITLE_12345/c                 B    [         R                  X5        US   U l        g Nr   )r	   __init__album_idr   matchs     r!   r4   LusciousAlbumExtractor.__init__4   s    ""4/ar$   c                 2    U R                  SS5      U l        g )NgifF)configr:   )r   s    r!   _initLusciousAlbumExtractor._init8   s    ;;ue,r$   c              #     #    U R                  5       n[        R                  SSU04v   [        U R	                  5       S5       H  u  p#X#S'   XS'    UR                  S5      S   S   US'   US	    Vs/ s H  oDS
   PM	     snUS	'   U R                  US   5      US'   [        R                  " US   5      US'   U R                  (       a  US   =(       d    US   OUS   =(       d    US   =(       d    US   n[        R                  U[        R                  " XS5      4v   M     g ! [         a    SUS'    Nf = fs  snf 7f)N r1   r   num
thumbnails    url	thumbnailtagsr   createddater   url_to_originalurl_to_video)metadatar   	Directory	enumerateimagespopLookupErrorparse_timestampr   	parse_intr:   Urlnameext_from_url)r   r1   r@   imageitemrC   s         r!   itemsLusciousAlbumExtractor.items;   sD    gu%555#DKKM15JC%L"'N(%*YY|%<Q%?%Fk" 7<FmDmd&\mDE&M 00y1ABE&M..t5E$K xx +,En0E.)EU3D-E& % 
 ++sD$9$9#$EEE% 6  (%'k"( Es7   AED',E3D<B&E'D96E8D99Ec                 0   SU R                   0nSnU R                  SX5      S   S   nSU;   a  [        R                  " S5      eUS    Vs/ s H  oDS   PM	     snUS'   US	    Vs/ s H  oDS   PM	     snUS	'   US
    Vs/ s H  oDS   PM	     snUS
'   US   S   US'   US   S   US'   US   S   R	                  S5      S   US'   US   S   US'   [
        R                  " US   5      US'   U R                  US   5      US'   U$ s  snf s  snf s  snf )Nr   a  
query AlbumGet($id: ID!) {
    album {
        get(id: $id) {
            ... on Album {
                ...AlbumStandard
            }
            ... on MutationError {
                errors {
                    code
                    message
                }
            }
        }
    }
}

fragment AlbumStandard on Album {
    __typename
    id
    title
    labels
    description
    created
    modified
    like_status
    number_of_favorites
    rating
    status
    marked_for_deletion
    marked_for_processing
    number_of_pictures
    number_of_animated_pictures
    slug
    is_manga
    url
    download_url
    permissions
    cover {
        width
        height
        size
        url
    }
    created_by {
        id
        name
        display_name
        user_title
        avatar {
            url
            size
        }
        url
    }
    content {
        id
        title
        url
    }
    language {
        id
        title
        url
    }
    tags {
        id
        category
        text
        url
        count
    }
    genres {
        id
        title
        slug
        url
    }
    audiences {
        id
        title
        url
        url
    }
    last_viewed_picture {
        id
        position
        url
    }
}
AlbumGetr1   geterrors	audiencestitlegenresrE   r   coverrC   contentlanguager   rB   
created_bydisplay_namerF   rG   )r5   r"   r   NotFoundError	partitionr   rQ   rP   )r   r   r   r1   rU   s        r!   rJ   LusciousAlbumExtractor.metadataR   sL   $--
	Zv j);GDUKu))'228=k8JK8J7m8JKk5:8_E_T=_Eh27-@-$f-@fw.g +G4i!*-g6@@EaHj#L1.AlnnU4[1d,,U9-=>f LE@s   D	'DDc              #      #    SSU R                   S./SSS.0nSn U R                  SX5      nUS	   S
   S    S h  vN   US	   S
   S   S   (       d  g US   S==   S-  ss'   MK   N*7f)Ninputr5   namevaluepositionr   )filtersdisplaypagea  
query AlbumListOwnPictures($input: PictureListInput!) {
    picture {
        list(input: $input) {
            info {
                ...FacetCollectionInfo
            }
            items {
                ...PictureStandardWithoutAlbum
            }
        }
    }
}

fragment FacetCollectionInfo on FacetCollectionInfo {
    page
    has_next_page
    has_previous_page
    total_items
    total_pages
    items_per_page
    url_complete
    url_filters_only
}

fragment PictureStandardWithoutAlbum on Picture {
    __typename
    id
    title
    created
    like_status
    number_of_comments
    number_of_favorites
    status
    width
    height
    resolution
    aspect_ratio
    url_to_original
    url_to_video
    is_animated
    position
    tags {
        id
        category
        text
        url
    }
    permissions
    url
    thumbnails {
        width
        height
        size
        url
    }
}
AlbumListOwnPicturespicturelistrV   infohas_next_pagero   )r5   r"   )r   r   r   r   s       r!   rM   LusciousAlbumExtractor.images   s     '!]]  &	
	9t ==!7JDIv.w777	?6*62?Cgv&!+& 7s   :A)A'+A))r5   r:   N)r&   r'   r(   r)   r*   subcategoryfilename_fmtdirectory_fmtarchive_fmtpatternexampler4   r<   rV   rJ   rM   r-   r%   r$   r!   r/   r/   *   sC    6KAL@M$KEG8G!-F.pdL,r$   r/   c                   0    \ rS rSrSrSrSrSrS rS r	Sr
g	)
LusciousSearchExtractori  z,Extractor for album searches on luscious.netsearchzK(?:https?://)?(?:www\.|members\.)?luscious\.net/albums/list/?(?:\?([^#]+))?z,https://luscious.net/albums/list/?tagged=TAGc                 B    [         R                  X5        US   U l        g r3   )r	   r4   r   r6   s     r!   r4    LusciousSearchExtractor.__init__  s    ""4/1X
r$   c           	   #   (  #    [         R                  " U R                  5      nUR                  SS5      nUR                  SS 5      nSUUR	                  5        VVs/ s H	  u  pEXES.PM     snn[         R
                  " US5      S.0nSn U R                  S	Xa5      nUS
   S   S    H9  nU R                  US   -   US'   [        US'   [        R                  US   U4v   M;     US
   S   S   S   (       d  g US   S==   S-  ss'   M  s  snnf 7f)Nrn   date_newestro   rh   ri   r   )rn   rm   ro   a  
query AlbumListWithPeek($input: AlbumListInput!) {
    album {
        list(input: $input) {
            info {
                ...FacetCollectionInfo
            }
            items {
                ...AlbumMinimal
                peek_thumbnails {
                    width
                    height
                    size
                    url
                }
            }
        }
    }
}

fragment FacetCollectionInfo on FacetCollectionInfo {
    page
    has_next_page
    has_previous_page
    total_items
    total_pages
    items_per_page
    url_complete
    url_filters_only
}

fragment AlbumMinimal on Album {
    __typename
    id
    title
    labels
    description
    created
    modified
    number_of_favorites
    number_of_pictures
    slug
    is_manga
    url
    download_url
    cover {
        width
        height
        size
        url
    }
    content {
        id
        title
        url
    }
    language {
        id
        title
        url
    }
    tags {
        id
        category
        text
        url
        count
    }
    genres {
        id
        title
        slug
        url
    }
    audiences {
        id
        title
        url
    }
}
AlbumListWithPeekr1   rr   rV   rC   
_extractorrs   rt   )r   parse_queryr   rN   rV   rQ   r"   r   r/   r   Queue)	r   r   rn   ro   nvr   r   r1   s	            r!   rV   LusciousSearchExtractor.items  s       ,))I}5yy& "@ENQ3NtQ/
	Pb ==!4iGDgv.w7#yy5<7e&<l#mmU5\588 8
 =(0Agv&!+& m Os   ADD
,B&D)r   N)r&   r'   r(   r)   r*   rv   rz   r{   r4   rV   r-   r%   r$   r!   r}   r}     s!    6K/G<Gh,r$   r}   N)
r*   commonr   r   r?   r   r   r	   r/   r}   r%   r$   r!   <module>r      s;    3 & '	 '6f,. f,Rs,/ s,r$   