mirror of
https://github.com/ihmily/DouyinLiveRecorder.git
synced 2025-12-26 05:48:32 +08:00
refactor: Refactor code structure
This commit is contained in:
parent
4fa3fbb773
commit
0bd2a3a360
140
README_PYPI.md
140
README_PYPI.md
@ -1,140 +0,0 @@
|
|||||||
# StreamGet
|
|
||||||
|
|
||||||
`StreamGet` is a lightweight Python package designed to extract live stream URLs from live room links.
|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
## Features
|
|
||||||
|
|
||||||
- **Extract Live Stream URLs**: Get direct video stream URLs by crawling the live room page and extracting the stream source interface.
|
|
||||||
- **Platform Support**: Works with popular live streaming platforms (e.g. Twitch, YouTube, Douyin, Xiaohongshu, Huya, Douyu, etc.).
|
|
||||||
- **No Dependencies**: Pure Python implementation with no external dependencies, ensuring lightweight and fast performance.
|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
Install `StreamGet` via pip:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pip install streamget
|
|
||||||
```
|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
## Quick Start
|
|
||||||
|
|
||||||
```python
|
|
||||||
import asyncio
|
|
||||||
from streamget import spider, stream
|
|
||||||
|
|
||||||
|
|
||||||
async def main():
|
|
||||||
# Initialize with a live room URL
|
|
||||||
url = "https://live.douyin.com/745964462470"
|
|
||||||
|
|
||||||
# Get the live stream URL asynchronously
|
|
||||||
room_data = await spider.get_douyin_app_stream_data(url)
|
|
||||||
print('room_data:', room_data)
|
|
||||||
|
|
||||||
stream_data = await stream.get_douyin_stream_url(room_data, '0')
|
|
||||||
print('stream_data :', stream_data)
|
|
||||||
stream_url = stream_data.get('record_url')
|
|
||||||
print("Live Stream URL:", stream_url)
|
|
||||||
|
|
||||||
|
|
||||||
# Run the async function
|
|
||||||
asyncio.run(main())
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
## Supported Platforms
|
|
||||||
|
|
||||||
| Platform | Support status | HLS support | FLV support |
|
|
||||||
| :---------- | :------------- | :---------- | :---------- |
|
|
||||||
| 抖音 | ✅ | ✅ | ✅ |
|
|
||||||
| TikTok | ✅ | ✅ | ✅ |
|
|
||||||
| 快手 | ✅ | ❌ | ✅ |
|
|
||||||
| 虎牙 | ✅ | ✅ | ✅ |
|
|
||||||
| 斗鱼 | ✅ | ❌ | ✅ |
|
|
||||||
| YY | ✅ | ❌ | ✅ |
|
|
||||||
| B站 | ✅ | ❌ | ✅ |
|
|
||||||
| 小红书 | ✅ | ✅ | ✅ |
|
|
||||||
| Bigo | ✅ | ✅ | ❌ |
|
|
||||||
| Blued | ✅ | ✅ | ❌ |
|
|
||||||
| SOOP | ✅ | ✅ | ❌ |
|
|
||||||
| 网易CC | ✅ | ✅ | ✅ |
|
|
||||||
| 千度热播 | ✅ | ❌ | ✅ |
|
|
||||||
| PandaTV | ✅ | ✅ | ❌ |
|
|
||||||
| 猫耳FM | ✅ | ✅ | ✅ |
|
|
||||||
| Look直播 | ✅ | ✅ | ✅ |
|
|
||||||
| WinkTV | ✅ | ✅ | ❌ |
|
|
||||||
| FlexTV | ✅ | ✅ | ❌ |
|
|
||||||
| PopkonTV | ✅ | ✅ | ❌ |
|
|
||||||
| TwitCasting | ✅ | ✅ | ❌ |
|
|
||||||
| 百度直播 | ✅ | ✅ | ✅ |
|
|
||||||
| 微博直播 | ✅ | ✅ | ✅ |
|
|
||||||
| 酷狗直播 | ✅ | ❌ | ✅ |
|
|
||||||
| TwitchTV | ✅ | ✅ | ❌ |
|
|
||||||
| LiveMe | ✅ | ✅ | ✅ |
|
|
||||||
| 花椒直播 | ✅ | ❌ | ✅ |
|
|
||||||
| 流星直播 | ✅ | ❌ | ✅ |
|
|
||||||
| ShowRoom | ✅ | ✅ | ❌ |
|
|
||||||
| Acfun | ✅ | ✅ | ✅ |
|
|
||||||
| 映客直播 | ✅ | ✅ | ✅ |
|
|
||||||
| 音播直播 | ✅ | ✅ | ✅ |
|
|
||||||
| 知乎直播 | ✅ | ✅ | ✅ |
|
|
||||||
| CHZZK | ✅ | ✅ | ❌ |
|
|
||||||
| 嗨秀直播 | ✅ | ❌ | ✅ |
|
|
||||||
| vv星球直播 | ✅ | ✅ | ❌ |
|
|
||||||
| 17Live | ✅ | ❌ | ✅ |
|
|
||||||
| 浪Live | ✅ | ✅ | ✅ |
|
|
||||||
| 畅聊直播 | ✅ | ✅ | ✅ |
|
|
||||||
| 飘飘直播 | ✅ | ✅ | ✅ |
|
|
||||||
| 六间房直播 | ✅ | ❌ | ✅ |
|
|
||||||
| 乐嗨直播 | ✅ | ✅ | ✅ |
|
|
||||||
| 花猫直播 | ✅ | ✅ | ❌ |
|
|
||||||
| Shopee | ✅ | ❌ | ✅ |
|
|
||||||
| YouTube | ✅ | ✅ | ❌ |
|
|
||||||
| 淘宝 | ✅ | ✅ | ✅ |
|
|
||||||
| 京东 | ✅ | ✅ | ✅ |
|
|
||||||
| Faceit | ✅ | ✅ | ❌ |
|
|
||||||
| More ... | | | |
|
|
||||||
|
|
||||||
### Notes:
|
|
||||||
|
|
||||||
1. **Support Status**: ✅ indicates supported, ❌ indicates unsupported.
|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
## Supported Quality
|
|
||||||
|
|
||||||
| Chinese clarity | abbreviation | Full Name | Note |
|
|
||||||
| :-------------- | :----------- | :-------------------- | :------------------------------------------------- |
|
|
||||||
| 原画 | `OD` | Original Definition | Highest clarity, original picture quality |
|
|
||||||
| 蓝光 | `BD` | Blue-ray Definition | High definition close to blue light quality |
|
|
||||||
| 超清 | `UHD` | Ultra High Definition | Ultra high definition |
|
|
||||||
| 高清 | `HD` | High Definition | High definition, usually referring to 1080p |
|
|
||||||
| 标清 | `SD` | Standard Definition | Standard clarity, usually referring to 480p |
|
|
||||||
| 流畅 | `LD` | Low Definition | Low definition, usually referring to 360p or lower |
|
|
||||||
|
|
||||||
## Contributing
|
|
||||||
|
|
||||||
Contributions are welcome! If you'd like to add support for a new platform or improve the package, please check out the [GitHub repository](https://github.com/ihmily/DouyinLiveRecorder) and submit a pull request.
|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
`StreamGet` is released under the MIT License. See the [LICENSE](https://github.com/ihmily/DouyinLiveRecorder/blob/main/LICENSE) file for details.
|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
## Documentation
|
|
||||||
|
|
||||||
For full documentation and advanced usage, visit the [official documentation](https://streamget.readthedocs.io/).
|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
4
demo.py
4
demo.py
@ -1,7 +1,7 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import asyncio
|
import asyncio
|
||||||
from streamget.logger import logger
|
from src.logger import logger
|
||||||
from streamget import spider
|
from src import spider
|
||||||
|
|
||||||
# 以下示例直播间链接不保证时效性,请自行查看链接是否能正常访问
|
# 以下示例直播间链接不保证时效性,请自行查看链接是否能正常访问
|
||||||
# Please note that the following example live room links may not be up-to-date
|
# Please note that the following example live room links may not be up-to-date
|
||||||
|
|||||||
@ -15,7 +15,7 @@ import zipfile
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import requests
|
import requests
|
||||||
from tqdm import tqdm
|
from tqdm import tqdm
|
||||||
from streamget.logger import logger
|
from src.logger import logger
|
||||||
|
|
||||||
current_platform = platform.system()
|
current_platform = platform.system()
|
||||||
execute_dir = os.path.split(os.path.realpath(sys.argv[0]))[0]
|
execute_dir = os.path.split(os.path.realpath(sys.argv[0]))[0]
|
||||||
@ -218,4 +218,4 @@ def check_ffmpeg_installed() -> bool:
|
|||||||
def check_ffmpeg() -> bool:
|
def check_ffmpeg() -> bool:
|
||||||
if not check_ffmpeg_installed():
|
if not check_ffmpeg_installed():
|
||||||
return install_ffmpeg()
|
return install_ffmpeg()
|
||||||
return True
|
return True
|
||||||
|
|||||||
2
i18n.py
2
i18n.py
@ -20,7 +20,7 @@ else:
|
|||||||
locale_path = Path(execute_dir) / 'i18n'
|
locale_path = Path(execute_dir) / 'i18n'
|
||||||
_tr = init_gettext(locale_path, 'zh_CN')
|
_tr = init_gettext(locale_path, 'zh_CN')
|
||||||
original_print = builtins.print
|
original_print = builtins.print
|
||||||
package_name = 'streamget'
|
package_name = 'src'
|
||||||
|
|
||||||
|
|
||||||
def translated_print(*args, **kwargs):
|
def translated_print(*args, **kwargs):
|
||||||
|
|||||||
8
main.py
8
main.py
@ -27,10 +27,10 @@ import urllib.request
|
|||||||
from urllib.error import URLError, HTTPError
|
from urllib.error import URLError, HTTPError
|
||||||
from typing import Any
|
from typing import Any
|
||||||
import configparser
|
import configparser
|
||||||
from streamget import spider, stream
|
from src import spider, stream
|
||||||
from streamget.proxy import ProxyDetector
|
from src.proxy import ProxyDetector
|
||||||
from streamget.utils import logger
|
from src.utils import logger
|
||||||
from streamget import utils
|
from src import utils
|
||||||
from msg_push import (
|
from msg_push import (
|
||||||
dingtalk, xizhi, tg_bot, send_email, bark, ntfy
|
dingtalk, xizhi, tg_bot, send_email, bark, ntfy
|
||||||
)
|
)
|
||||||
|
|||||||
@ -1,4 +0,0 @@
|
|||||||
[virtualenvs]
|
|
||||||
in-project = true
|
|
||||||
create = true
|
|
||||||
prefer-active-python = true
|
|
||||||
@ -1,24 +0,0 @@
|
|||||||
[project]
|
|
||||||
name = "streamget"
|
|
||||||
version = "4.0.3"
|
|
||||||
description = "A simple and efficient tool to fetch live stream URLs from various platforms. Supports multiple platforms and easy integration."
|
|
||||||
authors = [{ name = "Hmily" }]
|
|
||||||
license = {text = "MIT"}
|
|
||||||
readme = "README_PYPI.md"
|
|
||||||
urls = {Repository = "https://github.com/ihmily/DouyinLiveRecorder"}
|
|
||||||
keywords = ["douyin", "youtube", "tiktok", "twitch", "live", "recorder"]
|
|
||||||
requires-python = ">=3.10,<4.0"
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
"requests>=2.31.0",
|
|
||||||
"loguru>=0.7.3",
|
|
||||||
"pycryptodome>=3.20.0",
|
|
||||||
"distro>=1.9.0",
|
|
||||||
"tqdm>=4.67.1",
|
|
||||||
"httpx[http2]>=0.28.1",
|
|
||||||
"PyExecJS>=1.5.1"
|
|
||||||
]
|
|
||||||
|
|
||||||
[build-system]
|
|
||||||
requires = ["poetry-core>=1.0.0"]
|
|
||||||
build-backend = "poetry.core.masonry.api"
|
|
||||||
33
setup.py
33
setup.py
@ -1,33 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
from setuptools import setup, find_packages
|
|
||||||
|
|
||||||
setup(
|
|
||||||
name='streamget',
|
|
||||||
version='4.0.3',
|
|
||||||
author='Hmily',
|
|
||||||
description='A simple and efficient tool to fetch live stream URLs from various platforms. Supports multiple '
|
|
||||||
'platforms and easy integration.',
|
|
||||||
long_description=open('README_PYPI.md', encoding='utf-8').read(),
|
|
||||||
long_description_content_type='text/markdown',
|
|
||||||
url='https://github.com/ihmily/DouyinLiveRecorder',
|
|
||||||
packages=find_packages(),
|
|
||||||
install_requires=[
|
|
||||||
'requests>=2.31.0',
|
|
||||||
'loguru>=0.7.3',
|
|
||||||
'pycryptodome>=3.20.0',
|
|
||||||
'distro>=1.9.0',
|
|
||||||
'tqdm>=4.67.1',
|
|
||||||
'httpx[http2]>=0.28.1'
|
|
||||||
'PyExecJS>=1.5.1',
|
|
||||||
],
|
|
||||||
classifiers=[
|
|
||||||
'Development Status :: 3 - Alpha',
|
|
||||||
'Intended Audience :: Developers',
|
|
||||||
'Programming Language :: Python :: 3',
|
|
||||||
'Programming Language :: Python :: 3 :: Only',
|
|
||||||
'Programming Language :: Python :: 3.10',
|
|
||||||
'Programming Language :: Python :: 3.11',
|
|
||||||
'Programming Language :: Python :: 3.12',
|
|
||||||
'Programming Language :: Python :: 3.13',
|
|
||||||
]
|
|
||||||
)
|
|
||||||
@ -37,7 +37,7 @@ async def async_req(
|
|||||||
return str(response.url)
|
return str(response.url)
|
||||||
elif return_cookies:
|
elif return_cookies:
|
||||||
cookies_dict = {name: value for name, value in response.cookies.items()}
|
cookies_dict = {name: value for name, value in response.cookies.items()}
|
||||||
return response.text, cookies_dict if include_cookies else cookies_dict
|
return (response.text, cookies_dict) if include_cookies else cookies_dict
|
||||||
else:
|
else:
|
||||||
resp_str = response.text
|
resp_str = response.text
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
Loading…
x
Reference in New Issue
Block a user