├── .gitignore ├── Dockerfile ├── README.md ├── SPEC.md ├── app.py ├── cmd └── __init__.py ├── docker-compose.yml ├── parser └── __init__.py ├── poetry.lock ├── provider └── __init__.py ├── pyproject.toml └── requirements.txt /.gitignore: -------------------------------------------------------------------------------- 1 | ### Example user template template 2 | ### Example user template 3 | 4 | # IntelliJ project files 5 | .idea 6 | *.iml 7 | out 8 | gen 9 | ### Python template 10 | # Byte-compiled / optimized / DLL files 11 | __pycache__/ 12 | *.py[cod] 13 | *$py.class 14 | 15 | # C extensions 16 | *.so 17 | 18 | # Distribution / packaging 19 | .Python 20 | build/ 21 | develop-eggs/ 22 | dist/ 23 | downloads/ 24 | eggs/ 25 | .eggs/ 26 | lib/ 27 | lib64/ 28 | parts/ 29 | sdist/ 30 | var/ 31 | wheels/ 32 | share/python-wheels/ 33 | *.egg-info/ 34 | .installed.cfg 35 | *.egg 36 | MANIFEST 37 | 38 | # PyInstaller 39 | # Usually these files are written by a python script from a template 40 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 41 | *.manifest 42 | *.spec 43 | 44 | # Installer logs 45 | pip-log.txt 46 | pip-delete-this-directory.txt 47 | 48 | # Unit test / coverage reports 49 | htmlcov/ 50 | .tox/ 51 | .nox/ 52 | .coverage 53 | .coverage.* 54 | .cache 55 | nosetests.xml 56 | coverage.xml 57 | *.cover 58 | *.py,cover 59 | .hypothesis/ 60 | .pytest_cache/ 61 | cover/ 62 | 63 | # Translations 64 | *.mo 65 | *.pot 66 | 67 | # Django stuff: 68 | *.log 69 | local_settings.py 70 | db.sqlite3 71 | db.sqlite3-journal 72 | 73 | # Flask stuff: 74 | instance/ 75 | .webassets-cache 76 | 77 | # Scrapy stuff: 78 | .scrapy 79 | 80 | # Sphinx documentation 81 | docs/_build/ 82 | 83 | # PyBuilder 84 | .pybuilder/ 85 | target/ 86 | 87 | # Jupyter Notebook 88 | .ipynb_checkpoints 89 | 90 | # IPython 91 | profile_default/ 92 | ipython_config.py 93 | 94 | # pyenv 95 | # For a library or package, you might want to ignore these files since the code is 96 | # intended to run in multiple environments; otherwise, check them in: 97 | # .python-version 98 | 99 | # pipenv 100 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 101 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 102 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 103 | # install all needed dependencies. 104 | #Pipfile.lock 105 | 106 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 107 | __pypackages__/ 108 | 109 | # Celery stuff 110 | celerybeat-schedule 111 | celerybeat.pid 112 | 113 | # SageMath parsed files 114 | *.sage.py 115 | 116 | # Environments 117 | .env 118 | .venv 119 | env/ 120 | venv/ 121 | ENV/ 122 | env.bak/ 123 | venv.bak/ 124 | 125 | # Spyder project settings 126 | .spyderproject 127 | .spyproject 128 | 129 | # Rope project settings 130 | .ropeproject 131 | 132 | # mkdocs documentation 133 | /site 134 | 135 | # mypy 136 | .mypy_cache/ 137 | .dmypy.json 138 | dmypy.json 139 | 140 | # Pyre type checker 141 | .pyre/ 142 | 143 | # pytype static type analyzer 144 | .pytype/ 145 | 146 | # Cython debug symbols 147 | cython_debug/ 148 | 149 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.8-slim-buster 2 | 3 | WORKDIR /app 4 | 5 | COPY requirements.txt requirements.txt 6 | RUN pip3 install -r requirements.txt 7 | 8 | COPY . . 9 | 10 | EXPOSE 5000 11 | CMD ["flask", "run", "--host=0.0.0.0"] 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Woof Project 2 | == 3 | 4 | 这是什么? 5 | -- 6 | Woof 是一个多媒体数据标准,为多媒体内容提供元数据格式标准、刮削工具 7 | 8 | 并在大多数主流平台上(如 Windows、macOS、Linux、iOS、Android、tvOS)为你提供查询、索引、播放器等工具 9 | 10 | 快速开始 11 | -- 12 | 1. [下载刮削工具](https://github.com/WoofMedia/WoofProject/releases) 13 | 2. 下载 Woof 客户端 14 | 1. [tvOS 客户端 Beta](https://testflight.apple.com/join/1ZonSP4g) 15 | 3. 使用刮削工具,对本地的多媒体文件进行扫描 16 | 4. 对寻找到的多媒体文件进行刮削操作,刮削所得的元数据,将储存在对应多媒体文件所在目录 17 | 5. 使用 Woof 客户端浏览成果,Woof 客户端支持两种访问方式 18 | 1. 文件协议(如 SMB、AFP、NFS) 19 | 2. HTTP WoofAPI 20 | 21 | 讨论 22 | -- 23 | [Telegram Group](https://t.me/joinchat/zBCZhJ-pNK5hNjc1) 24 | -------------------------------------------------------------------------------- /SPEC.md: -------------------------------------------------------------------------------- 1 | Overview 2 | -- 3 | 本文档指定了Woof Project中,所使用到的数据储存标准以及 API 交互标准 4 | 5 | 在本项目中,使用到了这些数据格式类型: 6 | 1. Binary 7 | 2. Json 8 | 3. Key value 9 | 10 | Metadata File 11 | -- 12 | 元数据以 Binary 文件形式存在,被储存在与其所描述的多媒体文件同一目录下 13 | 14 | 其文件名为多媒体文件的 base name + ".wom",如 15 | ``` 16 | flower.2004.x264.mp4 17 | flower.2004.x264.wom 18 | ``` 19 | 20 | wom 文件所包含的 binary field,按实际储存顺序如下: 21 | ``` 22 | title 23 | description 24 | cover_img_data 25 | poster_img_data 26 | category 27 | rank 28 | score 29 | session 30 | episode 31 | ``` 32 | -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | from urllib.parse import urljoin 2 | 3 | from flask import Flask, jsonify, request 4 | 5 | app = Flask(__name__) 6 | 7 | 8 | @app.route("/") 9 | def hello_world(): 10 | return "Woof is Running" 11 | 12 | 13 | @app.route("/anime/search/") 14 | def search_series(keyword): 15 | data = [ 16 | { 17 | "category": "Fantasy %s" % index, 18 | "cover_url": "https://source.unsplash.com/random/300x200", 19 | "description": "Description heree", 20 | "module": "provider_name", 21 | "score": 80, 22 | "title": "Series %s" % index, 23 | "url": urljoin(request.host_url, "/anime/62696d6962696d697c32363931") 24 | } for index in range(10) 25 | ] 26 | return jsonify(data) 27 | 28 | 29 | @app.route("/anime/") 30 | def series_detail(token): 31 | return jsonify( 32 | { 33 | "category": "Fantasy", 34 | "cover_url": "https://source.unsplash.com/random/300x400", 35 | "description": "Very Very Very Very Very Very Very long series detail", 36 | "module": "provider", 37 | "play_lists": [ 38 | { 39 | "name": "Playlist 1", 40 | "num": 25, 41 | "video_list": [ 42 | { 43 | "info": urljoin(request.host_url, "/anime/62696d6962696d697c32363931/0/0"), 44 | "name": "Episode 01", 45 | "player": urljoin(request.host_url, "/anime/62696d6962696d697c32363931/0/0/player") 46 | } 47 | ] 48 | } 49 | ], 50 | "title": "Series Name" 51 | } 52 | ) 53 | 54 | 55 | @app.route("/anime///") 56 | def episode_playback_info(token, playlist, episode): 57 | return jsonify( 58 | { 59 | "format": "mp4", 60 | "lifetime": 86399, 61 | "proxy_url": urljoin(request.host_url, "/proxy/anime/62696d6962696d697c32363931/0/0"), 62 | "raw_url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4", 63 | "size": 10000000 64 | } 65 | ) 66 | 67 | 68 | if __name__ == '__main__': 69 | app.run() 70 | -------------------------------------------------------------------------------- /cmd/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoofMedia/WoofProject/79068a130a1541748faae33c426eb25b3ea670ec/cmd/__init__.py -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3" 2 | services: 3 | web: 4 | image: woof-api:local 5 | build: . 6 | restart: always 7 | ports: 8 | - "80:5000" 9 | -------------------------------------------------------------------------------- /parser/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoofMedia/WoofProject/79068a130a1541748faae33c426eb25b3ea670ec/parser/__init__.py -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "appnope" 3 | version = "0.1.2" 4 | description = "Disable App Nap on macOS >= 10.9" 5 | category = "dev" 6 | optional = false 7 | python-versions = "*" 8 | 9 | [[package]] 10 | name = "backcall" 11 | version = "0.2.0" 12 | description = "Specifications for callback functions passed in to an API" 13 | category = "dev" 14 | optional = false 15 | python-versions = "*" 16 | 17 | [[package]] 18 | name = "click" 19 | version = "8.0.1" 20 | description = "Composable command line interface toolkit" 21 | category = "main" 22 | optional = false 23 | python-versions = ">=3.6" 24 | 25 | [package.dependencies] 26 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 27 | 28 | [[package]] 29 | name = "colorama" 30 | version = "0.4.4" 31 | description = "Cross-platform colored terminal text." 32 | category = "main" 33 | optional = false 34 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 35 | 36 | [[package]] 37 | name = "decorator" 38 | version = "5.1.0" 39 | description = "Decorators for Humans" 40 | category = "dev" 41 | optional = false 42 | python-versions = ">=3.5" 43 | 44 | [[package]] 45 | name = "flask" 46 | version = "2.0.2" 47 | description = "A simple framework for building complex web applications." 48 | category = "main" 49 | optional = false 50 | python-versions = ">=3.6" 51 | 52 | [package.dependencies] 53 | click = ">=7.1.2" 54 | itsdangerous = ">=2.0" 55 | Jinja2 = ">=3.0" 56 | Werkzeug = ">=2.0" 57 | 58 | [package.extras] 59 | async = ["asgiref (>=3.2)"] 60 | dotenv = ["python-dotenv"] 61 | 62 | [[package]] 63 | name = "ipython" 64 | version = "7.28.0" 65 | description = "IPython: Productive Interactive Computing" 66 | category = "dev" 67 | optional = false 68 | python-versions = ">=3.7" 69 | 70 | [package.dependencies] 71 | appnope = {version = "*", markers = "sys_platform == \"darwin\""} 72 | backcall = "*" 73 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 74 | decorator = "*" 75 | jedi = ">=0.16" 76 | matplotlib-inline = "*" 77 | pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} 78 | pickleshare = "*" 79 | prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" 80 | pygments = "*" 81 | traitlets = ">=4.2" 82 | 83 | [package.extras] 84 | all = ["Sphinx (>=1.3)", "ipykernel", "ipyparallel", "ipywidgets", "nbconvert", "nbformat", "nose (>=0.10.1)", "notebook", "numpy (>=1.17)", "pygments", "qtconsole", "requests", "testpath"] 85 | doc = ["Sphinx (>=1.3)"] 86 | kernel = ["ipykernel"] 87 | nbconvert = ["nbconvert"] 88 | nbformat = ["nbformat"] 89 | notebook = ["notebook", "ipywidgets"] 90 | parallel = ["ipyparallel"] 91 | qtconsole = ["qtconsole"] 92 | test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.17)"] 93 | 94 | [[package]] 95 | name = "itsdangerous" 96 | version = "2.0.1" 97 | description = "Safely pass data to untrusted environments and back." 98 | category = "main" 99 | optional = false 100 | python-versions = ">=3.6" 101 | 102 | [[package]] 103 | name = "jedi" 104 | version = "0.18.0" 105 | description = "An autocompletion tool for Python that can be used for text editors." 106 | category = "dev" 107 | optional = false 108 | python-versions = ">=3.6" 109 | 110 | [package.dependencies] 111 | parso = ">=0.8.0,<0.9.0" 112 | 113 | [package.extras] 114 | qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] 115 | testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<6.0.0)"] 116 | 117 | [[package]] 118 | name = "jinja2" 119 | version = "3.0.2" 120 | description = "A very fast and expressive template engine." 121 | category = "main" 122 | optional = false 123 | python-versions = ">=3.6" 124 | 125 | [package.dependencies] 126 | MarkupSafe = ">=2.0" 127 | 128 | [package.extras] 129 | i18n = ["Babel (>=2.7)"] 130 | 131 | [[package]] 132 | name = "markupsafe" 133 | version = "2.0.1" 134 | description = "Safely add untrusted strings to HTML/XML markup." 135 | category = "main" 136 | optional = false 137 | python-versions = ">=3.6" 138 | 139 | [[package]] 140 | name = "matplotlib-inline" 141 | version = "0.1.3" 142 | description = "Inline Matplotlib backend for Jupyter" 143 | category = "dev" 144 | optional = false 145 | python-versions = ">=3.5" 146 | 147 | [package.dependencies] 148 | traitlets = "*" 149 | 150 | [[package]] 151 | name = "parso" 152 | version = "0.8.2" 153 | description = "A Python Parser" 154 | category = "dev" 155 | optional = false 156 | python-versions = ">=3.6" 157 | 158 | [package.extras] 159 | qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] 160 | testing = ["docopt", "pytest (<6.0.0)"] 161 | 162 | [[package]] 163 | name = "pexpect" 164 | version = "4.8.0" 165 | description = "Pexpect allows easy control of interactive console applications." 166 | category = "dev" 167 | optional = false 168 | python-versions = "*" 169 | 170 | [package.dependencies] 171 | ptyprocess = ">=0.5" 172 | 173 | [[package]] 174 | name = "pickleshare" 175 | version = "0.7.5" 176 | description = "Tiny 'shelve'-like database with concurrency support" 177 | category = "dev" 178 | optional = false 179 | python-versions = "*" 180 | 181 | [[package]] 182 | name = "prompt-toolkit" 183 | version = "3.0.20" 184 | description = "Library for building powerful interactive command lines in Python" 185 | category = "dev" 186 | optional = false 187 | python-versions = ">=3.6.2" 188 | 189 | [package.dependencies] 190 | wcwidth = "*" 191 | 192 | [[package]] 193 | name = "ptyprocess" 194 | version = "0.7.0" 195 | description = "Run a subprocess in a pseudo terminal" 196 | category = "dev" 197 | optional = false 198 | python-versions = "*" 199 | 200 | [[package]] 201 | name = "pygments" 202 | version = "2.10.0" 203 | description = "Pygments is a syntax highlighting package written in Python." 204 | category = "dev" 205 | optional = false 206 | python-versions = ">=3.5" 207 | 208 | [[package]] 209 | name = "traitlets" 210 | version = "5.1.0" 211 | description = "Traitlets Python configuration system" 212 | category = "dev" 213 | optional = false 214 | python-versions = ">=3.7" 215 | 216 | [package.extras] 217 | test = ["pytest"] 218 | 219 | [[package]] 220 | name = "wcwidth" 221 | version = "0.2.5" 222 | description = "Measures the displayed width of unicode strings in a terminal" 223 | category = "dev" 224 | optional = false 225 | python-versions = "*" 226 | 227 | [[package]] 228 | name = "werkzeug" 229 | version = "2.0.2" 230 | description = "The comprehensive WSGI web application library." 231 | category = "main" 232 | optional = false 233 | python-versions = ">=3.6" 234 | 235 | [package.extras] 236 | watchdog = ["watchdog"] 237 | 238 | [metadata] 239 | lock-version = "1.1" 240 | python-versions = "^3.9" 241 | content-hash = "3a586bca3bcadd21726a17eff5204df06d05c271530a799242858912f94d89cf" 242 | 243 | [metadata.files] 244 | appnope = [ 245 | {file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"}, 246 | {file = "appnope-0.1.2.tar.gz", hash = "sha256:dd83cd4b5b460958838f6eb3000c660b1f9caf2a5b1de4264e941512f603258a"}, 247 | ] 248 | backcall = [ 249 | {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, 250 | {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, 251 | ] 252 | click = [ 253 | {file = "click-8.0.1-py3-none-any.whl", hash = "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"}, 254 | {file = "click-8.0.1.tar.gz", hash = "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a"}, 255 | ] 256 | colorama = [ 257 | {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, 258 | {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, 259 | ] 260 | decorator = [ 261 | {file = "decorator-5.1.0-py3-none-any.whl", hash = "sha256:7b12e7c3c6ab203a29e157335e9122cb03de9ab7264b137594103fd4a683b374"}, 262 | {file = "decorator-5.1.0.tar.gz", hash = "sha256:e59913af105b9860aa2c8d3272d9de5a56a4e608db9a2f167a8480b323d529a7"}, 263 | ] 264 | flask = [ 265 | {file = "Flask-2.0.2-py3-none-any.whl", hash = "sha256:cb90f62f1d8e4dc4621f52106613488b5ba826b2e1e10a33eac92f723093ab6a"}, 266 | {file = "Flask-2.0.2.tar.gz", hash = "sha256:7b2fb8e934ddd50731893bdcdb00fc8c0315916f9fcd50d22c7cc1a95ab634e2"}, 267 | ] 268 | ipython = [ 269 | {file = "ipython-7.28.0-py3-none-any.whl", hash = "sha256:f16148f9163e1e526f1008d7c8d966d9c15600ca20d1a754287cf96d00ba6f1d"}, 270 | {file = "ipython-7.28.0.tar.gz", hash = "sha256:2097be5c814d1b974aea57673176a924c4c8c9583890e7a5f082f547b9975b11"}, 271 | ] 272 | itsdangerous = [ 273 | {file = "itsdangerous-2.0.1-py3-none-any.whl", hash = "sha256:5174094b9637652bdb841a3029700391451bd092ba3db90600dea710ba28e97c"}, 274 | {file = "itsdangerous-2.0.1.tar.gz", hash = "sha256:9e724d68fc22902a1435351f84c3fb8623f303fffcc566a4cb952df8c572cff0"}, 275 | ] 276 | jedi = [ 277 | {file = "jedi-0.18.0-py2.py3-none-any.whl", hash = "sha256:18456d83f65f400ab0c2d3319e48520420ef43b23a086fdc05dff34132f0fb93"}, 278 | {file = "jedi-0.18.0.tar.gz", hash = "sha256:92550a404bad8afed881a137ec9a461fed49eca661414be45059329614ed0707"}, 279 | ] 280 | jinja2 = [ 281 | {file = "Jinja2-3.0.2-py3-none-any.whl", hash = "sha256:8569982d3f0889eed11dd620c706d39b60c36d6d25843961f33f77fb6bc6b20c"}, 282 | {file = "Jinja2-3.0.2.tar.gz", hash = "sha256:827a0e32839ab1600d4eb1c4c33ec5a8edfbc5cb42dafa13b81f182f97784b45"}, 283 | ] 284 | markupsafe = [ 285 | {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, 286 | {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, 287 | {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, 288 | {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, 289 | {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, 290 | {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, 291 | {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, 292 | {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, 293 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, 294 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, 295 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, 296 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, 297 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, 298 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, 299 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, 300 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, 301 | {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, 302 | {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, 303 | {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, 304 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, 305 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, 306 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, 307 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, 308 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, 309 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, 310 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, 311 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, 312 | {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, 313 | {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, 314 | {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, 315 | {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, 316 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, 317 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, 318 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, 319 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, 320 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, 321 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, 322 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, 323 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, 324 | {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, 325 | {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, 326 | {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, 327 | {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, 328 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, 329 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, 330 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, 331 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, 332 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, 333 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, 334 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, 335 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, 336 | {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, 337 | {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, 338 | {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, 339 | ] 340 | matplotlib-inline = [ 341 | {file = "matplotlib-inline-0.1.3.tar.gz", hash = "sha256:a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee"}, 342 | {file = "matplotlib_inline-0.1.3-py3-none-any.whl", hash = "sha256:aed605ba3b72462d64d475a21a9296f400a19c4f74a31b59103d2a99ffd5aa5c"}, 343 | ] 344 | parso = [ 345 | {file = "parso-0.8.2-py2.py3-none-any.whl", hash = "sha256:a8c4922db71e4fdb90e0d0bc6e50f9b273d3397925e5e60a717e719201778d22"}, 346 | {file = "parso-0.8.2.tar.gz", hash = "sha256:12b83492c6239ce32ff5eed6d3639d6a536170723c6f3f1506869f1ace413398"}, 347 | ] 348 | pexpect = [ 349 | {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, 350 | {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, 351 | ] 352 | pickleshare = [ 353 | {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, 354 | {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, 355 | ] 356 | prompt-toolkit = [ 357 | {file = "prompt_toolkit-3.0.20-py3-none-any.whl", hash = "sha256:6076e46efae19b1e0ca1ec003ed37a933dc94b4d20f486235d436e64771dcd5c"}, 358 | {file = "prompt_toolkit-3.0.20.tar.gz", hash = "sha256:eb71d5a6b72ce6db177af4a7d4d7085b99756bf656d98ffcc4fecd36850eea6c"}, 359 | ] 360 | ptyprocess = [ 361 | {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, 362 | {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, 363 | ] 364 | pygments = [ 365 | {file = "Pygments-2.10.0-py3-none-any.whl", hash = "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380"}, 366 | {file = "Pygments-2.10.0.tar.gz", hash = "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"}, 367 | ] 368 | traitlets = [ 369 | {file = "traitlets-5.1.0-py3-none-any.whl", hash = "sha256:03f172516916220b58c9f19d7f854734136dd9528103d04e9bf139a92c9f54c4"}, 370 | {file = "traitlets-5.1.0.tar.gz", hash = "sha256:bd382d7ea181fbbcce157c133db9a829ce06edffe097bcf3ab945b435452b46d"}, 371 | ] 372 | wcwidth = [ 373 | {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, 374 | {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, 375 | ] 376 | werkzeug = [ 377 | {file = "Werkzeug-2.0.2-py3-none-any.whl", hash = "sha256:63d3dc1cf60e7b7e35e97fa9861f7397283b75d765afcaefd993d6046899de8f"}, 378 | {file = "Werkzeug-2.0.2.tar.gz", hash = "sha256:aa2bb6fc8dee8d6c504c0ac1e7f5f7dc5810a9903e793b6f715a9f015bdadb9a"}, 379 | ] 380 | -------------------------------------------------------------------------------- /provider/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WoofMedia/WoofProject/79068a130a1541748faae33c426eb25b3ea670ec/provider/__init__.py -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "woofapi" 3 | version = "0.1.0" 4 | description = "Multimedia metadata toolset" 5 | authors = ["StoneMoe "] 6 | license = "MIT" 7 | 8 | [tool.poetry.dependencies] 9 | python = "^3.9" 10 | Flask = "^2.0.2" 11 | 12 | [tool.poetry.dev-dependencies] 13 | ipython = "^7.28.0" 14 | 15 | [build-system] 16 | requires = ["poetry-core>=1.0.0"] 17 | build-backend = "poetry.core.masonry.api" 18 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | flask 2 | --------------------------------------------------------------------------------