From 91feb27d8e1b03ba01e59c2e82c2f319079b3e30 Mon Sep 17 00:00:00 2001 From: Team Goon Date: Sat, 8 Nov 2025 11:17:31 -0500 Subject: [PATCH] v0.3.5-r2: Added --json flag and expanded performer search fields (age, gender icon, country flag, physical attributes) --- .../metadata.json | 92 ++ .../metadata.json | 87 ++ .../metadata.json | 108 ++ .../metadata.json | 82 ++ .../metadata.json | 87 ++ .../metadata.json | 96 ++ .../metadata.json | 82 ++ .../metadata.json | 86 ++ .../metadata.json | 98 ++ .../metadata.json | 93 ++ .../metadata.json | 104 ++ .../metadata.json | 95 ++ .../metadata.json | 78 ++ .../metadata_update_log.json | 7 + .../metadata.json | 75 ++ .../metadata.json | 73 ++ .../metadata.json | 80 ++ .../metadata.json | 84 ++ .../metadata.json | 93 ++ .../metadata.json | 89 ++ .../metadata.json | 88 ++ .../metadata.json | 77 ++ .../metadata.json | 103 ++ .../metadata.json | 75 ++ .../metadata.json | 86 ++ .../metadata.json | 74 ++ .../metadata.json | 68 ++ .../metadata.json | 95 ++ .../metadata_update_log.json | 7 + .../metadata.json | 84 ++ .../metadata.json | 77 ++ .../metadata.json | 78 ++ .../metadata.json | 68 ++ .../metadata.json | 84 ++ .../metadata.json | 83 ++ .../metadata.json | 77 ++ .../metadata.json | 67 + .../metadata.json | 85 ++ Galleries/index.json | 1084 +++++++++++++++++ VERSION | 3 +- assets/logo/GOONDEX_logo.png | Bin 0 -> 13303 bytes assets/logo/GOONDEX_logo.svg | 50 +- assets/logo/GOONDEX_logo_dark.png | Bin 0 -> 15212 bytes assets/logo/GOONDEX_logo_light.png | Bin 0 -> 11903 bytes data/faces/alexis_texas/thumbnail.jpg | Bin 0 -> 32797 bytes data/faces/faye_reagan/thumbnail.jpg | Bin 0 -> 27153 bytes data/faces/j_mac/thumbnail.jpg | Bin 0 -> 18662 bytes data/faces/johnny_sins/thumbnail.jpg | Bin 0 -> 17636 bytes data/faces/madison_scott/thumbnail.jpg | Bin 0 -> 30869 bytes data/faces/mia_split/thumbnail.jpg | Bin 0 -> 26278 bytes data/faces/monique_alexander/thumbnail.jpg | Bin 0 -> 34603 bytes data/faces/riley_reid/thumbnail.jpg | Bin 0 -> 36820 bytes data/faces/sasha_grey/thumbnail.jpg | Bin 0 -> 32980 bytes .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + data/performers/P487184.json | 25 + data/performers/PP10802.json | 34 + data/performers/PP17020.json | 32 + data/performers/PP21083.json | 32 + data/performers/PP21647.json | 36 + data/performers/PP3684.json | 33 + data/performers/PP4806.json | 36 + data/performers/PP4988.json | 40 + data/performers/PP899.json | 38 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + data/performers/alexis-texas.json | 33 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + .../performer.json | 18 + data/performers/faye-reagan.json | 36 + .../performer.json | 18 + data/performers/j-mac.json | 32 + data/performers/johnny-sins.json | 36 + data/performers/madison-scott.json | 38 + data/performers/mia-split.json | 32 + data/performers/monique-alexander.json | 40 + data/performers/riley-reid.json | 38 + data/performers/sasha-grey.json | 34 + src/importer/__pycache__/cli.cpython-313.pyc | Bin 11552 -> 13452 bytes src/importer/cli.py | 68 +- src/importer/db/performers.db | Bin 65536 -> 65536 bytes src/importer/pornpics_bridge.py | 215 ++++ src/importer/reports/tag_stats.json | 236 +++- src/importer/reports/tag_stats_sorted.txt | 234 +++- src/importer/secrets/tpdb_api_key.txt | 1 + src/ml/__pycache__/tagging.cpython-313.pyc | Bin 1036 -> 4393 bytes src/ml/facecrop/trainer.py | 211 +++- src/ml/facecrop/verifier.py | 138 ++- src/ml/tagging_config.py | 19 + .../__pycache__/db_manager.cpython-313.pyc | Bin 12307 -> 19180 bytes .../__pycache__/tpdb_bridge.cpython-313.pyc | Bin 29215 -> 34303 bytes .../__pycache__/utils.cpython-313.pyc | Bin 1682 -> 6564 bytes src/performers/db_manager.py | 147 +++ src/performers/enrichment_bridge.py | 91 ++ src/performers/scraper.py | 178 ++- src/performers/search.py | 336 +++++ src/performers/sync/sync_all.py | 145 +++ src/performers/sync/sync_json_to_sqlite.py | 54 + src/performers/sync/sync_sqlite_to_json.py | 69 ++ src/performers/tpdb_bridge.py | 213 +++- src/performers/utils.py | 171 ++- src/utils/cli_colours.py | 81 ++ src/utils/install_alias.fish | 139 ++- src/utils/setup_fish_goondex.fish | 63 +- 197 files changed, 9082 insertions(+), 354 deletions(-) create mode 100644 Galleries/20251106_2236_Angel Rai_Chicka Bomb_All_Over_30_starring_Angel_Rai__Chicka_Bomb_Nude_Photos/metadata.json create mode 100644 Galleries/20251106_2236_Kama Oxi_Tom Holland_Porn_Megaload_featuring_Kama_Oxi__Tom_Holland_Sex_Pictures/metadata.json create mode 100644 Galleries/20251106_2236_Markus Dupree_Ramon Nomar_Riley Reid_Curvy_brunette_Riley_Reid_gets_a_DP_in_a_steamy_threesome_with_hung_studs/metadata.json create mode 100644 Galleries/20251106_2236_Riley Reid_Skinny_coed_with_trimmed_muff_Riley_Reid_gives_shows_her_spread_love_holes/metadata.json create mode 100644 Galleries/20251106_2236_Susanna Glam_Deny Lou_Amateur_mom_Susanna_Glam_gets_stripped_and_fucked_by_her_personal_trainer/metadata.json create mode 100644 Galleries/20251106_2236_Taissia Shanti_Adorable_little_teen_Elen_rides_her_boyfriend_s_dong_and_gets_a_facial/metadata.json create mode 100644 Galleries/20251106_2236_jorden kennedy_Pretty_brunette_teen_Jorden_Kennedy_exposes_her_sweet_body_in_a_hot_striptease/metadata.json create mode 100644 Galleries/20251106_2237_Damon Dice_Eva Lovia_Riley Reid_Attractive_Eva_Lovia___Riley_Reid_fuck_a_handsome_businessman_in_a_3some/metadata.json create mode 100644 Galleries/20251106_2237_Dredd_Riley Reid_Cute_brunette_with_a_petite_figure_Riley_Reid_gets_ass_railed_by_a_BBC/metadata.json create mode 100644 Galleries/20251106_2237_Lea Lexis_Riley Reid_Petite_Riley_Reid___busty_Lea_Lexis_tease_with_tits___flash_hot_panty_upskirts/metadata.json create mode 100644 Galleries/20251106_2237_Mike Adriano_Riley Reid_Tiny_brunette_Riley_Reid_shows_her_sexy_holes_and_fucks_a_huge_dick_in_POV/metadata.json create mode 100644 Galleries/20251106_2237_Preston Parker_Riley Reid_Petite_babysitter_Riley_Reid_enjoys_a_cheating_husband_s_big_dick/metadata.json create mode 100644 Galleries/20251106_2237_Riley Reid_Mr_POV_featuring_Riley_Reid_Nude_Photos/metadata.json create mode 100644 Galleries/20251106_2237_Riley Reid_Mr_POV_featuring_Riley_Reid_Nude_Photos/metadata_update_log.json create mode 100644 Galleries/20251106_2237_Riley Reid_Mr_POV_starring_Riley_Reid_Naked_Images/metadata.json create mode 100644 Galleries/20251106_2237_Riley Reid_Nerdy_American_schoolgirl_with_tiny_tits_Riley_Reid_showing_off/metadata.json create mode 100644 Galleries/20251106_2237_Riley Reid_Petite_female_Riley_Reid_rips_off_her_prison_jumper_to_model_in_the_nude/metadata.json create mode 100644 Galleries/20251106_2237_Riley Reid_Smiley_teenage_hottie_with_tattoos_revealing_her_perky_titties_and_neat_ass/metadata.json create mode 100644 Galleries/20251106_2237_Riley Reid_Xavier Miller_Kinky_nympho_Riley_Reid_hikes_up_her_red_dress_and_gets_blacked_hardcore/metadata.json create mode 100644 Galleries/20251106_2238_Damon Dice_Riley Reid_Petite_teen_girl_Riley_Reid_gives_her_guy_cake_and_a_fuck_for_his_birthday/metadata.json create mode 100644 Galleries/20251106_2238_Ramon Nomar_Riley Reid_Petite_babe_Riley_Reid_spreads_legs_for_her_lover___fucks_in_front_of_husband/metadata.json create mode 100644 Galleries/20251106_2238_Riley Reid_Leggy_white_chick_Riley_Reid_strips_to_black_stockings_with_her_glasses_on/metadata.json create mode 100644 Galleries/20251106_2258_Adriana Chechik_Aj Applegate_Anikka Albrite_Keisha Grey_Kleio Valentien_Riley Reid_Vicki Chase_Elegant_Angel_Adriana_Chechik__Aj_Applegate__Anikka_Albrite__Keisha_Grey__Kleio/metadata.json create mode 100644 Galleries/20251106_2258_Aubrey Kate_Riley Reid_Sebastian Keys_Sluts_Riley_Reid___Aubrey_Kate_show_off_their_big_butts___give_a_double_BJ/metadata.json create mode 100644 Galleries/20251106_2258_Erik Everhard_Riley Reid_Cheerleader_Riley_Reid_shows_her_tiny_tits_before_riding_a_pussy-wrecking_dick/metadata.json create mode 100644 Galleries/20251106_2258_Melissa Moore_Riley Reid_Lesbian_girls_Riley_Reid_and_Melissa_Moore_lick_and_finger_fuck_each_other/metadata.json create mode 100644 Galleries/20251106_2258_Riley Reid_Naked_blonde_chick_fist_fucks_herself_to_strong_orgasmic_contractions/metadata.json create mode 100644 Galleries/20251106_2258_Riley Reid_Van Wylde_Erotic_teen_beauty_Riley_Reid_takes_a_hard_cock_in_sexy_doggystyle_fucking/metadata.json create mode 100644 Galleries/20251106_2258_Riley Reid_Van Wylde_Erotic_teen_beauty_Riley_Reid_takes_a_hard_cock_in_sexy_doggystyle_fucking/metadata_update_log.json create mode 100644 Galleries/20251106_2335_Paige Owens_Steve Holmes_MILFed_starring_Paige_Owens__Steve_Holmes_Hot_Porn_Pics/metadata.json create mode 100644 Galleries/20251107_2029_Alex Tanner_Young_redhead_Alex_Tanner_shows_her_petite_body_while_completely_naked/metadata.json create mode 100644 Galleries/20251107_2031_Alex Tanner_Mr_POV_performed_by_Alex_Tanner_XXX_Photos/metadata.json create mode 100644 Galleries/20251107_2031_Alex Tanner_Young_redhead_Alex_Tanner_demonstrating_her_perfectly_smooth_pussy/metadata.json create mode 100644 Galleries/20251107_2031_Esmi Lee_Brooke Wylde_Gianna Nicole_Tiffany Taylor_Nikki Lima_Sasha Summers_Alex Tanner_J Mac_Sabrina Banks_Dani Desire_Blonde_party_girl_flashes_nude_upskirt___gets_cum_on_face_in_hot_orgy/metadata.json create mode 100644 Galleries/20251107_2037_Jayden Lee_Marcus London_Hot_babe_in_a_sinful_bikini_Jayden_Lee_blows_a_big_rod___gets_fucked_on_a_sofa/metadata.json create mode 100644 Galleries/20251107_2037_Mia Split_Aaron Rock_Alexa Flexy_Evil_Angel_featuring_Aaron_Rock__Alexa_Flexy__Mia_Split_Naked_Images/metadata.json create mode 100644 Galleries/20251107_2037_Unknown_Model_OnlyFans_Luv_Hanna_Zuki_Luv_Hanna_Zuki/metadata.json create mode 100644 Galleries/20251107_2319_Alora Jaymes_Sexy_mature_with_big_tits_Alora_Jaymes_gives_head_and_gets_rammed/metadata.json create mode 100644 assets/logo/GOONDEX_logo.png create mode 100644 assets/logo/GOONDEX_logo_dark.png create mode 100644 assets/logo/GOONDEX_logo_light.png create mode 100644 data/faces/alexis_texas/thumbnail.jpg create mode 100644 data/faces/faye_reagan/thumbnail.jpg create mode 100644 data/faces/j_mac/thumbnail.jpg create mode 100644 data/faces/johnny_sins/thumbnail.jpg create mode 100644 data/faces/madison_scott/thumbnail.jpg create mode 100644 data/faces/mia_split/thumbnail.jpg create mode 100644 data/faces/monique_alexander/thumbnail.jpg create mode 100644 data/faces/riley_reid/thumbnail.jpg create mode 100644 data/faces/sasha_grey/thumbnail.jpg create mode 100644 data/performers/01638222-6708-4698-a6c1-30b8c80eb09a/performer.json create mode 100644 data/performers/0315dae6-9643-4265-ac66-0f2e47264bd3/performer.json create mode 100644 data/performers/064f0295-3c36-48c1-89ea-76fa547f201e/performer.json create mode 100644 data/performers/0664972e-8f2c-43f8-95ff-1ac01681420d/performer.json create mode 100644 data/performers/0912d9fa-e824-414a-917c-29165ff39f7e/performer.json create mode 100644 data/performers/09d40f92-e294-4fe1-ab99-394ce50f762e/performer.json create mode 100644 data/performers/0bbdc743-cd03-4588-999f-7b81bef05f3c/performer.json create mode 100644 data/performers/145ac6dd-0c84-49d7-82f7-42ba092e4ea9/performer.json create mode 100644 data/performers/15efbebe-10c1-4e99-b863-1780551d2fb1/performer.json create mode 100644 data/performers/1f0a7f0d-297d-4731-8853-9d44dd31f3a4/performer.json create mode 100644 data/performers/21161316-f25e-4941-9d34-f0aaa118b4ad/performer.json create mode 100644 data/performers/21757d89-4b0a-4120-a07b-692f5649eb07/performer.json create mode 100644 data/performers/26a117de-578d-4533-836f-6f461f675393/performer.json create mode 100644 data/performers/29fbbbb1-f967-4b54-a5ee-60eaf8b505f9/performer.json create mode 100644 data/performers/2c9d762f-5360-4471-8ef7-ce5e6158c59e/performer.json create mode 100644 data/performers/2f700de5-b525-4dbe-b8e1-d7e066089e7e/performer.json create mode 100644 data/performers/2f89fd04-e81d-4430-8d26-f75eb4ee65e0/performer.json create mode 100644 data/performers/32cbf56e-9443-44c2-b53f-1c0dc5e0701c/performer.json create mode 100644 data/performers/337a4c2f-2622-48d8-a06d-62a6b1dcd561/performer.json create mode 100644 data/performers/345c71e2-cf3a-498e-a3ca-9dfa965c498d/performer.json create mode 100644 data/performers/34ac207a-5de9-4129-8f3e-2bf29175a320/performer.json create mode 100644 data/performers/34acd6b6-b1f7-485e-ab02-e4c3a9a9b79a/performer.json create mode 100644 data/performers/394436d7-a063-4e06-890e-e0dacad8c8b7/performer.json create mode 100644 data/performers/397688c6-f37b-43c1-9416-16cb0aa5ee45/performer.json create mode 100644 data/performers/39783e16-c611-4ae5-b02d-fd2f9c9ed54b/performer.json create mode 100644 data/performers/3cdad92a-bc0e-49a5-868e-3a41fd712aa6/performer.json create mode 100644 data/performers/3d33f525-2711-408b-9e6d-528392fd9552/performer.json create mode 100644 data/performers/3d7c2897-8d8b-4f80-996c-0b145d5c1580/performer.json create mode 100644 data/performers/3ec91510-89b1-4f8a-b88b-013abfae59be/performer.json create mode 100644 data/performers/3f6ab31d-04a7-4557-be15-d55b0db8f5d1/performer.json create mode 100644 data/performers/3fbb8994-94d9-4008-b79f-f43162a097a6/performer.json create mode 100644 data/performers/4141e782-6ece-44fe-8795-4b1d9ceb8929/performer.json create mode 100644 data/performers/4157fed0-bbed-479f-bd0b-58f4e97fc5da/performer.json create mode 100644 data/performers/460b73ae-852f-401a-b92f-1d050160b203/performer.json create mode 100644 data/performers/4b91ce7d-ff4c-402d-8917-aaa3a0c27ba0/performer.json create mode 100644 data/performers/4ece5f55-80d2-4991-9862-dcabe174bcdb/performer.json create mode 100644 data/performers/4ee89ba2-6210-4486-bbe2-c3a75dcc9012/performer.json create mode 100644 data/performers/5174e511-3f70-4a85-9ecb-182effbd9b42/performer.json create mode 100644 data/performers/5496783f-aba6-479f-881d-5fe8e9efad21/performer.json create mode 100644 data/performers/55ee1f08-0c5e-49a0-9e7a-8f02b7a5e9e4/performer.json create mode 100644 data/performers/59a3c146-a631-4678-a07a-2348ae04711d/performer.json create mode 100644 data/performers/5b12c499-c83c-464b-bfeb-9023b57dffa5/performer.json create mode 100644 data/performers/5e1df0e1-d2bb-4d65-9544-1ee64098eda2/performer.json create mode 100644 data/performers/5e520864-611f-4389-bb53-7a72a9557a1b/performer.json create mode 100644 data/performers/6009e864-a2fa-4a13-83db-7a0145a3f000/performer.json create mode 100644 data/performers/626b9b45-b1cd-4a25-8c17-5191cddea29a/performer.json create mode 100644 data/performers/628e0f9b-c988-45b6-b25f-610e0c9a3a4b/performer.json create mode 100644 data/performers/640f3e84-7d93-4480-ad45-f752aa06e2f7/performer.json create mode 100644 data/performers/64e4da78-689a-4368-8414-d8b1118e4c20/performer.json create mode 100644 data/performers/7279bb4e-f424-442c-830c-7284440d6649/performer.json create mode 100644 data/performers/7556fddf-11e2-4580-8826-2436c45aea11/performer.json create mode 100644 data/performers/79f11787-1fc7-427e-b815-6cef6a38b6d3/performer.json create mode 100644 data/performers/7bce4de8-3206-43d1-9f2c-f816900fa79a/performer.json create mode 100644 data/performers/7d341ba8-3fe5-496e-871b-61148ee2eaba/performer.json create mode 100644 data/performers/7eb1fc26-8201-495a-8428-1a56a26efeee/performer.json create mode 100644 data/performers/82809dcd-5c1d-4f44-b1a9-a2be82fecd05/performer.json create mode 100644 data/performers/83e99bb4-ba31-4758-9332-e0d031948d47/performer.json create mode 100644 data/performers/90208299-6cff-4bba-a0c7-062445fe3b00/performer.json create mode 100644 data/performers/9071b9c4-c08e-4784-853e-f43010b9972e/performer.json create mode 100644 data/performers/9247eded-8e48-4bde-ac44-d735e2895200/performer.json create mode 100644 data/performers/93be2f85-5519-4a0e-a1fe-e7d077ee9966/performer.json create mode 100644 data/performers/998e289f-9910-4f49-9ccc-99e22c0e5843/performer.json create mode 100644 data/performers/9adabd18-6371-472f-b346-544f210a6c2a/performer.json create mode 100644 data/performers/9b77a441-ecc9-4e9e-b5d0-d98a9f2e5d3e/performer.json create mode 100644 data/performers/P487184.json create mode 100644 data/performers/PP10802.json create mode 100644 data/performers/PP17020.json create mode 100644 data/performers/PP21083.json create mode 100644 data/performers/PP21647.json create mode 100644 data/performers/PP3684.json create mode 100644 data/performers/PP4806.json create mode 100644 data/performers/PP4988.json create mode 100644 data/performers/PP899.json create mode 100644 data/performers/a32c1c26-6c22-44fc-a4a2-f8956da2f485/performer.json create mode 100644 data/performers/a379151c-67d5-41d4-853f-1773ad515fbf/performer.json create mode 100644 data/performers/a3d6765e-3e7e-4046-8bf3-b315b8abb747/performer.json create mode 100644 data/performers/a4ff8226-47ed-4836-a377-a3692cd0b071/performer.json create mode 100644 data/performers/a6a3dfde-c755-4cdf-8a5d-f89294800d44/performer.json create mode 100644 data/performers/a7b79a20-2554-46df-962d-b25a171f3506/performer.json create mode 100644 data/performers/aab0808b-4d84-424e-87d8-eb973aa98ce3/performer.json create mode 100644 data/performers/alexis-texas.json create mode 100644 data/performers/b0c35557-470f-4bae-9818-22e433da8174/performer.json create mode 100644 data/performers/b1878fa0-08c8-44e1-be3c-9c0efe88fc45/performer.json create mode 100644 data/performers/b245fca1-4bd8-4670-9030-79b8987a90e7/performer.json create mode 100644 data/performers/b433f066-fa57-4c4a-b76f-c5e326201a2e/performer.json create mode 100644 data/performers/b615735f-94da-4fae-b55c-59072384809d/performer.json create mode 100644 data/performers/b71db76e-7f0b-4049-bd24-29707ffe0621/performer.json create mode 100644 data/performers/b87a5b3a-01d6-4314-a087-aba786ecfba4/performer.json create mode 100644 data/performers/b888b8da-c3b4-44c1-92aa-2b9521b52a0a/performer.json create mode 100644 data/performers/c56fd205-3a75-4a73-9c4c-95a2c901c8bf/performer.json create mode 100644 data/performers/c6175cb7-142c-40ba-b1f2-850bb23bb121/performer.json create mode 100644 data/performers/c64e3a3d-6657-460c-a03d-f753954e4110/performer.json create mode 100644 data/performers/d0b993ce-fc6b-4bab-983b-b02290525681/performer.json create mode 100644 data/performers/d1085beb-c80e-4765-af26-e65f16fcb7c1/performer.json create mode 100644 data/performers/d8fa3627-75d9-4026-9eea-00a9f9c023fe/performer.json create mode 100644 data/performers/dd555c22-b5ac-41ee-a783-8831cafaa2a9/performer.json create mode 100644 data/performers/dd6bd00a-2a54-492a-a6a5-00004f923c2f/performer.json create mode 100644 data/performers/ddfd7716-9b9e-4c9c-9860-5fea74912dd3/performer.json create mode 100644 data/performers/e3a55de0-acbb-4089-b9be-d521548e2a91/performer.json create mode 100644 data/performers/e645db83-24bb-4d65-a166-91787f1f3c40/performer.json create mode 100644 data/performers/e7972b51-145a-4041-b390-aae1d0044f6e/performer.json create mode 100644 data/performers/e9a7ba8b-e6b4-49e8-bf31-3cdb94e7b06a/performer.json create mode 100644 data/performers/ecaf9000-d1e3-4553-b181-b7855c9805b6/performer.json create mode 100644 data/performers/ed1dfb9e-2ef2-4edc-b037-12646434307e/performer.json create mode 100644 data/performers/ef182473-6644-4d58-a210-7fb215358795/performer.json create mode 100644 data/performers/f5a8e799-1d79-4edb-bc64-c5bae81ace23/performer.json create mode 100644 data/performers/f72ead88-f212-49ad-9ef9-53fd8a3d148d/performer.json create mode 100644 data/performers/f8f6d764-887d-4c77-91d7-f8b357f9f95e/performer.json create mode 100644 data/performers/f94f90ed-df41-4a4c-9b7c-b53e2d5118f7/performer.json create mode 100644 data/performers/faye-reagan.json create mode 100644 data/performers/fc0ebcbe-2885-43d5-a330-cd30ebbe1aef/performer.json create mode 100644 data/performers/j-mac.json create mode 100644 data/performers/johnny-sins.json create mode 100644 data/performers/madison-scott.json create mode 100644 data/performers/mia-split.json create mode 100644 data/performers/monique-alexander.json create mode 100644 data/performers/riley-reid.json create mode 100644 data/performers/sasha-grey.json create mode 100644 src/importer/pornpics_bridge.py create mode 100644 src/importer/secrets/tpdb_api_key.txt create mode 100644 src/ml/tagging_config.py create mode 100644 src/performers/enrichment_bridge.py create mode 100644 src/performers/search.py create mode 100644 src/performers/sync/sync_all.py create mode 100644 src/performers/sync/sync_json_to_sqlite.py create mode 100644 src/performers/sync/sync_sqlite_to_json.py create mode 100644 src/utils/cli_colours.py diff --git a/Galleries/20251106_2236_Angel Rai_Chicka Bomb_All_Over_30_starring_Angel_Rai__Chicka_Bomb_Nude_Photos/metadata.json b/Galleries/20251106_2236_Angel Rai_Chicka Bomb_All_Over_30_starring_Angel_Rai__Chicka_Bomb_Nude_Photos/metadata.json new file mode 100644 index 0000000..324313a --- /dev/null +++ b/Galleries/20251106_2236_Angel Rai_Chicka Bomb_All_Over_30_starring_Angel_Rai__Chicka_Bomb_Nude_Photos/metadata.json @@ -0,0 +1,92 @@ +{ + "id": "20251106_2236", + "title": "All Over 30 starring Angel Rai, Chicka Bomb Nude Photos", + "models": [ + "Angel Rai", + "Chicka Bomb" + ], + "categories": [ + "Tribbing", + "Babe", + "Ukrainian", + "Sexy", + "Pussy", + "Beautiful", + "Ass", + "Petite", + "Redhead", + "Amateur", + "Hot Naked Women", + "Lesbian Facesitting", + "Lesbian Scissoring", + "Nice Pussy", + "Redhead Lesbian", + "Wet Teen Pussy", + "Ukraine Pussy", + "Beautiful Pussy" + ], + "tags": [ + "Amateur", + "Ass", + "Beautiful", + "Beautiful Pussy", + "Hot Naked Women", + "Lesbian", + "Lesbian Facesitting", + "Lesbian Scissoring", + "Nice Pussy", + "Petite", + "Pussy", + "Redhead", + "Redhead Lesbian", + "Teen", + "Ukraine Pussy", + "Ukrainian", + "Wet Teen Pussy" + ], + "source": { + "network": "Amateur Europe", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/571/66224044/66224044_013_115e.jpg", + "https://cdni.pornpics.com/1280/7/571/66224044/66224044_019_30f5.jpg", + "https://cdni.pornpics.com/1280/7/571/66224044/66224044_035_6bb6.jpg", + "https://cdni.pornpics.com/1280/7/571/66224044/66224044_042_3626.jpg", + "https://cdni.pornpics.com/1280/7/571/66224044/66224044_054_63b8.jpg", + "https://cdni.pornpics.com/1280/7/571/66224044/66224044_062_e707.jpg", + "https://cdni.pornpics.com/1280/7/571/66224044/66224044_072_65a3.jpg", + "https://cdni.pornpics.com/1280/7/571/66224044/66224044_080_5e41.jpg", + "https://cdni.pornpics.com/1280/7/571/66224044/66224044_103_293d.jpg", + "https://cdni.pornpics.com/1280/7/571/66224044/66224044_107_c2a5.jpg", + "https://cdni.pornpics.com/1280/7/571/66224044/66224044_129_3362.jpg", + "https://cdni.pornpics.com/1280/7/571/66224044/66224044_139_e8cc.jpg", + "https://cdni.pornpics.com/1280/7/571/66224044/66224044_147_f649.jpg", + "https://cdni.pornpics.com/1280/7/571/66224044/66224044_165_3b97.jpg", + "https://cdni.pornpics.com/1280/7/571/66224044/66224044_168_af3d.jpg", + "https://cdni.pornpics.com/1280/7/571/66224044/66224044_179_273f.jpg", + "https://cdni.pornpics.com/1280/7/571/66224044/66224044_194_f9c4.jpg", + "https://cdni.pornpics.com/1280/7/571/66224044/66224044_211_c635.jpg", + "https://cdni.pornpics.com/1280/7/571/66224044/66224044_218_b3b7.jpg", + "https://cdni.pornpics.com/1280/7/571/66224044/66224044_236_dbb4.jpg", + "https://cdni.pornpics.com/1280/7/571/66224044/66224044_245_7298.jpg" + ], + "image_count": 21, + "date_scraped": "2025-11-06T22:36:16.505880+00:00", + "source_url": "https://www.pornpics.com/galleries/all-over-30-starring-angel-rai-chicka-bomb-nude-photos-66224044/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2236_Angel Rai_Chicka Bomb_All_Over_30_starring_Angel_Rai__Chicka_Bomb_Nude_Photos", + "inferred_tags": [ + "Amateur", + "Ass", + "Beautiful", + "Lesbian", + "Petite", + "Pussy", + "Redhead", + "Teen", + "Ukrainian" + ] +} \ No newline at end of file diff --git a/Galleries/20251106_2236_Kama Oxi_Tom Holland_Porn_Megaload_featuring_Kama_Oxi__Tom_Holland_Sex_Pictures/metadata.json b/Galleries/20251106_2236_Kama Oxi_Tom Holland_Porn_Megaload_featuring_Kama_Oxi__Tom_Holland_Sex_Pictures/metadata.json new file mode 100644 index 0000000..766c22c --- /dev/null +++ b/Galleries/20251106_2236_Kama Oxi_Tom Holland_Porn_Megaload_featuring_Kama_Oxi__Tom_Holland_Sex_Pictures/metadata.json @@ -0,0 +1,87 @@ +{ + "id": "20251106_2236", + "title": "Porn Megaload featuring Kama Oxi, Tom Holland Sex Pictures", + "models": [ + "Kama Oxi", + "Tom Holland" + ], + "categories": [ + "Schoolgirl", + "Old Young", + "Teacher", + "Mom", + "Pussy", + "Teen", + "Blowjob", + "Spreading", + "Feet", + "Non Nude", + "Teen Schoolgirl", + "Mom Son", + "Friends Mom", + "Mom Boy", + "Beautiful Blowjob", + "Brunette Teen", + "Mom Pussy", + "Fit" + ], + "tags": [ + "Beautiful", + "Beautiful Blowjob", + "Blowjob", + "Brunette", + "Brunette Teen", + "Fit", + "Friends Mom", + "Fucking", + "Mom Boy", + "Mom Pussy", + "Mom Son", + "Pussy", + "Teen", + "Teen Schoolgirl" + ], + "source": { + "network": "PornPics", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/740/76288217/76288217_005_16e0.jpg", + "https://cdni.pornpics.com/1280/7/740/76288217/76288217_011_f0a3.jpg", + "https://cdni.pornpics.com/1280/7/740/76288217/76288217_015_2ec0.jpg", + "https://cdni.pornpics.com/1280/7/740/76288217/76288217_025_5c5c.jpg", + "https://cdni.pornpics.com/1280/7/740/76288217/76288217_029_d79e.jpg", + "https://cdni.pornpics.com/1280/7/740/76288217/76288217_036_d660.jpg", + "https://cdni.pornpics.com/1280/7/740/76288217/76288217_042_5241.jpg", + "https://cdni.pornpics.com/1280/7/740/76288217/76288217_044_f051.jpg", + "https://cdni.pornpics.com/1280/7/740/76288217/76288217_045_c636.jpg", + "https://cdni.pornpics.com/1280/7/740/76288217/76288217_053_ca8e.jpg", + "https://cdni.pornpics.com/1280/7/740/76288217/76288217_061_9769.jpg", + "https://cdni.pornpics.com/1280/7/740/76288217/76288217_065_92fe.jpg", + "https://cdni.pornpics.com/1280/7/740/76288217/76288217_068_9824.jpg", + "https://cdni.pornpics.com/1280/7/740/76288217/76288217_078_5051.jpg", + "https://cdni.pornpics.com/1280/7/740/76288217/76288217_081_eee1.jpg", + "https://cdni.pornpics.com/1280/7/740/76288217/76288217_089_f0c7.jpg", + "https://cdni.pornpics.com/1280/7/740/76288217/76288217_094_12b1.jpg", + "https://cdni.pornpics.com/1280/7/740/76288217/76288217_101_be1e.jpg", + "https://cdni.pornpics.com/1280/7/740/76288217/76288217_104_1129.jpg", + "https://cdni.pornpics.com/1280/7/740/76288217/76288217_111_da8f.jpg", + "https://cdni.pornpics.com/1280/7/740/76288217/76288217_120_228c.jpg" + ], + "image_count": 21, + "date_scraped": "2025-11-06T22:36:26.070601+00:00", + "source_url": "https://www.pornpics.com/galleries/porn-megaload-featuring-kama-oxi-tom-holland-sex-pictures-76288217/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2236_Kama Oxi_Tom Holland_Porn_Megaload_featuring_Kama_Oxi__Tom_Holland_Sex_Pictures", + "inferred_tags": [ + "Beautiful", + "Blowjob", + "Brunette", + "Fit", + "Fucking", + "Pussy", + "Teen" + ] +} \ No newline at end of file diff --git a/Galleries/20251106_2236_Markus Dupree_Ramon Nomar_Riley Reid_Curvy_brunette_Riley_Reid_gets_a_DP_in_a_steamy_threesome_with_hung_studs/metadata.json b/Galleries/20251106_2236_Markus Dupree_Ramon Nomar_Riley Reid_Curvy_brunette_Riley_Reid_gets_a_DP_in_a_steamy_threesome_with_hung_studs/metadata.json new file mode 100644 index 0000000..4207ebf --- /dev/null +++ b/Galleries/20251106_2236_Markus Dupree_Ramon Nomar_Riley Reid_Curvy_brunette_Riley_Reid_gets_a_DP_in_a_steamy_threesome_with_hung_studs/metadata.json @@ -0,0 +1,108 @@ +{ + "id": "20251106_2236", + "title": "Curvy brunette Riley Reid gets a DP in a steamy threesome with hung studs", + "models": [ + "Markus Dupree", + "Ramon Nomar", + "Riley Reid" + ], + "categories": [ + "Threesome", + "Fetish", + "PAWG", + "Upskirt", + "Latex", + "Double Penetration", + "High Heels", + "Pornstar", + "Hairy", + "Facial", + "Short Skirt No Panties", + "Tight Dress", + "Upskirt No Panties", + "Hairy Upskirt", + "Short Skirt High Heels", + "Double Anal", + "Sexy Dress", + "Brunette Hairy Pussy" + ], + "tags": [ + "Anal", + "Anal Fetish", + "Brunette", + "Brunette Hairy Pussy", + "Curvy", + "Double Anal", + "Dress", + "Facial", + "Fetish", + "Hairy", + "Hairy Upskirt", + "High Heels", + "Latex", + "Latex Fetish", + "Panties", + "Penetration", + "Pornstar", + "Pussy", + "Sexy Dress", + "Short Skirt High Heels", + "Short Skirt No Panties", + "Skirt", + "Threesome", + "Tight Dress", + "Upskirt No Panties" + ], + "source": { + "network": "PornPics", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/550/31077441/31077441_004_3073.jpg", + "https://cdni.pornpics.com/1280/7/550/31077441/31077441_006_00dd.jpg", + "https://cdni.pornpics.com/1280/7/550/31077441/31077441_015_8bfe.jpg", + "https://cdni.pornpics.com/1280/7/550/31077441/31077441_016_b0db.jpg", + "https://cdni.pornpics.com/1280/7/550/31077441/31077441_021_27fb.jpg", + "https://cdni.pornpics.com/1280/7/550/31077441/31077441_030_0ef2.jpg", + "https://cdni.pornpics.com/1280/7/550/31077441/31077441_035_1935.jpg", + "https://cdni.pornpics.com/1280/7/550/31077441/31077441_037_93bb.jpg", + "https://cdni.pornpics.com/1280/7/550/31077441/31077441_042_ca5b.jpg", + "https://cdni.pornpics.com/1280/7/550/31077441/31077441_046_39cd.jpg", + "https://cdni.pornpics.com/1280/7/550/31077441/31077441_052_30d7.jpg", + "https://cdni.pornpics.com/1280/7/550/31077441/31077441_057_f3ff.jpg", + "https://cdni.pornpics.com/1280/7/550/31077441/31077441_064_5913.jpg", + "https://cdni.pornpics.com/1280/7/550/31077441/31077441_069_ef9c.jpg", + "https://cdni.pornpics.com/1280/7/550/31077441/31077441_072_ab1a.jpg", + "https://cdni.pornpics.com/1280/7/550/31077441/31077441_080_c483.jpg", + "https://cdni.pornpics.com/1280/7/550/31077441/31077441_084_a452.jpg", + "https://cdni.pornpics.com/1280/7/550/31077441/31077441_088_65a2.jpg", + "https://cdni.pornpics.com/1280/7/550/31077441/31077441_089_6bfb.jpg", + "https://cdni.pornpics.com/1280/7/550/31077441/31077441_096_6a83.jpg" + ], + "image_count": 20, + "date_scraped": "2025-11-06T22:36:52.785931+00:00", + "source_url": "https://www.pornpics.com/galleries/curvy-brunette-riley-reid-gets-a-dp-in-a-steamy-threesome-with-hung-studs-31077441/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2236_Markus Dupree_Ramon Nomar_Riley Reid_Curvy_brunette_Riley_Reid_gets_a_DP_in_a_steamy_threesome_with_hung_studs", + "inferred_tags": [ + "Anal", + "Anal Fetish", + "Brunette", + "Curvy", + "Dress", + "Facial", + "Fetish", + "Hairy", + "High Heels", + "Latex", + "Latex Fetish", + "Panties", + "Penetration", + "Pornstar", + "Pussy", + "Skirt", + "Threesome" + ] +} \ No newline at end of file diff --git a/Galleries/20251106_2236_Riley Reid_Skinny_coed_with_trimmed_muff_Riley_Reid_gives_shows_her_spread_love_holes/metadata.json b/Galleries/20251106_2236_Riley Reid_Skinny_coed_with_trimmed_muff_Riley_Reid_gives_shows_her_spread_love_holes/metadata.json new file mode 100644 index 0000000..f4aa093 --- /dev/null +++ b/Galleries/20251106_2236_Riley Reid_Skinny_coed_with_trimmed_muff_Riley_Reid_gives_shows_her_spread_love_holes/metadata.json @@ -0,0 +1,82 @@ +{ + "id": "20251106_2236", + "title": "Skinny coed with trimmed muff Riley Reid gives shows her spread love holes", + "models": [ + "Riley Reid" + ], + "categories": [ + "Ass", + "Close Up", + "Pornstar", + "Tattoo", + "Asshole", + "Pussy", + "Solo", + "Hairy", + "Beautiful", + "Skinny", + "Bent Over Ass", + "Nude", + "Hot Naked Women", + "Bent Over", + "Sexy Ass", + "PAWG Solo", + "Ass Spread", + "Wet Pussy Close Up" + ], + "tags": [ + "Ass", + "Ass Spread", + "Beautiful", + "Bent Over", + "Bent Over Ass", + "Hairy", + "Hot Naked Women", + "Nude", + "PAWG Solo", + "Pornstar", + "Pussy", + "Sexy Ass", + "Skinny", + "Solo", + "Wet Pussy Close Up" + ], + "source": { + "network": "PornPics", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/268/56770461/56770461_001_9bc3.jpg", + "https://cdni.pornpics.com/1280/7/268/56770461/56770461_006_67f2.jpg", + "https://cdni.pornpics.com/1280/7/268/56770461/56770461_009_31eb.jpg", + "https://cdni.pornpics.com/1280/7/268/56770461/56770461_011_5c64.jpg", + "https://cdni.pornpics.com/1280/7/268/56770461/56770461_013_cb52.jpg", + "https://cdni.pornpics.com/1280/7/268/56770461/56770461_017_a5f4.jpg", + "https://cdni.pornpics.com/1280/7/268/56770461/56770461_019_0134.jpg", + "https://cdni.pornpics.com/1280/7/268/56770461/56770461_024_2eff.jpg", + "https://cdni.pornpics.com/1280/7/268/56770461/56770461_027_a24e.jpg", + "https://cdni.pornpics.com/1280/7/268/56770461/56770461_030_622c.jpg", + "https://cdni.pornpics.com/1280/7/268/56770461/56770461_032_e6ea.jpg", + "https://cdni.pornpics.com/1280/7/268/56770461/56770461_036_4f11.jpg", + "https://cdni.pornpics.com/1280/7/268/56770461/56770461_037_a09d.jpg", + "https://cdni.pornpics.com/1280/7/268/56770461/56770461_042_5a76.jpg", + "https://cdni.pornpics.com/1280/7/268/56770461/56770461_045_337c.jpg", + "https://cdni.pornpics.com/1280/7/268/56770461/56770461_046_00ad.jpg" + ], + "image_count": 16, + "date_scraped": "2025-11-06T22:36:56.876114+00:00", + "source_url": "https://www.pornpics.com/galleries/skinny-coed-with-trimmed-muff-riley-reid-gives-shows-her-spread-love-holes-56770461/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2236_Riley Reid_Skinny_coed_with_trimmed_muff_Riley_Reid_gives_shows_her_spread_love_holes", + "inferred_tags": [ + "Ass", + "Beautiful", + "Hairy", + "Pornstar", + "Pussy", + "Skinny", + "Solo" + ] +} \ No newline at end of file diff --git a/Galleries/20251106_2236_Susanna Glam_Deny Lou_Amateur_mom_Susanna_Glam_gets_stripped_and_fucked_by_her_personal_trainer/metadata.json b/Galleries/20251106_2236_Susanna Glam_Deny Lou_Amateur_mom_Susanna_Glam_gets_stripped_and_fucked_by_her_personal_trainer/metadata.json new file mode 100644 index 0000000..386110e --- /dev/null +++ b/Galleries/20251106_2236_Susanna Glam_Deny Lou_Amateur_mom_Susanna_Glam_gets_stripped_and_fucked_by_her_personal_trainer/metadata.json @@ -0,0 +1,87 @@ +{ + "id": "20251106_2236", + "title": "Amateur mom Susanna Glam gets stripped and fucked by her personal trainer", + "models": [ + "Susanna Glam", + "Deny Lou" + ], + "categories": [ + "Mom", + "Mature", + "Old Young", + "Granny", + "Amateur", + "Teen", + "Pussy", + "Blowjob", + "Sexy", + "Handjob", + "Mom Boy", + "GILF", + "Beautiful Granny", + "Mom Son", + "Granny Handjob", + "Sexy GILF", + "Granny Slut", + "Mature Boy" + ], + "tags": [ + "Amateur", + "Beautiful", + "Beautiful Granny", + "Blowjob", + "GILF", + "Granny Handjob", + "Granny Slut", + "Handjob", + "Mature", + "Mature Boy", + "Mom Boy", + "Mom Son", + "Pussy", + "Sexy GILF", + "Teen" + ], + "source": { + "network": "Amateur Europe", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/739/54709783/54709783_002_7573.jpg", + "https://cdni.pornpics.com/1280/7/739/54709783/54709783_005_f878.jpg", + "https://cdni.pornpics.com/1280/7/739/54709783/54709783_009_df36.jpg", + "https://cdni.pornpics.com/1280/7/739/54709783/54709783_015_c13c.jpg", + "https://cdni.pornpics.com/1280/7/739/54709783/54709783_019_4754.jpg", + "https://cdni.pornpics.com/1280/7/739/54709783/54709783_024_adf4.jpg", + "https://cdni.pornpics.com/1280/7/739/54709783/54709783_027_cfb4.jpg", + "https://cdni.pornpics.com/1280/7/739/54709783/54709783_032_7cd9.jpg", + "https://cdni.pornpics.com/1280/7/739/54709783/54709783_033_7cd9.jpg", + "https://cdni.pornpics.com/1280/7/739/54709783/54709783_038_6940.jpg", + "https://cdni.pornpics.com/1280/7/739/54709783/54709783_044_11a0.jpg", + "https://cdni.pornpics.com/1280/7/739/54709783/54709783_046_a4af.jpg", + "https://cdni.pornpics.com/1280/7/739/54709783/54709783_051_8b7b.jpg", + "https://cdni.pornpics.com/1280/7/739/54709783/54709783_053_5e7c.jpg", + "https://cdni.pornpics.com/1280/7/739/54709783/54709783_056_2107.jpg", + "https://cdni.pornpics.com/1280/7/739/54709783/54709783_061_5103.jpg", + "https://cdni.pornpics.com/1280/7/739/54709783/54709783_063_39d8.jpg", + "https://cdni.pornpics.com/1280/7/739/54709783/54709783_066_ec1b.jpg", + "https://cdni.pornpics.com/1280/7/739/54709783/54709783_069_f21c.jpg", + "https://cdni.pornpics.com/1280/7/739/54709783/54709783_071_99a1.jpg" + ], + "image_count": 20, + "date_scraped": "2025-11-06T22:36:11.000270+00:00", + "source_url": "https://www.pornpics.com/galleries/amateur-mom-susanna-glam-gets-stripped-and-fucked-by-her-personal-trainer-54709783/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2236_Susanna Glam_Deny Lou_Amateur_mom_Susanna_Glam_gets_stripped_and_fucked_by_her_personal_trainer", + "inferred_tags": [ + "Amateur", + "Beautiful", + "Blowjob", + "Handjob", + "Mature", + "Pussy", + "Teen" + ] +} \ No newline at end of file diff --git a/Galleries/20251106_2236_Taissia Shanti_Adorable_little_teen_Elen_rides_her_boyfriend_s_dong_and_gets_a_facial/metadata.json b/Galleries/20251106_2236_Taissia Shanti_Adorable_little_teen_Elen_rides_her_boyfriend_s_dong_and_gets_a_facial/metadata.json new file mode 100644 index 0000000..16d9b56 --- /dev/null +++ b/Galleries/20251106_2236_Taissia Shanti_Adorable_little_teen_Elen_rides_her_boyfriend_s_dong_and_gets_a_facial/metadata.json @@ -0,0 +1,96 @@ +{ + "id": "20251106_2236", + "title": "Adorable little teen Elen rides her boyfriend's dong and gets a facial", + "models": [ + "Taissia Shanti" + ], + "categories": [ + "Tiny Tits", + "Teen", + "Hardcore", + "Cumshot", + "Russian", + "Facesitting", + "Shorts", + "Pussy", + "Ass", + "Big Cock", + "Teen Fuck", + "Small Tits Fuck", + "Skinny Teen Fuck", + "Russian Teen", + "Teen Hardcore", + "Clothed Fuck", + "Teen Facesitting", + "Teen Cum" + ], + "tags": [ + "Ass", + "Big Cock", + "Big Tits", + "Clothed Fuck", + "Cumshot", + "Facial", + "Fucking", + "Hardcore", + "Pussy", + "Russian", + "Russian Teen", + "Shorts", + "Skinny", + "Skinny Teen Fuck", + "Small Tits Fuck", + "Teen", + "Teen Cum", + "Teen Facesitting", + "Teen Fuck", + "Teen Hardcore" + ], + "source": { + "network": "PornPics", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/131/73470783/73470783_003_372f.jpg", + "https://cdni.pornpics.com/1280/7/131/73470783/73470783_009_298a.jpg", + "https://cdni.pornpics.com/1280/7/131/73470783/73470783_017_8d10.jpg", + "https://cdni.pornpics.com/1280/7/131/73470783/73470783_024_7b2e.jpg", + "https://cdni.pornpics.com/1280/7/131/73470783/73470783_029_b569.jpg", + "https://cdni.pornpics.com/1280/7/131/73470783/73470783_036_6e16.jpg", + "https://cdni.pornpics.com/1280/7/131/73470783/73470783_045_f904.jpg", + "https://cdni.pornpics.com/1280/7/131/73470783/73470783_054_0602.jpg", + "https://cdni.pornpics.com/1280/7/131/73470783/73470783_060_82aa.jpg", + "https://cdni.pornpics.com/1280/7/131/73470783/73470783_064_6db2.jpg", + "https://cdni.pornpics.com/1280/7/131/73470783/73470783_073_2f60.jpg", + "https://cdni.pornpics.com/1280/7/131/73470783/73470783_084_ebe8.jpg", + "https://cdni.pornpics.com/1280/7/131/73470783/73470783_087_d26c.jpg", + "https://cdni.pornpics.com/1280/7/131/73470783/73470783_094_09f6.jpg", + "https://cdni.pornpics.com/1280/7/131/73470783/73470783_099_2151.jpg", + "https://cdni.pornpics.com/1280/7/131/73470783/73470783_107_4012.jpg", + "https://cdni.pornpics.com/1280/7/131/73470783/73470783_112_b91c.jpg", + "https://cdni.pornpics.com/1280/7/131/73470783/73470783_121_4098.jpg", + "https://cdni.pornpics.com/1280/7/131/73470783/73470783_122_47ba.jpg", + "https://cdni.pornpics.com/1280/7/131/73470783/73470783_129_c960.jpg" + ], + "image_count": 20, + "date_scraped": "2025-11-06T22:36:21.117480+00:00", + "source_url": "https://www.pornpics.com/galleries/adorable-little-teen-elen-rides-her-boyfriends-dong-and-gets-a-facial-73470783/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2236_Taissia Shanti_Adorable_little_teen_Elen_rides_her_boyfriend_s_dong_and_gets_a_facial", + "inferred_tags": [ + "Ass", + "Big Cock", + "Big Tits", + "Cumshot", + "Facial", + "Fucking", + "Hardcore", + "Pussy", + "Russian", + "Shorts", + "Skinny", + "Teen" + ] +} \ No newline at end of file diff --git a/Galleries/20251106_2236_jorden kennedy_Pretty_brunette_teen_Jorden_Kennedy_exposes_her_sweet_body_in_a_hot_striptease/metadata.json b/Galleries/20251106_2236_jorden kennedy_Pretty_brunette_teen_Jorden_Kennedy_exposes_her_sweet_body_in_a_hot_striptease/metadata.json new file mode 100644 index 0000000..40f0f45 --- /dev/null +++ b/Galleries/20251106_2236_jorden kennedy_Pretty_brunette_teen_Jorden_Kennedy_exposes_her_sweet_body_in_a_hot_striptease/metadata.json @@ -0,0 +1,82 @@ +{ + "id": "20251106_2236", + "title": "Pretty brunette teen Jorden Kennedy exposes her sweet body in a hot striptease", + "models": [ + "jorden kennedy" + ], + "categories": [ + "Amateur", + "Hairy", + "Outdoor", + "Non Nude", + "Spreading", + "Pussy", + "Natural Hairy", + "Big Hairy Pussy", + "Amateur Hairy Pussy", + "Beautiful Hairy", + "Hairy Bush", + "Extremely Hairy Pussy" + ], + "tags": [ + "Amateur", + "Amateur Hairy Pussy", + "Beautiful", + "Beautiful Hairy", + "Big Hairy Pussy", + "Brunette", + "Extremely Hairy Pussy", + "Hairy", + "Hairy Bush", + "Natural", + "Natural Hairy", + "Natural Look", + "Outdoor", + "Pussy", + "Teen" + ], + "source": { + "network": "Amateur Europe", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/652/47702961/47702961_002_1613.jpg", + "https://cdni.pornpics.com/1280/7/652/47702961/47702961_005_e681.jpg", + "https://cdni.pornpics.com/1280/7/652/47702961/47702961_009_5b7d.jpg", + "https://cdni.pornpics.com/1280/7/652/47702961/47702961_013_6a51.jpg", + "https://cdni.pornpics.com/1280/7/652/47702961/47702961_016_19ed.jpg", + "https://cdni.pornpics.com/1280/7/652/47702961/47702961_019_968e.jpg", + "https://cdni.pornpics.com/1280/7/652/47702961/47702961_022_8643.jpg", + "https://cdni.pornpics.com/1280/7/652/47702961/47702961_023_b4f5.jpg", + "https://cdni.pornpics.com/1280/7/652/47702961/47702961_028_7fee.jpg", + "https://cdni.pornpics.com/1280/7/652/47702961/47702961_029_993c.jpg", + "https://cdni.pornpics.com/1280/7/652/47702961/47702961_034_12fc.jpg", + "https://cdni.pornpics.com/1280/7/652/47702961/47702961_037_a107.jpg", + "https://cdni.pornpics.com/1280/7/652/47702961/47702961_039_fc1c.jpg", + "https://cdni.pornpics.com/1280/7/652/47702961/47702961_041_dfda.jpg", + "https://cdni.pornpics.com/1280/7/652/47702961/47702961_045_dc8d.jpg", + "https://cdni.pornpics.com/1280/7/652/47702961/47702961_049_74d9.jpg", + "https://cdni.pornpics.com/1280/7/652/47702961/47702961_052_4d0c.jpg", + "https://cdni.pornpics.com/1280/7/652/47702961/47702961_054_602a.jpg", + "https://cdni.pornpics.com/1280/7/652/47702961/47702961_058_a8f3.jpg", + "https://cdni.pornpics.com/1280/7/652/47702961/47702961_061_8c3b.jpg" + ], + "image_count": 20, + "date_scraped": "2025-11-06T22:36:35.305079+00:00", + "source_url": "https://www.pornpics.com/galleries/pretty-brunette-teen-jorden-kennedy-exposes-her-sweet-body-in-a-hot-striptease-47702961/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2236_jorden kennedy_Pretty_brunette_teen_Jorden_Kennedy_exposes_her_sweet_body_in_a_hot_striptease", + "inferred_tags": [ + "Amateur", + "Beautiful", + "Brunette", + "Hairy", + "Natural", + "Natural Look", + "Outdoor", + "Pussy", + "Teen" + ] +} \ No newline at end of file diff --git a/Galleries/20251106_2237_Damon Dice_Eva Lovia_Riley Reid_Attractive_Eva_Lovia___Riley_Reid_fuck_a_handsome_businessman_in_a_3some/metadata.json b/Galleries/20251106_2237_Damon Dice_Eva Lovia_Riley Reid_Attractive_Eva_Lovia___Riley_Reid_fuck_a_handsome_businessman_in_a_3some/metadata.json new file mode 100644 index 0000000..9e018e7 --- /dev/null +++ b/Galleries/20251106_2237_Damon Dice_Eva Lovia_Riley Reid_Attractive_Eva_Lovia___Riley_Reid_fuck_a_handsome_businessman_in_a_3some/metadata.json @@ -0,0 +1,86 @@ +{ + "id": "20251106_2237", + "title": "Attractive Eva Lovia & Riley Reid fuck a handsome businessman in a 3some", + "models": [ + "Damon Dice", + "Eva Lovia", + "Riley Reid" + ], + "categories": [ + "Threesome", + "Groupsex", + "Facesitting", + "Pornstar", + "Cowgirl", + "Petite", + "Blowjob", + "Pussy", + "Tiny Tits", + "Natural Tits", + "Reverse Cowgirl", + "Trimmed Pussy", + "Skinny Small Tits", + "Brunette Natural Tits" + ], + "tags": [ + "Big Tits", + "Blowjob", + "Brunette", + "Brunette Natural Tits", + "Cowgirl", + "Fucking", + "Natural", + "Natural Look", + "Petite", + "Pornstar", + "Pussy", + "Reverse Cowgirl", + "Skinny", + "Skinny Small Tits", + "Threesome", + "Trimmed Pussy" + ], + "source": { + "network": "PornPics", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/496/56531264/56531264_001_d09c.jpg", + "https://cdni.pornpics.com/1280/7/496/56531264/56531264_002_25ed.jpg", + "https://cdni.pornpics.com/1280/7/496/56531264/56531264_003_2ba2.jpg", + "https://cdni.pornpics.com/1280/7/496/56531264/56531264_004_4a0e.jpg", + "https://cdni.pornpics.com/1280/7/496/56531264/56531264_005_4a0e.jpg", + "https://cdni.pornpics.com/1280/7/496/56531264/56531264_006_b96a.jpg", + "https://cdni.pornpics.com/1280/7/496/56531264/56531264_007_e464.jpg", + "https://cdni.pornpics.com/1280/7/496/56531264/56531264_008_f9fb.jpg", + "https://cdni.pornpics.com/1280/7/496/56531264/56531264_009_76b4.jpg", + "https://cdni.pornpics.com/1280/7/496/56531264/56531264_010_6604.jpg", + "https://cdni.pornpics.com/1280/7/496/56531264/56531264_011_a111.jpg", + "https://cdni.pornpics.com/1280/7/496/56531264/56531264_012_4b4b.jpg", + "https://cdni.pornpics.com/1280/7/496/56531264/56531264_013_fa16.jpg", + "https://cdni.pornpics.com/1280/7/496/56531264/56531264_014_3342.jpg", + "https://cdni.pornpics.com/1280/7/496/56531264/56531264_015_e76b.jpg" + ], + "image_count": 15, + "date_scraped": "2025-11-06T22:37:29.826327+00:00", + "source_url": "https://www.pornpics.com/galleries/attractive-eva-lovia-riley-reid-fuck-a-handsome-businessman-in-a-3some-56531264/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2237_Damon Dice_Eva Lovia_Riley Reid_Attractive_Eva_Lovia___Riley_Reid_fuck_a_handsome_businessman_in_a_3some", + "inferred_tags": [ + "Big Tits", + "Blowjob", + "Brunette", + "Cowgirl", + "Fucking", + "Natural", + "Natural Look", + "Petite", + "Pornstar", + "Pussy", + "Reverse Cowgirl", + "Skinny", + "Threesome" + ] +} \ No newline at end of file diff --git a/Galleries/20251106_2237_Dredd_Riley Reid_Cute_brunette_with_a_petite_figure_Riley_Reid_gets_ass_railed_by_a_BBC/metadata.json b/Galleries/20251106_2237_Dredd_Riley Reid_Cute_brunette_with_a_petite_figure_Riley_Reid_gets_ass_railed_by_a_BBC/metadata.json new file mode 100644 index 0000000..8fd1559 --- /dev/null +++ b/Galleries/20251106_2237_Dredd_Riley Reid_Cute_brunette_with_a_petite_figure_Riley_Reid_gets_ass_railed_by_a_BBC/metadata.json @@ -0,0 +1,98 @@ +{ + "id": "20251106_2237", + "title": "Cute brunette with a petite figure Riley Reid gets ass railed by a BBC", + "models": [ + "Dredd", + "Riley Reid" + ], + "categories": [ + "Ass Fucking", + "Big Cock", + "Anal", + "Interracial", + "BBC", + "Sexy", + "Pool", + "Petite", + "Wet", + "Blowjob", + "Interracial Anal", + "Big Dick Anal", + "BBC Anal", + "Big Black Cock", + "Doggystyle Anal", + "Big Cock Blowjob", + "Monster Cock", + "Big Black Dick" + ], + "tags": [ + "Anal", + "Anal Fetish", + "Ass", + "BBC", + "BBC Anal", + "Big Black Cock", + "Big Black Dick", + "Big Cock", + "Big Cock Blowjob", + "Big Dick Anal", + "Blowjob", + "Brunette", + "Doggystyle", + "Doggystyle Anal", + "Fucking", + "Interracial", + "Interracial Anal", + "Monster Cock", + "Petite", + "Pool" + ], + "source": { + "network": "PornPics", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/177/60016759/60016759_009_fe06.jpg", + "https://cdni.pornpics.com/1280/7/177/60016759/60016759_020_0ebc.jpg", + "https://cdni.pornpics.com/1280/7/177/60016759/60016759_023_9a4d.jpg", + "https://cdni.pornpics.com/1280/7/177/60016759/60016759_038_3d9c.jpg", + "https://cdni.pornpics.com/1280/7/177/60016759/60016759_048_6187.jpg", + "https://cdni.pornpics.com/1280/7/177/60016759/60016759_052_813c.jpg", + "https://cdni.pornpics.com/1280/7/177/60016759/60016759_063_3c05.jpg", + "https://cdni.pornpics.com/1280/7/177/60016759/60016759_073_dc2e.jpg", + "https://cdni.pornpics.com/1280/7/177/60016759/60016759_087_1ffa.jpg", + "https://cdni.pornpics.com/1280/7/177/60016759/60016759_089_fc27.jpg", + "https://cdni.pornpics.com/1280/7/177/60016759/60016759_102_6a67.jpg", + "https://cdni.pornpics.com/1280/7/177/60016759/60016759_115_e7d5.jpg", + "https://cdni.pornpics.com/1280/7/177/60016759/60016759_119_df38.jpg", + "https://cdni.pornpics.com/1280/7/177/60016759/60016759_126_2514.jpg", + "https://cdni.pornpics.com/1280/7/177/60016759/60016759_134_5dd6.jpg", + "https://cdni.pornpics.com/1280/7/177/60016759/60016759_151_ea2b.jpg", + "https://cdni.pornpics.com/1280/7/177/60016759/60016759_160_1707.jpg", + "https://cdni.pornpics.com/1280/7/177/60016759/60016759_165_c775.jpg", + "https://cdni.pornpics.com/1280/7/177/60016759/60016759_176_3b45.jpg", + "https://cdni.pornpics.com/1280/7/177/60016759/60016759_187_63fb.jpg" + ], + "image_count": 20, + "date_scraped": "2025-11-06T22:37:01.679280+00:00", + "source_url": "https://www.pornpics.com/galleries/cute-brunette-with-a-petite-figure-riley-reid-gets-ass-railed-by-a-bbc-60016759/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2237_Dredd_Riley Reid_Cute_brunette_with_a_petite_figure_Riley_Reid_gets_ass_railed_by_a_BBC", + "inferred_tags": [ + "Anal", + "Anal Fetish", + "Ass", + "BBC", + "Big Cock", + "Blowjob", + "Brunette", + "Doggystyle", + "Fetish", + "Fucking", + "Interracial", + "Petite", + "Pool" + ] +} \ No newline at end of file diff --git a/Galleries/20251106_2237_Lea Lexis_Riley Reid_Petite_Riley_Reid___busty_Lea_Lexis_tease_with_tits___flash_hot_panty_upskirts/metadata.json b/Galleries/20251106_2237_Lea Lexis_Riley Reid_Petite_Riley_Reid___busty_Lea_Lexis_tease_with_tits___flash_hot_panty_upskirts/metadata.json new file mode 100644 index 0000000..966f84d --- /dev/null +++ b/Galleries/20251106_2237_Lea Lexis_Riley Reid_Petite_Riley_Reid___busty_Lea_Lexis_tease_with_tits___flash_hot_panty_upskirts/metadata.json @@ -0,0 +1,93 @@ +{ + "id": "20251106_2237", + "title": "Petite Riley Reid & busty Lea Lexis tease with tits & flash hot panty upskirts", + "models": [ + "Lea Lexis", + "Riley Reid" + ], + "categories": [ + "Panties", + "Upskirt", + "Sexy", + "Ass", + "Lesbian", + "Reality", + "Dress", + "Clothed", + "Natural Tits", + "Hairy", + "Romanian", + "Summer Dress", + "Hairy Armpits", + "Upskirt Panties", + "Tight Dress", + "Hairy Brunette", + "Hairy Panties" + ], + "tags": [ + "Ass", + "Big Tits", + "Brunette", + "Busty", + "Dress", + "Hairy", + "Hairy Armpits", + "Hairy Brunette", + "Hairy Panties", + "Lesbian", + "Natural", + "Natural Look", + "Panties", + "Petite", + "Romanian", + "Summer Dress", + "Tight Dress", + "Upskirt Panties" + ], + "source": { + "network": "PornPics", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/54/89239818/89239818_002_2f55.jpg", + "https://cdni.pornpics.com/1280/7/54/89239818/89239818_005_a701.jpg", + "https://cdni.pornpics.com/1280/7/54/89239818/89239818_007_bcff.jpg", + "https://cdni.pornpics.com/1280/7/54/89239818/89239818_010_5544.jpg", + "https://cdni.pornpics.com/1280/7/54/89239818/89239818_014_8cd7.jpg", + "https://cdni.pornpics.com/1280/7/54/89239818/89239818_018_8a7a.jpg", + "https://cdni.pornpics.com/1280/7/54/89239818/89239818_021_b42d.jpg", + "https://cdni.pornpics.com/1280/7/54/89239818/89239818_023_99f5.jpg", + "https://cdni.pornpics.com/1280/7/54/89239818/89239818_027_5ea7.jpg", + "https://cdni.pornpics.com/1280/7/54/89239818/89239818_029_cc0d.jpg", + "https://cdni.pornpics.com/1280/7/54/89239818/89239818_031_4fa7.jpg", + "https://cdni.pornpics.com/1280/7/54/89239818/89239818_033_94df.jpg", + "https://cdni.pornpics.com/1280/7/54/89239818/89239818_035_2392.jpg", + "https://cdni.pornpics.com/1280/7/54/89239818/89239818_037_3874.jpg", + "https://cdni.pornpics.com/1280/7/54/89239818/89239818_039_8ab2.jpg", + "https://cdni.pornpics.com/1280/7/54/89239818/89239818_042_1340.jpg", + "https://cdni.pornpics.com/1280/7/54/89239818/89239818_043_28a5.jpg", + "https://cdni.pornpics.com/1280/7/54/89239818/89239818_045_045c.jpg", + "https://cdni.pornpics.com/1280/7/54/89239818/89239818_047_5ecb.jpg", + "https://cdni.pornpics.com/1280/7/54/89239818/89239818_050_f980.jpg" + ], + "image_count": 20, + "date_scraped": "2025-11-06T22:37:58.188655+00:00", + "source_url": "https://www.pornpics.com/galleries/petite-riley-reid-busty-lea-lexis-tease-with-tits-flash-hot-panty-upskirts-89239818/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2237_Lea Lexis_Riley Reid_Petite_Riley_Reid___busty_Lea_Lexis_tease_with_tits___flash_hot_panty_upskirts", + "inferred_tags": [ + "Ass", + "Big Tits", + "Brunette", + "Busty", + "Dress", + "Hairy", + "Lesbian", + "Natural", + "Natural Look", + "Panties", + "Petite" + ] +} \ No newline at end of file diff --git a/Galleries/20251106_2237_Mike Adriano_Riley Reid_Tiny_brunette_Riley_Reid_shows_her_sexy_holes_and_fucks_a_huge_dick_in_POV/metadata.json b/Galleries/20251106_2237_Mike Adriano_Riley Reid_Tiny_brunette_Riley_Reid_shows_her_sexy_holes_and_fucks_a_huge_dick_in_POV/metadata.json new file mode 100644 index 0000000..cf67241 --- /dev/null +++ b/Galleries/20251106_2237_Mike Adriano_Riley Reid_Tiny_brunette_Riley_Reid_shows_her_sexy_holes_and_fucks_a_huge_dick_in_POV/metadata.json @@ -0,0 +1,104 @@ +{ + "id": "20251106_2237", + "title": "Tiny brunette Riley Reid shows her sexy holes and fucks a huge dick in POV", + "models": [ + "Mike Adriano", + "Riley Reid" + ], + "categories": [ + "Pussy", + "Hardcore", + "Asshole", + "Perfect", + "MILF", + "Hairy", + "Amateur", + "Tiny Tits", + "Ass", + "Doggy Style", + "Pussy Spreading", + "Pussy Fuck", + "Skinny Girl Fat Pussy", + "MILF Fuck", + "Hairy Asshole", + "Gaping Pussy", + "Hairy Pussy Fuck", + "Hairy MILF Fuck" + ], + "tags": [ + "Amateur", + "Ass", + "Big Tits", + "Brunette", + "Doggystyle", + "Fucking", + "Gaping Pussy", + "Hairy", + "Hairy Asshole", + "Hairy MILF Fuck", + "Hairy Pussy Fuck", + "Hardcore", + "MILF", + "MILF Fuck", + "Mature", + "POV", + "Perfect", + "Perfect Body", + "Pussy", + "Pussy Fuck", + "Pussy Spreading", + "Skinny", + "Skinny Girl Fat Pussy" + ], + "source": { + "network": "Amateur Europe", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/433/56734787/56734787_020_9b4d.jpg", + "https://cdni.pornpics.com/1280/7/433/56734787/56734787_031_b7c3.jpg", + "https://cdni.pornpics.com/1280/7/433/56734787/56734787_047_b65a.jpg", + "https://cdni.pornpics.com/1280/7/433/56734787/56734787_070_75b2.jpg", + "https://cdni.pornpics.com/1280/7/433/56734787/56734787_099_4f96.jpg", + "https://cdni.pornpics.com/1280/7/433/56734787/56734787_126_bfbe.jpg", + "https://cdni.pornpics.com/1280/7/433/56734787/56734787_148_754b.jpg", + "https://cdni.pornpics.com/1280/7/433/56734787/56734787_157_5e4c.jpg", + "https://cdni.pornpics.com/1280/7/433/56734787/56734787_185_dd3c.jpg", + "https://cdni.pornpics.com/1280/7/433/56734787/56734787_204_3b33.jpg", + "https://cdni.pornpics.com/1280/7/433/56734787/56734787_223_dc40.jpg", + "https://cdni.pornpics.com/1280/7/433/56734787/56734787_240_0910.jpg", + "https://cdni.pornpics.com/1280/7/433/56734787/56734787_258_21ad.jpg", + "https://cdni.pornpics.com/1280/7/433/56734787/56734787_272_caa6.jpg", + "https://cdni.pornpics.com/1280/7/433/56734787/56734787_287_08ee.jpg", + "https://cdni.pornpics.com/1280/7/433/56734787/56734787_325_8a21.jpg", + "https://cdni.pornpics.com/1280/7/433/56734787/56734787_331_fe5f.jpg", + "https://cdni.pornpics.com/1280/7/433/56734787/56734787_364_fa51.jpg", + "https://cdni.pornpics.com/1280/7/433/56734787/56734787_372_b912.jpg", + "https://cdni.pornpics.com/1280/7/433/56734787/56734787_400_aee8.jpg", + "https://cdni.pornpics.com/1280/7/433/56734787/56734787_414_0d67.jpg" + ], + "image_count": 21, + "date_scraped": "2025-11-06T22:37:44.327840+00:00", + "source_url": "https://www.pornpics.com/galleries/tiny-brunette-riley-reid-shows-her-sexy-holes-and-fucks-a-huge-dick-in-pov-56734787/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2237_Mike Adriano_Riley Reid_Tiny_brunette_Riley_Reid_shows_her_sexy_holes_and_fucks_a_huge_dick_in_POV", + "inferred_tags": [ + "Amateur", + "Ass", + "Big Tits", + "Brunette", + "Doggystyle", + "Fucking", + "Hairy", + "Hardcore", + "MILF", + "Mature", + "POV", + "Perfect", + "Perfect Body", + "Pussy", + "Skinny" + ] +} \ No newline at end of file diff --git a/Galleries/20251106_2237_Preston Parker_Riley Reid_Petite_babysitter_Riley_Reid_enjoys_a_cheating_husband_s_big_dick/metadata.json b/Galleries/20251106_2237_Preston Parker_Riley Reid_Petite_babysitter_Riley_Reid_enjoys_a_cheating_husband_s_big_dick/metadata.json new file mode 100644 index 0000000..16d2a56 --- /dev/null +++ b/Galleries/20251106_2237_Preston Parker_Riley Reid_Petite_babysitter_Riley_Reid_enjoys_a_cheating_husband_s_big_dick/metadata.json @@ -0,0 +1,95 @@ +{ + "id": "20251106_2237", + "title": "Petite babysitter Riley Reid enjoys a cheating husband's big dick", + "models": [ + "Preston Parker", + "Riley Reid" + ], + "categories": [ + "Skirt", + "Dress", + "Babysitter", + "Clothed", + "Hardcore", + "Blowjob", + "Pussy", + "High Heels", + "Tiny Tits", + "Lingerie", + "Summer Dress", + "Beautiful Blowjob", + "Sexy Blowjob", + "Short Skirt High Heels", + "Underwear", + "Tight Dress", + "High Heels Fuck", + "Pussy Fuck" + ], + "tags": [ + "Beautiful", + "Beautiful Blowjob", + "Big Tits", + "Blowjob", + "Dress", + "Fucking", + "Hardcore", + "High Heels", + "High Heels Fuck", + "Lingerie", + "Petite", + "Pussy", + "Pussy Fuck", + "Sexy Blowjob", + "Short Skirt High Heels", + "Skirt", + "Summer Dress", + "Tight Dress", + "Underwear" + ], + "source": { + "network": "PornPics", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/277/90908574/90908574_005_e834.jpg", + "https://cdni.pornpics.com/1280/7/277/90908574/90908574_034_16f7.jpg", + "https://cdni.pornpics.com/1280/7/277/90908574/90908574_057_da13.jpg", + "https://cdni.pornpics.com/1280/7/277/90908574/90908574_083_fe33.jpg", + "https://cdni.pornpics.com/1280/7/277/90908574/90908574_116_9b68.jpg", + "https://cdni.pornpics.com/1280/7/277/90908574/90908574_134_4a4c.jpg", + "https://cdni.pornpics.com/1280/7/277/90908574/90908574_164_1925.jpg", + "https://cdni.pornpics.com/1280/7/277/90908574/90908574_177_1d52.jpg", + "https://cdni.pornpics.com/1280/7/277/90908574/90908574_194_4738.jpg", + "https://cdni.pornpics.com/1280/7/277/90908574/90908574_230_1fc8.jpg", + "https://cdni.pornpics.com/1280/7/277/90908574/90908574_253_35da.jpg", + "https://cdni.pornpics.com/1280/7/277/90908574/90908574_271_0ed1.jpg", + "https://cdni.pornpics.com/1280/7/277/90908574/90908574_305_b66e.jpg", + "https://cdni.pornpics.com/1280/7/277/90908574/90908574_321_5e0a.jpg", + "https://cdni.pornpics.com/1280/7/277/90908574/90908574_340_e441.jpg", + "https://cdni.pornpics.com/1280/7/277/90908574/90908574_362_4211.jpg", + "https://cdni.pornpics.com/1280/7/277/90908574/90908574_391_798b.jpg", + "https://cdni.pornpics.com/1280/7/277/90908574/90908574_424_7ea7.jpg", + "https://cdni.pornpics.com/1280/7/277/90908574/90908574_447_82dc.jpg", + "https://cdni.pornpics.com/1280/7/277/90908574/90908574_449_1303.jpg" + ], + "image_count": 20, + "date_scraped": "2025-11-06T22:37:36.547337+00:00", + "source_url": "https://www.pornpics.com/galleries/petite-babysitter-riley-reid-enjoys-a-cheating-husbands-big-dick-90908574/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2237_Preston Parker_Riley Reid_Petite_babysitter_Riley_Reid_enjoys_a_cheating_husband_s_big_dick", + "inferred_tags": [ + "Beautiful", + "Big Tits", + "Blowjob", + "Dress", + "Fucking", + "Hardcore", + "High Heels", + "Lingerie", + "Petite", + "Pussy", + "Skirt" + ] +} \ No newline at end of file diff --git a/Galleries/20251106_2237_Riley Reid_Mr_POV_featuring_Riley_Reid_Nude_Photos/metadata.json b/Galleries/20251106_2237_Riley Reid_Mr_POV_featuring_Riley_Reid_Nude_Photos/metadata.json new file mode 100644 index 0000000..d8ec29e --- /dev/null +++ b/Galleries/20251106_2237_Riley Reid_Mr_POV_featuring_Riley_Reid_Nude_Photos/metadata.json @@ -0,0 +1,78 @@ +{ + "id": "20251106_2237", + "title": "Mr POV featuring Riley Reid Nude Photos", + "models": [ + "Riley Reid" + ], + "categories": [ + "Blowjob", + "Cum On Face", + "Facial", + "Family", + "Feet", + "Handjob", + "POV", + "POV Handjob", + "Petite", + "Petite Facial", + "Pussy", + "Reality", + "Spreading" + ], + "tags": [ + "Blowjob", + "Cum On Face", + "Cumshot", + "Facial", + "Handjob", + "POV", + "POV Handjob", + "Petite", + "Petite Facial", + "Pussy" + ], + "source": { + "network": "PornPics", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/813/58732399/58732399_006_de48.jpg", + "https://cdni.pornpics.com/1280/7/813/58732399/58732399_011_4123.jpg", + "https://cdni.pornpics.com/1280/7/813/58732399/58732399_017_c831.jpg", + "https://cdni.pornpics.com/1280/7/813/58732399/58732399_026_1280.jpg", + "https://cdni.pornpics.com/1280/7/813/58732399/58732399_032_9df3.jpg", + "https://cdni.pornpics.com/1280/7/813/58732399/58732399_039_5e55.jpg", + "https://cdni.pornpics.com/1280/7/813/58732399/58732399_045_710e.jpg", + "https://cdni.pornpics.com/1280/7/813/58732399/58732399_055_05a8.jpg", + "https://cdni.pornpics.com/1280/7/813/58732399/58732399_059_2b01.jpg", + "https://cdni.pornpics.com/1280/7/813/58732399/58732399_069_27ad.jpg", + "https://cdni.pornpics.com/1280/7/813/58732399/58732399_076_eed7.jpg", + "https://cdni.pornpics.com/1280/7/813/58732399/58732399_079_b476.jpg", + "https://cdni.pornpics.com/1280/7/813/58732399/58732399_090_a1f1.jpg", + "https://cdni.pornpics.com/1280/7/813/58732399/58732399_095_c3c5.jpg", + "https://cdni.pornpics.com/1280/7/813/58732399/58732399_104_cba0.jpg", + "https://cdni.pornpics.com/1280/7/813/58732399/58732399_109_3974.jpg", + "https://cdni.pornpics.com/1280/7/813/58732399/58732399_114_605b.jpg", + "https://cdni.pornpics.com/1280/7/813/58732399/58732399_121_ea4a.jpg", + "https://cdni.pornpics.com/1280/7/813/58732399/58732399_123_bcdb.jpg", + "https://cdni.pornpics.com/1280/7/813/58732399/58732399_125_9073.jpg", + "https://cdni.pornpics.com/1280/7/813/58732399/58732399_134_1d3e.jpg" + ], + "image_count": 21, + "date_scraped": "2025-11-06T22:37:48.823848+00:00", + "source_url": "https://www.pornpics.com/galleries/mr-pov-featuring-riley-reid-nude-photos-58732399/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2237_Riley Reid_Mr_POV_featuring_Riley_Reid_Nude_Photos", + "last_refreshed": "2025-11-06T22:57:58.301040+00:00", + "inferred_tags": [ + "Blowjob", + "Cumshot", + "Facial", + "Handjob", + "POV", + "Petite", + "Pussy" + ] +} \ No newline at end of file diff --git a/Galleries/20251106_2237_Riley Reid_Mr_POV_featuring_Riley_Reid_Nude_Photos/metadata_update_log.json b/Galleries/20251106_2237_Riley Reid_Mr_POV_featuring_Riley_Reid_Nude_Photos/metadata_update_log.json new file mode 100644 index 0000000..9c709de --- /dev/null +++ b/Galleries/20251106_2237_Riley Reid_Mr_POV_featuring_Riley_Reid_Nude_Photos/metadata_update_log.json @@ -0,0 +1,7 @@ +{ + "timestamp": "2025-11-06T22:57:58.301158+00:00", + "changes": { + "categories": "merged", + "source": "updated" + } +} diff --git a/Galleries/20251106_2237_Riley Reid_Mr_POV_starring_Riley_Reid_Naked_Images/metadata.json b/Galleries/20251106_2237_Riley Reid_Mr_POV_starring_Riley_Reid_Naked_Images/metadata.json new file mode 100644 index 0000000..73a8486 --- /dev/null +++ b/Galleries/20251106_2237_Riley Reid_Mr_POV_starring_Riley_Reid_Naked_Images/metadata.json @@ -0,0 +1,75 @@ +{ + "id": "20251106_2237", + "title": "Mr POV starring Riley Reid Naked Images", + "models": [ + "Riley Reid" + ], + "categories": [ + "POV", + "Petite", + "Handjob", + "Glasses", + "Reality", + "Outdoor", + "Non Nude", + "Cumshot", + "Pornstar", + "Brunette", + "POV Handjob", + "Money" + ], + "tags": [ + "Brunette", + "Cumshot", + "Handjob", + "Money", + "Outdoor", + "POV", + "POV Handjob", + "Petite", + "Pornstar" + ], + "source": { + "network": "PornPics", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/812/39106284/39106284_007_65d0.jpg", + "https://cdni.pornpics.com/1280/7/812/39106284/39106284_015_6fcb.jpg", + "https://cdni.pornpics.com/1280/7/812/39106284/39106284_019_418a.jpg", + "https://cdni.pornpics.com/1280/7/812/39106284/39106284_029_e81d.jpg", + "https://cdni.pornpics.com/1280/7/812/39106284/39106284_042_e5e1.jpg", + "https://cdni.pornpics.com/1280/7/812/39106284/39106284_046_e962.jpg", + "https://cdni.pornpics.com/1280/7/812/39106284/39106284_058_c185.jpg", + "https://cdni.pornpics.com/1280/7/812/39106284/39106284_065_f96e.jpg", + "https://cdni.pornpics.com/1280/7/812/39106284/39106284_073_4e66.jpg", + "https://cdni.pornpics.com/1280/7/812/39106284/39106284_076_f2b6.jpg", + "https://cdni.pornpics.com/1280/7/812/39106284/39106284_081_f5d7.jpg", + "https://cdni.pornpics.com/1280/7/812/39106284/39106284_090_f2a5.jpg", + "https://cdni.pornpics.com/1280/7/812/39106284/39106284_095_d2fc.jpg", + "https://cdni.pornpics.com/1280/7/812/39106284/39106284_107_0fcb.jpg", + "https://cdni.pornpics.com/1280/7/812/39106284/39106284_118_f8ce.jpg", + "https://cdni.pornpics.com/1280/7/812/39106284/39106284_121_8ab1.jpg", + "https://cdni.pornpics.com/1280/7/812/39106284/39106284_131_ae49.jpg", + "https://cdni.pornpics.com/1280/7/812/39106284/39106284_135_22a6.jpg", + "https://cdni.pornpics.com/1280/7/812/39106284/39106284_150_8e01.jpg", + "https://cdni.pornpics.com/1280/7/812/39106284/39106284_151_6349.jpg", + "https://cdni.pornpics.com/1280/7/812/39106284/39106284_162_d06d.jpg" + ], + "image_count": 21, + "date_scraped": "2025-11-06T22:37:09.633343+00:00", + "source_url": "https://www.pornpics.com/galleries/mr-pov-starring-riley-reid-naked-images-39106284/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2237_Riley Reid_Mr_POV_starring_Riley_Reid_Naked_Images", + "inferred_tags": [ + "Brunette", + "Cumshot", + "Handjob", + "Outdoor", + "POV", + "Petite", + "Pornstar" + ] +} \ No newline at end of file diff --git a/Galleries/20251106_2237_Riley Reid_Nerdy_American_schoolgirl_with_tiny_tits_Riley_Reid_showing_off/metadata.json b/Galleries/20251106_2237_Riley Reid_Nerdy_American_schoolgirl_with_tiny_tits_Riley_Reid_showing_off/metadata.json new file mode 100644 index 0000000..da8350b --- /dev/null +++ b/Galleries/20251106_2237_Riley Reid_Nerdy_American_schoolgirl_with_tiny_tits_Riley_Reid_showing_off/metadata.json @@ -0,0 +1,73 @@ +{ + "id": "20251106_2237", + "title": "Nerdy American schoolgirl with tiny tits Riley Reid showing off", + "models": [ + "Riley Reid" + ], + "categories": [ + "Schoolgirl", + "College", + "Brunette", + "Glasses", + "Pussy", + "Big Clit", + "Spreading", + "Classroom", + "College Pussy", + "School Uniform" + ], + "tags": [ + "Big Tits", + "Brunette", + "Classroom", + "College Pussy", + "English", + "Pussy", + "School Uniform", + "Uniform", + "Uniform Fetish" + ], + "source": { + "network": "PornPics", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/292/24451045/24451045_006_f6c4.jpg", + "https://cdni.pornpics.com/1280/7/292/24451045/24451045_022_83dd.jpg", + "https://cdni.pornpics.com/1280/7/292/24451045/24451045_029_aa7c.jpg", + "https://cdni.pornpics.com/1280/7/292/24451045/24451045_048_7ef1.jpg", + "https://cdni.pornpics.com/1280/7/292/24451045/24451045_053_1acc.jpg", + "https://cdni.pornpics.com/1280/7/292/24451045/24451045_058_f385.jpg", + "https://cdni.pornpics.com/1280/7/292/24451045/24451045_067_0f03.jpg", + "https://cdni.pornpics.com/1280/7/292/24451045/24451045_084_246b.jpg", + "https://cdni.pornpics.com/1280/7/292/24451045/24451045_103_389d.jpg", + "https://cdni.pornpics.com/1280/7/292/24451045/24451045_106_8469.jpg", + "https://cdni.pornpics.com/1280/7/292/24451045/24451045_130_d3a1.jpg", + "https://cdni.pornpics.com/1280/7/292/24451045/24451045_132_a567.jpg", + "https://cdni.pornpics.com/1280/7/292/24451045/24451045_146_e23a.jpg", + "https://cdni.pornpics.com/1280/7/292/24451045/24451045_165_5d01.jpg", + "https://cdni.pornpics.com/1280/7/292/24451045/24451045_180_c999.jpg", + "https://cdni.pornpics.com/1280/7/292/24451045/24451045_192_c835.jpg", + "https://cdni.pornpics.com/1280/7/292/24451045/24451045_200_fb60.jpg", + "https://cdni.pornpics.com/1280/7/292/24451045/24451045_215_903a.jpg", + "https://cdni.pornpics.com/1280/7/292/24451045/24451045_230_8499.jpg", + "https://cdni.pornpics.com/1280/7/292/24451045/24451045_244_3fe1.jpg", + "https://cdni.pornpics.com/1280/7/292/24451045/24451045_261_68f5.jpg" + ], + "image_count": 21, + "date_scraped": "2025-11-06T22:37:20.020823+00:00", + "source_url": "https://www.pornpics.com/galleries/nerdy-american-schoolgirl-with-tiny-tits-riley-reid-showing-off-24451045/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2237_Riley Reid_Nerdy_American_schoolgirl_with_tiny_tits_Riley_Reid_showing_off", + "inferred_tags": [ + "Big Tits", + "Brunette", + "English", + "Fetish", + "Pussy", + "Uniform", + "Uniform Fetish" + ] +} \ No newline at end of file diff --git a/Galleries/20251106_2237_Riley Reid_Petite_female_Riley_Reid_rips_off_her_prison_jumper_to_model_in_the_nude/metadata.json b/Galleries/20251106_2237_Riley Reid_Petite_female_Riley_Reid_rips_off_her_prison_jumper_to_model_in_the_nude/metadata.json new file mode 100644 index 0000000..8b63067 --- /dev/null +++ b/Galleries/20251106_2237_Riley Reid_Petite_female_Riley_Reid_rips_off_her_prison_jumper_to_model_in_the_nude/metadata.json @@ -0,0 +1,80 @@ +{ + "id": "20251106_2237", + "title": "Petite female Riley Reid rips off her prison jumper to model in the nude", + "models": [ + "Riley Reid" + ], + "categories": [ + "Pornstar", + "Mature", + "Undressing", + "Pussy", + "Brunette", + "Spreading", + "Short Hair", + "Legs", + "Older Women", + "Mature Older Women", + "Sexy Older Women", + "Beautiful Mature", + "Over 50", + "Mature Pussy", + "Mature Undressing", + "Mature Spreading" + ], + "tags": [ + "Beautiful", + "Beautiful Mature", + "Brunette", + "Mature", + "Mature Older Women", + "Mature Pussy", + "Mature Spreading", + "Mature Undressing", + "Model", + "Older Women", + "Over 50", + "Petite", + "Pornstar", + "Pussy", + "Sexy Older Women" + ], + "source": { + "network": "PornPics", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/41/12420368/12420368_004_b0f6.jpg", + "https://cdni.pornpics.com/1280/7/41/12420368/12420368_008_ec67.jpg", + "https://cdni.pornpics.com/1280/7/41/12420368/12420368_017_7c72.jpg", + "https://cdni.pornpics.com/1280/7/41/12420368/12420368_021_345b.jpg", + "https://cdni.pornpics.com/1280/7/41/12420368/12420368_028_7fe7.jpg", + "https://cdni.pornpics.com/1280/7/41/12420368/12420368_035_1f6c.jpg", + "https://cdni.pornpics.com/1280/7/41/12420368/12420368_041_3c6b.jpg", + "https://cdni.pornpics.com/1280/7/41/12420368/12420368_045_c794.jpg", + "https://cdni.pornpics.com/1280/7/41/12420368/12420368_055_09ce.jpg", + "https://cdni.pornpics.com/1280/7/41/12420368/12420368_059_b117.jpg", + "https://cdni.pornpics.com/1280/7/41/12420368/12420368_062_fbf2.jpg", + "https://cdni.pornpics.com/1280/7/41/12420368/12420368_069_de43.jpg", + "https://cdni.pornpics.com/1280/7/41/12420368/12420368_074_79ab.jpg", + "https://cdni.pornpics.com/1280/7/41/12420368/12420368_083_3d4e.jpg", + "https://cdni.pornpics.com/1280/7/41/12420368/12420368_088_63db.jpg", + "https://cdni.pornpics.com/1280/7/41/12420368/12420368_095_32b2.jpg" + ], + "image_count": 16, + "date_scraped": "2025-11-06T22:37:24.611918+00:00", + "source_url": "https://www.pornpics.com/galleries/petite-female-riley-reid-rips-off-her-prison-jumper-to-model-in-the-nude-12420368/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2237_Riley Reid_Petite_female_Riley_Reid_rips_off_her_prison_jumper_to_model_in_the_nude", + "inferred_tags": [ + "Beautiful", + "Brunette", + "Mature", + "Model", + "Petite", + "Pornstar", + "Pussy" + ] +} \ No newline at end of file diff --git a/Galleries/20251106_2237_Riley Reid_Smiley_teenage_hottie_with_tattoos_revealing_her_perky_titties_and_neat_ass/metadata.json b/Galleries/20251106_2237_Riley Reid_Smiley_teenage_hottie_with_tattoos_revealing_her_perky_titties_and_neat_ass/metadata.json new file mode 100644 index 0000000..40fe97c --- /dev/null +++ b/Galleries/20251106_2237_Riley Reid_Smiley_teenage_hottie_with_tattoos_revealing_her_perky_titties_and_neat_ass/metadata.json @@ -0,0 +1,84 @@ +{ + "id": "20251106_2237", + "title": "Smiley teenage hottie with tattoos revealing her perky titties and neat ass", + "models": [ + "Riley Reid" + ], + "categories": [ + "Pussy", + "Face", + "Hairy", + "Teen", + "Brunette", + "Babe", + "Ass", + "Tattoo", + "Natural Tits", + "Clothed", + "Hairy Teen Pussy", + "Brunette Hairy Pussy", + "Hot Naked Women", + "Tight Ass", + "Hairy Erotica", + "Cute Face", + "Brunette Ass", + "Cute Hairy" + ], + "tags": [ + "Ass", + "Big Tits", + "Brunette", + "Brunette Ass", + "Brunette Hairy Pussy", + "Cute Face", + "Cute Hairy", + "Hairy", + "Hairy Erotica", + "Hairy Teen Pussy", + "Hot Naked Women", + "Natural", + "Natural Look", + "Pussy", + "Teen", + "Tight Ass" + ], + "source": { + "network": "PornPics", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/5/102/63010314/63010314_001_5b3e.jpg", + "https://cdni.pornpics.com/1280/5/102/63010314/63010314_002_458a.jpg", + "https://cdni.pornpics.com/1280/5/102/63010314/63010314_003_12e1.jpg", + "https://cdni.pornpics.com/1280/5/102/63010314/63010314_004_6823.jpg", + "https://cdni.pornpics.com/1280/5/102/63010314/63010314_005_035b.jpg", + "https://cdni.pornpics.com/1280/5/102/63010314/63010314_006_b8ff.jpg", + "https://cdni.pornpics.com/1280/5/102/63010314/63010314_007_3f6f.jpg", + "https://cdni.pornpics.com/1280/5/102/63010314/63010314_008_8a46.jpg", + "https://cdni.pornpics.com/1280/5/102/63010314/63010314_009_33f7.jpg", + "https://cdni.pornpics.com/1280/5/102/63010314/63010314_010_382c.jpg", + "https://cdni.pornpics.com/1280/5/102/63010314/63010314_011_b2de.jpg", + "https://cdni.pornpics.com/1280/5/102/63010314/63010314_012_b2de.jpg", + "https://cdni.pornpics.com/1280/5/102/63010314/63010314_013_ffb5.jpg", + "https://cdni.pornpics.com/1280/5/102/63010314/63010314_014_90d4.jpg", + "https://cdni.pornpics.com/1280/5/102/63010314/63010314_015_3fcf.jpg", + "https://cdni.pornpics.com/1280/5/102/63010314/63010314_016_f5c6.jpg" + ], + "image_count": 16, + "date_scraped": "2025-11-06T22:37:14.542771+00:00", + "source_url": "https://www.pornpics.com/galleries/smiley-teenage-hottie-with-tattoos-revealing-her-perky-titties-and-neat-ass-63010314/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2237_Riley Reid_Smiley_teenage_hottie_with_tattoos_revealing_her_perky_titties_and_neat_ass", + "inferred_tags": [ + "Ass", + "Big Tits", + "Brunette", + "Hairy", + "Natural", + "Natural Look", + "Pussy", + "Teen" + ] +} \ No newline at end of file diff --git a/Galleries/20251106_2237_Riley Reid_Xavier Miller_Kinky_nympho_Riley_Reid_hikes_up_her_red_dress_and_gets_blacked_hardcore/metadata.json b/Galleries/20251106_2237_Riley Reid_Xavier Miller_Kinky_nympho_Riley_Reid_hikes_up_her_red_dress_and_gets_blacked_hardcore/metadata.json new file mode 100644 index 0000000..424df14 --- /dev/null +++ b/Galleries/20251106_2237_Riley Reid_Xavier Miller_Kinky_nympho_Riley_Reid_hikes_up_her_red_dress_and_gets_blacked_hardcore/metadata.json @@ -0,0 +1,93 @@ +{ + "id": "20251106_2237", + "title": "Kinky nympho Riley Reid hikes up her red dress and gets blacked hardcore", + "models": [ + "Riley Reid", + "Xavier Miller" + ], + "categories": [ + "Interracial", + "Caught", + "Reality", + "Hardcore", + "BBC", + "Big Cock", + "Ass", + "Pornstar", + "Tattoo", + "Upskirt", + "Skinny Interracial", + "Big Black Cock", + "Upskirt No Panties", + "Skinny BBC", + "Caught Masturbating", + "Monster Cock", + "Skinny Small Tits", + "Dick" + ], + "tags": [ + "Ass", + "BBC", + "Big Black Cock", + "Big Cock", + "Big Tits", + "Caught Masturbating", + "Dick", + "Dress", + "Hardcore", + "Interracial", + "Monster Cock", + "Panties", + "Pornstar", + "Skinny", + "Skinny BBC", + "Skinny Interracial", + "Skinny Small Tits", + "Upskirt No Panties" + ], + "source": { + "network": "Blacked", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/107/75565937/75565937_005_5103.jpg", + "https://cdni.pornpics.com/1280/7/107/75565937/75565937_013_be67.jpg", + "https://cdni.pornpics.com/1280/7/107/75565937/75565937_027_a7b2.jpg", + "https://cdni.pornpics.com/1280/7/107/75565937/75565937_037_a0d5.jpg", + "https://cdni.pornpics.com/1280/7/107/75565937/75565937_048_5e98.jpg", + "https://cdni.pornpics.com/1280/7/107/75565937/75565937_052_bc4b.jpg", + "https://cdni.pornpics.com/1280/7/107/75565937/75565937_068_e22e.jpg", + "https://cdni.pornpics.com/1280/7/107/75565937/75565937_071_6777.jpg", + "https://cdni.pornpics.com/1280/7/107/75565937/75565937_082_16c1.jpg", + "https://cdni.pornpics.com/1280/7/107/75565937/75565937_095_5ccf.jpg", + "https://cdni.pornpics.com/1280/7/107/75565937/75565937_105_7062.jpg", + "https://cdni.pornpics.com/1280/7/107/75565937/75565937_119_fb32.jpg", + "https://cdni.pornpics.com/1280/7/107/75565937/75565937_125_724c.jpg", + "https://cdni.pornpics.com/1280/7/107/75565937/75565937_140_4884.jpg", + "https://cdni.pornpics.com/1280/7/107/75565937/75565937_144_0aa4.jpg", + "https://cdni.pornpics.com/1280/7/107/75565937/75565937_151_34a5.jpg", + "https://cdni.pornpics.com/1280/7/107/75565937/75565937_170_7ca6.jpg", + "https://cdni.pornpics.com/1280/7/107/75565937/75565937_177_2541.jpg", + "https://cdni.pornpics.com/1280/7/107/75565937/75565937_182_aefd.jpg", + "https://cdni.pornpics.com/1280/7/107/75565937/75565937_196_cf6d.jpg" + ], + "image_count": 20, + "date_scraped": "2025-11-06T22:37:53.310419+00:00", + "source_url": "https://www.pornpics.com/galleries/kinky-nympho-riley-reid-hikes-up-her-red-dress-and-gets-blacked-hardcore-75565937/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2237_Riley Reid_Xavier Miller_Kinky_nympho_Riley_Reid_hikes_up_her_red_dress_and_gets_blacked_hardcore", + "inferred_tags": [ + "Ass", + "BBC", + "Big Cock", + "Big Tits", + "Dress", + "Hardcore", + "Interracial", + "Panties", + "Pornstar", + "Skinny" + ] +} \ No newline at end of file diff --git a/Galleries/20251106_2238_Damon Dice_Riley Reid_Petite_teen_girl_Riley_Reid_gives_her_guy_cake_and_a_fuck_for_his_birthday/metadata.json b/Galleries/20251106_2238_Damon Dice_Riley Reid_Petite_teen_girl_Riley_Reid_gives_her_guy_cake_and_a_fuck_for_his_birthday/metadata.json new file mode 100644 index 0000000..a9ce247 --- /dev/null +++ b/Galleries/20251106_2238_Damon Dice_Riley Reid_Petite_teen_girl_Riley_Reid_gives_her_guy_cake_and_a_fuck_for_his_birthday/metadata.json @@ -0,0 +1,89 @@ +{ + "id": "20251106_2238", + "title": "Petite teen girl Riley Reid gives her guy cake and a fuck for his birthday", + "models": [ + "Damon Dice", + "Riley Reid" + ], + "categories": [ + "Teen", + "Hardcore", + "Hairy", + "Pussy", + "Close Up", + "Ass", + "Handjob", + "Cowgirl", + "Spreading", + "Pussy Licking", + "Teen Handjob", + "Hairy Teen Spreading", + "Hairy Pussy Fuck", + "Brunette Teen", + "Juicy Pussy", + "Hairy Teen Pussy", + "Close Up Fuck", + "Meaty Pussy" + ], + "tags": [ + "Ass", + "Brunette", + "Brunette Teen", + "Close Up Fuck", + "Cowgirl", + "Fucking", + "Hairy", + "Hairy Pussy Fuck", + "Hairy Teen Pussy", + "Hairy Teen Spreading", + "Handjob", + "Hardcore", + "Juicy Pussy", + "Meaty Pussy", + "Petite", + "Pussy", + "Teen", + "Teen Handjob" + ], + "source": { + "network": "PornPics", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/1/173/43223033/43223033_001_e4e1.jpg", + "https://cdni.pornpics.com/1280/1/173/43223033/43223033_002_f711.jpg", + "https://cdni.pornpics.com/1280/1/173/43223033/43223033_003_7326.jpg", + "https://cdni.pornpics.com/1280/1/173/43223033/43223033_004_3a3b.jpg", + "https://cdni.pornpics.com/1280/1/173/43223033/43223033_005_6dc5.jpg", + "https://cdni.pornpics.com/1280/1/173/43223033/43223033_006_9390.jpg", + "https://cdni.pornpics.com/1280/1/173/43223033/43223033_007_c676.jpg", + "https://cdni.pornpics.com/1280/1/173/43223033/43223033_008_c676.jpg", + "https://cdni.pornpics.com/1280/1/173/43223033/43223033_009_6473.jpg", + "https://cdni.pornpics.com/1280/1/173/43223033/43223033_010_e5bd.jpg", + "https://cdni.pornpics.com/1280/1/173/43223033/43223033_011_54d3.jpg", + "https://cdni.pornpics.com/1280/1/173/43223033/43223033_012_d832.jpg", + "https://cdni.pornpics.com/1280/1/173/43223033/43223033_013_d832.jpg", + "https://cdni.pornpics.com/1280/1/173/43223033/43223033_014_c8a9.jpg", + "https://cdni.pornpics.com/1280/1/173/43223033/43223033_015_74fc.jpg", + "https://cdni.pornpics.com/1280/1/173/43223033/43223033_016_0b22.jpg" + ], + "image_count": 16, + "date_scraped": "2025-11-06T22:38:20.128109+00:00", + "source_url": "https://www.pornpics.com/galleries/petite-teen-girl-riley-reid-gives-her-guy-cake-and-a-fuck-for-his-birthday-43223033/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2238_Damon Dice_Riley Reid_Petite_teen_girl_Riley_Reid_gives_her_guy_cake_and_a_fuck_for_his_birthday", + "inferred_tags": [ + "Ass", + "Brunette", + "Cowgirl", + "Fucking", + "Hairy", + "Handjob", + "Hardcore", + "Petite", + "Pussy", + "Teen" + ] +} \ No newline at end of file diff --git a/Galleries/20251106_2238_Ramon Nomar_Riley Reid_Petite_babe_Riley_Reid_spreads_legs_for_her_lover___fucks_in_front_of_husband/metadata.json b/Galleries/20251106_2238_Ramon Nomar_Riley Reid_Petite_babe_Riley_Reid_spreads_legs_for_her_lover___fucks_in_front_of_husband/metadata.json new file mode 100644 index 0000000..e00a1f6 --- /dev/null +++ b/Galleries/20251106_2238_Ramon Nomar_Riley Reid_Petite_babe_Riley_Reid_spreads_legs_for_her_lover___fucks_in_front_of_husband/metadata.json @@ -0,0 +1,88 @@ +{ + "id": "20251106_2238", + "title": "Petite babe Riley Reid spreads legs for her lover & fucks in front of husband", + "models": [ + "Ramon Nomar", + "Riley Reid" + ], + "categories": [ + "Wife", + "Bikini", + "Cheating", + "Blowjob", + "MILF", + "Stockings", + "Petite", + "Feet", + "Pussy", + "Cowgirl", + "Cheating Wife", + "Wife Blowjob", + "Bikini Blowjob", + "Petite Stockings", + "Sexy MILF", + "All Over 40", + "MILF Stockings", + "MILF Bikini" + ], + "tags": [ + "All Over 40", + "Bikini Blowjob", + "Blowjob", + "Cheating Wife", + "Cowgirl", + "MILF", + "MILF Bikini", + "MILF Stockings", + "Mature", + "Petite", + "Petite Stockings", + "Pussy", + "Sexy MILF", + "Stockings", + "Wife Blowjob" + ], + "source": { + "network": "PornPics", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/44/51353894/51353894_002_7f7b.jpg", + "https://cdni.pornpics.com/1280/7/44/51353894/51353894_026_1096.jpg", + "https://cdni.pornpics.com/1280/7/44/51353894/51353894_039_b754.jpg", + "https://cdni.pornpics.com/1280/7/44/51353894/51353894_053_3d45.jpg", + "https://cdni.pornpics.com/1280/7/44/51353894/51353894_064_fb80.jpg", + "https://cdni.pornpics.com/1280/7/44/51353894/51353894_083_278e.jpg", + "https://cdni.pornpics.com/1280/7/44/51353894/51353894_085_4b8c.jpg", + "https://cdni.pornpics.com/1280/7/44/51353894/51353894_098_e866.jpg", + "https://cdni.pornpics.com/1280/7/44/51353894/51353894_119_da42.jpg", + "https://cdni.pornpics.com/1280/7/44/51353894/51353894_127_843f.jpg", + "https://cdni.pornpics.com/1280/7/44/51353894/51353894_151_93ba.jpg", + "https://cdni.pornpics.com/1280/7/44/51353894/51353894_155_530e.jpg", + "https://cdni.pornpics.com/1280/7/44/51353894/51353894_170_20d5.jpg", + "https://cdni.pornpics.com/1280/7/44/51353894/51353894_188_e5e1.jpg", + "https://cdni.pornpics.com/1280/7/44/51353894/51353894_208_7b58.jpg", + "https://cdni.pornpics.com/1280/7/44/51353894/51353894_217_980f.jpg", + "https://cdni.pornpics.com/1280/7/44/51353894/51353894_241_c563.jpg", + "https://cdni.pornpics.com/1280/7/44/51353894/51353894_247_d655.jpg", + "https://cdni.pornpics.com/1280/7/44/51353894/51353894_271_5042.jpg", + "https://cdni.pornpics.com/1280/7/44/51353894/51353894_279_775d.jpg", + "https://cdni.pornpics.com/1280/7/44/51353894/51353894_289_99e2.jpg" + ], + "image_count": 21, + "date_scraped": "2025-11-06T22:38:15.767635+00:00", + "source_url": "https://www.pornpics.com/galleries/petite-babe-riley-reid-spreads-legs-for-her-lover-fucks-in-front-of-husband-51353894/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2238_Ramon Nomar_Riley Reid_Petite_babe_Riley_Reid_spreads_legs_for_her_lover___fucks_in_front_of_husband", + "inferred_tags": [ + "Blowjob", + "Cowgirl", + "MILF", + "Mature", + "Petite", + "Pussy", + "Stockings" + ] +} \ No newline at end of file diff --git a/Galleries/20251106_2238_Riley Reid_Leggy_white_chick_Riley_Reid_strips_to_black_stockings_with_her_glasses_on/metadata.json b/Galleries/20251106_2238_Riley Reid_Leggy_white_chick_Riley_Reid_strips_to_black_stockings_with_her_glasses_on/metadata.json new file mode 100644 index 0000000..6bca0eb --- /dev/null +++ b/Galleries/20251106_2238_Riley Reid_Leggy_white_chick_Riley_Reid_strips_to_black_stockings_with_her_glasses_on/metadata.json @@ -0,0 +1,77 @@ +{ + "id": "20251106_2238", + "title": "Leggy white chick Riley Reid strips to black stockings with her glasses on", + "models": [ + "Riley Reid" + ], + "categories": [ + "Glasses", + "Uniform", + "Stockings", + "Office", + "Pornstar", + "Pussy", + "Short Hair", + "Spreading", + "Big Tits", + "Natural Tits", + "Stockings Spread" + ], + "tags": [ + "Big Tits", + "Natural", + "Natural Look", + "Office", + "Pornstar", + "Pussy", + "Stockings", + "Stockings Spread", + "Uniform", + "Uniform Fetish" + ], + "source": { + "network": "PornPics", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/40/56822993/56822993_003_f8d5.jpg", + "https://cdni.pornpics.com/1280/7/40/56822993/56822993_013_5b29.jpg", + "https://cdni.pornpics.com/1280/7/40/56822993/56822993_020_1951.jpg", + "https://cdni.pornpics.com/1280/7/40/56822993/56822993_021_b190.jpg", + "https://cdni.pornpics.com/1280/7/40/56822993/56822993_033_3599.jpg", + "https://cdni.pornpics.com/1280/7/40/56822993/56822993_041_bcbe.jpg", + "https://cdni.pornpics.com/1280/7/40/56822993/56822993_052_43c8.jpg", + "https://cdni.pornpics.com/1280/7/40/56822993/56822993_064_2fec.jpg", + "https://cdni.pornpics.com/1280/7/40/56822993/56822993_070_fe71.jpg", + "https://cdni.pornpics.com/1280/7/40/56822993/56822993_082_69a9.jpg", + "https://cdni.pornpics.com/1280/7/40/56822993/56822993_095_7596.jpg", + "https://cdni.pornpics.com/1280/7/40/56822993/56822993_099_b267.jpg", + "https://cdni.pornpics.com/1280/7/40/56822993/56822993_112_0a1d.jpg", + "https://cdni.pornpics.com/1280/7/40/56822993/56822993_123_186e.jpg", + "https://cdni.pornpics.com/1280/7/40/56822993/56822993_129_9ccd.jpg", + "https://cdni.pornpics.com/1280/7/40/56822993/56822993_138_8b8a.jpg", + "https://cdni.pornpics.com/1280/7/40/56822993/56822993_146_9f2f.jpg", + "https://cdni.pornpics.com/1280/7/40/56822993/56822993_158_84f5.jpg", + "https://cdni.pornpics.com/1280/7/40/56822993/56822993_167_8107.jpg", + "https://cdni.pornpics.com/1280/7/40/56822993/56822993_177_2bfb.jpg" + ], + "image_count": 20, + "date_scraped": "2025-11-06T22:38:03.922937+00:00", + "source_url": "https://www.pornpics.com/galleries/leggy-white-chick-riley-reid-strips-to-black-stockings-with-her-glasses-on-56822993/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2238_Riley Reid_Leggy_white_chick_Riley_Reid_strips_to_black_stockings_with_her_glasses_on", + "inferred_tags": [ + "Big Tits", + "Fetish", + "Natural", + "Natural Look", + "Office", + "Pornstar", + "Pussy", + "Stockings", + "Uniform", + "Uniform Fetish" + ] +} \ No newline at end of file diff --git a/Galleries/20251106_2258_Adriana Chechik_Aj Applegate_Anikka Albrite_Keisha Grey_Kleio Valentien_Riley Reid_Vicki Chase_Elegant_Angel_Adriana_Chechik__Aj_Applegate__Anikka_Albrite__Keisha_Grey__Kleio/metadata.json b/Galleries/20251106_2258_Adriana Chechik_Aj Applegate_Anikka Albrite_Keisha Grey_Kleio Valentien_Riley Reid_Vicki Chase_Elegant_Angel_Adriana_Chechik__Aj_Applegate__Anikka_Albrite__Keisha_Grey__Kleio/metadata.json new file mode 100644 index 0000000..c7f74f0 --- /dev/null +++ b/Galleries/20251106_2258_Adriana Chechik_Aj Applegate_Anikka Albrite_Keisha Grey_Kleio Valentien_Riley Reid_Vicki Chase_Elegant_Angel_Adriana_Chechik__Aj_Applegate__Anikka_Albrite__Keisha_Grey__Kleio/metadata.json @@ -0,0 +1,103 @@ +{ + "id": "20251106_2258", + "title": "Elegant Angel Adriana Chechik, Aj Applegate, Anikka Albrite, Keisha Grey, Kleio", + "models": [ + "Adriana Chechik", + "Aj Applegate", + "Anikka Albrite", + "Keisha Grey", + "Kleio Valentien", + "Riley Reid", + "Vicki Chase" + ], + "categories": [ + "Ass Fucking", + "Anal", + "Groupsex", + "Double Penetration", + "MILF", + "Doggy Style", + "Petite", + "Latina", + "Teen", + "Lingerie", + "MILF Anal", + "Doggystyle Anal", + "Latina Anal", + "Petite Anal", + "MILF DP", + "Sexy Anal", + "Interracial Anal", + "Teen Anal" + ], + "tags": [ + "Anal", + "Anal Fetish", + "Ass", + "Doggystyle", + "Doggystyle Anal", + "Fucking", + "Interracial", + "Interracial Anal", + "Latina Anal", + "Lingerie", + "MILF", + "MILF Anal", + "MILF DP", + "Mature", + "Penetration", + "Petite", + "Petite Anal", + "Sexy Anal", + "Teen", + "Teen Anal" + ], + "source": { + "network": "PornPics", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/620/85123161/85123161_001_bf0b.jpg", + "https://cdni.pornpics.com/1280/7/620/85123161/85123161_007_85cb.jpg", + "https://cdni.pornpics.com/1280/7/620/85123161/85123161_010_89d2.jpg", + "https://cdni.pornpics.com/1280/7/620/85123161/85123161_013_adb0.jpg", + "https://cdni.pornpics.com/1280/7/620/85123161/85123161_016_8635.jpg", + "https://cdni.pornpics.com/1280/7/620/85123161/85123161_018_cbfc.jpg", + "https://cdni.pornpics.com/1280/7/620/85123161/85123161_020_c2f1.jpg", + "https://cdni.pornpics.com/1280/7/620/85123161/85123161_024_6da9.jpg", + "https://cdni.pornpics.com/1280/7/620/85123161/85123161_026_4ad5.jpg", + "https://cdni.pornpics.com/1280/7/620/85123161/85123161_031_09eb.jpg", + "https://cdni.pornpics.com/1280/7/620/85123161/85123161_032_a2c5.jpg", + "https://cdni.pornpics.com/1280/7/620/85123161/85123161_036_4500.jpg", + "https://cdni.pornpics.com/1280/7/620/85123161/85123161_038_b79d.jpg", + "https://cdni.pornpics.com/1280/7/620/85123161/85123161_042_8ff3.jpg", + "https://cdni.pornpics.com/1280/7/620/85123161/85123161_044_bc81.jpg", + "https://cdni.pornpics.com/1280/7/620/85123161/85123161_047_e9b6.jpg", + "https://cdni.pornpics.com/1280/7/620/85123161/85123161_052_352d.jpg", + "https://cdni.pornpics.com/1280/7/620/85123161/85123161_053_e6d7.jpg", + "https://cdni.pornpics.com/1280/7/620/85123161/85123161_058_6355.jpg", + "https://cdni.pornpics.com/1280/7/620/85123161/85123161_060_75ff.jpg" + ], + "image_count": 20, + "date_scraped": "2025-11-06T22:58:04.155758+00:00", + "source_url": "https://www.pornpics.com/galleries/elegant-angel-adriana-chechik-aj-applegate-anikka-albrite-keisha-grey-kleio-85123161/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2258_Adriana Chechik_Aj Applegate_Anikka Albrite_Keisha Grey_Kleio Valentien_Riley Reid_Vicki Chase_Elegant_Angel_Adriana_Chechik__Aj_Applegate__Anikka_Albrite__Keisha_Grey__Kleio", + "inferred_tags": [ + "Anal", + "Anal Fetish", + "Ass", + "Doggystyle", + "Fetish", + "Fucking", + "Interracial", + "Lingerie", + "MILF", + "Mature", + "Penetration", + "Petite", + "Teen" + ] +} \ No newline at end of file diff --git a/Galleries/20251106_2258_Aubrey Kate_Riley Reid_Sebastian Keys_Sluts_Riley_Reid___Aubrey_Kate_show_off_their_big_butts___give_a_double_BJ/metadata.json b/Galleries/20251106_2258_Aubrey Kate_Riley Reid_Sebastian Keys_Sluts_Riley_Reid___Aubrey_Kate_show_off_their_big_butts___give_a_double_BJ/metadata.json new file mode 100644 index 0000000..d09397f --- /dev/null +++ b/Galleries/20251106_2258_Aubrey Kate_Riley Reid_Sebastian Keys_Sluts_Riley_Reid___Aubrey_Kate_show_off_their_big_butts___give_a_double_BJ/metadata.json @@ -0,0 +1,75 @@ +{ + "id": "20251106_2258", + "title": "Sluts Riley Reid & Aubrey Kate show off their big butts & give a double BJ", + "models": [ + "Aubrey Kate", + "Riley Reid", + "Sebastian Keys" + ], + "categories": [ + "Shemale", + "Shemale On Female", + "Shemale Fucks Girl", + "Shemale Threesome", + "Shemale Fucks Female", + "Shemale Pantyhose", + "Shemale Lesbian", + "Shemale Ass", + "Blonde Shemale" + ], + "tags": [ + "Ass", + "Blonde", + "Blonde Shemale", + "Blowjob", + "Lesbian", + "Shemale Ass", + "Shemale Fucks Female", + "Shemale Fucks Girl", + "Shemale Lesbian", + "Shemale On Female", + "Shemale Pantyhose", + "Shemale Threesome", + "Threesome" + ], + "source": { + "network": "PornPics", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/550/76348062/76348062_001_d411.jpg", + "https://cdni.pornpics.com/1280/7/550/76348062/76348062_003_308a.jpg", + "https://cdni.pornpics.com/1280/7/550/76348062/76348062_005_4650.jpg", + "https://cdni.pornpics.com/1280/7/550/76348062/76348062_007_5fa7.jpg", + "https://cdni.pornpics.com/1280/7/550/76348062/76348062_009_b70a.jpg", + "https://cdni.pornpics.com/1280/7/550/76348062/76348062_011_7af7.jpg", + "https://cdni.pornpics.com/1280/7/550/76348062/76348062_013_e7a1.jpg", + "https://cdni.pornpics.com/1280/7/550/76348062/76348062_015_ae2c.jpg", + "https://cdni.pornpics.com/1280/7/550/76348062/76348062_017_d1d7.jpg", + "https://cdni.pornpics.com/1280/7/550/76348062/76348062_020_d390.jpg", + "https://cdni.pornpics.com/1280/7/550/76348062/76348062_022_af6c.jpg", + "https://cdni.pornpics.com/1280/7/550/76348062/76348062_023_e19e.jpg", + "https://cdni.pornpics.com/1280/7/550/76348062/76348062_026_07cd.jpg", + "https://cdni.pornpics.com/1280/7/550/76348062/76348062_027_8090.jpg", + "https://cdni.pornpics.com/1280/7/550/76348062/76348062_030_a082.jpg", + "https://cdni.pornpics.com/1280/7/550/76348062/76348062_031_8624.jpg", + "https://cdni.pornpics.com/1280/7/550/76348062/76348062_033_ec88.jpg", + "https://cdni.pornpics.com/1280/7/550/76348062/76348062_036_7392.jpg", + "https://cdni.pornpics.com/1280/7/550/76348062/76348062_037_a4c6.jpg", + "https://cdni.pornpics.com/1280/7/550/76348062/76348062_038_dd29.jpg" + ], + "image_count": 20, + "date_scraped": "2025-11-06T22:58:13.317125+00:00", + "source_url": "https://www.pornpics.com/galleries/sluts-riley-reid-aubrey-kate-show-off-their-big-butts-give-a-double-bj-76348062/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2258_Aubrey Kate_Riley Reid_Sebastian Keys_Sluts_Riley_Reid___Aubrey_Kate_show_off_their_big_butts___give_a_double_BJ", + "inferred_tags": [ + "Ass", + "Blonde", + "Blowjob", + "Lesbian", + "Threesome" + ] +} \ No newline at end of file diff --git a/Galleries/20251106_2258_Erik Everhard_Riley Reid_Cheerleader_Riley_Reid_shows_her_tiny_tits_before_riding_a_pussy-wrecking_dick/metadata.json b/Galleries/20251106_2258_Erik Everhard_Riley Reid_Cheerleader_Riley_Reid_shows_her_tiny_tits_before_riding_a_pussy-wrecking_dick/metadata.json new file mode 100644 index 0000000..b4794e2 --- /dev/null +++ b/Galleries/20251106_2258_Erik Everhard_Riley Reid_Cheerleader_Riley_Reid_shows_her_tiny_tits_before_riding_a_pussy-wrecking_dick/metadata.json @@ -0,0 +1,86 @@ +{ + "id": "20251106_2258", + "title": "Cheerleader Riley Reid shows her tiny tits before riding a pussy-wrecking dick", + "models": [ + "Erik Everhard", + "Riley Reid" + ], + "categories": [ + "Hardcore", + "Cheerleader", + "Cowgirl", + "Schoolgirl", + "Blowjob", + "Pornstar", + "White", + "Pussy", + "Horny", + "Pussy Fuck", + "Sneakers", + "Slut", + "School Uniform" + ], + "tags": [ + "Big Tits", + "Blowjob", + "Cowgirl", + "Fucking", + "Hardcore", + "Horny", + "Pornstar", + "Pussy", + "Pussy Fuck", + "Riding", + "School Uniform", + "Slut", + "Sneakers", + "Uniform", + "Uniform Fetish" + ], + "source": { + "network": "PornPics", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/371/41471787/41471787_003_4edb.jpg", + "https://cdni.pornpics.com/1280/7/371/41471787/41471787_005_bcc2.jpg", + "https://cdni.pornpics.com/1280/7/371/41471787/41471787_009_4e16.jpg", + "https://cdni.pornpics.com/1280/7/371/41471787/41471787_011_994c.jpg", + "https://cdni.pornpics.com/1280/7/371/41471787/41471787_015_d8e0.jpg", + "https://cdni.pornpics.com/1280/7/371/41471787/41471787_018_a049.jpg", + "https://cdni.pornpics.com/1280/7/371/41471787/41471787_019_7ad3.jpg", + "https://cdni.pornpics.com/1280/7/371/41471787/41471787_023_fb66.jpg", + "https://cdni.pornpics.com/1280/7/371/41471787/41471787_026_1b93.jpg", + "https://cdni.pornpics.com/1280/7/371/41471787/41471787_030_a9f9.jpg", + "https://cdni.pornpics.com/1280/7/371/41471787/41471787_033_0eee.jpg", + "https://cdni.pornpics.com/1280/7/371/41471787/41471787_035_e348.jpg", + "https://cdni.pornpics.com/1280/7/371/41471787/41471787_039_db0b.jpg", + "https://cdni.pornpics.com/1280/7/371/41471787/41471787_040_a2eb.jpg", + "https://cdni.pornpics.com/1280/7/371/41471787/41471787_043_d278.jpg", + "https://cdni.pornpics.com/1280/7/371/41471787/41471787_047_5afa.jpg", + "https://cdni.pornpics.com/1280/7/371/41471787/41471787_050_33c5.jpg", + "https://cdni.pornpics.com/1280/7/371/41471787/41471787_052_c1d0.jpg", + "https://cdni.pornpics.com/1280/7/371/41471787/41471787_053_f8f1.jpg", + "https://cdni.pornpics.com/1280/7/371/41471787/41471787_056_d6ea.jpg" + ], + "image_count": 20, + "date_scraped": "2025-11-06T22:58:21.023626+00:00", + "source_url": "https://www.pornpics.com/galleries/cheerleader-riley-reid-shows-her-tiny-tits-before-riding-a-pussywrecking-dick-41471787/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2258_Erik Everhard_Riley Reid_Cheerleader_Riley_Reid_shows_her_tiny_tits_before_riding_a_pussy-wrecking_dick", + "inferred_tags": [ + "Big Tits", + "Blowjob", + "Cowgirl", + "Fetish", + "Fucking", + "Hardcore", + "Pornstar", + "Pussy", + "Riding", + "Uniform", + "Uniform Fetish" + ] +} \ No newline at end of file diff --git a/Galleries/20251106_2258_Melissa Moore_Riley Reid_Lesbian_girls_Riley_Reid_and_Melissa_Moore_lick_and_finger_fuck_each_other/metadata.json b/Galleries/20251106_2258_Melissa Moore_Riley Reid_Lesbian_girls_Riley_Reid_and_Melissa_Moore_lick_and_finger_fuck_each_other/metadata.json new file mode 100644 index 0000000..1a766fd --- /dev/null +++ b/Galleries/20251106_2258_Melissa Moore_Riley Reid_Lesbian_girls_Riley_Reid_and_Melissa_Moore_lick_and_finger_fuck_each_other/metadata.json @@ -0,0 +1,74 @@ +{ + "id": "20251106_2258", + "title": "Lesbian girls Riley Reid and Melissa Moore lick and finger fuck each other", + "models": [ + "Melissa Moore", + "Riley Reid" + ], + "categories": [ + "Lesbian", + "Latina", + "Pornstar", + "Step Sister", + "Teen", + "Brunette", + "Cute", + "Spreading", + "Hairy", + "Pussy", + "Teen Lesbian", + "Sexy Latina" + ], + "tags": [ + "Brunette", + "Fucking", + "Hairy", + "Lesbian", + "Oral", + "Pornstar", + "Pussy", + "Sexy Latina", + "Teen", + "Teen Lesbian" + ], + "source": { + "network": "PornPics", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/222/13944363/13944363_002_aab6.jpg", + "https://cdni.pornpics.com/1280/7/222/13944363/13944363_007_4ebe.jpg", + "https://cdni.pornpics.com/1280/7/222/13944363/13944363_014_ee0b.jpg", + "https://cdni.pornpics.com/1280/7/222/13944363/13944363_018_6677.jpg", + "https://cdni.pornpics.com/1280/7/222/13944363/13944363_020_6317.jpg", + "https://cdni.pornpics.com/1280/7/222/13944363/13944363_026_9dc6.jpg", + "https://cdni.pornpics.com/1280/7/222/13944363/13944363_030_989b.jpg", + "https://cdni.pornpics.com/1280/7/222/13944363/13944363_033_5890.jpg", + "https://cdni.pornpics.com/1280/7/222/13944363/13944363_039_0a27.jpg", + "https://cdni.pornpics.com/1280/7/222/13944363/13944363_045_8539.jpg", + "https://cdni.pornpics.com/1280/7/222/13944363/13944363_047_441f.jpg", + "https://cdni.pornpics.com/1280/7/222/13944363/13944363_053_5632.jpg", + "https://cdni.pornpics.com/1280/7/222/13944363/13944363_059_4a22.jpg", + "https://cdni.pornpics.com/1280/7/222/13944363/13944363_060_f5d2.jpg", + "https://cdni.pornpics.com/1280/7/222/13944363/13944363_061_fc3f.jpg", + "https://cdni.pornpics.com/1280/7/222/13944363/13944363_067_9e8b.jpg", + "https://cdni.pornpics.com/1280/7/222/13944363/13944363_071_616a.jpg" + ], + "image_count": 17, + "date_scraped": "2025-11-06T22:58:26.176526+00:00", + "source_url": "https://www.pornpics.com/galleries/lesbian-girls-riley-reid-and-melissa-moore-lick-and-finger-fuck-each-other-13944363/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2258_Melissa Moore_Riley Reid_Lesbian_girls_Riley_Reid_and_Melissa_Moore_lick_and_finger_fuck_each_other", + "inferred_tags": [ + "Brunette", + "Fucking", + "Hairy", + "Lesbian", + "Oral", + "Pornstar", + "Pussy", + "Teen" + ] +} \ No newline at end of file diff --git a/Galleries/20251106_2258_Riley Reid_Naked_blonde_chick_fist_fucks_herself_to_strong_orgasmic_contractions/metadata.json b/Galleries/20251106_2258_Riley Reid_Naked_blonde_chick_fist_fucks_herself_to_strong_orgasmic_contractions/metadata.json new file mode 100644 index 0000000..a988691 --- /dev/null +++ b/Galleries/20251106_2258_Riley Reid_Naked_blonde_chick_fist_fucks_herself_to_strong_orgasmic_contractions/metadata.json @@ -0,0 +1,68 @@ +{ + "id": "20251106_2258", + "title": "Naked blonde chick fist fucks herself to strong orgasmic contractions", + "models": [ + "Riley Reid" + ], + "categories": [ + "Pretty", + "Amateur", + "Sexy", + "Babe", + "Glamour", + "Model", + "Beautiful", + "Solo", + "Big Clit", + "Pussy", + "Hot Naked Women" + ], + "tags": [ + "Amateur", + "Beautiful", + "Blonde", + "Glamour", + "Hot Naked Women", + "Model", + "Pussy", + "Solo" + ], + "source": { + "network": "Amateur Europe", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/159/17634641/17634641_003_66b3.jpg", + "https://cdni.pornpics.com/1280/7/159/17634641/17634641_006_ad49.jpg", + "https://cdni.pornpics.com/1280/7/159/17634641/17634641_010_9c71.jpg", + "https://cdni.pornpics.com/1280/7/159/17634641/17634641_012_673d.jpg", + "https://cdni.pornpics.com/1280/7/159/17634641/17634641_017_1542.jpg", + "https://cdni.pornpics.com/1280/7/159/17634641/17634641_022_d487.jpg", + "https://cdni.pornpics.com/1280/7/159/17634641/17634641_027_e985.jpg", + "https://cdni.pornpics.com/1280/7/159/17634641/17634641_028_e09e.jpg", + "https://cdni.pornpics.com/1280/7/159/17634641/17634641_034_1458.jpg", + "https://cdni.pornpics.com/1280/7/159/17634641/17634641_035_2dd7.jpg", + "https://cdni.pornpics.com/1280/7/159/17634641/17634641_041_197a.jpg", + "https://cdni.pornpics.com/1280/7/159/17634641/17634641_044_27ab.jpg", + "https://cdni.pornpics.com/1280/7/159/17634641/17634641_050_675b.jpg", + "https://cdni.pornpics.com/1280/7/159/17634641/17634641_054_e5e1.jpg", + "https://cdni.pornpics.com/1280/7/159/17634641/17634641_057_e964.jpg", + "https://cdni.pornpics.com/1280/7/159/17634641/17634641_062_98f4.jpg" + ], + "image_count": 16, + "date_scraped": "2025-11-06T22:58:37.951805+00:00", + "source_url": "https://www.pornpics.com/galleries/naked-blonde-chick-fist-fucks-herself-to-strong-orgasmic-contractions-17634641/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2258_Riley Reid_Naked_blonde_chick_fist_fucks_herself_to_strong_orgasmic_contractions", + "inferred_tags": [ + "Amateur", + "Beautiful", + "Blonde", + "Glamour", + "Model", + "Pussy", + "Solo" + ] +} \ No newline at end of file diff --git a/Galleries/20251106_2258_Riley Reid_Van Wylde_Erotic_teen_beauty_Riley_Reid_takes_a_hard_cock_in_sexy_doggystyle_fucking/metadata.json b/Galleries/20251106_2258_Riley Reid_Van Wylde_Erotic_teen_beauty_Riley_Reid_takes_a_hard_cock_in_sexy_doggystyle_fucking/metadata.json new file mode 100644 index 0000000..b80f4c4 --- /dev/null +++ b/Galleries/20251106_2258_Riley Reid_Van Wylde_Erotic_teen_beauty_Riley_Reid_takes_a_hard_cock_in_sexy_doggystyle_fucking/metadata.json @@ -0,0 +1,95 @@ +{ + "id": "20251106_2258", + "title": "Erotic teen beauty Riley Reid takes a hard cock in sexy doggystyle fucking", + "models": [ + "Riley Reid", + "Van Wylde" + ], + "categories": [ + "Ass Fucking", + "Best Pussy", + "Blindfold", + "Blindfold Surprise", + "Cum In Pussy", + "Cum On Pussy", + "Cum On Stockings", + "Footjob", + "Hairy", + "Hardcore", + "Pussy", + "Stockings", + "Teen", + "Teen Footjob", + "Teen Natural Tits", + "Teen Stockings", + "Tight Ass", + "Tiny Tits" + ], + "tags": [ + "Ass", + "Best Pussy", + "Big Tits", + "Blindfold Surprise", + "Cum On Pussy", + "Cum On Stockings", + "Cumshot", + "Doggystyle", + "Footjob", + "Fucking", + "Hairy", + "Hardcore", + "Natural", + "Natural Look", + "Pussy", + "Stockings", + "Teen", + "Teen Footjob", + "Teen Natural Tits", + "Teen Stockings", + "Tight Ass" + ], + "source": { + "network": "PornPics", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/1/63/29035213/29035213_001_5d2f.jpg", + "https://cdni.pornpics.com/1280/1/63/29035213/29035213_002_4060.jpg", + "https://cdni.pornpics.com/1280/1/63/29035213/29035213_003_34f2.jpg", + "https://cdni.pornpics.com/1280/1/63/29035213/29035213_004_2989.jpg", + "https://cdni.pornpics.com/1280/1/63/29035213/29035213_005_2989.jpg", + "https://cdni.pornpics.com/1280/1/63/29035213/29035213_006_03b3.jpg", + "https://cdni.pornpics.com/1280/1/63/29035213/29035213_007_bf97.jpg", + "https://cdni.pornpics.com/1280/1/63/29035213/29035213_008_b49d.jpg", + "https://cdni.pornpics.com/1280/1/63/29035213/29035213_009_1574.jpg", + "https://cdni.pornpics.com/1280/1/63/29035213/29035213_010_809d.jpg", + "https://cdni.pornpics.com/1280/1/63/29035213/29035213_011_48df.jpg", + "https://cdni.pornpics.com/1280/1/63/29035213/29035213_012_a653.jpg", + "https://cdni.pornpics.com/1280/1/63/29035213/29035213_013_a4ca.jpg", + "https://cdni.pornpics.com/1280/1/63/29035213/29035213_014_477e.jpg", + "https://cdni.pornpics.com/1280/1/63/29035213/29035213_015_0684.jpg" + ], + "image_count": 15, + "date_scraped": "2025-11-06T22:58:16.191548+00:00", + "source_url": "https://www.pornpics.com/galleries/erotic-teen-beauty-riley-reid-takes-a-hard-cock-in-sexy-doggystyle-fucking-29035213/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2258_Riley Reid_Van Wylde_Erotic_teen_beauty_Riley_Reid_takes_a_hard_cock_in_sexy_doggystyle_fucking", + "last_refreshed": "2025-11-06T22:58:31.374501+00:00", + "inferred_tags": [ + "Ass", + "Big Tits", + "Cumshot", + "Doggystyle", + "Footjob", + "Fucking", + "Hairy", + "Hardcore", + "Natural", + "Natural Look", + "Pussy", + "Stockings", + "Teen" + ] +} \ No newline at end of file diff --git a/Galleries/20251106_2258_Riley Reid_Van Wylde_Erotic_teen_beauty_Riley_Reid_takes_a_hard_cock_in_sexy_doggystyle_fucking/metadata_update_log.json b/Galleries/20251106_2258_Riley Reid_Van Wylde_Erotic_teen_beauty_Riley_Reid_takes_a_hard_cock_in_sexy_doggystyle_fucking/metadata_update_log.json new file mode 100644 index 0000000..a81734d --- /dev/null +++ b/Galleries/20251106_2258_Riley Reid_Van Wylde_Erotic_teen_beauty_Riley_Reid_takes_a_hard_cock_in_sexy_doggystyle_fucking/metadata_update_log.json @@ -0,0 +1,7 @@ +{ + "timestamp": "2025-11-06T22:58:31.374598+00:00", + "changes": { + "categories": "merged", + "source": "updated" + } +} diff --git a/Galleries/20251106_2335_Paige Owens_Steve Holmes_MILFed_starring_Paige_Owens__Steve_Holmes_Hot_Porn_Pics/metadata.json b/Galleries/20251106_2335_Paige Owens_Steve Holmes_MILFed_starring_Paige_Owens__Steve_Holmes_Hot_Porn_Pics/metadata.json new file mode 100644 index 0000000..1f51ea9 --- /dev/null +++ b/Galleries/20251106_2335_Paige Owens_Steve Holmes_MILFed_starring_Paige_Owens__Steve_Holmes_Hot_Porn_Pics/metadata.json @@ -0,0 +1,84 @@ +{ + "id": "20251106_2335", + "title": "MILFed starring Paige Owens, Steve Holmes Hot Porn Pics", + "models": [ + "Paige Owens", + "Steve Holmes" + ], + "categories": [ + "Wedding", + "Cheating", + "Family", + "MILF", + "Fetish", + "Teen", + "Pussy", + "Feet", + "Brunette", + "Spreading", + "Cheating Wife", + "Bride", + "Teen Stepdaughter", + "Beautiful MILF", + "Sucking Cock", + "MILF Pussy" + ], + "tags": [ + "Beautiful", + "Beautiful MILF", + "Bride", + "Brunette", + "Cheating Wife", + "Fetish", + "MILF", + "MILF Pussy", + "Mature", + "Pussy", + "Sucking Cock", + "Teen", + "Teen Stepdaughter" + ], + "source": { + "network": "PornPics", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/734/65759020/65759020_006_a8b1.jpg", + "https://cdni.pornpics.com/1280/7/734/65759020/65759020_020_f560.jpg", + "https://cdni.pornpics.com/1280/7/734/65759020/65759020_025_3add.jpg", + "https://cdni.pornpics.com/1280/7/734/65759020/65759020_037_d961.jpg", + "https://cdni.pornpics.com/1280/7/734/65759020/65759020_046_3ca7.jpg", + "https://cdni.pornpics.com/1280/7/734/65759020/65759020_052_a172.jpg", + "https://cdni.pornpics.com/1280/7/734/65759020/65759020_065_1f59.jpg", + "https://cdni.pornpics.com/1280/7/734/65759020/65759020_072_3093.jpg", + "https://cdni.pornpics.com/1280/7/734/65759020/65759020_089_b862.jpg", + "https://cdni.pornpics.com/1280/7/734/65759020/65759020_099_de98.jpg", + "https://cdni.pornpics.com/1280/7/734/65759020/65759020_108_3e00.jpg", + "https://cdni.pornpics.com/1280/7/734/65759020/65759020_120_8bef.jpg", + "https://cdni.pornpics.com/1280/7/734/65759020/65759020_129_386d.jpg", + "https://cdni.pornpics.com/1280/7/734/65759020/65759020_135_4e4a.jpg", + "https://cdni.pornpics.com/1280/7/734/65759020/65759020_142_7984.jpg", + "https://cdni.pornpics.com/1280/7/734/65759020/65759020_152_12e4.jpg", + "https://cdni.pornpics.com/1280/7/734/65759020/65759020_159_527e.jpg", + "https://cdni.pornpics.com/1280/7/734/65759020/65759020_164_7971.jpg", + "https://cdni.pornpics.com/1280/7/734/65759020/65759020_173_e83a.jpg", + "https://cdni.pornpics.com/1280/7/734/65759020/65759020_188_18b6.jpg", + "https://cdni.pornpics.com/1280/7/734/65759020/65759020_195_ef9d.jpg" + ], + "image_count": 21, + "date_scraped": "2025-11-06T23:35:19.445466+00:00", + "source_url": "https://www.pornpics.com/galleries/milfed-starring-paige-owens-steve-holmes-hot-porn-pics-65759020/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2335_Paige Owens_Steve Holmes_MILFed_starring_Paige_Owens__Steve_Holmes_Hot_Porn_Pics", + "inferred_tags": [ + "Beautiful", + "Brunette", + "Fetish", + "MILF", + "Mature", + "Pussy", + "Teen" + ] +} \ No newline at end of file diff --git a/Galleries/20251107_2029_Alex Tanner_Young_redhead_Alex_Tanner_shows_her_petite_body_while_completely_naked/metadata.json b/Galleries/20251107_2029_Alex Tanner_Young_redhead_Alex_Tanner_shows_her_petite_body_while_completely_naked/metadata.json new file mode 100644 index 0000000..fa6711f --- /dev/null +++ b/Galleries/20251107_2029_Alex Tanner_Young_redhead_Alex_Tanner_shows_her_petite_body_while_completely_naked/metadata.json @@ -0,0 +1,77 @@ +{ + "id": "20251107_2029", + "title": "Young redhead Alex Tanner shows her petite body while completely naked", + "models": [ + "Alex Tanner" + ], + "categories": [ + "College", + "Redhead", + "Amateur", + "Teen", + "Centerfold", + "Spreading", + "Pussy", + "Feet", + "Legs", + "Cute", + "Redhead Teen", + "Natural Redhead", + "Redhead Freckles", + "Ginger Teen", + "Cute Redhead", + "Kinky", + "Amateur College", + "Pale Redhead" + ], + "tags": [ + "Amateur", + "Amateur College", + "Cute Redhead", + "Ginger Teen", + "Kinky", + "Natural", + "Natural Look", + "Natural Redhead", + "Pale Redhead", + "Petite", + "Pussy", + "Redhead", + "Redhead Freckles", + "Redhead Teen", + "Teen" + ], + "source": { + "network": "Amateur Europe", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/738/63489082/63489082_006_b0f0.jpg", + "https://cdni.pornpics.com/1280/7/738/63489082/63489082_011_6901.jpg", + "https://cdni.pornpics.com/1280/7/738/63489082/63489082_016_d06f.jpg", + "https://cdni.pornpics.com/1280/7/738/63489082/63489082_021_7e7a.jpg", + "https://cdni.pornpics.com/1280/7/738/63489082/63489082_024_2965.jpg", + "https://cdni.pornpics.com/1280/7/738/63489082/63489082_033_c960.jpg", + "https://cdni.pornpics.com/1280/7/738/63489082/63489082_034_50c0.jpg", + "https://cdni.pornpics.com/1280/7/738/63489082/63489082_041_d780.jpg", + "https://cdni.pornpics.com/1280/7/738/63489082/63489082_048_8ac3.jpg", + "https://cdni.pornpics.com/1280/7/738/63489082/63489082_053_a11c.jpg", + "https://cdni.pornpics.com/1280/7/738/63489082/63489082_055_a262.jpg", + "https://cdni.pornpics.com/1280/7/738/63489082/63489082_061_e5b9.jpg", + "https://cdni.pornpics.com/1280/7/738/63489082/63489082_064_b9d5.jpg", + "https://cdni.pornpics.com/1280/7/738/63489082/63489082_071_bf17.jpg", + "https://cdni.pornpics.com/1280/7/738/63489082/63489082_074_9f85.jpg", + "https://cdni.pornpics.com/1280/7/738/63489082/63489082_079_4c9d.jpg", + "https://cdni.pornpics.com/1280/7/738/63489082/63489082_088_a17b.jpg", + "https://cdni.pornpics.com/1280/7/738/63489082/63489082_089_0ea8.jpg", + "https://cdni.pornpics.com/1280/7/738/63489082/63489082_097_9abc.jpg", + "https://cdni.pornpics.com/1280/7/738/63489082/63489082_101_4a8f.jpg" + ], + "image_count": 20, + "date_scraped": "2025-11-07T20:29:27.087119+00:00", + "source_url": "https://www.pornpics.com/galleries/young-redhead-alex-tanner-shows-her-petite-body-while-completely-naked-63489082/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251107_2029_Alex Tanner_Young_redhead_Alex_Tanner_shows_her_petite_body_while_completely_naked" +} \ No newline at end of file diff --git a/Galleries/20251107_2031_Alex Tanner_Mr_POV_performed_by_Alex_Tanner_XXX_Photos/metadata.json b/Galleries/20251107_2031_Alex Tanner_Mr_POV_performed_by_Alex_Tanner_XXX_Photos/metadata.json new file mode 100644 index 0000000..a17810d --- /dev/null +++ b/Galleries/20251107_2031_Alex Tanner_Mr_POV_performed_by_Alex_Tanner_XXX_Photos/metadata.json @@ -0,0 +1,78 @@ +{ + "id": "20251107_2031", + "title": "Mr POV performed by Alex Tanner XXX Photos", + "models": [ + "Alex Tanner" + ], + "categories": [ + "Petite", + "Natural Tits", + "POV", + "Reality", + "Missionary", + "Pornstar", + "Big Tits", + "Handjob", + "Pussy", + "Big Clit", + "Curvy Petite", + "Legs Up Missionary", + "POV Blowjob", + "Slut", + "Big Pussy", + "Sucking Cock" + ], + "tags": [ + "Big Pussy", + "Big Tits", + "Blowjob", + "Curvy", + "Curvy Petite", + "Handjob", + "Legs Up Missionary", + "Missionary", + "Natural", + "Natural Look", + "POV", + "POV Blowjob", + "Petite", + "Pornstar", + "Pussy", + "Slut", + "Sucking Cock" + ], + "source": { + "network": "PornPics", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/812/99243967/99243967_001_bbcc.jpg", + "https://cdni.pornpics.com/1280/7/812/99243967/99243967_013_d5e4.jpg", + "https://cdni.pornpics.com/1280/7/812/99243967/99243967_018_8f84.jpg", + "https://cdni.pornpics.com/1280/7/812/99243967/99243967_027_fcc8.jpg", + "https://cdni.pornpics.com/1280/7/812/99243967/99243967_033_2c77.jpg", + "https://cdni.pornpics.com/1280/7/812/99243967/99243967_041_b4aa.jpg", + "https://cdni.pornpics.com/1280/7/812/99243967/99243967_043_e791.jpg", + "https://cdni.pornpics.com/1280/7/812/99243967/99243967_053_8fb3.jpg", + "https://cdni.pornpics.com/1280/7/812/99243967/99243967_063_0661.jpg", + "https://cdni.pornpics.com/1280/7/812/99243967/99243967_070_22c6.jpg", + "https://cdni.pornpics.com/1280/7/812/99243967/99243967_076_d369.jpg", + "https://cdni.pornpics.com/1280/7/812/99243967/99243967_082_5d2d.jpg", + "https://cdni.pornpics.com/1280/7/812/99243967/99243967_088_5474.jpg", + "https://cdni.pornpics.com/1280/7/812/99243967/99243967_092_115b.jpg", + "https://cdni.pornpics.com/1280/7/812/99243967/99243967_099_2ac4.jpg", + "https://cdni.pornpics.com/1280/7/812/99243967/99243967_100_4b51.jpg", + "https://cdni.pornpics.com/1280/7/812/99243967/99243967_108_452c.jpg", + "https://cdni.pornpics.com/1280/7/812/99243967/99243967_116_6394.jpg", + "https://cdni.pornpics.com/1280/7/812/99243967/99243967_118_7efc.jpg", + "https://cdni.pornpics.com/1280/7/812/99243967/99243967_124_8627.jpg", + "https://cdni.pornpics.com/1280/7/812/99243967/99243967_129_bf89.jpg" + ], + "image_count": 21, + "date_scraped": "2025-11-07T20:31:48.239211+00:00", + "source_url": "https://www.pornpics.com/galleries/mr-pov-performed-by-alex-tanner-xxx-photos-99243967/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251107_2031_Alex Tanner_Mr_POV_performed_by_Alex_Tanner_XXX_Photos" +} \ No newline at end of file diff --git a/Galleries/20251107_2031_Alex Tanner_Young_redhead_Alex_Tanner_demonstrating_her_perfectly_smooth_pussy/metadata.json b/Galleries/20251107_2031_Alex Tanner_Young_redhead_Alex_Tanner_demonstrating_her_perfectly_smooth_pussy/metadata.json new file mode 100644 index 0000000..0a58aa4 --- /dev/null +++ b/Galleries/20251107_2031_Alex Tanner_Young_redhead_Alex_Tanner_demonstrating_her_perfectly_smooth_pussy/metadata.json @@ -0,0 +1,68 @@ +{ + "id": "20251107_2031", + "title": "Young redhead Alex Tanner demonstrating her perfectly smooth pussy", + "models": [ + "Alex Tanner" + ], + "categories": [ + "Redhead", + "Teen", + "Shorts", + "Close Up", + "Shaved", + "Legs", + "High Heels", + "Tiny Tits", + "Panties", + "Nipples", + "Tight Shorts", + "Sexy Redhead", + "Redhead Teen", + "Big Ass Redhead", + "Redhead Ass" + ], + "tags": [ + "Ass", + "Big Ass Redhead", + "Big Tits", + "High Heels", + "Panties", + "Pussy", + "Redhead", + "Redhead Ass", + "Redhead Teen", + "Sexy Redhead", + "Shaved", + "Shorts", + "Teen", + "Tight Shorts" + ], + "source": { + "network": "PornPics", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/5/241/26775799/26775799_001_0927.jpg", + "https://cdni.pornpics.com/1280/5/241/26775799/26775799_002_9917.jpg", + "https://cdni.pornpics.com/1280/5/241/26775799/26775799_003_097e.jpg", + "https://cdni.pornpics.com/1280/5/241/26775799/26775799_004_f08d.jpg", + "https://cdni.pornpics.com/1280/5/241/26775799/26775799_005_551c.jpg", + "https://cdni.pornpics.com/1280/5/241/26775799/26775799_006_551c.jpg", + "https://cdni.pornpics.com/1280/5/241/26775799/26775799_007_1bee.jpg", + "https://cdni.pornpics.com/1280/5/241/26775799/26775799_008_5d3b.jpg", + "https://cdni.pornpics.com/1280/5/241/26775799/26775799_009_fa92.jpg", + "https://cdni.pornpics.com/1280/5/241/26775799/26775799_010_113c.jpg", + "https://cdni.pornpics.com/1280/5/241/26775799/26775799_011_113c.jpg", + "https://cdni.pornpics.com/1280/5/241/26775799/26775799_012_6673.jpg", + "https://cdni.pornpics.com/1280/5/241/26775799/26775799_013_719d.jpg", + "https://cdni.pornpics.com/1280/5/241/26775799/26775799_014_4229.jpg", + "https://cdni.pornpics.com/1280/5/241/26775799/26775799_015_d831.jpg" + ], + "image_count": 15, + "date_scraped": "2025-11-07T20:31:21.604057+00:00", + "source_url": "https://www.pornpics.com/galleries/young-redhead-alex-tanner-demonstrating-her-perfectly-smooth-pussy-26775799/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251107_2031_Alex Tanner_Young_redhead_Alex_Tanner_demonstrating_her_perfectly_smooth_pussy" +} \ No newline at end of file diff --git a/Galleries/20251107_2031_Esmi Lee_Brooke Wylde_Gianna Nicole_Tiffany Taylor_Nikki Lima_Sasha Summers_Alex Tanner_J Mac_Sabrina Banks_Dani Desire_Blonde_party_girl_flashes_nude_upskirt___gets_cum_on_face_in_hot_orgy/metadata.json b/Galleries/20251107_2031_Esmi Lee_Brooke Wylde_Gianna Nicole_Tiffany Taylor_Nikki Lima_Sasha Summers_Alex Tanner_J Mac_Sabrina Banks_Dani Desire_Blonde_party_girl_flashes_nude_upskirt___gets_cum_on_face_in_hot_orgy/metadata.json new file mode 100644 index 0000000..fe5dca0 --- /dev/null +++ b/Galleries/20251107_2031_Esmi Lee_Brooke Wylde_Gianna Nicole_Tiffany Taylor_Nikki Lima_Sasha Summers_Alex Tanner_J Mac_Sabrina Banks_Dani Desire_Blonde_party_girl_flashes_nude_upskirt___gets_cum_on_face_in_hot_orgy/metadata.json @@ -0,0 +1,84 @@ +{ + "id": "20251107_2031", + "title": "Blonde party girl flashes nude upskirt & gets cum on face in hot orgy", + "models": [ + "Esmi Lee", + "Brooke Wylde", + "Gianna Nicole", + "Tiffany Taylor", + "Nikki Lima", + "Sasha Summers", + "Alex Tanner", + "J Mac", + "Sabrina Banks", + "Dani Desire" + ], + "categories": [ + "Party", + "Ass Fucking", + "MILF", + "Hardcore", + "Orgy", + "Groupsex", + "Indian", + "Ass", + "Teen", + "Mature", + "Redhead Fuck", + "Redhead Doggystyle", + "Redhead MILF", + "Teen Orgy", + "Skinny Mature Fuck", + "Indian Fuck", + "Mature Orgy", + "MILF Hardcore" + ], + "tags": [ + "Ass", + "Blonde", + "Cumshot", + "Doggystyle", + "Fucking", + "Hardcore", + "Indian Fuck", + "MILF", + "MILF Hardcore", + "Mature", + "Mature Orgy", + "Orgy", + "Party", + "Redhead", + "Redhead Doggystyle", + "Redhead Fuck", + "Redhead MILF", + "Skinny", + "Skinny Mature Fuck", + "Teen", + "Teen Orgy" + ], + "source": { + "network": "PornPics", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/1/306/17122410/17122410_001_19d8.jpg", + "https://cdni.pornpics.com/1280/1/306/17122410/17122410_002_e511.jpg", + "https://cdni.pornpics.com/1280/1/306/17122410/17122410_003_6717.jpg", + "https://cdni.pornpics.com/1280/1/306/17122410/17122410_004_cc4b.jpg", + "https://cdni.pornpics.com/1280/1/306/17122410/17122410_005_f15c.jpg", + "https://cdni.pornpics.com/1280/1/306/17122410/17122410_006_7891.jpg", + "https://cdni.pornpics.com/1280/1/306/17122410/17122410_007_9652.jpg", + "https://cdni.pornpics.com/1280/1/306/17122410/17122410_008_b304.jpg", + "https://cdni.pornpics.com/1280/1/306/17122410/17122410_009_4816.jpg", + "https://cdni.pornpics.com/1280/1/306/17122410/17122410_010_8e32.jpg", + "https://cdni.pornpics.com/1280/1/306/17122410/17122410_011_2354.jpg", + "https://cdni.pornpics.com/1280/1/306/17122410/17122410_012_4d90.jpg" + ], + "image_count": 12, + "date_scraped": "2025-11-07T20:31:35.064524+00:00", + "source_url": "https://www.pornpics.com/galleries/blonde-party-girl-flashes-nude-upskirt-gets-cum-on-face-in-hot-orgy-17122410/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251107_2031_Esmi Lee_Brooke Wylde_Gianna Nicole_Tiffany Taylor_Nikki Lima_Sasha Summers_Alex Tanner_J Mac_Sabrina Banks_Dani Desire_Blonde_party_girl_flashes_nude_upskirt___gets_cum_on_face_in_hot_orgy" +} \ No newline at end of file diff --git a/Galleries/20251107_2037_Jayden Lee_Marcus London_Hot_babe_in_a_sinful_bikini_Jayden_Lee_blows_a_big_rod___gets_fucked_on_a_sofa/metadata.json b/Galleries/20251107_2037_Jayden Lee_Marcus London_Hot_babe_in_a_sinful_bikini_Jayden_Lee_blows_a_big_rod___gets_fucked_on_a_sofa/metadata.json new file mode 100644 index 0000000..1dee94b --- /dev/null +++ b/Galleries/20251107_2037_Jayden Lee_Marcus London_Hot_babe_in_a_sinful_bikini_Jayden_Lee_blows_a_big_rod___gets_fucked_on_a_sofa/metadata.json @@ -0,0 +1,83 @@ +{ + "id": "20251107_2037", + "title": "Hot babe in a sinful bikini Jayden Lee blows a big rod & gets fucked on a sofa", + "models": [ + "Jayden Lee", + "Marcus London" + ], + "categories": [ + "Asian", + "Skinny", + "Teen", + "Cumshot", + "Panties", + "Blowjob", + "Pussy", + "Brunette", + "Hardcore", + "Tiny Tits", + "Asian Model", + "Asian Blowjob", + "Asian Hardcore", + "Asian Fuck", + "Model Fuck", + "Asian Lingerie", + "Asian Cumshot" + ], + "tags": [ + "Asian Blowjob", + "Asian Cumshot", + "Asian Fuck", + "Asian Hardcore", + "Asian Lingerie", + "Asian Model", + "Big Tits", + "Blowjob", + "Brunette", + "Couch", + "Cumshot", + "Fucking", + "Hardcore", + "Lingerie", + "Model", + "Model Fuck", + "Panties", + "Pussy", + "Skinny", + "Teen" + ], + "source": { + "network": "Nubile Films", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/271/16020943/16020943_003_233d.jpg", + "https://cdni.pornpics.com/1280/7/271/16020943/16020943_007_8a98.jpg", + "https://cdni.pornpics.com/1280/7/271/16020943/16020943_009_c3f0.jpg", + "https://cdni.pornpics.com/1280/7/271/16020943/16020943_014_e011.jpg", + "https://cdni.pornpics.com/1280/7/271/16020943/16020943_020_9e99.jpg", + "https://cdni.pornpics.com/1280/7/271/16020943/16020943_023_e9ab.jpg", + "https://cdni.pornpics.com/1280/7/271/16020943/16020943_024_a6cd.jpg", + "https://cdni.pornpics.com/1280/7/271/16020943/16020943_027_8af2.jpg", + "https://cdni.pornpics.com/1280/7/271/16020943/16020943_032_b8f5.jpg", + "https://cdni.pornpics.com/1280/7/271/16020943/16020943_033_4921.jpg", + "https://cdni.pornpics.com/1280/7/271/16020943/16020943_037_8b53.jpg", + "https://cdni.pornpics.com/1280/7/271/16020943/16020943_041_c64f.jpg", + "https://cdni.pornpics.com/1280/7/271/16020943/16020943_044_d0bc.jpg", + "https://cdni.pornpics.com/1280/7/271/16020943/16020943_047_ca32.jpg", + "https://cdni.pornpics.com/1280/7/271/16020943/16020943_050_44bf.jpg", + "https://cdni.pornpics.com/1280/7/271/16020943/16020943_052_dd1f.jpg", + "https://cdni.pornpics.com/1280/7/271/16020943/16020943_055_69d4.jpg", + "https://cdni.pornpics.com/1280/7/271/16020943/16020943_059_7f1a.jpg", + "https://cdni.pornpics.com/1280/7/271/16020943/16020943_063_c12b.jpg", + "https://cdni.pornpics.com/1280/7/271/16020943/16020943_064_f23f.jpg", + "https://cdni.pornpics.com/1280/7/271/16020943/16020943_068_d3d9.jpg" + ], + "image_count": 21, + "date_scraped": "2025-11-07T20:37:31.031921+00:00", + "source_url": "https://www.pornpics.com/galleries/hot-babe-in-a-sinful-bikini-jayden-lee-blows-a-big-rod-gets-fucked-on-a-sofa-16020943/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251107_2037_Jayden Lee_Marcus London_Hot_babe_in_a_sinful_bikini_Jayden_Lee_blows_a_big_rod___gets_fucked_on_a_sofa" +} \ No newline at end of file diff --git a/Galleries/20251107_2037_Mia Split_Aaron Rock_Alexa Flexy_Evil_Angel_featuring_Aaron_Rock__Alexa_Flexy__Mia_Split_Naked_Images/metadata.json b/Galleries/20251107_2037_Mia Split_Aaron Rock_Alexa Flexy_Evil_Angel_featuring_Aaron_Rock__Alexa_Flexy__Mia_Split_Naked_Images/metadata.json new file mode 100644 index 0000000..06a9cd2 --- /dev/null +++ b/Galleries/20251107_2037_Mia Split_Aaron Rock_Alexa Flexy_Evil_Angel_featuring_Aaron_Rock__Alexa_Flexy__Mia_Split_Naked_Images/metadata.json @@ -0,0 +1,77 @@ +{ + "id": "20251107_2037", + "title": "Evil Angel featuring Aaron Rock, Alexa Flexy, Mia Split Naked Images", + "models": [ + "Mia Split", + "Aaron Rock", + "Alexa Flexy" + ], + "categories": [ + "Interracial", + "Threesome", + "Natural Tits", + "Ass", + "Pussy", + "Anal", + "Petite", + "Teen", + "Flexible", + "Amateur", + "Hot Naked Women", + "Interracial Anal", + "Interracial Threesome", + "Black And White" + ], + "tags": [ + "Amateur", + "Anal", + "Anal Fetish", + "Ass", + "Big Tits", + "Black And White", + "Hot Naked Women", + "Interracial", + "Interracial Anal", + "Interracial Threesome", + "Natural", + "Natural Look", + "Petite", + "Pussy", + "Teen", + "Threesome" + ], + "source": { + "network": "Amateur Europe", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/789/71699035/71699035_006_4bed.jpg", + "https://cdni.pornpics.com/1280/7/789/71699035/71699035_014_28ac.jpg", + "https://cdni.pornpics.com/1280/7/789/71699035/71699035_017_2467.jpg", + "https://cdni.pornpics.com/1280/7/789/71699035/71699035_026_bacd.jpg", + "https://cdni.pornpics.com/1280/7/789/71699035/71699035_040_2694.jpg", + "https://cdni.pornpics.com/1280/7/789/71699035/71699035_047_264b.jpg", + "https://cdni.pornpics.com/1280/7/789/71699035/71699035_051_75fc.jpg", + "https://cdni.pornpics.com/1280/7/789/71699035/71699035_060_544d.jpg", + "https://cdni.pornpics.com/1280/7/789/71699035/71699035_068_bbe3.jpg", + "https://cdni.pornpics.com/1280/7/789/71699035/71699035_077_3ac7.jpg", + "https://cdni.pornpics.com/1280/7/789/71699035/71699035_081_058f.jpg", + "https://cdni.pornpics.com/1280/7/789/71699035/71699035_082_6dbf.jpg", + "https://cdni.pornpics.com/1280/7/789/71699035/71699035_094_6869.jpg", + "https://cdni.pornpics.com/1280/7/789/71699035/71699035_099_c46c.jpg", + "https://cdni.pornpics.com/1280/7/789/71699035/71699035_107_8129.jpg", + "https://cdni.pornpics.com/1280/7/789/71699035/71699035_114_c628.jpg", + "https://cdni.pornpics.com/1280/7/789/71699035/71699035_120_0530.jpg", + "https://cdni.pornpics.com/1280/7/789/71699035/71699035_126_8c61.jpg", + "https://cdni.pornpics.com/1280/7/789/71699035/71699035_130_f167.jpg", + "https://cdni.pornpics.com/1280/7/789/71699035/71699035_143_6cfb.jpg", + "https://cdni.pornpics.com/1280/7/789/71699035/71699035_146_fcd7.jpg" + ], + "image_count": 21, + "date_scraped": "2025-11-07T20:37:59.865361+00:00", + "source_url": "https://www.pornpics.com/galleries/evil-angel-featuring-aaron-rock-alexa-flexy-mia-split-naked-images-71699035/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251107_2037_Mia Split_Aaron Rock_Alexa Flexy_Evil_Angel_featuring_Aaron_Rock__Alexa_Flexy__Mia_Split_Naked_Images" +} \ No newline at end of file diff --git a/Galleries/20251107_2037_Unknown_Model_OnlyFans_Luv_Hanna_Zuki_Luv_Hanna_Zuki/metadata.json b/Galleries/20251107_2037_Unknown_Model_OnlyFans_Luv_Hanna_Zuki_Luv_Hanna_Zuki/metadata.json new file mode 100644 index 0000000..8731292 --- /dev/null +++ b/Galleries/20251107_2037_Unknown_Model_OnlyFans_Luv_Hanna_Zuki_Luv_Hanna_Zuki/metadata.json @@ -0,0 +1,67 @@ +{ + "id": "20251107_2037", + "title": "OnlyFans Luv Hanna Zuki Luv Hanna Zuki", + "models": [], + "categories": [ + "Asian", + "Selfie", + "Amateur", + "Lingerie", + "Ass", + "Feet", + "Close Up", + "Asshole", + "Babe", + "Beautiful", + "Asian Model", + "Asian Teen", + "Perfect Teen Body", + "Perfect Ass", + "Asian Lingerie", + "Beautiful Asian", + "Big Ass Teen", + "Brunette Teen" + ], + "tags": [ + "Amateur", + "Asian Lingerie", + "Asian Model", + "Asian Teen", + "Ass", + "Beautiful", + "Beautiful Asian", + "Big Ass Teen", + "Brunette", + "Brunette Teen", + "Lingerie", + "Model", + "Perfect", + "Perfect Ass", + "Perfect Body", + "Perfect Teen Body", + "Teen" + ], + "source": { + "network": "Amateur Europe", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/3/15/52529080/52529080_001_98e1.jpg", + "https://cdni.pornpics.com/1280/3/15/52529080/52529080_002_6402.jpg", + "https://cdni.pornpics.com/1280/3/15/52529080/52529080_003_906f.jpg", + "https://cdni.pornpics.com/1280/3/15/52529080/52529080_004_2519.jpg", + "https://cdni.pornpics.com/1280/3/15/52529080/52529080_005_2519.jpg", + "https://cdni.pornpics.com/1280/3/15/52529080/52529080_006_3d1f.jpg", + "https://cdni.pornpics.com/1280/3/15/52529080/52529080_007_c7d9.jpg", + "https://cdni.pornpics.com/1280/3/15/52529080/52529080_008_c7d9.jpg", + "https://cdni.pornpics.com/1280/3/15/52529080/52529080_009_6952.jpg", + "https://cdni.pornpics.com/1280/3/15/52529080/52529080_010_9f3d.jpg" + ], + "image_count": 10, + "date_scraped": "2025-11-07T20:37:13.826670+00:00", + "source_url": "https://www.pornpics.com/galleries/onlyfans-luv-hanna-zuki-luv-hanna-zuki-52529080/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251107_2037_Unknown_Model_OnlyFans_Luv_Hanna_Zuki_Luv_Hanna_Zuki" +} \ No newline at end of file diff --git a/Galleries/20251107_2319_Alora Jaymes_Sexy_mature_with_big_tits_Alora_Jaymes_gives_head_and_gets_rammed/metadata.json b/Galleries/20251107_2319_Alora Jaymes_Sexy_mature_with_big_tits_Alora_Jaymes_gives_head_and_gets_rammed/metadata.json new file mode 100644 index 0000000..38cb0d4 --- /dev/null +++ b/Galleries/20251107_2319_Alora Jaymes_Sexy_mature_with_big_tits_Alora_Jaymes_gives_head_and_gets_rammed/metadata.json @@ -0,0 +1,85 @@ +{ + "id": "20251107_2319", + "title": "Sexy mature with big tits Alora Jaymes gives head and gets rammed", + "models": [ + "Alora Jaymes" + ], + "categories": [ + "Deepthroat", + "MILF", + "Fingering", + "Blowjob", + "Amateur", + "Undressing", + "Ass", + "Spreading", + "Natural Tits", + "Close Up", + "MILF Sucking Cock", + "Amateur Deepthroat", + "Amateur Blowjob", + "MILF Deepthroat", + "Skinny MILF Fuck", + "Fingering Panties", + "Beautiful MILF", + "Brunette MILF" + ], + "tags": [ + "Amateur", + "Amateur Blowjob", + "Amateur Deepthroat", + "Ass", + "Beautiful", + "Beautiful MILF", + "Big Tits", + "Blowjob", + "Brunette", + "Brunette MILF", + "Fingering", + "Fingering Panties", + "Fucking", + "MILF", + "MILF Deepthroat", + "MILF Sucking Cock", + "Mature", + "Natural", + "Natural Look", + "Panties", + "Skinny", + "Skinny MILF Fuck" + ], + "source": { + "network": "Amateur Europe", + "channel": null + }, + "rating": "", + "views": null, + "image_urls": [ + "https://cdni.pornpics.com/1280/7/443/54684463/54684463_003_2111.jpg", + "https://cdni.pornpics.com/1280/7/443/54684463/54684463_019_6348.jpg", + "https://cdni.pornpics.com/1280/7/443/54684463/54684463_025_081f.jpg", + "https://cdni.pornpics.com/1280/7/443/54684463/54684463_039_1999.jpg", + "https://cdni.pornpics.com/1280/7/443/54684463/54684463_051_265d.jpg", + "https://cdni.pornpics.com/1280/7/443/54684463/54684463_061_8154.jpg", + "https://cdni.pornpics.com/1280/7/443/54684463/54684463_065_df40.jpg", + "https://cdni.pornpics.com/1280/7/443/54684463/54684463_081_4f2a.jpg", + "https://cdni.pornpics.com/1280/7/443/54684463/54684463_082_c7b0.jpg", + "https://cdni.pornpics.com/1280/7/443/54684463/54684463_083_4454.jpg", + "https://cdni.pornpics.com/1280/7/443/54684463/54684463_095_e7a6.jpg", + "https://cdni.pornpics.com/1280/7/443/54684463/54684463_111_da0a.jpg", + "https://cdni.pornpics.com/1280/7/443/54684463/54684463_113_b4fc.jpg", + "https://cdni.pornpics.com/1280/7/443/54684463/54684463_129_b070.jpg", + "https://cdni.pornpics.com/1280/7/443/54684463/54684463_139_20c6.jpg", + "https://cdni.pornpics.com/1280/7/443/54684463/54684463_142_88c8.jpg", + "https://cdni.pornpics.com/1280/7/443/54684463/54684463_152_6319.jpg", + "https://cdni.pornpics.com/1280/7/443/54684463/54684463_167_eb1e.jpg", + "https://cdni.pornpics.com/1280/7/443/54684463/54684463_175_2ab9.jpg", + "https://cdni.pornpics.com/1280/7/443/54684463/54684463_191_9439.jpg", + "https://cdni.pornpics.com/1280/7/443/54684463/54684463_200_7eb0.jpg" + ], + "image_count": 21, + "date_scraped": "2025-11-07T23:19:54.823362+00:00", + "source_url": "https://www.pornpics.com/galleries/sexy-mature-with-big-tits-alora-jaymes-gives-head-and-gets-rammed-54684463/", + "source_label": null, + "import_path": "/home/stu/Projects/PD/Goondex/Galleries/20251107_2319_Alora Jaymes_Sexy_mature_with_big_tits_Alora_Jaymes_gives_head_and_gets_rammed" +} \ No newline at end of file diff --git a/Galleries/index.json b/Galleries/index.json index cfd1053..53f0222 100644 --- a/Galleries/index.json +++ b/Galleries/index.json @@ -32,6 +32,7 @@ "Hairy Amateur", "Hairy Redhead", "Hairy Redhead Pussy", + "Office", "Redhead Ass", "Redhead Pussy" ], @@ -927,5 +928,1088 @@ "folder": "20251106_2055_Jayme Langford_ATK_Archives_featuring_Jayme_Langford_Hot_Images", "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2055_Jayme Langford_ATK_Archives_featuring_Jayme_Langford_Hot_Images/metadata.json", "timestamp": "2025-11-06T20:55:07.129269+00:00" + }, + { + "id": "20251106_2236", + "title": "Amateur mom Susanna Glam gets stripped and fucked by her personal trainer", + "models": [ + "Susanna Glam", + "Deny Lou" + ], + "tags": [ + "Amateur", + "Beautiful", + "Beautiful Granny", + "Blowjob", + "GILF", + "Granny Handjob", + "Granny Slut", + "Handjob", + "Mature", + "Mature Boy", + "Mom Boy", + "Mom Son", + "Pussy", + "Sexy GILF", + "Teen" + ], + "url": "https://www.pornpics.com/galleries/amateur-mom-susanna-glam-gets-stripped-and-fucked-by-her-personal-trainer-54709783/", + "folder": "20251106_2236_Susanna Glam_Deny Lou_Amateur_mom_Susanna_Glam_gets_stripped_and_fucked_by_her_personal_trainer", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2236_Susanna Glam_Deny Lou_Amateur_mom_Susanna_Glam_gets_stripped_and_fucked_by_her_personal_trainer/metadata.json", + "timestamp": "2025-11-06T22:36:11.000270+00:00" + }, + { + "id": "20251106_2236", + "title": "All Over 30 starring Angel Rai, Chicka Bomb Nude Photos", + "models": [ + "Angel Rai", + "Chicka Bomb" + ], + "tags": [ + "Amateur", + "Ass", + "Beautiful", + "Beautiful Pussy", + "Hot Naked Women", + "Lesbian", + "Lesbian Facesitting", + "Lesbian Scissoring", + "Nice Pussy", + "Petite", + "Pussy", + "Redhead", + "Redhead Lesbian", + "Teen", + "Ukraine Pussy", + "Ukrainian", + "Wet Teen Pussy" + ], + "url": "https://www.pornpics.com/galleries/all-over-30-starring-angel-rai-chicka-bomb-nude-photos-66224044/", + "folder": "20251106_2236_Angel Rai_Chicka Bomb_All_Over_30_starring_Angel_Rai__Chicka_Bomb_Nude_Photos", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2236_Angel Rai_Chicka Bomb_All_Over_30_starring_Angel_Rai__Chicka_Bomb_Nude_Photos/metadata.json", + "timestamp": "2025-11-06T22:36:16.505880+00:00" + }, + { + "id": "20251106_2236", + "title": "Adorable little teen Elen rides her boyfriend's dong and gets a facial", + "models": [ + "Taissia Shanti" + ], + "tags": [ + "Ass", + "Big Cock", + "Big Tits", + "Clothed Fuck", + "Cumshot", + "Facial", + "Fucking", + "Hardcore", + "Pussy", + "Russian", + "Russian Teen", + "Shorts", + "Skinny", + "Skinny Teen Fuck", + "Small Tits Fuck", + "Teen", + "Teen Cum", + "Teen Facesitting", + "Teen Fuck", + "Teen Hardcore" + ], + "url": "https://www.pornpics.com/galleries/adorable-little-teen-elen-rides-her-boyfriends-dong-and-gets-a-facial-73470783/", + "folder": "20251106_2236_Taissia Shanti_Adorable_little_teen_Elen_rides_her_boyfriend_s_dong_and_gets_a_facial", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2236_Taissia Shanti_Adorable_little_teen_Elen_rides_her_boyfriend_s_dong_and_gets_a_facial/metadata.json", + "timestamp": "2025-11-06T22:36:21.117480+00:00" + }, + { + "id": "20251106_2236", + "title": "Porn Megaload featuring Kama Oxi, Tom Holland Sex Pictures", + "models": [ + "Kama Oxi", + "Tom Holland" + ], + "tags": [ + "Beautiful", + "Beautiful Blowjob", + "Blowjob", + "Brunette", + "Brunette Teen", + "Fit", + "Friends Mom", + "Fucking", + "Mom Boy", + "Mom Pussy", + "Mom Son", + "Pussy", + "Teen", + "Teen Schoolgirl" + ], + "url": "https://www.pornpics.com/galleries/porn-megaload-featuring-kama-oxi-tom-holland-sex-pictures-76288217/", + "folder": "20251106_2236_Kama Oxi_Tom Holland_Porn_Megaload_featuring_Kama_Oxi__Tom_Holland_Sex_Pictures", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2236_Kama Oxi_Tom Holland_Porn_Megaload_featuring_Kama_Oxi__Tom_Holland_Sex_Pictures/metadata.json", + "timestamp": "2025-11-06T22:36:26.070601+00:00" + }, + { + "id": "20251106_2236", + "title": "Pretty brunette teen Jorden Kennedy exposes her sweet body in a hot striptease", + "models": [ + "jorden kennedy" + ], + "tags": [ + "Amateur", + "Amateur Hairy Pussy", + "Beautiful", + "Beautiful Hairy", + "Big Hairy Pussy", + "Brunette", + "Extremely Hairy Pussy", + "Hairy", + "Hairy Bush", + "Natural", + "Natural Hairy", + "Natural Look", + "Outdoor", + "Pussy", + "Teen" + ], + "url": "https://www.pornpics.com/galleries/pretty-brunette-teen-jorden-kennedy-exposes-her-sweet-body-in-a-hot-striptease-47702961/", + "folder": "20251106_2236_jorden kennedy_Pretty_brunette_teen_Jorden_Kennedy_exposes_her_sweet_body_in_a_hot_striptease", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2236_jorden kennedy_Pretty_brunette_teen_Jorden_Kennedy_exposes_her_sweet_body_in_a_hot_striptease/metadata.json", + "timestamp": "2025-11-06T22:36:35.305079+00:00" + }, + { + "id": "20251106_2236", + "title": "Curvy brunette Riley Reid gets a DP in a steamy threesome with hung studs", + "models": [ + "Markus Dupree", + "Ramon Nomar", + "Riley Reid" + ], + "tags": [ + "Anal", + "Anal Fetish", + "Brunette", + "Brunette Hairy Pussy", + "Curvy", + "Double Anal", + "Dress", + "Facial", + "Fetish", + "Hairy", + "Hairy Upskirt", + "High Heels", + "Latex", + "Latex Fetish", + "Panties", + "Penetration", + "Pornstar", + "Pussy", + "Sexy Dress", + "Short Skirt High Heels", + "Short Skirt No Panties", + "Skirt", + "Threesome", + "Tight Dress", + "Upskirt No Panties" + ], + "url": "https://www.pornpics.com/galleries/curvy-brunette-riley-reid-gets-a-dp-in-a-steamy-threesome-with-hung-studs-31077441/", + "folder": "20251106_2236_Markus Dupree_Ramon Nomar_Riley Reid_Curvy_brunette_Riley_Reid_gets_a_DP_in_a_steamy_threesome_with_hung_studs", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2236_Markus Dupree_Ramon Nomar_Riley Reid_Curvy_brunette_Riley_Reid_gets_a_DP_in_a_steamy_threesome_with_hung_studs/metadata.json", + "timestamp": "2025-11-06T22:36:52.785931+00:00" + }, + { + "id": "20251106_2236", + "title": "Skinny coed with trimmed muff Riley Reid gives shows her spread love holes", + "models": [ + "Riley Reid" + ], + "tags": [ + "Ass", + "Ass Spread", + "Beautiful", + "Bent Over", + "Bent Over Ass", + "Hairy", + "Hot Naked Women", + "Nude", + "PAWG Solo", + "Pornstar", + "Pussy", + "Sexy Ass", + "Skinny", + "Solo", + "Wet Pussy Close Up" + ], + "url": "https://www.pornpics.com/galleries/skinny-coed-with-trimmed-muff-riley-reid-gives-shows-her-spread-love-holes-56770461/", + "folder": "20251106_2236_Riley Reid_Skinny_coed_with_trimmed_muff_Riley_Reid_gives_shows_her_spread_love_holes", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2236_Riley Reid_Skinny_coed_with_trimmed_muff_Riley_Reid_gives_shows_her_spread_love_holes/metadata.json", + "timestamp": "2025-11-06T22:36:56.876114+00:00" + }, + { + "id": "20251106_2237", + "title": "Cute brunette with a petite figure Riley Reid gets ass railed by a BBC", + "models": [ + "Dredd", + "Riley Reid" + ], + "tags": [ + "Anal", + "Anal Fetish", + "Ass", + "BBC", + "BBC Anal", + "Big Black Cock", + "Big Black Dick", + "Big Cock", + "Big Cock Blowjob", + "Big Dick Anal", + "Blowjob", + "Brunette", + "Doggystyle", + "Doggystyle Anal", + "Fucking", + "Interracial", + "Interracial Anal", + "Monster Cock", + "Petite", + "Pool" + ], + "url": "https://www.pornpics.com/galleries/cute-brunette-with-a-petite-figure-riley-reid-gets-ass-railed-by-a-bbc-60016759/", + "folder": "20251106_2237_Dredd_Riley Reid_Cute_brunette_with_a_petite_figure_Riley_Reid_gets_ass_railed_by_a_BBC", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2237_Dredd_Riley Reid_Cute_brunette_with_a_petite_figure_Riley_Reid_gets_ass_railed_by_a_BBC/metadata.json", + "timestamp": "2025-11-06T22:37:01.679280+00:00" + }, + { + "id": "20251106_2237", + "title": "Mr POV starring Riley Reid Naked Images", + "models": [ + "Riley Reid" + ], + "tags": [ + "Brunette", + "Cumshot", + "Handjob", + "Money", + "Outdoor", + "POV", + "POV Handjob", + "Petite", + "Pornstar" + ], + "url": "https://www.pornpics.com/galleries/mr-pov-starring-riley-reid-naked-images-39106284/", + "folder": "20251106_2237_Riley Reid_Mr_POV_starring_Riley_Reid_Naked_Images", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2237_Riley Reid_Mr_POV_starring_Riley_Reid_Naked_Images/metadata.json", + "timestamp": "2025-11-06T22:37:09.633343+00:00" + }, + { + "id": "20251106_2237", + "title": "Smiley teenage hottie with tattoos revealing her perky titties and neat ass", + "models": [ + "Riley Reid" + ], + "tags": [ + "Ass", + "Big Tits", + "Brunette", + "Brunette Ass", + "Brunette Hairy Pussy", + "Cute Face", + "Cute Hairy", + "Hairy", + "Hairy Erotica", + "Hairy Teen Pussy", + "Hot Naked Women", + "Natural", + "Natural Look", + "Pussy", + "Teen", + "Tight Ass" + ], + "url": "https://www.pornpics.com/galleries/smiley-teenage-hottie-with-tattoos-revealing-her-perky-titties-and-neat-ass-63010314/", + "folder": "20251106_2237_Riley Reid_Smiley_teenage_hottie_with_tattoos_revealing_her_perky_titties_and_neat_ass", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2237_Riley Reid_Smiley_teenage_hottie_with_tattoos_revealing_her_perky_titties_and_neat_ass/metadata.json", + "timestamp": "2025-11-06T22:37:14.542771+00:00" + }, + { + "id": "20251106_2237", + "title": "Nerdy American schoolgirl with tiny tits Riley Reid showing off", + "models": [ + "Riley Reid" + ], + "tags": [ + "Big Tits", + "Brunette", + "Classroom", + "College Pussy", + "English", + "Pussy", + "School Uniform", + "Uniform", + "Uniform Fetish" + ], + "url": "https://www.pornpics.com/galleries/nerdy-american-schoolgirl-with-tiny-tits-riley-reid-showing-off-24451045/", + "folder": "20251106_2237_Riley Reid_Nerdy_American_schoolgirl_with_tiny_tits_Riley_Reid_showing_off", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2237_Riley Reid_Nerdy_American_schoolgirl_with_tiny_tits_Riley_Reid_showing_off/metadata.json", + "timestamp": "2025-11-06T22:37:20.020823+00:00" + }, + { + "id": "20251106_2237", + "title": "Petite female Riley Reid rips off her prison jumper to model in the nude", + "models": [ + "Riley Reid" + ], + "tags": [ + "Beautiful", + "Beautiful Mature", + "Brunette", + "Mature", + "Mature Older Women", + "Mature Pussy", + "Mature Spreading", + "Mature Undressing", + "Model", + "Older Women", + "Over 50", + "Petite", + "Pornstar", + "Pussy", + "Sexy Older Women" + ], + "url": "https://www.pornpics.com/galleries/petite-female-riley-reid-rips-off-her-prison-jumper-to-model-in-the-nude-12420368/", + "folder": "20251106_2237_Riley Reid_Petite_female_Riley_Reid_rips_off_her_prison_jumper_to_model_in_the_nude", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2237_Riley Reid_Petite_female_Riley_Reid_rips_off_her_prison_jumper_to_model_in_the_nude/metadata.json", + "timestamp": "2025-11-06T22:37:24.611918+00:00" + }, + { + "id": "20251106_2237", + "title": "Attractive Eva Lovia & Riley Reid fuck a handsome businessman in a 3some", + "models": [ + "Damon Dice", + "Eva Lovia", + "Riley Reid" + ], + "tags": [ + "Big Tits", + "Blowjob", + "Brunette", + "Brunette Natural Tits", + "Cowgirl", + "Fucking", + "Natural", + "Natural Look", + "Petite", + "Pornstar", + "Pussy", + "Reverse Cowgirl", + "Skinny", + "Skinny Small Tits", + "Threesome", + "Trimmed Pussy" + ], + "url": "https://www.pornpics.com/galleries/attractive-eva-lovia-riley-reid-fuck-a-handsome-businessman-in-a-3some-56531264/", + "folder": "20251106_2237_Damon Dice_Eva Lovia_Riley Reid_Attractive_Eva_Lovia___Riley_Reid_fuck_a_handsome_businessman_in_a_3some", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2237_Damon Dice_Eva Lovia_Riley Reid_Attractive_Eva_Lovia___Riley_Reid_fuck_a_handsome_businessman_in_a_3some/metadata.json", + "timestamp": "2025-11-06T22:37:29.826327+00:00" + }, + { + "id": "20251106_2237", + "title": "Petite babysitter Riley Reid enjoys a cheating husband's big dick", + "models": [ + "Preston Parker", + "Riley Reid" + ], + "tags": [ + "Beautiful", + "Beautiful Blowjob", + "Big Tits", + "Blowjob", + "Dress", + "Fucking", + "Hardcore", + "High Heels", + "High Heels Fuck", + "Lingerie", + "Petite", + "Pussy", + "Pussy Fuck", + "Sexy Blowjob", + "Short Skirt High Heels", + "Skirt", + "Summer Dress", + "Tight Dress", + "Underwear" + ], + "url": "https://www.pornpics.com/galleries/petite-babysitter-riley-reid-enjoys-a-cheating-husbands-big-dick-90908574/", + "folder": "20251106_2237_Preston Parker_Riley Reid_Petite_babysitter_Riley_Reid_enjoys_a_cheating_husband_s_big_dick", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2237_Preston Parker_Riley Reid_Petite_babysitter_Riley_Reid_enjoys_a_cheating_husband_s_big_dick/metadata.json", + "timestamp": "2025-11-06T22:37:36.547337+00:00" + }, + { + "id": "20251106_2237", + "title": "Tiny brunette Riley Reid shows her sexy holes and fucks a huge dick in POV", + "models": [ + "Mike Adriano", + "Riley Reid" + ], + "tags": [ + "Amateur", + "Ass", + "Big Tits", + "Brunette", + "Doggystyle", + "Fucking", + "Gaping Pussy", + "Hairy", + "Hairy Asshole", + "Hairy MILF Fuck", + "Hairy Pussy Fuck", + "Hardcore", + "MILF", + "MILF Fuck", + "Mature", + "POV", + "Perfect", + "Perfect Body", + "Pussy", + "Pussy Fuck", + "Pussy Spreading", + "Skinny", + "Skinny Girl Fat Pussy" + ], + "url": "https://www.pornpics.com/galleries/tiny-brunette-riley-reid-shows-her-sexy-holes-and-fucks-a-huge-dick-in-pov-56734787/", + "folder": "20251106_2237_Mike Adriano_Riley Reid_Tiny_brunette_Riley_Reid_shows_her_sexy_holes_and_fucks_a_huge_dick_in_POV", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2237_Mike Adriano_Riley Reid_Tiny_brunette_Riley_Reid_shows_her_sexy_holes_and_fucks_a_huge_dick_in_POV/metadata.json", + "timestamp": "2025-11-06T22:37:44.327840+00:00" + }, + { + "id": "20251106_2237", + "title": "Mr POV featuring Riley Reid Nude Photos", + "models": [ + "Riley Reid" + ], + "tags": [ + "Blowjob", + "Cum On Face", + "Cumshot", + "Facial", + "Handjob", + "POV", + "POV Handjob", + "Petite", + "Petite Facial", + "Pussy" + ], + "url": "https://www.pornpics.com/galleries/mr-pov-featuring-riley-reid-nude-photos-58732399/", + "folder": "20251106_2237_Riley Reid_Mr_POV_featuring_Riley_Reid_Nude_Photos", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2237_Riley Reid_Mr_POV_featuring_Riley_Reid_Nude_Photos/metadata.json", + "timestamp": "2025-11-06T22:37:48.823848+00:00" + }, + { + "id": "20251106_2237", + "title": "Kinky nympho Riley Reid hikes up her red dress and gets blacked hardcore", + "models": [ + "Riley Reid", + "Xavier Miller" + ], + "tags": [ + "Ass", + "BBC", + "Big Black Cock", + "Big Cock", + "Big Tits", + "Caught Masturbating", + "Dick", + "Dress", + "Hardcore", + "Interracial", + "Monster Cock", + "Panties", + "Pornstar", + "Skinny", + "Skinny BBC", + "Skinny Interracial", + "Skinny Small Tits", + "Upskirt No Panties" + ], + "url": "https://www.pornpics.com/galleries/kinky-nympho-riley-reid-hikes-up-her-red-dress-and-gets-blacked-hardcore-75565937/", + "folder": "20251106_2237_Riley Reid_Xavier Miller_Kinky_nympho_Riley_Reid_hikes_up_her_red_dress_and_gets_blacked_hardcore", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2237_Riley Reid_Xavier Miller_Kinky_nympho_Riley_Reid_hikes_up_her_red_dress_and_gets_blacked_hardcore/metadata.json", + "timestamp": "2025-11-06T22:37:53.310419+00:00" + }, + { + "id": "20251106_2237", + "title": "Petite Riley Reid & busty Lea Lexis tease with tits & flash hot panty upskirts", + "models": [ + "Lea Lexis", + "Riley Reid" + ], + "tags": [ + "Ass", + "Big Tits", + "Brunette", + "Busty", + "Dress", + "Hairy", + "Hairy Armpits", + "Hairy Brunette", + "Hairy Panties", + "Lesbian", + "Natural", + "Natural Look", + "Panties", + "Petite", + "Romanian", + "Summer Dress", + "Tight Dress", + "Upskirt Panties" + ], + "url": "https://www.pornpics.com/galleries/petite-riley-reid-busty-lea-lexis-tease-with-tits-flash-hot-panty-upskirts-89239818/", + "folder": "20251106_2237_Lea Lexis_Riley Reid_Petite_Riley_Reid___busty_Lea_Lexis_tease_with_tits___flash_hot_panty_upskirts", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2237_Lea Lexis_Riley Reid_Petite_Riley_Reid___busty_Lea_Lexis_tease_with_tits___flash_hot_panty_upskirts/metadata.json", + "timestamp": "2025-11-06T22:37:58.188655+00:00" + }, + { + "id": "20251106_2238", + "title": "Leggy white chick Riley Reid strips to black stockings with her glasses on", + "models": [ + "Riley Reid" + ], + "tags": [ + "Big Tits", + "Natural", + "Natural Look", + "Office", + "Pornstar", + "Pussy", + "Stockings", + "Stockings Spread", + "Uniform", + "Uniform Fetish" + ], + "url": "https://www.pornpics.com/galleries/leggy-white-chick-riley-reid-strips-to-black-stockings-with-her-glasses-on-56822993/", + "folder": "20251106_2238_Riley Reid_Leggy_white_chick_Riley_Reid_strips_to_black_stockings_with_her_glasses_on", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2238_Riley Reid_Leggy_white_chick_Riley_Reid_strips_to_black_stockings_with_her_glasses_on/metadata.json", + "timestamp": "2025-11-06T22:38:03.922937+00:00" + }, + { + "id": "20251106_2238", + "title": "Petite babe Riley Reid spreads legs for her lover & fucks in front of husband", + "models": [ + "Ramon Nomar", + "Riley Reid" + ], + "tags": [ + "All Over 40", + "Bikini Blowjob", + "Blowjob", + "Cheating Wife", + "Cowgirl", + "MILF", + "MILF Bikini", + "MILF Stockings", + "Mature", + "Petite", + "Petite Stockings", + "Pussy", + "Sexy MILF", + "Stockings", + "Wife Blowjob" + ], + "url": "https://www.pornpics.com/galleries/petite-babe-riley-reid-spreads-legs-for-her-lover-fucks-in-front-of-husband-51353894/", + "folder": "20251106_2238_Ramon Nomar_Riley Reid_Petite_babe_Riley_Reid_spreads_legs_for_her_lover___fucks_in_front_of_husband", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2238_Ramon Nomar_Riley Reid_Petite_babe_Riley_Reid_spreads_legs_for_her_lover___fucks_in_front_of_husband/metadata.json", + "timestamp": "2025-11-06T22:38:15.767635+00:00" + }, + { + "id": "20251106_2238", + "title": "Petite teen girl Riley Reid gives her guy cake and a fuck for his birthday", + "models": [ + "Damon Dice", + "Riley Reid" + ], + "tags": [ + "Ass", + "Brunette", + "Brunette Teen", + "Close Up Fuck", + "Cowgirl", + "Fucking", + "Hairy", + "Hairy Pussy Fuck", + "Hairy Teen Pussy", + "Hairy Teen Spreading", + "Handjob", + "Hardcore", + "Juicy Pussy", + "Meaty Pussy", + "Petite", + "Pussy", + "Teen", + "Teen Handjob" + ], + "url": "https://www.pornpics.com/galleries/petite-teen-girl-riley-reid-gives-her-guy-cake-and-a-fuck-for-his-birthday-43223033/", + "folder": "20251106_2238_Damon Dice_Riley Reid_Petite_teen_girl_Riley_Reid_gives_her_guy_cake_and_a_fuck_for_his_birthday", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2238_Damon Dice_Riley Reid_Petite_teen_girl_Riley_Reid_gives_her_guy_cake_and_a_fuck_for_his_birthday/metadata.json", + "timestamp": "2025-11-06T22:38:20.128109+00:00" + }, + { + "id": "20251106_2258", + "title": "Elegant Angel Adriana Chechik, Aj Applegate, Anikka Albrite, Keisha Grey, Kleio", + "models": [ + "Adriana Chechik", + "Aj Applegate", + "Anikka Albrite", + "Keisha Grey", + "Kleio Valentien", + "Riley Reid", + "Vicki Chase" + ], + "tags": [ + "Anal", + "Anal Fetish", + "Ass", + "Doggystyle", + "Doggystyle Anal", + "Fucking", + "Interracial", + "Interracial Anal", + "Latina Anal", + "Lingerie", + "MILF", + "MILF Anal", + "MILF DP", + "Mature", + "Penetration", + "Petite", + "Petite Anal", + "Sexy Anal", + "Teen", + "Teen Anal" + ], + "url": "https://www.pornpics.com/galleries/elegant-angel-adriana-chechik-aj-applegate-anikka-albrite-keisha-grey-kleio-85123161/", + "folder": "20251106_2258_Adriana Chechik_Aj Applegate_Anikka Albrite_Keisha Grey_Kleio Valentien_Riley Reid_Vicki Chase_Elegant_Angel_Adriana_Chechik__Aj_Applegate__Anikka_Albrite__Keisha_Grey__Kleio", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2258_Adriana Chechik_Aj Applegate_Anikka Albrite_Keisha Grey_Kleio Valentien_Riley Reid_Vicki Chase_Elegant_Angel_Adriana_Chechik__Aj_Applegate__Anikka_Albrite__Keisha_Grey__Kleio/metadata.json", + "timestamp": "2025-11-06T22:58:04.155758+00:00" + }, + { + "id": "20251106_2258", + "title": "Sluts Riley Reid & Aubrey Kate show off their big butts & give a double BJ", + "models": [ + "Aubrey Kate", + "Riley Reid", + "Sebastian Keys" + ], + "tags": [ + "Ass", + "Blonde", + "Blonde Shemale", + "Blowjob", + "Lesbian", + "Shemale Ass", + "Shemale Fucks Female", + "Shemale Fucks Girl", + "Shemale Lesbian", + "Shemale On Female", + "Shemale Pantyhose", + "Shemale Threesome", + "Threesome" + ], + "url": "https://www.pornpics.com/galleries/sluts-riley-reid-aubrey-kate-show-off-their-big-butts-give-a-double-bj-76348062/", + "folder": "20251106_2258_Aubrey Kate_Riley Reid_Sebastian Keys_Sluts_Riley_Reid___Aubrey_Kate_show_off_their_big_butts___give_a_double_BJ", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2258_Aubrey Kate_Riley Reid_Sebastian Keys_Sluts_Riley_Reid___Aubrey_Kate_show_off_their_big_butts___give_a_double_BJ/metadata.json", + "timestamp": "2025-11-06T22:58:13.317125+00:00" + }, + { + "id": "20251106_2258", + "title": "Erotic teen beauty Riley Reid takes a hard cock in sexy doggystyle fucking", + "models": [ + "Riley Reid", + "Van Wylde" + ], + "tags": [ + "Ass", + "Best Pussy", + "Big Tits", + "Blindfold Surprise", + "Cum On Pussy", + "Cum On Stockings", + "Cumshot", + "Doggystyle", + "Footjob", + "Fucking", + "Hairy", + "Hardcore", + "Natural", + "Natural Look", + "Pussy", + "Stockings", + "Teen", + "Teen Footjob", + "Teen Natural Tits", + "Teen Stockings", + "Tight Ass" + ], + "url": "https://www.pornpics.com/galleries/erotic-teen-beauty-riley-reid-takes-a-hard-cock-in-sexy-doggystyle-fucking-29035213/", + "folder": "20251106_2258_Riley Reid_Van Wylde_Erotic_teen_beauty_Riley_Reid_takes_a_hard_cock_in_sexy_doggystyle_fucking", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2258_Riley Reid_Van Wylde_Erotic_teen_beauty_Riley_Reid_takes_a_hard_cock_in_sexy_doggystyle_fucking/metadata.json", + "timestamp": "2025-11-06T22:58:16.191548+00:00" + }, + { + "id": "20251106_2258", + "title": "Cheerleader Riley Reid shows her tiny tits before riding a pussy-wrecking dick", + "models": [ + "Erik Everhard", + "Riley Reid" + ], + "tags": [ + "Big Tits", + "Blowjob", + "Cowgirl", + "Fucking", + "Hardcore", + "Horny", + "Pornstar", + "Pussy", + "Pussy Fuck", + "Riding", + "School Uniform", + "Slut", + "Sneakers", + "Uniform", + "Uniform Fetish" + ], + "url": "https://www.pornpics.com/galleries/cheerleader-riley-reid-shows-her-tiny-tits-before-riding-a-pussywrecking-dick-41471787/", + "folder": "20251106_2258_Erik Everhard_Riley Reid_Cheerleader_Riley_Reid_shows_her_tiny_tits_before_riding_a_pussy-wrecking_dick", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2258_Erik Everhard_Riley Reid_Cheerleader_Riley_Reid_shows_her_tiny_tits_before_riding_a_pussy-wrecking_dick/metadata.json", + "timestamp": "2025-11-06T22:58:21.023626+00:00" + }, + { + "id": "20251106_2258", + "title": "Lesbian girls Riley Reid and Melissa Moore lick and finger fuck each other", + "models": [ + "Melissa Moore", + "Riley Reid" + ], + "tags": [ + "Brunette", + "Fucking", + "Hairy", + "Lesbian", + "Oral", + "Pornstar", + "Pussy", + "Sexy Latina", + "Teen", + "Teen Lesbian" + ], + "url": "https://www.pornpics.com/galleries/lesbian-girls-riley-reid-and-melissa-moore-lick-and-finger-fuck-each-other-13944363/", + "folder": "20251106_2258_Melissa Moore_Riley Reid_Lesbian_girls_Riley_Reid_and_Melissa_Moore_lick_and_finger_fuck_each_other", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2258_Melissa Moore_Riley Reid_Lesbian_girls_Riley_Reid_and_Melissa_Moore_lick_and_finger_fuck_each_other/metadata.json", + "timestamp": "2025-11-06T22:58:26.176526+00:00" + }, + { + "id": "20251106_2258", + "title": "Naked blonde chick fist fucks herself to strong orgasmic contractions", + "models": [ + "Riley Reid" + ], + "tags": [ + "Amateur", + "Beautiful", + "Blonde", + "Glamour", + "Hot Naked Women", + "Model", + "Pussy", + "Solo" + ], + "url": "https://www.pornpics.com/galleries/naked-blonde-chick-fist-fucks-herself-to-strong-orgasmic-contractions-17634641/", + "folder": "20251106_2258_Riley Reid_Naked_blonde_chick_fist_fucks_herself_to_strong_orgasmic_contractions", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2258_Riley Reid_Naked_blonde_chick_fist_fucks_herself_to_strong_orgasmic_contractions/metadata.json", + "timestamp": "2025-11-06T22:58:37.951805+00:00" + }, + { + "id": "20251106_2335", + "title": "MILFed starring Paige Owens, Steve Holmes Hot Porn Pics", + "models": [ + "Paige Owens", + "Steve Holmes" + ], + "tags": [ + "Beautiful", + "Beautiful MILF", + "Bride", + "Brunette", + "Cheating Wife", + "Fetish", + "MILF", + "MILF Pussy", + "Mature", + "Pussy", + "Sucking Cock", + "Teen", + "Teen Stepdaughter" + ], + "url": "https://www.pornpics.com/galleries/milfed-starring-paige-owens-steve-holmes-hot-porn-pics-65759020/", + "folder": "20251106_2335_Paige Owens_Steve Holmes_MILFed_starring_Paige_Owens__Steve_Holmes_Hot_Porn_Pics", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251106_2335_Paige Owens_Steve Holmes_MILFed_starring_Paige_Owens__Steve_Holmes_Hot_Porn_Pics/metadata.json", + "timestamp": "2025-11-06T23:35:19.445466+00:00" + }, + { + "id": "20251107_2029", + "title": "Young redhead Alex Tanner shows her petite body while completely naked", + "models": [ + "Alex Tanner" + ], + "tags": [ + "Amateur", + "Amateur College", + "Cute Redhead", + "Ginger Teen", + "Kinky", + "Natural", + "Natural Look", + "Natural Redhead", + "Pale Redhead", + "Petite", + "Pussy", + "Redhead", + "Redhead Freckles", + "Redhead Teen", + "Teen" + ], + "url": "https://www.pornpics.com/galleries/young-redhead-alex-tanner-shows-her-petite-body-while-completely-naked-63489082/", + "folder": "20251107_2029_Alex Tanner_Young_redhead_Alex_Tanner_shows_her_petite_body_while_completely_naked", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251107_2029_Alex Tanner_Young_redhead_Alex_Tanner_shows_her_petite_body_while_completely_naked/metadata.json", + "timestamp": "2025-11-07T20:29:27.087119+00:00" + }, + { + "id": "20251107_2031", + "title": "Young redhead Alex Tanner demonstrating her perfectly smooth pussy", + "models": [ + "Alex Tanner" + ], + "tags": [ + "Ass", + "Big Ass Redhead", + "Big Tits", + "High Heels", + "Panties", + "Pussy", + "Redhead", + "Redhead Ass", + "Redhead Teen", + "Sexy Redhead", + "Shaved", + "Shorts", + "Teen", + "Tight Shorts" + ], + "url": "https://www.pornpics.com/galleries/young-redhead-alex-tanner-demonstrating-her-perfectly-smooth-pussy-26775799/", + "folder": "20251107_2031_Alex Tanner_Young_redhead_Alex_Tanner_demonstrating_her_perfectly_smooth_pussy", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251107_2031_Alex Tanner_Young_redhead_Alex_Tanner_demonstrating_her_perfectly_smooth_pussy/metadata.json", + "timestamp": "2025-11-07T20:31:21.604057+00:00" + }, + { + "id": "20251107_2031", + "title": "Blonde party girl flashes nude upskirt & gets cum on face in hot orgy", + "models": [ + "Esmi Lee", + "Brooke Wylde", + "Gianna Nicole", + "Tiffany Taylor", + "Nikki Lima", + "Sasha Summers", + "Alex Tanner", + "J Mac", + "Sabrina Banks", + "Dani Desire" + ], + "tags": [ + "Ass", + "Blonde", + "Cumshot", + "Doggystyle", + "Fucking", + "Hardcore", + "Indian Fuck", + "MILF", + "MILF Hardcore", + "Mature", + "Mature Orgy", + "Orgy", + "Party", + "Redhead", + "Redhead Doggystyle", + "Redhead Fuck", + "Redhead MILF", + "Skinny", + "Skinny Mature Fuck", + "Teen", + "Teen Orgy" + ], + "url": "https://www.pornpics.com/galleries/blonde-party-girl-flashes-nude-upskirt-gets-cum-on-face-in-hot-orgy-17122410/", + "folder": "20251107_2031_Esmi Lee_Brooke Wylde_Gianna Nicole_Tiffany Taylor_Nikki Lima_Sasha Summers_Alex Tanner_J Mac_Sabrina Banks_Dani Desire_Blonde_party_girl_flashes_nude_upskirt___gets_cum_on_face_in_hot_orgy", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251107_2031_Esmi Lee_Brooke Wylde_Gianna Nicole_Tiffany Taylor_Nikki Lima_Sasha Summers_Alex Tanner_J Mac_Sabrina Banks_Dani Desire_Blonde_party_girl_flashes_nude_upskirt___gets_cum_on_face_in_hot_orgy/metadata.json", + "timestamp": "2025-11-07T20:31:35.064524+00:00" + }, + { + "id": "20251107_2031", + "title": "Mr POV performed by Alex Tanner XXX Photos", + "models": [ + "Alex Tanner" + ], + "tags": [ + "Big Pussy", + "Big Tits", + "Blowjob", + "Curvy", + "Curvy Petite", + "Handjob", + "Legs Up Missionary", + "Missionary", + "Natural", + "Natural Look", + "POV", + "POV Blowjob", + "Petite", + "Pornstar", + "Pussy", + "Slut", + "Sucking Cock" + ], + "url": "https://www.pornpics.com/galleries/mr-pov-performed-by-alex-tanner-xxx-photos-99243967/", + "folder": "20251107_2031_Alex Tanner_Mr_POV_performed_by_Alex_Tanner_XXX_Photos", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251107_2031_Alex Tanner_Mr_POV_performed_by_Alex_Tanner_XXX_Photos/metadata.json", + "timestamp": "2025-11-07T20:31:48.239211+00:00" + }, + { + "id": "20251107_2037", + "title": "OnlyFans Luv Hanna Zuki Luv Hanna Zuki", + "models": [], + "tags": [ + "Amateur", + "Asian Lingerie", + "Asian Model", + "Asian Teen", + "Ass", + "Beautiful", + "Beautiful Asian", + "Big Ass Teen", + "Brunette", + "Brunette Teen", + "Lingerie", + "Model", + "Perfect", + "Perfect Ass", + "Perfect Body", + "Perfect Teen Body", + "Teen" + ], + "url": "https://www.pornpics.com/galleries/onlyfans-luv-hanna-zuki-luv-hanna-zuki-52529080/", + "folder": "20251107_2037_Unknown_Model_OnlyFans_Luv_Hanna_Zuki_Luv_Hanna_Zuki", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251107_2037_Unknown_Model_OnlyFans_Luv_Hanna_Zuki_Luv_Hanna_Zuki/metadata.json", + "timestamp": "2025-11-07T20:37:13.826670+00:00" + }, + { + "id": "20251107_2037", + "title": "Hot babe in a sinful bikini Jayden Lee blows a big rod & gets fucked on a sofa", + "models": [ + "Jayden Lee", + "Marcus London" + ], + "tags": [ + "Asian Blowjob", + "Asian Cumshot", + "Asian Fuck", + "Asian Hardcore", + "Asian Lingerie", + "Asian Model", + "Big Tits", + "Blowjob", + "Brunette", + "Couch", + "Cumshot", + "Fucking", + "Hardcore", + "Lingerie", + "Model", + "Model Fuck", + "Panties", + "Pussy", + "Skinny", + "Teen" + ], + "url": "https://www.pornpics.com/galleries/hot-babe-in-a-sinful-bikini-jayden-lee-blows-a-big-rod-gets-fucked-on-a-sofa-16020943/", + "folder": "20251107_2037_Jayden Lee_Marcus London_Hot_babe_in_a_sinful_bikini_Jayden_Lee_blows_a_big_rod___gets_fucked_on_a_sofa", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251107_2037_Jayden Lee_Marcus London_Hot_babe_in_a_sinful_bikini_Jayden_Lee_blows_a_big_rod___gets_fucked_on_a_sofa/metadata.json", + "timestamp": "2025-11-07T20:37:31.031921+00:00" + }, + { + "id": "20251107_2037", + "title": "Evil Angel featuring Aaron Rock, Alexa Flexy, Mia Split Naked Images", + "models": [ + "Mia Split", + "Aaron Rock", + "Alexa Flexy" + ], + "tags": [ + "Amateur", + "Anal", + "Anal Fetish", + "Ass", + "Big Tits", + "Black And White", + "Hot Naked Women", + "Interracial", + "Interracial Anal", + "Interracial Threesome", + "Natural", + "Natural Look", + "Petite", + "Pussy", + "Teen", + "Threesome" + ], + "url": "https://www.pornpics.com/galleries/evil-angel-featuring-aaron-rock-alexa-flexy-mia-split-naked-images-71699035/", + "folder": "20251107_2037_Mia Split_Aaron Rock_Alexa Flexy_Evil_Angel_featuring_Aaron_Rock__Alexa_Flexy__Mia_Split_Naked_Images", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251107_2037_Mia Split_Aaron Rock_Alexa Flexy_Evil_Angel_featuring_Aaron_Rock__Alexa_Flexy__Mia_Split_Naked_Images/metadata.json", + "timestamp": "2025-11-07T20:37:59.865361+00:00" + }, + { + "id": "20251107_2319", + "title": "Sexy mature with big tits Alora Jaymes gives head and gets rammed", + "models": [ + "Alora Jaymes" + ], + "tags": [ + "Amateur", + "Amateur Blowjob", + "Amateur Deepthroat", + "Ass", + "Beautiful", + "Beautiful MILF", + "Big Tits", + "Blowjob", + "Brunette", + "Brunette MILF", + "Fingering", + "Fingering Panties", + "Fucking", + "MILF", + "MILF Deepthroat", + "MILF Sucking Cock", + "Mature", + "Natural", + "Natural Look", + "Panties", + "Skinny", + "Skinny MILF Fuck" + ], + "url": "https://www.pornpics.com/galleries/sexy-mature-with-big-tits-alora-jaymes-gives-head-and-gets-rammed-54684463/", + "folder": "20251107_2319_Alora Jaymes_Sexy_mature_with_big_tits_Alora_Jaymes_gives_head_and_gets_rammed", + "metadata_path": "/home/stu/Projects/PD/Goondex/Galleries/20251107_2319_Alora Jaymes_Sexy_mature_with_big_tits_Alora_Jaymes_gives_head_and_gets_rammed/metadata.json", + "timestamp": "2025-11-07T23:19:54.823362+00:00" } ] \ No newline at end of file diff --git a/VERSION b/VERSION index b2ceef6..724c927 100644 --- a/VERSION +++ b/VERSION @@ -1 +1,2 @@ -v0.3.5-r1 +v0.3.5-r2 + diff --git a/assets/logo/GOONDEX_logo.png b/assets/logo/GOONDEX_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c9b1a40b961d21f8c643e2d06668f0db1f03d07a GIT binary patch literal 13303 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 NE2$(=D{dV0zW{RHi?;v( literal 0 HcmV?d00001 diff --git a/assets/logo/GOONDEX_logo.svg b/assets/logo/GOONDEX_logo.svg index dfb7360..1bf3bb8 100644 --- a/assets/logo/GOONDEX_logo.svg +++ b/assets/logo/GOONDEX_logo.svg @@ -23,15 +23,32 @@ inkscape:pagecheckerboard="0" inkscape:deskcolor="#505050" inkscape:document-units="px" - inkscape:zoom="1.5483025" - inkscape:cx="269.00429" - inkscape:cy="227.02282" + inkscape:zoom="2.1896304" + inkscape:cx="898.55348" + inkscape:cy="158.70258" inkscape:window-width="1920" - inkscape:window-height="1080" + inkscape:window-height="1048" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" - inkscape:current-layer="layer1" /> + inkscape:current-layer="svg1"> + + + + + + + + + diff --git a/assets/logo/GOONDEX_logo_dark.png b/assets/logo/GOONDEX_logo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..a286bba89500f17523efc06f354b78ce6e6ff7ed GIT binary patch literal 15212 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 literal 0 HcmV?d00001 diff --git a/assets/logo/GOONDEX_logo_light.png b/assets/logo/GOONDEX_logo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..f29d3a1ffc57eaa16e3fef313ca2ffdc40c706de GIT binary patch literal 11903 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 literal 0 HcmV?d00001 diff --git a/data/faces/faye_reagan/thumbnail.jpg b/data/faces/faye_reagan/thumbnail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8925000bc368ea3e6a41d6e06edaba78803d87d8 GIT binary patch literal 27153 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 Q+WgO@r8iFv2**SJ*-L5B)&Kwi literal 0 HcmV?d00001 diff --git a/data/faces/j_mac/thumbnail.jpg b/data/faces/j_mac/thumbnail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..471f58dc6ebd02135143a3b1b0a2cbc5d53551b0 GIT binary patch literal 18662 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 Mki1hzB7i^t*$?J;b^rhX literal 0 HcmV?d00001 diff --git a/data/faces/johnny_sins/thumbnail.jpg b/data/faces/johnny_sins/thumbnail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f6db50e6d12e4fef30378bf2f36294cd4a3a2c0a GIT binary patch literal 17636 zcmbTdWl$VX)IPd+AV>)A9xS-K1rHEBc(B0Y8r*{fcfvw&w++GF-F0zUWP`KlqWSZC z->Q4R+z%a1HhW#1~`@f6-I{Dv6kvPt>1J(vu9TIWO-ZZlZKjQrb7@c*Fw53>Jvz(W6j zA^X38{olA&0N5xwP0v=d^}8V!{jNX4!*D( z<&<=M^eStREm>C;A`)MmpDf%@h-N?JPJExSkDbyS)ugZMCQS6_)H znHs=1cN%|ed6TayH^(b4QEeEx;mE7ZAIOaQqB4jk?}fIBZsL1S^=`bbxBun#Fq$N@ zb^q)M?IMt}KWh7FJ?qa;3t~uW4#|HXN;$PDy(G zPz-d=LsqoEV#sjB`%Il>r@c^D1{dmQ{|CSypF7l~r-bd*e7)?S?#6Z%7QU{cnD}ag z0TW2#I2vJPn()zef4bziBd?nMgGVmi?7snCj{2ovSN>(^h=selibQa2nt zqa$Dyz;L4NC`&5oe*i3ameI9%?cNK4os@`6t%i7!w+Bl>9_07f z)KZxSxoDZYIlZUkG)j5BTh~*_*%dn5h$)r*c9NYo2`98@H=-#wpPI}!X=`RKQXY^7 zvT}xfYfSBLma_ud&E!DZ91VWiCC4gO6F?&6!YgIMpYe)zqbw(^0KM^M9{l)%a-(kS zCHi32AsZHl@N$OPF&_8D20c^&C6=o^VA~djqrggdfN$)ph`Ij0{8bq#wnyG8K?i;x zx$#Nhq|YGh5{w@(Likpq;`7i*bX>@L;d1TMX=H^gTs!mO2?fd2^Rf7Pq+GHg;WI5v zbUQ)^O6^Afo&cVoYnkM5&=PW(1#zY7N=vbTxYQW))gfpn< zyAiIhqL`3rom8#1bU)T7I+EbH9{cl)g#E%J&Q5Aal#!Wg2Fh#D-OzTzkMx62s?0Qo zSE>@SM)pxP)w{H;QyA3&k|b|nM3xtiV<^Xm!b`Um1J)cA{d{g4E(iU7C+sKOs z5Vz^7X3-OeCc0{&B!K|qX6>w30}s8q(s*%hd>@rx^Jua44f=;8HE6ucN5+DWlFnoN|~m)ZlKoG^7hIeTl2NOv=+!FAIxyx;bqqU7c__+NibtxA}7`R!l+ha&Vr z+IRt&oj*oXZI}aP=|Np|oPgwVr7S^klt157N=SX%ooP35VYy6fLN2iSyt8{#(ybdW zQ<&4T8Qm9B|zz?^4MV;joCi2UT4VUE?6}ZY<=pgIi5*TF;>1De~lXa zovuTf3zhXOIX1a2MZrypCT{ zq!PqgLF_LAP5EY9KC2bCe7cDvF3%=z$2i~zj<^;EJ6fu3)f(QVY@b#VUy0p;9nXo2 zxiTr7cf{RI8?id-r6i!(T^q0;N1Y@K?`EAduw{3#t{nxhxvCa*j_SQ`z!dd~#sx}v zwEG`RRZ zne0!f^H%pW@&Ijoz@~3D0YSTJ`1sw8O$dZ6d2cPf|1UwLL6nb8aj@@-8qH#2ex)D-+R29VYqQ? z!jGMLWz5%U3<8(W#cl+9;H-g(*5sBOGAfK?0eOWqFL%xMztR0ovp<+(-#zNGm%gQA zTZ1I%sVlB+A1t%SraOzuHCztpw%Ej;qU0KSytho@Q2kc&d5m_ynN4u{#U|BshW!I$n_fmo3qn{0B!8@Mq$Tr&QbGK)nQ28!t%3Qw#mxTz)ruK=U1J)qVFO62?jV33NBpmrQryr`q^+6R zVAi>mYJTi&o!~DP!HmIM`^AAuk_&_eCt8v_vAAL&ef`(GetPuzaI{CmZ&?EU)xiwT zd+H7TBB<~s2*!h|_swQc5Z>1=pbpRIvqeGuf~dMl9IJMkVKn}FF3IyWHCv<}JZ`?6 z)4zPl6U;Tw893Y1b7=Pu@Z$`&;ORF8ar-dGha7OkI!`K_66*y{N>leyuDhy2do@!? zdVMIU6jLImOQIMTow5O@KmF)5)FH!YKBBc5=Q_gZS8sKy$jCO*)*+AjpuTvJtCG1; zpjDW|_NRw61MB;K^Shi%!nd@y+M)81zOxoC}Fo&Q96R@v8!%X zE|WZw>kU2ZS4xFnt6HXhdoOAoXOQW6Bz(*DbLqD9^SX&C14mz)|2dytO=4=%r%Zos zi>w(1j1EQXoug_|6Ho?qyI!lr{CmC6F(F5)bkk=H%bqrGc@CATiH_w!hY?)y{$l0e zX3N{>acXzgSu|iU!4AYKq4Yv;5C*6N8<+KhUyXEQ@LyhkhDLAOR*DpM*wAq4G9&<+Kf<1w!eVJWIcJ@ z%AN`G&(~JNJ{X-YJamdsH%uaeG%wB!j8E3qu>RHry3V%J&nadx&M^ijxA5ObuOkN8 zWR?E%=_pBQ4Cc8e%Fdt7!OK{X(`E(F27jS^@hn}xI?(Kc!1FNvB)i|uhJ=JD-?}MJ z(4|QAN#n|5l9sbE0dR4Y+C!uXd&^*i^-AkXMS2`7!Avnr^I%4xlc@o*!0Dt58ye~Z z(g--?A7CrbtVt*$5O6TDRlktT{!ke(L)XomU^dw7P8mqU+1uI>v_1I<<`}dQUfMdJ zX)mt5#!1gFwZk^Aou^AHeCQQH8t{MV2Mq%e=0%~p^_R&q0;gX8`|}h{Q)z-fbJ+wm zmq3kl4lK>en2?*XO8@&=IB<#j6=DXSv^Upaoo4!m8!#9o3NOu`9{kcV!FcaOV`7nPck0yw{ezKu4*TJy-VFw3T36;bg!HU}xo9%qPs_u~=)1V;7ap`MRN4 ztcHc{{%K9zRgzKMtBQR7Fc$QU9;EO~Mp}AEfTJP%?FVXQLK<0n!LtED;x`|y5|Inz z*@qv2@ILLih8B+Fb^qFF*haa$hv3a<4y>tk3D**+Ep>+VX}Y(YAr$l29@g9`Y&_x} zCoqlDN#1Hgvy-00{;H^xBC@$!E1A{O;y!1UWT_;i0$9_(+cFJzd(gwIbLsFYe~*}8Q~^U_0Wa4w2nL+lUr?XGDfwF zl;^Nt_m;gV3zag!t^@LWM`*sk;}2-moRZR4r?I+<xTS_#INVR2Xaj&aSA zAKngEM4a!kAv0*z#SPsrw(7d=BPI;FH3)!URv@qPtqCLVd9Tr;ioaNH_=@ucP9N(V zVkk+ROeLigXOZ^XED5B7uf``jF^NlFc<3Dd%-y+g_0wMpn)&g7bTnuAAAr7tS*9&O z@Z|j!Z25I;k}1y?>yD_7cBSX37^D=Ta{9baM=Sk_(n;XTTXa%&LyCRE#U+B?xC>8v z2HN%@uu$2>v|3iP&1B%%AAC&&JDq*SK^c-X@vW6HPVi@qFQiu0a_2}MXt7ZFc4^AD zPWOElr{aUI1MGLTx+_iT&ZnfX=*;^-0qo7$VA^J~vP8g|&SYM^9pOW7FwG+96Ozhj zE<-IhUKXVC*<#bs0xj8dvH3E$JZLbhi15KsHGZOUPdSbG_gJrzRk`fMAVYxXeO3Vd zDWXx(NNF=U#VkVVT&u&~46*Q_wQOK;q!o3tqGUiADom??Vm6pSII^t~(Hc>Z^8Ft` z?x$7m4Nf4fx5Y{4yXR?8WR%rA`Njp9mhV3R&5NJYNfTqIP(vSwHhc1nar}(8{p-B~ zGk5ZAwxPyENrLLRR~Yk*Kbm8S9WR+H`b@h=RR`X-NtNN*%{+G5-7$L${Ito@+}zpT zh5%hVqPxUfe(`kNMCCimQoMbCsk0r(W)b{-`fDA~si>9sa+eWnzHnx29SA10i)eYt=yzwcnNXrZf=G=S)Oo<( z88ax~_78W?#|RcTq}!p{_L%;lH=c2dLVWVg1 zh|xo_^mGZ`(A_N*W9qJ*&8U0bOS1zFFIVd0;Gcu+SeH=TB=2ghQOrpsJe?Hib9IRl z$L!yyY)ak)m8*a>71u6~DcoWQ2~`0J4e4|6Nzl$ZWemmG>mqBK{=P^1yz_s6leitR z1bi90Gnc575l-PJd%W$Otn*uFi`L?{(@!^R7pb2$rP@!w-d~NN?WMIkp|B|6e5o)m zEsV>AU`tA}suQ$p6a~I{p7HXHb?NaEQ!+!@x4Y$_8TbY%HXas1>F_r=&+P+6B$d&x zaU*@!pEeYVT3MqXV%b*oh5pLBvRU|YS21^cD-n2cGf6tWFE4Qth( zgT1w_-nM@yZ$L$6l5@0>Ho>H57y*t4z&hN4czC>x9+ z-7kLcScX)?WNy($YFDQilE~em8qLk@dD_4dz8%24WxN37>^`2(hvRj|I5kZJc$BG+ zo@6Ka<<{YIV0w9;)t^q%#^3*osz?Od#n;a9ppEzjad(8i8^gsop z*!7;e)EtV#Ii~q1jZrxjzaeC3&!jOq^fetBRpk+IM8NxaYOJy(qocVoifDLBTQ4=G z=R`MubSgp1ZW=(j2)4}l#(*8G!{_nH<{RpK@bQ(=X>PH;h>V_wN>rJIEm9_PHCtPHg)Ck?6=DhH4#??3Wv~o*?R#`|zPkmyh#v?~5I?f!?vDBZS-gUX{>mozl*g@}k*tpD~eFPz! zY_525`N_`j&Oy#8xs^x7uYpssK{#Iw4cDXxb~x@JW)&66C3Q+&yj%hk2I|a7P_u2S z%FoIj37}Mha<|1?zLbYKtwZwCrJW6m2K`_kOP@nLl|e`Y14E4e4*#BJ+2^xTc@YMZ z!IkJE*LInf8!#av0XM&7W$Z@yVqM-(egK?4KH%kgU>p?dA$+Ys=ZIh^cJH~APzNn} z6nf_pKdMf*+Y}t}tO0M{Z97|y4=PMfl~OMhLeG{1JcGU``pYzTw8Z-?hYiNd1_LBJ zudgE`{h79Y0gGm@t3~mIP6sc(2_(P?ww`}C{_*xw>$I7h(a0djOa0oJz%tIghSkGTs=lK0}Q9jCHKXCOvW>PVQ-qB#B z?=Clp+i-lC_se~!288B@QFH0Gy_KWq#-YAI=QA_%r$@xtz)|{U#3xIXc64d=lOF@l z)20US2*xT8M8#@$5-a#N8oO*ZaS$1OqD6W_qW;6-ci7Dn{*8jkH7SNP`CDuYy{bu% z%pIQ*riVb36`3*Wg%$6h?V+fzO$4MgmjZshj-UP;P zaJ}Js)%S&e^U3!LjN<(dpnyo(3U8WrT3G$|ZOGKaYR%Z-swLbT5|$?9y?OrrNN8rw za7|Q5d%#uH`l;WrzKrxs4!eAQ~9>I7? zdTG1}ChA-F>3_`IZxWvpk%ciM{}GpQvoPb(`C8&|_4`jOsKum){=%&fROG%c{K@ znTOgG({2x-fIPLK)eE)y5752hr=SHL6moDg;4|Sa#^kh&uE9-7ONWIVO1#(6o=^P8GwDl!wZFgT=4Pik^>^SP2YbPnR zor$XENBj}{PDI^S^qSqBO&SS>7Rj*PM7X-fTJ=3x_u)*2|8qvGseuc|JQUV5*?^lTJY)RZI|7bvkT2ZYG>!Qm~5^B^I)W zH@F#=OXM%NQ-0>zLR3G+&(GE}3_CJwAy4RzYPWn4KMG`z;*&`GNhb}S+>EBC?r8YY zK0)xPB(3tO*V#|)gT-}dY0mL9=Ws`^uZZ79w6*`Evi4~kfC&_{0vT=i+N zxL$$~Cjzf%GWxwy^;e$B=h}&CSesgsnQ~nzkab_SBQ`h`{f22B*U^^*R%oUTr_+;V zbH-^5<#2;s3=5vOx(6EWlbuA*Q(c6e`2Iq3fy{;`MsaM1pOO`fxa#)S2Ls4Ea(g%E z&pGQ{G2))d2H`RM`0G`_J~mVQmdu0HJfb`$i#x-Up;8f3j&A(Z05s*^h^<7)(AKVm z&2zN`wC8@_!4>@&PB8iYnu)Trq-#sCg~+YlB_EMW4Y~KvE_UCX8%>oO3<7NS-1eJ0 z>X`>NTfLR7p(RS`wpljKZ;VJ!j=+nJTdnZIrtq}< zt0AI$lWps8{-3kxqyM=`Elf}0%UiB7$pb7S>jeuv<}3pro0o8Xh6K*EU*DuUI%_oBd!rY!4~GQ8Hy68XW6d1ulNSc%3R$O`!QowwK@sV>IR3`1 z8=1}xRM_$TUgD4`So3EUp8l>sfg#;39Ump^mPpPQ^sek5Pkm@kn9s*PA_lfXzFNha z6sa{TNKh`}12*pg+;Lmp_F)^Q|ES zuXD9S6@IRy>50EtRhKfHeJZWziVCWyi8Jq*7cd}S9bO`q8RP~$p}9OGpPyE~c&=lP zZ&2LAh8!S^FJT;38)!APP!9e+nr3q6LMJsrf8VkM*gb|PKXME%Wum&-&>^XCb{uoQ zkB4n5X!yYei8hK|nCj?g3iluxXlQ4o{0@p?2*>*la%@bikhdnkh(`hkViD7#1q9-z znyZdKW{3@_;{WJ!qj<4))`t%k}`cEXe4j62Ro& zC?Oh7rAHr=WXSSfC2l{%!3dJ)nA-e9t@zd+W92-lB+c=OY!wMsfx z`bp1AQb_**+iu?I7wj13Ub`nzw0EuK*TWgLrL49s%m)Sw#p(@0WR*38h>!9P)NBF= zVk(?RyMc;FW_X=!kHU+qGV}gaVyi173H3^%35MXE+-PdD^TuE&&mYi`%h2j0v$8JY zKvHjZlk;!om3E>k?Ui;D&G!&!#>w{9iM;__U?Xii)4xnlOBXQ7Z4bSS#hdpDNSRfi zntm#cY%VaC6T(WJw9U_K*%pHO z^r&g0=MP20`@7R7$tvagI`QYKzmkx!RCU8AJl@6tIdYH{)|)l;$^AF3W38i-XB<3& z(5m<09HYhkMI{^8e?bZ1{Hv}PM3n9W-s(y4NDYLB2(Yd}(NbNi2_vM2bD-!Js|toF zuGTeG6T$ukYD-ISsr}tp_wZBXrt)_s`V}cy@O)_S7s-H1G7zGoXi6ghX^Ok*ajsXX zcrLCi_~q*wmpOqYK$&8Ox%o&2PlJR?G6EsnJZ~q-CcVMcT`w`1SN1O?+cV1YVGa?{ z|L;OEjg5FCKo~p)>|`?-sCXI04Xe|oxKFz&X2rR+iydw+thUF9xNcb$k18fI>ne~E z&+vw~WwyV!n9QGphHj9s@(Y{!B`H@R-kB7CJNpip_>lu{=`982C`xalb|)gpQHj`s z)c##*ifs3C_^tRp(2|o7X|dh%`Sm*Vm(+G?e=lrqj?~_=`AU1G-SWoqspRaG z-%(0i^vByGyIEH8{dTr`SUQwhg}g8Srdc%AJApHTlReq(0A_h2!O%@`V9IRdRks!) zZ=7^y_VF+E3;*!ltXEE}L9Unm3!WzE{A~F@>;B9!fYkX5XEgYDR(NDc;A+3v2XOu| z{U{g!z`ovs%v;x%zGtXtk`jWdAV8nXwqY}scWIqyMJqWS;bMEu;|j`O6sm3Ffm z*SgJe)6qWhSU(T2Et{OpN=NK_N0q0k@QMB6xNmxffpVOHA^Kd5bs80ACH7>NCWmaS z1MxqGR(VMSl35G@Zd>F!Y;sw?o>C=uwY*o8XaHD}(iZglLp>l~Y(GoGJSiF(+l>YJ zov{C$66)@36N4u$Ssq4V_BpGN6NV>#EXY;*O*Sr&n=g<_dGAqpA?hC>mjpcY4-l7r zzUF;;x^IOoB&C_N-}NPsfjRRWre_>97V{6l_85a``D%@b@v;gqelF=W`ym)veoq4c z#+LteF-4xYXnZg!!pakG-_l#Co@iYc6{8FpFh3yHw1uSnVB9NW)Xn(y;e=N?*$?aP zXr0C@KHU!+IVS@t4OKHt>*UhPA#v zyhRk11cGI`)+y?d=XQWUxCCLH(U`y&)-D=#8P@NtAY2a$#xL`iD3H$RQE<+rbIKK+ zV$1?pVP^Hn1n(F+;^XP(my}WGK!d=no&q3Lh~ezsgEzFZGJI@xxUOw4p-+Qe?s)py zWh%a^JsBZLkX-4^l?llbRkCA$+(1CQS7-!JX597iBO{a3Z5jviYj3xiP> zp5Gp1h?d?2&)4*^TOsjT-a)2K>F2;Tj<3>}LvD#+qBjZr$g)Tn;#gO#qda;IGkZH_ zE$sCM2yHn2BNCgzQ>$!Duxh9Gqy3Wh4iPwN>+_X86oL&{ZHvBh)=%GGaf`yVaB zyC`7JQlo5_@HK}%T$puscBt%mV3QQ00Y5YtDia29Q9L)?o15sUNLFmB;S1P2}E;>|_jGgO@a3+jARwi}o(t;Jm-#Zcbgz#CF39u=}*v+NY0?3SrHS@f_2^`f9wTjct7@~`l} zc0dC0{hz->U7uKxiOsV?NK^Dhwn+TtfTNsLBli!p>LM7`a$Da2I;Ry_*hnau@_#VCLd>vi)MEAOdI+SXUETnxGgWKeZc71TvQre z<5r9G0{AnAMM3CIA)vCrVy1QV36i={Xi30v^&vn_OV)^P3HDPO% ziZag^tU;Ykf#sRVep&sPW1GP7^Y@F#=|8m=cd0g2u3}=WruoVGxKUd~Fpf;kA0$j9 zb1TPef|2{?&IQ&UKP(ieVSV0Bt??PIVjJ)a`qVcv8dtpU-8A4FCA9>Wn5{E+Q=&TB zr=fmc4?2(a&aA(w?b0y-Y|saE1h|?hBig!!as(KomI|&`H0WDik{EiPaS>TtDJY8c zhip|3mLDm17!uv*^&8S>ds(0F{{ejVp)C8&KO4RS1=gK+g|-q-^tY!-mlXXN`BZjj zyqNFx>;L9binF>^Bri>!_3T`M6D3jn*)wkJ;C{AJZ`;T06%4joiAa zi&90~GPxVNZ>89&!ow{77cTYJauY~s~UCy4AlNIxF( zVcsD9ZhY|&LZ1tKutB`QyZA@8=!Q4?I>7Q7bD$FV4}b$1Aja{BIP-jp&>xf%9X>yM zBp}&&SGz5?NfyU>>zVnq@?#T7eH|_?VNlttIHNh)>`tJ5Sys4m2oYy{abP`!G8`qE zW%;s0ak%{jzAV{x5Bb&wIKv}*JNa79C2B$_Q&vW57v)m^0rD0js-*@dL^TTzb0{Ok zBFI)Gq|QJy^VLnPix=%^R;5@!%$#}r8MY|=CRD`u1n_Pwz6Mee zhCDR?c-Dm)5)H+QGndI!dMBtWS!%brTs>C4tO?6UH@i1$yPFp#^*QL zJ8RLC&jTyvQ!#yWc`fB5Vm^mo4-IkFBq^<1eiUYqp+TrRjt2dCf0TKT2GH+?@EV_( z22@T50clpVwuGXtN&X<*p`T0RQbKDhE)nE+keHX;8QBiTx0~oB{2MdS-f_-k?0^1}QtF zFPQt&u?ZfVcCe2Jax_GS2ja`X$-k6KT=E-q54uPpDsD6o^a)`#{<{8~Z#>!MeK@Wa zKd(o)bXs~nvi)|sSz4Mit*RO$Aot<0yVmaonO4)3N)pVHC`_MJGnlk7^bmnH_oT7b z0??Gr0+VC4jsr0#rpkCO8EAF58yQ)nL0rv&4ak%q1M88Tk|GpX6;%|3$@0*-#iJ8k zWkP|+YgVA}B^!PKjF}8QjVyXcfXuyV1(dw~+ZI{R!8KZgZv`~VdM2HUixQZMq#1Z# zL`yK69h1@=SRXe(SN9v>N;X1PtX+S~d|tx4d*NLymaePt7ie%vyS`KiCyjchI=r+Y zt#vm`%q8J^o`Fjq!oCH5C3{p01V2wp3e2`MoP+iJ?gY<%yJYVOAReIWz7j!ZEf5a( z+G5vBJa;p?{<_!-?NHysD>_hFERY6~lnuwFF=*0BeqqV-(-lL1Acjd4pQZm#H~eM@6$F-*z^hpT$_~zK-Y( zGntCz|9PE7H72|=EE>Q*sjr%>kf4=l9TS^mvKUh~;Yn^ds=l5_3Bgffov54Xop(}G zwcx_C73=}c^rpNxf_di?gGqGhq{FC|w7QOBN`jEu^}+6%<81O1(7srQ$R}*dtC|W= z$}dSrn!mP7(#5BSg3w<4YUCH&TYqfMmlU2kMBffkndxK?oPy}*p8q)VN?u)yWz^d; z$JjeD`|#SxLS2Cm0-9LZt6w@-M*^6u`4RHee%dXoi7z+*-FzsXwlm(kZhxCy+AXyj zHq=Sp8QEv{hX0}EM7M{-ZOQnBk_>ocdMfLr^ls~`HF(zm1QOPQf8kz+1{__M4h9m= zHb_s1(_SV;!#p11g8E44_{CDlQHB{II(sU59szSO_y&!2^Py1RM9xRJ>H-cWgssi_lf4?qLd#48Y=A3KHlu}&Et$;j)O3}RIz~FZR5(7#N0EM4P4{K z5y5`W{Hb=jbk^zG=jw5#NZl&}7Gn0plq7PeX-I=~L@M%BfZ{W=c?c;g%ai>L-}dbz ze%F9mqhN5S2qM$f+G7zO@x#y)17oSd*Cy;GLnx&a^C^=b=&3NhO&StPdXxP|qH?}( zt2iv5b)tOa&}VwoWdVLldaSKZ?pE5h8>s8ed=ms8>KmqSgcCPO?2QE@k`#O%C5{fv zmYcfW>?B2J>f54z0Aa6_MO{tvcQ(Jf*ln;m>KM8b?;6LyA zD9WVIY4=qB(c%bZ`}4W2ey2rQRwr_iNKz?o=6gtgtA6mc)QZ_nUF+-_$BHBGqHPVG zRwPihv}^~r1Cq`VgUFy>GTcOl^Z34E>l$Ug=yp{JRZnq;K1z~ zc(uuQwYKKbL-lkh&FiWLb6w*V)1Kej@6109{8Fz+P>P(trHq(whsCFvS`bU)Rikjm zhbBEAlni#i15S+Y2h#?+f0A^MuB9DR(|4V;1$?{nmZ*52(^A^B&OZ}-`I177X`G^d z@pOR1kYDKMJB=!2JK;v)ghUDbi7FOdxEo)8xA)a?HHh57LfCDO*Yt<{l=)wQLb5T~ zO0mHL1Fw3%uHU@Ake;t~dDnu|EK9feunRi-E_k){=3?d%tzgajb@#2T{n5`ZFE9Id z{(mt30ZiK;$9VeoJS2)01IOCLxXA+f`1=*{WQ9_WW;mOK@enLsC$2VCcEEE;ul~{d z^vj=Md|a%soMv!h1F7THgSI2th-DjGU=sX8K}w{<0MTLR6eKm~3oBo-PY&$T8jJ5Ow7jfYIfvT)d$AcA z`PG$Q-GC%LLVZYij(Oe$x#_3(P`NxIUq&Eg7KO zj|AD`t;Y07;d&g}_VW3SW*uJ6|KF;I~kcK@JQ1b@gZH?B+NVgL0sj1p9uS zIzxWA`Y$T000sG8@5jZ0a;7odv&RJMr<$Oxe9&ghDW^F5dCg;WGc($S@Lyj){lWYF zYM&}I)hc`U_6+$kt6Fi;YD-J_n?VFntmV)?3xd`C@MG&9(zgJP8q~c>TVGlBkg^=P zh{e@bT%IunmyedT(0fO*HzK9#TUXe<(qW?(yav<4_v_wefeqWKs9m%5gMdLyH&IOt z>9qPEXI-^Ueeu(dYB|q7B%cOW8aMqAUuNc&_RY;YFoF;uk>M=dqZLv~%?(f5v z^u2OMGE=qrn$V7{D6mD1g~+fELUr+p=|F!4);Z6J7Jtx*O3cIF)l;7^RQyKNTsLP5 zcTUJ4o%CIFYAKNMaxzcyjm6egWA6XcR?NM1uD&*nkl9gNw z^Bw91a_;dO4RQzAzlCi%WcW}kPMEer($g<}6r>gHtS5_YoO*THI@hBnx84s;x20R92Kb!@Ea&YU)7l949eDwXpaY2c~(zRR@G zK4|c?mDLD7KvwWe(#v}RGM%a{Uup#(Q$p^wG4}=p-+9EtfFyUs&Bi7R zE+)f9XY09Q=#?|dK`6Vebh^&d8P(A*gwU3-KmK+S%qWEKx68N)EceL7SmS+idRjc+ z1q8BveuUd_7$}vwb7*OAAmy>pn09*?d~P?R);AugrqlQk3P$<~H+d~Le#niBc? zdd@ge=^O&Hir52N-%Ga zGym57aH&Y~8+^Ju;ImnI9(u5b%tueQwfQZi*-Uzy>}ixYBHOl4d!hm>KqV3JPZ+!J zz|InLF}ZJ~R=%RVX3nd6eJIP)?XSjo{^XT%(%)dWj<|mu)n?3Ab~hc3a=*(01u)Z38e%7*0k6wGuo&V_X|yX z9-mUy9vFxgb=tk{igPf9TC=6ad50h=9_f=5h`wv1TrAN299d&&nDHQ7r_h2og4`Mx zxD1u!#kJ4w&}qS#7(xM^6x)>VL+L!Ne7yQOuvYc-IwQFMz!*XM?R-$xYC-4YYDHJA z^?Ut%L`ip5?0G_l#8EgL_m`s>#V|UV0xo-#@`t-Bb&_QNG57rX1*=)>_=`bP%H43V zA;KPRH*%6Zd!hCRKlC$XYK5}`|MAC9SiydymRKV6a7C7qGFFIaf=xL-HdpRo5ze$w zhxw&-Etc;Bv@-qZ=)$xAQChO$5*GH%c1TR;@dWI~h<(uaDfONleSYIua$;bhJ$+Ve zGO%|2OLZWLpW01b$d4SxDQ-};F>V>HznpD_%bpzesXa%Xarl1mIk!R?CyR4oYPK=% zgRfm%wv+P#D14%m33TLDHsSQyJDE(0XBZ{Ge!@t=E4?zaK|dhEt#YB!7V2Fe8Gzpl!pa`?8LOpWuAB!mwzB{*5>S z4{o$`7JX7Q$6w%4%T3Uthsw2Q_InfXjPu!_?wlzn43)_`T(FiQC$uw+t$V?&qoR8E zAAs-jnR9|=w)EJXy{Yxs<32m^1Mn5)d-EW=Xe%XBWJM>o05x(0$)Gm1SPbbxgd)*t zTWL+{J}b+~d=v0i-c<9UGfib0%H45zW%ey3t{|;8hm{3MzpP}ki4Ah4r%KS6pXRDJHL5IeSk>Z`ibO@IDg7!hBurKI53HJX zDZmy5-s)&5;^Tt>Gv042uWV6Uw_9vMSx!j(HsMa*v3l}egT9MC)nV$OLNhFGM$v>e zfB9Y?FX-Edm}2&&i9&t_ZB&Gli+xfKpL-zI?Yo+HKeEWFGpNSZ_>krVRCWFVjqmK_v??|iBpEl}R?%d&r%pkE(e_L6Jyh5qpr{&^WaA8k?I5J@DbnfV%DpK4-d z8s?ef_)5b5Cy1!8d<*oqUB-2fAZ);VLwYjDj?#6)WA2+sG2x_*{-2HUxPy&m4FcOg zE9pr{><6Yl%0rch_kVl(5w{0d($OZU9DlDDk2N9s>NC*JLlHL+nrNRtTSO-#o?tk> zP|xacO0G*vHl@MKd<(Onb@)1DKF*5COp;HBEg z&FzD$KU<~dkb(R03zC8Iz^U(>yfr6{|5mKlxUBCv^S`exO@<=<9np()-_h~S>*qX0 zlVQ^c33=MvAiyb=XYP^|8pYo&qJScSTzVd=q=_(!5m`0X#NU#Q$X-; zlWn4Cwn8AWDd6|Tds!wE+P`T%kB{Qa&aPiU)2F20;As3g_&MO$jTi+%|Q5hK+gcw$r^!^(!RRyZinP@oT@%)JHF*DPCQ0UR}wG%IZw z#UrUIT7V(9KfT3Ts&Rj=tBcTmC;_sJimM_J2sLTJ&ou?lLqHHxg~-ln2PUM)7!&~* zUqMTQ=x9TOihTfnI%@h1SExz?PC8cy;*Sqp+iv*{b^3kf)3Dt$9GcJZ7tfvi_3K}f zRC=G%Sbk`$CV1Ap_M2;>lMF9oRjlnKX@tl!2eoy6GPSqmypfvaAd%Kms>BS^jI=vq ztgOzK)#GbX9(l!QYIYJ3Sr@%7pCgtTW7eV5ytO&)N(H%%i<64Mn(jy$q9AScu9oZpY;o&c=BBC{uq#-Y z&M6spVkua)Q!wv4N{m$Uk_o}4S)J01`qt`AXmU=RXStEC_)a}S0%KF0cCIC~tGxqL z!Au|^a%UqUJOJf4KV>{t3hTG~WC>@Vp)> z*Q`u!b#4k48Oi)>?|+9jzvv5lAo<4w>0U{p*;?sd8`Etx=oT2403vi1?LGoU{=id? z_4c`aC{s!?*!)9@vDl1k!rT#_rnWD+jOMZ#K)4tk=ozJKaxqt-A1zR|A21%Zp%>kt1kN)_LF#Cr0-Q(g z@M#zC3UhQc0aXB5>e}=lN~`|>Eh@_N6aX;*b5-to8lC!77d;ICLZFkATORI-~1AAOG3B?%VqS literal 0 HcmV?d00001 diff --git a/data/faces/madison_scott/thumbnail.jpg b/data/faces/madison_scott/thumbnail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6ede65d2c17b8a031c1a24f52fc6218d7dbe2c73 GIT binary patch literal 30869 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 literal 0 HcmV?d00001 diff --git a/data/faces/mia_split/thumbnail.jpg b/data/faces/mia_split/thumbnail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c78250751c17488551410d49a77c4f6d857b17db GIT binary patch literal 26278 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�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 bymjE#e6I1iRBR5t0jwMwM|?3>mZ<;P{%)NG literal 0 HcmV?d00001 diff --git a/data/faces/riley_reid/thumbnail.jpg b/data/faces/riley_reid/thumbnail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..28699c6bef54d1c3922d522aaa46180691922e9b GIT binary patch literal 36820 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

3pG=mS(31t$IyCq+HIW9G{ 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

UpDLhCm-;WU+B_LB$th2b9Xso z{;T+xKUT$Wf|oR$pF^7&?zImx8#_e1)-KkwCJ%R3&>*IijTkpQfS&C z@hFlTc?62OoOXyLIL5~LvGpW=RoLEWk$7LiHr^xDV+L=r&2*5J`;JfU{{ZpTLyvmT z@Ftyaq{VA#bYj_IrZw9-9$tA*l%bEV?Z-aZ?O8)>vq{b|(K5!JVERs_;vW<=(n&-baC#nUF9_g7FP%K>Lrmy8@fI6lJ_J;tLnx)rodapyBg(p=#P zB!HzC^Ka6dt!T4NVW`F>R*m9BbT9Jn5y*3oT#?08uN$Hx%Qd0n9~kuOaq!anQl4y; zp2x_+`<`myfIW^kb6*_YS!!1nRyP`Xa*b+1`7_GM>->~g+&>d-*Ti21Ji9n!nWobc za#1mci)#UoU4(vT(!O5!TW_N$hb6VuT!)7GRgFpmgd{NQ{_(G40a5*1O?5n+To<-Y zzK8Ug4U!^|WDI}WsqHPG*mli>+-IdeTolI9_m4qK1|*duDge)6*1U+tC!y;#b!J(x z(v~yjw9S&>j(XOF7H|+_L}v9W`KawrnPAStl{g2zNC{Ysif}^qu86dZT&A6qDrzxD z0+bPvyMj+@=k>)wgh0#~9OL*!ZQsc60|so@H>%9=#Ii;5l5kJ8a@LBIHm5ghlqQ-G zNSG^(V{shfsom)|T9ig6w#zCUagD>$i|M3y^4YjG6cb7&F$XxWI(AaA*UZvKE8>rb znijMSbJ#*;z~33_cg|c9w6}jz`F4D%f|pD1eu8gHS}1uw`h#b3YS5ZY;#!N zB-3pqib+gZF2f*n=Ci3t>Z6F0_hfwEb>eRl>2LOZQ$Ub}BpG5k1bX7GSo}oNZdc3H zV`N-oe1MF8n6FdT{6D2i#opOZ%hLk6O?$(78e2Ty*|8F-z$?dE#YdIc@02N3*48lI z^Gdr#o(rXABLRbqel-D(JB4SCL9`#6)Bga~MgIVUG&LpRg`?cNh>e1b{sN(}(rtpW zw34tx^5yzbB&5ky5?4%oP*}Q%Qco?w`=n$ap{6#U8|_Cxa&XvjiqMV-fmQO?>$GR3 zOLGiRKbD9v&Pm7yx!iTJ*-l9$iuN8Jwzzg#QAB^->&Wgg-nxAo!3^X{2Kg|&f-&^x z^Qzh$5iHS=qwfyY=pGV+8B9gu2XP>ZsK(|s>Nq1d!@|n8-cebhY-QEs`G@JvXxQlp zi{$;G*a5>PM;_w3+iN)DiKLE41P%u7l?=A=zwac=9Cxjw8!b;i+fBPOl$yy@G;z3m zec(V01yI!O-;!c1I}CKLqWa=e5O16f|fCP7fxBp>Ag<;z<0vY@%$y zIL&!ajf`&7F5-5MP;>a;SD|>uX0@JJG)1|p25M)ARnND9J4%{Kh;9p$xaS@IQU}()eDKz~+J*lBh&*GfB$7+0 zJa*AV(Y&=~Bz{T<=U%a{T+gT4&3R`bN4&d{CdWdiDULrdD}ne!qgd+S*zn&Waeb^H zx##Z>HakX*u93fL*iD05Ct`UiHja>DIS@7i_H^2!_u^p5_>o{Jv{8 zHy=}jUX|gwqFSn8AIh0)LaU(}=5JY}KyGfTEZ z9pHIpNXG>u`9^x=6NSLX0M;I(s%ZWb_-%ROo7YiqbADFVR$Za(U>-zA+!j`B^gI3P zjg95q-^5*8RJ*xpWU{c3TZiRW9^Z*PR}cRH1vS^TUkrQ_(XBLVqY6oNVQ#^A{o00b zIQ3-&`qyn5aH~~8oE55jC^=Z{{0Dz|uU_5QPjp1~n)GopsmIN-Gt===_}53`dD>qU z-r9vRd3vO_%^I%^(8iJdIRqTnAK)fvwS7-lLy50-=x3Pr-o`wTJ9HJ*_=aN#i0>|A zMe`rTxBH)OJrcO_KNCA}>hVvx#NBCD*53{fmnlPSs`)c2jE)46k@CazVVi49}o3cI61wzkb0pj V&DR02E4KkQ>B$_p%4y9r|Jh&MtH}TW literal 0 HcmV?d00001 diff --git a/data/faces/sasha_grey/thumbnail.jpg b/data/faces/sasha_grey/thumbnail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e381045ea3bd3e508b87284bd880037c793de8d9 GIT binary patch literal 32980 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 H+<*Vs3w`0@ literal 0 HcmV?d00001 diff --git a/data/performers/01638222-6708-4698-a6c1-30b8c80eb09a/performer.json b/data/performers/01638222-6708-4698-a6c1-30b8c80eb09a/performer.json new file mode 100644 index 0000000..2b0ec84 --- /dev/null +++ b/data/performers/01638222-6708-4698-a6c1-30b8c80eb09a/performer.json @@ -0,0 +1,18 @@ +{ + "id": "01638222-6708-4698-a6c1-30b8c80eb09a", + "name": "Miss Korrine", + "url": "https://theporndb.net/performer/01638222-6708-4698-a6c1-30b8c80eb09a", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.491295" +} \ No newline at end of file diff --git a/data/performers/0315dae6-9643-4265-ac66-0f2e47264bd3/performer.json b/data/performers/0315dae6-9643-4265-ac66-0f2e47264bd3/performer.json new file mode 100644 index 0000000..dcc05c8 --- /dev/null +++ b/data/performers/0315dae6-9643-4265-ac66-0f2e47264bd3/performer.json @@ -0,0 +1,18 @@ +{ + "id": "0315dae6-9643-4265-ac66-0f2e47264bd3", + "name": "Madame Beatrix", + "url": "https://theporndb.net/performer/0315dae6-9643-4265-ac66-0f2e47264bd3", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:25.751738" +} \ No newline at end of file diff --git a/data/performers/064f0295-3c36-48c1-89ea-76fa547f201e/performer.json b/data/performers/064f0295-3c36-48c1-89ea-76fa547f201e/performer.json new file mode 100644 index 0000000..9a3f2ea --- /dev/null +++ b/data/performers/064f0295-3c36-48c1-89ea-76fa547f201e/performer.json @@ -0,0 +1,18 @@ +{ + "id": "064f0295-3c36-48c1-89ea-76fa547f201e", + "name": "Rae Voltage", + "url": "https://theporndb.net/performer/064f0295-3c36-48c1-89ea-76fa547f201e", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.591389" +} \ No newline at end of file diff --git a/data/performers/0664972e-8f2c-43f8-95ff-1ac01681420d/performer.json b/data/performers/0664972e-8f2c-43f8-95ff-1ac01681420d/performer.json new file mode 100644 index 0000000..6899ab0 --- /dev/null +++ b/data/performers/0664972e-8f2c-43f8-95ff-1ac01681420d/performer.json @@ -0,0 +1,18 @@ +{ + "id": "0664972e-8f2c-43f8-95ff-1ac01681420d", + "name": "Maddie Wren", + "url": "https://theporndb.net/performer/0664972e-8f2c-43f8-95ff-1ac01681420d", + "aliases": "[\"Maddie\", \"Bratty Maddie\"]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": null, + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:38.019503" +} \ No newline at end of file diff --git a/data/performers/0912d9fa-e824-414a-917c-29165ff39f7e/performer.json b/data/performers/0912d9fa-e824-414a-917c-29165ff39f7e/performer.json new file mode 100644 index 0000000..cd7f741 --- /dev/null +++ b/data/performers/0912d9fa-e824-414a-917c-29165ff39f7e/performer.json @@ -0,0 +1,18 @@ +{ + "id": "0912d9fa-e824-414a-917c-29165ff39f7e", + "name": "VixXxen", + "url": "https://theporndb.net/performer/0912d9fa-e824-414a-917c-29165ff39f7e", + "aliases": "[\"Vixxxen\"]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": null, + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:36.506861" +} \ No newline at end of file diff --git a/data/performers/09d40f92-e294-4fe1-ab99-394ce50f762e/performer.json b/data/performers/09d40f92-e294-4fe1-ab99-394ce50f762e/performer.json new file mode 100644 index 0000000..09236af --- /dev/null +++ b/data/performers/09d40f92-e294-4fe1-ab99-394ce50f762e/performer.json @@ -0,0 +1,18 @@ +{ + "id": "09d40f92-e294-4fe1-ab99-394ce50f762e", + "name": "Cheri Houston", + "url": "https://theporndb.net/performer/09d40f92-e294-4fe1-ab99-394ce50f762e", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:25.960143" +} \ No newline at end of file diff --git a/data/performers/0bbdc743-cd03-4588-999f-7b81bef05f3c/performer.json b/data/performers/0bbdc743-cd03-4588-999f-7b81bef05f3c/performer.json new file mode 100644 index 0000000..15b2d18 --- /dev/null +++ b/data/performers/0bbdc743-cd03-4588-999f-7b81bef05f3c/performer.json @@ -0,0 +1,18 @@ +{ + "id": "0bbdc743-cd03-4588-999f-7b81bef05f3c", + "name": "Abbyabby Marieabby Paradise", + "url": "https://theporndb.net/performer/0bbdc743-cd03-4588-999f-7b81bef05f3c", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.707821" +} \ No newline at end of file diff --git a/data/performers/145ac6dd-0c84-49d7-82f7-42ba092e4ea9/performer.json b/data/performers/145ac6dd-0c84-49d7-82f7-42ba092e4ea9/performer.json new file mode 100644 index 0000000..71fb79a --- /dev/null +++ b/data/performers/145ac6dd-0c84-49d7-82f7-42ba092e4ea9/performer.json @@ -0,0 +1,18 @@ +{ + "id": "145ac6dd-0c84-49d7-82f7-42ba092e4ea9", + "name": "Julie Cats", + "url": "https://theporndb.net/performer/145ac6dd-0c84-49d7-82f7-42ba092e4ea9", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.675382" +} \ No newline at end of file diff --git a/data/performers/15efbebe-10c1-4e99-b863-1780551d2fb1/performer.json b/data/performers/15efbebe-10c1-4e99-b863-1780551d2fb1/performer.json new file mode 100644 index 0000000..cae27e9 --- /dev/null +++ b/data/performers/15efbebe-10c1-4e99-b863-1780551d2fb1/performer.json @@ -0,0 +1,18 @@ +{ + "id": "15efbebe-10c1-4e99-b863-1780551d2fb1", + "name": "Princess Chanel", + "url": "https://theporndb.net/performer/15efbebe-10c1-4e99-b863-1780551d2fb1", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:25.921675" +} \ No newline at end of file diff --git a/data/performers/1f0a7f0d-297d-4731-8853-9d44dd31f3a4/performer.json b/data/performers/1f0a7f0d-297d-4731-8853-9d44dd31f3a4/performer.json new file mode 100644 index 0000000..f8cce58 --- /dev/null +++ b/data/performers/1f0a7f0d-297d-4731-8853-9d44dd31f3a4/performer.json @@ -0,0 +1,18 @@ +{ + "id": "1f0a7f0d-297d-4731-8853-9d44dd31f3a4", + "name": "Guido Kirsch", + "url": "https://theporndb.net/performer/1f0a7f0d-297d-4731-8853-9d44dd31f3a4", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:27.023063" +} \ No newline at end of file diff --git a/data/performers/21161316-f25e-4941-9d34-f0aaa118b4ad/performer.json b/data/performers/21161316-f25e-4941-9d34-f0aaa118b4ad/performer.json new file mode 100644 index 0000000..50544ea --- /dev/null +++ b/data/performers/21161316-f25e-4941-9d34-f0aaa118b4ad/performer.json @@ -0,0 +1,18 @@ +{ + "id": "21161316-f25e-4941-9d34-f0aaa118b4ad", + "name": "Lexie Lowe", + "url": "https://theporndb.net/performer/21161316-f25e-4941-9d34-f0aaa118b4ad", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.658660" +} \ No newline at end of file diff --git a/data/performers/21757d89-4b0a-4120-a07b-692f5649eb07/performer.json b/data/performers/21757d89-4b0a-4120-a07b-692f5649eb07/performer.json new file mode 100644 index 0000000..f22ed04 --- /dev/null +++ b/data/performers/21757d89-4b0a-4120-a07b-692f5649eb07/performer.json @@ -0,0 +1,18 @@ +{ + "id": "21757d89-4b0a-4120-a07b-692f5649eb07", + "name": "Alison Sweet", + "url": "https://theporndb.net/performer/21757d89-4b0a-4120-a07b-692f5649eb07", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.200661" +} \ No newline at end of file diff --git a/data/performers/26a117de-578d-4533-836f-6f461f675393/performer.json b/data/performers/26a117de-578d-4533-836f-6f461f675393/performer.json new file mode 100644 index 0000000..6adb764 --- /dev/null +++ b/data/performers/26a117de-578d-4533-836f-6f461f675393/performer.json @@ -0,0 +1,18 @@ +{ + "id": "26a117de-578d-4533-836f-6f461f675393", + "name": "Poppy Prynne", + "url": "https://theporndb.net/performer/26a117de-578d-4533-836f-6f461f675393", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.872031" +} \ No newline at end of file diff --git a/data/performers/29fbbbb1-f967-4b54-a5ee-60eaf8b505f9/performer.json b/data/performers/29fbbbb1-f967-4b54-a5ee-60eaf8b505f9/performer.json new file mode 100644 index 0000000..730525f --- /dev/null +++ b/data/performers/29fbbbb1-f967-4b54-a5ee-60eaf8b505f9/performer.json @@ -0,0 +1,18 @@ +{ + "id": "29fbbbb1-f967-4b54-a5ee-60eaf8b505f9", + "name": "Nina", + "url": "https://theporndb.net/performer/29fbbbb1-f967-4b54-a5ee-60eaf8b505f9", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.507347" +} \ No newline at end of file diff --git a/data/performers/2c9d762f-5360-4471-8ef7-ce5e6158c59e/performer.json b/data/performers/2c9d762f-5360-4471-8ef7-ce5e6158c59e/performer.json new file mode 100644 index 0000000..6008b4c --- /dev/null +++ b/data/performers/2c9d762f-5360-4471-8ef7-ce5e6158c59e/performer.json @@ -0,0 +1,18 @@ +{ + "id": "2c9d762f-5360-4471-8ef7-ce5e6158c59e", + "name": "Heaven", + "url": "https://theporndb.net/performer/2c9d762f-5360-4471-8ef7-ce5e6158c59e", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": null, + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:27.411923" +} \ No newline at end of file diff --git a/data/performers/2f700de5-b525-4dbe-b8e1-d7e066089e7e/performer.json b/data/performers/2f700de5-b525-4dbe-b8e1-d7e066089e7e/performer.json new file mode 100644 index 0000000..435e324 --- /dev/null +++ b/data/performers/2f700de5-b525-4dbe-b8e1-d7e066089e7e/performer.json @@ -0,0 +1,18 @@ +{ + "id": "2f700de5-b525-4dbe-b8e1-d7e066089e7e", + "name": "Ziva Ziva Fey", + "url": "https://theporndb.net/performer/2f700de5-b525-4dbe-b8e1-d7e066089e7e", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.771331" +} \ No newline at end of file diff --git a/data/performers/2f89fd04-e81d-4430-8d26-f75eb4ee65e0/performer.json b/data/performers/2f89fd04-e81d-4430-8d26-f75eb4ee65e0/performer.json new file mode 100644 index 0000000..11be189 --- /dev/null +++ b/data/performers/2f89fd04-e81d-4430-8d26-f75eb4ee65e0/performer.json @@ -0,0 +1,18 @@ +{ + "id": "2f89fd04-e81d-4430-8d26-f75eb4ee65e0", + "name": "Lucas Caruso", + "url": "https://theporndb.net/performer/2f89fd04-e81d-4430-8d26-f75eb4ee65e0", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:27.043638" +} \ No newline at end of file diff --git a/data/performers/32cbf56e-9443-44c2-b53f-1c0dc5e0701c/performer.json b/data/performers/32cbf56e-9443-44c2-b53f-1c0dc5e0701c/performer.json new file mode 100644 index 0000000..3240857 --- /dev/null +++ b/data/performers/32cbf56e-9443-44c2-b53f-1c0dc5e0701c/performer.json @@ -0,0 +1,18 @@ +{ + "id": "32cbf56e-9443-44c2-b53f-1c0dc5e0701c", + "name": "Kako Crunchie", + "url": "https://theporndb.net/performer/32cbf56e-9443-44c2-b53f-1c0dc5e0701c", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.034761" +} \ No newline at end of file diff --git a/data/performers/337a4c2f-2622-48d8-a06d-62a6b1dcd561/performer.json b/data/performers/337a4c2f-2622-48d8-a06d-62a6b1dcd561/performer.json new file mode 100644 index 0000000..052bb67 --- /dev/null +++ b/data/performers/337a4c2f-2622-48d8-a06d-62a6b1dcd561/performer.json @@ -0,0 +1,18 @@ +{ + "id": "337a4c2f-2622-48d8-a06d-62a6b1dcd561", + "name": "Teen Dragon", + "url": "https://theporndb.net/performer/337a4c2f-2622-48d8-a06d-62a6b1dcd561", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": null, + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:37.500064" +} \ No newline at end of file diff --git a/data/performers/345c71e2-cf3a-498e-a3ca-9dfa965c498d/performer.json b/data/performers/345c71e2-cf3a-498e-a3ca-9dfa965c498d/performer.json new file mode 100644 index 0000000..daa9019 --- /dev/null +++ b/data/performers/345c71e2-cf3a-498e-a3ca-9dfa965c498d/performer.json @@ -0,0 +1,18 @@ +{ + "id": "345c71e2-cf3a-498e-a3ca-9dfa965c498d", + "name": "Isis Nice", + "url": "https://theporndb.net/performer/345c71e2-cf3a-498e-a3ca-9dfa965c498d", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.327930" +} \ No newline at end of file diff --git a/data/performers/34ac207a-5de9-4129-8f3e-2bf29175a320/performer.json b/data/performers/34ac207a-5de9-4129-8f3e-2bf29175a320/performer.json new file mode 100644 index 0000000..647a35f --- /dev/null +++ b/data/performers/34ac207a-5de9-4129-8f3e-2bf29175a320/performer.json @@ -0,0 +1,18 @@ +{ + "id": "34ac207a-5de9-4129-8f3e-2bf29175a320", + "name": "Blackate", + "url": "https://theporndb.net/performer/34ac207a-5de9-4129-8f3e-2bf29175a320", + "aliases": "[\"Kittykate69\"]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.149715" +} \ No newline at end of file diff --git a/data/performers/34acd6b6-b1f7-485e-ab02-e4c3a9a9b79a/performer.json b/data/performers/34acd6b6-b1f7-485e-ab02-e4c3a9a9b79a/performer.json new file mode 100644 index 0000000..2a2b09b --- /dev/null +++ b/data/performers/34acd6b6-b1f7-485e-ab02-e4c3a9a9b79a/performer.json @@ -0,0 +1,18 @@ +{ + "id": "34acd6b6-b1f7-485e-ab02-e4c3a9a9b79a", + "name": "Four A", + "url": "https://theporndb.net/performer/34acd6b6-b1f7-485e-ab02-e4c3a9a9b79a", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.607766" +} \ No newline at end of file diff --git a/data/performers/394436d7-a063-4e06-890e-e0dacad8c8b7/performer.json b/data/performers/394436d7-a063-4e06-890e-e0dacad8c8b7/performer.json new file mode 100644 index 0000000..94883b1 --- /dev/null +++ b/data/performers/394436d7-a063-4e06-890e-e0dacad8c8b7/performer.json @@ -0,0 +1,18 @@ +{ + "id": "394436d7-a063-4e06-890e-e0dacad8c8b7", + "name": "Ludo Desire Room", + "url": "https://theporndb.net/performer/394436d7-a063-4e06-890e-e0dacad8c8b7", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": null, + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:28.675640" +} \ No newline at end of file diff --git a/data/performers/397688c6-f37b-43c1-9416-16cb0aa5ee45/performer.json b/data/performers/397688c6-f37b-43c1-9416-16cb0aa5ee45/performer.json new file mode 100644 index 0000000..3131ad4 --- /dev/null +++ b/data/performers/397688c6-f37b-43c1-9416-16cb0aa5ee45/performer.json @@ -0,0 +1,18 @@ +{ + "id": "397688c6-f37b-43c1-9416-16cb0aa5ee45", + "name": "Maria El Aouad", + "url": "https://theporndb.net/performer/397688c6-f37b-43c1-9416-16cb0aa5ee45", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:27.085225" +} \ No newline at end of file diff --git a/data/performers/39783e16-c611-4ae5-b02d-fd2f9c9ed54b/performer.json b/data/performers/39783e16-c611-4ae5-b02d-fd2f9c9ed54b/performer.json new file mode 100644 index 0000000..0c72b0d --- /dev/null +++ b/data/performers/39783e16-c611-4ae5-b02d-fd2f9c9ed54b/performer.json @@ -0,0 +1,18 @@ +{ + "id": "39783e16-c611-4ae5-b02d-fd2f9c9ed54b", + "name": "Jolie Desire Room", + "url": "https://theporndb.net/performer/39783e16-c611-4ae5-b02d-fd2f9c9ed54b", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": null, + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:29.201353" +} \ No newline at end of file diff --git a/data/performers/3cdad92a-bc0e-49a5-868e-3a41fd712aa6/performer.json b/data/performers/3cdad92a-bc0e-49a5-868e-3a41fd712aa6/performer.json new file mode 100644 index 0000000..09d8d0e --- /dev/null +++ b/data/performers/3cdad92a-bc0e-49a5-868e-3a41fd712aa6/performer.json @@ -0,0 +1,18 @@ +{ + "id": "3cdad92a-bc0e-49a5-868e-3a41fd712aa6", + "name": "Pepa Dicky", + "url": "https://theporndb.net/performer/3cdad92a-bc0e-49a5-868e-3a41fd712aa6", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.100208" +} \ No newline at end of file diff --git a/data/performers/3d33f525-2711-408b-9e6d-528392fd9552/performer.json b/data/performers/3d33f525-2711-408b-9e6d-528392fd9552/performer.json new file mode 100644 index 0000000..b2607c0 --- /dev/null +++ b/data/performers/3d33f525-2711-408b-9e6d-528392fd9552/performer.json @@ -0,0 +1,18 @@ +{ + "id": "3d33f525-2711-408b-9e6d-528392fd9552", + "name": "V Silverss", + "url": "https://theporndb.net/performer/3d33f525-2711-408b-9e6d-528392fd9552", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": null, + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:34.650948" +} \ No newline at end of file diff --git a/data/performers/3d7c2897-8d8b-4f80-996c-0b145d5c1580/performer.json b/data/performers/3d7c2897-8d8b-4f80-996c-0b145d5c1580/performer.json new file mode 100644 index 0000000..3980a6b --- /dev/null +++ b/data/performers/3d7c2897-8d8b-4f80-996c-0b145d5c1580/performer.json @@ -0,0 +1,18 @@ +{ + "id": "3d7c2897-8d8b-4f80-996c-0b145d5c1580", + "name": "Mike", + "url": "https://theporndb.net/performer/3d7c2897-8d8b-4f80-996c-0b145d5c1580", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": null, + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:31.147237" +} \ No newline at end of file diff --git a/data/performers/3ec91510-89b1-4f8a-b88b-013abfae59be/performer.json b/data/performers/3ec91510-89b1-4f8a-b88b-013abfae59be/performer.json new file mode 100644 index 0000000..524dcee --- /dev/null +++ b/data/performers/3ec91510-89b1-4f8a-b88b-013abfae59be/performer.json @@ -0,0 +1,18 @@ +{ + "id": "3ec91510-89b1-4f8a-b88b-013abfae59be", + "name": "Camilo Cortes", + "url": "https://theporndb.net/performer/3ec91510-89b1-4f8a-b88b-013abfae59be", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": null, + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:33.371732" +} \ No newline at end of file diff --git a/data/performers/3f6ab31d-04a7-4557-be15-d55b0db8f5d1/performer.json b/data/performers/3f6ab31d-04a7-4557-be15-d55b0db8f5d1/performer.json new file mode 100644 index 0000000..30a682c --- /dev/null +++ b/data/performers/3f6ab31d-04a7-4557-be15-d55b0db8f5d1/performer.json @@ -0,0 +1,18 @@ +{ + "id": "3f6ab31d-04a7-4557-be15-d55b0db8f5d1", + "name": "Richard Lotto", + "url": "https://theporndb.net/performer/3f6ab31d-04a7-4557-be15-d55b0db8f5d1", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.132836" +} \ No newline at end of file diff --git a/data/performers/3fbb8994-94d9-4008-b79f-f43162a097a6/performer.json b/data/performers/3fbb8994-94d9-4008-b79f-f43162a097a6/performer.json new file mode 100644 index 0000000..d31a9c9 --- /dev/null +++ b/data/performers/3fbb8994-94d9-4008-b79f-f43162a097a6/performer.json @@ -0,0 +1,18 @@ +{ + "id": "3fbb8994-94d9-4008-b79f-f43162a097a6", + "name": "Nun B", + "url": "https://theporndb.net/performer/3fbb8994-94d9-4008-b79f-f43162a097a6", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:25.885917" +} \ No newline at end of file diff --git a/data/performers/4141e782-6ece-44fe-8795-4b1d9ceb8929/performer.json b/data/performers/4141e782-6ece-44fe-8795-4b1d9ceb8929/performer.json new file mode 100644 index 0000000..190f0b4 --- /dev/null +++ b/data/performers/4141e782-6ece-44fe-8795-4b1d9ceb8929/performer.json @@ -0,0 +1,18 @@ +{ + "id": "4141e782-6ece-44fe-8795-4b1d9ceb8929", + "name": "Bankroll Barbiee", + "url": "https://theporndb.net/performer/4141e782-6ece-44fe-8795-4b1d9ceb8929", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.892314" +} \ No newline at end of file diff --git a/data/performers/4157fed0-bbed-479f-bd0b-58f4e97fc5da/performer.json b/data/performers/4157fed0-bbed-479f-bd0b-58f4e97fc5da/performer.json new file mode 100644 index 0000000..64d4622 --- /dev/null +++ b/data/performers/4157fed0-bbed-479f-bd0b-58f4e97fc5da/performer.json @@ -0,0 +1,18 @@ +{ + "id": "4157fed0-bbed-479f-bd0b-58f4e97fc5da", + "name": "Carmel Monroe", + "url": "https://theporndb.net/performer/4157fed0-bbed-479f-bd0b-58f4e97fc5da", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:27.001710" +} \ No newline at end of file diff --git a/data/performers/460b73ae-852f-401a-b92f-1d050160b203/performer.json b/data/performers/460b73ae-852f-401a-b92f-1d050160b203/performer.json new file mode 100644 index 0000000..d3a4563 --- /dev/null +++ b/data/performers/460b73ae-852f-401a-b92f-1d050160b203/performer.json @@ -0,0 +1,18 @@ +{ + "id": "460b73ae-852f-401a-b92f-1d050160b203", + "name": "Mike", + "url": "https://theporndb.net/performer/460b73ae-852f-401a-b92f-1d050160b203", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": null, + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:31.977774" +} \ No newline at end of file diff --git a/data/performers/4b91ce7d-ff4c-402d-8917-aaa3a0c27ba0/performer.json b/data/performers/4b91ce7d-ff4c-402d-8917-aaa3a0c27ba0/performer.json new file mode 100644 index 0000000..90639c3 --- /dev/null +++ b/data/performers/4b91ce7d-ff4c-402d-8917-aaa3a0c27ba0/performer.json @@ -0,0 +1,18 @@ +{ + "id": "4b91ce7d-ff4c-402d-8917-aaa3a0c27ba0", + "name": "Mia Tresji", + "url": "https://theporndb.net/performer/4b91ce7d-ff4c-402d-8917-aaa3a0c27ba0", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.939967" +} \ No newline at end of file diff --git a/data/performers/4ece5f55-80d2-4991-9862-dcabe174bcdb/performer.json b/data/performers/4ece5f55-80d2-4991-9862-dcabe174bcdb/performer.json new file mode 100644 index 0000000..40b78d0 --- /dev/null +++ b/data/performers/4ece5f55-80d2-4991-9862-dcabe174bcdb/performer.json @@ -0,0 +1,18 @@ +{ + "id": "4ece5f55-80d2-4991-9862-dcabe174bcdb", + "name": "Bella Madyson", + "url": "https://theporndb.net/performer/4ece5f55-80d2-4991-9862-dcabe174bcdb", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.263138" +} \ No newline at end of file diff --git a/data/performers/4ee89ba2-6210-4486-bbe2-c3a75dcc9012/performer.json b/data/performers/4ee89ba2-6210-4486-bbe2-c3a75dcc9012/performer.json new file mode 100644 index 0000000..fcc77e0 --- /dev/null +++ b/data/performers/4ee89ba2-6210-4486-bbe2-c3a75dcc9012/performer.json @@ -0,0 +1,18 @@ +{ + "id": "4ee89ba2-6210-4486-bbe2-c3a75dcc9012", + "name": "Iris Murray", + "url": "https://theporndb.net/performer/4ee89ba2-6210-4486-bbe2-c3a75dcc9012", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.441528" +} \ No newline at end of file diff --git a/data/performers/5174e511-3f70-4a85-9ecb-182effbd9b42/performer.json b/data/performers/5174e511-3f70-4a85-9ecb-182effbd9b42/performer.json new file mode 100644 index 0000000..ff12108 --- /dev/null +++ b/data/performers/5174e511-3f70-4a85-9ecb-182effbd9b42/performer.json @@ -0,0 +1,18 @@ +{ + "id": "5174e511-3f70-4a85-9ecb-182effbd9b42", + "name": "Nico Savage", + "url": "https://theporndb.net/performer/5174e511-3f70-4a85-9ecb-182effbd9b42", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.067051" +} \ No newline at end of file diff --git a/data/performers/5496783f-aba6-479f-881d-5fe8e9efad21/performer.json b/data/performers/5496783f-aba6-479f-881d-5fe8e9efad21/performer.json new file mode 100644 index 0000000..65f8829 --- /dev/null +++ b/data/performers/5496783f-aba6-479f-881d-5fe8e9efad21/performer.json @@ -0,0 +1,18 @@ +{ + "id": "5496783f-aba6-479f-881d-5fe8e9efad21", + "name": "Goddess Lexie", + "url": "https://theporndb.net/performer/5496783f-aba6-479f-881d-5fe8e9efad21", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": null, + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:30.492477" +} \ No newline at end of file diff --git a/data/performers/55ee1f08-0c5e-49a0-9e7a-8f02b7a5e9e4/performer.json b/data/performers/55ee1f08-0c5e-49a0-9e7a-8f02b7a5e9e4/performer.json new file mode 100644 index 0000000..36903e7 --- /dev/null +++ b/data/performers/55ee1f08-0c5e-49a0-9e7a-8f02b7a5e9e4/performer.json @@ -0,0 +1,18 @@ +{ + "id": "55ee1f08-0c5e-49a0-9e7a-8f02b7a5e9e4", + "name": "Cherry Blossom", + "url": "https://theporndb.net/performer/55ee1f08-0c5e-49a0-9e7a-8f02b7a5e9e4", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:25.852371" +} \ No newline at end of file diff --git a/data/performers/59a3c146-a631-4678-a07a-2348ae04711d/performer.json b/data/performers/59a3c146-a631-4678-a07a-2348ae04711d/performer.json new file mode 100644 index 0000000..c896a05 --- /dev/null +++ b/data/performers/59a3c146-a631-4678-a07a-2348ae04711d/performer.json @@ -0,0 +1,18 @@ +{ + "id": "59a3c146-a631-4678-a07a-2348ae04711d", + "name": "Aleks Stein", + "url": "https://theporndb.net/performer/59a3c146-a631-4678-a07a-2348ae04711d", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.376500" +} \ No newline at end of file diff --git a/data/performers/5b12c499-c83c-464b-bfeb-9023b57dffa5/performer.json b/data/performers/5b12c499-c83c-464b-bfeb-9023b57dffa5/performer.json new file mode 100644 index 0000000..7339a4e --- /dev/null +++ b/data/performers/5b12c499-c83c-464b-bfeb-9023b57dffa5/performer.json @@ -0,0 +1,18 @@ +{ + "id": "5b12c499-c83c-464b-bfeb-9023b57dffa5", + "name": "Keeks", + "url": "https://theporndb.net/performer/5b12c499-c83c-464b-bfeb-9023b57dffa5", + "aliases": "[\"Keeks3005\"]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": null, + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:30.077519" +} \ No newline at end of file diff --git a/data/performers/5e1df0e1-d2bb-4d65-9544-1ee64098eda2/performer.json b/data/performers/5e1df0e1-d2bb-4d65-9544-1ee64098eda2/performer.json new file mode 100644 index 0000000..de943e7 --- /dev/null +++ b/data/performers/5e1df0e1-d2bb-4d65-9544-1ee64098eda2/performer.json @@ -0,0 +1,18 @@ +{ + "id": "5e1df0e1-d2bb-4d65-9544-1ee64098eda2", + "name": "Levine", + "url": "https://theporndb.net/performer/5e1df0e1-d2bb-4d65-9544-1ee64098eda2", + "aliases": "[\"Fred\"]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": null, + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:27.828139" +} \ No newline at end of file diff --git a/data/performers/5e520864-611f-4389-bb53-7a72a9557a1b/performer.json b/data/performers/5e520864-611f-4389-bb53-7a72a9557a1b/performer.json new file mode 100644 index 0000000..9bc0d7d --- /dev/null +++ b/data/performers/5e520864-611f-4389-bb53-7a72a9557a1b/performer.json @@ -0,0 +1,18 @@ +{ + "id": "5e520864-611f-4389-bb53-7a72a9557a1b", + "name": "Brooke Brooke Thomsen", + "url": "https://theporndb.net/performer/5e520864-611f-4389-bb53-7a72a9557a1b", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.851087" +} \ No newline at end of file diff --git a/data/performers/6009e864-a2fa-4a13-83db-7a0145a3f000/performer.json b/data/performers/6009e864-a2fa-4a13-83db-7a0145a3f000/performer.json new file mode 100644 index 0000000..f4cf968 --- /dev/null +++ b/data/performers/6009e864-a2fa-4a13-83db-7a0145a3f000/performer.json @@ -0,0 +1,18 @@ +{ + "id": "6009e864-a2fa-4a13-83db-7a0145a3f000", + "name": "Sea Jewel", + "url": "https://theporndb.net/performer/6009e864-a2fa-4a13-83db-7a0145a3f000", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.574371" +} \ No newline at end of file diff --git a/data/performers/626b9b45-b1cd-4a25-8c17-5191cddea29a/performer.json b/data/performers/626b9b45-b1cd-4a25-8c17-5191cddea29a/performer.json new file mode 100644 index 0000000..b395d7f --- /dev/null +++ b/data/performers/626b9b45-b1cd-4a25-8c17-5191cddea29a/performer.json @@ -0,0 +1,18 @@ +{ + "id": "626b9b45-b1cd-4a25-8c17-5191cddea29a", + "name": "Maddy Maxx", + "url": "https://theporndb.net/performer/626b9b45-b1cd-4a25-8c17-5191cddea29a", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.115985" +} \ No newline at end of file diff --git a/data/performers/628e0f9b-c988-45b6-b25f-610e0c9a3a4b/performer.json b/data/performers/628e0f9b-c988-45b6-b25f-610e0c9a3a4b/performer.json new file mode 100644 index 0000000..7e1e09a --- /dev/null +++ b/data/performers/628e0f9b-c988-45b6-b25f-610e0c9a3a4b/performer.json @@ -0,0 +1,18 @@ +{ + "id": "628e0f9b-c988-45b6-b25f-610e0c9a3a4b", + "name": "You Uekura", + "url": "https://theporndb.net/performer/628e0f9b-c988-45b6-b25f-610e0c9a3a4b", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.343662" +} \ No newline at end of file diff --git a/data/performers/640f3e84-7d93-4480-ad45-f752aa06e2f7/performer.json b/data/performers/640f3e84-7d93-4480-ad45-f752aa06e2f7/performer.json new file mode 100644 index 0000000..ea7a277 --- /dev/null +++ b/data/performers/640f3e84-7d93-4480-ad45-f752aa06e2f7/performer.json @@ -0,0 +1,18 @@ +{ + "id": "640f3e84-7d93-4480-ad45-f752aa06e2f7", + "name": "Suki Desire Room", + "url": "https://theporndb.net/performer/640f3e84-7d93-4480-ad45-f752aa06e2f7", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:25.903304" +} \ No newline at end of file diff --git a/data/performers/64e4da78-689a-4368-8414-d8b1118e4c20/performer.json b/data/performers/64e4da78-689a-4368-8414-d8b1118e4c20/performer.json new file mode 100644 index 0000000..bc10460 --- /dev/null +++ b/data/performers/64e4da78-689a-4368-8414-d8b1118e4c20/performer.json @@ -0,0 +1,18 @@ +{ + "id": "64e4da78-689a-4368-8414-d8b1118e4c20", + "name": "Bianca", + "url": "https://theporndb.net/performer/64e4da78-689a-4368-8414-d8b1118e4c20", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": null, + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:32.826569" +} \ No newline at end of file diff --git a/data/performers/7279bb4e-f424-442c-830c-7284440d6649/performer.json b/data/performers/7279bb4e-f424-442c-830c-7284440d6649/performer.json new file mode 100644 index 0000000..984de78 --- /dev/null +++ b/data/performers/7279bb4e-f424-442c-830c-7284440d6649/performer.json @@ -0,0 +1,18 @@ +{ + "id": "7279bb4e-f424-442c-830c-7284440d6649", + "name": "Soyogi Amamiya", + "url": "https://theporndb.net/performer/7279bb4e-f424-442c-830c-7284440d6649", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.295691" +} \ No newline at end of file diff --git a/data/performers/7556fddf-11e2-4580-8826-2436c45aea11/performer.json b/data/performers/7556fddf-11e2-4580-8826-2436c45aea11/performer.json new file mode 100644 index 0000000..d29419f --- /dev/null +++ b/data/performers/7556fddf-11e2-4580-8826-2436c45aea11/performer.json @@ -0,0 +1,18 @@ +{ + "id": "7556fddf-11e2-4580-8826-2436c45aea11", + "name": "Angie Jolina", + "url": "https://theporndb.net/performer/7556fddf-11e2-4580-8826-2436c45aea11", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.641535" +} \ No newline at end of file diff --git a/data/performers/79f11787-1fc7-427e-b815-6cef6a38b6d3/performer.json b/data/performers/79f11787-1fc7-427e-b815-6cef6a38b6d3/performer.json new file mode 100644 index 0000000..77002c7 --- /dev/null +++ b/data/performers/79f11787-1fc7-427e-b815-6cef6a38b6d3/performer.json @@ -0,0 +1,18 @@ +{ + "id": "79f11787-1fc7-427e-b815-6cef6a38b6d3", + "name": "Lexilicious Reid", + "url": "https://theporndb.net/performer/79f11787-1fc7-427e-b815-6cef6a38b6d3", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:25.800114" +} \ No newline at end of file diff --git a/data/performers/7bce4de8-3206-43d1-9f2c-f816900fa79a/performer.json b/data/performers/7bce4de8-3206-43d1-9f2c-f816900fa79a/performer.json new file mode 100644 index 0000000..183e28a --- /dev/null +++ b/data/performers/7bce4de8-3206-43d1-9f2c-f816900fa79a/performer.json @@ -0,0 +1,18 @@ +{ + "id": "7bce4de8-3206-43d1-9f2c-f816900fa79a", + "name": "Nicolas Novoa", + "url": "https://theporndb.net/performer/7bce4de8-3206-43d1-9f2c-f816900fa79a", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": null, + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:29.637441" +} \ No newline at end of file diff --git a/data/performers/7d341ba8-3fe5-496e-871b-61148ee2eaba/performer.json b/data/performers/7d341ba8-3fe5-496e-871b-61148ee2eaba/performer.json new file mode 100644 index 0000000..7aac681 --- /dev/null +++ b/data/performers/7d341ba8-3fe5-496e-871b-61148ee2eaba/performer.json @@ -0,0 +1,18 @@ +{ + "id": "7d341ba8-3fe5-496e-871b-61148ee2eaba", + "name": "Logan Roth", + "url": "https://theporndb.net/performer/7d341ba8-3fe5-496e-871b-61148ee2eaba", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.458290" +} \ No newline at end of file diff --git a/data/performers/7eb1fc26-8201-495a-8428-1a56a26efeee/performer.json b/data/performers/7eb1fc26-8201-495a-8428-1a56a26efeee/performer.json new file mode 100644 index 0000000..5beb4d0 --- /dev/null +++ b/data/performers/7eb1fc26-8201-495a-8428-1a56a26efeee/performer.json @@ -0,0 +1,18 @@ +{ + "id": "7eb1fc26-8201-495a-8428-1a56a26efeee", + "name": "Diego Aracena", + "url": "https://theporndb.net/performer/7eb1fc26-8201-495a-8428-1a56a26efeee", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.000436" +} \ No newline at end of file diff --git a/data/performers/82809dcd-5c1d-4f44-b1a9-a2be82fecd05/performer.json b/data/performers/82809dcd-5c1d-4f44-b1a9-a2be82fecd05/performer.json new file mode 100644 index 0000000..e67cbca --- /dev/null +++ b/data/performers/82809dcd-5c1d-4f44-b1a9-a2be82fecd05/performer.json @@ -0,0 +1,18 @@ +{ + "id": "82809dcd-5c1d-4f44-b1a9-a2be82fecd05", + "name": "Rileyriley Mae", + "url": "https://theporndb.net/performer/82809dcd-5c1d-4f44-b1a9-a2be82fecd05", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.755258" +} \ No newline at end of file diff --git a/data/performers/83e99bb4-ba31-4758-9332-e0d031948d47/performer.json b/data/performers/83e99bb4-ba31-4758-9332-e0d031948d47/performer.json new file mode 100644 index 0000000..a7789bd --- /dev/null +++ b/data/performers/83e99bb4-ba31-4758-9332-e0d031948d47/performer.json @@ -0,0 +1,18 @@ +{ + "id": "83e99bb4-ba31-4758-9332-e0d031948d47", + "name": "Ricky Idol", + "url": "https://theporndb.net/performer/83e99bb4-ba31-4758-9332-e0d031948d47", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.234015" +} \ No newline at end of file diff --git a/data/performers/90208299-6cff-4bba-a0c7-062445fe3b00/performer.json b/data/performers/90208299-6cff-4bba-a0c7-062445fe3b00/performer.json new file mode 100644 index 0000000..f2661d2 --- /dev/null +++ b/data/performers/90208299-6cff-4bba-a0c7-062445fe3b00/performer.json @@ -0,0 +1,18 @@ +{ + "id": "90208299-6cff-4bba-a0c7-062445fe3b00", + "name": "Sabrina Sweet", + "url": "https://theporndb.net/performer/90208299-6cff-4bba-a0c7-062445fe3b00", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.980910" +} \ No newline at end of file diff --git a/data/performers/9071b9c4-c08e-4784-853e-f43010b9972e/performer.json b/data/performers/9071b9c4-c08e-4784-853e-f43010b9972e/performer.json new file mode 100644 index 0000000..dc1a75d --- /dev/null +++ b/data/performers/9071b9c4-c08e-4784-853e-f43010b9972e/performer.json @@ -0,0 +1,18 @@ +{ + "id": "9071b9c4-c08e-4784-853e-f43010b9972e", + "name": "Amelia Ash", + "url": "https://theporndb.net/performer/9071b9c4-c08e-4784-853e-f43010b9972e", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.217243" +} \ No newline at end of file diff --git a/data/performers/9247eded-8e48-4bde-ac44-d735e2895200/performer.json b/data/performers/9247eded-8e48-4bde-ac44-d735e2895200/performer.json new file mode 100644 index 0000000..434853c --- /dev/null +++ b/data/performers/9247eded-8e48-4bde-ac44-d735e2895200/performer.json @@ -0,0 +1,18 @@ +{ + "id": "9247eded-8e48-4bde-ac44-d735e2895200", + "name": "Bibi", + "url": "https://theporndb.net/performer/9247eded-8e48-4bde-ac44-d735e2895200", + "aliases": "[\"Bibi Fox\"]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": null, + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:32.404204" +} \ No newline at end of file diff --git a/data/performers/93be2f85-5519-4a0e-a1fe-e7d077ee9966/performer.json b/data/performers/93be2f85-5519-4a0e-a1fe-e7d077ee9966/performer.json new file mode 100644 index 0000000..d3daf66 --- /dev/null +++ b/data/performers/93be2f85-5519-4a0e-a1fe-e7d077ee9966/performer.json @@ -0,0 +1,18 @@ +{ + "id": "93be2f85-5519-4a0e-a1fe-e7d077ee9966", + "name": "Mike", + "url": "https://theporndb.net/performer/93be2f85-5519-4a0e-a1fe-e7d077ee9966", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": null, + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:31.562168" +} \ No newline at end of file diff --git a/data/performers/998e289f-9910-4f49-9ccc-99e22c0e5843/performer.json b/data/performers/998e289f-9910-4f49-9ccc-99e22c0e5843/performer.json new file mode 100644 index 0000000..2353092 --- /dev/null +++ b/data/performers/998e289f-9910-4f49-9ccc-99e22c0e5843/performer.json @@ -0,0 +1,18 @@ +{ + "id": "998e289f-9910-4f49-9ccc-99e22c0e5843", + "name": "Luci Lovette", + "url": "https://theporndb.net/performer/998e289f-9910-4f49-9ccc-99e22c0e5843", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.739283" +} \ No newline at end of file diff --git a/data/performers/9adabd18-6371-472f-b346-544f210a6c2a/performer.json b/data/performers/9adabd18-6371-472f-b346-544f210a6c2a/performer.json new file mode 100644 index 0000000..f931070 --- /dev/null +++ b/data/performers/9adabd18-6371-472f-b346-544f210a6c2a/performer.json @@ -0,0 +1,18 @@ +{ + "id": "9adabd18-6371-472f-b346-544f210a6c2a", + "name": "Peter Summers", + "url": "https://theporndb.net/performer/9adabd18-6371-472f-b346-544f210a6c2a", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.183337" +} \ No newline at end of file diff --git a/data/performers/9b77a441-ecc9-4e9e-b5d0-d98a9f2e5d3e/performer.json b/data/performers/9b77a441-ecc9-4e9e-b5d0-d98a9f2e5d3e/performer.json new file mode 100644 index 0000000..e5b75bc --- /dev/null +++ b/data/performers/9b77a441-ecc9-4e9e-b5d0-d98a9f2e5d3e/performer.json @@ -0,0 +1,18 @@ +{ + "id": "9b77a441-ecc9-4e9e-b5d0-d98a9f2e5d3e", + "name": "Marek Fire", + "url": "https://theporndb.net/performer/9b77a441-ecc9-4e9e-b5d0-d98a9f2e5d3e", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": null, + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:33.796586" +} \ No newline at end of file diff --git a/data/performers/P487184.json b/data/performers/P487184.json new file mode 100644 index 0000000..738cb27 --- /dev/null +++ b/data/performers/P487184.json @@ -0,0 +1,25 @@ +{ + "id": "P487184", + "name": "faye raegan", + "aliases": [], + "gender": "-", + "birthdate": "-", + "country": "-", + "nationality": "-", + "ethnicity": "-", + "hair_color": "-", + "eye_color": "-", + "height_cm": null, + "measurements": "-", + "breast_type": "-", + "tags": [], + "thumbnail": null, + "url": "https://www.pornpics.com/pornstars/faye-raegan/", + "stats": { + "total_galleries": 0 + }, + "source": "PornPics", + "sources": { + "pornpics": "https://www.pornpics.com/pornstars/faye-raegan/" + } +} \ No newline at end of file diff --git a/data/performers/PP10802.json b/data/performers/PP10802.json new file mode 100644 index 0000000..aa2a372 --- /dev/null +++ b/data/performers/PP10802.json @@ -0,0 +1,34 @@ +{ + "id": "PP10802", + "name": "Sasha Grey", + "aliases": [ + "Sasha Gray" + ], + "gender": "Female", + "birthdate": "1988-03-14", + "country": "United States", + "nationality": "American", + "ethnicity": "White", + "hair_color": "Brunette", + "eye_color": "-", + "height_cm": 170, + "measurements": "32B-26-31", + "breast_type": "Natural Tits", + "tags": [ + "American", + "Brunette", + "Natural Tits", + "Skinny", + "Tiny Tits", + "White" + ], + "thumbnail": "https://cdni.pornpics.com/models/s/sasha_grey.jpg", + "url": "https://www.pornpics.com/pornstars/sasha-grey/", + "stats": { + "total_galleries": 371 + }, + "source": "PornPics", + "sources": { + "pornpics": "https://www.pornpics.com/pornstars/sasha-grey/" + } +} \ No newline at end of file diff --git a/data/performers/PP17020.json b/data/performers/PP17020.json new file mode 100644 index 0000000..51bcce9 --- /dev/null +++ b/data/performers/PP17020.json @@ -0,0 +1,32 @@ +{ + "id": "PP17020", + "name": "Mia Split", + "aliases": [], + "gender": "Female", + "birthdate": "", + "country": "Russian Federation", + "nationality": "Russian", + "ethnicity": "White", + "hair_color": "Brunette", + "eye_color": "-", + "height_cm": null, + "measurements": "??-??-??", + "breast_type": "Natural Tits", + "tags": [ + "Brunette", + "Natural Tits", + "Petite", + "Russian", + "Tiny Tits", + "White" + ], + "thumbnail": "https://cdni.pornpics.com/models/m/mia_split.jpg", + "url": "https://www.pornpics.com/pornstars/mia-split/", + "stats": { + "total_galleries": 73 + }, + "source": "PornPics", + "sources": { + "pornpics": "https://www.pornpics.com/pornstars/mia-split/" + } +} \ No newline at end of file diff --git a/data/performers/PP21083.json b/data/performers/PP21083.json new file mode 100644 index 0000000..c5ea452 --- /dev/null +++ b/data/performers/PP21083.json @@ -0,0 +1,32 @@ +{ + "id": "PP21083", + "name": "J Mac", + "aliases": [ + "Jmac" + ], + "gender": "Male", + "birthdate": "1985-03-12", + "country": "United States", + "nationality": "American", + "ethnicity": "White", + "hair_color": "Brunette", + "eye_color": "-", + "height_cm": 185, + "measurements": "", + "breast_type": "", + "tags": [ + "American", + "Brunette", + "Tattoo", + "White" + ], + "thumbnail": "https://cdni.pornpics.com/models/j/j_mac.jpg", + "url": "https://www.pornpics.com/pornstars/j-mac/", + "stats": { + "total_galleries": 2277 + }, + "source": "PornPics", + "sources": { + "pornpics": "https://www.pornpics.com/pornstars/j-mac/" + } +} \ No newline at end of file diff --git a/data/performers/PP21647.json b/data/performers/PP21647.json new file mode 100644 index 0000000..39cebcd --- /dev/null +++ b/data/performers/PP21647.json @@ -0,0 +1,36 @@ +{ + "id": "PP21647", + "name": "Johnny Sins", + "aliases": [ + "Jonny Sins", + "Johnny Sinns", + "Johnny Sinn", + "Johny Sins", + "Jhonny Sins" + ], + "gender": "Male", + "birthdate": "1978-12-31", + "country": "United States", + "nationality": "American", + "ethnicity": "White", + "hair_color": "Brunette", + "eye_color": "-", + "height_cm": 183, + "measurements": "", + "breast_type": "", + "tags": [ + "American", + "Bald", + "Brunette", + "White" + ], + "thumbnail": "https://cdni.pornpics.com/models/j/johnny_sins.jpg", + "url": "https://www.pornpics.com/pornstars/johnny-sins/", + "stats": { + "total_galleries": 2081 + }, + "source": "PornPics", + "sources": { + "pornpics": "https://www.pornpics.com/pornstars/johnny-sins/" + } +} \ No newline at end of file diff --git a/data/performers/PP3684.json b/data/performers/PP3684.json new file mode 100644 index 0000000..9973c1d --- /dev/null +++ b/data/performers/PP3684.json @@ -0,0 +1,33 @@ +{ + "id": "PP3684", + "name": "Alexis Texas", + "aliases": [], + "gender": "Female", + "birthdate": "1985-05-25", + "country": "United States", + "nationality": "American", + "ethnicity": "White", + "hair_color": "Blonde", + "eye_color": "-", + "height_cm": 173, + "measurements": "34C-27-40", + "breast_type": "Natural Tits", + "tags": [ + "American", + "Blonde", + "MILF", + "Natural Tits", + "Puerto Rican", + "Tiny Tits", + "White" + ], + "thumbnail": "https://cdni.pornpics.com/models/a/alexis_texas.jpg", + "url": "https://www.pornpics.com/pornstars/alexis-texas/", + "stats": { + "total_galleries": 1060 + }, + "source": "PornPics", + "sources": { + "pornpics": "https://www.pornpics.com/pornstars/alexis-texas/" + } +} \ No newline at end of file diff --git a/data/performers/PP4806.json b/data/performers/PP4806.json new file mode 100644 index 0000000..30b4c6c --- /dev/null +++ b/data/performers/PP4806.json @@ -0,0 +1,36 @@ +{ + "id": "PP4806", + "name": "Faye Reagan", + "aliases": [ + "Faye B", + "Faye Raegan", + "Faye Regan", + "Faye Reagen" + ], + "gender": "Female", + "birthdate": "1988-09-19", + "country": "United States", + "nationality": "American", + "ethnicity": "White", + "hair_color": "Redhead", + "eye_color": "-", + "height_cm": 163, + "measurements": "34C-28-36", + "breast_type": "Natural Tits", + "tags": [ + "American", + "MILF", + "Natural Tits", + "Redhead", + "White" + ], + "thumbnail": "https://cdni.pornpics.com/models/f/faye_reagan.jpg", + "url": "https://www.pornpics.com/pornstars/faye-reagan/", + "stats": { + "total_galleries": 549 + }, + "source": "PornPics", + "sources": { + "pornpics": "https://www.pornpics.com/pornstars/faye-reagan/" + } +} \ No newline at end of file diff --git a/data/performers/PP4988.json b/data/performers/PP4988.json new file mode 100644 index 0000000..1e9c6b9 --- /dev/null +++ b/data/performers/PP4988.json @@ -0,0 +1,40 @@ +{ + "id": "PP4988", + "name": "Monique Alexander", + "aliases": [ + "Monique Alexandre", + "Savannah Moore", + "Briana Burke", + "Monique Alex" + ], + "gender": "Female", + "birthdate": "1982-05-26", + "country": "United States", + "nationality": "American", + "ethnicity": "White", + "hair_color": "Redhead", + "eye_color": "-", + "height_cm": 165, + "measurements": "32C-24-34", + "breast_type": "Fake Tits", + "tags": [ + "American", + "Fake Tits", + "MILF", + "Portuguese", + "Redhead", + "Skinny", + "Tattoo", + "Tiny Tits", + "White" + ], + "thumbnail": "https://cdni.pornpics.com/models/m/monique_alexander.jpg", + "url": "https://www.pornpics.com/pornstars/monique-alexander/", + "stats": { + "total_galleries": 1017 + }, + "source": "PornPics", + "sources": { + "pornpics": "https://www.pornpics.com/pornstars/monique-alexander/" + } +} \ No newline at end of file diff --git a/data/performers/PP899.json b/data/performers/PP899.json new file mode 100644 index 0000000..0c7ff9f --- /dev/null +++ b/data/performers/PP899.json @@ -0,0 +1,38 @@ +{ + "id": "PP899", + "name": "Madison Scott", + "aliases": [ + "Madison Scot" + ], + "gender": "Female", + "birthdate": "1988-07-13", + "country": "United States", + "nationality": "American", + "ethnicity": "White", + "hair_color": "Blonde", + "eye_color": "-", + "height_cm": 155, + "measurements": "32DD-20-26", + "breast_type": "Fake Tits", + "tags": [ + "American", + "Big Tits", + "Blonde", + "Fake Tits", + "MILF", + "Petite", + "Short", + "Skinny", + "Tattoo", + "White" + ], + "thumbnail": "https://cdni.pornpics.com/models/m/madison_scott.jpg", + "url": "https://www.pornpics.com/pornstars/madison-scott/", + "stats": { + "total_galleries": 385 + }, + "source": "PornPics", + "sources": { + "pornpics": "https://www.pornpics.com/pornstars/madison-scott/" + } +} \ No newline at end of file diff --git a/data/performers/a32c1c26-6c22-44fc-a4a2-f8956da2f485/performer.json b/data/performers/a32c1c26-6c22-44fc-a4a2-f8956da2f485/performer.json new file mode 100644 index 0000000..dcf1a68 --- /dev/null +++ b/data/performers/a32c1c26-6c22-44fc-a4a2-f8956da2f485/performer.json @@ -0,0 +1,18 @@ +{ + "id": "a32c1c26-6c22-44fc-a4a2-f8956da2f485", + "name": "O1st Xxx", + "url": "https://theporndb.net/performer/a32c1c26-6c22-44fc-a4a2-f8956da2f485", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:25.981628" +} \ No newline at end of file diff --git a/data/performers/a379151c-67d5-41d4-853f-1773ad515fbf/performer.json b/data/performers/a379151c-67d5-41d4-853f-1773ad515fbf/performer.json new file mode 100644 index 0000000..f37a2e5 --- /dev/null +++ b/data/performers/a379151c-67d5-41d4-853f-1773ad515fbf/performer.json @@ -0,0 +1,18 @@ +{ + "id": "a379151c-67d5-41d4-853f-1773ad515fbf", + "name": "The Real Diabla", + "url": "https://theporndb.net/performer/a379151c-67d5-41d4-853f-1773ad515fbf", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.425449" +} \ No newline at end of file diff --git a/data/performers/a3d6765e-3e7e-4046-8bf3-b315b8abb747/performer.json b/data/performers/a3d6765e-3e7e-4046-8bf3-b315b8abb747/performer.json new file mode 100644 index 0000000..aae132b --- /dev/null +++ b/data/performers/a3d6765e-3e7e-4046-8bf3-b315b8abb747/performer.json @@ -0,0 +1,18 @@ +{ + "id": "a3d6765e-3e7e-4046-8bf3-b315b8abb747", + "name": "Kittymocap Cgi", + "url": "https://theporndb.net/performer/a3d6765e-3e7e-4046-8bf3-b315b8abb747", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:25.767704" +} \ No newline at end of file diff --git a/data/performers/a4ff8226-47ed-4836-a377-a3692cd0b071/performer.json b/data/performers/a4ff8226-47ed-4836-a377-a3692cd0b071/performer.json new file mode 100644 index 0000000..65c39bb --- /dev/null +++ b/data/performers/a4ff8226-47ed-4836-a377-a3692cd0b071/performer.json @@ -0,0 +1,18 @@ +{ + "id": "a4ff8226-47ed-4836-a377-a3692cd0b071", + "name": "Alejandro Alzate", + "url": "https://theporndb.net/performer/a4ff8226-47ed-4836-a377-a3692cd0b071", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:25.735925" +} \ No newline at end of file diff --git a/data/performers/a6a3dfde-c755-4cdf-8a5d-f89294800d44/performer.json b/data/performers/a6a3dfde-c755-4cdf-8a5d-f89294800d44/performer.json new file mode 100644 index 0000000..6aa8869 --- /dev/null +++ b/data/performers/a6a3dfde-c755-4cdf-8a5d-f89294800d44/performer.json @@ -0,0 +1,18 @@ +{ + "id": "a6a3dfde-c755-4cdf-8a5d-f89294800d44", + "name": "Citah Manson", + "url": "https://theporndb.net/performer/a6a3dfde-c755-4cdf-8a5d-f89294800d44", + "aliases": "[\"Citah\", \"Citah69\"]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.539911" +} \ No newline at end of file diff --git a/data/performers/a7b79a20-2554-46df-962d-b25a171f3506/performer.json b/data/performers/a7b79a20-2554-46df-962d-b25a171f3506/performer.json new file mode 100644 index 0000000..55c8029 --- /dev/null +++ b/data/performers/a7b79a20-2554-46df-962d-b25a171f3506/performer.json @@ -0,0 +1,18 @@ +{ + "id": "a7b79a20-2554-46df-962d-b25a171f3506", + "name": "Dahlia Fvr", + "url": "https://theporndb.net/performer/a7b79a20-2554-46df-962d-b25a171f3506", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.280206" +} \ No newline at end of file diff --git a/data/performers/aab0808b-4d84-424e-87d8-eb973aa98ce3/performer.json b/data/performers/aab0808b-4d84-424e-87d8-eb973aa98ce3/performer.json new file mode 100644 index 0000000..65124c6 --- /dev/null +++ b/data/performers/aab0808b-4d84-424e-87d8-eb973aa98ce3/performer.json @@ -0,0 +1,18 @@ +{ + "id": "aab0808b-4d84-424e-87d8-eb973aa98ce3", + "name": "Sanae Kiyoshige", + "url": "https://theporndb.net/performer/aab0808b-4d84-424e-87d8-eb973aa98ce3", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.556915" +} \ No newline at end of file diff --git a/data/performers/alexis-texas.json b/data/performers/alexis-texas.json new file mode 100644 index 0000000..9973c1d --- /dev/null +++ b/data/performers/alexis-texas.json @@ -0,0 +1,33 @@ +{ + "id": "PP3684", + "name": "Alexis Texas", + "aliases": [], + "gender": "Female", + "birthdate": "1985-05-25", + "country": "United States", + "nationality": "American", + "ethnicity": "White", + "hair_color": "Blonde", + "eye_color": "-", + "height_cm": 173, + "measurements": "34C-27-40", + "breast_type": "Natural Tits", + "tags": [ + "American", + "Blonde", + "MILF", + "Natural Tits", + "Puerto Rican", + "Tiny Tits", + "White" + ], + "thumbnail": "https://cdni.pornpics.com/models/a/alexis_texas.jpg", + "url": "https://www.pornpics.com/pornstars/alexis-texas/", + "stats": { + "total_galleries": 1060 + }, + "source": "PornPics", + "sources": { + "pornpics": "https://www.pornpics.com/pornstars/alexis-texas/" + } +} \ No newline at end of file diff --git a/data/performers/b0c35557-470f-4bae-9818-22e433da8174/performer.json b/data/performers/b0c35557-470f-4bae-9818-22e433da8174/performer.json new file mode 100644 index 0000000..6e55a8f --- /dev/null +++ b/data/performers/b0c35557-470f-4bae-9818-22e433da8174/performer.json @@ -0,0 +1,18 @@ +{ + "id": "b0c35557-470f-4bae-9818-22e433da8174", + "name": "Master Sir Alex Payne", + "url": "https://theporndb.net/performer/b0c35557-470f-4bae-9818-22e433da8174", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.828539" +} \ No newline at end of file diff --git a/data/performers/b1878fa0-08c8-44e1-be3c-9c0efe88fc45/performer.json b/data/performers/b1878fa0-08c8-44e1-be3c-9c0efe88fc45/performer.json new file mode 100644 index 0000000..d0a7023 --- /dev/null +++ b/data/performers/b1878fa0-08c8-44e1-be3c-9c0efe88fc45/performer.json @@ -0,0 +1,18 @@ +{ + "id": "b1878fa0-08c8-44e1-be3c-9c0efe88fc45", + "name": "Connor Peters", + "url": "https://theporndb.net/performer/b1878fa0-08c8-44e1-be3c-9c0efe88fc45", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.166937" +} \ No newline at end of file diff --git a/data/performers/b245fca1-4bd8-4670-9030-79b8987a90e7/performer.json b/data/performers/b245fca1-4bd8-4670-9030-79b8987a90e7/performer.json new file mode 100644 index 0000000..2abe490 --- /dev/null +++ b/data/performers/b245fca1-4bd8-4670-9030-79b8987a90e7/performer.json @@ -0,0 +1,18 @@ +{ + "id": "b245fca1-4bd8-4670-9030-79b8987a90e7", + "name": "Kenneth Anderson", + "url": "https://theporndb.net/performer/b245fca1-4bd8-4670-9030-79b8987a90e7", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": null, + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:38.439708" +} \ No newline at end of file diff --git a/data/performers/b433f066-fa57-4c4a-b76f-c5e326201a2e/performer.json b/data/performers/b433f066-fa57-4c4a-b76f-c5e326201a2e/performer.json new file mode 100644 index 0000000..69464c8 --- /dev/null +++ b/data/performers/b433f066-fa57-4c4a-b76f-c5e326201a2e/performer.json @@ -0,0 +1,18 @@ +{ + "id": "b433f066-fa57-4c4a-b76f-c5e326201a2e", + "name": "Nova Tevez", + "url": "https://theporndb.net/performer/b433f066-fa57-4c4a-b76f-c5e326201a2e", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.960566" +} \ No newline at end of file diff --git a/data/performers/b615735f-94da-4fae-b55c-59072384809d/performer.json b/data/performers/b615735f-94da-4fae-b55c-59072384809d/performer.json new file mode 100644 index 0000000..bdbc8c0 --- /dev/null +++ b/data/performers/b615735f-94da-4fae-b55c-59072384809d/performer.json @@ -0,0 +1,18 @@ +{ + "id": "b615735f-94da-4fae-b55c-59072384809d", + "name": "Luciano Lutti", + "url": "https://theporndb.net/performer/b615735f-94da-4fae-b55c-59072384809d", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.474882" +} \ No newline at end of file diff --git a/data/performers/b71db76e-7f0b-4049-bd24-29707ffe0621/performer.json b/data/performers/b71db76e-7f0b-4049-bd24-29707ffe0621/performer.json new file mode 100644 index 0000000..4a65055 --- /dev/null +++ b/data/performers/b71db76e-7f0b-4049-bd24-29707ffe0621/performer.json @@ -0,0 +1,18 @@ +{ + "id": "b71db76e-7f0b-4049-bd24-29707ffe0621", + "name": "Jessajessa Jordan", + "url": "https://theporndb.net/performer/b71db76e-7f0b-4049-bd24-29707ffe0621", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.809425" +} \ No newline at end of file diff --git a/data/performers/b87a5b3a-01d6-4314-a087-aba786ecfba4/performer.json b/data/performers/b87a5b3a-01d6-4314-a087-aba786ecfba4/performer.json new file mode 100644 index 0000000..230ab88 --- /dev/null +++ b/data/performers/b87a5b3a-01d6-4314-a087-aba786ecfba4/performer.json @@ -0,0 +1,18 @@ +{ + "id": "b87a5b3a-01d6-4314-a087-aba786ecfba4", + "name": "Kinky Bitch", + "url": "https://theporndb.net/performer/b87a5b3a-01d6-4314-a087-aba786ecfba4", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.050693" +} \ No newline at end of file diff --git a/data/performers/b888b8da-c3b4-44c1-92aa-2b9521b52a0a/performer.json b/data/performers/b888b8da-c3b4-44c1-92aa-2b9521b52a0a/performer.json new file mode 100644 index 0000000..edb0920 --- /dev/null +++ b/data/performers/b888b8da-c3b4-44c1-92aa-2b9521b52a0a/performer.json @@ -0,0 +1,18 @@ +{ + "id": "b888b8da-c3b4-44c1-92aa-2b9521b52a0a", + "name": "Domina Ava Savage", + "url": "https://theporndb.net/performer/b888b8da-c3b4-44c1-92aa-2b9521b52a0a", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:25.817034" +} \ No newline at end of file diff --git a/data/performers/c56fd205-3a75-4a73-9c4c-95a2c901c8bf/performer.json b/data/performers/c56fd205-3a75-4a73-9c4c-95a2c901c8bf/performer.json new file mode 100644 index 0000000..58d1228 --- /dev/null +++ b/data/performers/c56fd205-3a75-4a73-9c4c-95a2c901c8bf/performer.json @@ -0,0 +1,18 @@ +{ + "id": "c56fd205-3a75-4a73-9c4c-95a2c901c8bf", + "name": "Reika Makino", + "url": "https://theporndb.net/performer/c56fd205-3a75-4a73-9c4c-95a2c901c8bf", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.311907" +} \ No newline at end of file diff --git a/data/performers/c6175cb7-142c-40ba-b1f2-850bb23bb121/performer.json b/data/performers/c6175cb7-142c-40ba-b1f2-850bb23bb121/performer.json new file mode 100644 index 0000000..dd5bf8e --- /dev/null +++ b/data/performers/c6175cb7-142c-40ba-b1f2-850bb23bb121/performer.json @@ -0,0 +1,18 @@ +{ + "id": "c6175cb7-142c-40ba-b1f2-850bb23bb121", + "name": "Yulija Malkika", + "url": "https://theporndb.net/performer/c6175cb7-142c-40ba-b1f2-850bb23bb121", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.624469" +} \ No newline at end of file diff --git a/data/performers/c64e3a3d-6657-460c-a03d-f753954e4110/performer.json b/data/performers/c64e3a3d-6657-460c-a03d-f753954e4110/performer.json new file mode 100644 index 0000000..ac038d0 --- /dev/null +++ b/data/performers/c64e3a3d-6657-460c-a03d-f753954e4110/performer.json @@ -0,0 +1,18 @@ +{ + "id": "c64e3a3d-6657-460c-a03d-f753954e4110", + "name": "Sumiko Dreams", + "url": "https://theporndb.net/performer/c64e3a3d-6657-460c-a03d-f753954e4110", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:25.834255" +} \ No newline at end of file diff --git a/data/performers/d0b993ce-fc6b-4bab-983b-b02290525681/performer.json b/data/performers/d0b993ce-fc6b-4bab-983b-b02290525681/performer.json new file mode 100644 index 0000000..cc17712 --- /dev/null +++ b/data/performers/d0b993ce-fc6b-4bab-983b-b02290525681/performer.json @@ -0,0 +1,18 @@ +{ + "id": "d0b993ce-fc6b-4bab-983b-b02290525681", + "name": "Luna 32 B2434", + "url": "https://theporndb.net/performer/d0b993ce-fc6b-4bab-983b-b02290525681", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:25.869054" +} \ No newline at end of file diff --git a/data/performers/d1085beb-c80e-4765-af26-e65f16fcb7c1/performer.json b/data/performers/d1085beb-c80e-4765-af26-e65f16fcb7c1/performer.json new file mode 100644 index 0000000..3e247ee --- /dev/null +++ b/data/performers/d1085beb-c80e-4765-af26-e65f16fcb7c1/performer.json @@ -0,0 +1,18 @@ +{ + "id": "d1085beb-c80e-4765-af26-e65f16fcb7c1", + "name": "Erocom Yuakari", + "url": "https://theporndb.net/performer/d1085beb-c80e-4765-af26-e65f16fcb7c1", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.408568" +} \ No newline at end of file diff --git a/data/performers/d8fa3627-75d9-4026-9eea-00a9f9c023fe/performer.json b/data/performers/d8fa3627-75d9-4026-9eea-00a9f9c023fe/performer.json new file mode 100644 index 0000000..0663f81 --- /dev/null +++ b/data/performers/d8fa3627-75d9-4026-9eea-00a9f9c023fe/performer.json @@ -0,0 +1,18 @@ +{ + "id": "d8fa3627-75d9-4026-9eea-00a9f9c023fe", + "name": "Amori", + "url": "https://theporndb.net/performer/d8fa3627-75d9-4026-9eea-00a9f9c023fe", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": null, + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:28.237363" +} \ No newline at end of file diff --git a/data/performers/dd555c22-b5ac-41ee-a783-8831cafaa2a9/performer.json b/data/performers/dd555c22-b5ac-41ee-a783-8831cafaa2a9/performer.json new file mode 100644 index 0000000..3e2b84b --- /dev/null +++ b/data/performers/dd555c22-b5ac-41ee-a783-8831cafaa2a9/performer.json @@ -0,0 +1,18 @@ +{ + "id": "dd555c22-b5ac-41ee-a783-8831cafaa2a9", + "name": "Oliver Clothesoff", + "url": "https://theporndb.net/performer/dd555c22-b5ac-41ee-a783-8831cafaa2a9", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": null, + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:35.514375" +} \ No newline at end of file diff --git a/data/performers/dd6bd00a-2a54-492a-a6a5-00004f923c2f/performer.json b/data/performers/dd6bd00a-2a54-492a-a6a5-00004f923c2f/performer.json new file mode 100644 index 0000000..c24fbb9 --- /dev/null +++ b/data/performers/dd6bd00a-2a54-492a-a6a5-00004f923c2f/performer.json @@ -0,0 +1,18 @@ +{ + "id": "dd6bd00a-2a54-492a-a6a5-00004f923c2f", + "name": "Christian Black", + "url": "https://theporndb.net/performer/dd6bd00a-2a54-492a-a6a5-00004f923c2f", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": null, + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:34.228030" +} \ No newline at end of file diff --git a/data/performers/ddfd7716-9b9e-4c9c-9860-5fea74912dd3/performer.json b/data/performers/ddfd7716-9b9e-4c9c-9860-5fea74912dd3/performer.json new file mode 100644 index 0000000..3fea4f2 --- /dev/null +++ b/data/performers/ddfd7716-9b9e-4c9c-9860-5fea74912dd3/performer.json @@ -0,0 +1,18 @@ +{ + "id": "ddfd7716-9b9e-4c9c-9860-5fea74912dd3", + "name": "Natalia Dark", + "url": "https://theporndb.net/performer/ddfd7716-9b9e-4c9c-9860-5fea74912dd3", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:25.783942" +} \ No newline at end of file diff --git a/data/performers/e3a55de0-acbb-4089-b9be-d521548e2a91/performer.json b/data/performers/e3a55de0-acbb-4089-b9be-d521548e2a91/performer.json new file mode 100644 index 0000000..648ac5a --- /dev/null +++ b/data/performers/e3a55de0-acbb-4089-b9be-d521548e2a91/performer.json @@ -0,0 +1,18 @@ +{ + "id": "e3a55de0-acbb-4089-b9be-d521548e2a91", + "name": "Dic Tracy", + "url": "https://theporndb.net/performer/e3a55de0-acbb-4089-b9be-d521548e2a91", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": null, + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:35.955467" +} \ No newline at end of file diff --git a/data/performers/e645db83-24bb-4d65-a166-91787f1f3c40/performer.json b/data/performers/e645db83-24bb-4d65-a166-91787f1f3c40/performer.json new file mode 100644 index 0000000..4fd7207 --- /dev/null +++ b/data/performers/e645db83-24bb-4d65-a166-91787f1f3c40/performer.json @@ -0,0 +1,18 @@ +{ + "id": "e645db83-24bb-4d65-a166-91787f1f3c40", + "name": "Bandida Do Funk", + "url": "https://theporndb.net/performer/e645db83-24bb-4d65-a166-91787f1f3c40", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.392338" +} \ No newline at end of file diff --git a/data/performers/e7972b51-145a-4041-b390-aae1d0044f6e/performer.json b/data/performers/e7972b51-145a-4041-b390-aae1d0044f6e/performer.json new file mode 100644 index 0000000..d4baa29 --- /dev/null +++ b/data/performers/e7972b51-145a-4041-b390-aae1d0044f6e/performer.json @@ -0,0 +1,18 @@ +{ + "id": "e7972b51-145a-4041-b390-aae1d0044f6e", + "name": "Jessajessa Jordan", + "url": "https://theporndb.net/performer/e7972b51-145a-4041-b390-aae1d0044f6e", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.793030" +} \ No newline at end of file diff --git a/data/performers/e9a7ba8b-e6b4-49e8-bf31-3cdb94e7b06a/performer.json b/data/performers/e9a7ba8b-e6b4-49e8-bf31-3cdb94e7b06a/performer.json new file mode 100644 index 0000000..fa68b2b --- /dev/null +++ b/data/performers/e9a7ba8b-e6b4-49e8-bf31-3cdb94e7b06a/performer.json @@ -0,0 +1,18 @@ +{ + "id": "e9a7ba8b-e6b4-49e8-bf31-3cdb94e7b06a", + "name": "Mike", + "url": "https://theporndb.net/performer/e9a7ba8b-e6b4-49e8-bf31-3cdb94e7b06a", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": null, + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:35.076234" +} \ No newline at end of file diff --git a/data/performers/ecaf9000-d1e3-4553-b181-b7855c9805b6/performer.json b/data/performers/ecaf9000-d1e3-4553-b181-b7855c9805b6/performer.json new file mode 100644 index 0000000..d2f4cee --- /dev/null +++ b/data/performers/ecaf9000-d1e3-4553-b181-b7855c9805b6/performer.json @@ -0,0 +1,18 @@ +{ + "id": "ecaf9000-d1e3-4553-b181-b7855c9805b6", + "name": "Martina Sinblond", + "url": "https://theporndb.net/performer/ecaf9000-d1e3-4553-b181-b7855c9805b6", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.083516" +} \ No newline at end of file diff --git a/data/performers/ed1dfb9e-2ef2-4edc-b037-12646434307e/performer.json b/data/performers/ed1dfb9e-2ef2-4edc-b037-12646434307e/performer.json new file mode 100644 index 0000000..bcb1822 --- /dev/null +++ b/data/performers/ed1dfb9e-2ef2-4edc-b037-12646434307e/performer.json @@ -0,0 +1,18 @@ +{ + "id": "ed1dfb9e-2ef2-4edc-b037-12646434307e", + "name": "Valentina Crush", + "url": "https://theporndb.net/performer/ed1dfb9e-2ef2-4edc-b037-12646434307e", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.916999" +} \ No newline at end of file diff --git a/data/performers/ef182473-6644-4d58-a210-7fb215358795/performer.json b/data/performers/ef182473-6644-4d58-a210-7fb215358795/performer.json new file mode 100644 index 0000000..556d2b4 --- /dev/null +++ b/data/performers/ef182473-6644-4d58-a210-7fb215358795/performer.json @@ -0,0 +1,18 @@ +{ + "id": "ef182473-6644-4d58-a210-7fb215358795", + "name": "Benjamin Xl", + "url": "https://theporndb.net/performer/ef182473-6644-4d58-a210-7fb215358795", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.018422" +} \ No newline at end of file diff --git a/data/performers/f5a8e799-1d79-4edb-bc64-c5bae81ace23/performer.json b/data/performers/f5a8e799-1d79-4edb-bc64-c5bae81ace23/performer.json new file mode 100644 index 0000000..a7424a7 --- /dev/null +++ b/data/performers/f5a8e799-1d79-4edb-bc64-c5bae81ace23/performer.json @@ -0,0 +1,18 @@ +{ + "id": "f5a8e799-1d79-4edb-bc64-c5bae81ace23", + "name": "Elliott Thomas", + "url": "https://theporndb.net/performer/f5a8e799-1d79-4edb-bc64-c5bae81ace23", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:25.938209" +} \ No newline at end of file diff --git a/data/performers/f72ead88-f212-49ad-9ef9-53fd8a3d148d/performer.json b/data/performers/f72ead88-f212-49ad-9ef9-53fd8a3d148d/performer.json new file mode 100644 index 0000000..80802e0 --- /dev/null +++ b/data/performers/f72ead88-f212-49ad-9ef9-53fd8a3d148d/performer.json @@ -0,0 +1,18 @@ +{ + "id": "f72ead88-f212-49ad-9ef9-53fd8a3d148d", + "name": "Milli George", + "url": "https://theporndb.net/performer/f72ead88-f212-49ad-9ef9-53fd8a3d148d", + "aliases": "[\"Amelia George\"]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": null, + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:37.075856" +} \ No newline at end of file diff --git a/data/performers/f8f6d764-887d-4c77-91d7-f8b357f9f95e/performer.json b/data/performers/f8f6d764-887d-4c77-91d7-f8b357f9f95e/performer.json new file mode 100644 index 0000000..aa6bb60 --- /dev/null +++ b/data/performers/f8f6d764-887d-4c77-91d7-f8b357f9f95e/performer.json @@ -0,0 +1,18 @@ +{ + "id": "f8f6d764-887d-4c77-91d7-f8b357f9f95e", + "name": "Naomi Swaan", + "url": "https://theporndb.net/performer/f8f6d764-887d-4c77-91d7-f8b357f9f95e", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.723780" +} \ No newline at end of file diff --git a/data/performers/f94f90ed-df41-4a4c-9b7c-b53e2d5118f7/performer.json b/data/performers/f94f90ed-df41-4a4c-9b7c-b53e2d5118f7/performer.json new file mode 100644 index 0000000..89fca42 --- /dev/null +++ b/data/performers/f94f90ed-df41-4a4c-9b7c-b53e2d5118f7/performer.json @@ -0,0 +1,18 @@ +{ + "id": "f94f90ed-df41-4a4c-9b7c-b53e2d5118f7", + "name": "Torsten Harnisch", + "url": "https://theporndb.net/performer/f94f90ed-df41-4a4c-9b7c-b53e2d5118f7", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:27.063967" +} \ No newline at end of file diff --git a/data/performers/faye-reagan.json b/data/performers/faye-reagan.json new file mode 100644 index 0000000..30b4c6c --- /dev/null +++ b/data/performers/faye-reagan.json @@ -0,0 +1,36 @@ +{ + "id": "PP4806", + "name": "Faye Reagan", + "aliases": [ + "Faye B", + "Faye Raegan", + "Faye Regan", + "Faye Reagen" + ], + "gender": "Female", + "birthdate": "1988-09-19", + "country": "United States", + "nationality": "American", + "ethnicity": "White", + "hair_color": "Redhead", + "eye_color": "-", + "height_cm": 163, + "measurements": "34C-28-36", + "breast_type": "Natural Tits", + "tags": [ + "American", + "MILF", + "Natural Tits", + "Redhead", + "White" + ], + "thumbnail": "https://cdni.pornpics.com/models/f/faye_reagan.jpg", + "url": "https://www.pornpics.com/pornstars/faye-reagan/", + "stats": { + "total_galleries": 549 + }, + "source": "PornPics", + "sources": { + "pornpics": "https://www.pornpics.com/pornstars/faye-reagan/" + } +} \ No newline at end of file diff --git a/data/performers/fc0ebcbe-2885-43d5-a330-cd30ebbe1aef/performer.json b/data/performers/fc0ebcbe-2885-43d5-a330-cd30ebbe1aef/performer.json new file mode 100644 index 0000000..58f1ab1 --- /dev/null +++ b/data/performers/fc0ebcbe-2885-43d5-a330-cd30ebbe1aef/performer.json @@ -0,0 +1,18 @@ +{ + "id": "fc0ebcbe-2885-43d5-a330-cd30ebbe1aef", + "name": "Angelika Vrgoddess", + "url": "https://theporndb.net/performer/fc0ebcbe-2885-43d5-a330-cd30ebbe1aef", + "aliases": "[]", + "gender": "Unknown", + "birthdate": null, + "ethnicity": null, + "hair_color": null, + "eye_color": null, + "height_cm": null, + "measurements": null, + "nationality": "Unknown", + "country_code": null, + "tags": null, + "source": "TPDB", + "last_updated": "2025-10-27T00:31:26.691665" +} \ No newline at end of file diff --git a/data/performers/j-mac.json b/data/performers/j-mac.json new file mode 100644 index 0000000..c5ea452 --- /dev/null +++ b/data/performers/j-mac.json @@ -0,0 +1,32 @@ +{ + "id": "PP21083", + "name": "J Mac", + "aliases": [ + "Jmac" + ], + "gender": "Male", + "birthdate": "1985-03-12", + "country": "United States", + "nationality": "American", + "ethnicity": "White", + "hair_color": "Brunette", + "eye_color": "-", + "height_cm": 185, + "measurements": "", + "breast_type": "", + "tags": [ + "American", + "Brunette", + "Tattoo", + "White" + ], + "thumbnail": "https://cdni.pornpics.com/models/j/j_mac.jpg", + "url": "https://www.pornpics.com/pornstars/j-mac/", + "stats": { + "total_galleries": 2277 + }, + "source": "PornPics", + "sources": { + "pornpics": "https://www.pornpics.com/pornstars/j-mac/" + } +} \ No newline at end of file diff --git a/data/performers/johnny-sins.json b/data/performers/johnny-sins.json new file mode 100644 index 0000000..39cebcd --- /dev/null +++ b/data/performers/johnny-sins.json @@ -0,0 +1,36 @@ +{ + "id": "PP21647", + "name": "Johnny Sins", + "aliases": [ + "Jonny Sins", + "Johnny Sinns", + "Johnny Sinn", + "Johny Sins", + "Jhonny Sins" + ], + "gender": "Male", + "birthdate": "1978-12-31", + "country": "United States", + "nationality": "American", + "ethnicity": "White", + "hair_color": "Brunette", + "eye_color": "-", + "height_cm": 183, + "measurements": "", + "breast_type": "", + "tags": [ + "American", + "Bald", + "Brunette", + "White" + ], + "thumbnail": "https://cdni.pornpics.com/models/j/johnny_sins.jpg", + "url": "https://www.pornpics.com/pornstars/johnny-sins/", + "stats": { + "total_galleries": 2081 + }, + "source": "PornPics", + "sources": { + "pornpics": "https://www.pornpics.com/pornstars/johnny-sins/" + } +} \ No newline at end of file diff --git a/data/performers/madison-scott.json b/data/performers/madison-scott.json new file mode 100644 index 0000000..0c7ff9f --- /dev/null +++ b/data/performers/madison-scott.json @@ -0,0 +1,38 @@ +{ + "id": "PP899", + "name": "Madison Scott", + "aliases": [ + "Madison Scot" + ], + "gender": "Female", + "birthdate": "1988-07-13", + "country": "United States", + "nationality": "American", + "ethnicity": "White", + "hair_color": "Blonde", + "eye_color": "-", + "height_cm": 155, + "measurements": "32DD-20-26", + "breast_type": "Fake Tits", + "tags": [ + "American", + "Big Tits", + "Blonde", + "Fake Tits", + "MILF", + "Petite", + "Short", + "Skinny", + "Tattoo", + "White" + ], + "thumbnail": "https://cdni.pornpics.com/models/m/madison_scott.jpg", + "url": "https://www.pornpics.com/pornstars/madison-scott/", + "stats": { + "total_galleries": 385 + }, + "source": "PornPics", + "sources": { + "pornpics": "https://www.pornpics.com/pornstars/madison-scott/" + } +} \ No newline at end of file diff --git a/data/performers/mia-split.json b/data/performers/mia-split.json new file mode 100644 index 0000000..51bcce9 --- /dev/null +++ b/data/performers/mia-split.json @@ -0,0 +1,32 @@ +{ + "id": "PP17020", + "name": "Mia Split", + "aliases": [], + "gender": "Female", + "birthdate": "", + "country": "Russian Federation", + "nationality": "Russian", + "ethnicity": "White", + "hair_color": "Brunette", + "eye_color": "-", + "height_cm": null, + "measurements": "??-??-??", + "breast_type": "Natural Tits", + "tags": [ + "Brunette", + "Natural Tits", + "Petite", + "Russian", + "Tiny Tits", + "White" + ], + "thumbnail": "https://cdni.pornpics.com/models/m/mia_split.jpg", + "url": "https://www.pornpics.com/pornstars/mia-split/", + "stats": { + "total_galleries": 73 + }, + "source": "PornPics", + "sources": { + "pornpics": "https://www.pornpics.com/pornstars/mia-split/" + } +} \ No newline at end of file diff --git a/data/performers/monique-alexander.json b/data/performers/monique-alexander.json new file mode 100644 index 0000000..1e9c6b9 --- /dev/null +++ b/data/performers/monique-alexander.json @@ -0,0 +1,40 @@ +{ + "id": "PP4988", + "name": "Monique Alexander", + "aliases": [ + "Monique Alexandre", + "Savannah Moore", + "Briana Burke", + "Monique Alex" + ], + "gender": "Female", + "birthdate": "1982-05-26", + "country": "United States", + "nationality": "American", + "ethnicity": "White", + "hair_color": "Redhead", + "eye_color": "-", + "height_cm": 165, + "measurements": "32C-24-34", + "breast_type": "Fake Tits", + "tags": [ + "American", + "Fake Tits", + "MILF", + "Portuguese", + "Redhead", + "Skinny", + "Tattoo", + "Tiny Tits", + "White" + ], + "thumbnail": "https://cdni.pornpics.com/models/m/monique_alexander.jpg", + "url": "https://www.pornpics.com/pornstars/monique-alexander/", + "stats": { + "total_galleries": 1017 + }, + "source": "PornPics", + "sources": { + "pornpics": "https://www.pornpics.com/pornstars/monique-alexander/" + } +} \ No newline at end of file diff --git a/data/performers/riley-reid.json b/data/performers/riley-reid.json new file mode 100644 index 0000000..054fb94 --- /dev/null +++ b/data/performers/riley-reid.json @@ -0,0 +1,38 @@ +{ + "id": "PP4373", + "name": "Riley Reid", + "aliases": [ + "Riley Reed", + "Riley Ried", + "Paige Riley", + "Riley Reia", + "Reily Reid" + ], + "gender": "Female", + "birthdate": "1991-07-09", + "country": "United States", + "nationality": "American", + "ethnicity": "White", + "hair_color": "Brunette", + "eye_color": "-", + "height_cm": 162, + "measurements": "34B-25-36", + "breast_type": "Natural Tits", + "tags": [ + "American", + "Brunette", + "Natural Tits", + "Tattoo", + "Tiny Tits", + "White" + ], + "thumbnail": "https://cdni.pornpics.com/models/r/riley_reid.jpg", + "url": "https://www.pornpics.com/pornstars/riley-reid/", + "stats": { + "total_galleries": 1728 + }, + "source": "PornPics", + "sources": { + "pornpics": "https://www.pornpics.com/pornstars/riley-reid/" + } +} \ No newline at end of file diff --git a/data/performers/sasha-grey.json b/data/performers/sasha-grey.json new file mode 100644 index 0000000..aa2a372 --- /dev/null +++ b/data/performers/sasha-grey.json @@ -0,0 +1,34 @@ +{ + "id": "PP10802", + "name": "Sasha Grey", + "aliases": [ + "Sasha Gray" + ], + "gender": "Female", + "birthdate": "1988-03-14", + "country": "United States", + "nationality": "American", + "ethnicity": "White", + "hair_color": "Brunette", + "eye_color": "-", + "height_cm": 170, + "measurements": "32B-26-31", + "breast_type": "Natural Tits", + "tags": [ + "American", + "Brunette", + "Natural Tits", + "Skinny", + "Tiny Tits", + "White" + ], + "thumbnail": "https://cdni.pornpics.com/models/s/sasha_grey.jpg", + "url": "https://www.pornpics.com/pornstars/sasha-grey/", + "stats": { + "total_galleries": 371 + }, + "source": "PornPics", + "sources": { + "pornpics": "https://www.pornpics.com/pornstars/sasha-grey/" + } +} \ No newline at end of file diff --git a/src/importer/__pycache__/cli.cpython-313.pyc b/src/importer/__pycache__/cli.cpython-313.pyc index 6207513f3c13b93a7528f40729174cac2caffaa6..cf28d7e874c0c06a38108a722105c23dacee5d5a 100644 GIT binary patch delta 4737 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 diff --git a/src/importer/cli.py b/src/importer/cli.py index df12305..a6d3e30 100644 --- a/src/importer/cli.py +++ b/src/importer/cli.py @@ -16,13 +16,14 @@ metadata refresh, and tag analytics with color-coded output. Usage examples: goondex import "https://www.pornpics.com/galleries/..." goondex refresh-all - goondex refresh-one "Gallery_Name" - goondex validate-tags - goondex tag-stats + goondex search-performer "Riley Reid" + goondex enrich-all """ import sys import os +import subprocess +from pathlib import Path # ─────────────────────────────────────────────── # Module imports @@ -38,7 +39,6 @@ try: except ImportError: metadata_tools = None - # ─────────────────────────────────────────────── # COLOR DEFINITIONS # ─────────────────────────────────────────────── @@ -53,7 +53,6 @@ class Colors: def colorize(text, color): - """Wrap text with ANSI color codes.""" return f"{color}{text}{Colors.RESET}" @@ -61,18 +60,15 @@ def colorize(text, color): # VERSION HANDLER # ─────────────────────────────────────────────── def load_version(): - """Safely read version number from root VERSION file.""" try: root_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../..")) - version_file = os.path.join(root_dir, "VERSION") - with open(version_file, "r", encoding="utf-8") as f: + with open(os.path.join(root_dir, "VERSION"), "r", encoding="utf-8") as f: return f.read().strip() except FileNotFoundError: return "unknown" def print_version(): - """Print Goondex version string.""" version = load_version() print(colorize(f"Goondex v{version}", Colors.CYAN)) sys.exit(0) @@ -88,11 +84,11 @@ def print_usage(): Usage: goondex [args...] -Commands: +Gallery Commands: import Import a new gallery from PornPics refresh-all Refresh inferred tags for all galleries refresh-one Refresh inferred tags for a single gallery - validate-tags Validate YAML tag dictionaries for duplicates/conflicts + validate-tags Validate YAML tag dictionaries tag-stats Generate frequency report for all tags list List all available galleries list-tags List tags for one gallery @@ -102,16 +98,14 @@ Commands: show-metadata Show metadata.json content source set Set gallery source (single or all) +Performer Commands: + search-performer "" Search or fetch performer metadata + enrich-all Sync all performer JSONs into SQLite + Flags: -h, --help Show this help message -v, --version Show current version - -Examples: - goondex import "https://www.pornpics.com/galleries/example/" - goondex refresh-one "20251020_2117_Mariella_Sun" - goondex tag-stats - goondex validate-tags -""".strip()) +""") # ─────────────────────────────────────────────── @@ -133,6 +127,43 @@ def main(): if cmd in ("--version", "-v", "version"): print_version() + # ─────────────── PERFORMER COMMANDS + if cmd == "search-performer": + if not args: + print(colorize("[!] Usage: goondex search-performer \"\"", Colors.RED)) + sys.exit(1) + subprocess.run(["python", "-m", "src.performers.search", *args]) + return + + elif cmd == "enrich-all": + print(colorize("[INFO] Syncing performer JSONs into SQLite…", Colors.CYAN)) + subprocess.run(["python", "-m", "src.performers.sync.sync_json_to_sqlite"]) + print(colorize("[OK] Performer enrichment complete.", Colors.GREEN)) + return + + # ─────────────── ENRICHMENT BRIDGE + elif cmd == "enrich-bridge": + limit = None + if args and args[0].isdigit(): + limit = args[0] + + print(colorize("[INFO] Launching Goondex Enrichment Bridge...", Colors.CYAN)) + env = os.environ.copy() + env["PYTHONPATH"] = "src" # ensures the 'performers' package is found + + try: + subprocess.run( + ["python", "-m", "performers.enrichment_bridge", *( [limit] if limit else [] )], + check=True, + env=env, + ) + print(colorize("[OK] Bridge enrichment complete.", Colors.GREEN)) + except subprocess.CalledProcessError as e: + print(colorize(f"[ERROR] Enrichment bridge failed with code {e.returncode}", Colors.RED)) + except Exception as e: + print(colorize(f"[ERROR] Enrichment bridge failed: {e}", Colors.RED)) + return + # ─────────────── IMPORT GALLERY if cmd == "import": if not args: @@ -212,7 +243,6 @@ def main(): # ─────────────── ALL OTHER COMMANDS else: - # Explicit command map for all supported operations command_map = { "list": tag_gallery.list_galleries, "list-tags": tag_gallery.list_tags, diff --git a/src/importer/db/performers.db b/src/importer/db/performers.db index 646654c83228cac72fc1cc0093b27d32e6e7b980..d5ecd1e90c75ff16c8316ecb33c5f501b8122fbf 100644 GIT binary patch delta 6643 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 diff --git a/src/importer/pornpics_bridge.py b/src/importer/pornpics_bridge.py new file mode 100644 index 0000000..9cb1685 --- /dev/null +++ b/src/importer/pornpics_bridge.py @@ -0,0 +1,215 @@ +#!/usr/bin/env python3 +""" +pornpics_bridge.py +───────────────────────────────────────────── +Scraper bridge for PornPics performer pages. +Fetches performer metadata when TPDB data +is unavailable or incomplete. + +Now writes files as: + data/performers/riley-reid.json + +If a file already exists, only missing fields are filled in. +""" + +import re +import json +import hashlib +import requests +from bs4 import BeautifulSoup +from urllib.parse import quote_plus +from pathlib import Path + +HEADERS = { + "User-Agent": ( + "Mozilla/5.0 (X11; Linux x86_64) " + "AppleWebKit/537.36 (KHTML, like Gecko) " + "Chrome/122.0 Safari/537.36" + ) +} + +# ───────────────────────────────────────────── +# Helpers +# ───────────────────────────────────────────── +def _numeric_id(name: str) -> str: + """Fallback short numeric performer ID like P000123.""" + h = int(hashlib.sha1(name.encode("utf-8")).hexdigest(), 16) % 1_000_000 + return f"P{h:06d}" + + +def _safe_filename(name: str) -> str: + """Normalize a performer name to a safe lowercase filename.""" + return re.sub(r"[^a-z0-9\-]+", "-", name.lower().strip()).strip("-") + + +def _cache_thumbnail(name: str, image_url: str): + """Download and cache performer thumbnail image.""" + try: + if not image_url: + return None + base = Path(__file__).resolve().parents[2] / "data" / "faces" + folder = base / name.lower().replace(" ", "_") + folder.mkdir(parents=True, exist_ok=True) + dest = folder / "thumbnail.jpg" + r = requests.get(image_url, headers=HEADERS, timeout=10) + if r.status_code == 200: + dest.write_bytes(r.content) + print(f"[🖼️] Cached thumbnail → {dest}") + return str(dest) + except Exception as e: + print(f"[!] Thumbnail cache failed: {e}") + return None + + +def _merge_performer(existing: dict, new: dict) -> dict: + """Merge new scraper data into existing JSON, preserving old values.""" + merged = existing.copy() + for key, val in new.items(): + if isinstance(val, dict): + merged[key] = _merge_performer(existing.get(key, {}), val) + elif isinstance(val, list): + # merge lists, avoiding duplicates + merged[key] = sorted(set(existing.get(key, []) + val)) + else: + if not existing.get(key) or existing.get(key) == "-": + merged[key] = val + return merged + + +# ───────────────────────────────────────────── +# Main Scraper +# ───────────────────────────────────────────── +def fetch_pornpics_profile(name: str): + """Fetch performer profile metadata from PornPics.""" + try: + slug = quote_plus(name.lower().replace(" ", "-")) + url = f"https://www.pornpics.com/pornstars/{slug}/" + r = requests.get(url, headers=HEADERS, timeout=10) + if r.status_code != 200: + print(f"[!] PornPics returned {r.status_code}") + return None + + soup = BeautifulSoup(r.text, "html.parser") + + # --- Display name --- + display_el = soup.select_one("div.card-title h2") + display_name = display_el.get_text(strip=True) if display_el else name + display_name = display_name.replace("Nude Pics", "").strip() + + # --- Performer numeric ID --- + id_match = re.search(r'PP_PROFILE_ID\s*=\s*"(\d+)"', r.text) + performer_id = f"PP{id_match.group(1)}" if id_match else _numeric_id(display_name) + + # --- Thumbnail --- + img_tag = soup.select_one("div.card-logo img") + image_url = img_tag["src"] if img_tag and "src" in img_tag.attrs else None + + # --- Gallery count --- + total_galleries = 0 + count_div = soup.select_one("div.card-galleries-count") + if count_div: + text = count_div.get_text(strip=True).replace(",", "") + m = re.search(r"(\d+)", text) + if m: + total_galleries = int(m.group(1)) + if not total_galleries: + # fallback + text = soup.get_text(" ", strip=True) + m = re.search(r"(\d{2,5})\s+(?:Galleries|Photos|Albums)", text, re.I) + if m: + total_galleries = int(m.group(1)) + + # --- Metadata info items --- + bio = {} + for item in soup.select("div.card-additional-info .item"): + label = item.select_one(".label") + value = item.select_one(".value") + if not (label and value): + continue + key = label.get_text(strip=True).rstrip(":").lower() + val = value.get_text(strip=True) + bio[key] = val + + # --- Parse key fields --- + aliases = [a.strip() for a in bio.get("aliases", "").split(",") if a.strip()] + gender = bio.get("gender", "-") + country = bio.get("country of birth", "-") + nationality = bio.get("nationality", "-") + ethnicity = bio.get("ethnicity", "-") + birthday = bio.get("birthday", "-") + hair_color = bio.get("hair color", "-") + eye_color = bio.get("eye color", "-") + height = bio.get("height", "-") + breast_size = bio.get("breast size", "-") + breast_type = bio.get("breast type", "-") + tags = [t.strip() for t in bio.get("categories", "").split(",") if t.strip()] + + def parse_height_cm(val: str): + m = re.search(r"(\d{2,3})\s*cm", val) + return int(m.group(1)) if m else None + + # --- Construct structured performer record --- + performer = { + "id": performer_id, + "name": display_name, + "aliases": aliases, + "gender": gender, + "birthdate": birthday, + "country": country, + "nationality": nationality, + "ethnicity": ethnicity, + "hair_color": hair_color, + "eye_color": eye_color, + "height_cm": parse_height_cm(height), + "measurements": breast_size, + "breast_type": breast_type, + "tags": tags, + "thumbnail": image_url, + "url": url, + "stats": {"total_galleries": total_galleries}, + "source": "PornPics", + "sources": {"pornpics": url}, + } + + # --- Cache thumbnail --- + _cache_thumbnail(display_name, image_url) + + # --- Write JSON (merge-safe) --- + base = Path(__file__).resolve().parents[2] / "data" / "performers" + base.mkdir(parents=True, exist_ok=True) + + safe_name = _safe_filename(display_name) + json_path = base / f"{safe_name}.json" + + if json_path.exists(): + try: + existing = json.loads(json_path.read_text(encoding="utf-8")) + performer = _merge_performer(existing, performer) + print(f"[♻️] Updated existing performer → {json_path.name}") + except Exception as e: + print(f"[!] Failed to merge existing file: {e}") + + json_path.write_text( + json.dumps(performer, indent=2, ensure_ascii=False), + encoding="utf-8", + ) + + print(f"[💾] Cached performer JSON → {json_path}") + + return performer + + except Exception as e: + print(f"[!] PornPics fetch failed: {e}") + return None + + +# ───────────────────────────────────────────── +# CLI Entry (for testing) +# ───────────────────────────────────────────── +if __name__ == "__main__": + import sys + target = sys.argv[1] if len(sys.argv) > 1 else "Riley Reid" + print(f"[🔎] Fetching PornPics data for: {target}") + data = fetch_pornpics_profile(target) + if data: + print(json.dumps(data, indent=2, ensure_ascii=False)) diff --git a/src/importer/reports/tag_stats.json b/src/importer/reports/tag_stats.json index 7f49210..1bd0de5 100644 --- a/src/importer/reports/tag_stats.json +++ b/src/importer/reports/tag_stats.json @@ -1,23 +1,72 @@ { - "School Uniform": 12, + "Pussy": 22, + "School Uniform": 14, + "Brunette": 14, + "Ass": 12, + "Petite": 11, + "Teen": 11, + "Fucking": 11, + "Big Tits": 11, + "Hot Naked Women": 9, + "Beautiful": 9, + "Blowjob": 9, + "Hairy": 9, + "Pornstar": 9, "Pantyhose Skirt": 7, + "Hardcore": 7, + "Teen Schoolgirl": 6, "Pantyhose Ass": 6, + "Mature": 6, + "Natural": 6, + "Natural Look": 6, "Pantyhose Pussy": 5, - "Teen Schoolgirl": 5, - "Hot Naked Women": 5, + "Amateur": 5, + "Skinny": 5, "Teen Pantyhose": 4, + "Ass Spread": 4, + "Lesbian": 4, + "Dress": 4, + "Handjob": 4, + "Cumshot": 4, + "Cowgirl": 4, + "Doggystyle": 4, + "MILF": 4, "Solo Masturbation": 3, "Schoolgirl Skirt": 3, "Amateur Pantyhose": 3, "Topless": 3, - "Ass Spread": 3, "Hot Naked Girls": 3, + "Amateur Hairy Pussy": 3, + "Hairy Teen Pussy": 3, + "Best Pussy": 3, + "Upskirt No Panties": 3, + "Anal": 3, + "Anal Fetish": 3, + "Facial": 3, + "Panties": 3, + "Threesome": 3, + "Tight Dress": 3, + "Big Cock": 3, + "Interracial": 3, + "POV": 3, + "Pussy Fuck": 3, + "Uniform": 3, + "Uniform Fetish": 3, + "Stockings": 3, "Hairy Amateur": 2, + "Office": 2, "Redhead Ass": 2, + "Over 50": 2, + "Mom Pussy": 2, + "Gaping Pussy": 2, "Big Natural Tits": 2, "Amateur Teen": 2, + "Busty": 2, "Redhead Pantyhose": 2, "Schoolgirl Upskirt": 2, + "Teen Stockings": 2, + "Beautiful Pussy": 2, + "Wet Pussy Close Up": 2, "Teen Masturbation": 2, "Pantyhose Legs": 2, "Big Tits Masturbation": 2, @@ -25,10 +74,40 @@ "Spread Legs": 2, "Vagina": 2, "Pantyhose Feet": 2, - "Amateur Hairy Pussy": 2, "Big Tits Hairy Pussy": 2, - "Best Pussy": 2, + "Hairy Teen Spreading": 2, "Teen Panties": 2, + "Bent Over": 2, + "Teen Anal": 2, + "Beautiful Hairy": 2, + "Short Skirt No Panties": 2, + "Dick": 2, + "Beautiful Blowjob": 2, + "Brunette Teen": 2, + "Mom Boy": 2, + "Mom Son": 2, + "Brunette Hairy Pussy": 2, + "Fetish": 2, + "High Heels": 2, + "Penetration": 2, + "Short Skirt High Heels": 2, + "Skirt": 2, + "Solo": 2, + "Outdoor": 2, + "Skinny Small Tits": 2, + "BBC": 2, + "Big Black Cock": 2, + "Doggystyle Anal": 2, + "Interracial Anal": 2, + "Monster Cock": 2, + "Summer Dress": 2, + "Hairy Pussy Fuck": 2, + "Lingerie": 2, + "POV Handjob": 2, + "Model": 2, + "Tight Ass": 2, + "Cheating Wife": 2, + "Blonde": 2, "Blonde Masturbating": 1, "Amateur Undressing": 1, "Amateur PAWG": 1, @@ -36,13 +115,10 @@ "Big Ass Redhead": 1, "Hairy Redhead": 1, "Hairy Redhead Pussy": 1, - "Office": 1, "Redhead Pussy": 1, "Hairy MILF": 1, "Mature Hairy Pussy": 1, - "Over 50": 1, "Mature Blonde": 1, - "Mom Pussy": 1, "Hairy Mature": 1, "Mom Masturbating": 1, "Mature Mom": 1, @@ -55,7 +131,6 @@ "Sexy Black Women": 1, "Ebony Pussy": 1, "Big Tits Nipples": 1, - "Gaping Pussy": 1, "Monster Tits": 1, "Amateur College": 1, "Short Hair Brunette": 1, @@ -66,19 +141,15 @@ "Teen Babe": 1, "Redhead Upskirt": 1, "Redhead Big Tits": 1, - "Busty": 1, "Redhead Glasses": 1, "Cleavage": 1, "White Panties": 1, - "Teen Stockings": 1, "Teen Upskirt Panties": 1, "Beautiful Stockings": 1, "Amateur Stockings": 1, "Sexy Pornstars": 1, - "Beautiful Pussy": 1, "Amateur Anal": 1, "Anal Masturbation": 1, - "Wet Pussy Close Up": 1, "Teen Pussy Close Up": 1, "Teen Nudist": 1, "Skinny Teen": 1, @@ -133,8 +204,6 @@ "Sensual": 1, "Asian Schoolgirl": 1, "Hairy Babe": 1, - "Hairy Teen Pussy": 1, - "Hairy Teen Spreading": 1, "Beautiful Babe": 1, "B Cup Tits": 1, "Ginger": 1, @@ -142,14 +211,12 @@ "Big Tits College": 1, "Big Tits Lingerie": 1, "Perfect Natural Tits": 1, - "Bent Over": 1, "Tits And Pussy": 1, "Blonde Pussy": 1, "Blonde Big Tits": 1, "Pornstar Pussy": 1, "Teen Deepthroat": 1, "Throat Fuck": 1, - "Teen Anal": 1, "Slutty Teen": 1, "Teen Big Cock": 1, "Teen Cumshot": 1, @@ -158,7 +225,6 @@ "Wide Hips Thick Thighs": 1, "Chubby Hairy": 1, "Hairy Close Up": 1, - "Beautiful Hairy": 1, "Hot Teen": 1, "Beautiful Teen": 1, "Bubble Butt": 1, @@ -167,10 +233,7 @@ "Huge Ass": 1, "Leather Skirt": 1, "Beautiful Ass": 1, - "Upskirt No Panties": 1, - "Short Skirt No Panties": 1, "Nylon Pussy": 1, - "Dick": 1, "Brazilian Hairy Pussy": 1, "Brazilian Teen": 1, "Brazilian Anal": 1, @@ -186,5 +249,132 @@ "Big Pussy": 1, "See Through Panties": 1, "Loose Pussy": 1, - "Teen Dildo": 1 + "Teen Dildo": 1, + "Lesbian Facesitting": 1, + "Lesbian Scissoring": 1, + "Nice Pussy": 1, + "Redhead": 1, + "Redhead Lesbian": 1, + "Ukraine Pussy": 1, + "Ukrainian": 1, + "Wet Teen Pussy": 1, + "Fit": 1, + "Friends Mom": 1, + "Curvy": 1, + "Double Anal": 1, + "Hairy Upskirt": 1, + "Latex": 1, + "Latex Fetish": 1, + "Sexy Dress": 1, + "Bent Over Ass": 1, + "Nude": 1, + "PAWG Solo": 1, + "Sexy Ass": 1, + "Beautiful Granny": 1, + "GILF": 1, + "Granny Handjob": 1, + "Granny Slut": 1, + "Mature Boy": 1, + "Sexy GILF": 1, + "Clothed Fuck": 1, + "Russian": 1, + "Russian Teen": 1, + "Shorts": 1, + "Skinny Teen Fuck": 1, + "Small Tits Fuck": 1, + "Teen Cum": 1, + "Teen Facesitting": 1, + "Teen Fuck": 1, + "Teen Hardcore": 1, + "Big Hairy Pussy": 1, + "Extremely Hairy Pussy": 1, + "Hairy Bush": 1, + "Natural Hairy": 1, + "Brunette Natural Tits": 1, + "Reverse Cowgirl": 1, + "Trimmed Pussy": 1, + "BBC Anal": 1, + "Big Black Dick": 1, + "Big Cock Blowjob": 1, + "Big Dick Anal": 1, + "Pool": 1, + "Hairy Armpits": 1, + "Hairy Brunette": 1, + "Hairy Panties": 1, + "Romanian": 1, + "Upskirt Panties": 1, + "Hairy Asshole": 1, + "Hairy MILF Fuck": 1, + "MILF Fuck": 1, + "Perfect": 1, + "Perfect Body": 1, + "Pussy Spreading": 1, + "Skinny Girl Fat Pussy": 1, + "High Heels Fuck": 1, + "Sexy Blowjob": 1, + "Underwear": 1, + "Cum On Face": 1, + "Petite Facial": 1, + "Money": 1, + "Classroom": 1, + "College Pussy": 1, + "English": 1, + "Beautiful Mature": 1, + "Mature Older Women": 1, + "Mature Pussy": 1, + "Mature Spreading": 1, + "Mature Undressing": 1, + "Older Women": 1, + "Sexy Older Women": 1, + "Brunette Ass": 1, + "Cute Face": 1, + "Cute Hairy": 1, + "Hairy Erotica": 1, + "Caught Masturbating": 1, + "Skinny BBC": 1, + "Skinny Interracial": 1, + "Close Up Fuck": 1, + "Juicy Pussy": 1, + "Meaty Pussy": 1, + "Teen Handjob": 1, + "All Over 40": 1, + "Bikini Blowjob": 1, + "MILF Bikini": 1, + "MILF Stockings": 1, + "Petite Stockings": 1, + "Sexy MILF": 1, + "Wife Blowjob": 1, + "Stockings Spread": 1, + "Latina Anal": 1, + "MILF Anal": 1, + "MILF DP": 1, + "Petite Anal": 1, + "Sexy Anal": 1, + "Blonde Shemale": 1, + "Shemale Ass": 1, + "Shemale Fucks Female": 1, + "Shemale Fucks Girl": 1, + "Shemale Lesbian": 1, + "Shemale On Female": 1, + "Shemale Pantyhose": 1, + "Shemale Threesome": 1, + "Horny": 1, + "Riding": 1, + "Slut": 1, + "Sneakers": 1, + "Oral": 1, + "Sexy Latina": 1, + "Teen Lesbian": 1, + "Glamour": 1, + "Blindfold Surprise": 1, + "Cum On Pussy": 1, + "Cum On Stockings": 1, + "Footjob": 1, + "Teen Footjob": 1, + "Teen Natural Tits": 1, + "Beautiful MILF": 1, + "Bride": 1, + "MILF Pussy": 1, + "Sucking Cock": 1, + "Teen Stepdaughter": 1 } \ No newline at end of file diff --git a/src/importer/reports/tag_stats_sorted.txt b/src/importer/reports/tag_stats_sorted.txt index eb82054..d9ffc7a 100644 --- a/src/importer/reports/tag_stats_sorted.txt +++ b/src/importer/reports/tag_stats_sorted.txt @@ -1,22 +1,71 @@ -School Uniform: 12 +Pussy: 22 +School Uniform: 14 +Brunette: 14 +Ass: 12 +Petite: 11 +Teen: 11 +Fucking: 11 +Big Tits: 11 +Hot Naked Women: 9 +Beautiful: 9 +Blowjob: 9 +Hairy: 9 +Pornstar: 9 Pantyhose Skirt: 7 +Hardcore: 7 +Teen Schoolgirl: 6 Pantyhose Ass: 6 +Mature: 6 +Natural: 6 +Natural Look: 6 Pantyhose Pussy: 5 -Teen Schoolgirl: 5 -Hot Naked Women: 5 +Amateur: 5 +Skinny: 5 Teen Pantyhose: 4 +Ass Spread: 4 +Lesbian: 4 +Dress: 4 +Handjob: 4 +Cumshot: 4 +Cowgirl: 4 +Doggystyle: 4 +MILF: 4 Solo Masturbation: 3 Schoolgirl Skirt: 3 Amateur Pantyhose: 3 Topless: 3 -Ass Spread: 3 Hot Naked Girls: 3 +Amateur Hairy Pussy: 3 +Hairy Teen Pussy: 3 +Best Pussy: 3 +Upskirt No Panties: 3 +Anal: 3 +Anal Fetish: 3 +Facial: 3 +Panties: 3 +Threesome: 3 +Tight Dress: 3 +Big Cock: 3 +Interracial: 3 +POV: 3 +Pussy Fuck: 3 +Uniform: 3 +Uniform Fetish: 3 +Stockings: 3 Hairy Amateur: 2 +Office: 2 Redhead Ass: 2 +Over 50: 2 +Mom Pussy: 2 +Gaping Pussy: 2 Big Natural Tits: 2 Amateur Teen: 2 +Busty: 2 Redhead Pantyhose: 2 Schoolgirl Upskirt: 2 +Teen Stockings: 2 +Beautiful Pussy: 2 +Wet Pussy Close Up: 2 Teen Masturbation: 2 Pantyhose Legs: 2 Big Tits Masturbation: 2 @@ -24,10 +73,40 @@ MILF Masturbation: 2 Spread Legs: 2 Vagina: 2 Pantyhose Feet: 2 -Amateur Hairy Pussy: 2 Big Tits Hairy Pussy: 2 -Best Pussy: 2 +Hairy Teen Spreading: 2 Teen Panties: 2 +Bent Over: 2 +Teen Anal: 2 +Beautiful Hairy: 2 +Short Skirt No Panties: 2 +Dick: 2 +Beautiful Blowjob: 2 +Brunette Teen: 2 +Mom Boy: 2 +Mom Son: 2 +Brunette Hairy Pussy: 2 +Fetish: 2 +High Heels: 2 +Penetration: 2 +Short Skirt High Heels: 2 +Skirt: 2 +Solo: 2 +Outdoor: 2 +Skinny Small Tits: 2 +BBC: 2 +Big Black Cock: 2 +Doggystyle Anal: 2 +Interracial Anal: 2 +Monster Cock: 2 +Summer Dress: 2 +Hairy Pussy Fuck: 2 +Lingerie: 2 +POV Handjob: 2 +Model: 2 +Tight Ass: 2 +Cheating Wife: 2 +Blonde: 2 Blonde Masturbating: 1 Amateur Undressing: 1 Amateur PAWG: 1 @@ -35,13 +114,10 @@ Big Ass Pussy: 1 Big Ass Redhead: 1 Hairy Redhead: 1 Hairy Redhead Pussy: 1 -Office: 1 Redhead Pussy: 1 Hairy MILF: 1 Mature Hairy Pussy: 1 -Over 50: 1 Mature Blonde: 1 -Mom Pussy: 1 Hairy Mature: 1 Mom Masturbating: 1 Mature Mom: 1 @@ -54,7 +130,6 @@ Ebony Ass Pussy: 1 Sexy Black Women: 1 Ebony Pussy: 1 Big Tits Nipples: 1 -Gaping Pussy: 1 Monster Tits: 1 Amateur College: 1 Short Hair Brunette: 1 @@ -65,19 +140,15 @@ Schoolgirl Lingerie: 1 Teen Babe: 1 Redhead Upskirt: 1 Redhead Big Tits: 1 -Busty: 1 Redhead Glasses: 1 Cleavage: 1 White Panties: 1 -Teen Stockings: 1 Teen Upskirt Panties: 1 Beautiful Stockings: 1 Amateur Stockings: 1 Sexy Pornstars: 1 -Beautiful Pussy: 1 Amateur Anal: 1 Anal Masturbation: 1 -Wet Pussy Close Up: 1 Teen Pussy Close Up: 1 Teen Nudist: 1 Skinny Teen: 1 @@ -132,8 +203,6 @@ Beautiful Asian: 1 Sensual: 1 Asian Schoolgirl: 1 Hairy Babe: 1 -Hairy Teen Pussy: 1 -Hairy Teen Spreading: 1 Beautiful Babe: 1 B Cup Tits: 1 Ginger: 1 @@ -141,14 +210,12 @@ Red Lips: 1 Big Tits College: 1 Big Tits Lingerie: 1 Perfect Natural Tits: 1 -Bent Over: 1 Tits And Pussy: 1 Blonde Pussy: 1 Blonde Big Tits: 1 Pornstar Pussy: 1 Teen Deepthroat: 1 Throat Fuck: 1 -Teen Anal: 1 Slutty Teen: 1 Teen Big Cock: 1 Teen Cumshot: 1 @@ -157,7 +224,6 @@ Hairy Vagina: 1 Wide Hips Thick Thighs: 1 Chubby Hairy: 1 Hairy Close Up: 1 -Beautiful Hairy: 1 Hot Teen: 1 Beautiful Teen: 1 Bubble Butt: 1 @@ -166,10 +232,7 @@ Nice Ass: 1 Huge Ass: 1 Leather Skirt: 1 Beautiful Ass: 1 -Upskirt No Panties: 1 -Short Skirt No Panties: 1 Nylon Pussy: 1 -Dick: 1 Brazilian Hairy Pussy: 1 Brazilian Teen: 1 Brazilian Anal: 1 @@ -186,3 +249,130 @@ Big Pussy: 1 See Through Panties: 1 Loose Pussy: 1 Teen Dildo: 1 +Lesbian Facesitting: 1 +Lesbian Scissoring: 1 +Nice Pussy: 1 +Redhead: 1 +Redhead Lesbian: 1 +Ukraine Pussy: 1 +Ukrainian: 1 +Wet Teen Pussy: 1 +Fit: 1 +Friends Mom: 1 +Curvy: 1 +Double Anal: 1 +Hairy Upskirt: 1 +Latex: 1 +Latex Fetish: 1 +Sexy Dress: 1 +Bent Over Ass: 1 +Nude: 1 +PAWG Solo: 1 +Sexy Ass: 1 +Beautiful Granny: 1 +GILF: 1 +Granny Handjob: 1 +Granny Slut: 1 +Mature Boy: 1 +Sexy GILF: 1 +Clothed Fuck: 1 +Russian: 1 +Russian Teen: 1 +Shorts: 1 +Skinny Teen Fuck: 1 +Small Tits Fuck: 1 +Teen Cum: 1 +Teen Facesitting: 1 +Teen Fuck: 1 +Teen Hardcore: 1 +Big Hairy Pussy: 1 +Extremely Hairy Pussy: 1 +Hairy Bush: 1 +Natural Hairy: 1 +Brunette Natural Tits: 1 +Reverse Cowgirl: 1 +Trimmed Pussy: 1 +BBC Anal: 1 +Big Black Dick: 1 +Big Cock Blowjob: 1 +Big Dick Anal: 1 +Pool: 1 +Hairy Armpits: 1 +Hairy Brunette: 1 +Hairy Panties: 1 +Romanian: 1 +Upskirt Panties: 1 +Hairy Asshole: 1 +Hairy MILF Fuck: 1 +MILF Fuck: 1 +Perfect: 1 +Perfect Body: 1 +Pussy Spreading: 1 +Skinny Girl Fat Pussy: 1 +High Heels Fuck: 1 +Sexy Blowjob: 1 +Underwear: 1 +Cum On Face: 1 +Petite Facial: 1 +Money: 1 +Classroom: 1 +College Pussy: 1 +English: 1 +Beautiful Mature: 1 +Mature Older Women: 1 +Mature Pussy: 1 +Mature Spreading: 1 +Mature Undressing: 1 +Older Women: 1 +Sexy Older Women: 1 +Brunette Ass: 1 +Cute Face: 1 +Cute Hairy: 1 +Hairy Erotica: 1 +Caught Masturbating: 1 +Skinny BBC: 1 +Skinny Interracial: 1 +Close Up Fuck: 1 +Juicy Pussy: 1 +Meaty Pussy: 1 +Teen Handjob: 1 +All Over 40: 1 +Bikini Blowjob: 1 +MILF Bikini: 1 +MILF Stockings: 1 +Petite Stockings: 1 +Sexy MILF: 1 +Wife Blowjob: 1 +Stockings Spread: 1 +Latina Anal: 1 +MILF Anal: 1 +MILF DP: 1 +Petite Anal: 1 +Sexy Anal: 1 +Blonde Shemale: 1 +Shemale Ass: 1 +Shemale Fucks Female: 1 +Shemale Fucks Girl: 1 +Shemale Lesbian: 1 +Shemale On Female: 1 +Shemale Pantyhose: 1 +Shemale Threesome: 1 +Horny: 1 +Riding: 1 +Slut: 1 +Sneakers: 1 +Oral: 1 +Sexy Latina: 1 +Teen Lesbian: 1 +Glamour: 1 +Blindfold Surprise: 1 +Cum On Pussy: 1 +Cum On Stockings: 1 +Footjob: 1 +Teen Footjob: 1 +Teen Natural Tits: 1 +Beautiful MILF: 1 +Bride: 1 +MILF Pussy: 1 +Sucking Cock: 1 +Teen Stepdaughter: 1 diff --git a/src/importer/secrets/tpdb_api_key.txt b/src/importer/secrets/tpdb_api_key.txt new file mode 100644 index 0000000..d15f550 --- /dev/null +++ b/src/importer/secrets/tpdb_api_key.txt @@ -0,0 +1 @@ +ROhX6BrycQCKkMYjleW4GHsBXxJqAw9h8RjF5lBH6fe868a7 diff --git a/src/ml/__pycache__/tagging.cpython-313.pyc b/src/ml/__pycache__/tagging.cpython-313.pyc index da5f0e81731fe64056b57dfbee316f789ac11486..f6fcbfeecb7bc5595588e8f443a2d4a2ab4c979e 100644 GIT binary patch literal 4393 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 FzX4t2rb_?- literal 1036 zcmZuw%}*0i5TE^|v_+Qk8A8$p6|72&BE|&uL?VI^!e)&LB+a(FEj8P2^LDFZOyr0$ zF<>Ne@X#Y3y!i+CC)n`SJTD}iyg_;(@u1GzQb~yO@@8j#GjC?zyxCeyOAwG=-}+>w`Inss3^;FQsd3Nj^jh*V4dlaCAEh|3OrL$Zti;3t=8)lNva9wKD;9FIIC!GxW zZx!-c6*HJHgsq!-UjORcC5TD0F@Z{H$94!6z2%}sr4%s=CY5X>W!W@ncpk~6N}lBs z_KfHqVl7VA+f8MoShSdX&a?7vtcfb79dq+PyYaRXWx$>?@Zm%H?uqPZ_RB&_8n`rD7&$TeR6VGFH-d43n_m(!arHAUK6UBFJdqZr(9V zwsoKMqRJ-Uy@TvX;5hCFgpOs9gWrRFo9P{CplntnT_5A`R+$l%KKi2(A&TA-Cv WPMT5Ll?HyftUd4AhlMY}@ut7CPUNKk diff --git a/src/ml/facecrop/trainer.py b/src/ml/facecrop/trainer.py index 8408f52..f9994bc 100644 --- a/src/ml/facecrop/trainer.py +++ b/src/ml/facecrop/trainer.py @@ -1,43 +1,196 @@ #!/usr/bin/env python3 """ -trainer.py ------------ -Batch face verification and performer labeling loop. -Scans a folder of uncategorized face crops, calls the verifier interactively, -and moves confirmed files to the correct performer directory. +verifier.py +------------ +Interactive performer verification tool (Goondex v0.3.5-r1) +------------------------------------------------------------ +Used by: + - goondex verify [tags] + - goondex trainer (batch loop) + +This version replaces the global performers_dump.json with +per-performer JSON files located under: + data/faces//performer.json + +Each performer.json stores: + { + "name": "Riley Reid", + "normalized_id": "riley_reid", + "aliases": [], + "source_urls": [], + "stats": { + "known_galleries": 0, + "studio_appearances": {} + }, + "faces": [ + "001.jpg", + "002.jpg" + ] + } """ import os import sys +import json +import shutil from pathlib import Path -from src.ml.facecrop.verifier import verify_face, record_verified_face +from datetime import datetime +from src.ml.facecrop.image_display import show_image -FACES_CACHE = Path("ML/faces_cache") # adjust path if needed +# New imports for schema consistency +from src.performers.utils import ( + ensure_performer_exists, + get_performer_path, + normalize_name, + save_json +) -def train_from_cache(): - if not FACES_CACHE.exists(): - print(f"[ERROR] No cache directory found: {FACES_CACHE}") +# ------------------------------------------------------------ +# Directories +# ------------------------------------------------------------ + +BASE_DIR = Path("data/faces") +BASE_DIR.mkdir(parents=True, exist_ok=True) + +# ------------------------------------------------------------ +# Helper functions +# ------------------------------------------------------------ + +def _normalize_name(name: str) -> str: + """Normalize performer name for folder use.""" + return normalize_name(name) + +def _performer_folder(name: str) -> Path: + """Return the path for a performer's folder.""" + return BASE_DIR / _normalize_name(name) + +def _performer_json_path(name: str) -> Path: + """Return the JSON path for a performer.""" + return _performer_folder(name) / "performer.json" + +def _confirm(prompt: str) -> bool: + """Ask a simple [y/n] question.""" + while True: + ans = input(f"{prompt} [y/n]: ").strip().lower() + if ans in ("y", "yes"): + return True + if ans in ("n", "no"): + return False + +def _load_performer_json(name: str) -> dict: + """Load or initialize performer JSON.""" + path = _performer_json_path(name) + if path.exists(): + try: + return json.loads(path.read_text(encoding="utf-8")) + except json.JSONDecodeError: + print(f"[WARN] Corrupted performer.json for {name}, recreating.") + # Fallback: create schema-aligned record + performer_data = ensure_performer_exists(name) + performer_data["last_updated"] = datetime.utcnow().isoformat() + "Z" + return performer_data + +def _save_performer_json(name: str, data: dict): + """Save performer JSON (schema-aware).""" + path = get_performer_path(name) + data["last_updated"] = datetime.utcnow().isoformat() + "Z" + save_json(data, path) + +def _next_unknown_label() -> str: + """Generate 'Unknown Performer #XXXX' label based on existing folders.""" + unknowns = [ + int(p.name.split("_")[-1]) + for p in BASE_DIR.glob("unknown_performer_*") + if p.name.split("_")[-1].isdigit() + ] + next_id = (max(unknowns) + 1) if unknowns else 0 + return f"Unknown Performer #{next_id:04d}" + +# ------------------------------------------------------------ +# Core verification +# ------------------------------------------------------------ + +def verify_face(image_path: str, candidate_tags: list[str]) -> str: + """ + Show an image and ask who it is. + Returns the confirmed performer name (or Unknown label). + """ + print("\n────────────────────────────────────────────") + print("🖼️ FACE PREVIEW") + print("────────────────────────────────────────────") + show_image(image_path, width=400) + print("────────────────────────────────────────────") + + # Try candidate tags + for tag in candidate_tags: + if _confirm(f"Is this face {tag}?"): + print(f"[OK] Confirmed as {tag}") + return tag + + # Manual entry + answer = input("Do you know this performer? (enter name or leave blank): ").strip() + if answer: + print(f"[OK] Added new performer: {answer}") + return answer + + unknown = _next_unknown_label() + print(f"[INFO] Tagged as {unknown}") + return unknown + +def record_verified_face(image_path: str, performer_name: str): + """ + Move verified image into performer's folder + and update performer.json. + """ + folder = _performer_folder(performer_name) + folder.mkdir(parents=True, exist_ok=True) + + json_path = _performer_json_path(performer_name) + data = _load_performer_json(performer_name) + + src = Path(image_path) + dest = folder / src.name + + # Avoid overwriting existing files + if dest.exists(): + base, ext = os.path.splitext(dest.name) + i = 1 + while (folder / f"{base}_{i}{ext}").exists(): + i += 1 + dest = folder / f"{base}_{i}{ext}" + + try: + shutil.move(str(src), str(dest)) + except Exception as e: + print(f"[WARN] Could not move file: {e}") + shutil.copy2(src, dest) + + if "faces" not in data: + data["faces"] = [] + data["faces"].append(dest.name) + data["last_updated"] = datetime.utcnow().isoformat() + "Z" + + _save_performer_json(performer_name, data) + + print(f"[OK] Saved {dest} under {performer_name}") + +# ------------------------------------------------------------ +# CLI entrypoint +# ------------------------------------------------------------ + +def main(): + if len(sys.argv) < 2: + print("Usage: goondex verify [comma_separated_tags]") sys.exit(1) - images = sorted(p for p in FACES_CACHE.iterdir() if p.suffix.lower() in [".jpg", ".jpeg", ".png"]) - if not images: - print(f"[INFO] No new face crops in {FACES_CACHE}") - return + image_path = sys.argv[1] + if not os.path.exists(image_path): + print(f"[ERROR] File not found: {image_path}") + sys.exit(1) - print(f"[INFO] Found {len(images)} cropped faces to verify.\n") - - for img_path in images: - # Extract performer tags from filename (optional) - candidate_tags = [] - name_part = img_path.stem - if "_" in name_part: - parts = name_part.split("_") - candidate_tags = [p.replace("-", " ").title() for p in parts if p.isalpha()] - - performer = verify_face(str(img_path), candidate_tags) - record_verified_face(str(img_path), performer) - - print("\n✅ Training session complete.") + tags = sys.argv[2].split(",") if len(sys.argv) > 2 else [] + performer = verify_face(image_path, tags) + record_verified_face(image_path, performer) if __name__ == "__main__": - train_from_cache() + main() diff --git a/src/ml/facecrop/verifier.py b/src/ml/facecrop/verifier.py index d2cf96d..4b81b38 100644 --- a/src/ml/facecrop/verifier.py +++ b/src/ml/facecrop/verifier.py @@ -5,10 +5,12 @@ verifier.py Interactive terminal tool for confirming performer identities from cropped face images. -- Displays actual performer images inline using Kitty graphics protocol. -- Cycles through known performer tags (e.g., Riley Reid, Eva Lovia) -- Asks user confirmation interactively. -- Creates new "Unknown Performer" entries if no match confirmed. +Integrates directly with the Goondex performer schema. + +- Displays cropped face images inline using Kitty graphics protocol +- Cycles through candidate tags (e.g. Riley Reid, Eva Lovia) +- Asks for user confirmation interactively +- Creates or updates structured performer.json records Usage: python -m src.ml.facecrop.verifier ./data/faces_cache/image_001.jpg "Riley Reid,Eva Lovia" @@ -16,106 +18,110 @@ Usage: import os import sys -import json from pathlib import Path +from typing import List from src.ml.facecrop.image_display import show_image +from src.performers.utils import ( + ensure_performer_exists, + update_performer_record, + save_json, + get_performer_path, + normalize_name, +) -# Storage paths -PERFORMER_DB = Path("performers_dump.json") +# Storage directories FACES_DIR = Path("data/faces") - -# Ensure directories exist FACES_DIR.mkdir(parents=True, exist_ok=True) -if not PERFORMER_DB.exists(): - PERFORMER_DB.write_text("{}", encoding="utf-8") # ------------------------------------------------------------ # Helper functions # ------------------------------------------------------------ -def _load_performers() -> dict: - """Load existing performer database.""" - try: - return json.loads(PERFORMER_DB.read_text(encoding="utf-8")) - except Exception: - return {} - -def _save_performers(data: dict): - """Save performer database.""" - PERFORMER_DB.write_text(json.dumps(data, indent=2), encoding="utf-8") - -def _next_unknown_id(data: dict) -> str: - """Generate a new Unknown Performer ID.""" - unknowns = [int(k.split("#")[-1]) for k in data.keys() if k.startswith("Unknown Performer")] - return f"Unknown Performer #{max(unknowns) + 1:04d}" if unknowns else "Unknown Performer #0000" - def _confirm(prompt: str) -> bool: """Ask a yes/no question.""" while True: ans = input(f"{prompt} [y/n]: ").strip().lower() - if ans in ("y", "yes"): return True - if ans in ("n", "no"): return False + if ans in ("y", "yes"): + return True + if ans in ("n", "no"): + return False + + +def _next_unknown_name(base_dir: Path = FACES_DIR) -> str: + """Generate the next available Unknown Performer label.""" + existing = [ + p.name for p in base_dir.iterdir() + if p.is_dir() and p.name.startswith("unknown_performer") + ] + ids = [int(p.split("_")[-1]) for p in existing if p.split("_")[-1].isdigit()] + next_id = (max(ids) + 1) if ids else 0 + return f"Unknown Performer #{next_id:04d}" + # ------------------------------------------------------------ -# Core verification loop +# Core verification logic # ------------------------------------------------------------ -def verify_face(image_path: str, candidate_tags: list[str]): +def verify_face(image_path: str, candidate_tags: List[str]) -> str: """ - Display an image and ask user who it is. - Returns confirmed performer name or new unknown tag. + Display an image, ask user to confirm the performer. + Returns the confirmed performer name (or Unknown label). """ - performers = _load_performers() - print("\n────────────────────────────────────────────") print("🖼️ FACE PREVIEW") print("────────────────────────────────────────────") show_image(image_path, width=400) print("────────────────────────────────────────────") - for name in candidate_tags: - if _confirm(f"Is this face {name}?"): - print(f"✅ Confirmed as {name}") - return name + for tag in candidate_tags: + if _confirm(f"Is this {tag}?"): + print(f"✅ Confirmed as {tag}") + return tag - # Try manual input - answer = input("Do you know this performer? (enter name or leave blank): ").strip() - if answer: - print(f"✅ New performer: {answer}") - return answer + manual = input("Do you know this performer? (enter name or leave blank): ").strip() + if manual: + print(f"✅ New performer added: {manual}") + return manual + + unknown = _next_unknown_name() + print(f"⚠️ Tagged as {unknown}") + return unknown - # Assign unknown - unknown_id = _next_unknown_id(performers) - print(f"⚠️ Tagged as {unknown_id}") - return unknown_id def record_verified_face(image_path: str, performer_name: str): """ - Move image to performer's folder and update DB. + Move verified face to performer's folder and update performer.json. """ - performers = _load_performers() + # Ensure performer schema exists and load it + performer = ensure_performer_exists(performer_name) + performer_id = normalize_name(performer_name) - # Normalize key - key = performer_name.lower().replace(" ", "_") - performer_folder = FACES_DIR / key + performer_folder = FACES_DIR / performer_id performer_folder.mkdir(parents=True, exist_ok=True) - # Move/copy image - dest = performer_folder / Path(image_path).name - os.rename(image_path, dest) + src = Path(image_path) + dest = performer_folder / src.name - # Update DB - if performer_name not in performers: - performers[performer_name] = { - "faces": [], - "confirmed": True - } + try: + os.rename(src, dest) + except OSError: + print(f"[WARN] Could not move {src}, copying instead.") + import shutil + shutil.copy(src, dest) - performers[performer_name]["faces"].append(str(dest)) - _save_performers(performers) + # Update performer record + rel_path = str(dest) + if "faces" not in performer: + performer["faces"] = [] + if rel_path not in performer["faces"]: + performer["faces"].append(rel_path) + # Write back to performer.json + performer_path = get_performer_path(performer_name) + save_json(performer, performer_path) print(f"💾 Saved {dest} under {performer_name}") + # ------------------------------------------------------------ # CLI entry point # ------------------------------------------------------------ @@ -128,5 +134,5 @@ if __name__ == "__main__": image_path = sys.argv[1] tags = sys.argv[2].split(",") if len(sys.argv) > 2 else [] - performer = verify_face(image_path, tags) - record_verified_face(image_path, performer) + performer_name = verify_face(image_path, tags) + record_verified_face(image_path, performer_name) diff --git a/src/ml/tagging_config.py b/src/ml/tagging_config.py new file mode 100644 index 0000000..04ad945 --- /dev/null +++ b/src/ml/tagging_config.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python3 +""" +tagging_config.py — Goondex v0.3.7 +──────────────────────────────────── +Default configuration for ML-based tagging system. + +Used by scraper.py and enrichment bridge for tagging consistency. +""" + +tags_config = { + "confidence_threshold": 0.45, + "categories": { + "body": ["Blonde", "Brunette", "Redhead", "Ebony", "Asian", "Latina", "White"], + "acts": ["Anal", "Oral", "Vaginal", "Group", "Solo", "BDSM", "Lesbian", "POV"], + "style": ["Amateur", "Professional", "Softcore", "Outdoor", "VR", "HD", "4K"] + }, + "excluded_keywords": ["thumbnail", "banner", "logo", "watermark"], + "version": "0.1.0" +} diff --git a/src/performers/__pycache__/db_manager.cpython-313.pyc b/src/performers/__pycache__/db_manager.cpython-313.pyc index e23e2d4a4975f5610278fd4ce9ceaa8e12b52008..9b76b1a010edc4d0e1547fe42e29f139a96522e0 100644 GIT binary patch delta 7767 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 MJ~~)Q_mG+YKfJ&mO#lD@ delta 2050 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 T*81Mo36HhUYB^mVTkrn^`TJCn diff --git a/src/performers/__pycache__/utils.cpython-313.pyc b/src/performers/__pycache__/utils.cpython-313.pyc index df88b0c15270c2757527ced01b0893eb6bb4e1ce..6788c4d34d99aacf75a951a2c8de91993c18e564 100644 GIT binary patch literal 6564 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 str: + return f"{PINK}{text}{_RESET}" + +def lilac(text: str) -> str: + return f"{LILAC}{text}{_RESET}" + +def cyan(text: str) -> str: + return f"{CYAN}{text}{_RESET}" + +def yellow(text: str) -> str: + return f"{YELLOW}{text}{_RESET}" + +def white(text: str) -> str: + return f"{WHITE}{text}{_RESET}" + +def grey(text: str) -> str: + return f"{GREY}{text}{_RESET}" + +def red(text: str) -> str: + return f"{RED}{text}{_RESET}" + +def green(text: str) -> str: + return f"{GREEN}{text}{_RESET}" + +def bold(text: str) -> str: + return f"{BOLD}{text}{_RESET}" + +def dim(text: str) -> str: + return f"{DIM}{text}{_RESET}" + +# ───────────────────────────────────────────── +# Composite helpers +# ───────────────────────────────────────────── +def heading(title: str, icon: str = "💖", version: str | None = None) -> str: + """Generate a styled Goondex section header.""" + bar = grey("─" * 45) + ver = f" · {grey(version)}" if version else "" + return f"\n{bar}\n{pink(icon)} {bold(white(title))}{ver}\n{bar}" + +def success(msg: str) -> str: + return f"{GREEN}✅ {msg}{_RESET}" + +def warning(msg: str) -> str: + return f"{YELLOW}⚠️ {msg}{_RESET}" + +def error(msg: str) -> str: + return f"{RED}❌ {msg}{_RESET}" + +def info(msg: str) -> str: + return f"{CYAN}ℹ️ {msg}{_RESET}" + +def muted(msg: str) -> str: + return f"{GREY}{msg}{_RESET}" diff --git a/src/performers/scraper.py b/src/performers/scraper.py index 34d351f..e3e059f 100644 --- a/src/performers/scraper.py +++ b/src/performers/scraper.py @@ -1,13 +1,30 @@ +""" +Goondex Performer Scraper +------------------------- +Fetches performer data from PornPics and caches results locally. +Supports both A–Z directory scraping and individual performer profiles. + +Author: Leak Technologies +""" + import time import re +import datetime import requests from pathlib import Path from bs4 import BeautifulSoup -from playwright.sync_api import sync_playwright -from performers.utils import normalize_name, save_json, load_json -from performers.db_manager import init_db, add_or_update_performer, list_count -from ml.tagging import assign_tags # import our tag assignment function -from ml.tagging_config import tags_config # to load our tags configuration + +# Optional Playwright support +try: + from playwright.sync_api import sync_playwright + PLAYWRIGHT_AVAILABLE = True +except ImportError: + PLAYWRIGHT_AVAILABLE = False + +from src.performers.utils import normalize_name, save_json, load_json +from src.performers.db_manager import init_db, add_or_update_performer, list_count +from src.ml.tagging import assign_tags # image tag generation +from src.ml.tagging_config import tags_config # tag definitions # ───────────────────────────────────────────── # Configuration @@ -18,7 +35,6 @@ PROGRESS_PATH = Path(__file__).resolve().parents[1] / "importer" / "reports" / " CACHE_DIR = Path(__file__).resolve().parents[1] / "importer" / "cache" / "performers" CACHE_DIR.mkdir(parents=True, exist_ok=True) - # ───────────────────────────────────────────── # Parsing Helpers # ───────────────────────────────────────────── @@ -33,33 +49,26 @@ def extract_performers_from_html(html: str): if not name or not href: continue - # only accept direct profile links: /pornstars// - # (no extra path parts) if not re.match(r"^/pornstars/[^/]+/$", href): continue - # skip junk lname = name.lower() if any(bad in lname for bad in ["unknown", "amateur", "couple"]): continue - # use the URL slug as the unique id - slug = href.strip("/").split("/")[1] # ['pornstars', ''] - nid = slug.lower() # already URL-safe; no need to normalize name + slug = href.strip("/").split("/")[1] + nid = slug.lower() results.append({ - "id": nid, # unique + stable - "name": name, # display name + "id": nid, + "name": name, "url": f"https://www.pornpics.com{href}", }) - # Fallback regex (same rules) if not results: for href, name in re.findall(r'href="(/pornstars/[^"]+)">([^<]+)', html): if not re.match(r"^/pornstars/[^/]+/$", href or ""): continue - if not name: - continue lname = name.lower() if any(bad in lname for bad in ["unknown", "amateur", "couple"]): continue @@ -70,7 +79,6 @@ def extract_performers_from_html(html: str): "name": name.strip(), "url": f"https://www.pornpics.com{href}", }) - return results @@ -95,10 +103,7 @@ def fetch_static(letter: str) -> str: def render_and_cache(letter: str) -> str: - """ - Use cache → static fetch → Playwright render (fallback) hierarchy. - Keeps each letter’s HTML cached locally. - """ + """Use cache → static fetch → Playwright render (fallback) hierarchy.""" cache_file = CACHE_DIR / f"{letter}.html" if cache_file.exists(): print(f"[💾] Using cached HTML for '{letter.upper()}'") @@ -109,10 +114,11 @@ def render_and_cache(letter: str) -> str: cache_file.write_text(html, encoding="utf-8") return html - # Fallback to Playwright only if static fetch failed - url = f"{BASE_URL}?letter={letter}" - print(f"[🧠] Falling back to Playwright render for {letter.upper()}") + if not PLAYWRIGHT_AVAILABLE: + print(f"[⚠] Playwright not installed — skipping render for {letter.upper()}") + return "" + print(f"[🧠] Falling back to Playwright render for {letter.upper()}") try: with sync_playwright() as p: browser = p.chromium.launch(headless=True, args=["--no-sandbox"]) @@ -122,7 +128,7 @@ def render_and_cache(letter: str) -> str: ) page = context.new_page() page.set_default_timeout(10000) - page.goto(url, wait_until="domcontentloaded") + page.goto(f"{BASE_URL}?letter={letter}", wait_until="domcontentloaded") html = page.content() browser.close() except Exception as e: @@ -139,21 +145,20 @@ def render_and_cache(letter: str) -> str: # ───────────────────────────────────────────── -# Scraping Logic +# Tagging + Scraping Logic # ───────────────────────────────────────────── - def scrape_performer_tags(performer_id, performer_url): """Use object detection to tag the performer images.""" - # Placeholder for actual image extraction from the performer page - image_urls = fetch_performer_images(performer_url) # Function to fetch images from the performer URL - + try: + image_urls = fetch_performer_images(performer_url) # hypothetical image extractor + except Exception: + image_urls = [] tags = [] for image_url in image_urls: - # Assuming image_url contains an image to be processed for tagging - tags.extend(assign_tags(image_url)) # Here we use the assign_tags function to generate tags - + tags.extend(assign_tags(image_url)) return tags + def scrape_letter(letter: str): """Scrape one letter of the performer list, using cached or live data.""" html = render_and_cache(letter) @@ -162,7 +167,6 @@ def scrape_letter(letter: str): performers = extract_performers_from_html(html) - # 🔍 De-duplication diagnostics seen = set() unique_performers = [] for p in performers: @@ -176,17 +180,15 @@ def scrape_letter(letter: str): print(f" → Found {len(unique_performers)} unique performers for {letter.upper()}") - # Now assign tags to each performer for performer in unique_performers: performer_tags = scrape_performer_tags(performer["id"], performer["url"]) - performer["tags"] = performer_tags # Store the tags with the performer data - + performer["tags"] = performer_tags return unique_performers def scrape_all(): """Scrape entire PornPics performer directory (A–Z) and sync to DB.""" - init_db() # ensure database exists first + init_db() all_performers = {} progress = load_json(PROGRESS_PATH) or {} existing_data = load_json(OUTPUT_PATH) or [] @@ -202,22 +204,18 @@ def scrape_all(): for letter in "abcdefghijklmnopqrstuvwxyz"[start_index:]: performers = scrape_letter(letter) - if not performers: print(f"[⚠] No performers found for {letter.upper()} — skipping DB update.") continue - # Save to both memory + DB for perf in performers: all_performers.setdefault(perf["id"], perf) add_or_update_performer(perf) - # Save JSON + progress checkpoint save_json(list(all_performers.values()), OUTPUT_PATH) save_json({"last_letter": letter}, PROGRESS_PATH) print(f"[💾] Progress saved (last: {letter.upper()}) — total performers: {len(all_performers)}") - - time.sleep(2) # polite delay between letters + time.sleep(2) if PROGRESS_PATH.exists(): PROGRESS_PATH.unlink() @@ -228,6 +226,98 @@ def scrape_all(): print(f"[→] Saved to: {OUTPUT_PATH}") +# ───────────────────────────────────────────── +# Individual Performer Profile Scraper +# ───────────────────────────────────────────── +import pycountry + +def _calculate_age(birthdate: str) -> str: + try: + dob = datetime.datetime.strptime(birthdate, "%Y-%m-%d").date() + today = datetime.date.today() + age = today.year - dob.year - ((today.month, today.day) < (dob.month, dob.day)) + return f"{birthdate} ({age} years old)" + except Exception: + return birthdate or "Unknown" + + +def _flag_for_country(name: str) -> str: + try: + country_obj = pycountry.countries.lookup(name) + return ''.join(chr(127397 + ord(c)) for c in country_obj.alpha_2.upper()) + except Exception: + return "" + + +def scrape_performer_profile(performer_name: str) -> dict: + """Fetch detailed performer metadata from PornPics profile page.""" + normalized = normalize_name(performer_name) + profile_url = f"https://www.pornpics.com/pornstars/{normalized}/" + print(f"[🌐] Fetching PornPics profile for {performer_name} → {profile_url}") + + try: + resp = requests.get( + profile_url, + headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/128.0"}, + timeout=10, + ) + if resp.status_code != 200: + print(f"[!] Failed to fetch profile ({resp.status_code})") + return {} + except Exception as e: + print(f"[!] Error fetching profile for {performer_name}: {e}") + return {} + + soup = BeautifulSoup(resp.text, "html.parser") + + img_tag = soup.select_one(".model-thumb img, .model-info img") + profile_image = img_tag["src"] if img_tag and img_tag.get("src") else None + + details = {} + for li in soup.select(".model-details li"): + txt = li.get_text(strip=True) + if ":" not in txt: + continue + key, val = [x.strip() for x in txt.split(":", 1)] + details[key.lower()] = val + + birth = details.get("born") + gender = details.get("gender", "Unknown") + country = details.get("country") or details.get("nationality") + ethnicity = details.get("ethnicity") + hair = details.get("hair color") + height = details.get("height") + weight = details.get("weight") + tattoos = details.get("tattoos") + breast_size = details.get("breast size") + breast_type = details.get("breast type") + + gender_emoji = "♀️" if gender.lower().startswith("f") else ("♂️" if gender.lower().startswith("m") else "") + gender_full = f"{gender.capitalize()} {gender_emoji}".strip() + + flag = _flag_for_country(country or "") if country else "" + country_display = f"{country} {flag}".strip() if country else None + + performer_data = { + "name": performer_name, + "normalized_id": normalized, + "url": profile_url, + "profile_image": profile_image, + "gender": gender_full, + "country": country_display, + "birth_date": _calculate_age(birth) if birth else None, + "ethnicity": ethnicity, + "hair_color": hair, + "height": height, + "weight": weight, + "tattoos": tattoos, + "breast_size": breast_size, + "breast_type": breast_type, + "source": "PornPics", + } + return performer_data + + # ───────────────────────────────────────────── # Entrypoint # ───────────────────────────────────────────── diff --git a/src/performers/search.py b/src/performers/search.py new file mode 100644 index 0000000..b2532f2 --- /dev/null +++ b/src/performers/search.py @@ -0,0 +1,336 @@ +#!/usr/bin/env python3 +""" +search.py +--------- +Performer Search Interface — Goondex v0.3.11 + +Unified performer metadata browser with terminal-friendly visuals. +Fetches from local DB, TPDB, and PornPics with automatic merge + caching. + +Usage: + gx search-performer "Riley Reid" + gx search-performer "Riley Reid" --json +""" + +import os +import sys +import json +import sqlite3 +import pycountry +from datetime import datetime, date +from pathlib import Path +from typing import Optional +from src.ml.facecrop.image_display import show_image +from src.performers.utils import normalize_name +from src.performers.db_manager import add_or_update_performer +from src.importer.pornpics_bridge import fetch_pornpics_profile +from src.performers.tpdb_bridge import fetch_tpdb_performers + +# ============================================================ +# Paths +# ============================================================ +BASE_DIR = Path(__file__).resolve().parents[2] +DATA_DIR = BASE_DIR / "data" / "performers" +FACES_DIR = BASE_DIR / "data" / "faces" +DB_PATH = BASE_DIR / "src" / "importer" / "db" / "performers.db" +GALLERIES_DIR = BASE_DIR / "data" / "galleries" + +# ============================================================ +# Colors +# ============================================================ +COLORS = { + "brand": "\033[38;5;205m", + "accent": "\033[38;5;219m", + "white": "\033[97m", + "grey": "\033[38;5;250m", + "cyan": "\033[38;5;123m", + "reset": "\033[0m", +} +def color(txt, c): return f"{COLORS.get(c, COLORS['white'])}{txt}{COLORS['reset']}" +def divider(): return color("─" * 44, "brand") +def title_line(t): return f"{divider()}\n{color('💖 ' + t, 'accent')}\n{divider()}" + +# ============================================================ +# Utility Helpers +# ============================================================ +def country_flag(country_name: str) -> str: + if not country_name: + return "" + try: + c = pycountry.countries.lookup(country_name) + return "".join(chr(127397 + ord(ch)) for ch in c.alpha_2.upper()) + except Exception: + return "" + +def calc_age(birth_str: str) -> str: + try: + birth = datetime.strptime(birth_str, "%Y-%m-%d").date() + today = date.today() + years = today.year - birth.year - ((today.month, today.day) < (birth.month, birth.day)) + return f"{birth_str} ({years} years old)" + except Exception: + return birth_str or "-" + +def gender_icon(gender: str) -> str: + if not gender: + return "-" + g = gender.lower() + if "female" in g or g == "f": + return f"Female ♀️" + if "male" in g or g == "m": + return f"Male ♂️" + return f"{gender.title()} ⚧️" + +def format_height(value): + if not value: + return "-" + try: + val = str(value).lower().replace("cm", "").strip() + cm = float(val) + inches = cm / 2.54 + ft = int(inches // 12) + inch = int(round(inches % 12)) + return f"{cm:.0f} cm ({ft}′{inch}″)" + except Exception: + return str(value) + +def format_weight(value): + if not value: + return "-" + try: + val = str(value).lower().replace("kg", "").strip() + kg = float(val) + lb = kg * 2.20462 + return f"{kg:.0f} kg ({lb:.0f} lbs)" + except Exception: + return str(value) + +def nonempty(value) -> bool: + return value not in (None, "", "-", [], {}) + +# ============================================================ +# Data Helpers +# ============================================================ +def fetch_from_db(name: str) -> Optional[dict]: + if not DB_PATH.exists(): + return None + conn = sqlite3.connect(DB_PATH) + conn.row_factory = sqlite3.Row + cur = conn.cursor() + cur.execute(""" + SELECT * FROM performers + WHERE LOWER(name) LIKE ? OR id = ? + ORDER BY name LIMIT 1; + """, (f"%{name.lower()}%", normalize_name(name))) + row = cur.fetchone() + conn.close() + return dict(row) if row else None + +def fetch_from_json(name: str) -> Optional[dict]: + normalized = normalize_name(name) + for fname in (f"{normalized}.json", f"{normalized.replace('_','-')}.json", f"{normalized.replace('-','_')}.json"): + path = DATA_DIR / fname + if path.exists(): + try: + return json.loads(path.read_text(encoding="utf-8")) + except Exception: + continue + return None + +def save_to_json(performer_data: dict): + pid = performer_data.get("id") or normalize_name(performer_data.get("name", "unknown")) + path = DATA_DIR / f"{pid}.json" + try: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(performer_data, indent=2, ensure_ascii=False), encoding="utf-8") + print(f"[💾] Cached performer → {path.name}") + except Exception as e: + print(f"[!] Failed to save JSON cache for {pid}: {e}") + +# ============================================================ +# Local Gallery Counter +# ============================================================ +def count_local_galleries_for_performer(name_or_id: str) -> int: + if not GALLERIES_DIR.exists(): + return 0 + count = 0 + query = normalize_name(name_or_id).lower() + for meta_path in GALLERIES_DIR.rglob("metadata.json"): + try: + data = json.loads(meta_path.read_text(encoding="utf-8")) + performers = data.get("performers", []) + tags = [t.lower() for t in data.get("tags", []) if isinstance(t, str)] + if any(query in normalize_name(p).lower() for p in performers if isinstance(p, str)): + count += 1 + continue + tag_match = any(query in t.replace("-", "").replace("_", "") for t in tags) + if tag_match: + count += 1 + except Exception: + continue + return count + +# ============================================================ +# Fetch + Merge +# ============================================================ +def _merge_performer_data(tpdb_data: dict | None, pp_data: dict | None) -> dict: + if not tpdb_data: + return pp_data or {} + if not pp_data: + return tpdb_data or {} + merged = tpdb_data.copy() + for k, v in pp_data.items(): + if not merged.get(k) or merged[k] in ("", "-", None, []): + merged[k] = v + if "stats" in pp_data: + merged.setdefault("stats", {}).update(pp_data["stats"]) + merged.setdefault("sources", {}).update(pp_data.get("sources", {})) + merged["source"] = "TPDB+PornPics" + return merged + +def fetch_remote_performer(name: str) -> Optional[dict]: + print(color(f"[⚠] No local record for '{name}'. Fetching from TPDB…", "brand")) + tpdb_data = None + results = fetch_tpdb_performers(limit=100) + for p in results: + if name.lower() in p.get("name", "").lower(): + tpdb_data = p + break + if tpdb_data: + print(color(f"[✅] TPDB match found → {tpdb_data['name']}", "cyan")) + else: + print(color("[ℹ] TPDB returned no match.", "grey")) + print(color("[ℹ] Checking PornPics profile…", "grey")) + pp_data = fetch_pornpics_profile(name) + if pp_data: + print(color(f"[✅] Found performer on PornPics → {pp_data['name']}", "cyan")) + if not tpdb_data and not pp_data: + print(color(f"[❌] No results for '{name}'", "brand")) + return None + merged = _merge_performer_data(tpdb_data, pp_data) + save_to_json(merged) + add_or_update_performer(merged) + return merged + +# ============================================================ +# Display Helpers +# ============================================================ +def print_section(title: str, rows: list[tuple[str, str]]): + visible = [r for r in rows if nonempty(r[1])] + if not visible: + return + print(color(f"\n📌 {title}", "accent")) + for label, val in visible: + print(f"{color(label, 'cyan')} {color(val, 'white')}") + +def find_thumbnail(pid: str) -> Optional[Path]: + folder = FACES_DIR / pid + for ext in (".jpg", ".jpeg", ".png", ".webp"): + thumb = folder / f"thumbnail{ext}" + if thumb.exists(): + return thumb + alt = next(folder.glob(f"*{ext}"), None) + if alt: + return alt + return None + +def display_performer(perf: dict): + print(title_line("Performer Profile")) + pid = perf.get("id") or normalize_name(perf.get("name", "unknown")) + thumb = find_thumbnail(pid) + if thumb and os.environ.get("TERM", "").lower().startswith(("xterm-kitty", "wezterm")): + print(color("🖼️ Thumbnail:", "grey")) + show_image(str(thumb), width=300) + print("") + + print_section("Core Information", [ + ("🧩 ID:", pid), + ("🎀 Name:", perf.get("name", "Unknown")), + ("🚺 Gender:", gender_icon(perf.get("gender", "-"))), + ("🌍 Country:", f"{perf.get('country', perf.get('nationality', '-'))} {country_flag(perf.get('country', perf.get('nationality', '')))}"), + ("🎂 Born:", calc_age(perf.get("birthdate", "-"))), + ("🧬 Ethnicity:", perf.get("ethnicity", "-")), + ]) + + print_section("Physical Attributes", [ + ("💇 Hair:", perf.get("hair_color", "-")), + ("👁️ Eye color:", perf.get("eye_color", "-")), + ("📏 Height:", format_height(perf.get("height") or perf.get("height_cm"))), + ("⚖️ Weight:", format_weight(perf.get("weight") or perf.get("weight_kg"))), + ("🏋️ Body type:", perf.get("body_type", "-")), + ("📐 Measurements:", perf.get("measurements", "-")), + ]) + + print_section("Appearance Details", [ + ("💉 Tattoos:", perf.get("tattoos", "-")), + ("💎 Piercings:", perf.get("piercings", "-")), + ("🍈 Breast size:", perf.get("breast_size", "-")), + ("🧴 Breast type:", perf.get("breast_type", "-")), + ]) + + print_section("Personal & Identity", [ + ("⚧️ Orientation:", perf.get("orientation", "-")), + ("🧩 Aliases:", ", ".join(perf.get("aliases", [])) if perf.get("aliases") else "-"), + ]) + + print_section("Career", [ + ("📅 Career start:", perf.get("career_start", "-")), + ("📆 Career end:", perf.get("career_end", "-")), + ]) + + stats = perf.get("stats") or {} + local_galleries = count_local_galleries_for_performer(perf.get("name", "")) + known_galleries = ( + stats.get("total_galleries") + or stats.get("galleries") + or stats.get("total_scenes") + or perf.get("total_galleries") + or perf.get("total_scenes") + or 0 + ) + print_section("Activity Stats", [ + ("📊 Local Galleries:", str(local_galleries)), + ("🖼️ PornPics Galleries:", str(known_galleries)), + ]) + + sources = perf.get("sources") or {} + if sources: + print(divider()) + print(color("🔗 Sources:", "accent")) + for src, link in sources.items(): + print(f" {color(src, 'grey')} → {color(link, 'white')}") + print(divider()) + +# ============================================================ +# CLI Entrypoint +# ============================================================ +def main(): + if len(sys.argv) < 2: + print("Usage: gx search-performer [--json]") + sys.exit(1) + + args = sys.argv[1:] + name_parts = [a for a in args if not a.startswith("--")] + flags = [a for a in args if a.startswith("--")] + + name = " ".join(name_parts).strip() + output_json = "--json" in flags + + db_perf = fetch_from_db(name) + json_perf = fetch_from_json(name) + def _score(d): return len([v for v in (d or {}).values() if v not in (None, "", "-", [], {})]) + perf = json_perf if _score(json_perf) >= _score(db_perf) else db_perf + + if not perf: + perf = fetch_remote_performer(name) + if not perf: + print(color(f"[✖] No performer found matching '{name}'", "brand")) + sys.exit(1) + + if output_json: + print(json.dumps(perf, indent=2, ensure_ascii=False)) + else: + display_performer(perf) + +if __name__ == "__main__": + main() diff --git a/src/performers/sync/sync_all.py b/src/performers/sync/sync_all.py new file mode 100644 index 0000000..ebb4529 --- /dev/null +++ b/src/performers/sync/sync_all.py @@ -0,0 +1,145 @@ +#!/usr/bin/env python3 +""" +sync_all.py +───────────────────────────────────────────── +Goondex v0.3.5-r1 — Two-Way Performer Sync Manager + +Performs intelligent bidirectional synchronization between +JSON performer files and the SQLite database: + + • If JSON is newer → import into SQLite + • If SQLite is newer → export to JSON + • If timestamps match → skip + +Supports: + --fix-only → perform sync silently (no output except errors) + --silent → minimal logging (summary only) +───────────────────────────────────────────── +""" + +import sys +import json +from datetime import datetime +from pathlib import Path +from src.performers import db_manager + +# Directories +JSON_DIR = Path("data/performers") + + +# ───────────────────────────────────────────── +# Helper functions +# ───────────────────────────────────────────── +def _parse_timestamp(ts: str | None) -> datetime: + """Safely parse an ISO timestamp or return datetime.min.""" + try: + return datetime.fromisoformat(ts.replace("Z", "")) + except Exception: + return datetime.min + + +def _log(message: str, fix_only: bool, silent: bool): + """Conditional logger respecting silent/fix-only flags.""" + if fix_only: + return + if not silent: + print(message) + + +# ───────────────────────────────────────────── +# Core Sync Logic +# ───────────────────────────────────────────── +def main(): + # Parse arguments + fix_only = "--fix-only" in sys.argv + silent = "--silent" in sys.argv or fix_only + + if not silent: + print("\n[🔁] Goondex Two-Way Sync (JSON ↔ SQLite)") + print("─────────────────────────────────────────────") + + db_manager.init_db() + + # Collect JSON performers + json_files = list(JSON_DIR.glob("*/performer.json")) + json_map = {} + for jf in json_files: + try: + data = json.loads(jf.read_text(encoding="utf-8")) + performer_id = data.get("normalized_id") or data.get("id") + json_map[performer_id] = { + "path": jf, + "timestamp": _parse_timestamp(data.get("last_updated")), + } + except Exception as e: + _log(f"[⚠️] Skipping corrupted JSON: {jf} ({e})", fix_only, silent) + + # Collect SQLite performers + with db_manager.get_conn() as conn: + cur = conn.execute("SELECT id, last_updated FROM performers;") + sql_rows = cur.fetchall() + sql_map = {r["id"]: _parse_timestamp(r["last_updated"]) for r in sql_rows} + + synced_json_to_sqlite = [] + synced_sqlite_to_json = [] + skipped = [] + + # ─── Compare timestamps ───────────────────────────── + for pid, jdata in json_map.items(): + jtime = jdata["timestamp"] + stime = sql_map.get(pid, datetime.min) + + if jtime > stime: + db_manager.import_from_json(jdata["path"]) + synced_json_to_sqlite.append(pid) + _log(f"[📥] Imported JSON → SQLite : {pid}", fix_only, silent) + elif stime > jtime: + db_manager.export_to_json(pid) + synced_sqlite_to_json.append(pid) + _log(f"[📤] Exported SQLite → JSON : {pid}", fix_only, silent) + else: + skipped.append(pid) + + # ─── Handle DB-only performers ─────────────────────── + for pid in sql_map.keys(): + if pid not in json_map: + db_manager.export_to_json(pid) + synced_sqlite_to_json.append(pid) + _log(f"[➕] Created new JSON from DB : {pid}", fix_only, silent) + + # ─── Handle JSON-only performers ───────────────────── + for pid in json_map.keys(): + if pid not in sql_map: + db_manager.import_from_json(json_map[pid]["path"]) + synced_json_to_sqlite.append(pid) + _log(f"[🆕] Imported new JSON into DB : {pid}", fix_only, silent) + + # ─── Summary ───────────────────────────────────────── + if not fix_only: + if not silent: + print("─────────────────────────────────────────────") + print(f"[📥] JSON → SQLite imports : {len(synced_json_to_sqlite)}") + print(f"[📤] SQLite → JSON exports : {len(synced_sqlite_to_json)}") + print(f"[⏸] Skipped (no changes) : {len(skipped)}") + if not silent: + print("─────────────────────────────────────────────") + print(f"[📂] Database: {db_manager.DB_PATH}") + print(f"[📁] JSON dir: {JSON_DIR}") + print("─────────────────────────────────────────────") + + # Optional verification + try: + db_manager.verify_json_integrity() + except Exception: + if not fix_only: + print("[⚠️] verify_json_integrity() not implemented — skipping check.") + + if not silent: + print("[✅] Two-way sync complete.\n") + + +# ───────────────────────────────────────────── +# Entrypoint +# ───────────────────────────────────────────── +if __name__ == "__main__": + main() diff --git a/src/performers/sync/sync_json_to_sqlite.py b/src/performers/sync/sync_json_to_sqlite.py new file mode 100644 index 0000000..ae6d790 --- /dev/null +++ b/src/performers/sync/sync_json_to_sqlite.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +""" +sync_json_to_sqlite.py +───────────────────────────────────────────── +Bulk migrator for Goondex v0.3.5-r1 + +Scans all per-performer JSON files under `data/performers/` +and imports them into the SQLite database via db_manager.import_from_json(). + +Usage: + python -m src.performers.sync_json_to_sqlite +""" + +import sys +from pathlib import Path +from src.performers import db_manager + +# Base directory containing performer folders +PERFORMERS_DIR = Path("data/performers") + +def main(): + print("\n[🔄] Starting JSON → SQLite migration") + print("─────────────────────────────────────────────") + + if not PERFORMERS_DIR.exists(): + print(f"[!] No performer data found at {PERFORMERS_DIR}") + sys.exit(1) + + db_manager.init_db() + + json_files = sorted(PERFORMERS_DIR.glob("*/performer.json")) + if not json_files: + print("[!] No performer.json files detected.") + sys.exit(0) + + imported_count = 0 + for json_file in json_files: + try: + db_manager.import_from_json(json_file) + imported_count += 1 + except Exception as e: + print(f"[ERROR] Failed to import {json_file}: {e}") + + print("─────────────────────────────────────────────") + print(f"[✓] Imported {imported_count} performer record(s) into SQLite") + print(f"[📂] Database path: {db_manager.DB_PATH}") + print("─────────────────────────────────────────────") + + # Optional post-check: list total performer count + total = db_manager.list_count() + print(f"[📊] Total performers now in DB: {total}\n") + +if __name__ == "__main__": + main() diff --git a/src/performers/sync/sync_sqlite_to_json.py b/src/performers/sync/sync_sqlite_to_json.py new file mode 100644 index 0000000..2b515d0 --- /dev/null +++ b/src/performers/sync/sync_sqlite_to_json.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python3 +""" +sync_sqlite_to_json.py +───────────────────────────────────────────── +Bulk exporter for Goondex v0.3.5-r1 + +Exports all performer records from the SQLite database +into per-performer JSON files under `data/performers//performer.json`. + +Usage: + python -m src.performers.sync_sqlite_to_json +""" + +import sys +from pathlib import Path +from datetime import datetime +from src.performers import db_manager + +# Base directory for JSON exports +JSON_DIR = Path("data/performers") + +def main(): + print("\n[💾] Starting SQLite → JSON export") + print("─────────────────────────────────────────────") + + db_manager.init_db() + + # Gather all performers from SQLite + with db_manager.get_conn() as conn: + cur = conn.execute("SELECT * FROM performers ORDER BY name ASC;") + rows = cur.fetchall() + + if not rows: + print("[!] No performers found in database.") + sys.exit(0) + + exported_count = 0 + for row in rows: + try: + data = dict(row) + performer_id = data.get("id") + folder = JSON_DIR / performer_id + folder.mkdir(parents=True, exist_ok=True) + json_path = folder / "performer.json" + + # Add compatibility metadata + data.setdefault("faces", []) + data.setdefault("aliases", []) + data.setdefault("source_urls", []) + data.setdefault("stats", {"known_galleries": 0, "studio_appearances": {}}) + data["last_updated"] = datetime.utcnow().isoformat() + + json_path.write_text(db_manager.json.dumps(data, indent=2, ensure_ascii=False), encoding="utf-8") + exported_count += 1 + except Exception as e: + print(f"[ERROR] Failed to export performer {row.get('id')}: {e}") + + print("─────────────────────────────────────────────") + print(f"[✓] Exported {exported_count} performer record(s) to JSON") + print(f"[📂] JSON output directory: {JSON_DIR}") + print("─────────────────────────────────────────────") + + # Optional verification + total = db_manager.list_count() + print(f"[📊] Total performers in DB: {total}") + print(f"[🧾] Total JSON directories: {len(list(JSON_DIR.glob('*/performer.json')))}\n") + +if __name__ == "__main__": + main() diff --git a/src/performers/tpdb_bridge.py b/src/performers/tpdb_bridge.py index 01cb163..eb79ccd 100644 --- a/src/performers/tpdb_bridge.py +++ b/src/performers/tpdb_bridge.py @@ -1,7 +1,8 @@ +#!/usr/bin/env python3 """ -tpdb_bridge.py — v0.3.8 +tpdb_bridge.py — v0.3.6 ───────────────────────────────────────────── -Bridge between Porndex importer and ThePornDatabase (TPDB). +Bridge between Goondex importer and ThePornDatabase (TPDB). Provides: - fetch → Pull performers from TPDB and import into local DB. @@ -15,17 +16,27 @@ Provides: - add-source → Manually link a performer to a source/channel. - delete-source → Remove a performer-source relationship. - verify-enrichment → Show enrichment progress or export JSON summary. + +Enhancements (v0.3.6): + - Integrated cli_colours for branded output. + - Streamlined INFO/WARN/ERROR/SAVE/DONE messages. + - Header banner for CLI launch. """ import json import requests import argparse import time +import os from pathlib import Path from typing import List, Dict, Any from datetime import datetime, timedelta +from textwrap import shorten -from performers.db_manager import ( +# Colour utilities +from src.utils.cli_colours import heading, pink, cyan, grey, white, yellow + +from src.performers.db_manager import ( add_or_update_performer, init_db, get_conn, @@ -34,14 +45,34 @@ from performers.db_manager import ( upgrade_source_channel, delete_source_link, ) -from performers.utils import normalize_name +from src.performers.utils import ( + normalize_name, + ensure_performer_exists, + update_performer_record, + save_json, + get_performer_path, +) # ───────────────────────────────────────────── # API configuration # ───────────────────────────────────────────── + API_BASE = "https://api.theporndb.net" API_KEY_ENV = "TPDB_API_KEY" + +# --- Flexible key file resolution --- LOCAL_KEY_FILE = Path(__file__).resolve().parents[1] / "importer" / "secrets" / "tpdb_api_key.txt" +if not LOCAL_KEY_FILE.exists(): + # Fallback for alternate layout (e.g. Goondex/importer/secrets/) + alt_path = Path(__file__).resolve().parents[2] / "importer" / "secrets" / "tpdb_api_key.txt" + if alt_path.exists(): + LOCAL_KEY_FILE = alt_path + else: + # Final fallback using current working directory + cwd_path = Path.cwd() / "src" / "importer" / "secrets" / "tpdb_api_key.txt" + if cwd_path.exists(): + LOCAL_KEY_FILE = cwd_path + REPORT_DIR = Path(__file__).resolve().parents[1] / "importer" / "reports" LOCAL_KEY_FILE.parent.mkdir(parents=True, exist_ok=True) REPORT_DIR.mkdir(parents=True, exist_ok=True) @@ -51,12 +82,17 @@ REPORT_DIR.mkdir(parents=True, exist_ok=True) # Helpers # ───────────────────────────────────────────── def _load_api_key() -> str | None: - import os + """Load TPDB API key from environment or local secrets file.""" env_key = os.getenv(API_KEY_ENV) if env_key: return env_key.strip() + if LOCAL_KEY_FILE.exists(): - return LOCAL_KEY_FILE.read_text().strip() + try: + return LOCAL_KEY_FILE.read_text(encoding="utf-8").strip() + except Exception: + return None + return None @@ -72,36 +108,35 @@ def _export_json_report(report: dict): path = REPORT_DIR / f"enrichment_status_{timestamp}.json" with open(path, "w", encoding="utf-8") as f: json.dump(report, f, indent=2, ensure_ascii=False) - print(f"[💾] Exported JSON report → {path}") + print(pink(f"[SAVE] Exported JSON report → {path}")) # ───────────────────────────────────────────── # Base Fetch Logic # ───────────────────────────────────────────── def fetch_tpdb_performers(limit: int = 100, page: int = 1) -> List[Dict[str, Any]]: - """Fetch performers from TPDB.""" api_key = _load_api_key() if not api_key: - print(f"[!] No API key. Set {API_KEY_ENV}= or put the key in {LOCAL_KEY_FILE}") + print(yellow(f"[ERROR] No API key. Set {API_KEY_ENV}= or put it in {LOCAL_KEY_FILE}")) return [] per_page = min(max(limit, 1), 1000) - print(f"[🌐] Fetching performers from TPDB (page={page}, per_page={per_page})") + print(cyan(f"[INFO] Fetching performers from TPDB (page={page}, per_page={per_page})")) try: resp = _http_get("/performers", params={"page": page, "per_page": per_page}, api_key=api_key) except requests.RequestException as e: - print(f"[!] Network error contacting TPDB: {e}") + print(yellow(f"[WARN] Network error contacting TPDB: {e}")) return [] if resp.status_code != 200: - print(f"[!] TPDB API returned {resp.status_code}: {resp.text[:200]}") + print(yellow(f"[WARN] TPDB API returned {resp.status_code}: {resp.text[:200]}")) return [] try: payload = resp.json() except json.JSONDecodeError: - print("[!] TPDB response was not valid JSON") + print(yellow("[ERROR] TPDB response was not valid JSON")) return [] raw_list = payload.get("data") or payload.get("results") or [] @@ -134,24 +169,71 @@ def fetch_tpdb_performers(limit: int = 100, page: int = 1) -> List[Dict[str, Any return performers +# ───────────────────────────────────────────── +# Single Performer Fetch (used by enrichment_bridge) +# ───────────────────────────────────────────── +def fetch_tpdb_performer(name: str) -> dict | None: + """ + Fetch a single performer by name from TPDB. + Returns a dict of performer data, or None if not found. + """ + api_key = _load_api_key() + if not api_key: + print(yellow(f"[ERROR] No API key found in {API_KEY_ENV} or {LOCAL_KEY_FILE}")) + return None + + try: + resp = _http_get("/performers", params={"name": name, "per_page": 1}, api_key=api_key) + if resp.status_code != 200: + print(yellow(f"[WARN] TPDB returned {resp.status_code} for performer {name}")) + return None + + payload = resp.json() + data = payload.get("data") or payload.get("results") or [] + if not data: + return None + + p = data[0] + performer = { + "id": str(p.get("id")), + "name": p.get("name"), + "url": p.get("url") or f"https://theporndb.net/performer/{p.get('id')}", + "aliases": p.get("aliases") or [], + "gender": p.get("gender") or "Unknown", + "birthdate": p.get("birthdate"), + "ethnicity": p.get("ethnicity"), + "hair_color": p.get("hair_color"), + "eye_color": p.get("eye_color"), + "height_cm": p.get("height"), + "measurements": p.get("measurements"), + "nationality": p.get("nationality"), + "country_code": p.get("country"), + "image": p.get("image"), + "tags": ", ".join(p.get("tags", [])) if isinstance(p.get("tags"), list) else p.get("tags"), + } + return performer + except Exception as e: + print(yellow(f"[ERROR] Failed to fetch {name}: {e}")) + return None + + + # ───────────────────────────────────────────── # Import / Fill Logic # ───────────────────────────────────────────── def import_tpdb_to_db(limit: int = 100): - """Fetch performers from TPDB and store them in the local DB.""" init_db() performers = fetch_tpdb_performers(limit=limit) for p in performers: add_or_update_performer(p) add_or_update_source(p["id"], source_name="TPDB", channel_name="Unknown") - print(f"[💾] Imported {len(performers)} performers into local DB (default source: TPDB/Unknown).") + print(pink(f"[SAVE] Imported {len(performers)} performers into local DB (TPDB/Unknown).")) def fill_index(limit: int = 1000): - """Continuously fetch performers page by page until no more results.""" api_key = _load_api_key() if not api_key: - print(f"[!] No API key found in {API_KEY_ENV} or {LOCAL_KEY_FILE}") + print(yellow(f"[ERROR] No API key found in {API_KEY_ENV} or {LOCAL_KEY_FILE}")) return init_db() @@ -162,7 +244,7 @@ def fill_index(limit: int = 1000): for page in range(1, max_pages + 1): batch = fetch_tpdb_performers(limit=per_page, page=page) if not batch: - print(f"[ℹ️] No more performers after page {page}.") + print(grey(f"[INFO] No more performers after page {page}.")) break for p in batch: @@ -170,20 +252,19 @@ def fill_index(limit: int = 1000): add_or_update_source(p["id"], source_name="TPDB", channel_name="Unknown") total_imported += 1 - print(f"[📥] Page {page} imported ({len(batch)} performers) — total so far: {total_imported}") + print(cyan(f"[INFO] Page {page} imported ({len(batch)} performers) — total: {total_imported}")) time.sleep(0.5) if total_imported >= limit: break - print(f"[✅] Fill-index complete. Total imported: {total_imported}") + print(white(f"[DONE] Fill-index complete. Total imported: {total_imported}")) # ───────────────────────────────────────────── # Scene-based Enrichment Helper # ───────────────────────────────────────────── def _fetch_studio_from_scenes(performer_id: str, api_key: str) -> str | None: - """Try to infer performer’s studio/channel by checking their recent scenes.""" try: resp = _http_get(f"/performers/{performer_id}/scenes", params={"per_page": 3}, api_key=api_key) if resp.status_code != 200: @@ -202,7 +283,7 @@ def _fetch_studio_from_scenes(performer_id: str, api_key: str) -> str | None: # ───────────────────────────────────────────── -# Enrichment Logic +# Enrichment Logic (with optional JSON mirroring) # ───────────────────────────────────────────── def enrich_performers( limit: int = 50, @@ -212,11 +293,11 @@ def enrich_performers( debug_channels: bool = False, use_scenes: bool = False, export_json: bool = False, + mirror_json: bool = False, ): - """Fetch detailed performer metadata with selective enrichment options.""" api_key = _load_api_key() if not api_key: - print(f"[!] No API key found in {API_KEY_ENV} or {LOCAL_KEY_FILE}") + print(yellow(f"[ERROR] No API key found in {API_KEY_ENV} or {LOCAL_KEY_FILE}")) return init_db() @@ -229,7 +310,7 @@ def enrich_performers( "ORDER BY s.last_seen ASC LIMIT ?;" ) performers = conn.execute(query, (limit,)).fetchall() - print(f"[🔁] Retrying enrichment for {len(performers)} unknown performers...") + print(cyan(f"[INFO] Retrying enrichment for {len(performers)} unknown performers...")) elif stale_days: cutoff = (datetime.utcnow() - timedelta(days=stale_days)).isoformat() query = ( @@ -239,7 +320,7 @@ def enrich_performers( "ORDER BY s.last_seen ASC LIMIT ?;" ) performers = conn.execute(query, (cutoff, limit)).fetchall() - print(f"[🕒] Re-enriching performers older than {stale_days} days ({len(performers)} found)...") + print(cyan(f"[INFO] Re-enriching performers older than {stale_days} days ({len(performers)} found)...")) else: query = ( "SELECT id, name FROM performers " @@ -249,7 +330,7 @@ def enrich_performers( else "SELECT id, name FROM performers ORDER BY last_updated ASC LIMIT ?;" ) performers = conn.execute(query, (limit,)).fetchall() - print(f"[🔍] Enriching {len(performers)} performers...") + print(cyan(f"[INFO] Enriching {len(performers)} performers...")) enriched_count = 0 upgraded_count = 0 @@ -261,7 +342,7 @@ def enrich_performers( resp = _http_get(f"/performers/{pid}", api_key=api_key) if resp.status_code != 200: if debug_channels: - print(f"[⚠️] Skipping {name}: {resp.status_code}") + print(yellow(f"[WARN] Skipping {name}: {resp.status_code}")) continue pdata = resp.json().get("data") or resp.json() @@ -286,10 +367,8 @@ def enrich_performers( add_or_update_performer(perf) - # detect studio/network - possible_keys = ["studio", "network", "channel", "label", "production", "site"] studio = None - for key in possible_keys: + for key in ["studio", "network", "channel", "label", "production", "site"]: val = pdata.get(key) if val: studio = val if isinstance(val, str) else val.get("name") @@ -304,26 +383,39 @@ def enrich_performers( upgrade_source_channel(pid, source_name="TPDB", new_channel_name=studio.strip()) upgraded_count += 1 if debug_channels: - emoji = "🎞" if use_scenes else "🎬" - print(f"[{emoji}] {name:<30} → '{studio}'") + print(grey(f"[INFO] {name:<30} → '{studio}'")) else: add_or_update_source(pid, "TPDB", "Unknown") if debug_channels: - print(f"[⚫] {name:<30} → no channel info found") + print(grey(f"[INFO] {name:<30} → no channel info found")) + + if mirror_json: + local_json = ensure_performer_exists(name) + updates = { + "sources": {"tpdb": perf.get("url")}, + "gender": perf.get("gender"), + "ethnicity": perf.get("ethnicity"), + "hair_color": perf.get("hair_color"), + "eye_color": perf.get("eye_color"), + "height_cm": perf.get("height_cm"), + "birth_date": perf.get("birthdate"), + "country": perf.get("nationality"), + } + record = update_performer_record(local_json, updates) + save_json(record, get_performer_path(name)) enriched_count += 1 time.sleep(0.25) except Exception as e: - print(f"[!] Error enriching {name}: {e}") + print(yellow(f"[ERROR] Enrichment failed for {name}: {e}")) - print(f"[✅] Enrichment complete: {enriched_count}/{len(performers)} updated.") - print(f"[📈] Upgraded channels: {upgraded_count} (inferred via scenes: {inferred_count})") + print(pink(f"[DONE] Enrichment complete: {enriched_count}/{len(performers)} updated.")) + print(grey(f"[INFO] Upgraded channels: {upgraded_count} (inferred via scenes: {inferred_count})")) if export_json: report = verify_enrichment_status(limit=20, return_json=True) _export_json_report(report) - # ───────────────────────────────────────────── # Sync Logic # ───────────────────────────────────────────── @@ -370,7 +462,7 @@ def sync_all(limit: int = 5000, batch_size: int = 100, enrich_every: int = 2): # ───────────────────────────────────────────── -# CLI + Verification +# CLI + Verification / Reports # ───────────────────────────────────────────── def list_performers(limit: int = 20): from textwrap import shorten @@ -485,7 +577,7 @@ def delete_source(performer_id: str, source_name: str): # CLI Entrypoint # ───────────────────────────────────────────── def main(): - parser = argparse.ArgumentParser(description="TPDB Bridge — Porndex Performer Importer") + parser = argparse.ArgumentParser(description="TPDB Bridge — Porndex/Goondex Performer Importer") sub = parser.add_subparsers(dest="command") # --- Fetch / Fill --- @@ -501,6 +593,7 @@ def main(): sync_p.add_argument("--enrich-every", type=int, default=2) # --- Enrichment --- + # Original enrich command enrich_p = sub.add_parser("enrich", help="Update performer metadata from TPDB") enrich_p.add_argument("--limit", type=int, default=50) enrich_p.add_argument("--no-skip", action="store_true", help="Include already enriched performers") @@ -509,6 +602,18 @@ def main(): enrich_p.add_argument("--debug-channels", action="store_true", help="Print detailed channel resolution output") enrich_p.add_argument("--use-scenes", action="store_true", help="Infer missing channels from scene listings") enrich_p.add_argument("--export-json", action="store_true", help="Export a JSON enrichment report after completion") + enrich_p.add_argument("--mirror-json", action="store_true", help="Mirror enriched performer data into JSON files") + + # Unified Goondex syntax alias: goondex tpdb-enrich + enrich_alias = sub.add_parser("tpdb-enrich", help="Alias of 'enrich' for Goondex CLI consistency") + enrich_alias.add_argument("--limit", type=int, default=50) + enrich_alias.add_argument("--no-skip", action="store_true") + enrich_alias.add_argument("--retry-unknowns", action="store_true") + enrich_alias.add_argument("--stale-days", type=int) + enrich_alias.add_argument("--debug-channels", action="store_true") + enrich_alias.add_argument("--use-scenes", action="store_true") + enrich_alias.add_argument("--export-json", action="store_true") + enrich_alias.add_argument("--mirror-json", action="store_true") # --- Listing & Reports --- list_p = sub.add_parser("list", help="List performers in database") @@ -541,36 +646,48 @@ def main(): # --- Command Dispatch --- if args.command == "fetch": import_tpdb_to_db(args.limit) + elif args.command == "fill-index": fill_index(args.limit) + elif args.command == "sync-all": sync_all(args.limit, args.batch_size, args.enrich_every) - elif args.command == "enrich": + + elif args.command in ("enrich", "tpdb-enrich"): enrich_performers( - limit=args.limit, - skip_existing=not args.no_skip, - retry_unknowns=args.retry_unknowns, - stale_days=args.stale_days, - debug_channels=args.debug_channels, - use_scenes=args.use_scenes, - export_json=args.export_json, + limit=getattr(args, "limit", 50), + skip_existing=not getattr(args, "no_skip", False), + retry_unknowns=getattr(args, "retry_unknowns", False), + stale_days=getattr(args, "stale_days", None), + debug_channels=getattr(args, "debug_channels", False), + use_scenes=getattr(args, "use_scenes", False), + export_json=getattr(args, "export_json", False), + mirror_json=getattr(args, "mirror_json", False), ) + elif args.command == "list": list_performers(args.limit) + elif args.command == "export-json": export_json(args.limit) + elif args.command == "check-key": check_api_key() + elif args.command == "verify-enrichment": report = verify_enrichment_status(limit=args.limit, return_json=args.export_json) if args.export_json and report: _export_json_report(report) + elif args.command == "list-sources": list_all_sources(args.limit) + elif args.command == "add-source": add_source_link(args.performer_id, args.source_name, args.channel_name) + elif args.command == "delete-source": delete_source(args.performer_id, args.source_name) + else: parser.print_help() diff --git a/src/performers/utils.py b/src/performers/utils.py index feabf64..003fad0 100644 --- a/src/performers/utils.py +++ b/src/performers/utils.py @@ -1,25 +1,178 @@ +#!/usr/bin/env python3 +""" +utils.py +--------- +Shared utilities for the Goondex Performer Recognition System. + +This module now integrates tightly with schema.py to ensure +all performer records follow the canonical Goondex performer schema. + +Responsibilities: + - Name normalization + - JSON read/write helpers + - Schema validation proxy + - Path resolution for performer data + +All performer-related modules (scraper, trainer, verifier, TPDB bridge) +should import from here to guarantee consistent behavior. + +Example usage: + from src.performers.utils import ( + normalize_name, + ensure_performer_exists, + load_json, + save_json + ) + + performer = ensure_performer_exists("Riley Reid") +""" + import re import json from pathlib import Path +from datetime import datetime +from typing import Optional, Dict, Any + +# Import schema utilities +from src.performers.schema import ( + ensure_performer_schema, + validate_performer_data, + create_blank_performer, + load_performer_json, + save_performer_json, + normalize_id +) + +# ============================================================ +# Core Path Constants +# ============================================================ + +DATA_DIR = Path("data/performers") +DATA_DIR.mkdir(parents=True, exist_ok=True) + +# ============================================================ +# Utility Functions +# ============================================================ def normalize_name(name: str) -> str: """ Normalizes performer names into lowercase alphanumeric IDs. Example: 'Lulu Chu' -> 'lulu_chu' """ - name = name.strip().lower() - name = re.sub(r'[^a-z0-9]+', '_', name) - return name.strip('_') + return normalize_id(name) -def save_json(data, path: Path): - """Safely saves JSON to disk.""" + +def get_performer_path(name: str) -> Path: + """ + Returns the expected JSON path for a given performer. + Example: + get_performer_path("Riley Reid") + -> data/performers/riley_reid/performer.json + """ + return DATA_DIR / normalize_name(name) / "performer.json" + + +def save_json(data: Dict[str, Any], path: Path): + """ + Safely saves JSON to disk with UTF-8 encoding and indentation. + Creates directories automatically. + """ path.parent.mkdir(parents=True, exist_ok=True) with open(path, "w", encoding="utf-8") as f: json.dump(data, f, indent=2, ensure_ascii=False) -def load_json(path: Path): - """Loads JSON if available, otherwise returns None.""" + +def load_json(path: Path) -> Optional[Dict[str, Any]]: + """ + Loads JSON from disk if available. + Returns None if the file doesn't exist or is unreadable. + """ if not path.exists(): return None - with open(path, "r", encoding="utf-8") as f: - return json.load(f) + try: + with open(path, "r", encoding="utf-8") as f: + return json.load(f) + except json.JSONDecodeError: + print(f"[WARN] JSON file corrupted: {path}") + return None + + +# ============================================================ +# Performer Schema Integration +# ============================================================ + +def create_performer_record(name: str) -> Dict[str, Any]: + """ + Create a new performer record following the standard schema. + + Args: + name (str): Performer name (e.g. 'Riley Reid') + + Returns: + dict: A fully initialized performer record ready for use. + """ + data = create_blank_performer(name) + path = get_performer_path(name) + save_performer_json(path, data) + return data + + +def update_performer_record(base: dict, updates: dict) -> dict: + """ + Shallow merges updates into a performer record. + Used by scraper and TPDB bridge to merge partial data. + """ + for key, value in updates.items(): + if isinstance(value, dict) and key in base: + base[key].update(value) + else: + base[key] = value + + base["last_updated"] = datetime.utcnow().isoformat(timespec="seconds") + "Z" + return base + + +def ensure_performer_exists(name: str) -> Dict[str, Any]: + """ + Ensures performer.json exists, is valid, and follows schema. + Returns a validated performer record dictionary. + """ + performer_dir = DATA_DIR / normalize_name(name) + performer_file = performer_dir / "performer.json" + + performer_file = ensure_performer_schema(name, DATA_DIR) + data = load_performer_json(performer_file) + return data + + +def list_all_performers() -> list[str]: + """ + Returns a list of all performer folders currently in data/performers. + """ + if not DATA_DIR.exists(): + return [] + return [p.name for p in DATA_DIR.iterdir() if p.is_dir()] + + +# ============================================================ +# Compatibility & Helper Hooks +# ============================================================ + +def repair_all_performers(): + """ + Validates all performer.json files in data/performers. + Repairs structure if necessary. + """ + count = 0 + for folder in DATA_DIR.iterdir(): + if not folder.is_dir(): + continue + file = folder / "performer.json" + if file.exists(): + try: + data = load_performer_json(file) + save_performer_json(file, validate_performer_data(data)) + count += 1 + except Exception as e: + print(f"[WARN] Skipped invalid performer {folder.name}: {e}") + print(f"[OK] Repaired {count} performer record(s).") diff --git a/src/utils/cli_colours.py b/src/utils/cli_colours.py new file mode 100644 index 0000000..bfba805 --- /dev/null +++ b/src/utils/cli_colours.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python3 +""" +cli_colours.py — Goondex Terminal Colour Helper +─────────────────────────────────────────────── +Centralised ANSI colour definitions for Goondex CLI output. +Keeps all modules visually consistent (importer, TPDB bridge, +performer search, ML tools, etc.) + +Palette — Flamingo Pulse theme: + pink → primary accent + lilac → secondary accent + cyan → highlight / link + yellow → warning / info + white → base text + grey → muted / subtle + reset → reset sequence +""" + +# ANSI escape sequences +_RESET = "\033[0m" + +# Brand palette (Flamingo Pulse inspired) +PINK = "\033[38;5;205m" # vivid magenta-pink +LILAC = "\033[38;5;177m" # soft violet accent +CYAN = "\033[38;5;123m" # turquoise-cyan for links +YELLOW = "\033[38;5;228m" # bright pastel yellow +WHITE = "\033[38;5;255m" # near-white text +GREY = "\033[38;5;246m" # neutral soft grey +BOLD = "\033[1m" +DIM = "\033[2m" + +# ───────────────────────────────────────────── +# Helper functions for inline use +# ───────────────────────────────────────────── +def pink(text: str) -> str: + return f"{PINK}{text}{_RESET}" + +def lilac(text: str) -> str: + return f"{LILAC}{text}{_RESET}" + +def cyan(text: str) -> str: + return f"{CYAN}{text}{_RESET}" + +def yellow(text: str) -> str: + return f"{YELLOW}{text}{_RESET}" + +def white(text: str) -> str: + return f"{WHITE}{text}{_RESET}" + +def grey(text: str) -> str: + return f"{GREY}{text}{_RESET}" + +def bold(text: str) -> str: + return f"{BOLD}{text}{_RESET}" + +def dim(text: str) -> str: + return f"{DIM}{text}{_RESET}" + +# ───────────────────────────────────────────── +# Composite helpers +# ───────────────────────────────────────────── +def heading(title: str, icon: str = "💖", version: str | None = None) -> str: + """Generate a styled Goondex section header.""" + bar = grey("─" * 45) + ver = f" · {grey(version)}" if version else "" + return f"\n{bar}\n{pink(icon)} {bold(white(title))}{ver}\n{bar}" + +def success(msg: str) -> str: + return f"{WHITE}✅ {msg}{_RESET}" + +def warning(msg: str) -> str: + return f"{YELLOW}⚠️ {msg}{_RESET}" + +def error(msg: str) -> str: + return f"{PINK}❌ {msg}{_RESET}" + +def info(msg: str) -> str: + return f"{CYAN}ℹ️ {msg}{_RESET}" + +def muted(msg: str) -> str: + return f"{GREY}{msg}{_RESET}" diff --git a/src/utils/install_alias.fish b/src/utils/install_alias.fish index 3e555d2..980ab5b 100755 --- a/src/utils/install_alias.fish +++ b/src/utils/install_alias.fish @@ -1,70 +1,95 @@ #!/usr/bin/env fish # ============================================================ -# Goondex CLI Alias Installer (Fish-native) +# Goondex CLI — Unified Alias Function (Fish) # ============================================================ -# Creates a persistent 'goondex' command so you can run: -# goondex import -# goondex trainer -# goondex verify [tags] -# goondex search-performer +# Supports: +# Importer / Tagging: goondex import, goondex refresh-all, etc. +# ML Facecrop Tools: goondex trainer, goondex verify +# Performer Database: goondex search-performer, goondex tpdb-enrich # ============================================================ -set project_root (pwd) -set venv_path "$project_root/.venv/bin/python" -set config_file "$HOME/.config/fish/config.fish" - -echo "Installing Goondex CLI alias for Fish..." - -# Verify virtual environment exists -if not test -f $venv_path - echo "Error: Virtual environment not found at $venv_path" - echo "Please create it with: python -m venv .venv" - exit 1 -end - -# ------------------------------------------------------------ -# Define the unified goondex command function -# ------------------------------------------------------------ -set function_block " function goondex - set cmd \$argv[1] - set args \$argv[2..-1] + set cmd $argv[1] + set args $argv[2..-1] + set project_root /home/stu/Projects/PD/Goondex + set venv_path $project_root/.venv/bin/python + set -x PYTHONPATH $project_root/src - switch \$cmd - case import - $venv_path -m importer.cli \$args + switch $cmd + # --- Importer CLI (preserves all original commands) --- + case '' -h --help help + echo "" + echo "Goondex CLI — Unified Interface" + echo "────────────────────────────────────────────" + echo "" + echo "Usage: goondex [args]" + echo "" + echo "Core Importer Commands:" + echo " import Import a new gallery from PornPics" + echo " refresh-all Refresh tags for all galleries" + echo " refresh-one Refresh tags for a single gallery" + echo " validate-tags Validate YAML tag dictionaries" + echo " tag-stats Generate tag frequency report" + echo " list List all available galleries" + echo " list-tags Show tags for one gallery" + echo " add Add a tag manually" + echo " remove Remove a tag manually" + echo " add-multi \"A,B\" Add multiple tags at once" + echo " show-metadata Show metadata.json contents" + echo " source set Set gallery source" + echo "" + echo "Machine Learning (Face Recognition):" + echo " trainer Train face embeddings from ML/faces_cache/" + echo " verify [tags] Verify performer face image similarity" + echo "" + echo "Performers & Metadata:" + echo " search-performer Search local performer records" + echo " tpdb-enrich Sync or mirror metadata from ThePornDB" + echo "" + echo "Utilities:" + echo " --help / -h / help Show this help menu" + echo " --version / -v / version Show current Goondex version" + echo "" + echo "Examples:" + echo " goondex import \"https://www.pornpics.com/galleries/example/\"" + echo " goondex refresh-one \"20251106_2041_Madison_Young_ATK_Archives\"" + echo " goondex trainer" + echo " goondex verify ./ML/faces_cache/face_001.jpg \"Riley Reid,Eva Lovia\"" + echo "" + echo "────────────────────────────────────────────" + echo "Goondex v0.3.4 — Leak Technologies (2025)" + echo "" + return + + case import refresh-all refresh-one validate-tags tag-stats list list-tags add remove add-multi show-metadata source + $venv_path -m src.importer.cli $cmd $args + return + + # --- Machine Learning (Facecrop / Recognition) --- case trainer - $venv_path -m src.ml.facecrop.trainer \$args + $venv_path -m src.ml.facecrop.trainer $args + return case verify - $venv_path -m src.ml.facecrop.verifier \$args + $venv_path -m src.ml.facecrop.verifier $args + return + + # --- Performer Database & Metadata Enrichment --- case search-performer - $venv_path -m src.performers.search \$args - case help '*' - echo 'Goondex CLI Commands:' - echo ' goondex import - Import a gallery' - echo ' goondex trainer - Batch verify cropped faces' - echo ' goondex verify [tags] - Verify a single face' - echo ' goondex search-performer - Search performer database' + $venv_path -m src.performers.search $args + return + case tpdb-enrich + $venv_path -m src.performers.tpdb_bridge $args + return + + # --- Version shortcut --- + case -v --version version + echo "Goondex v0.3.4 — Leak Technologies" + return + + # --- Fallback for unknown commands --- case '*' - echo 'Unknown command. Use: goondex help' + echo "[!] Unknown command: $cmd" + echo "Use 'goondex --help' for full command list." + return end end -" - -# ------------------------------------------------------------ -# Inject function into config if not already present -# ------------------------------------------------------------ -if not grep -q "function goondex" $config_file - echo $function_block >> $config_file - echo "[+] Added goondex function to $config_file" -else - echo "[=] Goondex function already defined in $config_file" -end - -# ------------------------------------------------------------ -# Apply immediately -# ------------------------------------------------------------ -echo "Reloading Fish config..." -source $config_file - -echo "✅ Setup complete. Try: goondex help" diff --git a/src/utils/setup_fish_goondex.fish b/src/utils/setup_fish_goondex.fish index 6ea8fe2..8f3194f 100644 --- a/src/utils/setup_fish_goondex.fish +++ b/src/utils/setup_fish_goondex.fish @@ -1,11 +1,13 @@ #!/usr/bin/env fish # ============================================================ -# Goondex CLI Fish Setup Script -# Leak Technologies — v0.3.5 (2025-10-07) -# ============================================================ -# Ensures the Goondex CLI is properly installed, removes old -# aliases, installs the canonical function, reloads Fish, -# and verifies environment consistency. +# File: src/utils/setup_fish_goondex.fish +# Version: v0.3.5-r2 +# ------------------------------------------------------------ +# Goondex CLI Fish Setup Utility +# ------------------------------------------------------------ +# Ensures the Goondex CLI is installed, removes old aliases, +# installs canonical functions, reloads Fish, and guarantees +# alias persistence for 'goondex' and 'gx'. # ============================================================ set project_root /home/stu/Projects/PD/Goondex @@ -22,7 +24,7 @@ if not test -d $fish_func_dir end # ------------------------------------------------------------ -# 2. Remove legacy aliases or duplicate definitions +# 2. Clean up any legacy aliases or function definitions # ------------------------------------------------------------ echo "[*] Cleaning up old Goondex aliases and inline definitions..." functions -e goondex 2>/dev/null @@ -32,25 +34,17 @@ if test -f ~/.config/fish/config.fish set tmpfile (mktemp) grep -vE 'alias[[:space:]]+goondex|alias[[:space:]]+gx|function[[:space:]]+goondex' ~/.config/fish/config.fish > $tmpfile mv $tmpfile ~/.config/fish/config.fish - echo "[+] Removed any old inline goondex/gx definitions from config.fish" + echo "[+] Removed old inline goondex/gx definitions from config.fish" end # ------------------------------------------------------------ -# 3. Install canonical Goondex function +# 3. Install canonical goondex.fish function # ------------------------------------------------------------ echo "[*] Installing canonical goondex.fish function..." begin echo '#!/usr/bin/env fish' - echo '# ============================================================' echo '# Goondex CLI — Unified Function (Fish)' - echo '# ============================================================' - echo '# Supports:' - echo '# Importer / Tagging: goondex import, refresh-all, etc.' - echo '# ML Facecrop Tools: goondex trainer, goondex verify' - echo '# Performer Database: goondex search-performer, tpdb-enrich' - echo '# ============================================================' - echo '' echo 'function goondex' echo ' set cmd $argv[1]' echo ' set args $argv[2..-1]' @@ -90,21 +84,21 @@ begin echo ' echo " add-multi \"A,B\" Add multiple tags at once"' echo ' echo " show-metadata Show metadata.json contents"' echo ' echo " source set Set gallery source"' - echo ' echo ""' + echo '' echo ' echo "Machine Learning (Face Recognition):"' echo ' echo " trainer Train face embeddings from ML/faces_cache/"' echo ' echo " verify [tags] Verify performer face image similarity"' - echo ' echo ""' + echo '' echo ' echo "Performers & Metadata:"' echo ' echo " search-performer Search local performer records"' echo ' echo " tpdb-enrich Sync or mirror metadata from ThePornDB"' - echo ' echo ""' + echo '' echo ' echo "Utilities:"' echo ' echo " --help / -h / help Show this help menu"' echo ' echo " --version / -v / version Show current Goondex version"' echo ' echo ""' echo ' echo "────────────────────────────────────────────"' - echo ' echo "Goondex $goondex_version — Leak Technologies (2025)"' + echo ' echo "Goondex $goondex_version (Fish CLI)"' echo ' echo ""' echo ' return' echo '' @@ -127,7 +121,7 @@ begin echo ' return' echo '' echo ' case -v --version version' - echo ' echo "Goondex $goondex_version — Leak Technologies"' + echo ' echo "Goondex $goondex_version"' echo ' return' echo '' echo ' case "*"' @@ -142,18 +136,20 @@ chmod +x $goondex_func echo "[+] Installed goondex.fish function at: $goondex_func" # ------------------------------------------------------------ -# 4. Add alias gx as persistent function +# 4. Create and persist gx alias function (bulletproof) # ------------------------------------------------------------ +echo "[*] Ensuring gx alias function exists..." if not functions -q gx + echo "[+] Creating gx alias function..." begin echo 'function gx --wraps=goondex --description "alias gx goondex"' echo ' goondex $argv' echo 'end' end > $gx_func funcsave gx 2>/dev/null - echo "[+] Added gx.fish persistent alias function" + echo "[+] Saved gx function persistently → $gx_func" else - echo "[=] gx function already exists" + echo "[=] gx function already exists — skipping" end # ------------------------------------------------------------ @@ -167,11 +163,11 @@ else end # ------------------------------------------------------------ -# 6. Reload and verify +# 6. Reload environment & self-test # ------------------------------------------------------------ echo "[*] Reloading Fish environment..." -source $goondex_func source ~/.config/fish/config.fish +source $goondex_func echo "" echo "[✓] Verifying Goondex CLI setup..." @@ -184,11 +180,16 @@ end if functions -q gx echo "✅ Alias function 'gx' active." else - echo "❌ gx function missing." + echo "❌ gx function missing — restoring definition." + function gx --wraps=goondex --description "alias gx goondex" + goondex $argv + end + funcsave gx end echo "" -echo "🔍 Preview:" -goondex --help | head -n 15 +echo "🔍 Post-install test:" +gx --version +gx --help | head -n 10 echo "" -echo "[✔] Setup complete — Goondex CLI now stable across versions." +echo "[✔] Setup complete — Goondex CLI verified and persistent."