{"id":15044087,"url":"https://github.com/vasysik/yt-dlp-host","last_synced_at":"2025-10-24T01:30:25.135Z","repository":{"id":254750942,"uuid":"847435874","full_name":"Vasysik/yt-dlp-host","owner":"Vasysik","description":"Simple dockerized API to work with yt-dlp from your server anywhere","archived":false,"fork":false,"pushed_at":"2024-09-28T15:20:02.000Z","size":47,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-10-10T00:43:35.489Z","etag":null,"topics":["api","docker","docker-compose","python","server","web-api","youtube","youtube-downloader","yt-dlp","yt-dlp-api","yt-dlp-host","yt-dlp-server"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Vasysik.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2024-08-25T20:13:40.000Z","updated_at":"2024-09-23T21:55:46.000Z","dependencies_parsed_at":"2024-08-25T21:55:40.982Z","dependency_job_id":"a31f5596-5503-4dee-ab87-c823f53578bd","html_url":"https://github.com/Vasysik/yt-dlp-host","commit_stats":null,"previous_names":["vasysik/yt-dlp-host"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Vasysik%2Fyt-dlp-host","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Vasysik%2Fyt-dlp-host/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Vasysik%2Fyt-dlp-host/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Vasysik%2Fyt-dlp-host/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Vasysik","download_url":"https://codeload.github.com/Vasysik/yt-dlp-host/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":219867314,"owners_count":16555821,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["api","docker","docker-compose","python","server","web-api","youtube","youtube-downloader","yt-dlp","yt-dlp-api","yt-dlp-host","yt-dlp-server"],"created_at":"2024-09-24T20:50:03.613Z","updated_at":"2025-10-24T01:30:25.130Z","avatar_url":"https://github.com/Vasysik.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# YouTube Downloader API\n\n## Overview\n\nThis API offers a range of endpoints for downloading YouTube videos, retrieving video information, and managing API keys. It is designed to be user-friendly while providing robust functionality for video processing and information retrieval. The API leverages yt-dlp to handle video downloads and information retrieval efficiently on a dedicated host.\n\n## Table of Contents\n\n1. [Running the Server](#running-the-server)\n2. [Configuration](#configuration)\n3. [Authentication](#authentication)\n4. [Rate Limiting](#rate-limiting)\n5. [Endpoints](#endpoints)\n   - [Get Video (`/get_video`)](#get-video-get_video)\n   - [Get Audio (`/get_audio`)](#get-audio-get_audio)\n   - [Get Live Video (`/get_live_video`)](#get-live-video-get_live_video)\n   - [Get Live Audio (`/get_live_audio`)](#get-live-audio-get_live_audio)\n   - [Get Info (`/get_info`)](#get-info-get_info)\n   - [Create API Key (`/create_key`)](#create-api-key-create_key)\n   - [Delete API Key (`/delete_key/\u003cname\u003e`)](#delete-api-key-delete_keyname)\n   - [List API Keys (`/get_keys`)](#list-api-keys-get_keys)\n   - [Get API Key (`/get_key/\u003cname\u003e`)](#get-api-key-get_keyname)\n   - [Get Task Status (`/status/\u003ctask_id\u003e`)](#get-task-status-statustask_id)\n   - [Get File (`/files/\u003cpath:filename\u003e`)](#get-file-filespathfilename)\n6. [Error Handling](#error-handling)\n7. [Examples](#examples)\n\n## Running the Server\n\nTo run the server, follow these steps:\n\n1. Clone the repository:\n   ```\n   git clone https://github.com/Vasysik/yt-dlp-host.git\n   cd yt-dlp-host\n   ```\n\n2. Build and run the Docker container:\n   ```\n   docker-compose up --build\n   ```\n\n3. The server will be accessible at `http://localhost:5000`.\n\n## Configuration\n\nThe server's configuration is defined in the `config.py` file. Here are the default values:\n\n- `DOWNLOAD_DIR`: The directory where downloaded files will be stored. Default is `'/app/downloads'`.\n- `TASKS_FILE`: The path to the JSON file that stores task information. Default is `'jsons/tasks.json'`.\n- `KEYS_FILE`: The path to the JSON file that stores API keys and their permissions. Default is `'jsons/api_keys.json'`.\n- `CLEANUP_TIME_MINUTES`: The time (in minutes) after which completed tasks will be removed. Default is `10`.\n- `REQUEST_LIMIT`: The maximum number of requests allowed within the `CLEANUP_TIME_MINUTES` period. Default is `60`.\n- `MAX_WORKERS`: The maximum number of concurrent workers for processing tasks. Default is `4`.\n- `DEFAULT_QUOTA_GB`: Default memory quota for new API keys in GB. Default is `5`.\n- `QUOTA_RATE_MINUTES`: Time window for quota calculation in minutes. Default is `10`.\n- `AVAILABLE_BYTES`: Total available memory for all users in bytes. Default is `20GB`.\n\n## Authentication\n\nAll requests to the API must include an API key in the `X-API-Key` header. To obtain an API key, contact the API administrator or use the `/create_key` endpoint if you have create_key permissions.\n\n## Rate Limiting\n\nThe API implements rate limiting to prevent abuse. Each API key is limited to `60` requests within a `10` minute window. Additionally, memory quotas are enforced to prevent excessive storage usage.\n\n## Endpoints\n\n### Get Video (`/get_video`)\n\nInitiates a video download task from the specified URL.\n\n- **Method:** POST\n- **URL:** `/get_video`\n- **Headers:**\n  - `X-API-Key`: Your API key\n  - `Content-Type`: application/json\n- **Body:**\n  ```json\n  {\n      \"url\": \"https://youtu.be/1FPdtR_5KFo\",\n      \"video_format\": \"bestvideo[height\u003c=1080]\",\n      \"audio_format\": \"bestaudio[abr\u003c=129]\",\n      \"output_format\": \"mp4\",\n      \"start_time\": \"00:00:30\",\n      \"end_time\": \"00:01:00\",\n      \"force_keyframes\": false\n  }\n  ```\n- **Parameters:**\n  - `url` (required): The URL of the video to be downloaded.\n  - `video_format` (optional): The [format](https://github.com/yt-dlp/yt-dlp?tab=readme-ov-file#format-selection) of the video. Default is \"bestvideo\".\n  - `audio_format` (optional): The [format](https://github.com/yt-dlp/yt-dlp?tab=readme-ov-file#format-selection) of the audio. Default is \"bestaudio\". To download video without audio, set this to `null` or `none`.\n  - `output_format` (optional): The output container format (mp4, mkv, webm, etc.). Default is \"mp4\".\n  - `start_time` (optional): Starting point for video fragment in HH:MM:SS format or seconds as number.\n  - `end_time` (optional): Ending point for video fragment in HH:MM:SS format or seconds as number.\n  - `force_keyframes` (optional): If true, ensures precise cutting but slower processing. If false, faster but less precise cutting. Default is false.\n- **Permissions:** Requires the `get_video` permission.\n- **Response:**\n  ```json\n  {\n      \"status\": \"waiting\",\n      \"task_id\": \"abcdefgh12345678\"\n  }\n  ```\n\n### Get Audio (`/get_audio`)\n\nInitiates an audio download task from the specified URL.\n\n- **Method:** POST\n- **URL:** `/get_audio`\n- **Headers:**\n  - `X-API-Key`: Your API key\n  - `Content-Type`: application/json\n- **Body:**\n  ```json\n  {\n      \"url\": \"https://youtu.be/1FPdtR_5KFo\",\n      \"audio_format\": \"bestaudio[abr\u003c=129]\",\n      \"output_format\": \"mp3\",\n      \"start_time\": \"00:00:30\",\n      \"end_time\": \"00:01:00\",\n      \"force_keyframes\": false\n  }\n  ```\n- **Parameters:**\n  - `url` (required): The URL of the audio to be downloaded.\n  - `audio_format` (optional): The [format](https://github.com/yt-dlp/yt-dlp?tab=readme-ov-file#format-selection) of the audio. Default is \"bestaudio\".\n  - `output_format` (optional): The output audio format (mp3, m4a, opus, etc.). Default is original format.\n  - `start_time` (optional): Starting point for audio fragment in HH:MM:SS format or seconds as number.\n  - `end_time` (optional): Ending point for audio fragment in HH:MM:SS format or seconds as number.\n  - `force_keyframes` (optional): If true, ensures precise cutting but slower processing. If false, faster but less precise cutting. Default is false.\n- **Permissions:** Requires the `get_audio` permission.\n- **Response:**\n  ```json\n  {\n      \"status\": \"waiting\",\n      \"task_id\": \"abcdefgh12345678\"\n  }\n  ```\n\n### Get Live Video (`/get_live_video`)\n\nInitiates a live video download task from the specified URL.\n\n- **Method:** POST\n- **URL:** `/get_live_video`\n- **Headers:**\n  - `X-API-Key`: Your API key\n  - `Content-Type`: application/json\n- **Body:**\n  ```json\n  {\n      \"url\": \"https://youtu.be/1FPdtR_5KFo\",\n      \"start\": 0,\n      \"duration\": 300,\n      \"video_format\": \"bestvideo[height\u003c=1080]\",\n      \"audio_format\": \"bestaudio[abr\u003c=129]\",\n      \"output_format\": \"mp4\"\n  }\n  ```\n- **Parameters:**\n  - `url` (required): The URL of the live stream to be downloaded.\n  - `start` (optional): The starting point in seconds for the stream recording. Default is 0.\n  - `duration` (required): The length of the recording in seconds from the start point.\n  - `video_format` (optional): The [format](https://github.com/yt-dlp/yt-dlp?tab=readme-ov-file#format-selection) of the video. Default is \"bestvideo\".\n  - `audio_format` (optional): The [format](https://github.com/yt-dlp/yt-dlp?tab=readme-ov-file#format-selection) of the audio. Default is \"bestaudio\".\n  - `output_format` (optional): The output container format (mp4, mkv, webm, etc.). Default is \"mp4\".\n- **Permissions:** Requires the `get_live_video` permission.\n- **Response:**\n  ```json\n  {\n      \"status\": \"waiting\",\n      \"task_id\": \"abcdefgh12345678\"\n  }\n  ```\n\n### Get Live Audio (`/get_live_audio`)\n\nInitiates a live audio download task from the specified URL.\n\n- **Method:** POST\n- **URL:** `/get_live_audio`\n- **Headers:**\n  - `X-API-Key`: Your API key\n  - `Content-Type`: application/json\n- **Body:**\n  ```json\n  {\n      \"url\": \"https://youtu.be/1FPdtR_5KFo\",\n      \"audio_format\": \"bestaudio[abr\u003c=129]\",\n      \"output_format\": \"mp3\",\n      \"start\": 0,\n      \"duration\": 300\n  }\n  ```\n- **Parameters:**\n  - `url` (required): The URL of the live stream to be downloaded.\n  - `audio_format` (optional): The [format](https://github.com/yt-dlp/yt-dlp?tab=readme-ov-file#format-selection) of the audio. Default is \"bestaudio\".\n  - `output_format` (optional): The output audio format (mp3, m4a, opus, etc.). Default is original format.\n  - `start` (optional): The starting point in seconds for the stream recording. Default is 0.\n  - `duration` (required): The length of the recording in seconds from the start point.\n- **Permissions:** Requires the `get_live_audio` permission.\n- **Response:**\n  ```json\n  {\n      \"status\": \"waiting\",\n      \"task_id\": \"abcdefgh12345678\"\n  }\n  ```\n\n### Get Info (`/get_info`)\n\nRetrieves information about the video from the specified URL.\n\n- **Method:** POST\n- **URL:** `/get_info`\n- **Headers:**\n  - `X-API-Key`: Your API key\n  - `Content-Type`: application/json\n- **Body:**\n  ```json\n  {\n      \"url\": \"https://youtu.be/1FPdtR_5KFo\"\n  }\n  ```\n- **Parameters:**\n  - `url` (required): The URL of the video to retrieve information about.\n- **Permissions:** Requires the `get_info` permission.\n- **Response:**\n  ```json\n  {\n      \"status\": \"waiting\",\n      \"task_id\": \"ijklmnop87654321\"\n  }\n  ```\n\n### Create API Key (`/create_key`)\n\nCreates a new API key with the specified permissions.\n\n- **Method:** POST\n- **URL:** `/create_key`\n- **Headers:**\n  - `X-API-Key`: Your admin API key\n  - `Content-Type`: application/json\n- **Body:**\n  ```json\n  {\n      \"name\": \"user_key\",\n      \"permissions\": [\"get_video\", \"get_audio\", \"get_live_video\", \"get_live_audio\", \"get_info\"]\n  }\n  ```\n- **Parameters:**\n  - `name` (required): The name for the new API key.\n  - `permissions` (required): A list of permissions for the new API key.\n- **Permissions:** Requires the `create_key` permission.\n- **Response:**\n  ```json\n  {\n      \"message\": \"API key created successfully\",\n      \"key\": \"new_api_key_here\",\n      \"name\": \"user_key\"\n  }\n  ```\n\n### Delete API Key (`/delete_key/\u003cname\u003e`)\n\nDeletes an existing API key by its name.\n\n- **Method:** DELETE\n- **URL:** `/delete_key/\u003cname\u003e`\n- **Headers:**\n  - `X-API-Key`: Your admin API key\n- **Permissions:** Requires the `delete_key` permission.\n- **Response:**\n  ```json\n  {\n      \"name\": \"user_key\", \n      \"message\": \"API key deleted successfully\"\n  }\n  ```\n\n### List API Keys (`/get_keys`)\n\nRetrieves a list of all existing API keys.\n\n- **Method:** GET\n- **URL:** `/get_keys`\n- **Headers:**\n  - `X-API-Key`: Your admin API key\n- **Permissions:** Requires the `get_keys` permission.\n- **Response:**\n  ```json\n  {\n      \"admin\": {\n          \"key\": \"admin_api_key_here\",\n          \"permissions\": [\"create_key\", \"delete_key\", \"get_key\", \"get_keys\", \"get_video\", \"get_audio\", \"get_live_video\", \"get_live_audio\", \"get_info\"],\n          \"memory_quota\": 5368709120,\n          \"memory_usage\": [],\n          \"last_access\": \"2024-01-01T12:00:00\"\n      },\n      \"user_key\": {\n          \"key\": \"user_api_key_here\",\n          \"permissions\": [\"get_video\", \"get_audio\", \"get_live_video\", \"get_live_audio\", \"get_info\"],\n          \"memory_quota\": 5368709120,\n          \"memory_usage\": [],\n          \"last_access\": \"2024-01-01T12:00:00\"\n      }\n  }\n  ```\n\n### Get API Key (`/get_key/\u003cname\u003e`)\n\nGets an existing API key by its name.\n\n- **Method:** GET\n- **URL:** `/get_key/\u003cname\u003e`\n- **Headers:**\n  - `X-API-Key`: Your admin API key\n- **Permissions:** Requires the `get_key` permission.\n- **Response:**\n  ```json\n  {\n      \"name\": \"user_key\", \n      \"key\": \"user_api_key_here\"\n  }\n  ```\n\n### Check Permissions (`/check_permissions`)\n\nChecks if the current API key has the specified permissions.\n\n- **Method:** POST\n- **URL:** `/check_permissions`\n- **Headers:**\n  - `X-API-Key`: Your API key\n  - `Content-Type`: application/json\n- **Body:**\n  ```json\n  {\n      \"permissions\": [\"get_video\", \"get_audio\"]\n  }\n  ```\n- **Response:**\n  - Success (200):\n    ```json\n    {\n        \"message\": \"Permissions granted\"\n    }\n    ```\n  - Insufficient permissions (403):\n    ```json\n    {\n        \"message\": \"Insufficient permissions\"\n    }\n    ```\n\n### Get Task Status (`/status/\u003ctask_id\u003e`)\n\nRetrieves the status of a specific task by its ID.\n\n- **Method:** GET\n- **URL:** `/status/\u003ctask_id\u003e`\n- **Headers:**\n  - `X-API-Key`: Your API key\n- **Permissions:** No specific permission required, but the task must be associated with the API key used.\n- **Response:**\n  ```json\n  {\n      \"key_name\": \"user_key\",\n      \"status\": \"completed\",\n      \"task_type\": \"get_video\",\n      \"url\": \"https://youtu.be/1FPdtR_5KFo\",\n      \"video_format\": \"bestvideo[height\u003c=1080]\",\n      \"audio_format\": \"bestaudio[abr\u003c=129]\",\n      \"output_format\": \"mp4\",\n      \"completed_time\": \"2024-01-01T12:00:00\",\n      \"file\": \"/files/abcdefgh12345678/video.mp4\"\n  }\n  ```\n\n### Get File (`/files/\u003cpath:filename\u003e`)\n\nRetrieves a file from the server.\n\n- **Method:** GET\n- **URL:** `/files/\u003cpath:filename\u003e`\n- **Query Parameters:**\n  - `raw` (optional): If set to \"true\", forces download of the file.\n  - Any parameter matching keys in the `info.json` file (for info.json files only).\n  - `qualities`: Returns a structured list of available video and audio qualities formats (for info.json files only).\n- **Response:**\n  - For regular files: The file content with appropriate headers.\n  - For `info.json` files:\n    - If no query parameters: Full content of the `info.json` file.\n    - If query parameters present: Filtered data based on the parameters.\n    - For `qualities` parameter:\n      ```json\n      {\n        \"qualities\": {\n          \"audio\": {\n            \"249\": {\n              \"abr\": 47,\n              \"acodec\": \"opus\",\n              \"audio_channels\": 2,\n              \"filesize\": 528993\n            },\n            \"139\": {\n              \"abr\": 48,\n              \"acodec\": \"mp4a.40.5\",\n              \"audio_channels\": 2,\n              \"filesize\": 549935\n            }\n          },\n          \"video\": {\n            \"394\": {\n              \"height\": 144,\n              \"width\": 256,\n              \"fps\": 25,\n              \"vcodec\": \"av01.0.00M.08\",\n              \"format_note\": \"144p\",\n              \"dynamic_range\": \"SDR\",\n              \"filesize\": 1009634\n            },\n            \"134\": {\n              \"height\": 360,\n              \"width\": 640,\n              \"fps\": 25,\n              \"vcodec\": \"avc1.4D401E\",\n              \"format_note\": \"360p\",\n              \"dynamic_range\": \"SDR\",\n              \"filesize\": 6648273\n            }\n          }\n        }\n      }\n      ```\n\n## Error Handling\n\nThe API uses standard HTTP status codes to indicate the success or failure of requests. In case of an error, the response will include a JSON object with an `error` field describing the issue.\n\nExample error response:\n```json\n{\n    \"error\": \"Invalid API key\"\n}\n```\n\nCommon error codes:\n- 400: Bad Request - Invalid request parameters\n- 401: Unauthorized - Invalid or missing API key\n- 403: Forbidden - Insufficient permissions\n- 404: Not Found - Resource not found\n- 429: Too Many Requests - Rate limit exceeded\n- 500: Internal Server Error - Server-side error\n\n## Examples\n\n### Getting a video in MP4 format\n\n```python\nimport requests\n\napi_key = \"your_api_key_here\"\nbase_url = \"http://localhost:5000\"\n\nheaders = {\n    \"X-API-Key\": api_key,\n    \"Content-Type\": \"application/json\"\n}\n\ndata = {\n    \"url\": \"https://youtu.be/1FPdtR_5KFo\",\n    \"video_format\": \"bestvideo[height\u003c=1080]\",\n    \"audio_format\": \"bestaudio[abr\u003c=129]\",\n    \"output_format\": \"mp4\"\n}\n\nresponse = requests.post(f\"{base_url}/get_video\", json=data, headers=headers)\nprint(response.json())\n```\n\n### Getting audio in MP3 format\n\n```python\nimport requests\n\napi_key = \"your_api_key_here\"\nbase_url = \"http://localhost:5000\"\n\nheaders = {\n    \"X-API-Key\": api_key,\n    \"Content-Type\": \"application/json\"\n}\n\ndata = {\n    \"url\": \"https://youtu.be/1FPdtR_5KFo\",\n    \"audio_format\": \"bestaudio\",\n    \"output_format\": \"mp3\"\n}\n\nresponse = requests.post(f\"{base_url}/get_audio\", json=data, headers=headers)\nprint(response.json())\n```\n\n### Getting a video fragment\n\n```python\nimport requests\n\napi_key = \"your_api_key_here\"\nbase_url = \"http://localhost:5000\"\n\nheaders = {\n    \"X-API-Key\": api_key,\n    \"Content-Type\": \"application/json\"\n}\n\ndata = {\n    \"url\": \"https://youtu.be/1FPdtR_5KFo\",\n    \"video_format\": \"bestvideo[height\u003c=720]\",\n    \"audio_format\": \"bestaudio\",\n    \"output_format\": \"webm\",\n    \"start_time\": \"00:00:30\",\n    \"end_time\": \"00:01:30\",\n    \"force_keyframes\": True\n}\n\nresponse = requests.post(f\"{base_url}/get_video\", json=data, headers=headers)\nprint(response.json())\n```\n\n### Checking task status and downloading the file\n\n```python\nimport requests\nimport time\n\napi_key = \"your_api_key_here\"\nbase_url = \"http://localhost:5000\"\ntask_id = \"abcdefgh12345678\"\n\nheaders = {\n    \"X-API-Key\": api_key\n}\n\n# Check status\nwhile True:\n    response = requests.get(f\"{base_url}/status/{task_id}\", headers=headers)\n    status_data = response.json()\n    \n    if status_data['status'] == 'completed':\n        file_url = base_url + status_data['file']\n        # Download the file\n        file_response = requests.get(file_url, headers=headers)\n        with open('downloaded_video.mp4', 'wb') as f:\n            f.write(file_response.content)\n        print(\"Download completed!\")\n        break\n    elif status_data['status'] == 'error':\n        print(f\"Error: {status_data.get('error', 'Unknown error')}\")\n        break\n    else:\n        print(f\"Status: {status_data['status']}\")\n        time.sleep(2)\n```\n\n### Getting video information\n\n```python\nimport requests\n\napi_key = \"your_api_key_here\"\nbase_url = \"http://localhost:5000\"\n\nheaders = {\n    \"X-API-Key\": api_key,\n    \"Content-Type\": \"application/json\"\n}\n\n# Start info task\ndata = {\"url\": \"https://youtu.be/1FPdtR_5KFo\"}\nresponse = requests.post(f\"{base_url}/get_info\", json=data, headers=headers)\ntask_id = response.json()['task_id']\n\n# Wait for completion and get info\ntime.sleep(2)\nstatus_response = requests.get(f\"{base_url}/status/{task_id}\", headers=headers)\nif status_response.json()['status'] == 'completed':\n    info_url = base_url + status_response.json()['file']\n    \n    # Get full info\n    info = requests.get(info_url, headers=headers).json()\n    \n    # Get only qualities\n    qualities = requests.get(f\"{info_url}?qualities\", headers=headers).json()\n    print(qualities)\n```\n\n## Supported Output Formats\n\n### Video Formats\n- **mp4** - MPEG-4 Part 14 (recommended)\n- **mkv** - Matroska\n- **webm** - WebM\n\n### Audio Formats\n- **mp3** - MPEG Audio Layer III\n- **m4a** - MPEG-4 Audio\n- **opus** - Opus Audio\n- **aac** - Advanced Audio Coding\n\n## Contributing\n\nContributions to yt-dlp-host are welcome! If you have any suggestions, bug reports, or feature requests, please open an issue on the [GitHub repository](https://github.com/Vasysik/yt-dlp-host). Pull requests are also encouraged.\n\n## License\n\nThis project is licensed under the MIT License. See the LICENSE file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvasysik%2Fyt-dlp-host","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvasysik%2Fyt-dlp-host","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvasysik%2Fyt-dlp-host/lists"}