From cf9fff534ca967a1823a38ac11010e180a16e118 Mon Sep 17 00:00:00 2001 From: Johannes Habel Date: Fri, 30 Aug 2024 11:01:07 +0200 Subject: [PATCH] - added support for mode searching #2 - release 1.4.1 --- README/Changelog.md | 5 ++++- README/Documentation.md | 10 +++++++--- xnxx_api/modules/search_filters.py | 5 +++++ xnxx_api/xnxx_api.py | 17 +++++++++++------ 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/README/Changelog.md b/README/Changelog.md index 7695054..083cd8c 100644 --- a/README/Changelog.md +++ b/README/Changelog.md @@ -16,4 +16,7 @@ - updated documentation # 1.4 -- fixed an issue with video loading \ No newline at end of file +- fixed an issue with video loading + +# 1.4.1 +- added support for mode searching #2 \ No newline at end of file diff --git a/README/Documentation.md b/README/Documentation.md index 6f81149..8a4e758 100644 --- a/README/Documentation.md +++ b/README/Documentation.md @@ -1,6 +1,8 @@ +from re import search + # XNXX API Documentation -> - Version 1.4 +> - Version 1.4.1 > - Author: Johannes Habel > - Copyright (C) 2024 > - License: LGPLv3 @@ -127,7 +129,7 @@ from xnxx_api import search_filters client = Client() search = client.search("", upload_time=search_filters.UploadTime.month, length=search_filters.Length.X_0_10min, - searching_quality=search_filters.SearchingQuality.X_720p) + searching_quality=search_filters.SearchingQuality.X_720p, mode=search_filters.Mode.default) # this is an example for video in search.videos: @@ -185,6 +187,7 @@ Currently, there are three filters available: - Searching Quality - Upload Time - Length +- Mode They are located in: @@ -193,7 +196,8 @@ from xnxx_api import search_filters from xnxx_api.xnxx_api import Client # Use them like this: -search = Client().search("", length=search_filters.Length.X_0_10min, upload_time=search_filters.UploadTime.year, searching_quality=search_filters.SearchingQuality.X_1080p_plus) +search = Client().search("", length=search_filters.Length.X_0_10min, upload_time=search_filters.UploadTime.year, + searching_quality=search_filters.SearchingQuality.X_1080p_plus, mode=search_filters.Mode.default) videos = search.videos # I think the names explain what it does :) ``` \ No newline at end of file diff --git a/xnxx_api/modules/search_filters.py b/xnxx_api/modules/search_filters.py index 88cf522..3a01001 100644 --- a/xnxx_api/modules/search_filters.py +++ b/xnxx_api/modules/search_filters.py @@ -13,3 +13,8 @@ class UploadTime: class SearchingQuality: X_720p = "/hd-only" X_1080p_plus = "/fullhd" + +class Mode: + default = "" + hits = "/hits" + random = "/random" diff --git a/xnxx_api/xnxx_api.py b/xnxx_api/xnxx_api.py index 699c8e2..87a79ca 100644 --- a/xnxx_api/xnxx_api.py +++ b/xnxx_api/xnxx_api.py @@ -165,11 +165,14 @@ def content_url(self) -> str: class Search: - def __init__(self, query: str, upload_time: UploadTime, length: Length, searching_quality: SearchingQuality): + def __init__(self, query: str, upload_time: UploadTime, length: Length, searching_quality: SearchingQuality, + mode: Mode): + self.query = self.validate_query(query) self.upload_time = upload_time self.length = length self.searching_quality = searching_quality + self.mode = mode @classmethod def validate_query(cls, query): @@ -178,7 +181,7 @@ def validate_query(cls, query): @cached_property def html_content(self): # Now this is going to be weird, just don't ask - return Core().get_content(f"https://www.xnxx.com/search{self.upload_time}{self.length}{self.searching_quality}/{self.query}", headers=HEADERS).decode("utf-8") + return Core().get_content(f"https://www.xnxx.com/search{self.mode}{self.upload_time}{self.length}{self.searching_quality}/{self.query}", headers=HEADERS).decode("utf-8") @cached_property def total_pages(self): @@ -190,10 +193,10 @@ def videos(self): while True: if page == 0: - url = f"https://www.xnxx.com/search{self.upload_time}{self.length}{self.searching_quality}/{self.query}" + url = f"https://www.xnxx.com/search{self.mode}{self.upload_time}{self.length}{self.searching_quality}/{self.query}" else: - url = f"https://www.xnxx.com/search{self.upload_time}{self.length}{self.searching_quality}/{self.query}/{page}" + url = f"https://www.xnxx.com/search{self.mode}{self.upload_time}{self.length}{self.searching_quality}/{self.query}/{page}" content = Core().get_content(url, headers=HEADERS).decode("utf-8") urls = REGEX_SCRAPE_VIDEOS.findall(content) @@ -255,15 +258,17 @@ def get_video(cls, url): return Video(url) @classmethod - def search(cls, query, upload_time: UploadTime = "", length: Length = "", searching_quality: SearchingQuality = ""): + def search(cls, query, upload_time: UploadTime = "", length: Length = "", searching_quality: SearchingQuality = "", + mode: Mode = ""): """ :param query: :param upload_time: :param length: :param searching_quality: + :param mode: :return: (Search) the search object """ - return Search(query, upload_time, length, searching_quality) + return Search(query, upload_time, length, searching_quality, mode) @classmethod def get_user(cls, url):