├── .github └── workflows │ └── ci.yml ├── .gitignore ├── README.md ├── __init__.py ├── setup.py ├── tests └── test_tvdb_v4_offical.py └── tvdb_v4_official.py /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: Python Tests 2 | 3 | on: 4 | pull_request: 5 | 6 | jobs: 7 | test: 8 | runs-on: ubuntu-latest 9 | 10 | strategy: 11 | matrix: 12 | python-version: ["3.7", "3.8", "3.9", "3.10", "3.11"] 13 | 14 | steps: 15 | - uses: actions/checkout@v3 16 | - name: Set up Python ${{ matrix.python-version }} 17 | uses: actions/setup-python@v4 18 | with: 19 | python-version: ${{ matrix.python-version }} 20 | - name: Install dependencies 21 | run: | 22 | python -m pip install --upgrade pip 23 | pip install pytest 24 | - name: Install the package 25 | run: | 26 | pip install . 27 | - name: Run tests 28 | run: | 29 | pytest 30 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | build.txt 7 | test.py 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 | pip-wheel-metadata/ 27 | share/python-wheels/ 28 | *.egg-info/ 29 | .installed.cfg 30 | *.egg 31 | MANIFEST 32 | 33 | # PyInstaller 34 | # Usually these files are written by a python script from a template 35 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 36 | *.manifest 37 | *.spec 38 | 39 | # Installer logs 40 | pip-log.txt 41 | pip-delete-this-directory.txt 42 | 43 | # Unit test / coverage reports 44 | htmlcov/ 45 | .tox/ 46 | .nox/ 47 | .coverage 48 | .coverage.* 49 | .cache 50 | nosetests.xml 51 | coverage.xml 52 | *.cover 53 | *.py,cover 54 | .hypothesis/ 55 | .pytest_cache/ 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 | target/ 79 | 80 | # Jupyter Notebook 81 | .ipynb_checkpoints 82 | 83 | # IPython 84 | profile_default/ 85 | ipython_config.py 86 | 87 | # pyenv 88 | .python-version 89 | 90 | # pipenv 91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 94 | # install all needed dependencies. 95 | #Pipfile.lock 96 | 97 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 98 | __pypackages__/ 99 | 100 | # Celery stuff 101 | celerybeat-schedule 102 | celerybeat.pid 103 | 104 | # SageMath parsed files 105 | *.sage.py 106 | 107 | # Environments 108 | .env 109 | .venv 110 | env/ 111 | venv/ 112 | ENV/ 113 | env.bak/ 114 | venv.bak/ 115 | 116 | # Spyder project settings 117 | .spyderproject 118 | .spyproject 119 | 120 | # Rope project settings 121 | .ropeproject 122 | 123 | # mkdocs documentation 124 | /site 125 | 126 | # mypy 127 | .mypy_cache/ 128 | .dmypy.json 129 | dmypy.json 130 | 131 | # Pyre type checker 132 | .pyre/ 133 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # tvdb-v4-python 2 | This is the official tvdb api v4 python package 3 | 4 | ### Installation 5 | ```bash 6 | python3 -m pip install tvdb_v4_official 7 | ``` 8 | ### Getting Started 9 | some projects require a user supplied pin as well as an apikey 10 | 11 | ```python3 12 | import tvdb_v4_official 13 | 14 | tvdb = tvdb_v4_official.TVDB("APIKEY") 15 | # OR: 16 | # tvdb = tvdb_v4_official.TVDB("APIKEY", pin="YOUR PIN HERE") 17 | 18 | # fetching several pages of series info 19 | series_list = [ ] 20 | for j in range(5): # Pages are numbered from 0 21 | series_list += tvdb.get_all_series(j) 22 | 23 | # fetching a series 24 | series = tvdb.get_series(121361) 25 | 26 | # fetching a season's episode list 27 | series = tvdb.get_series_extended(121361) 28 | for season in sorted(series["seasons"], key=lambda x: (x["type"]["name"], x["number"])): 29 | if season["type"]["name"] == "Aired Order" and season["number"] == 1: 30 | season = tvdb.get_season_extended(season["id"]) 31 | break 32 | else: 33 | season = None 34 | if season is not None: 35 | print(season["episodes"]) 36 | 37 | # fetch a page of episodes from a series by season_type (type is "default" if unspecified) 38 | info = tvdb.get_series_episodes(121361, page=0) 39 | print(info["series"]) 40 | for ep in info["episodes"]: 41 | print(ep) 42 | 43 | # fetching a movie 44 | movie = tvdb.get_movie(31) # avengers 45 | 46 | # access a movie's characters 47 | movie = tvdb.get_movie_extended(31) 48 | for c in movie["characters"]: 49 | print(c) 50 | 51 | # fetching a person record 52 | person = tvdb.get_person_extended(characters[0]["peopleId"]) 53 | print(person) 54 | 55 | # using since If-Modifed-Since parameter 56 | series = tvdb.get_series_extended(393199, if_modified_since="Wed, 30 Jun 2022 07:28:00 GMT") 57 | ``` 58 | -------------------------------------------------------------------------------- /__init__.py: -------------------------------------------------------------------------------- 1 | # __init__.py 2 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import find_packages, setup 2 | 3 | VERSION = "1.0.12" 4 | DESCRIPTION = "Official tvdb api v4 package" 5 | LONG_DESCRIPTION = "Official python package for using the tvdb v4 api" 6 | 7 | # Setting up 8 | setup( 9 | name="tvdb_v4_official", 10 | version=VERSION, 11 | author="Weylin Wagnon", 12 | author_email="", 13 | url="https://github.com/thetvdb/tvdb-v4-python", 14 | description="tvdb-api-v4 utility package", 15 | long_description="official python client for the tvdb api v4", 16 | packages=find_packages(), 17 | install_requires=[], 18 | py_modules=["tvdb_v4_official"], 19 | keywords=["python", "tvdb"], 20 | classifiers=[ 21 | "Development Status :: 3 - Alpha", 22 | "Intended Audience :: Developers", 23 | "Programming Language :: Python :: 3", 24 | "Operating System :: MacOS :: MacOS X", 25 | "Operating System :: Microsoft :: Windows", 26 | ], 27 | package_dir={"tvdb_v4_official": "tvdb_v4_official"}, 28 | tests_require=["pytest"], 29 | test_suite="tests", 30 | ) 31 | -------------------------------------------------------------------------------- /tests/test_tvdb_v4_offical.py: -------------------------------------------------------------------------------- 1 | from unittest.mock import patch, MagicMock 2 | import pytest 3 | import json 4 | from tvdb_v4_official import TVDB 5 | 6 | VALID_API_KEY = "valid_api_key" 7 | VALID_PIN = "valid_pin" 8 | 9 | 10 | @pytest.fixture 11 | def tvdb_instance(): 12 | with patch("tvdb_v4_official.Auth") as MockAuth: 13 | MockAuth.return_value.get_token.return_value = "test_token" 14 | instance = TVDB(VALID_API_KEY, VALID_PIN) 15 | return instance 16 | 17 | 18 | @patch("urllib.request.urlopen") 19 | def test_get_artwork(mocked_urlopen, tvdb_instance): 20 | mock_response_content = json.dumps( 21 | {"status": "success", "data": {"id": 123, "type": "Poster"}, "links": {}} 22 | ).encode("utf-8") 23 | 24 | mock_response = MagicMock() 25 | mock_response.read.return_value = mock_response_content 26 | mock_response.__enter__.return_value = mock_response 27 | mocked_urlopen.return_value = mock_response 28 | 29 | artwork = tvdb_instance.get_artwork(123) 30 | assert artwork["id"] == 123 31 | assert artwork["type"] == "Poster" 32 | -------------------------------------------------------------------------------- /tvdb_v4_official.py: -------------------------------------------------------------------------------- 1 | import json 2 | import string 3 | import urllib 4 | import urllib.request 5 | from http import HTTPStatus 6 | from urllib.error import HTTPError 7 | 8 | 9 | class Auth: 10 | def __init__(self, url, apikey, pin=""): 11 | loginInfo = {"apikey": apikey} 12 | if pin != "": 13 | loginInfo["pin"] = pin 14 | 15 | loginInfoBytes = json.dumps(loginInfo, indent=2).encode("utf-8") 16 | req = urllib.request.Request(url, data=loginInfoBytes) 17 | req.add_header("Content-Type", "application/json") 18 | try: 19 | with urllib.request.urlopen(req, data=loginInfoBytes) as response: 20 | res = json.load(response) 21 | self.token = res["data"]["token"] 22 | except HTTPError as e: 23 | res = json.load(e) 24 | raise Exception("Code:{}, {}".format(e, res["message"])) 25 | 26 | def get_token(self): 27 | return self.token 28 | 29 | 30 | class Request: 31 | def __init__(self, auth_token): 32 | self.auth_token = auth_token 33 | self.links = None 34 | 35 | def make_request(self, url, if_modified_since=None): 36 | req = urllib.request.Request(url) 37 | req.add_header("Authorization", "Bearer {}".format(self.auth_token)) 38 | if if_modified_since: 39 | req.add_header("If-Modified-Since", "{}".format(if_modified_since)) 40 | try: 41 | with urllib.request.urlopen(req) as response: 42 | res = json.load(response) 43 | except HTTPError as e: 44 | try: 45 | if e.code == HTTPStatus.NOT_MODIFIED: 46 | return { 47 | "code": HTTPStatus.NOT_MODIFIED.real, 48 | "message": "Not-Modified", 49 | } 50 | res = json.load(e) 51 | except: 52 | res = {} 53 | data = res.get("data", None) 54 | if data is not None and res.get("status", "failure") != "failure": 55 | self.links = res.get("links", None) 56 | return data 57 | msg = res.get("message", None) 58 | if not msg: 59 | msg = "UNKNOWN FAILURE" 60 | raise ValueError("failed to get " + url + "\n " + str(msg)) 61 | 62 | 63 | class Url: 64 | def __init__(self): 65 | self.base_url = "https://api4.thetvdb.com/v4/" 66 | 67 | def construct( 68 | self, url_sect, url_id=None, url_subsect=None, url_lang=None, **query 69 | ): 70 | url = self.base_url + url_sect 71 | if url_id: 72 | url += "/" + str(url_id) 73 | if url_subsect: 74 | url += "/" + url_subsect 75 | if url_lang: 76 | url += "/" + url_lang 77 | if query: 78 | query = {var: val for var, val in query.items() if val is not None} 79 | if query: 80 | url += "?" + urllib.parse.urlencode(query) 81 | return url 82 | 83 | 84 | class TVDB: 85 | def __init__(self, apikey: str, pin=""): 86 | self.url = Url() 87 | login_url = self.url.construct("login") 88 | self.auth = Auth(login_url, apikey, pin) 89 | auth_token = self.auth.get_token() 90 | self.request = Request(auth_token) 91 | 92 | def get_req_links(self) -> dict: 93 | return self.request.links 94 | 95 | def get_artwork_statuses(self, meta=None, if_modified_since=None) -> list: 96 | """Returns a list of artwork statuses""" 97 | url = self.url.construct("artwork/statuses", meta=meta) 98 | return self.request.make_request(url, if_modified_since) 99 | 100 | def get_artwork_types(self, meta=None, if_modified_since=None) -> list: 101 | """Returns a list of artwork types""" 102 | url = self.url.construct("artwork/types", meta=meta) 103 | return self.request.make_request(url, if_modified_since) 104 | 105 | def get_artwork(self, id: int, meta=None, if_modified_since=None) -> dict: 106 | """Returns an artwork dictionary""" 107 | url = self.url.construct("artwork", id, meta=meta) 108 | return self.request.make_request(url, if_modified_since) 109 | 110 | def get_artwork_extended(self, id: int, meta=None, if_modified_since=None) -> dict: 111 | """Returns an artwork extended dictionary""" 112 | url = self.url.construct("artwork", id, "extended", meta=meta) 113 | return self.request.make_request(url, if_modified_since) 114 | 115 | def get_all_awards(self, meta=None, if_modified_since=None) -> list: 116 | """Returns a list of awards""" 117 | url = self.url.construct("awards", meta=meta) 118 | return self.request.make_request(url, if_modified_since) 119 | 120 | def get_award(self, id: int, meta=None, if_modified_since=None) -> dict: 121 | """Returns an award dictionary""" 122 | url = self.url.construct("awards", id, meta=meta) 123 | return self.request.make_request(url, if_modified_since) 124 | 125 | def get_award_extended(self, id: int, meta=None, if_modified_since=None) -> dict: 126 | """Returns an award extended dictionary""" 127 | url = self.url.construct("awards", id, "extended", meta=meta) 128 | return self.request.make_request(url, if_modified_since) 129 | 130 | def get_all_award_categories(self, meta=None, if_modified_since=None) -> list: 131 | """Returns a list of award categories""" 132 | url = self.url.construct("awards/categories", meta=meta) 133 | return self.request.make_request(url, if_modified_since) 134 | 135 | def get_award_category(self, id: int, meta=None, if_modified_since=None) -> dict: 136 | """Returns an award category dictionary""" 137 | url = self.url.construct("awards/categories", id, meta=meta) 138 | return self.request.make_request(url, if_modified_since) 139 | 140 | def get_award_category_extended( 141 | self, id: int, meta=None, if_modified_since=None 142 | ) -> dict: 143 | """Returns an award category extended dictionary""" 144 | url = self.url.construct("awards/categories", id, "extended", meta=meta) 145 | return self.request.make_request(url, if_modified_since) 146 | 147 | def get_content_ratings(self, meta=None, if_modified_since=None) -> list: 148 | """Returns a list of content ratings""" 149 | url = self.url.construct("content/ratings", meta=meta) 150 | return self.request.make_request(url, if_modified_since) 151 | 152 | def get_countries(self, meta=None, if_modified_since=None) -> list: 153 | """Returns a list of countries""" 154 | url = self.url.construct("countries", meta=meta) 155 | return self.request.make_request(url, if_modified_since) 156 | 157 | def get_all_companies(self, page=None, meta=None, if_modified_since=None) -> list: 158 | """Returns a list of companies""" 159 | url = self.url.construct("companies", page=page, meta=meta) 160 | return self.request.make_request(url, if_modified_since) 161 | 162 | def get_company_types(self, meta=None, if_modified_since=None) -> list: 163 | """Returns a list of company types""" 164 | url = self.url.construct("companies/types", meta=meta) 165 | return self.request.make_request(url, if_modified_since) 166 | 167 | def get_company(self, id: int, meta=None, if_modified_since=None) -> dict: 168 | """Returns a company dictionary""" 169 | url = self.url.construct("companies", id, meta=meta) 170 | return self.request.make_request(url, if_modified_since) 171 | 172 | def get_all_series(self, page=None, meta=None, if_modified_since=None) -> list: 173 | """Returns a list of series""" 174 | url = self.url.construct("series", page=page, meta=meta) 175 | return self.request.make_request(url, if_modified_since) 176 | 177 | def get_series(self, id: int, meta=None, if_modified_since=None) -> dict: 178 | """Returns a series dictionary""" 179 | url = self.url.construct("series", id, meta=meta) 180 | return self.request.make_request(url, if_modified_since) 181 | 182 | def get_series_by_slug( 183 | self, slug: string, meta=None, if_modified_since=None 184 | ) -> dict: 185 | """Returns a series dictionary""" 186 | url = self.url.construct("series/slug", slug, meta=meta) 187 | return self.request.make_request(url, if_modified_since) 188 | 189 | def get_series_extended( 190 | self, id: int, meta=None, short=False, if_modified_since=None 191 | ) -> dict: 192 | """Returns a series extended dictionary""" 193 | url = self.url.construct("series", id, "extended", meta=meta, short=short) 194 | return self.request.make_request(url, if_modified_since) 195 | 196 | def get_series_episodes( 197 | self, 198 | id: int, 199 | season_type: str = "default", 200 | page: int = 0, 201 | lang: str = None, 202 | meta=None, 203 | if_modified_since=None, 204 | **kwargs 205 | ) -> dict: 206 | """Returns a series episodes dictionary""" 207 | url = self.url.construct( 208 | "series", id, "episodes/" + season_type, lang, page=page, meta=meta, **kwargs 209 | ) 210 | return self.request.make_request(url, if_modified_since) 211 | 212 | def get_series_translation( 213 | self, id: int, lang: str, meta=None, if_modified_since=None 214 | ) -> dict: 215 | """Returns a series translation dictionary""" 216 | url = self.url.construct("series", id, "translations", lang, meta=meta) 217 | return self.request.make_request(url, if_modified_since) 218 | 219 | def get_series_artworks( 220 | self, id: int, lang: str, type=None, if_modified_since=None 221 | ) -> dict: 222 | """Returns a series record with an artwork array""" 223 | url = self.url.construct("series", id, "artworks", lang=lang, type=type) 224 | return self.request.make_request(url, if_modified_since) 225 | 226 | def get_series_nextAired(self, id: int, if_modified_since=None) -> dict: 227 | """Returns a series extended dictionary""" 228 | url = self.url.construct("series", id, "nextAired") 229 | return self.request.make_request(url, if_modified_since) 230 | 231 | def get_all_movies(self, page=None, meta=None, if_modified_since=None) -> list: 232 | """Returns a list of movies""" 233 | url = self.url.construct("movies", page=page, meta=meta) 234 | return self.request.make_request(url, if_modified_since) 235 | 236 | def get_movie(self, id: int, meta=None, if_modified_since=None) -> dict: 237 | """Returns a movie dictionary""" 238 | url = self.url.construct("movies", id, meta=meta) 239 | return self.request.make_request(url, if_modified_since) 240 | 241 | def get_movie_by_slug( 242 | self, slug: string, meta=None, if_modified_since=None 243 | ) -> dict: 244 | """Returns a movie dictionary""" 245 | url = self.url.construct("movies/slug", slug, meta=meta) 246 | return self.request.make_request(url, if_modified_since) 247 | 248 | def get_movie_extended( 249 | self, id: int, meta=None, short=False, if_modified_since=None 250 | ) -> dict: 251 | """Returns a movie extended dictionary""" 252 | url = self.url.construct("movies", id, "extended", meta=meta, short=short) 253 | return self.request.make_request(url, if_modified_since) 254 | 255 | def get_movie_translation( 256 | self, id: int, lang: str, meta=None, if_modified_since=None 257 | ) -> dict: 258 | """Returns a movie translation dictionary""" 259 | url = self.url.construct("movies", id, "translations", lang, meta=meta) 260 | return self.request.make_request(url, if_modified_since) 261 | 262 | def get_all_seasons(self, page=None, meta=None, if_modified_since=None) -> list: 263 | """Returns a list of seasons""" 264 | url = self.url.construct("seasons", page=page, meta=meta) 265 | return self.request.make_request(url, if_modified_since) 266 | 267 | def get_season(self, id: int, meta=None, if_modified_since=None) -> dict: 268 | """Returns a season dictionary""" 269 | url = self.url.construct("seasons", id, meta=meta) 270 | return self.request.make_request(url, if_modified_since) 271 | 272 | def get_season_extended(self, id: int, meta=None, if_modified_since=None) -> dict: 273 | """Returns a season extended dictionary""" 274 | url = self.url.construct("seasons", id, "extended", meta=meta) 275 | return self.request.make_request(url, if_modified_since) 276 | 277 | def get_season_types(self, meta=None, if_modified_since=None) -> list: 278 | """Returns a list of season types""" 279 | url = self.url.construct("seasons/types", meta=meta) 280 | return self.request.make_request(url, if_modified_since) 281 | 282 | def get_season_translation( 283 | self, id: int, lang: str, meta=None, if_modified_since=None 284 | ) -> dict: 285 | """Returns a seasons translation dictionary""" 286 | url = self.url.construct("seasons", id, "translations", lang, meta=meta) 287 | return self.request.make_request(url, if_modified_since) 288 | 289 | def get_all_episodes(self, page=None, meta=None, if_modified_since=None) -> list: 290 | """Returns a list of episodes""" 291 | url = self.url.construct("episodes", page=page, meta=meta) 292 | return self.request.make_request(url, if_modified_since) 293 | 294 | def get_episode(self, id: int, meta=None, if_modified_since=None) -> dict: 295 | """Returns an episode dictionary""" 296 | url = self.url.construct("episodes", id, meta=meta) 297 | return self.request.make_request(url, if_modified_since) 298 | 299 | def get_episode_extended(self, id: int, meta=None, if_modified_since=None) -> dict: 300 | """Returns an episode extended dictionary""" 301 | url = self.url.construct("episodes", id, "extended", meta=meta) 302 | return self.request.make_request(url, if_modified_since) 303 | 304 | def get_episode_translation( 305 | self, id: int, lang: str, meta=None, if_modified_since=None 306 | ) -> dict: 307 | """Returns an episode translation dictionary""" 308 | url = self.url.construct("episodes", id, "translations", lang, meta=meta) 309 | return self.request.make_request(url, if_modified_since) 310 | 311 | get_episodes_translation = ( 312 | get_episode_translation # Support the old name of the function. 313 | ) 314 | 315 | def get_all_genders(self, meta=None, if_modified_since=None) -> list: 316 | """Returns a list of genders""" 317 | url = self.url.construct("genders", meta=meta) 318 | return self.request.make_request(url, if_modified_since) 319 | 320 | def get_all_genres(self, meta=None, if_modified_since=None) -> list: 321 | """Returns a list of genres""" 322 | url = self.url.construct("genres", meta=meta) 323 | return self.request.make_request(url, if_modified_since) 324 | 325 | def get_genre(self, id: int, meta=None, if_modified_since=None) -> dict: 326 | """Returns a genres dictionary""" 327 | url = self.url.construct("genres", id, meta=meta) 328 | return self.request.make_request(url, if_modified_since) 329 | 330 | def get_all_languages(self, meta=None, if_modified_since=None) -> list: 331 | """Returns a list of languages""" 332 | url = self.url.construct("languages", meta=meta) 333 | return self.request.make_request(url, if_modified_since) 334 | 335 | def get_all_people(self, page=None, meta=None, if_modified_since=None) -> list: 336 | """Returns a list of people""" 337 | url = self.url.construct("people", page=page, meta=meta) 338 | return self.request.make_request(url, if_modified_since) 339 | 340 | def get_person(self, id: int, meta=None, if_modified_since=None) -> dict: 341 | """Returns a people dictionary""" 342 | url = self.url.construct("people", id, meta=meta) 343 | return self.request.make_request(url, if_modified_since) 344 | 345 | def get_person_extended(self, id: int, meta=None, if_modified_since=None) -> dict: 346 | """Returns a people extended dictionary""" 347 | url = self.url.construct("people", id, "extended", meta=meta) 348 | return self.request.make_request(url, if_modified_since) 349 | 350 | def get_person_translation( 351 | self, id: int, lang: str, meta=None, if_modified_since=None 352 | ) -> dict: 353 | """Returns an people translation dictionary""" 354 | url = self.url.construct("people", id, "translations", lang, meta=meta) 355 | return self.request.make_request(url, if_modified_since) 356 | 357 | def get_character(self, id: int, meta=None, if_modified_since=None) -> dict: 358 | """Returns a character dictionary""" 359 | url = self.url.construct("characters", id, meta=meta) 360 | return self.request.make_request(url, if_modified_since) 361 | 362 | def get_people_types(self, meta=None, if_modified_since=None) -> list: 363 | """Returns a list of people types""" 364 | url = self.url.construct("people/types", meta=meta) 365 | return self.request.make_request(url, if_modified_since) 366 | 367 | get_all_people_types = get_people_types # Support the old function name 368 | 369 | def get_source_types(self, meta=None, if_modified_since=None) -> list: 370 | """Returns a list of source types""" 371 | url = self.url.construct("sources/types", meta=meta) 372 | return self.request.make_request(url, if_modified_since) 373 | 374 | get_all_sourcetypes = get_source_types # Support the old function name 375 | 376 | # kwargs accepts args such as: page=2, action='update', type='artwork' 377 | def get_updates(self, since: int, **kwargs) -> list: 378 | """Returns a list of updates""" 379 | url = self.url.construct("updates", since=since, **kwargs) 380 | return self.request.make_request(url) 381 | 382 | def get_all_tag_options(self, page=None, meta=None, if_modified_since=None) -> list: 383 | """Returns a list of tag options""" 384 | url = self.url.construct("tags/options", page=page, meta=meta) 385 | return self.request.make_request(url, if_modified_since) 386 | 387 | def get_tag_option(self, id: int, meta=None, if_modified_since=None) -> dict: 388 | """Returns a tag option dictionary""" 389 | url = self.url.construct("tags/options", id, meta=meta) 390 | return self.request.make_request(url, if_modified_since) 391 | 392 | def get_all_lists(self, page=None, meta=None) -> dict: 393 | url = self.url.construct("lists", page=page, meta=meta) 394 | return self.request.make_request(url) 395 | 396 | def get_list(self, id: int, meta=None, if_modified_since=None) -> dict: 397 | url = self.url.construct("lists", id, meta=meta) 398 | return self.request.make_request(url), if_modified_since 399 | 400 | def get_list_by_slug(self, slug: string, meta=None, if_modified_since=None) -> dict: 401 | """Returns a movie dictionary""" 402 | url = self.url.construct("lists/slug", slug, meta=meta) 403 | return self.request.make_request(url, if_modified_since) 404 | 405 | def get_list_extended(self, id: int, meta=None, if_modified_since=None) -> dict: 406 | url = self.url.construct("lists", id, "extended", meta=meta) 407 | return self.request.make_request(url), if_modified_since 408 | 409 | def get_list_translation( 410 | self, id: int, lang: str, meta=None, if_modified_since=None 411 | ) -> dict: 412 | """Returns an list translation dictionary""" 413 | url = self.url.construct("lists", id, "translations", lang, meta=meta) 414 | return self.request.make_request(url, if_modified_since) 415 | 416 | def get_inspiration_types(self, meta=None, if_modified_since=None) -> dict: 417 | url = self.url.construct("inspiration/types", meta=meta) 418 | return self.request.make_request(url), if_modified_since 419 | 420 | def search(self, query, **kwargs) -> list: 421 | """Returns a list of search results""" 422 | url = self.url.construct("search", query=query, **kwargs) 423 | return self.request.make_request(url) 424 | 425 | def search_by_remote_id(self, remoteid: str) -> list: 426 | """Returns a list of search results by remote id exact match""" 427 | url = self.url.construct("search/remoteid", remoteid) 428 | return self.request.make_request(url) 429 | 430 | def get_tags(self, slug: str, if_modified_since=None) -> dict: 431 | """Returns a tag option dictionary""" 432 | url = self.url.construct("entities", url_subsect=slug) 433 | return self.request.make_request(url, if_modified_since) 434 | 435 | def get_entities_types(self, if_modified_since=None) -> dict: 436 | """Returns a entities types dictionary""" 437 | url = self.url.construct("entities") 438 | return self.request.make_request(url, if_modified_since) 439 | 440 | def get_user_by_id(self, id: int) -> dict: 441 | """Returns a user info dictionary""" 442 | url = self.url.construct("user", id) 443 | return self.request.make_request(url) 444 | 445 | def get_user(self) -> dict: 446 | """Returns a user info dictionary""" 447 | url = self.url.construct("user") 448 | return self.request.make_request(url) 449 | 450 | def get_user_favorites(self) -> dict: 451 | """Returns a user info dictionary""" 452 | url = self.url.construct('user/favorites') 453 | return self.request.make_request(url) --------------------------------------------------------------------------------