add python library
14
.gitattributes
vendored
@@ -1,10 +1,10 @@
|
|||||||
tools/worker/public/css/** linguist-vendored
|
yyets/worker/public/css/** linguist-vendored
|
||||||
tools/worker/public/fonts/* linguist-vendored
|
yyets/worker/public/fonts/* linguist-vendored
|
||||||
tools/worker/public/img/* linguist-vendored
|
yyets/worker/public/img/* linguist-vendored
|
||||||
tools/worker/public/js/* linguist-vendored
|
yyets/worker/public/js/* linguist-vendored
|
||||||
tools/worker/public/js/search.js -linguist-vendored
|
yyets/worker/public/js/search.js -linguist-vendored
|
||||||
tools/worker/public/404.html linguist-vendored
|
yyets/worker/public/404.html linguist-vendored
|
||||||
tools/worker/public/resource.html linguist-vendored
|
yyets/worker/public/resource.html linguist-vendored
|
||||||
|
|
||||||
yyetsweb/templates/css/** linguist-vendored
|
yyetsweb/templates/css/** linguist-vendored
|
||||||
yyetsweb/templates/fonts/* linguist-vendored
|
yyetsweb/templates/fonts/* linguist-vendored
|
||||||
|
|||||||
32
README.md
@@ -98,8 +98,40 @@ yyets_offline - 人人影视离线数据
|
|||||||
|
|
||||||
# 开发
|
# 开发
|
||||||
|
|
||||||
|
## 网站开发
|
||||||
|
|
||||||
如何部署、参与开发、具体API接口,可以 [参考这个文档](DEVELOPMENT.md)
|
如何部署、参与开发、具体API接口,可以 [参考这个文档](DEVELOPMENT.md)
|
||||||
|
|
||||||
|
## Python Library
|
||||||
|
|
||||||
|
也可以作为Python Library去调用
|
||||||
|
|
||||||
|
`pip3 install yyets`
|
||||||
|
|
||||||
|
```
|
||||||
|
>>> from yyets import YYeTs
|
||||||
|
>>> yy=YYeTs("逃避")
|
||||||
|
[2021-09-21 19:22:32 __init__.py:54 I] Fetching 逃避可耻却有用...https://yyets.dmesg.app/api/resource?id=34812
|
||||||
|
[2021-09-21 19:22:33 __init__.py:54 I] Fetching 无法逃避...https://yyets.dmesg.app/api/resource?id=29540
|
||||||
|
[2021-09-21 19:22:35 __init__.py:54 I] Fetching 逃避者...https://yyets.dmesg.app/api/resource?id=37089
|
||||||
|
|
||||||
|
>>> yy.result
|
||||||
|
[<yyets.Resource object at 0x10cc7b130>, <yyets.Resource object at 0x10ca0e880>, <yyets.Resource object at 0x10cc7b040>]
|
||||||
|
|
||||||
|
>>> for y in yy.result:
|
||||||
|
print(y)
|
||||||
|
|
||||||
|
逃避可耻却有用 - NIGERUHA HAJIDAGA YAKUNITATSU
|
||||||
|
无法逃避 - Inescapable
|
||||||
|
逃避者 - Shirkers
|
||||||
|
|
||||||
|
>>> yy.result[0].cnname
|
||||||
|
'逃避可耻却有用'
|
||||||
|
|
||||||
|
>>> yy.result[0].list
|
||||||
|
[{'season_num': '101', 'season_cn': '单剧', 'items': {'APP': [{'ite
|
||||||
|
```
|
||||||
|
|
||||||
# Credits
|
# Credits
|
||||||
|
|
||||||
* [人人影视](http://www.zmz2019.com/)
|
* [人人影视](http://www.zmz2019.com/)
|
||||||
|
|||||||
131
setup.py
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# Note: To use the 'upload' functionality of this file, you must:
|
||||||
|
# $ pipenv install twine --dev
|
||||||
|
|
||||||
|
import io
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
from shutil import rmtree
|
||||||
|
|
||||||
|
from setuptools import find_packages, setup, Command
|
||||||
|
|
||||||
|
# Package meta-data.
|
||||||
|
NAME = 'yyets'
|
||||||
|
DESCRIPTION = 'https://yyets.dmesg.app/ wrapper'
|
||||||
|
URL = 'https://github.com/tgbot-collection/YYeTsBot'
|
||||||
|
EMAIL = 'benny.think@gmail.com'
|
||||||
|
AUTHOR = 'BennyThink'
|
||||||
|
REQUIRES_PYTHON = '>=3.6.0'
|
||||||
|
VERSION = '1.0.0'
|
||||||
|
|
||||||
|
# What packages are required for this module to be executed?
|
||||||
|
REQUIRED = [
|
||||||
|
"requests"
|
||||||
|
]
|
||||||
|
|
||||||
|
# What packages are optional?
|
||||||
|
EXTRAS = {
|
||||||
|
# 'fancy feature': ['django'],
|
||||||
|
}
|
||||||
|
|
||||||
|
# The rest you shouldn't have to touch too much :)
|
||||||
|
# ------------------------------------------------
|
||||||
|
# Except, perhaps the License and Trove Classifiers!
|
||||||
|
# If you do change the License, remember to change the Trove Classifier for that!
|
||||||
|
|
||||||
|
here = os.path.abspath(os.path.dirname(__file__))
|
||||||
|
|
||||||
|
# Import the README and use it as the long-description.
|
||||||
|
# Note: this will only work if 'README.md' is present in your MANIFEST.in file!
|
||||||
|
try:
|
||||||
|
with io.open(os.path.join(here, 'README.md'), encoding='utf-8') as f:
|
||||||
|
long_description = '\n' + f.read()
|
||||||
|
except FileNotFoundError:
|
||||||
|
long_description = DESCRIPTION
|
||||||
|
|
||||||
|
# Load the package's __version__.py module as a dictionary.
|
||||||
|
about = {}
|
||||||
|
if not VERSION:
|
||||||
|
project_slug = NAME.lower().replace("-", "_").replace(" ", "_")
|
||||||
|
with open(os.path.join(here, project_slug, '__version__.py')) as f:
|
||||||
|
exec(f.read(), about)
|
||||||
|
else:
|
||||||
|
about['__version__'] = VERSION
|
||||||
|
|
||||||
|
|
||||||
|
class UploadCommand(Command):
|
||||||
|
"""Support setup.py upload."""
|
||||||
|
|
||||||
|
description = 'Build and publish the package.'
|
||||||
|
user_options = []
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def status(s):
|
||||||
|
"""Prints things in bold."""
|
||||||
|
print('\033[1m{0}\033[0m'.format(s))
|
||||||
|
|
||||||
|
def initialize_options(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def finalize_options(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
try:
|
||||||
|
self.status('Removing previous builds…')
|
||||||
|
rmtree(os.path.join(here, 'dist'))
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
self.status('Building Source and Wheel (universal) distribution…')
|
||||||
|
os.system('{0} setup.py sdist bdist_wheel --universal'.format(sys.executable))
|
||||||
|
|
||||||
|
self.status('Uploading the package to PyPI via Twine…')
|
||||||
|
os.system('twine upload dist/*')
|
||||||
|
|
||||||
|
self.status('Pushing git tags…')
|
||||||
|
os.system('git tag v{0}'.format(about['__version__']))
|
||||||
|
os.system('git push --tags')
|
||||||
|
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
|
||||||
|
# Where the magic happens:
|
||||||
|
setup(
|
||||||
|
name=NAME,
|
||||||
|
version=about['__version__'],
|
||||||
|
description=DESCRIPTION,
|
||||||
|
long_description=long_description,
|
||||||
|
long_description_content_type='text/markdown',
|
||||||
|
author=AUTHOR,
|
||||||
|
author_email=EMAIL,
|
||||||
|
python_requires=REQUIRES_PYTHON,
|
||||||
|
url=URL,
|
||||||
|
# packages=find_packages(exclude=["tests", "*.tests", "*.tests.*", "tests.*"]),
|
||||||
|
# If your package is a single module, use this instead of 'packages':
|
||||||
|
packages=['yyets'],
|
||||||
|
|
||||||
|
# entry_points={
|
||||||
|
# 'console_scripts': ['mycli=mymodule:cli'],
|
||||||
|
# },
|
||||||
|
install_requires=REQUIRED,
|
||||||
|
extras_require=EXTRAS,
|
||||||
|
include_package_data=True,
|
||||||
|
license='MIT',
|
||||||
|
classifiers=[
|
||||||
|
# Trove classifiers
|
||||||
|
# Full list: https://pypi.python.org/pypi?%3Aaction=list_classifiers
|
||||||
|
'License :: OSI Approved :: MIT License',
|
||||||
|
'Programming Language :: Python',
|
||||||
|
'Programming Language :: Python :: 3',
|
||||||
|
'Programming Language :: Python :: 3.6',
|
||||||
|
'Programming Language :: Python :: Implementation :: CPython',
|
||||||
|
'Programming Language :: Python :: Implementation :: PyPy'
|
||||||
|
],
|
||||||
|
# $ setup.py publish support.
|
||||||
|
cmdclass={
|
||||||
|
'upload': UploadCommand,
|
||||||
|
},
|
||||||
|
)
|
||||||
64
yyets/__init__.py
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
#!/usr/local/bin/python3
|
||||||
|
# coding: utf-8
|
||||||
|
|
||||||
|
# YYeTsBot - __init__.py
|
||||||
|
# 9/21/21 18:09
|
||||||
|
#
|
||||||
|
|
||||||
|
__author__ = "Benny <benny.think@gmail.com>"
|
||||||
|
|
||||||
|
import requests
|
||||||
|
import logging
|
||||||
|
|
||||||
|
API = "https://yyets.dmesg.app/api/resource?"
|
||||||
|
|
||||||
|
logging.basicConfig(
|
||||||
|
level=logging.INFO,
|
||||||
|
format='[%(asctime)s %(filename)s:%(lineno)d %(levelname).1s] %(message)s',
|
||||||
|
datefmt="%Y-%m-%d %H:%M:%S"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class Resource:
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.enname = None
|
||||||
|
self.cnname = None
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"{self.cnname} - {self.enname}"
|
||||||
|
|
||||||
|
|
||||||
|
class YYeTs:
|
||||||
|
def __init__(self, keyword: "str"):
|
||||||
|
self.result = []
|
||||||
|
self.keyword = keyword
|
||||||
|
self.search_api = f"{API}keyword={self.keyword}"
|
||||||
|
self.resource_api = f"{API}id=%s"
|
||||||
|
self.search()
|
||||||
|
|
||||||
|
def search(self):
|
||||||
|
data = requests.get(self.search_api).json()
|
||||||
|
for item in data["data"]:
|
||||||
|
r = Resource()
|
||||||
|
info = item["data"]["info"]
|
||||||
|
setattr(r, "list", self.fetch(info))
|
||||||
|
for k, v in info.items():
|
||||||
|
setattr(r, k, v)
|
||||||
|
self.result.append(r)
|
||||||
|
|
||||||
|
def fetch(self, info):
|
||||||
|
rid = info["id"]
|
||||||
|
url = self.resource_api % rid
|
||||||
|
headers = {"Referer": url}
|
||||||
|
logging.info("Fetching %s...%s", info["cnname"], url)
|
||||||
|
return requests.get(url, headers=headers).json()["data"]["list"]
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"{self.keyword} - {self.search_api}"
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
ins = YYeTs("逃避")
|
||||||
|
for i in ins.result:
|
||||||
|
print(i)
|
||||||
|
Before Width: | Height: | Size: 123 KiB After Width: | Height: | Size: 123 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |