Lustpress
RESTful and experimental API for PornHub and other R18 platforms
Install / Use
/learn @sinkaroid/LustpressREADME
Lustpress stand for Lust and Express, rebuild from Jandapress with completely different approach. The motivation of this project is to bring you an actionable data related to pornhub and other r18 sites with gather, similar design pattern, endpoint bindings, and consistent structure in mind.
<a href="https://sinkaroid.github.io/lustpress">Playground</a> • <a href="https://github.com/sinkaroid/lustpress/blob/master/CONTRIBUTING.md">Contributing</a> • <a href="https://github.com/sinkaroid/lustpress/issues/new/choose">Report Issues</a>
</div><a href="http://localhost:3000/"><img align="right" src="resources/project/images/bnnuy.png" width="320"></a>
The problem
Many developers consume r18 websites as a source of data when building web applications. However, most of these sites — such as pornhub, redtube, and others — do not provide official APIs or public resources that can be easily integrated into applications.
As a result, developers often need to implement their own scraping logic, build multiple abstractions, and manually maintain integrations for each site.
Lustpress aims to simplify this process by providing a unified interface for accessing data across multiple r18 sites. Instead of maintaining separate implementations, developers can rely on Lustpress to reduce complexity and development overhead.
The current state of the service is free to use, meaning anonymous usage is allowed. No authentication is required, and CORS is enabled to support browser-based applications.
The solution
Don't make it long, make it short. All processed through single rest endpoint bindings <a href="https://sinkaroid.github.io/lustpress"><img src="resources/project/images/coverage.png" width="800"></a>
Features
- Aggregates data from multiple sites.
- Provides a consistent and structured response format across all sources.
- Extracted objects are normalized and reassembled to support extensibility.
- Unified interface supporting get, search, and random methods.
- Planned support for optional JWT authentication in future releases.
- Primarily based on pure scraping techniques (with limited exceptions where required).
Running tests
Some tests may fail in CI environments because certain websites restrict or block automated requests originating from CI infrastructure and shared IP ranges, but trying to keep up
| Site | Status | Get | Search | Random | Related |
| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --- | ------ | ------ | ------- |
| pornhub | |
Yes | Yes | Yes | Yes |
| xnxx | |
Yes | Yes | Yes | Yes |
| redtube | |
Yes | Yes | Yes | Yes |
| xvideos | |
Yes | Yes | Yes | Yes |
| xhamster | |
Yes | Yes | Yes | Yes |
| youporn | |
Yes | Yes | Yes | Yes |
| eporner | |
Yes | Yes | Yes | Yes |
| txxx | |
Yes | Yes | Yes | Yes |
Prerequisites
<table> <td><b>NOTE:</b> NodeJS 22.x or higher</td> </table>To handle several requests from each website, You will also need Redis for persistent caching, free tier is available on Redis Labs, You can also choose another adapters as we using keyv Key-value storage with support for multiple backends. When you choosing your own adapter, all data must be stored with <Buffer> type.
Installation
Rename .env.schema to .env and fill the value with your own
# railway, fly.dev, heroku, vercel or any free service
RAILWAY = sinkaroid
# default port
PORT = 3000
# backend storage, default is redis, if not set it will consume memory storage
REDIS_URL = redis://default:somenicepassword@redis-666.c10.us-east-6-6.ec666.cloud.redislabs.com:1337
# ttl expire cache (in X hour)
EXPIRE_CACHE = 1
# you must identify your origin, if not set it will use default
USER_AGENT = "lustpress/8.0.1 Node.js/22.22.0"
Docker
docker pull ghcr.io/sinkaroid/lustpress:latest
docker run -p 3000:3000 -d ghcr.io/sinkaroid/lustpress:latest
Docker (adjust your own)
docker run -d \
--name=lustpress \
-p 3028:3000 \
-e REDIS_URL='redis://default:somenicepassword@redis-666.c10.us-east-6-6.ec666.cloud.redislabs.com:1337' \
-e EXPIRE_CACHE='1' \
-e USER_AGENT='lustpress/8.0.1 Node.js/22.22.0' \
ghcr.io/sinkaroid/lustpress:latest
Manual
git clone https://github.com/sinkaroid/lustpress.git
- Install dependencies
npm install / yarn install
- Lustpress production
npm run start:prod
- Lustpress testing and hot reload
npm run start:dev
Tests
Run the following commands to execute tests for each supported source:
# Check whether all supported sites are available for scraping
npm run test
# Check whether ph and (maybe the others do..) do Solving challenge in their website
npm run test:mock
# Run tests for individual sources
npm run test:pornhub
npm run test:xnxx
npm run test:redtube
npm run test:xvideos
npm run test:xhamster
npm run test:youporn
npm run test:eporner
npm run test:txxx
Start the production server
npm run start:prod
Running development server
npm run start:dev
Generating playground like swagger from apidoc definition
npm run build:apidoc
To running other tests, you can see object scripts in file
package.jsonor modify thelustpress.test.tsaccording your needs
Playground
https://sinkaroid.github.io/lustpress
-
These
parameter?: means is optional -
/: index page
PornHub
The missing piece of pornhub.com - https://sinkaroid.github.io/lustpress/#api-pornhub
/pornhub: pornhub api- get, takes parameters :
id - search, takes parameters :
key,?page,?sort - related, takes parameters :
id - random
- <u>sort parameters on search</u>
- "mr", "mv", "tr", "lg"
- Example
- http://localhost:3000/pornhub/get?id=ph63c4e1dc48fe7
- http://localhost:3000/pornhub/search?key=milf&page=2&sort=mr
- http://localhost:3000/pornhub/related?id=ph63c4e1dc48fe7
- http://localhost:3000/pornhub/random
- get, takes parameters :
Xnxx
The missing piece of xnxx.com - https://sinkaroid.github.io/lustpress/#api-xnxx
/xnxx: xnxx api- get, takes parameters :
id - search, takes parameters :
key,?page, and TBD - related, takes parameters :
id - random
- <u>sort parameters on search</u>
- TBD
- Example
- http://localhost:3000/xnxx/get?id=video-17vah71a/makima_y_denji
- http://localhost:3000/xnxx/search?key=bbc&page=2
- http://localhost:3000/xnxx/related?id=video-17vah71a/makima_y_denji
- http://localhost:3000/xnxx/random
- get, takes parameters :
Related Skills
qqbot-channel
343.1kQQ 频道管理技能。查询频道列表、子频道、成员、发帖、公告、日程等操作。使用 qqbot_channel_api 工具代理 QQ 开放平台 HTTP 接口,自动处理 Token 鉴权。当用户需要查看频道、管理子频道、查询成员、发布帖子/公告/日程时使用。
docs-writer
99.7k`docs-writer` skill instructions As an expert technical writer and editor for the Gemini CLI project, you produce accurate, clear, and consistent documentation. When asked to write, edit, or revie
model-usage
343.1kUse CodexBar CLI local cost usage to summarize per-model usage for Codex or Claude, including the current (most recent) model or a full model breakdown. Trigger when asked for model-level usage/cost data from codexbar, or when you need a scriptable per-model summary from codexbar cost JSON.
ddd
Guía de Principios DDD para el Proyecto > 📚 Documento Complementario : Este documento define los principios y reglas de DDD. Para ver templates de código, ejemplos detallados y guías paso
