Repository navigation
Releases
xHamster 2.6.5
xHamster 2.6.5
This release fixes problems found while testing public video, listing and download workflows.
- Restore shorts and moments extraction from current page data and DOM layouts.
- Keep profile shorts on the correct listing route and preserve regional URL hosts.
- Read listing metadata from hydrated page data so later cards retain thumbnails and durations.
- Avoid incompatible quality filters for VR search and recognize Full HD and UHD videos correctly.
- Handle missing short metadata safely and add compatible user, video and shorts aliases.
- Route shorts and moments through the CLI.
The package now uses eaf-base-api>=4.2.5 from PyPI. No local source checkout is required.
unofficial-api-for-xhamster 2.6.3
Release 2.6.3 fixes provider URL handling and pagination.
Changes:
- Preserve profile tabs and filters during pagination, replacing an existing numeric page suffix.
- Use the resolved localized host for listing requests and relative video links.
- Replace account playlist page query keys without duplication.
- Require
eaf-base-api>=4.2.2for shared URL composition and resolved-response metadata. - Add focused offline URL regression tests; verify the repaired behavior with bounded live metadata/listing checks.
Install from PyPI:
uv pip install unofficial-api-for-xhamster==2.6.3Source commit: d3210cc
2.6.2
Changelog
- Fixed an issue where invalid login credentials would report a successful login
2.6.1
What's Changed
Improvements & Resilience
- Layout Anchor Validations: Added structural anchor checks to detect upstream markup shifts.
- Metadata Fallbacks: Resilient fallback selectors for video and pornstar metadata.
- Stream URL Resolution: Enhanced stream URL parsing and error reporting.
- Unit Tests: Added snippet-based unit tests for video and pornstar extraction.
Core Engine Upgrade
- Bumped dependency to
eaf-base-api>=4.2.0. - Adopted
fetch_contentand@download_errors. - Download failures now raise
DownloadFailed; cancellation raisesDownloadCancelled.
2.6
Changelog
- Added a lot of new video attributes. See docs :)
2.5
Changelog
2.4
Changelog
I am too lazy to write a dedicated changelog for all my APIs now, so here's a summary
-
Raised Python version to 3.12 (because I use Python 3.12 specific async logic + type hints)
-
Improved memory usage by 99%
-
Dataclass models for all objects with slots
-
Added new exceptions that actually work now
-
Improved parsing speed for video iterators a lot because we can actually just scrape the data from the page directly and fill it into the video object. Just read the docs lol
-
I have added an option to the iterators, so you can actually say if the videos should be in the correct order or not which has an influence on scraping speed
-
You can now pass custom on_error functions into the iterators and handle video re-trying yourself
Oh yeah..
Switched to AGPL
Does this break my existing code?
Yes.
2.2
2.1
Version 2.0
Changelog
Switching to Async
Warning
This release absolutely breaks your existing code. Read the documentation (once I updated it)
- Added more stuff to the
Shortclass - Replaced httpx with curl_cffi for HTTP requests, enabling browser impersonation ( chrome ) to bypass
bot protections - Converted all network methods to async/await ( fetch , download , legacy_download , get_segments ,
get_m3u8_by_quality , list_available_qualities , download_segment ) - Converted Helper.iterator from a synchronous ThreadPoolExecutor -based generator to an async generator
using asyncio.Task - Replaced ThreadPoolExecutor in the HLS segment downloader with asyncio.Semaphore + asyncio.
as_completed - Added async_generator_to_sync bridge utility for synchronous iteration
- Added fast concurrent multipart range downloading to legacy_download ( allow_multipart=True by default)
- Added ios_support parameter to download for stricter audio codec filtering during remux
- Fixed progress bars to handle unknown/zero total sizes gracefully instead of dividing by zero
- Fixed multipart downloads failing on compressed streams by requesting Accept-Encoding: identity for range
requests - Changed remux progress tracking from packet count to byte-based for more accurate reporting