U
    7åhã3  ã                
   @   sT  d dl mZmZ d dlZd dlZd dlZd dlmZ d dlm	Z	 eƒ  e 
de	 ¡ ¡ZeeƒZdd„ Zdd	„ Zed
ƒ e ¡ ¢Zedƒ e edƒ¡Zd ZeD ]Zed7 Zeed  ƒ\ZZesÄer ede› de› de› dƒ edkr eed  eƒre ed  ¡ned  Zedejedddd… › dƒ q edƒ e edƒ¡ZeeƒZede eƒ› dƒ dZ!d Z"e#d e eƒe!ƒD ]ˆZ$ee$e$e! … Z%e%D ]<Z&ee&j'ƒ\Z(Z)e(r”e edƒe&j*e(e)dœ¡ e"d7 Z"q”e +¡  ede,e$e! e eƒƒ› de eƒ› dƒ q|ed e"› ƒ ed!ƒ e ed"ƒ¡ZeeƒZ-ede e-ƒ› d#ƒ i Z.e#d e e-ƒe!ƒD ]ŒZ$e-e$e$e! … Z%e%D ]@Z&ee&j/e&j)ƒZ0e ed$ƒe&j*e0d%œ¡ e. 1e0d ¡d e.e0< qre +¡  ed&e,e$e! e e-ƒƒ› de e-ƒ› dƒ qZed'ƒ ed(ƒ e ed)ƒ¡ZeD ]*\Z2Z3ed*e2pd+d,›d-e3d.›dƒ q
ed/ƒ d0d1d2d3d4gZ4e4D ]XZ2ed5e2 5¡ › d6ƒ e ed7ƒd8e2i¡ZeD ]$\ZZ3ed9ed:›d-e3d;›dƒ q€qPed<ƒ e ed=ƒ¡ZeD ]X\ZZZ2eròe eƒd>kròedd>… d nepúd?Z6ed@e2dA›dBedC›dDe6› ƒ qÄW 5 Q R X edEƒ edFƒ edGƒ edHƒ edIƒ dS )Jé    )Úcreate_engineÚtextN)Úload_dotenv)ÚConfigÚDATABASE_URLc              
   C   s<  | sdS zðt | tƒr t | ¡}n| }d}d}d|kr>|d }n4d|krP|d }n"d|krb|d }nd|krr|d }d|kr„|d }n"d|kr–|d }nd	|kr¦|d	 }|sðd
|krð|d
 }t |tƒrð| d¡pÖ| d¡}|pî| d¡pî| d	¡}||fW S  tjtfk
r6 } ztd|› ƒ W Y ¢dS d}~X Y nX dS )zK
    Extract application name and window title from activity JSON data
    )NNNÚappZapplicationZprogramZprocessÚtitleZwindowÚwindow_titleÚdatazError parsing JSON: )	Ú
isinstanceÚstrÚjsonÚloadsÚdictÚgetZJSONDecodeErrorÚ	TypeErrorÚprint)Úactivity_datar
   Úapp_namer	   ÚnestedÚe© r   ú./categorized_from_json.pyÚextract_app_info_from_json   s>    







r   c              N   C   sê  | sdS t | ƒ ¡ }|r$t |ƒ ¡ nd}| dd¡}dddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPhM}||krÞdQS dRdSdTdUdVdWh}||krúdXS dYdZd[d\d]d^d_d`dadbh
}||kr’dcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dd€dd‚dƒd„d…d†d‡dˆd‰dŠd3d‹dŒddŽddd‘d’d“d”d•d–d—d˜d™dšd›dœddždŸd d¡d¢d£d¤gC}d¥d¦d§d¨d©dªd«d¬d­d®d¯d°d±d²d³d´dµd¶d·d¸d¹dºd»d¼d½d¾d¿dÀdÁdÂdÃdÄdÅdÆdÇdÈdÉdÊdËdÌdÍdÎdÏdÐdÑdÒdÓdÔdÕdÖd×dØdÙdÚdÛdÜdÝdÞdßdàdádâdãdädådædçdèdédêdëdìdídîdïdðdñdògN}	|D ]}
t |
|tj¡rJ dóS qJ|	D ]}
t |
|tj¡rn dôS qndõS död÷dødùdúd²d±h}||kr²dûS düdýdþdÿd dddddh
}||krædS dS (  z@
    Categorize activity based on app name and window title
    ÚotherÚ z.exeÚcodeZvscodezvisual studio codeZvisualstudioZdevenvZpycharmZ	pycharm64ZideaZidea64ZintellijZeclipsez	notepad++Zsublime_textZsublimeZatomZbracketsZwebstormZphpstormZrubymineZgolandZcursorZnotepadZvimZgvimZemacsZnanoZwindowsterminalZterminalÚcmdZ
powershellZbashÚshZzshZterminusZitermZweztermZconemuZcmderZhyperZminttyZkonsoleZgitzgit-bashzgithub desktopZ
sourcetreeZ	gitkrakenZtortoisegitZdockerzdocker desktopZpostmanZinsomniaZpawZsoapuizthunder clientZdbeaverZmysqlZmysqldzmysql workbenchZpgadminZpgadmin4zmongodb compassZmongodZrediszredis-serverZ	tableplusz
sequel proZheidisqlZnavicatZ	filezillaZwinscpZputtyZvncZanydeskZ
virtualboxZvmwareZvagrantZ	parallelsÚproductivityZexplorerÚfinderZnautilusZthunarZdolphinÚfilesÚsystemZchromeZfirefoxZmsedgeZedgeZbraveZoperaZvivaldiZsafariZchromiumZwaterfoxzconsole\.awszaws\.amazonZ	amazonawsz\baws\bz\bec2\bz\bs3\bÚlambdaZ
cloudfrontZelasticbeanstalkZcloudformationZroute53zrds\bZdynamodbzconsole\.cloud\.googlezcloud\.googlez\bgcp\bzcompute enginez
app enginezcloud storageZfirebasezportal\.azurezazure\.microsoftz	\bazure\bzazure devopszvisualstudio\.comZdigitaloceanZherokuZnetlifyZvercelzrender\.comZ
cloudflareZlinodeZvultrzrailway\.appzgithub\.comZgitlabZ	bitbucketZjenkinsZcircleciz	travis-ciZ
kuberneteszk8s\.ioZ	localhostz127\.0\.0\.1z
0\.0\.0\.0z
192\.168\.z	:[0-9]{4}zlocalhost:[0-9]+Zstackoverflowzdeveloper\.zdevelopers\.zdocs\.Zdocumentationzapi\.z	console\.zadmin\.Z	dashboardzcontrol panelZ
phpmyadminZadminerzmongodb\.comz	redis\.iozelastic\.coZgrafanaZkibanaZ
prometheusZfacebookZ	instagramZtwitterz\bx\.comZtiktokzlinkedin\.comZ	pinterestZtumblrZsnapchatÚthreadsZmastodonzdiscord\.comZwhatsappZtelegramZyoutubez	youtu\.beZnetflixz
twitch\.tvZvimeoZdailymotionZhuluZdisneyZ
disneyplusZhbomaxZ
primevideozprime videoZhotstarZsonylivZzee5ZcrunchyrollZ
funimationZspotifyZ
soundcloudZpandoraZdeezerzapple musicZjiosaavnZgaanaZwynkzamazon musiczamazon\.comz
amazon\.inzamazon\.ZflipkartZebayZalibabaZ
aliexpressZmyntraZajioZshopifyZetsyZwalmartZbestbuyztarget\.comZredditZ9gagZimgurZbuzzfeedzmedium\.comznews\.zcnn\.zbbc\.ZfoxnewsZndtvZtimesofindiaZsteamZ	epicgamesÚoriginzbattle\.netZrobloxZ	minecraftZfortniteZvalorantZleagueoflegendsZtwitchZgamingzgames\.zign\.comÚserverÚunproductiveÚbrowserZteamsZslackZzoomZskypeZdiscordZcommunicationZwinwordZexcelZpowerpntZoutlookZonenoteZmsaccessZmspubZvisioZwordZ
powerpointZoffice)r   ÚlowerÚreplaceÚreÚsearchÚ
IGNORECASE)r   r	   Z	app_lowerZtitle_lowerZapp_baseZproductivity_appsZsystem_appsZbrowsersZserver_patternsZunproductive_patternsÚpatternZ	comm_appsZoffice_appsr   r   r   Úcategorize_activity?   s                                                                ð   ÿ
                                                 ß'                                                             ä 


    ÿ
r/   z.=== Categorizing Activities from JSON Data ===z
1. Analyzing JSON structure:zx
        SELECT activity_data
        FROM activity_records
        WHERE activity_data IS NOT NULL
        LIMIT 5
    é   z
   Sample z: app='z
', title='ú'z   JSON structure: é   )Úindentiô  z...z9
2. Extracting app info from JSON and updating records...zÌ
        SELECT id, activity_data, application_name, window_title
        FROM activity_records
        WHERE activity_data IS NOT NULL
        AND (application_name IS NULL OR application_name = '')
    z	   Found z" records with JSON but no app namezã
                    UPDATE activity_records
                    SET application_name = :app_name,
                        window_title = COALESCE(:window_title, window_title)
                    WHERE id = :id
                )Úidr   r	   z   Updated ú/z recordsz(   Total records updated with app info: z6
3. Categorizing all records based on app and title...z°
        SELECT id, application_name, window_title
        FROM activity_records
        WHERE application_name IS NOT NULL
        AND (category IS NULL OR category = '')
    z records to categorizez}
                UPDATE activity_records
                SET category = :category
                WHERE id = :id
            )r4   Úcategoryz   Categorized z
4. Final Results:z
   Category Distribution:z„
        SELECT category, COUNT(*) as count
        FROM activity_records
        GROUP BY category
        ORDER BY count DESC
    z   ZNULLz<15ú z>7z!
   Top Applications by Category:r   r&   r'   r(   r"   z
   ú:zã
            SELECT application_name, COUNT(*) as count
            FROM activity_records
            WHERE category = :category
            GROUP BY application_name
            ORDER BY count DESC
            LIMIT 5
        r6   z      z<25z>6z"
5. Sample Categorized Activities:z°
        SELECT application_name, window_title, category
        FROM activity_records
        WHERE category IS NOT NULL
        ORDER BY created_at DESC
        LIMIT 10
    é<   zNo titlez   [z<12z] z<20z | u   
âœ… Categorization complete!z@
Note: If some records still lack categories, it may be because:z*- The JSON doesn't contain app informationz,- The app is not in our categorization rulesz/- The JSON structure is different than expected)7Z
sqlalchemyr   r   r   Úosr+   Zdotenvr   Zconfigr   ÚgetenvZget_database_urlr   Zenginer   r/   r   ZconnectZconnZexecuteÚresultZsample_countÚrowr   r   r   r   r   r
   ÚdumpsÚlistZrecords_to_updateÚlenZ
batch_sizeZupdated_countÚrangeÚiZbatchÚrecordr   r   r	   r4   ZcommitÚminZrecords_to_categorizeZcategory_statsZapplication_namer6   r   ÚcatÚcountÚ
categoriesÚupperZtitle_previewr   r   r   r   Ú<module>   s¬   1 &$
ýû
,
þü	,$
ù	".,