Ë
    s@)jW$  ã                   ó²  — d Z ddlZddlZddlZddlZddlZddlmc mZ	 ddl
mZ ddlmZ ddlmZ ddlmZmZmZmZmZmZmZmZmZmZ ddlmZ ddlmZ  ej>                  ej@                  d	¬
«        ejB                  e"«      Z#h d£Z$ddl%Z%de&dede'edz  e&f   fd„Z(de&de)e&   fd„Z*dd„Z+de&ddfd„Z,e"dk(  r ejZ                   e+«       xs d«       yy)zÎResume eBay catalog import: fetch only items missing from catalog.db.

Skips items already present, handles error 518 (daily limit) gracefully,
upserts into existing catalog.db without deleting prior data.
é    N)ÚCounter)ÚPath)ÚSettings)
Ú_NSÚ_extract_brand_from_titleÚ_extract_category_from_titleÚ_extract_model_from_titleÚ_extract_oe_from_titleÚ_is_car_partÚ_parse_oe_stringÚ_trading_callÚ_get_all_active_listingsÚ_fetch_and_map_item)ÚCatalogIndex)ÚOfferz.%(asctime)s %(name)s %(levelname)s %(message)s)ÚlevelÚformat>   ún/aúnie dotyczyúdoes not applyÚ ú-Úitem_idÚsettingsÚreturnc                 óR  ‡— d| › d�}	 t        d||d¬«      }|j	                  d	d
t
        «      }|dvrb|j	                  dd
t
        «      }|j	                  dd
t
        «      }|dk(  rt        j                  d«       yt        j                  d| ||«       y|j                  dt
        «      }|€y|j	                  dd
t
        «      }	|j                  dt
        «      }
|
�!|
j                  rt        |
j                  «      nd}|
�|
j                  dd«      nd}t        |j	                  ddt
        «      «      }|j	                  dd
t
        «      }|sd| › �}i }|j                  dt
        «      D ]X  }|j	                  dd
t
        «      }|j                  dt
        «      D �cg c]  }|j                  sŒ|j                  ‘Œ }}|||<   ŒZ g }|D ]`  Št        ˆfd„d D «       «      sŒ|‰   D ]A  }|j                  «       j                  «       t         vsŒ(|j#                  t%        |«      «       ŒC Œb |j                  d!g «      D ]A  }|j                  «       j                  «       t         vsŒ(|j#                  t%        |«      «       ŒC |st'        |	«      }|j#                  |«       t)        «       }g }|D ]w  }t+        j,                  d"d
|«      j/                  «       }|sŒ+||vsŒ0t1        |«      d#k\  sŒ?t+        j2                  d$|«      sŒV|j5                  |«       |j7                  |«       Œy t9        |	«      }t;        |	|«      }t=        |	«      }t?        |	|«      }tA        d%| › �d&||	||||||d||¬'«      }|d(fS # t        $ r!}t        j                  d| |«       Y d}~yd}~ww xY wc c}w ))z|Fetch a single item via GetItem. Returns (offer_or_None, status).

    status is one of: "ok", "skip", "limit", "error"
    zj<?xml version="1.0" encoding="utf-8"?>
<GetItemRequest xmlns="urn:ebay:apis:eBLBaseComponents">
  <ItemID>zv</ItemID>
  <DetailLevel>ReturnAll</DetailLevel>
  <IncludeItemSpecifics>true</IncludeItemSpecifics>
</GetItemRequest>ÚGetItemé   )ÚtimeoutzGetItem HTTP error for %s: %sN)NÚerrorze:Ackr   )ÚSuccessÚWarningz.//e:Errors/e:ErrorCodez.//e:Errors/e:LongMessageÚ518z-eBay: GetItem daily limit reached (error 518))NÚlimitzGetItem failed for %s: [%s] %sz	.//e:Item)NÚskipze:Titlez!.//e:SellingStatus/e:CurrentPriceÚ
currencyIDÚPLNz
e:QuantityÚ1z!.//e:ListingDetails/e:ViewItemURLzhttps://www.ebay.pl/itm/z".//e:ItemSpecifics/e:NameValueListze:Nameze:Valuec              3   óB   •K  — | ]  }|‰j                  «       v –— Œ y ­w)N)Úlower)Ú.0ÚtokÚkeys     €ú=/var/www/html/agent.samochodowy/scripts/resume_ebay_import.pyú	<genexpr>z#_fetch_item_safe.<locals>.<genexpr>`   s   øè ø€ Ò` cˆs�c—i‘i“kÔ!Ñ`ùs   ƒ)zreferencyjny oezoe/oemu   numer czÄ™Å›ci oeÚMPNz[\s.\-/]é   z\dÚebay_Úebay)Úoffer_idÚplatformÚurlÚtitleÚpriceÚcurrencyÚqtyÚbrandÚmodelÚcategoryÚengine_codeÚ
oe_numbersÚis_partÚok)!r   Ú	ExceptionÚloggerr    Úfindtextr   ÚwarningÚfindÚtextÚfloatÚgetÚintÚfindallÚanyr*   ÚstripÚ_SKIP_VALUESÚextendr   r
   ÚsetÚreÚsubÚupperÚlenÚsearchÚaddÚappendr   r	   r   r   r   ) r   r   Úxml_bodyÚrootÚeÚackÚerr_codeÚerr_msgÚitemr7   Úprice_elr8   r9   r:   r6   ÚspecsÚnvÚnameÚvÚvaluesr?   Ú	title_oesÚseen_oeÚ	unique_oeÚoeÚnormr;   r<   r=   r@   Úofferr-   s                                   @r.   Ú_fetch_item_saferk   ,   sƒ  ø€ ð
àˆ)ð ð€HðÜ˜Y¨°(ÀBÔGˆð
 �-‰-˜ ¤SÓ
)€CØ
Ð(Ñ(Ø—=‘=Ð!:¸BÄÓDˆØ—-‘-Ð ;¸RÄÓEˆØ�uÒÜ�N‰NÐJÔKØ Ü�‰Ð7¸À(ÈGÔTØà�9‰9�[¤#Ó&€DØ€|Øð �M‰M˜) R¬Ó-€EØ�y‰yÐ<¼cÓB€HØ$,Ð$8¸X¿]º]ŒE�(—-‘-Ô ÐPT€EØ4<Ð4Hˆx�|‰|˜L¨%Ô0Èe€HÜ
ˆd�m‰m˜L¨#¬sÓ3Ó
4€CØ
�-‰-Ð;¸RÄÓ
E€CÙØ(¨¨	Ð2ˆð #%€EØ�l‰lÐ?ÄÓEò ˆØ�{‰{˜8 R¬Ó-ˆØ"$§*¡*¨Y¼Ó"<ÖG˜QÀÇÃ�!—&“&ÐGˆÐGØˆˆdŠðð €JØò ;ˆÜÓ`Ð-_Ô`Õ`Ø˜3‘Zò ;�Ø—7‘7“9—?‘?Ó$¬LÒ8Ø×%Ñ%Ô&6°qÓ&9Õ:ñ;ð;ð �Y‰Y�u˜bÓ!ò 3ˆØ�7‰7‹9�?‰?Ó¤LÒ0Ø×ÑÔ.¨qÓ1Õ2ð3ñ Ü*¨5Ó1ˆ	Ø×Ñ˜)Ô$ô ›€GØ€IØò #ˆÜ�v‰v�k 2 rÓ*×0Ñ0Ó2ˆÚ�D Ò'¬C°«I¸«N¼r¿y¹yÈÐPTÕ?UØ�K‰K˜ÔØ×Ñ˜TÕ"ð	#ô & eÓ,€EÜ% e¨UÓ3€EÜ+¨EÓ2€HÜ˜5 (Ó+€GäØ˜˜	Ð"ØØØØØØØØØØØØô€Eð �$ˆ;Ðøôa ò Ü�‰Ð4°g¸qÔAÜûðüò@ Hs#   ‰M7 ÆN$Æ0N$Í7	N!Î NÎN!Údb_pathc                 óÜ   — t        j                  | «      }|j                  «       }|j                  d«       |j	                  «       D �ch c]  }|d   ’Œ	 }}|j                  «        |S c c}w )z+Get set of offer_ids already in catalog.db.z3SELECT offer_id FROM offers WHERE platform = 'ebay'r   )Úsqlite3ÚconnectÚcursorÚexecuteÚfetchallÚclose)rl   ÚconnÚcurÚrowÚidss        r.   Úget_existing_idsrx   �   sX   € ä�?‰?˜7Ó#€DØ
�+‰+‹-€CØ‡K�KÐEÔFØ Ÿ\™\›^Ö
,�cˆ3ˆq‹6Ð
,€CÐ
,Ø‡J�J„LØ€Jùò -s   Á	A)c            
      ó¶  — t        «       } | j                  }t        |«      j                  j	                  dd¬«       t        |«      }t        j                  dt        |«      «       t        j                  d«       t        t        | «      «      }t        j                  dt        |«      «       |D �cg c]  }d|d   › �|vr|‘Œ }}t        j                  dt        |«      t        |«      t        |«      z
  «       |s!t        j                  d	«       t        |«       y t        |«      }d
}d
}d
}	d}
t        |«      D ]¶  \  }}t        |d   | «      \  }}|dk(  rd}
t        j                  d|«        n‚|dk(  r|dz  }n#|dk(  s|€|	dz  }	n|j!                  |«       |dz  }|dz   dz  d
k(  r&t        j                  d|dz   t        |«      |||	«       |dz   dz  d
k(  sŒ¢t#        j$                  d«       Œ¸ |j'                  «        |j)                  «        t        j                  d|||	|
t        |«      ||z   |	z   |
rdnd
z   z
  «       t        |«       y c c}w )NT)ÚparentsÚexist_okz%Already in catalog.db: %d eBay offersz3Fetching active listing IDs via GetMyeBaySelling...z!Total active listings on eBay: %dr2   r   z:Missing from catalog.db: %d (skipping %d already imported)u*   Nothing to import â€” catalog is complete.r   Fr$   z5Daily limit hit after %d new items. Stopping cleanly.r    é   r%   éd   z:Progress: %d/%d checked | imported=%d errors=%d skipped=%dé
   g      ð?zKImport done. New: %d, Errors: %d, Skipped: %d, Limit hit: %s, Remaining: %d)r   rl   r   ÚparentÚmkdirrx   rC   ÚinforT   Úlistr   Ú_print_db_reportr   Ú	enumeraterk   rE   Úupsert_offerÚtimeÚsleepÚ_rebuild_ftsrs   )r   rl   Úexisting_idsÚall_listingsr^   ÚmissingÚindexÚimportedÚerrorsÚskippedÚ	hit_limitÚiÚbasicrj   Ústatuss                  r.   Úmainr”   —   sW  € Ü‹z€HØ×Ñ€GÜˆƒM×Ñ×Ñ t°dÐÔ;ô $ GÓ,€LÜ
‡K�KÐ7¼¸\Ó9JÔKô ‡K�KÐEÔFÜÔ0°Ó:Ó;€LÜ
‡K�KÐ3´S¸Ó5FÔGð &öØØ�4˜	‘?Ð#Ð$¨LÑ8ò 	ð€Gð ô ‡K�KÐLÜ�G“œc ,Ó/´#°g³,Ñ>ô@ñ Ü�‰Ð@ÔAÜ˜Ô!Øô ˜Ó!€EØ€HØ€FØ€GØ€Iä˜gÓ&ò ‰ˆˆ5Ü(¨¨yÑ)9¸8ÓD‰ˆˆvà�WÒØˆIÜ�N‰NØGÈôñ Ø�wÒØ�a‰K‰FØ�vÒ  Ø�q‰L‰Gà×Ñ˜uÔ%Ø˜‰MˆHà�‰E�S‰=˜AÒÜ�K‰KØLØ�A‘”s˜7“| X¨v°wôð �‰E�R‰<˜1ÓÜ�J‰J�s�Oð3ð8 
×ÑÔØ	‡K�K„Mä
‡K�KØUØ�&˜' 9ÜˆG‹˜ 6Ñ)¨GÑ3¹I±qÈ1ÑMÑNôô �WÕùòss   Â3Ic                 ó¢  ‡
— t        j                  | «      }|j                  «       }|j                  d«       |j	                  «       d   Š
|j                  d«       |j	                  «       d   }|j                  d«       |j	                  «       d   }|j                  d«       |j	                  «       d   }|j                  d«       |j	                  «       d   }|j                  d«       |j	                  «       d   }ˆ
fd„}t        d	«       t        d
«       t        d«       t        d‰
› �«       t        d|› d ||«      › d�«       t        d|› d ||«      › d�«       t        d|› d ||«      › d�«       t        d|› d ||«      › d�«       t        d|› �«       |j                  d«       t        d«       |j                  «       D ]  }	t        d|	d   d›d|	d   d›�«       Œ |j                  d«       t        d«       |j                  «       D ]  }	t        d|	d   d›d|	d   d›�«       Œ |j                  «        t        d«       y)z%Print stats directly from catalog.db.zSELECT COUNT(*) FROM offersr   z9SELECT COUNT(*) FROM offers WHERE oe_numbers_json != '[]'zCSELECT COUNT(*) FROM offers WHERE brand IS NOT NULL AND brand != ''zCSELECT COUNT(*) FROM offers WHERE model IS NOT NULL AND model != ''zISELECT COUNT(*) FROM offers WHERE category IS NOT NULL AND category != ''z-SELECT COUNT(*) FROM offers WHERE is_part = 0c                 ó"   •— ‰r| dz  ‰z  › d�S dS )Nr}   ú%z0%© )ÚnÚtotals    €r.   ú<lambda>z"_print_db_report.<locals>.<lambda>ô   s   ø€ ©e�q˜3‘w %Ñ'Ð(¨Ð*€ ¸€ ó    z=
============================================================zRAPORT KATALOGU (z catalog.db)z<============================================================u   Å�Ä…cznie ofert:           zZ numerami OE:           z (ú)u   Z rozpoznanÄ… markÄ…:      zZ rozpoznanym modelem:   u   Z kategoriÄ…:             zis_part=false:           z™
        SELECT brand, COUNT(*) as cnt FROM offers
        WHERE brand IS NOT NULL AND brand != ''
        GROUP BY brand ORDER BY cnt DESC LIMIT 10
    z
TOP 10 marek:z  Ú20sú r|   Ú5dz¥
        SELECT category, COUNT(*) as cnt FROM offers
        WHERE category IS NOT NULL AND category != ''
        GROUP BY category ORDER BY cnt DESC LIMIT 10
    z
TOP 10 kategorii:N)rn   ro   rp   rq   ÚfetchoneÚprintrr   rs   )rl   rt   ru   Úhas_oeÚ	has_brandÚ	has_modelÚhas_categoryÚnot_partÚpctrv   rš   s             @r.   rƒ   rƒ   â   s5  ø€ ä�?‰?˜7Ó#€DØ
�+‰+‹-€Cà‡K�KÐ-Ô.Ø�L‰L‹N˜1Ñ€EØ‡K�KÐKÔLØ�\‰\‹^˜AÑ€FØ‡K�KÐUÔVØ—‘“˜qÑ!€IØ‡K�KÐUÔVØ—‘“˜qÑ!€IØ‡K�KÐ[Ô\Ø—<‘<“> !Ñ$€LØ‡K�KÐ?Ô@Ø�|‰|‹~˜aÑ €Hã
=€Cä	ˆ/ÔÜ	Ð
*Ô+Ü	ˆ(„OÜ	Ð'¨ wÐ
/Ô0Ü	Ð% f X¨R±°F³¨}¸AÐ
>Ô?Ü	Ð'¨	 {°"±S¸³^Ð4DÀAÐ
FÔGÜ	Ð% i [°±3°y³>Ð2BÀ!Ð
DÔEÜ	Ð& | n°B±s¸<Ó7HÐ6IÈÐ
KÔLÜ	Ð% h ZÐ
0Ô1ð ‡K�Kð ô 	ô
 
Ð
ÔØ�|‰|‹~ò -ˆÜ��3�q‘6˜#�,˜a  A¡ r˜{Ð+Õ,ð-ð ‡K�Kð ô 	ô
 
Ð
Ô Ø�|‰|‹~ò -ˆÜ��3�q‘6˜#�,˜a  A¡ r˜{Ð+Õ,ð-ð 	‡J�J„LÜ	ˆ(…Orœ   Ú__main__)r   N).Ú__doc__ÚjsonÚloggingrn   Úsysr†   Úxml.etree.ElementTreeÚetreeÚElementTreeÚETÚcollectionsr   Úpathlibr   Úagent_samochodowy.configr   Ú!agent_samochodowy.matcher.catalogr   r   r   r	   r
   r   r   r   r   r   Úagent_samochodowy.matcher.indexr   Úagent_samochodowy.modelsr   ÚbasicConfigÚINFOÚ	getLoggerÚ__name__rC   rN   rQ   ÚstrÚtuplerk   rP   rx   r”   rƒ   Úexitr˜   rœ   r.   ú<module>r¿      sù   ðñó Û Û Û 
Û ß "Ð "Ý Ý å -÷÷ ÷ õ 9Ý *à €× Ñ Ø
�,‰,Ø;õð 
ˆ×	Ñ	˜8Ó	$€â@€ã 	ð^˜cð ^¨Xð ^¸%ÀÈÁÈcÐ@QÑ:Ró ^ðB˜cð  c¨#¡hó óHðV3˜cð 3 dó 3ðl ˆzÒØ€C‡H�H‰T‹VŠ[�qÕð rœ   