{"id":50474116,"url":"https://github.com/shnwazdeveloper/xvideo","last_synced_at":"2026-06-01T12:02:25.389Z","repository":{"id":359019575,"uuid":"1244151803","full_name":"shnwazdeveloper/xvideo","owner":"shnwazdeveloper","description":"Cloud XVideo website and API browser","archived":false,"fork":false,"pushed_at":"2026-05-20T02:32:51.000Z","size":370,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-20T05:57:17.937Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/shnwazdeveloper.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-20T02:27:52.000Z","updated_at":"2026-05-20T02:48:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/shnwazdeveloper/xvideo","commit_stats":null,"previous_names":["shnwazdeveloper/cloud-xvideo"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/shnwazdeveloper/xvideo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shnwazdeveloper%2Fxvideo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shnwazdeveloper%2Fxvideo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shnwazdeveloper%2Fxvideo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shnwazdeveloper%2Fxvideo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shnwazdeveloper","download_url":"https://codeload.github.com/shnwazdeveloper/xvideo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shnwazdeveloper%2Fxvideo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33773782,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-01T02:00:06.963Z","response_time":115,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-01T12:02:24.514Z","updated_at":"2026-06-01T12:02:25.378Z","avatar_url":"https://github.com/shnwazdeveloper.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Lyra Pron\n\nA website and [Node.js](https://nodejs.org) API wrapper for browsing, searching, previewing, and playing videos through the configured API.\n\n## Installation\n\n```bash\n$ npm install xvideos.js\n$ pnpm install xvideos.js\n$ yarn add xvideos.js\n```\n\n## Usage\n\n```javascript\nimport { XVideos } from \"xvideos.js\";\nconst xvideos = new XVideos();\n//-- Inside an async function --//\n\n// Retrieve fresh videos from the first page\nconst fresh = await xvideos.fresh(1);\n// Log details of the retrieved videos\nconsole.log(fresh.videos); // Array of video objects with properties like url, path, title, duration, profile, views\nconsole.log(fresh.pagination.page); // Current page number\nconsole.log(fresh.pagination.pages); // Array of available page numbers\nconsole.log(fresh.hasNext()); // Check if there is a next page\nconsole.log(fresh.hasPrevious()); // Check if there is a previous page\n\n// Retrieve detailed information about a specific video\nconst detail = await xvideos.details(fresh.videos[0].url);\n// Log details of the specific video\nconsole.log(detail); // Detailed video object with properties like title, duration, image, videoType, views, files\n```\n\n## HTTP API Server\n\nThis fork also exposes the wrapper as a JSON HTTP API.\n\n```bash\nnpm install\nnpm run build\nnpm start\n```\n\nBy default the server listens on `http://localhost:3000`. You can change it\nwith `PORT` and `HOST`.\n\n### Routes\n\n```bash\nGET /health\nGET /fresh?page=1\nGET /search?q=keyword\u0026page=1\u0026sort=relevance\u0026datef=all\u0026durf=allduration\u0026quality=all\u0026premium=false\nGET /verified?type=women\u0026page=1\nGET /details?url=https://www.xvideos.com/video...\nGET /thumbai?format=json\u0026url=\u003cencoded-video-url\u003e\u0026type=auto\n```\n\nExamples:\n\n```bash\ncurl \"http://localhost:3000/fresh?page=1\"\ncurl \"http://localhost:3000/search?q=example\u0026page=1\u0026quality=hd\"\ncurl \"http://localhost:3000/verified?type=women\u0026page=1\"\ncurl \"http://localhost:3000/thumbai?format=json\u0026type=auto\u0026url=\u003cencoded-video-url\u003e\"\n```\n\nAll successful responses use:\n\n```json\n{\n  \"success\": true,\n  \"data\": {}\n}\n```\n\nDownload endpoints are available but disabled by default:\n\n```bash\nENABLE_DOWNLOADS=true npm start\n```\n\n```bash\nGET /download/high?url=https://www.xvideos.com/video...\u0026filename=video.mp4\nGET /download/low?url=https://www.xvideos.com/video...\u0026filename=video.mp4\nGET /download/image?url=https://www.xvideos.com/video...\u0026filename=thumbnail.jpg\n```\n\n### Cloudflare Worker\n\nThis project also includes a Worker-safe API entry at `src/worker.js`. It uses\nCloudflare `fetch` and `HTMLRewriter`, so it does not need the Node HTTP server\nor Puppeteer at the edge.\n\n```bash\nnpm run dev:cloudflare\nnpm run deploy:cloudflare\n```\n\nFor non-interactive deploys, set `CLOUDFLARE_API_TOKEN` before running\n`npm run deploy:cloudflare`.\n\nThe Worker supports `/health`, `/fresh`, `/search`, `/premium`, `/verified`,\n`/details`, `/thumbai`, and redirect-based download endpoints.\n\n```bash\nGET /fresh?page=1\nGET /search?q=keyword\u0026page=1\nGET /premium?page=1\nGET /verified?type=women\u0026page=1\nGET /thumbai?format=json\u0026url=\u003cencoded-video-url\u003e\u0026type=auto\nGET /thumbnail?format=json\u0026url=\u003cencoded-video-url\u003e\u0026type=auto\nGET /download?url=https://www.xvideos.com/video...\u0026quality=high\nGET /download/high?url=https://www.xvideos.com/video...\nGET /download/low?url=https://www.xvideos.com/video...\nGET /download/hls?url=https://www.xvideos.com/video...\n```\n\nDownload routes redirect to the resolved media URL by default. Use\n`format=json` to receive the media URL in JSON, or `proxy=true` to stream the\nfile through the Worker.\n\nThumbnail routes redirect to the resolved image by default. Use `format=json`\nto receive all known thumbnail URLs in JSON, or `proxy=true` to stream the image\nthrough the Worker.\n\n## API\n\n### Retrieve [Fresh Videos](https://www.xvideos.com/)\n\n```javascript\n// Retrieve fresh videos from the first page\nconst freshList = await xvideos.fresh(1);\n\n// Check if there is a next page of results\nconsole.log(freshList.hasNext()); // Outputs: true or false\n\n// Check if there is a previous page of results\nconsole.log(freshList.hasPrevious()); // Outputs: true or false\n\n// Retrieve the next page of fresh videos if available\nconst nextVideos = await freshList.next();\n\n// Retrieve the previous page of fresh videos if available\nconst previousVideos = await freshList.previous();\n```\n\n### Retrieve [Verified Videos](https://www.xvideos.com/verified/videos)\n\n```javascript\n// Retrieve verified videos from the first page\nconst verifiedList = await xvideos.getVerified(\"women\", 1); // Argument 'type' can be either \"women\", \"men\", \"gay\", or \"trans\"\n\n// Check if there is a next page of results\nconsole.log(verifiedList.hasNext()); // Outputs: true or false\n\n// Check if there is a previous page of results\nconsole.log(verifiedList.hasPrevious()); // Outputs: true or false\n\n// Refresh the current page of results to get updated data\nconst refreshedVideos = await verifiedList.refresh();\n\n// Retrieve the next page of verified videos if available\nconst nextVideos = await verifiedList.next();\n\n// Retrieve the previous page of verified videos if available\nconst previousVideos = await verifiedList.previous();\n```\n\n### Retrieve [Video Details](https://www.xvideos.com/video.udefpih987f/mi_madrastra_perdio_apuesta_en_final_argentina_vs_colombia_y_me_lo_chupa)\n\n```javascript\n// Retrieve detailed information about a specific video using its URL\nconst details = await xvideos.details(\n  \"https://www.xvideos.com/video.udefpih987f/mi_madrastra_perdio_apuesta_en_final_argentina_vs_colombia_y_me_lo_chupa\",\n);\n\n// Log detailed information about the video\nconsole.log(details); // Detailed video object with properties like title, duration, image, videoType, views, files\n```\n\n### Download [Video Details](https://www.xvideos.com/video.udefpih987f/mi_madrastra_perdio_apuesta_en_final_argentina_vs_colombia_y_me_lo_chupa)\n\n```javascript\n// Download video thumbnail from a specific video using its URL\nconst image = await xvideos.downloadImage(\n  \"https://www.xvideos.com/video.udefpih987f/mi_madrastra_perdio_apuesta_en_final_argentina_vs_colombia_y_me_lo_chupa\",\n);\n// Download video in high quality from a specific video using its URL\nconst high = await xvideos.downloadHigh(\n  \"https://www.xvideos.com/video.udefpih987f/mi_madrastra_perdio_apuesta_en_final_argentina_vs_colombia_y_me_lo_chupa\",\n);\n// Download video in low quality from a specific video using its URL\nconst low = await xvideos.downloadLow(\n  \"https://www.xvideos.com/video.udefpih987f/mi_madrastra_perdio_apuesta_en_final_argentina_vs_colombia_y_me_lo_chupa\",\n);\n\nconsole.log(image, high, low); // path to downloaded image and videos\n```\n\n### Filter [Videos](https://www.xvideos.com/?k=threesome)\n\n```javascript\n// Search for videos using a keyword, and optionally specify a page number\nconst videos = await xvideos.search(\"threesome\", 5);\n// Example with a specific page number\n// const videos = await xvideos.videos.search({ k: 'public', page: 5 });\n\n// Check if there is a next page of results\nconsole.log(videos.hasNext()); // Outputs: true or false\n\n// Check if there is a previous page of results\nconsole.log(videos.hasPrevious()); // Outputs: true or false\n\n// Retrieve the next page of videos if available\nconst nextVideos = await videos.next();\n\n// Retrieve the previous page of videos if available\nconst previousVideos = await videos.previous();\n\n// Search for videos with specific parameters\nconst videos = await xvideos.search(\"threesome\", 5, {\n  sort: \"rating\",\n  datef: \"week\",\n  durf: \"3-10min\",\n  quality: \"hd\",\n});\n\n// Log the search results\nconsole.log(videos); // Array of video objects with properties based on the search parameters\n```\n\n#### Params explanation\n\n| Parameter | Default         | Options                                                                                |\n| --------- | --------------- | -------------------------------------------------------------------------------------- |\n| `sort`    | `\"relevance\"`   | `\"uploaddate\"`, `\"rating\"`, `\"length\"`, `\"views\"`, `\"random\"`                          |\n| `datef`   | `\"all\"`         | `\"today\"`, `\"week\"`, `\"month\"`, `\"3month\"`, `\"6month\"`, `\"all\"`                        |\n| `durf`    | `\"allduration\"` | `\"1-3min\"`, `\"3-10min\"`, `\"10min_more\"`, `\"10-20min\"`, `\"20min_more\"`, `\"allduration\"` |\n| `quality` | `\"all\"`         | `\"hd\"`, `\"1080P\"`, `\"all\"`                                                             |\n| `premium` | `false`         | `true`, `false`                                                                        |\n\n---\n\n### 🐼 @me\n\nYou can find me on twitter as 🐤 \u003ca href=\"https://twitter.com/osinthappyemo\"\u003e@osinthappyemo\u003c/a\u003e\nor on instagram as 🍢 \u003ca href=\"https://instagram.com/osintxv\"\u003e@osintxv\u003c/a\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshnwazdeveloper%2Fxvideo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshnwazdeveloper%2Fxvideo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshnwazdeveloper%2Fxvideo/lists"}