├── .gitignore ├── LICENSE ├── README.rst ├── Reddit - Opendirectory scraper.ipynb ├── main.py ├── pyproject.toml └── urls ├── http___dl.mcup.xyz_.txt └── https___easy-movie.com.au_cdn_.txt /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | .idea/** 7 | .vscode/** 8 | 9 | # C extensions 10 | *.so 11 | 12 | # Distribution / packaging 13 | .Python 14 | build/ 15 | develop-eggs/ 16 | dist/ 17 | downloads/ 18 | eggs/ 19 | .eggs/ 20 | lib/ 21 | lib64/ 22 | parts/ 23 | sdist/ 24 | var/ 25 | wheels/ 26 | share/python-wheels/ 27 | *.egg-info/ 28 | .installed.cfg 29 | *.egg 30 | MANIFEST 31 | 32 | # PyInstaller 33 | # Usually these files are written by a python script from a template 34 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 35 | *.manifest 36 | *.spec 37 | 38 | # Installer logs 39 | pip-log.txt 40 | pip-delete-this-directory.txt 41 | 42 | # Unit test / coverage reports 43 | htmlcov/ 44 | .tox/ 45 | .nox/ 46 | .coverage 47 | .coverage.* 48 | .cache 49 | nosetests.xml 50 | coverage.xml 51 | *.cover 52 | *.py,cover 53 | .hypothesis/ 54 | .pytest_cache/ 55 | cover/ 56 | 57 | # Translations 58 | *.mo 59 | *.pot 60 | 61 | # Django stuff: 62 | *.log 63 | local_settings.py 64 | db.sqlite3 65 | db.sqlite3-journal 66 | 67 | # Flask stuff: 68 | instance/ 69 | .webassets-cache 70 | 71 | # Scrapy stuff: 72 | .scrapy 73 | 74 | # Sphinx documentation 75 | docs/_build/ 76 | 77 | # PyBuilder 78 | .pybuilder/ 79 | target/ 80 | 81 | # Jupyter Notebook 82 | .ipynb_checkpoints 83 | 84 | # IPython 85 | profile_default/ 86 | ipython_config.py 87 | 88 | # pyenv 89 | # For a library or package, you might want to ignore these files since the code is 90 | # intended to run in multiple environments; otherwise, check them in: 91 | # .python-version 92 | 93 | # pipenv 94 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 95 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 96 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 97 | # install all needed dependencies. 98 | #Pipfile.lock 99 | 100 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 101 | __pypackages__/ 102 | 103 | # Celery stuff 104 | celerybeat-schedule 105 | celerybeat.pid 106 | 107 | # SageMath parsed files 108 | *.sage.py 109 | 110 | # Environments 111 | .env 112 | .venv 113 | env/ 114 | venv/ 115 | ENV/ 116 | env.bak/ 117 | venv.bak/ 118 | 119 | # Spyder project settings 120 | .spyderproject 121 | .spyproject 122 | 123 | # Rope project settings 124 | .ropeproject 125 | 126 | # mkdocs documentation 127 | /site 128 | 129 | # mypy 130 | .mypy_cache/ 131 | .dmypy.json 132 | dmypy.json 133 | 134 | # Pyre type checker 135 | .pyre/ 136 | 137 | # pytype static type analyzer 138 | .pytype/ 139 | 140 | # Cython debug symbols 141 | cython_debug/ 142 | 143 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider 144 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 145 | 146 | # User-specific stuff 147 | .idea/**/workspace.xml 148 | .idea/**/tasks.xml 149 | .idea/**/usage.statistics.xml 150 | .idea/**/dictionaries 151 | .idea/**/shelf 152 | 153 | # Generated files 154 | .idea/**/contentModel.xml 155 | 156 | # Sensitive or high-churn files 157 | .idea/**/dataSources/ 158 | .idea/**/dataSources.ids 159 | .idea/**/dataSources.local.xml 160 | .idea/**/sqlDataSources.xml 161 | .idea/**/dynamic.xml 162 | .idea/**/uiDesigner.xml 163 | .idea/**/dbnavigator.xml 164 | 165 | # Gradle 166 | .idea/**/gradle.xml 167 | .idea/**/libraries 168 | 169 | # Gradle and Maven with auto-import 170 | # When using Gradle or Maven with auto-import, you should exclude module files, 171 | # since they will be recreated, and may cause churn. Uncomment if using 172 | # auto-import. 173 | # .idea/artifacts 174 | # .idea/compiler.xml 175 | # .idea/jarRepositories.xml 176 | # .idea/modules.xml 177 | # .idea/*.iml 178 | # .idea/modules 179 | # *.iml 180 | # *.ipr 181 | 182 | # CMake 183 | cmake-build-*/ 184 | 185 | # Mongo Explorer plugin 186 | .idea/**/mongoSettings.xml 187 | 188 | # File-based project format 189 | *.iws 190 | 191 | # IntelliJ 192 | out/ 193 | 194 | # mpeltonen/sbt-idea plugin 195 | .idea_modules/ 196 | 197 | # JIRA plugin 198 | atlassian-ide-plugin.xml 199 | 200 | # Cursive Clojure plugin 201 | .idea/replstate.xml 202 | 203 | # Crashlytics plugin (for Android Studio and IntelliJ) 204 | com_crashlytics_export_strings.xml 205 | crashlytics.properties 206 | crashlytics-build.properties 207 | fabric.properties 208 | 209 | # Editor-based Rest Client 210 | .idea/httpRequests 211 | 212 | poetry.lock -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 2 | Version 2, December 2004 3 | 4 | Copyright (C) 2004 Sam Hocevar 5 | 6 | Everyone is permitted to copy and distribute verbatim or modified 7 | copies of this license document, and changing it is allowed as long 8 | as the name is changed. 9 | 10 | DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 11 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 12 | 13 | 0. You just DO WHAT THE FUCK YOU WANT TO. 14 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | Dump of a script I wrote to run through an open directory (typically found on /r/opendirectories) and 2 | 3 | * Extract the movie name, year and resolution 4 | * Run it through http://www.omdbapi.com/ to fetch all details (director, genres, IMDB rating, ...) 5 | * Save it to a https://typesense.org/ node so that the movies are searchable. The front-end for that is at https://github.com/LaundroMat/odMovieSearch 6 | 7 | Usage: 8 | 9 | Install dependencies with poetry. 10 | 11 | I typically use a Jupyter notebook to run things. In `Reddit - Opendirectory scraper.ipynb` there are a few scripts to muck around with things. 12 | 13 | The easiest way to scrape a directory is with the first script in the above mentioned notebook. 14 | 15 | * First, you'll need to get or generate a .txt file with all files found on the server with https://github.com/KoalaBear84/OpenDirectoryDownloader (/user/KoalaBear84/ typically provides these in the comments of an OD post on reddit too) 16 | * `main.parse_txt()` extracts the movie name for each file and runs it through OMDB 17 | * `main.output_movies()` saves the movies as a markup file, ordered by IMDB rating 18 | * `main.index_single_movie()` saves each movie to the typesense index. 19 | 20 | This code is provided as-is. Do with it what you want. If you need support, open an issue, but I can't guarantee I'll be able to help. -------------------------------------------------------------------------------- /Reddit - Opendirectory scraper.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "tags": [ 8 | "outputPrepend" 9 | ] 10 | }, 11 | "outputs": [ 12 | { 13 | "name": "stderr", 14 | "output_type": "stream", 15 | "text": [ 16 | "2021-01-31 19:28:32.194 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', '2 Fast 2 Furious'), ('year', 2003), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 17 | "2021-01-31 19:28:32.540 | WARNING | main:fetch_movie_data:139 - Movie not found: https://easy-movie.com.au/cdn/A.Giant.Jack.Christmas.2020.1080p.mp4\n", 18 | "2021-01-31 19:28:32.897 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Alita Battle Angel'), ('year', 2019), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 19 | "2021-01-31 19:28:33.289 | WARNING | main:fetch_movie_data:188 - MatchesDict([('release_group', 'Ant'), ('title', 'Man And The Wasp'), ('year', 2018), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 20 | "2021-01-31 19:28:33.663 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Aquaman'), ('year', 2018), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AM'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 21 | "2021-01-31 19:28:33.888 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Army Of One'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 22 | "2021-01-31 19:28:34.239 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Arrival'), ('year', 2016), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 23 | "2021-01-31 19:28:34.595 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', \"Assassin's Creed\"), ('year', 2016), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 24 | "2021-01-31 19:28:34.956 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Asylum Twisted Horror And Fantasy Tales'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 25 | "2021-01-31 19:28:35.293 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Avengers Endgame'), ('year', 2019), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.LT'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 26 | "2021-01-31 19:28:35.658 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Avengers Infinity War'), ('year', 2018), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AM'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 27 | "2021-01-31 19:28:35.905 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Baby Driver'), ('year', 2017), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 28 | "2021-01-31 19:28:36.281 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Back To The Future'), ('year', 1985), ('screen_size', '2160p'), ('container', 'mkv'), ('mimetype', 'video/x-matroska'), ('type', 'movie')])\n", 29 | "2021-01-31 19:28:36.613 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Bad Boys For Life'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 30 | "2021-01-31 19:28:36.969 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Beast Mode'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 31 | "2021-01-31 19:28:37.315 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Beauty And The Beast'), ('year', 2017), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 32 | "2021-01-31 19:28:37.665 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Big Hero 6'), ('year', 2014), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YIFY'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 33 | "2021-01-31 19:28:38.004 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Bigfoot Family'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 34 | "2021-01-31 19:28:38.350 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Black Panther'), ('year', 2018), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AM'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 35 | "2021-01-31 19:28:38.694 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Bloodshot'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 36 | "2021-01-31 19:28:39.036 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Borat Subsequent Moviefilm'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 37 | "2021-01-31 19:28:39.398 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Bumblebee'), ('year', 2018), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 38 | "2021-01-31 19:28:39.754 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Captain America Civil War'), ('year', 2016), ('screen_size', '2160p'), ('source', 'Ultra HD Blu-ray'), ('video_codec', 'H.265'), ('color_depth', '10-bit'), ('audio_codec', 'AAC'), ('audio_channels', '5.1'), ('release_group', 'YTS.MX'), ('container', 'mkv'), ('mimetype', 'video/x-matroska'), ('type', 'movie')])\n", 39 | "2021-01-31 19:28:40.117 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Captain America The Winter Soldier'), ('year', 2014), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YIFY'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 40 | "2021-01-31 19:28:40.450 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Captain Marvel'), ('year', 2019), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AM'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 41 | "2021-01-31 19:28:40.766 | WARNING | main:fetch_movie_data:139 - Movie not found: https://easy-movie.com.au/cdn/cdndemo.mp4\n", 42 | "2021-01-31 19:28:43.627 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Chasing Christmas'), ('year', 2005), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 43 | "2021-01-31 19:28:43.985 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Completely Unrehearsed Last Minute Pandemic Holiday Special'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 44 | "2021-01-31 19:28:44.371 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Creed'), ('year', 2015), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 45 | "2021-01-31 19:28:44.712 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Cyber Bride'), ('year', 2019), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 46 | "2021-01-31 19:28:45.045 | WARNING | main:fetch_movie_data:139 - Movie not found: https://easy-movie.com.au/cdn/dayz-bags.mp4\n", 47 | "2021-01-31 19:28:45.391 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Deadpool 2'), ('year', 2018), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 48 | "2021-01-31 19:28:45.733 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Deadpool'), ('year', 2016), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 49 | "2021-01-31 19:28:46.125 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Deathstroke Knights Dragons'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n" 50 | ] 51 | }, 52 | { 53 | "name": "stderr", 54 | "output_type": "stream", 55 | "text": [ 56 | "2021-01-31 19:28:46.126 | WARNING | main:parse_txt:231 - Found Deathstroke: Knights & Dragons but no year found for https://easy-movie.com.au/cdn/Deathstroke.Knights.Dragons.2020.1080p.mp4\n", 57 | "2021-01-31 19:28:46.508 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Deep Blue Sea 3'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 58 | "2021-01-31 19:28:46.847 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Deepwater Horizon'), ('year', 2016), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 59 | "2021-01-31 19:28:47.201 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Den Of Thieves'), ('year', 2018), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AM'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 60 | "2021-01-31 19:28:47.538 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Deported'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 61 | "2021-01-31 19:28:47.875 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Doctor Strange'), ('year', 2016), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 62 | "2021-01-31 19:28:48.212 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Dom And Adrian 2020'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 63 | "2021-01-31 19:28:48.554 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Downhill'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 64 | "2021-01-31 19:28:48.786 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Dune Drifter'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 65 | "2021-01-31 19:28:49.119 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Escape From Pretoria'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 66 | "2021-01-31 19:28:49.451 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Extraction'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 67 | "2021-01-31 19:28:49.803 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Fantastic Beasts And Where To Find Them'), ('year', 2016), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 68 | "2021-01-31 19:28:50.172 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Fantastic Beasts The Crimes Of Grindelwald'), ('year', 2018), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AM'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 69 | "2021-01-31 19:28:50.524 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Fantasy Island'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 70 | "2021-01-31 19:28:50.862 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Fast & Furious Presents Hobbs & Shaw'), ('year', 2019), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.LT'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 71 | "2021-01-31 19:28:51.093 | WARNING | main:fetch_movie_data:139 - Movie not found: https://easy-movie.com.au/cdn/Fast.and.Furious.2009.1080p.mp4\n", 72 | "2021-01-31 19:28:51.449 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Fast Five'), ('year', 2011), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 73 | "2021-01-31 19:28:51.794 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Fatman'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 74 | "2021-01-31 19:28:52.146 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Furious 6'), ('year', 2013), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 75 | "2021-01-31 19:28:52.397 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Game Night'), ('year', 2018), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AM'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 76 | "2021-01-31 19:28:52.743 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Ghost In The Shell'), ('year', 2017), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 77 | "2021-01-31 19:28:53.096 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Godzilla King Of The Monsters'), ('year', 2019), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 78 | "2021-01-31 19:28:53.436 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Guardians of the Galaxy'), ('year', 2014), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 79 | "2021-01-31 19:28:53.784 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Guardians Of The Galaxy Vol 2'), ('year', 2017), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 80 | "2021-01-31 19:28:54.106 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Hacksaw Ridge'), ('year', 2016), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 81 | "2021-01-31 19:28:54.486 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Hard Kill'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 82 | "2021-01-31 19:28:54.842 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'High Ground'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 83 | "2021-01-31 19:28:55.063 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Honest Thief'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 84 | "2021-01-31 19:28:55.452 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Inferno'), ('year', 2016), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 85 | "2021-01-31 19:28:55.794 | WARNING | main:fetch_movie_data:139 - Movie not found: https://easy-movie.com.au/cdn/Interstellar.2014.2014.1080p.mp4\n", 86 | "2021-01-31 19:28:56.179 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Jack Reacher Never Go Back'), ('year', 2016), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 87 | "2021-01-31 19:28:56.557 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'John Wick'), ('year', 2014), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 88 | "2021-01-31 19:28:56.792 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'John Wick Chapter 3'), ('alternative_title', 'Parabellum'), ('year', 2019), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.LT'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n" 89 | ] 90 | }, 91 | { 92 | "name": "stderr", 93 | "output_type": "stream", 94 | "text": [ 95 | "2021-01-31 19:28:57.148 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Johnny English Strikes Again'), ('year', 2018), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AM'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 96 | "2021-01-31 19:28:57.492 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Joker'), ('year', 2019), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 97 | "2021-01-31 19:28:57.852 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Jumanji The Next Level'), ('year', 2019), ('screen_size', '2160p'), ('source', 'Ultra HD Blu-ray'), ('video_codec', 'H.265'), ('color_depth', '10-bit'), ('audio_codec', 'AAC'), ('audio_channels', '7.1'), ('release_group', 'YTS.MX'), ('container', 'mkv'), ('mimetype', 'video/x-matroska'), ('type', 'movie')])\n", 98 | "2021-01-31 19:28:58.193 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Jumanji Welcome To The Jungle'), ('year', 2017), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AM'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 99 | "2021-01-31 19:28:58.524 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Jurassic World Fallen Kingdom'), ('year', 2018), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 100 | "2021-01-31 19:28:58.876 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Justice League'), ('year', 2017), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AM'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 101 | "2021-01-31 19:28:59.222 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Kevin Hart Zero F ks Given'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 102 | "2021-01-31 19:28:59.461 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'King Arthur Legend Of The Sword'), ('year', 2017), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 103 | "2021-01-31 19:28:59.807 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Kingsman The Golden Circle'), ('year', 2017), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 104 | "2021-01-31 19:29:00.174 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Knuckledust'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 105 | "2021-01-31 19:29:00.666 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Kong Skull Island'), ('year', 2017), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 106 | "2021-01-31 19:29:01.077 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Legacy Of Lies'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 107 | "2021-01-31 19:29:01.417 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Logan'), ('year', 2017), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 108 | "2021-01-31 19:29:01.657 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Lost At Christmas'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 109 | "2021-01-31 19:29:02.001 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Love And Monsters'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 110 | "2021-01-31 19:29:02.364 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Maze Runner The Death Cure'), ('year', 2018), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 111 | "2021-01-31 19:29:02.724 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Mile 22'), ('year', 2018), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AM'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 112 | "2021-01-31 19:29:02.943 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Minions Holiday Special'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 113 | "2021-01-31 19:29:03.300 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Monsters Of Man'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 114 | "2021-01-31 19:29:03.522 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Mortal Engines'), ('year', 2018), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AM'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 115 | "2021-01-31 19:29:03.865 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Mulan'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 116 | "2021-01-31 19:29:04.247 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Our First Christmas'), ('year', 2008), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 117 | "2021-01-31 19:29:04.578 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Pacific Rim Uprising'), ('year', 2018), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 118 | "2021-01-31 19:29:04.910 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Passengers'), ('year', 2016), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 119 | "2021-01-31 19:29:05.271 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Price Of Love'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 120 | "2021-01-31 19:29:05.623 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Project Power'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 121 | "2021-01-31 19:29:05.959 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Rampage'), ('year', 2018), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AM'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 122 | "2021-01-31 19:29:06.192 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Ready Player One'), ('year', 2018), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 123 | "2021-01-31 19:29:06.552 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Rogue One'), ('year', 2016), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 124 | "2021-01-31 19:29:06.905 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Safety'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 125 | "2021-01-31 19:29:07.151 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Sicario Day Of The Soldado'), ('year', 2018), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AM'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 126 | "2021-01-31 19:29:07.488 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Simulation Theory Film'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 127 | "2021-01-31 19:29:07.859 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Skylines'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n" 128 | ] 129 | }, 130 | { 131 | "name": "stderr", 132 | "output_type": "stream", 133 | "text": [ 134 | "2021-01-31 19:29:08.087 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Songbird'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 135 | "2021-01-31 19:29:08.453 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Spare Parts'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 136 | "2021-01-31 19:29:08.784 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Spenser Confidential'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 137 | "2021-01-31 19:29:09.073 | WARNING | main:fetch_movie_data:188 - MatchesDict([('release_group', 'Spider'), ('title', 'Man Far From Home'), ('year', 2019), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 138 | "2021-01-31 19:29:09.413 | WARNING | main:fetch_movie_data:188 - MatchesDict([('release_group', 'Spider'), ('title', 'Man Homecoming'), ('year', 2017), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 139 | "2021-01-31 19:29:09.766 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Spider-Man Into The Spider-Verse'), ('year', 2018), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AM'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 140 | "2021-01-31 19:29:10.108 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Split'), ('year', 2016), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 141 | "2021-01-31 19:29:10.458 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Star Wars Episode VII'), ('alternative_title', 'The Force Awakens'), ('year', 2015), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 142 | "2021-01-31 19:29:10.793 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Suicide Squad'), ('year', 2016), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 143 | "2021-01-31 19:29:11.138 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Sully'), ('year', 2016), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 144 | "2021-01-31 19:29:11.473 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Superhuman The Invisible Made Visible'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 145 | "2021-01-31 19:29:11.736 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Survive The Night'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 146 | "2021-01-31 19:29:12.096 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Tenet'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 147 | "2021-01-31 19:29:12.508 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Terminator Dark Fate'), ('year', 2019), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 148 | "2021-01-31 19:29:12.861 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'The 2nd'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 149 | "2021-01-31 19:29:13.382 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'The 5th Wave'), ('year', 2016), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 150 | "2021-01-31 19:29:13.647 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'The Accountant'), ('year', 2016), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 151 | "2021-01-31 19:29:14.139 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'The Call Of The Wild'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 152 | "2021-01-31 19:29:14.374 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'The Dark Knight'), ('year', 2008), ('screen_size', '2160p'), ('source', 'Ultra HD Blu-ray'), ('video_codec', 'H.265'), ('color_depth', '10-bit'), ('audio_codec', 'AAC'), ('audio_channels', '5.1'), ('release_group', 'YTS.MX'), ('container', 'mkv'), ('mimetype', 'video/x-matroska'), ('type', 'movie')])\n", 153 | "2021-01-31 19:29:14.730 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'The Equalizer 2'), ('year', 2018), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AM'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 154 | "2021-01-31 19:29:15.082 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'The Fast and the Furious'), ('year', 2001), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 155 | "2021-01-31 19:29:15.444 | WARNING | main:fetch_movie_data:139 - Movie not found: https://easy-movie.com.au/cdn/The.Fast.and.the.Furious.Tokyo.Drift.2011.1080p.BrRip.x264.YIFY.mp4\n", 156 | "2021-01-31 19:29:15.784 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'The Foreigner'), ('year', 2017), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 157 | "2021-01-31 19:29:16.142 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'The Great Wall'), ('year', 2016), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 158 | "2021-01-31 19:29:16.504 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'The Hobbit The Battle of the Five Armies'), ('year', 2014), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YIFY'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 159 | "2021-01-31 19:29:16.859 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'The Hunger Games Mockingjay'), ('part', 2), ('year', 2015), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 160 | "2021-01-31 19:29:17.218 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'The Hunger Games Mockingjay'), ('part', 1), ('year', 2014), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YIFY'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 161 | "2021-01-31 19:29:17.489 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'The Invisible Man'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 162 | "2021-01-31 19:29:17.852 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'The Magnificent Seven'), ('year', 2016), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 163 | "2021-01-31 19:29:18.095 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'The Meg'), ('year', 2018), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 164 | "2021-01-31 19:29:18.369 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'The Old Guard'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n" 165 | ] 166 | }, 167 | { 168 | "name": "stderr", 169 | "output_type": "stream", 170 | "text": [ 171 | "2021-01-31 19:29:18.747 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'The Revenant'), ('year', 2015), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 172 | "2021-01-31 19:29:19.126 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'The War With Grandpa'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 173 | "2021-01-31 19:29:19.477 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'The Wolf of Wall Street'), ('year', 2013), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YIFY'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 174 | "2021-01-31 19:29:19.822 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'The Wrong Trousers'), ('year', 1993), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 175 | "2021-01-31 19:29:20.162 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Thor Ragnarok'), ('year', 2017), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AM'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 176 | "2021-01-31 19:29:20.510 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Thor The Dark World'), ('year', 2013), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YIFY'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 177 | "2021-01-31 19:29:20.889 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Top Gear'), ('year', 2002), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 178 | "2021-01-31 19:29:20.890 | WARNING | main:parse_txt:231 - Found Top Gear but no year found for https://easy-movie.com.au/cdn/Top.Gear.2002.1080p.mp4\n", 179 | "2021-01-31 19:29:21.225 | WARNING | main:fetch_movie_data:139 - Movie not found: https://easy-movie.com.au/cdn/Top.Gear.Africa.Special.mp4\n", 180 | "2021-01-31 19:29:21.613 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Toy Story'), ('year', 1995), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 181 | "2021-01-31 19:29:21.970 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Toy Story 2'), ('year', 1999), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 182 | "2021-01-31 19:29:22.326 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Toy Story 3'), ('year', 2010), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 183 | "2021-01-31 19:29:22.675 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Transformers The Last Knight'), ('year', 2017), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 184 | "2021-01-31 19:29:23.014 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Underwater'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 185 | "2021-01-31 19:29:23.393 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Unhinged'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 186 | "2021-01-31 19:29:23.781 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Venom'), ('year', 2018), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AM'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 187 | "2021-01-31 19:29:24.160 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Wander'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 188 | "2021-01-31 19:29:24.385 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'War For The Planet Of The Apes'), ('year', 2017), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 189 | "2021-01-31 19:29:24.730 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Wonder Woman'), ('year', 2017), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 190 | "2021-01-31 19:29:25.090 | WARNING | main:fetch_movie_data:188 - MatchesDict([('other', 'XXX'), ('title', 'Return Of Xander Cage'), ('year', 2017), ('screen_size', '1080p'), ('source', 'Blu-ray'), ('video_codec', 'H.264'), ('release_group', 'YTS.AG'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 191 | "2021-01-31 19:29:25.438 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'You Should Have Left'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n", 192 | "2021-01-31 19:29:25.801 | WARNING | main:fetch_movie_data:188 - MatchesDict([('title', 'Zappa'), ('year', 2020), ('screen_size', '1080p'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n" 193 | ] 194 | } 195 | ], 196 | "source": [ 197 | "# Import from a file made by koalabot\n", 198 | "\n", 199 | "import main\n", 200 | "open_directory_url = 'https://easy-movie.com.au/cdn/'\n", 201 | "reddit_post = 'https://www.reddit.com/r/opendirectories/comments/l9d1e7/small_but_fast_open_directory_with_movies_and/'\n", 202 | "fn = 'https___easy-movie.com.au_cdn_.txt'\n", 203 | "movies = [movie for movie in main.parse_txt(f'./urls/{fn}', exclude_substr=\".trailer.\") if movie]\n", 204 | "main.output_movies(movies)\n", 205 | "for movie in movies:\n", 206 | " main.index_single_movie(movie, open_directory_url, reddit_post)\n" 207 | ] 208 | }, 209 | { 210 | "cell_type": "code", 211 | "execution_count": 2, 212 | "metadata": {}, 213 | "outputs": [ 214 | { 215 | "data": { 216 | "text/plain": [ 217 | "144" 218 | ] 219 | }, 220 | "execution_count": 2, 221 | "metadata": {}, 222 | "output_type": "execute_result" 223 | } 224 | ], 225 | "source": [ 226 | "len(movies)\n", 227 | "\n" 228 | ] 229 | }, 230 | { 231 | "cell_type": "code", 232 | "execution_count": 22, 233 | "metadata": {}, 234 | "outputs": [ 235 | { 236 | "name": "stdout", 237 | "output_type": "stream", 238 | "text": [ 239 | "True\n" 240 | ] 241 | } 242 | ], 243 | "source": [ 244 | "from main import MovieSchema\n", 245 | "import marshmallow as ma\n", 246 | "try:\n", 247 | " movie = MovieSchema().load({'imdb_rating': \"a\"})\n", 248 | "except ma.ValidationError as e:\n", 249 | " print('imdb_rating' in e.messages)\n" 250 | ] 251 | }, 252 | { 253 | "cell_type": "code", 254 | "execution_count": null, 255 | "metadata": { 256 | "tags": [ 257 | "outputPrepend" 258 | ] 259 | }, 260 | "outputs": [], 261 | "source": [ 262 | "import main\n", 263 | "from loguru import logger\n", 264 | "import arrow\n", 265 | "\n", 266 | "\n", 267 | "sources = [\n", 268 | " # {\n", 269 | " # 'd': 'http://107.178.10.182:8800/',\n", 270 | " # 'r': 'https://www.reddit.com/r/opendirectories/comments/kd590f/pretty_good_collection_of_movies_pretty_slow/'\n", 271 | " # },\n", 272 | " # {\n", 273 | " # 'd': 'http://5.189.155.154/',\n", 274 | " # 'r': 'https://www.reddit.com/r/opendirectories/comments/kd67ig/just_about_everything_with_good_download_speed/'\n", 275 | " # },\n", 276 | " # {\n", 277 | " # 'd': 'http://90.253.151.193:8800/',\n", 278 | " # 'r': 'https://www.reddit.com/r/opendirectories/comments/kd6obo/over_2tb_of_movies_series_well_organized_and/'\n", 279 | " # },\n", 280 | " # {\n", 281 | " # 'd': 'https://209.141.42.78/',\n", 282 | " # 'r': 'https://www.reddit.com/r/opendirectories/comments/kd6cjf/700gb_of_tv_anime_movies_porn_good_quality_and/'\n", 283 | " # },\n", 284 | " # {\n", 285 | " # 'd': 'http://185.191.78.214/',\n", 286 | " # 'r': 'https://www.reddit.com/r/opendirectories/comments/kcs28h/http18519178214/'\n", 287 | " # },\n", 288 | " # {\n", 289 | " # 'd': 'http://37.187.115.51/',\n", 290 | " # 'r': 'https://www.reddit.com/r/opendirectories/comments/kejqqt/cult_porn_cultporn_and_vanilla/'\n", 291 | " # },\n", 292 | "# {\n", 293 | "# 'd': 'http://anilist1.ir/Movie/',\n", 294 | "# 'r': 'https://www.reddit.com/r/opendirectories/comments/j6onol/2020_movies_some_maybe_of_2019/'\n", 295 | "# },\n", 296 | " {\n", 297 | " 'd': 'https://easy-movie.com.au/cdn/',\n", 298 | " 'r': 'https://www.reddit.com/r/opendirectories/comments/kqy6id/some_1080p_movies/'\n", 299 | " }\n", 300 | "]\n", 301 | "\n", 302 | "movies = []\n", 303 | "\n", 304 | "for source in sources:\n", 305 | " for movie in main.parse_html_directory(source['d']):\n", 306 | " if movie:\n", 307 | " movies.append(movie)\n", 308 | " try:\n", 309 | " main.index_single_movie(movie, open_directory_url=source['d'], reddit_source=source['r'])\n", 310 | " except Exception as e:\n", 311 | " logger.error(f'Error {e} encountered with {movie}')\n", 312 | " main.output_movies(movies, fn=f'{arrow.now().timestamp}.md')\n", 313 | " print(len(movies))" 314 | ] 315 | }, 316 | { 317 | "cell_type": "code", 318 | "execution_count": null, 319 | "metadata": {}, 320 | "outputs": [], 321 | "source": [ 322 | "from main import output_movies\n", 323 | "output_movies(movies, fn=\"easy-movie.com.au\")\n" 324 | ] 325 | }, 326 | { 327 | "cell_type": "code", 328 | "execution_count": null, 329 | "metadata": { 330 | "scrolled": true 331 | }, 332 | "outputs": [], 333 | "source": [ 334 | "def sort_by_rating(movies):\n", 335 | " print(\"|Title|IMDB rating|\\n| ------------ | ------------ |\")\n", 336 | " sorted_by_rating = sorted(movies, key=lambda m: m.get('imdbRating', 'N/A'), reverse=True)\n", 337 | " for m in [m for m in sorted_by_rating if m.get('imdbRating', 'N/A') != 'N/A'][:25]:\n", 338 | " if (m.get('Title') and m.get('imdbRating', 'N/A') != 'N/A'):\n", 339 | " print(f\"|[{m['Title']}]({m['fileUrl']}) ({m['Year']}, {m['Director']}) {m['Genre']} | [{m['imdbRating']}]({m['imdbUrl']})\")\n", 340 | "\n", 341 | "sort_by_rating(movie_data)\n" 342 | ] 343 | }, 344 | { 345 | "cell_type": "code", 346 | "execution_count": 5, 347 | "metadata": {}, 348 | "outputs": [ 349 | { 350 | "data": { 351 | "text/plain": [ 352 | "{'created_at': 1608043772,\n", 353 | " 'default_sorting_field': 'imdb_rating',\n", 354 | " 'fields': [{'facet': False,\n", 355 | " 'name': 'id',\n", 356 | " 'optional': False,\n", 357 | " 'type': 'string'},\n", 358 | " {'facet': True, 'name': 'source_post', 'optional': False, 'type': 'string'},\n", 359 | " {'facet': True,\n", 360 | " 'name': 'directory_url',\n", 361 | " 'optional': False,\n", 362 | " 'type': 'string'},\n", 363 | " {'facet': True, 'name': 'screen_size', 'optional': True, 'type': 'string'},\n", 364 | " {'facet': False, 'name': 'imdb_id', 'optional': False, 'type': 'string'},\n", 365 | " {'facet': False, 'name': 'title', 'optional': False, 'type': 'string'},\n", 366 | " {'facet': False, 'name': 'imdb_rating', 'optional': False, 'type': 'float'},\n", 367 | " {'facet': True, 'name': 'year', 'optional': True, 'type': 'int32'},\n", 368 | " {'facet': True, 'name': 'genres', 'optional': False, 'type': 'string[]'},\n", 369 | " {'facet': True, 'name': 'director', 'optional': False, 'type': 'string'},\n", 370 | " {'facet': False, 'name': 'imdb_url', 'optional': False, 'type': 'string'},\n", 371 | " {'facet': True, 'name': 'language', 'optional': True, 'type': 'string'},\n", 372 | " {'facet': False, 'name': 'last_seen', 'optional': False, 'type': 'int64'}],\n", 373 | " 'name': 'movies',\n", 374 | " 'num_documents': 13248,\n", 375 | " 'num_memory_shards': 4}" 376 | ] 377 | }, 378 | "execution_count": 5, 379 | "metadata": {}, 380 | "output_type": "execute_result" 381 | } 382 | ], 383 | "source": [ 384 | "from main import typesense_client\n", 385 | "typesense_client.collections['movies'].retrieve()" 386 | ] 387 | }, 388 | { 389 | "cell_type": "code", 390 | "execution_count": null, 391 | "metadata": {}, 392 | "outputs": [], 393 | "source": [ 394 | "def output_movies(movies, fn=None, sort_by=\"rating\"):\n", 395 | " fn = fn if fn else 'movies.md'\n", 396 | " header = \"|Title|IMDB rating|\\n| ------------ | ------------ |\\n\"\n", 397 | " with open(fn, 'w') as f:\n", 398 | " f.write(header)\n", 399 | " for movie in movies:\n", 400 | " if movie.get('title'):\n", 401 | " # try:\n", 402 | " line_to_add = f\"\"\"|[{movie['title']}]({movie['file_url']}) ({movie['year']}, {movie['director']}) {\", \".join(movie['genres'])} | [{movie['imdb_rating']}]({movie['imdb_url']})\"\"\"\n", 403 | " # line_to_add = f\"|**{omdb_data['Title']}** ({omdb_data['Year']}, {omdb_data['Director']}) [💾]({omdb_data['file_url']}) | [{omdb_data['imdbRating']}]({omdb_data['imdbUrl']}) \"\n", 404 | " # except (KeyError, ValueError):\n", 405 | " # line_to_add = f\"|{movie['file_url']} | [💾]({movie['file_url']}) |\"\n", 406 | " else:\n", 407 | " line_to_add = f\"|{movie['file_url']} | [💾]({movie['file_url']}) |\"\n", 408 | "\n", 409 | " f.write(f'{line_to_add}\\n')\n", 410 | "\n", 411 | "output_movies(movies)" 412 | ] 413 | }, 414 | { 415 | "cell_type": "code", 416 | "execution_count": null, 417 | "metadata": {}, 418 | "outputs": [], 419 | "source": [ 420 | "from main import typesense_client\n", 421 | "idx = 0\n", 422 | "for movie in movies:\n", 423 | " movie['directory_url'] = 'https://easy-movie.com.au/cdn/'\n", 424 | " movie['source_post'] = 'https://www.reddit.com/r/opendirectories/comments/kihwdd/4_hdds_worth_of_hollywood_and_foreign_movies/'\n", 425 | " if not isinstance(movie.get('language', None), str):\n", 426 | " try:\n", 427 | " movie['language'] = ','.join([language.alpha3 for language in movie.get('language')]) if movie.get('language') else ''\n", 428 | " except TypeError: # Not iterable, so single language\n", 429 | " movie['language'] = movie.get('language').alpha3 if movie.get('language') else ''\n", 430 | " typesense_client.collections['movies'].documents.upsert(movie)\n", 431 | " print(idx)\n", 432 | " idx+=1\n", 433 | "\n" 434 | ] 435 | }, 436 | { 437 | "cell_type": "code", 438 | "execution_count": 33, 439 | "metadata": {}, 440 | "outputs": [ 441 | { 442 | "name": "stdout", 443 | "output_type": "stream", 444 | "text": [ 445 | "['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']\n", 446 | "1\n", 447 | "{'document': {'director': 'Chris Sanders', 'directory_url': 'http://103.214.156.1/movies/', 'file_url': 'http://103.214.156.1/movies/others/korean/Call%20(2020)/Call.2020.720p.WEBRip.x264.AAC-%5BYTS.MX%5D.mp4', 'genres': ['Adventure', 'Drama', 'Family'], 'id': 'http://103.214.156.1/movies/others/korean/Call (2020)/Call.2020.720p.WEBRip.x264.AAC-[YTS.MX].mp4', 'imdb_id': 'tt7504726', 'imdb_rating': 6.8, 'imdb_url': 'https://www.imdb.com/title/tt7504726/reference', 'language': '', 'last_seen': 1611409786, 'screen_size': '720p', 'source_post': 'https://www.reddit.com/r/opendirectories/comments/l35yng/movies_2018_2020_korean_movies_some_tv_shows_kids/', 'title': 'The Call of the Wild', 'year': 2020}, 'highlights': [{'field': 'title', 'matched_tokens': ['The', 'Call', 'of', 'the', 'Wild'], 'snippet': 'The Call of the Wild'}], 'text_match': 83845476}\n" 448 | ] 449 | } 450 | ], 451 | "source": [ 452 | "from main import typesense_client\n", 453 | "import requests\n", 454 | "q = {\n", 455 | " 'q': 'Call of the Wild',\n", 456 | " 'query_by': 'title',\n", 457 | " 'filter_by': 'directory_url:=http://103.214.156.1/movies/ && director:=Chris Sanders',\n", 458 | " 'max_hits': 'all',\n", 459 | " 'per_page': 250,\n", 460 | " 'num_typos': 0\n", 461 | "}\n", 462 | "idx = 0\n", 463 | "result = typesense_client.collections['movies'].documents.search(q)\n", 464 | "print(dir(result))\n", 465 | "print(result['found'])\n", 466 | "for hit in result['hits']:\n", 467 | " print(hit)\n", 468 | "\n" 469 | ] 470 | }, 471 | { 472 | "cell_type": "code", 473 | "execution_count": null, 474 | "metadata": { 475 | "tags": [] 476 | }, 477 | "outputs": [], 478 | "source": [ 479 | "import mimetypes, requests, difflib\n", 480 | "with open('./urls/http___37.187.115.51_.txt', 'r') as f:\n", 481 | " r = f.readline()\n", 482 | " while r:\n", 483 | " # if 'http://37.187.115.51/Lost.Place.2013.GERMAN.1080p.BluRay.H264.AAC-VXT/Lost.Place.2013.GERMAN.1080p.BluRay.H264.AAC-VXT.mp4' in r:\n", 484 | " # print(difflib.ndiff(r, 'http://37.187.115.51/Lost.Place.2013.GERMAN.1080p.BluRay.H264.AAC-VXT/Lost.Place.2013.GERMAN.1080p.BluRay.H264.AAC-VXT.mp4')) \n", 485 | " filetype, _ = mimetypes.guess_type(r.strip())\n", 486 | " print(filetype)\n", 487 | " r = f.readline()\n", 488 | "\n", 489 | "# print(mimetypes.guess_type('http://37.187.115.51/Lost.Place.2013.GERMAN.1080p.BluRay.H264.AAC-VXT/Lost.Place.2013.GERMAN.1080p.BluRay.H264.AAC-VXT.mp4'))\n" 490 | ] 491 | }, 492 | { 493 | "cell_type": "code", 494 | "execution_count": 3, 495 | "metadata": {}, 496 | "outputs": [ 497 | { 498 | "ename": "AttributeError", 499 | "evalue": "'Documents' object has no attribute 'delete'", 500 | "output_type": "error", 501 | "traceback": [ 502 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 503 | "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", 504 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mcollection\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtypesense_client\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcollections\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'movies'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0mtypesense_client\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcollections\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'movies'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdocuments\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdelete\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;34m'filter_by'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m'directory_url:https://easy-movie.com.au/cdn/'\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 12\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;31m# result = typesense_client.collections['movies'].documents.search(q)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 505 | "\u001b[0;31mAttributeError\u001b[0m: 'Documents' object has no attribute 'delete'" 506 | ] 507 | } 508 | ], 509 | "source": [ 510 | "# Delete movies\n", 511 | "from main import typesense_client\n", 512 | "q = {\n", 513 | " 'q': 'http://cdn.s-flix.live/',\n", 514 | " 'query_by': 'directory_url',\n", 515 | " 'max_hits': 'all',\n", 516 | " 'per_page': 250\n", 517 | "}\n", 518 | "\n", 519 | "collection = typesense_client.collections['movies']\n", 520 | "typesense_client.collections['movies'].documents.delete({'filter_by': 'directory_url:https://easy-movie.com.au/cdn/'})\n", 521 | "\n", 522 | "# result = typesense_client.collections['movies'].documents.search(q)\n", 523 | "# for hit in result['hits']:\n", 524 | "# print(hit['document'])\n", 525 | "# client.collections['companies'].documents('124').delete()\n", 526 | "# typesense_client.collections['movies'].documents(hit['document']['id']).delete()" 527 | ] 528 | }, 529 | { 530 | "cell_type": "code", 531 | "execution_count": 48, 532 | "metadata": {}, 533 | "outputs": [ 534 | { 535 | "name": "stdout", 536 | "output_type": "stream", 537 | "text": [ 538 | "MatchesDict([('title', 'Call'), ('year', 2020), ('screen_size', '720p'), ('source', 'Web'), ('other', 'Rip'), ('video_codec', 'H.264'), ('audio_codec', 'AAC'), ('release_group', 'YTS.MX'), ('container', 'mp4'), ('mimetype', 'video/mp4'), ('type', 'movie')])\n" 539 | ] 540 | }, 541 | { 542 | "data": { 543 | "text/plain": [ 544 | "{'director': 'Chung-Hyun Lee',\n", 545 | " 'directory_url': 'http://103.214.156.1/movies/',\n", 546 | " 'file_url': 'http://103.214.156.1/movies/others/korean/Call%20(2020)/Call.2020.720p.WEBRip.x264.AAC-%5BYTS.MX%5D.mp4',\n", 547 | " 'genres': ['Crime', 'Horror', 'Mystery', 'Thriller'],\n", 548 | " 'id': 'http://103.214.156.1/movies/others/korean/Call%20(2020)/Call.2020.720p.WEBRip.x264.AAC-%5BYTS.MX%5D.mp4',\n", 549 | " 'imdb_id': 'tt10530176',\n", 550 | " 'imdb_rating': 7.1,\n", 551 | " 'imdb_url': 'https://www.imdb.com/title/tt10530176/reference',\n", 552 | " 'last_seen': 1611479653,\n", 553 | " 'source_post': 'https://www.reddit.com/r/opendirectories/comments/l35yng/movies_2018_2020_korean_movies_some_tv_shows_kids/',\n", 554 | " 'title': 'The Call'}" 555 | ] 556 | }, 557 | "execution_count": 48, 558 | "metadata": {}, 559 | "output_type": "execute_result" 560 | } 561 | ], 562 | "source": [ 563 | "# Add single movie\n", 564 | "\n", 565 | "from furl import furl\n", 566 | "import urllib\n", 567 | "from main import fetch_movie_data, MovieSchema, typesense_client\n", 568 | "from guessit import guessit\n", 569 | "import arrow\n", 570 | "\n", 571 | "href = 'http://103.214.156.1/movies/others/korean/Call%20(2020)/Call.2020.720p.WEBRip.x264.AAC-%5BYTS.MX%5D.mp4'\n", 572 | "fn = furl(href).path.segments[-1]\n", 573 | "fn = urllib.parse.unquote(fn)\n", 574 | "movie_info = guessit(fn)\n", 575 | "print(movie_info)\n", 576 | "omdb_params = {\n", 577 | " 'apikey': '648496d9',\n", 578 | " 't': 'The Call',\n", 579 | "}\n", 580 | "if movie_info.get('year'):\n", 581 | " omdb_params['y'] = movie_info.get('year')\n", 582 | "\n", 583 | "omdb_data = requests.get(\n", 584 | " 'http://www.omdbapi.com/', params=omdb_params).json()\n", 585 | "\n", 586 | "movie_data = {**omdb_data}\n", 587 | "\n", 588 | "movie = MovieSchema().load(\n", 589 | " {'imdb_rating': movie_data['imdbRating']})\n", 590 | "\n", 591 | "movie = MovieSchema().load(dict(\n", 592 | " id=href,\n", 593 | " imdb_id=movie_data['imdbID'],\n", 594 | " title=movie_data['Title'],\n", 595 | " director=movie_data['Director'],\n", 596 | " file_url=furl(href).url,\n", 597 | " genres=movie_data['Genre'].split(', '),\n", 598 | " imdb_rating=movie_data.get('imdbRating', -1),\n", 599 | " imdb_url=f\"https://www.imdb.com/title/{movie_data['imdbID']}/reference\",\n", 600 | " last_seen=arrow.now().timestamp\n", 601 | "))\n", 602 | "\n", 603 | "movie['source_post'] = 'https://www.reddit.com/r/opendirectories/comments/l35yng/movies_2018_2020_korean_movies_some_tv_shows_kids/'\n", 604 | "movie['directory_url'] = 'http://103.214.156.1/movies/'\n", 605 | "\n", 606 | "typesense_client.collections['movies'].documents.upsert(movie)\n", 607 | "\n" 608 | ] 609 | }, 610 | { 611 | "cell_type": "code", 612 | "execution_count": null, 613 | "metadata": {}, 614 | "outputs": [], 615 | "source": [] 616 | } 617 | ], 618 | "metadata": { 619 | "kernelspec": { 620 | "display_name": "Python 3", 621 | "language": "python", 622 | "name": "python3" 623 | }, 624 | "language_info": { 625 | "codemirror_mode": { 626 | "name": "ipython", 627 | "version": 3 628 | }, 629 | "file_extension": ".py", 630 | "mimetype": "text/x-python", 631 | "name": "python", 632 | "nbconvert_exporter": "python", 633 | "pygments_lexer": "ipython3", 634 | "version": "3.8.5" 635 | } 636 | }, 637 | "nbformat": 4, 638 | "nbformat_minor": 4 639 | } 640 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import main 2 | import requests 3 | import requests 4 | import mimetypes 5 | import re 6 | import arrow 7 | 8 | from guessit import guessit 9 | # if guessit gives issues, try https://github.com/platelminto/parse-torrent-title 10 | import arrow 11 | import sys 12 | from loguru import logger 13 | 14 | from furl import furl 15 | import time 16 | from bs4 import BeautifulSoup 17 | 18 | import marshmallow as ma 19 | 20 | import typesense 21 | 22 | from num2words import num2words 23 | import urllib 24 | import re 25 | import os 26 | 27 | 28 | class OMDBError(Exception): 29 | pass 30 | 31 | 32 | logger.remove() 33 | logger.add(sys.stderr, level="WARNING") 34 | 35 | typesense_movies_schema = { 36 | 'name': 'movies', 37 | 'fields': [ 38 | {'name': 'id', 'type': 'string'}, # same as file url : unique 39 | {'name': 'source_post', 'type': 'string', 'facet': True}, 40 | {'name': 'directory_url', 'type': 'string', 'facet': True}, 41 | {'name': 'screen_size', 'type': 'string', 'facet': True, 'optional': True}, 42 | {'name': 'imdb_id', 'type': 'string'}, 43 | {'name': 'title', 'type': 'string'}, 44 | 45 | {'name': 'imdb_rating', 'type': 'float'}, 46 | {'name': 'year', 'type': 'int32', 'optional': True, 'facet': True}, 47 | 48 | {'name': 'genres', 'type': 'string[]', 'facet': True}, 49 | {'name': 'director', 'type': 'string', 'facet': True}, 50 | {'name': 'imdb_url', 'type': 'string'}, 51 | 52 | {'name': 'language', 'type': 'string', 'facet': True, 53 | 'optional': True}, # TODO: make this an array 54 | 55 | {'name': 'last_seen', 'type': 'int64'} 56 | ], 57 | 'default_sorting_field': 'imdb_rating' 58 | } 59 | 60 | typesense_client = typesense.Client({ 61 | 'nodes': [{ 62 | 'host': 'zcwkae9v3yg17x6sp-1.a1.typesense.net', 63 | 'port': '443', 64 | 'protocol': 'https' 65 | }], 66 | 'api_key': os.getenv("TYPESENSE_API_KEY"), 67 | 'connection_timeout_seconds': 2 68 | }) 69 | 70 | try: 71 | typesense_client.collections.create(typesense_movies_schema) 72 | logger.debug("Created 'movies' collection.") 73 | except typesense.exceptions.ObjectAlreadyExists: 74 | logger.debug("Collection 'movies' already exist.") 75 | 76 | 77 | class MovieSchema(ma.Schema): 78 | id = ma.fields.Str() # based on url 79 | imdb_id = ma.fields.Str() 80 | title = ma.fields.Str() 81 | director = ma.fields.Str() 82 | file_url = ma.fields.URL() 83 | screen_size = ma.fields.Str() 84 | year = ma.fields.Int() 85 | genres = ma.fields.List(ma.fields.Str()) 86 | imdb_rating = ma.fields.Float() # 'N/A' will be -1... 87 | imdb_url = ma.fields.URL() 88 | 89 | last_seen = ma.fields.Int() 90 | 91 | # don't do things like cast etc -- if one day, ppl want to search by actor, first pass by tMDB and then retrieve info by title / id 92 | 93 | 94 | def fetch_movie_data(href, fn): 95 | movie_info = guessit(fn) 96 | 97 | if movie_info['type'] == 'movie': 98 | # first get info from oMDB 99 | omdb_params = { 100 | 'apikey': os.getenv("OMDB_API_KEY"), 101 | 't': movie_info.get('title'), 102 | } 103 | 104 | if movie_info.get('year'): 105 | omdb_params['y'] = movie_info.get('year') 106 | 107 | omdb_data = requests.get( 108 | 'http://www.omdbapi.com/', params=omdb_params).json() 109 | 110 | # params = { 111 | # 'api_key': 'e5b35c2691231b470b566875742d94c9', 112 | # 'query': movie_info.get('title'), 113 | # 'year': movie_info.get('year') 114 | # } 115 | 116 | # try: 117 | # tmdb_data = requests.get('https://api.themoviedb.org/3/search/movie', params=params).json()['results'][0] 118 | # except IndexError: 119 | # # rate limited :( 120 | # omdb_params = { 121 | # 'apikey': '898999fc', 122 | # 't': movie_info.get('title'), 123 | # 'y': movie_info.get('year') 124 | # } 125 | 126 | # # logger.error(f"No results found for {fn} (extracted title ={movie_info.get('title')})") 127 | 128 | # return {'file_url': href} 129 | 130 | # params = {'api_key': params['api_key'], 'append_to_response': 'credits,external_ids'} 131 | # extra_data = requests.get(f'https://api.themoviedb.org/3/movie/{tmdb_data["id"]}', params=params).json() 132 | 133 | # tmdb_data['tmdb_id'] = tmdb_data['id'] 134 | # tmdb_data['imdb_id'] = extra_data['external_ids']['imdb_id'] 135 | 136 | # movie_data = {**tmdb_data, **extra_data} 137 | 138 | if omdb_data.get('Error'): 139 | if omdb_data.get('Error') == "Movie not found!": 140 | logger.warning(f'Movie not found: {href}') 141 | title = movie_info['title'] 142 | for s in title.split(): 143 | if s.isdigit(): 144 | title.replace(s, num2words(s)).title() 145 | if title != movie_info['title']: 146 | logger.debug(f'Trying once more with {title}') 147 | omdb_params['t'] = title 148 | omdb_data = requests.get( 149 | 'http://www.omdbapi.com/', params=omdb_params).json() 150 | if omdb_data.get('Error'): 151 | # TODO: send issue to Sentry 152 | # raise OMDBError(movie_data.get('Error')) 153 | return None 154 | else: 155 | return None 156 | else: 157 | logger.error(f'{omdb_data} for {href}') 158 | return None 159 | 160 | movie_data = {**omdb_data} 161 | 162 | try: 163 | movie = MovieSchema().load( 164 | {'imdb_rating': movie_data['imdbRating']}) 165 | except ma.ValidationError as e: 166 | if 'imdb_rating' in e.messages: 167 | del movie_data['imdbRating'] 168 | 169 | try: 170 | movie = MovieSchema().load(dict( 171 | id=href, 172 | imdb_id=movie_data['imdbID'], 173 | title=movie_data['Title'], 174 | director=movie_data['Director'], 175 | file_url=furl(href).url, 176 | genres=movie_data['Genre'].split(', '), 177 | imdb_rating=movie_data.get('imdbRating', -1), 178 | imdb_url=f"https://www.imdb.com/title/{movie_data['imdbID']}/reference", 179 | last_seen=arrow.now().timestamp 180 | )) 181 | if movie_data['Year'].isnumeric(): 182 | # Can be null, but ma doesn't accept null. So make it optional. 183 | movie['year'] = int(movie_data['Year']) 184 | 185 | if movie_info.get('screen_size'): 186 | movie['screen_size'] = movie_info.get('screen_size') 187 | 188 | if not isinstance(movie.get('language', None), str): 189 | logger.warning(movie_info) 190 | try: 191 | movie['language'] = ','.join([language.alpha3 for language in movie.get( 192 | 'language')]) if movie.get('language') else '' 193 | except TypeError: # Not iterable, so single language 194 | movie['language'] = movie.get( 195 | 'language').alpha3 if movie.get('language') else '' 196 | 197 | return movie 198 | except ma.ValidationError as e: 199 | # TODO: missing screen size also gives an error :/ 200 | logger.warning(f"No valid movie information found for {href}") 201 | logger.error(e) 202 | return None 203 | except KeyError as e: 204 | logger.error(e) 205 | logger.info(f"{href} returned {movie_data}") 206 | # TODO: send to Sentry 207 | 208 | 209 | def parse_txt(fn, path_must_start_with='', only_latin_chars=False, exclude_substr=None): 210 | with open(fn, 'r') as f: 211 | href = f.readline().strip() 212 | while href: 213 | if exclude_substr and exclude_substr not in href: 214 | if href.startswith(path_must_start_with): 215 | logger.debug(f"Parsing {href}") 216 | link_type, _ = mimetypes.guess_type(href) 217 | logger.debug(f"Link type is {link_type}") 218 | if link_type: 219 | # If link_type is None, it's in any case not a video 220 | if 'video' in link_type: 221 | fn = furl(href).path.segments[-1] 222 | fn = urllib.parse.unquote(fn) 223 | if only_latin_chars: 224 | fn = re.sub(r'[^a-zA-Z0-9./]', '', fn) 225 | movie = fetch_movie_data( 226 | urllib.parse.unquote(href), fn) 227 | if movie: 228 | if movie.get('title') and movie.get('year'): 229 | logger.debug( 230 | f"Found {movie['title']} ({movie.get('year')})") 231 | elif movie.get('title') and not movie.get('year'): 232 | logger.warning( 233 | f"Found {movie['title']} but no year found for {movie['file_url']}") 234 | yield movie 235 | else: 236 | logger.debug(f"No movie found; got {movie}") 237 | yield None 238 | href = f.readline().strip() 239 | 240 | 241 | def parse_html_directory(base_url, url=None, visited=None): 242 | visited = visited if visited else [] 243 | url = base_url if url is None else url 244 | html_doc = requests.get(url, verify=False).text 245 | soup = BeautifulSoup(html_doc, 'html.parser') 246 | for idx, a in enumerate([a for a in soup.find_all('a') if a['href'] not in visited]): 247 | href = a['href'] 248 | logger.debug(f"Parsing {href}") 249 | if href != '../': # Don't go back :) 250 | visited.append(href) 251 | if not(furl(href).scheme) and not (furl(href).netloc): 252 | # create full link 253 | href = furl(base_url).join(href).url 254 | 255 | if furl(href).netloc != furl(base_url).netloc: 256 | logger.debug(f"Not following external link {href}") 257 | else: 258 | # is it a path? 259 | if href[-1] == '/': 260 | yield from parse_html_directory(base_url, href, visited) 261 | else: 262 | # first, check if this is a video? 263 | link_type, _ = mimetypes.guess_type(href) 264 | logger.debug(f"Link type is {link_type} at {href}") 265 | if link_type: 266 | # If link_type is None, it's in any case not a video 267 | if 'video' in link_type: 268 | fn = furl(href).path.segments[-1] 269 | movie = fetch_movie_data( 270 | href, fn) 271 | if movie: 272 | if movie.get('title') and movie.get('year'): 273 | logger.debug( 274 | f"Found {movie['title']} ({movie.get('year')})") 275 | elif movie.get('title') and not movie.get('year'): 276 | logger.warning( 277 | f"Found {movie['title']} but no year found for {movie['file_url']}") 278 | yield movie 279 | else: 280 | logger.debug( 281 | f"No movie found for {fn} at {href}") 282 | yield None 283 | 284 | 285 | def output_movies(movies, fn=None, sort_by="rating"): 286 | fn = fn if fn else 'movies.md' 287 | header = "|Title|IMDB rating|\n| ------------ | ------------ |\n" 288 | with open(fn, 'w') as f: 289 | f.write(header) 290 | for movie in sorted(movies, key=lambda x: x.get('imdb_rating'), reverse=True): 291 | if movie.get('title'): 292 | # try: 293 | line_to_add = f"""|[{movie['title']}]({movie['file_url']}) ({f"{movie['year']}, " if movie.get('year') else ""}{movie['director']}) *{", ".join(movie['genres'])}* | [{movie['imdb_rating']}]({movie['imdb_url']})""" 294 | # line_to_add = f"|**{omdb_data['Title']}** ({omdb_data['Year']}, {omdb_data['Director']}) [💾]({omdb_data['file_url']}) | [{omdb_data['imdbRating']}]({omdb_data['imdbUrl']}) " 295 | # except (KeyError, ValueError): 296 | # line_to_add = f"|{movie['file_url']} | [💾]({movie['file_url']}) |" 297 | else: 298 | line_to_add = f"|{movie['file_url']} | [💾]({movie['file_url']}) |" 299 | 300 | f.write(f'{line_to_add}\n') 301 | 302 | 303 | def bulk_index_movies(movies): 304 | logger.debug(f'Indexing {len(movies)} movies.') 305 | valid_movies = [m for m in movies if m['title']] 306 | typesense_client.collections['movies'].documents.import_( 307 | valid_movies, {'action': 'upsert'}) 308 | 309 | 310 | def index_single_movie(movie, open_directory_url, reddit_source): 311 | movie['source_post'] = reddit_source 312 | movie['directory_url'] = open_directory_url 313 | typesense_client.collections['movies'].documents.upsert(movie) 314 | 315 | # This one is a tough one: http://anilist1.ir/?dir=Movie/1978/Woman%20Chasing%20the%20Butterfly%20of%20Death 316 | 317 | 318 | # sources = [ 319 | # { 320 | # 'r': 'https://www.reddit.com/r/opendirectories/comments/ka7vl5/fast_french_movie_server/', 321 | # 'd': 'https://87.98.218.57/' 322 | # }, 323 | # { 324 | # 'r': 'https://www.reddit.com/r/opendirectories/comments/kcs28h/http18519178214/', 325 | # 'd': 'http://185.191.78.214/' 326 | # }] 327 | 328 | # movies = [] 329 | 330 | # for source in sources: 331 | # for movie in main.parse_html_directory(source['d']): 332 | # if movie: 333 | # movies.append(movie) 334 | # try: 335 | # main.index_single_movie( 336 | # movie, open_directory_url=source['d'], reddit_source=source['r']) 337 | # except Exception as e: 338 | # logger.error(f'Error {e} encountered with {movie}') 339 | # main.output_movies(movies, fn=f'{source["r"]}.md') 340 | # print(len(movies)) 341 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "opendirectorymovieratingbot" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["Mathieu "] 6 | 7 | [tool.poetry.dependencies] 8 | python = "^3.8" 9 | requests = "^2.24.0" 10 | beautifulsoup4 = "^4.9.3" 11 | notebook = "^6.1.4" 12 | furl = "^2.1.0" 13 | marshmallow = "^3.9.1" 14 | arrow = "^0.17.0" 15 | typesense = "^0.9.0" 16 | loguru = "^0.5.3" 17 | guessit = "^3.1.1" 18 | num2words = "^0.5.10" 19 | requests-credssp = "^1.2.0" 20 | pypsrp = {extras = ["credssp"], version = "^0.5.0"} 21 | 22 | [tool.poetry.dev-dependencies] 23 | pytest = "^5.2" 24 | autopep8 = "^1.5.4" 25 | 26 | [build-system] 27 | requires = ["poetry-core>=1.0.0a5"] 28 | build-backend = "poetry.core.masonry.api" 29 | -------------------------------------------------------------------------------- /urls/https___easy-movie.com.au_cdn_.txt: -------------------------------------------------------------------------------- 1 | https://easy-movie.com.au/cdn/2.Fast.2.Furious.2003.1080p.mp4 2 | https://easy-movie.com.au/cdn/A.Giant.Jack.Christmas.2020.1080p.mp4 3 | https://easy-movie.com.au/cdn/Alita.Battle.Angel.2019.1080p.mp4 4 | https://easy-movie.com.au/cdn/Ant-Man.And.The.Wasp.2018.1080p.BluRay.x264-%5bYTS.AM%5d.mp4 5 | https://easy-movie.com.au/cdn/Aquaman.2018.1080p.BluRay.x264-%5bYTS.AM%5d.mp4 6 | https://easy-movie.com.au/cdn/Army.Of.One.2020.1080p.mp4 7 | https://easy-movie.com.au/cdn/Arrival.2016.1080p.mp4 8 | https://easy-movie.com.au/cdn/Assassin's.Creed.2016.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 9 | https://easy-movie.com.au/cdn/Asylum.Twisted.Horror.And.Fantasy.Tales.2020.1080p.mp4 10 | https://easy-movie.com.au/cdn/Avengers.Endgame.2019.1080p.BluRay.x264-%5bYTS.LT%5d.mp4 11 | https://easy-movie.com.au/cdn/Avengers.Infinity.War.2018.1080p.BluRay.x264-%5bYTS.AM%5d.mp4 12 | https://easy-movie.com.au/cdn/Baby.Driver.2017.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 13 | https://easy-movie.com.au/cdn/Back.To.The.Future.1985.2160p.mkv 14 | https://easy-movie.com.au/cdn/Bad.Boys.For.Life.2020.1080p.mp4 15 | https://easy-movie.com.au/cdn/Beast.Mode.2020.1080p.mp4 16 | https://easy-movie.com.au/cdn/Beauty.And.The.Beast.2017.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 17 | https://easy-movie.com.au/cdn/Big.Hero.6.2014.1080p.BluRay.x264.YIFY.mp4 18 | https://easy-movie.com.au/cdn/Bigfoot.Family.2020.1080p.mp4 19 | https://easy-movie.com.au/cdn/Black.Panther.2018.1080p.BluRay.x264-%5bYTS.AM%5d.mp4 20 | https://easy-movie.com.au/cdn/Bloodshot.2020.1080p.mp4 21 | https://easy-movie.com.au/cdn/Borat.Subsequent.Moviefilm.2020.1080p.mp4 22 | https://easy-movie.com.au/cdn/Bumblebee.2018.1080p.mp4 23 | https://easy-movie.com.au/cdn/Captain.America.Civil.War.2016.2160p.4K.BluRay.x265.10bit.AAC5.1-%5bYTS.MX%5d.mkv 24 | https://easy-movie.com.au/cdn/Captain.America.The.Winter.Soldier.2014.1080p.BluRay.x264.YIFY.mp4 25 | https://easy-movie.com.au/cdn/Captain.Marvel.2019.1080p.BluRay.x264-%5bYTS.AM%5d.mp4 26 | https://easy-movie.com.au/cdn/cdndemo.mp4 27 | https://easy-movie.com.au/cdn/Chasing.Christmas.2005.1080p.mp4 28 | https://easy-movie.com.au/cdn/Completely.Unrehearsed.Last.Minute.Pandemic.Holiday.Special.2020.1080p.mp4 29 | https://easy-movie.com.au/cdn/Creed.2015.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 30 | https://easy-movie.com.au/cdn/Cyber.Bride.2019.1080p.mp4 31 | https://easy-movie.com.au/cdn/dayz-bags.mp4 32 | https://easy-movie.com.au/cdn/Deadpool.2.2018.1080p.mp4 33 | https://easy-movie.com.au/cdn/Deadpool.2016.1080p.mp4 34 | https://easy-movie.com.au/cdn/Deathstroke.Knights.Dragons.2020.1080p.mp4 35 | https://easy-movie.com.au/cdn/Deep.Blue.Sea.3.2020.1080p.mp4 36 | https://easy-movie.com.au/cdn/Deepwater.Horizon.2016.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 37 | https://easy-movie.com.au/cdn/Den.Of.Thieves.2018.1080p.BluRay.x264-%5bYTS.AM%5d.mp4 38 | https://easy-movie.com.au/cdn/Deported.2020.1080p.mp4 39 | https://easy-movie.com.au/cdn/Doctor.Strange.2016.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 40 | https://easy-movie.com.au/cdn/Dom.And.Adrian.2020.2020.1080p.mp4 41 | https://easy-movie.com.au/cdn/Downhill.2020.1080p.mp4 42 | https://easy-movie.com.au/cdn/Dune.Drifter.2020.1080p.mp4 43 | https://easy-movie.com.au/cdn/Escape.From.Pretoria.2020.1080p.mp4 44 | https://easy-movie.com.au/cdn/Extraction.2020.1080p.mp4 45 | https://easy-movie.com.au/cdn/Fantastic.Beasts.And.Where.To.Find.Them.2016.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 46 | https://easy-movie.com.au/cdn/Fantastic.Beasts.The.Crimes.Of.Grindelwald.2018.1080p.BluRay.x264-%5bYTS.AM%5d.mp4 47 | https://easy-movie.com.au/cdn/Fantasy.Island.2020.1080p.mp4 48 | https://easy-movie.com.au/cdn/Fast.&.Furious.Presents.Hobbs.&.Shaw.2019.1080p.BluRay.x264-%5bYTS.LT%5d.mp4 49 | https://easy-movie.com.au/cdn/Fast.and.Furious.2009.1080p.mp4 50 | https://easy-movie.com.au/cdn/Fast.Five.2011.1080p.mp4 51 | https://easy-movie.com.au/cdn/Fatman.2020.1080p.mp4 52 | https://easy-movie.com.au/cdn/Furious.6.2013.1080p.mp4 53 | https://easy-movie.com.au/cdn/Game.Night.2018.1080p.BluRay.x264-%5bYTS.AM%5d.mp4 54 | https://easy-movie.com.au/cdn/Ghost.In.The.Shell.2017.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 55 | https://easy-movie.com.au/cdn/Godzilla.King.Of.The.Monsters.2019.1080p.mp4 56 | https://easy-movie.com.au/cdn/Guardians.of.the.Galaxy.2014.1080p.mp4 57 | https://easy-movie.com.au/cdn/Guardians.Of.The.Galaxy.Vol..2.2017.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 58 | https://easy-movie.com.au/cdn/Hacksaw.Ridge.2016.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 59 | https://easy-movie.com.au/cdn/Hard.Kill.2020.1080p.mp4 60 | https://easy-movie.com.au/cdn/High.Ground.2020.1080p.mp4 61 | https://easy-movie.com.au/cdn/Honest.Thief.2020.1080p.mp4 62 | https://easy-movie.com.au/cdn/Inferno.2016.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 63 | https://easy-movie.com.au/cdn/Interstellar.2014.2014.1080p.mp4 64 | https://easy-movie.com.au/cdn/Jack.Reacher.Never.Go.Back.2016.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 65 | https://easy-movie.com.au/cdn/John.Wick.2014.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 66 | https://easy-movie.com.au/cdn/John.Wick.Chapter.3.-.Parabellum.2019.1080p.BluRay.x264-%5bYTS.LT%5d.mp4 67 | https://easy-movie.com.au/cdn/Johnny.English.Strikes.Again.2018.1080p.BluRay.x264-%5bYTS.AM%5d.mp4 68 | https://easy-movie.com.au/cdn/Joker.2019.1080p.mp4 69 | https://easy-movie.com.au/cdn/Jumanji.The.Next.Level.2019.2160p.4K.BluRay.x265.10bit.AAC7.1-%5bYTS.MX%5d.mkv 70 | https://easy-movie.com.au/cdn/Jumanji.Welcome.To.The.Jungle.2017.1080p.BluRay.x264-%5bYTS.AM%5d.mp4 71 | https://easy-movie.com.au/cdn/Jurassic.World.Fallen.Kingdom.2018.1080p.mp4 72 | https://easy-movie.com.au/cdn/Justice.League.2017.1080p.BluRay.x264-%5bYTS.AM%5d.mp4 73 | https://easy-movie.com.au/cdn/Kevin.Hart.Zero.F.ks.Given.2020.1080p.mp4 74 | https://easy-movie.com.au/cdn/King.Arthur.Legend.Of.The.Sword.2017.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 75 | https://easy-movie.com.au/cdn/Kingsman.The.Golden.Circle.2017.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 76 | https://easy-movie.com.au/cdn/Knuckledust.2020.1080p.mp4 77 | https://easy-movie.com.au/cdn/Kong.Skull.Island.2017.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 78 | https://easy-movie.com.au/cdn/Legacy.Of.Lies.2020.1080p.mp4 79 | https://easy-movie.com.au/cdn/Logan.2017.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 80 | https://easy-movie.com.au/cdn/Lost.At.Christmas.2020.1080p.mp4 81 | https://easy-movie.com.au/cdn/Love.And.Monsters.2020.1080p.mp4 82 | https://easy-movie.com.au/cdn/Maze.Runner.The.Death.Cure.2018.1080p.mp4 83 | https://easy-movie.com.au/cdn/Mile.22.2018.1080p.BluRay.x264-%5bYTS.AM%5d.mp4 84 | https://easy-movie.com.au/cdn/Minions.Holiday.Special.2020.1080p.mp4 85 | https://easy-movie.com.au/cdn/Monsters.Of.Man.2020.1080p.mp4 86 | https://easy-movie.com.au/cdn/Mortal.Engines.2018.1080p.BluRay.x264-%5bYTS.AM%5d.mp4 87 | https://easy-movie.com.au/cdn/Mulan.2020.1080p.mp4 88 | https://easy-movie.com.au/cdn/Our.First.Christmas.2008.1080p.mp4 89 | https://easy-movie.com.au/cdn/Pacific.Rim.Uprising.2018.1080p.mp4 90 | https://easy-movie.com.au/cdn/Passengers.2016.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 91 | https://easy-movie.com.au/cdn/plexdrive 92 | https://easy-movie.com.au/cdn/Price.Of.Love.2020.1080p.mp4 93 | https://easy-movie.com.au/cdn/Project.Power.2020.1080p..mp4 94 | https://easy-movie.com.au/cdn/Rampage.2018.1080p.BluRay.x264-%5bYTS.AM%5d.mp4 95 | https://easy-movie.com.au/cdn/Ready.Player.One.2018.1080p.mp4 96 | https://easy-movie.com.au/cdn/Rogue.One.2016.1080p.mp4 97 | https://easy-movie.com.au/cdn/Safety.2020.1080p.mp4 98 | https://easy-movie.com.au/cdn/Sicario.Day.Of.The.Soldado.2018.1080p.BluRay.x264-%5bYTS.AM%5d.mp4 99 | https://easy-movie.com.au/cdn/Simulation.Theory.Film.2020.1080p.mp4 100 | https://easy-movie.com.au/cdn/Skylines.2020.1080p.mp4 101 | https://easy-movie.com.au/cdn/Songbird.2020.1080p.mp4 102 | https://easy-movie.com.au/cdn/Spare.Parts.2020.1080p.mp4 103 | https://easy-movie.com.au/cdn/Spenser.Confidential.2020.1080p.mp4 104 | https://easy-movie.com.au/cdn/Spider-Man.Far.From.Home.2019.1080p.BluRay.x264-%5bYTS.LT%5d.mp4 105 | https://easy-movie.com.au/cdn/Spider-Man.Homecoming.2017.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 106 | https://easy-movie.com.au/cdn/Spider-Man.Into.The.Spider-Verse.2018.1080p.BluRay.x264-%5bYTS.AM%5d.mp4 107 | https://easy-movie.com.au/cdn/Split.2016.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 108 | https://easy-movie.com.au/cdn/Star.Wars.Episode.VII.-.The.Force.Awakens.2015.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 109 | https://easy-movie.com.au/cdn/Suicide.Squad.2016.1080p.mp4 110 | https://easy-movie.com.au/cdn/Sully.2016.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 111 | https://easy-movie.com.au/cdn/Superhuman.The.Invisible.Made.Visible.2020.1080p.mp4 112 | https://easy-movie.com.au/cdn/Survive.The.Night.2020.1080p.mp4 113 | https://easy-movie.com.au/cdn/Tenet.2020.1080p.mp4 114 | https://easy-movie.com.au/cdn/Terminator.Dark.Fate.2019.1080p.mp4 115 | https://easy-movie.com.au/cdn/The.2nd.2020.1080p.mp4 116 | https://easy-movie.com.au/cdn/The.5th.Wave.2016.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 117 | https://easy-movie.com.au/cdn/The.Accountant.2016.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 118 | https://easy-movie.com.au/cdn/The.Call.Of.The.Wild.2020.1080p.mp4 119 | https://easy-movie.com.au/cdn/The.Dark.Knight.2008.2160p.4K.BluRay.x265.10bit.AAC5.1-%5bYTS.MX%5d.mkv 120 | https://easy-movie.com.au/cdn/The.Equalizer.2.2018.1080p.BluRay.x264-%5bYTS.AM%5d.mp4 121 | https://easy-movie.com.au/cdn/The.Fast.and.the.Furious.2001.1080p.mp4 122 | https://easy-movie.com.au/cdn/The.Fast.and.the.Furious.Tokyo.Drift.2011.1080p.BrRip.x264.YIFY.mp4 123 | https://easy-movie.com.au/cdn/The.Foreigner.2017.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 124 | https://easy-movie.com.au/cdn/The.Great.Wall.2016.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 125 | https://easy-movie.com.au/cdn/The.Hobbit.The.Battle.of.the.Five.Armies.2014.1080p.BluRay.x264.YIFY.mp4 126 | https://easy-movie.com.au/cdn/The.Hunger.Games.Mockingjay.-.Part.2.2015.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 127 | https://easy-movie.com.au/cdn/The.Hunger.Games.Mockingjay...Part.1.2014.1080p.BluRay.x264.YIFY.mp4 128 | https://easy-movie.com.au/cdn/The.Invisible.Man.2020.1080p.mp4 129 | https://easy-movie.com.au/cdn/The.Magnificent.Seven.2016.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 130 | https://easy-movie.com.au/cdn/The.Meg.2018.1080p.mp4 131 | https://easy-movie.com.au/cdn/The.Old.Guard.2020.1080p.mp4 132 | https://easy-movie.com.au/cdn/The.Revenant.2015.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 133 | https://easy-movie.com.au/cdn/The.War.With.Grandpa.2020.1080p.mp4 134 | https://easy-movie.com.au/cdn/The.Wolf.of.Wall.Street.2013.1080p.BluRay.x264.YIFY.mp4 135 | https://easy-movie.com.au/cdn/The.Wrong.Trousers.1993.1080p.mp4 136 | https://easy-movie.com.au/cdn/Thor.Ragnarok.2017.1080p.BluRay.x264-%5bYTS.AM%5d.mp4 137 | https://easy-movie.com.au/cdn/Thor.The.Dark.World.2013.1080p.BluRay.x264.YIFY.mp4 138 | https://easy-movie.com.au/cdn/Top.Gear.2002.1080p.mp4 139 | https://easy-movie.com.au/cdn/Top.Gear.Africa.Special.mp4 140 | https://easy-movie.com.au/cdn/Toy.Story.1995.1080p.mp4 141 | https://easy-movie.com.au/cdn/Toy.Story.2.1999.1080p.mp4 142 | https://easy-movie.com.au/cdn/Toy.Story.3.2010.1080p.mp4 143 | https://easy-movie.com.au/cdn/Transformers.The.Last.Knight.2017.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 144 | https://easy-movie.com.au/cdn/Underwater.2020.1080p.mp4 145 | https://easy-movie.com.au/cdn/Unhinged.2020.1080p.mp4 146 | https://easy-movie.com.au/cdn/Venom.2018.1080p.BluRay.x264-%5bYTS.AM%5d.mp4 147 | https://easy-movie.com.au/cdn/Wander.2020.1080p.mp4 148 | https://easy-movie.com.au/cdn/War.For.The.Planet.Of.The.Apes.2017.1080p.mp4 149 | https://easy-movie.com.au/cdn/Wonder.Woman.2017.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 150 | https://easy-movie.com.au/cdn/XXx.Return.Of.Xander.Cage.2017.1080p.BluRay.x264-%5bYTS.AG%5d.mp4 151 | https://easy-movie.com.au/cdn/You.Should.Have.Left.2020.1080p.mp4 152 | https://easy-movie.com.au/cdn/Zappa.2020.1080p.mp4 153 | --------------------------------------------------------------------------------