diff --git a/.gitignore b/.gitignore
index bbbed5da..e8fbbaa8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,5 @@
+.DS_Store
+
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
diff --git a/catalog/__init__.py b/catalog/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/catalog/admin.py b/catalog/admin.py
new file mode 100644
index 00000000..8c38f3f3
--- /dev/null
+++ b/catalog/admin.py
@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.
diff --git a/catalog/api.py b/catalog/api.py
new file mode 100644
index 00000000..467b0811
--- /dev/null
+++ b/catalog/api.py
@@ -0,0 +1,11 @@
+from ninja import NinjaAPI
+from .models import Podcast
+from django.conf import settings
+
+
+api = NinjaAPI(title=settings.SITE_INFO['site_name'], version="1.0.0", description=settings.SITE_INFO['site_name'])
+
+
+@api.get("/podcasts/{item_id}")
+def get_item(request, item_id: int):
+ return Podcast.objects.filter(pk=item_id).first()
diff --git a/catalog/apps.py b/catalog/apps.py
new file mode 100644
index 00000000..a5993c68
--- /dev/null
+++ b/catalog/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class CatalogConfig(AppConfig):
+ default_auto_field = 'django.db.models.BigAutoField'
+ name = 'catalog'
diff --git a/catalog/book/models.py b/catalog/book/models.py
new file mode 100644
index 00000000..131c89de
--- /dev/null
+++ b/catalog/book/models.py
@@ -0,0 +1,77 @@
+"""
+Models for Book
+
+Series -> Work -> Edition
+
+Series is not fully implemented at the moment
+
+Goodreads
+Famous works have many editions
+
+Google Books:
+only has Edition level ("volume") data
+
+Douban:
+old editions has only CUBN(Chinese Unified Book Number)
+work data seems asymmetric (a book links to a work, but may not listed in that work as one of its editions)
+
+"""
+
+from django.db import models
+from django.utils.translation import gettext_lazy as _
+from catalog.common import *
+from .utils import *
+
+
+class Edition(Item):
+ isbn = PrimaryLookupIdDescriptor(IdType.ISBN)
+ asin = PrimaryLookupIdDescriptor(IdType.ASIN)
+ cubn = PrimaryLookupIdDescriptor(IdType.CUBN)
+ # douban_book = LookupIdDescriptor(IdType.DoubanBook)
+ # goodreads = LookupIdDescriptor(IdType.Goodreads)
+ languages = jsondata.ArrayField(_("语言"), null=True, blank=True, default=list)
+ publish_year = jsondata.IntegerField(_("发表年份"), null=True, blank=True)
+ publish_month = jsondata.IntegerField(_("发表月份"), null=True, blank=True)
+ pages = jsondata.IntegerField(blank=True, default=None)
+ authors = jsondata.ArrayField(_('作者'), null=False, blank=False, default=list)
+ translaters = jsondata.ArrayField(_('译者'), null=True, blank=True, default=list)
+ publishers = jsondata.ArrayField(_('出版方'), null=True, blank=True, default=list)
+
+ @property
+ def isbn10(self):
+ return isbn_13_to_10(self.isbn)
+
+ @isbn10.setter
+ def isbn10(self, value):
+ self.isbn = isbn_10_to_13(value)
+
+ def update_linked_items_from_external_resource(self, resource):
+ """add Work from resource.metadata['work'] if not yet"""
+ links = resource.required_resources + resource.related_resources
+ for w in links:
+ if w['model'] == 'Work':
+ work = Work.objects.filter(primary_lookup_id_type=w['id_type'], primary_lookup_id_value=w['id_value']).first()
+ if work and work not in self.works.all():
+ self.works.add(work)
+ # if not work:
+ # _logger.info(f'Unable to find link for {w["url"]}')
+
+
+class Work(Item):
+ # douban_work = PrimaryLookupIdDescriptor(IdType.DoubanBook_Work)
+ # goodreads_work = PrimaryLookupIdDescriptor(IdType.Goodreads_Work)
+ editions = models.ManyToManyField(Edition, related_name='works') # , through='WorkEdition'
+
+ # def __str__(self):
+ # return self.title
+
+ # class Meta:
+ # proxy = True
+
+
+class Series(Item):
+ # douban_serie = LookupIdDescriptor(IdType.DoubanBook_Serie)
+ # goodreads_serie = LookupIdDescriptor(IdType.Goodreads_Serie)
+
+ class Meta:
+ proxy = True
diff --git a/catalog/book/tests.py b/catalog/book/tests.py
new file mode 100644
index 00000000..51e55353
--- /dev/null
+++ b/catalog/book/tests.py
@@ -0,0 +1,237 @@
+from django.test import TestCase
+from catalog.book.models import *
+from catalog.common import *
+
+
+class BookTestCase(TestCase):
+ def setUp(self):
+ hyperion = Edition.objects.create(title="Hyperion")
+ hyperion.pages = 500
+ hyperion.isbn = '9780553283686'
+ hyperion.save()
+ # hyperion.isbn10 = '0553283685'
+
+ def test_properties(self):
+ hyperion = Edition.objects.get(title="Hyperion")
+ self.assertEqual(hyperion.title, "Hyperion")
+ self.assertEqual(hyperion.pages, 500)
+ self.assertEqual(hyperion.primary_lookup_id_type, IdType.ISBN)
+ self.assertEqual(hyperion.primary_lookup_id_value, '9780553283686')
+ andymion = Edition(title="Andymion", pages=42)
+ self.assertEqual(andymion.pages, 42)
+
+ def test_lookupids(self):
+ hyperion = Edition.objects.get(title="Hyperion")
+ hyperion.asin = 'B004G60EHS'
+ self.assertEqual(hyperion.primary_lookup_id_type, IdType.ASIN)
+ self.assertEqual(hyperion.primary_lookup_id_value, 'B004G60EHS')
+ self.assertEqual(hyperion.isbn, None)
+ self.assertEqual(hyperion.isbn10, None)
+
+ def test_isbn(self):
+ hyperion = Edition.objects.get(title="Hyperion")
+ self.assertEqual(hyperion.isbn, '9780553283686')
+ self.assertEqual(hyperion.isbn10, '0553283685')
+ hyperion.isbn10 = '0575099437'
+ self.assertEqual(hyperion.isbn, '9780575099432')
+ self.assertEqual(hyperion.isbn10, '0575099437')
+
+ def test_work(self):
+ hyperion_print = Edition.objects.get(title="Hyperion")
+ hyperion_ebook = Edition(title="Hyperion")
+ hyperion_ebook.save()
+ hyperion_ebook.asin = 'B0043M6780'
+ hyperion = Work(title="Hyperion")
+ hyperion.save()
+ hyperion.editions.add(hyperion_print)
+ hyperion.editions.add(hyperion_ebook)
+ # andymion = Edition(title="Andymion", pages=42)
+ # serie = Serie(title="Hyperion Cantos")
+
+
+class GoodreadsTestCase(TestCase):
+ def setUp(self):
+ pass
+
+ def test_parse(self):
+ t_type = IdType.Goodreads
+ t_id = '77566'
+ t_url = 'https://www.goodreads.com/zh/book/show/77566.Hyperion'
+ t_url2 = 'https://www.goodreads.com/book/show/77566'
+ p1 = SiteList.get_site_by_id_type(t_type)
+ p2 = SiteList.get_site_by_url(t_url)
+ self.assertEqual(p1.id_to_url(t_id), t_url2)
+ self.assertEqual(p2.url_to_id(t_url), t_id)
+
+ @use_local_response
+ def test_scrape(self):
+ t_url = 'https://www.goodreads.com/book/show/77566.Hyperion'
+ t_url2 = 'https://www.goodreads.com/book/show/77566'
+ isbn = '9780553283686'
+ site = SiteList.get_site_by_url(t_url)
+ self.assertEqual(site.ready, False)
+ self.assertEqual(site.url, t_url2)
+ site.get_resource()
+ self.assertEqual(site.ready, False)
+ self.assertIsNotNone(site.resource)
+ site.get_resource_ready()
+ self.assertEqual(site.ready, True)
+ self.assertEqual(site.resource.metadata.get('title'), 'Hyperion')
+ self.assertEqual(site.resource.metadata.get('isbn'), isbn)
+ self.assertEqual(site.resource.required_resources[0]['id_value'], '1383900')
+ edition = Edition.objects.get(primary_lookup_id_type=IdType.ISBN, primary_lookup_id_value=isbn)
+ resource = edition.external_resources.all().first()
+ self.assertEqual(resource.id_type, IdType.Goodreads)
+ self.assertEqual(resource.id_value, '77566')
+ self.assertNotEqual(resource.cover, '/media/item/default.svg')
+ self.assertEqual(edition.isbn, '9780553283686')
+ self.assertEqual(edition.title, 'Hyperion')
+
+ edition.delete()
+ site = SiteList.get_site_by_url(t_url)
+ self.assertEqual(site.ready, False)
+ self.assertEqual(site.url, t_url2)
+ site.get_resource()
+ self.assertEqual(site.ready, True, 'previous resource should still exist with data')
+
+ @use_local_response
+ def test_asin(self):
+ t_url = 'https://www.goodreads.com/book/show/45064996-hyperion'
+ site = SiteList.get_site_by_url(t_url)
+ site.get_resource_ready()
+ self.assertEqual(site.resource.item.title, 'Hyperion')
+ self.assertEqual(site.resource.item.asin, 'B004G60EHS')
+
+ @use_local_response
+ def test_work(self):
+ url = 'https://www.goodreads.com/work/editions/153313'
+ p = SiteList.get_site_by_url(url).get_resource_ready()
+ self.assertEqual(p.item.title, '1984')
+ url1 = 'https://www.goodreads.com/book/show/3597767-rok-1984'
+ url2 = 'https://www.goodreads.com/book/show/40961427-1984'
+ p1 = SiteList.get_site_by_url(url1).get_resource_ready()
+ p2 = SiteList.get_site_by_url(url2).get_resource_ready()
+ w1 = p1.item.works.all().first()
+ w2 = p2.item.works.all().first()
+ self.assertEqual(w1, w2)
+
+
+class GoogleBooksTestCase(TestCase):
+ def test_parse(self):
+ t_type = IdType.GoogleBooks
+ t_id = 'hV--zQEACAAJ'
+ t_url = 'https://books.google.com.bn/books?id=hV--zQEACAAJ&hl=ms'
+ t_url2 = 'https://books.google.com/books?id=hV--zQEACAAJ'
+ p1 = SiteList.get_site_by_url(t_url)
+ p2 = SiteList.get_site_by_url(t_url2)
+ self.assertIsNotNone(p1)
+ self.assertEqual(p1.url, t_url2)
+ self.assertEqual(p1.ID_TYPE, t_type)
+ self.assertEqual(p1.id_value, t_id)
+ self.assertEqual(p2.url, t_url2)
+
+ @use_local_response
+ def test_scrape(self):
+ t_url = 'https://books.google.com.bn/books?id=hV--zQEACAAJ'
+ site = SiteList.get_site_by_url(t_url)
+ self.assertEqual(site.ready, False)
+ site.get_resource_ready()
+ self.assertEqual(site.ready, True)
+ self.assertEqual(site.resource.metadata.get('title'), '1984 Nineteen Eighty-Four')
+ self.assertEqual(site.resource.metadata.get('isbn'), '9781847498571')
+ self.assertEqual(site.resource.id_type, IdType.GoogleBooks)
+ self.assertEqual(site.resource.id_value, 'hV--zQEACAAJ')
+ self.assertEqual(site.resource.item.isbn, '9781847498571')
+ self.assertEqual(site.resource.item.title, '1984 Nineteen Eighty-Four')
+
+
+class DoubanBookTestCase(TestCase):
+ def setUp(self):
+ pass
+
+ def test_parse(self):
+ t_type = IdType.DoubanBook
+ t_id = '35902899'
+ t_url = 'https://m.douban.com/book/subject/35902899/'
+ t_url2 = 'https://book.douban.com/subject/35902899/'
+ p1 = SiteList.get_site_by_url(t_url)
+ p2 = SiteList.get_site_by_url(t_url2)
+ self.assertEqual(p1.url, t_url2)
+ self.assertEqual(p1.ID_TYPE, t_type)
+ self.assertEqual(p1.id_value, t_id)
+ self.assertEqual(p2.url, t_url2)
+
+ @use_local_response
+ def test_scrape(self):
+ t_url = 'https://book.douban.com/subject/35902899/'
+ site = SiteList.get_site_by_url(t_url)
+ self.assertEqual(site.ready, False)
+ site.get_resource_ready()
+ self.assertEqual(site.ready, True)
+ self.assertEqual(site.resource.metadata.get('title'), '1984 Nineteen Eighty-Four')
+ self.assertEqual(site.resource.metadata.get('isbn'), '9781847498571')
+ self.assertEqual(site.resource.id_type, IdType.DoubanBook)
+ self.assertEqual(site.resource.id_value, '35902899')
+ self.assertEqual(site.resource.item.isbn, '9781847498571')
+ self.assertEqual(site.resource.item.title, '1984 Nineteen Eighty-Four')
+
+ @use_local_response
+ def test_work(self):
+ # url = 'https://www.goodreads.com/work/editions/153313'
+ url1 = 'https://book.douban.com/subject/1089243/'
+ url2 = 'https://book.douban.com/subject/2037260/'
+ p1 = SiteList.get_site_by_url(url1).get_resource_ready()
+ p2 = SiteList.get_site_by_url(url2).get_resource_ready()
+ w1 = p1.item.works.all().first()
+ w2 = p2.item.works.all().first()
+ self.assertEqual(w1.title, '黄金时代')
+ self.assertEqual(w2.title, '黄金时代')
+ self.assertEqual(w1, w2)
+ editions = w1.editions.all().order_by('title')
+ self.assertEqual(editions.count(), 2)
+ self.assertEqual(editions[0].title, 'Wang in Love and Bondage')
+ self.assertEqual(editions[1].title, '黄金时代')
+
+
+class MultiBookSitesTestCase(TestCase):
+ @use_local_response
+ def test_editions(self):
+ # isbn = '9781847498571'
+ url1 = 'https://www.goodreads.com/book/show/56821625-1984'
+ url2 = 'https://book.douban.com/subject/35902899/'
+ url3 = 'https://books.google.com/books?id=hV--zQEACAAJ'
+ p1 = SiteList.get_site_by_url(url1).get_resource_ready()
+ p2 = SiteList.get_site_by_url(url2).get_resource_ready()
+ p3 = SiteList.get_site_by_url(url3).get_resource_ready()
+ self.assertEqual(p1.item.id, p2.item.id)
+ self.assertEqual(p2.item.id, p3.item.id)
+
+ @use_local_response
+ def test_works(self):
+ # url1 and url4 has same ISBN, hence they share same Edition instance, which belongs to 2 Work instances
+ url1 = 'https://book.douban.com/subject/1089243/'
+ url2 = 'https://book.douban.com/subject/2037260/'
+ url3 = 'https://www.goodreads.com/book/show/59952545-golden-age'
+ url4 = 'https://www.goodreads.com/book/show/11798823'
+ p1 = SiteList.get_site_by_url(url1).get_resource_ready() # lxml bug may break this
+ w1 = p1.item.works.all().first()
+ p2 = SiteList.get_site_by_url(url2).get_resource_ready()
+ w2 = p2.item.works.all().first()
+ self.assertEqual(w1, w2)
+ self.assertEqual(p1.item.works.all().count(), 1)
+ p3 = SiteList.get_site_by_url(url3).get_resource_ready()
+ w3 = p3.item.works.all().first()
+ self.assertNotEqual(w3, w2)
+ p4 = SiteList.get_site_by_url(url4).get_resource_ready()
+ self.assertEqual(p4.item.works.all().count(), 2)
+ self.assertEqual(p1.item.works.all().count(), 2)
+ w2e = w2.editions.all().order_by('title')
+ self.assertEqual(w2e.count(), 2)
+ self.assertEqual(w2e[0].title, 'Wang in Love and Bondage')
+ self.assertEqual(w2e[1].title, '黄金时代')
+ w3e = w3.editions.all().order_by('title')
+ self.assertEqual(w3e.count(), 2)
+ self.assertEqual(w3e[0].title, 'Golden Age: A Novel')
+ self.assertEqual(w3e[1].title, '黄金时代')
+ e = Edition.objects.get(primary_lookup_id_value=9781662601217)
+ self.assertEqual(e.title, 'Golden Age: A Novel')
diff --git a/catalog/book/utils.py b/catalog/book/utils.py
new file mode 100644
index 00000000..fe3e50fc
--- /dev/null
+++ b/catalog/book/utils.py
@@ -0,0 +1,45 @@
+def check_digit_10(isbn):
+ assert len(isbn) == 9
+ sum = 0
+ for i in range(len(isbn)):
+ c = int(isbn[i])
+ w = i + 1
+ sum += w * c
+ r = sum % 11
+ return 'X' if r == 10 else str(r)
+
+
+def check_digit_13(isbn):
+ assert len(isbn) == 12
+ sum = 0
+ for i in range(len(isbn)):
+ c = int(isbn[i])
+ w = 3 if i % 2 else 1
+ sum += w * c
+ r = 10 - (sum % 10)
+ return '0' if r == 10 else str(r)
+
+
+def isbn_10_to_13(isbn):
+ if not isbn or len(isbn) != 10:
+ return None
+ return '978' + isbn[:-1] + check_digit_13('978' + isbn[:-1])
+
+
+def isbn_13_to_10(isbn):
+ if not isbn or len(isbn) != 13 or isbn[:3] != '978':
+ return None
+ else:
+ return isbn[3:12] + check_digit_10(isbn[3:12])
+
+
+def is_isbn_13(isbn):
+ return len(isbn) == 13
+
+
+def is_isbn_10(isbn):
+ return len(isbn) == 10 and isbn[0] >= '0' and isbn[0] <= '9'
+
+
+def is_asin(asin):
+ return len(asin) == 10 and asin[0].lower == 'b'
diff --git a/catalog/common/__init__.py b/catalog/common/__init__.py
new file mode 100644
index 00000000..9a0a165b
--- /dev/null
+++ b/catalog/common/__init__.py
@@ -0,0 +1,8 @@
+from .models import *
+from .sites import *
+from .downloaders import *
+from .scrapers import *
+from . import jsondata
+
+
+__all__ = ('IdType', 'Item', 'ExternalResource', 'ResourceContent', 'ParseError', 'AbstractSite', 'SiteList', 'jsondata', 'PrimaryLookupIdDescriptor', 'LookupIdDescriptor', 'get_mock_mode', 'get_mock_file', 'use_local_response', 'RetryDownloader', 'BasicDownloader', 'ProxiedDownloader', 'BasicImageDownloader', 'RESPONSE_OK', 'RESPONSE_NETWORK_ERROR', 'RESPONSE_INVALID_CONTENT', 'RESPONSE_CENSORSHIP')
diff --git a/catalog/common/downloaders.py b/catalog/common/downloaders.py
new file mode 100644
index 00000000..f7d1ed83
--- /dev/null
+++ b/catalog/common/downloaders.py
@@ -0,0 +1,245 @@
+import requests
+import filetype
+from PIL import Image
+from io import BytesIO
+from requests.exceptions import RequestException
+from django.conf import settings
+from pathlib import Path
+import json
+from io import StringIO
+import re
+import time
+import logging
+from lxml import html
+
+
+_logger = logging.getLogger(__name__)
+
+
+RESPONSE_OK = 0 # response is ready for pasring
+RESPONSE_INVALID_CONTENT = -1 # content not valid but no need to retry
+RESPONSE_NETWORK_ERROR = -2 # network error, retry next proxied url
+RESPONSE_CENSORSHIP = -3 # censored, try sth special if possible
+
+_mock_mode = False
+
+
+def use_local_response(func):
+ def _func(args):
+ set_mock_mode(True)
+ func(args)
+ set_mock_mode(False)
+ return _func
+
+
+def set_mock_mode(enabled):
+ global _mock_mode
+ _mock_mode = enabled
+
+
+def get_mock_mode():
+ global _mock_mode
+ return _mock_mode
+
+
+def get_mock_file(url):
+ fn = re.sub(r'[^\w]', '_', url)
+ return re.sub(r'_key_[A-Za-z0-9]+', '_key_19890604', fn)
+
+
+class DownloadError(Exception):
+ def __init__(self, downloader, msg=None):
+ self.url = downloader.url
+ self.logs = downloader.logs
+ if downloader.response_type == RESPONSE_INVALID_CONTENT:
+ error = "Invalid Response"
+ elif downloader.response_type == RESPONSE_NETWORK_ERROR:
+ error = "Network Error"
+ elif downloader.response_type == RESPONSE_NETWORK_ERROR:
+ error = "Censored Content"
+ else:
+ error = "Unknown Error"
+ self.message = f"Download Failed: {error}{', ' + msg if msg else ''}, url: {self.url}"
+ super().__init__(self.message)
+
+
+class BasicDownloader:
+ headers = {
+ # 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:107.0) Gecko/20100101 Firefox/107.0',
+ 'User-Agent': 'Mozilla/5.0 (iPad; CPU OS 14_7_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Mobile/15E148 Safari/604.1',
+ 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
+ 'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
+ 'Accept-Encoding': 'gzip, deflate',
+ 'Connection': 'keep-alive',
+ 'DNT': '1',
+ 'Upgrade-Insecure-Requests': '1',
+ 'Cache-Control': 'no-cache',
+ }
+
+ def __init__(self, url, headers=None):
+ self.url = url
+ self.response_type = RESPONSE_OK
+ self.logs = []
+ if headers:
+ self.headers = headers
+
+ def get_timeout(self):
+ return settings.SCRAPING_TIMEOUT
+
+ def validate_response(self, response):
+ if response is None:
+ return RESPONSE_NETWORK_ERROR
+ elif response.status_code == 200:
+ return RESPONSE_OK
+ else:
+ return RESPONSE_INVALID_CONTENT
+
+ def _download(self, url):
+ try:
+ if not _mock_mode:
+ # TODO cache = get/set from redis
+ resp = requests.get(url, headers=self.headers, timeout=self.get_timeout())
+ if settings.DOWNLOADER_SAVEDIR:
+ with open(settings.DOWNLOADER_SAVEDIR + '/' + get_mock_file(url), 'w', encoding='utf-8') as fp:
+ fp.write(resp.text)
+ else:
+ resp = MockResponse(self.url)
+ response_type = self.validate_response(resp)
+ self.logs.append({'response_type': response_type, 'url': url, 'exception': None})
+
+ return resp, response_type
+ except RequestException as e:
+ self.logs.append({'response_type': RESPONSE_NETWORK_ERROR, 'url': url, 'exception': e})
+ return None, RESPONSE_NETWORK_ERROR
+
+ def download(self):
+ resp, self.response_type = self._download(self.url)
+ if self.response_type == RESPONSE_OK:
+ return resp
+ else:
+ raise DownloadError(self)
+
+
+class ProxiedDownloader(BasicDownloader):
+ def get_proxied_urls(self):
+ urls = []
+ if settings.PROXYCRAWL_KEY is not None:
+ urls.append(f'https://api.proxycrawl.com/?token={settings.PROXYCRAWL_KEY}&url={self.url}')
+ if settings.SCRAPESTACK_KEY is not None:
+ # urls.append(f'http://api.scrapestack.com/scrape?access_key={settings.SCRAPESTACK_KEY}&url={self.url}')
+ urls.append(f'http://api.scrapestack.com/scrape?keep_headers=1&access_key={settings.SCRAPESTACK_KEY}&url={self.url}')
+ if settings.SCRAPERAPI_KEY is not None:
+ urls.append(f'http://api.scraperapi.com/?api_key={settings.SCRAPERAPI_KEY}&url={self.url}')
+ return urls
+
+ def get_special_proxied_url(self):
+ return f'{settings.LOCAL_PROXY}?url={self.url}' if settings.LOCAL_PROXY is not None else None
+
+ def download(self):
+ urls = self.get_proxied_urls()
+ last_try = False
+ url = urls.pop(0) if len(urls) else None
+ resp = None
+ while url:
+ resp, resp_type = self._download(url)
+ if resp_type == RESPONSE_OK or resp_type == RESPONSE_INVALID_CONTENT or last_try:
+ url = None
+ elif resp_type == RESPONSE_CENSORSHIP:
+ url = self.get_special_proxied_url()
+ last_try = True
+ else: # resp_type == RESPONSE_NETWORK_ERROR:
+ url = urls.pop(0) if len(urls) else None
+ self.response_type = resp_type
+ if self.response_type == RESPONSE_OK:
+ return resp
+ else:
+ raise DownloadError(self)
+
+
+class RetryDownloader(BasicDownloader):
+ def download(self):
+ retries = settings.DOWNLOADER_RETRIES
+ while retries:
+ retries -= 1
+ resp, self.response_type = self._download(self.url)
+ if self.response_type == RESPONSE_OK:
+ return resp
+ elif self.response_type != RESPONSE_NETWORK_ERROR and retries == 0:
+ raise DownloadError(self)
+ elif retries > 0:
+ _logger.debug('Retry ' + self.url)
+ time.sleep((settings.DOWNLOADER_RETRIES - retries) * 0.5)
+ raise DownloadError(self, 'max out of retries')
+
+
+class ImageDownloaderMixin:
+ def __init__(self, url, referer=None):
+ if referer is not None:
+ self.headers['Referer'] = referer
+ super().__init__(url)
+
+ def validate_response(self, response):
+ if response and response.status_code == 200:
+ try:
+ raw_img = response.content
+ img = Image.open(BytesIO(raw_img))
+ img.load() # corrupted image will trigger exception
+ content_type = response.headers.get('Content-Type')
+ self.extention = filetype.get_type(mime=content_type.partition(';')[0].strip()).extension
+ return RESPONSE_OK
+ except Exception:
+ return RESPONSE_NETWORK_ERROR
+ if response and response.status_code >= 400 and response.status_code < 500:
+ return RESPONSE_INVALID_CONTENT
+ else:
+ return RESPONSE_NETWORK_ERROR
+
+
+class BasicImageDownloader(ImageDownloaderMixin, BasicDownloader):
+ @classmethod
+ def download_image(cls, image_url, page_url):
+ imgdl = cls(image_url, page_url)
+ try:
+ image = imgdl.download().content
+ image_extention = imgdl.extention
+ return image, image_extention
+ except Exception:
+ return None, None
+
+
+class ProxiedImageDownloader(ImageDownloaderMixin, ProxiedDownloader):
+ pass
+
+
+_local_response_path = str(Path(__file__).parent.parent.parent.absolute()) + '/test_data/'
+
+
+class MockResponse:
+ def __init__(self, url):
+ self.url = url
+ fn = _local_response_path + get_mock_file(url)
+ try:
+ self.content = Path(fn).read_bytes()
+ self.status_code = 200
+ _logger.debug(f"use local response for {url} from {fn}")
+ except Exception:
+ self.content = b'Error: response file not found'
+ self.status_code = 404
+ _logger.debug(f"local response not found for {url} at {fn}")
+
+ @property
+ def text(self):
+ return self.content.decode('utf-8')
+
+ def json(self):
+ return json.load(StringIO(self.text))
+
+ def html(self):
+ return html.fromstring(self.text) # may throw exception unexpectedly due to OS bug
+
+ @property
+ def headers(self):
+ return {'Content-Type': 'image/jpeg' if self.url.endswith('jpg') else 'text/html'}
+
+
+requests.Response.html = MockResponse.html
diff --git a/catalog/common/jsondata.py b/catalog/common/jsondata.py
new file mode 100644
index 00000000..ade72570
--- /dev/null
+++ b/catalog/common/jsondata.py
@@ -0,0 +1,201 @@
+import copy
+from datetime import date, datetime
+from importlib import import_module
+
+import django
+from django.conf import settings
+from django.core.exceptions import FieldError
+from django.db.models import fields
+from django.utils import dateparse, timezone
+
+from functools import partialmethod
+from django.db.models import JSONField
+
+
+__all__ = ('BooleanField', 'CharField', 'DateField', 'DateTimeField', 'DecimalField', 'EmailField', 'FloatField', 'IntegerField', 'IPAddressField', 'GenericIPAddressField', 'NullBooleanField', 'TextField', 'TimeField', 'URLField', 'ArrayField')
+
+
+class JSONFieldDescriptor(object):
+ def __init__(self, field):
+ self.field = field
+
+ def __get__(self, instance, cls=None):
+ if instance is None:
+ return self
+ json_value = getattr(instance, self.field.json_field_name)
+ if isinstance(json_value, dict):
+ if self.field.attname in json_value or not self.field.has_default():
+ value = json_value.get(self.field.attname, None)
+ if hasattr(self.field, 'from_json'):
+ value = self.field.from_json(value)
+ return value
+ else:
+ default = self.field.get_default()
+ if hasattr(self.field, 'to_json'):
+ json_value[self.field.attname] = self.field.to_json(default)
+ else:
+ json_value[self.field.attname] = default
+ return default
+ return None
+
+ def __set__(self, instance, value):
+ json_value = getattr(instance, self.field.json_field_name)
+ if json_value:
+ assert isinstance(json_value, dict)
+ else:
+ json_value = {}
+
+ if hasattr(self.field, 'to_json'):
+ value = self.field.to_json(value)
+
+ if not value and self.field.blank and not self.field.null:
+ try:
+ del json_value[self.field.attname]
+ except KeyError:
+ pass
+ else:
+ json_value[self.field.attname] = value
+
+ setattr(instance, self.field.json_field_name, json_value)
+
+
+class JSONFieldMixin(object):
+ """
+ Override django.db.model.fields.Field.contribute_to_class
+ to make a field always private, and register custom access descriptor
+ """
+
+ def __init__(self, *args, **kwargs):
+ self.json_field_name = kwargs.pop('json_field_name', 'metadata')
+ super(JSONFieldMixin, self).__init__(*args, **kwargs)
+
+ def contribute_to_class(self, cls, name, private_only=False):
+ self.set_attributes_from_name(name)
+ self.model = cls
+ self.concrete = False
+ self.column = self.json_field_name
+ cls._meta.add_field(self, private=True)
+
+ if not getattr(cls, self.attname, None):
+ descriptor = JSONFieldDescriptor(self)
+ setattr(cls, self.attname, descriptor)
+
+ if self.choices is not None:
+ setattr(cls, 'get_%s_display' % self.name,
+ partialmethod(cls._get_FIELD_display, field=self))
+
+ def get_lookup(self, lookup_name):
+ # Always return None, to make get_transform been called
+ return None
+
+ def get_transform(self, name):
+ class TransformFactoryWrapper:
+ def __init__(self, json_field, transform, original_lookup):
+ self.json_field = json_field
+ self.transform = transform
+ self.original_lookup = original_lookup
+
+ def __call__(self, lhs, **kwargs):
+ lhs = copy.copy(lhs)
+ lhs.target = self.json_field
+ lhs.output_field = self.json_field
+ transform = self.transform(lhs, **kwargs)
+ transform._original_get_lookup = transform.get_lookup
+ transform.get_lookup = lambda name: transform._original_get_lookup(self.original_lookup)
+ return transform
+
+ json_field = self.model._meta.get_field(self.json_field_name)
+ transform = json_field.get_transform(self.name)
+ if transform is None:
+ raise FieldError(
+ "JSONField '%s' has no support for key '%s' %s lookup" %
+ (self.json_field_name, self.name, name)
+ )
+
+ return TransformFactoryWrapper(json_field, transform, name)
+
+
+class BooleanField(JSONFieldMixin, fields.BooleanField):
+ def __init__(self, *args, **kwargs):
+ super(BooleanField, self).__init__(*args, **kwargs)
+ if django.VERSION < (2, ):
+ self.blank = False
+
+
+class CharField(JSONFieldMixin, fields.CharField):
+ pass
+
+
+class DateField(JSONFieldMixin, fields.DateField):
+ def to_json(self, value):
+ if value:
+ assert isinstance(value, (datetime, date))
+ return value.strftime('%Y-%m-%d')
+
+ def from_json(self, value):
+ if value is not None:
+ return dateparse.parse_date(value)
+
+
+class DateTimeField(JSONFieldMixin, fields.DateTimeField):
+ def to_json(self, value):
+ if value:
+ if not timezone.is_aware(value):
+ value = timezone.make_aware(value)
+ return value.isoformat()
+
+ def from_json(self, value):
+ if value:
+ return dateparse.parse_datetime(value)
+
+
+class DecimalField(JSONFieldMixin, fields.DecimalField):
+ pass
+
+
+class EmailField(JSONFieldMixin, fields.EmailField):
+ pass
+
+
+class FloatField(JSONFieldMixin, fields.FloatField):
+ pass
+
+
+class IntegerField(JSONFieldMixin, fields.IntegerField):
+ pass
+
+
+class IPAddressField(JSONFieldMixin, fields.IPAddressField):
+ pass
+
+
+class GenericIPAddressField(JSONFieldMixin, fields.GenericIPAddressField):
+ pass
+
+
+class NullBooleanField(JSONFieldMixin, fields.NullBooleanField):
+ pass
+
+
+class TextField(JSONFieldMixin, fields.TextField):
+ pass
+
+
+class TimeField(JSONFieldMixin, fields.TimeField):
+ def to_json(self, value):
+ if value:
+ if not timezone.is_aware(value):
+ value = timezone.make_aware(value)
+ return value.isoformat()
+
+ def from_json(self, value):
+ if value:
+ return dateparse.parse_time(value)
+
+
+class URLField(JSONFieldMixin, fields.URLField):
+ pass
+
+
+class ArrayField(JSONFieldMixin, JSONField):
+ pass
diff --git a/catalog/common/models.py b/catalog/common/models.py
new file mode 100644
index 00000000..586e7d95
--- /dev/null
+++ b/catalog/common/models.py
@@ -0,0 +1,268 @@
+from polymorphic.models import PolymorphicModel
+from django.db import models
+from catalog.common import jsondata
+from django.utils.translation import gettext_lazy as _
+from django.utils import timezone
+from django.core.files.uploadedfile import SimpleUploadedFile
+from django.contrib.contenttypes.models import ContentType
+import uuid
+from .utils import DEFAULT_ITEM_COVER, item_cover_path
+# from django.conf import settings
+
+
+class IdType(models.TextChoices):
+ WikiData = 'wikidata', _('维基数据')
+ ISBN10 = 'isbn10', _('ISBN10')
+ ISBN = 'isbn', _('ISBN') # ISBN 13
+ ASIN = 'asin', _('ASIN')
+ ISSN = 'issn', _('ISSN')
+ CUBN = 'cubn', _('统一书号')
+ ISRC = 'isrc', _('ISRC') # only for songs
+ GTIN = 'gtin', _('GTIN UPC EAN码') # ISBN is separate
+ Feed = 'feed', _('Feed URL')
+ IMDB = 'imdb', _('IMDb')
+ TMDB_TV = 'tmdb_tv', _('TMDB剧集')
+ TMDB_TVSeason = 'tmdb_tvseason', _('TMDB剧集')
+ TMDB_TVEpisode = 'tmdb_tvepisode', _('TMDB剧集')
+ TMDB_Movie = 'tmdb_movie', _('TMDB电影')
+ Goodreads = 'goodreads', _('Goodreads')
+ Goodreads_Work = 'goodreads_work', _('Goodreads著作')
+ GoogleBooks = 'googlebooks', _('谷歌图书')
+ DoubanBook = 'doubanbook', _('豆瓣读书')
+ DoubanBook_Work = 'doubanbook_work', _('豆瓣读书著作')
+ DoubanMovie = 'doubanmovie', _('豆瓣电影')
+ DoubanMusic = 'doubanmusic', _('豆瓣音乐')
+ DoubanGame = 'doubangame', _('豆瓣游戏')
+ DoubanDrama = 'doubandrama', _('豆瓣舞台剧')
+ Bandcamp = 'bandcamp', _('Bandcamp')
+ Spotify_Album = 'spotify_album', _('Spotify专辑')
+ Spotify_Show = 'spotify_show', _('Spotify播客')
+ Discogs_Release = 'discogs_release', ('Discogs Release')
+ Discogs_Master = 'discogs_master', ('Discogs Master')
+ MusicBrainz = 'musicbrainz', ('MusicBrainz ID')
+ DoubanBook_Author = 'doubanbook_author', _('豆瓣读书作者')
+ DoubanCelebrity = 'doubanmovie_celebrity', _('豆瓣电影影人')
+ Goodreads_Author = 'goodreads_author', _('Goodreads作者')
+ Spotify_Artist = 'spotify_artist', _('Spotify艺术家')
+ TMDB_Person = 'tmdb_person', _('TMDB影人')
+ IGDB = 'igdb', _('IGDB游戏')
+ Steam = 'steam', _('Steam游戏')
+ Bangumi = 'bangumi', _('Bangumi')
+ ApplePodcast = 'apple_podcast', _('苹果播客')
+
+
+class ItemType(models.TextChoices):
+ Book = 'book', _('书')
+ TV = 'tv', _('剧集')
+ TVSeason = 'tvseason', _('剧集分季')
+ TVEpisode = 'tvepisode', _('剧集分集')
+ Movie = 'movie', _('电影')
+ Music = 'music', _('音乐')
+ Game = 'game', _('游戏')
+ Boardgame = 'boardgame', _('桌游')
+ Podcast = 'podcast', _('播客')
+ FanFic = 'fanfic', _('网文')
+ Performance = 'performance', _('演出')
+ Exhibition = 'exhibition', _('展览')
+
+
+class SubItemType(models.TextChoices):
+ Season = 'season', _('剧集分季')
+ Episode = 'episode', _('剧集分集')
+ Version = 'version', _('版本')
+
+# class CreditType(models.TextChoices):
+# Author = 'author', _('作者')
+# Translater = 'translater', _('译者')
+# Producer = 'producer', _('出品人')
+# Director = 'director', _('电影')
+# Actor = 'actor', _('演员')
+# Playwright = 'playwright', _('播客')
+# VoiceActor = 'voiceactor', _('配音')
+# Host = 'host', _('主持人')
+# Developer = 'developer', _('开发者')
+# Publisher = 'publisher', _('出版方')
+
+
+class PrimaryLookupIdDescriptor(object): # TODO make it mixin of Field
+ def __init__(self, id_type):
+ self.id_type = id_type
+
+ def __get__(self, instance, cls=None):
+ if instance is None:
+ return self
+ if self.id_type != instance.primary_lookup_id_type:
+ return None
+ return instance.primary_lookup_id_value
+
+ def __set__(self, instance, id_value):
+ if id_value:
+ instance.primary_lookup_id_type = self.id_type
+ instance.primary_lookup_id_value = id_value
+ else:
+ instance.primary_lookup_id_type = None
+ instance.primary_lookup_id_value = None
+
+
+class LookupIdDescriptor(object): # TODO make it mixin of Field
+ def __init__(self, id_type):
+ self.id_type = id_type
+
+ def __get__(self, instance, cls=None):
+ if instance is None:
+ return self
+ return instance.get_lookup_id(self.id_type)
+
+ def __set__(self, instance, value):
+ instance.set_lookup_id(self.id_type, value)
+
+
+# class ItemId(models.Model):
+# item = models.ForeignKey('Item', models.CASCADE)
+# id_type = models.CharField(_("源网站"), blank=False, choices=IdType.choices, max_length=50)
+# id_value = models.CharField(_("源网站ID"), blank=False, max_length=1000)
+
+
+# class ItemCredit(models.Model):
+# item = models.ForeignKey('Item', models.CASCADE)
+# credit_type = models.CharField(_("类型"), choices=CreditType.choices, blank=False, max_length=50)
+# name = models.CharField(_("名字"), blank=False, max_length=1000)
+
+
+# def check_source_id(sid):
+# if not sid:
+# return True
+# s = sid.split(':')
+# if len(s) < 2:
+# return False
+# return sid[0] in IdType.values()
+
+
+class Item(PolymorphicModel):
+ uid = models.UUIDField(default=uuid.uuid4, editable=False)
+ # item_type = models.CharField(_("类型"), choices=ItemType.choices, blank=False, max_length=50)
+ title = models.CharField(_("title in primary language"), max_length=1000, default="")
+ # title_ml = models.JSONField(_("title in different languages {['lang':'zh-cn', 'text':'', primary:True], ...}"), null=True, blank=True, default=list)
+ brief = models.TextField(_("简介"), blank=True, default="")
+ # brief_ml = models.JSONField(_("brief in different languages {['lang':'zh-cn', 'text':'', primary:True], ...}"), null=True, blank=True, default=list)
+ genres = models.JSONField(_("分类"), null=True, blank=True, default=list)
+ primary_lookup_id_type = models.CharField(_("isbn/cubn/imdb"), blank=False, null=True, max_length=50)
+ primary_lookup_id_value = models.CharField(_("1234/tt789"), blank=False, null=True, max_length=1000)
+ metadata = models.JSONField(_("其他信息"), blank=True, null=True, default=dict)
+ cover = models.ImageField(upload_to=item_cover_path, default=DEFAULT_ITEM_COVER, blank=True)
+ created_time = models.DateTimeField(auto_now_add=True)
+ edited_time = models.DateTimeField(auto_now=True)
+ # parent_item = models.ForeignKey('Item', null=True, on_delete=models.SET_NULL, related_name='child_items')
+ # identical_item = models.ForeignKey('Item', null=True, on_delete=models.SET_NULL, related_name='identical_items')
+ # def get_lookup_id(self, id_type: str) -> str:
+ # prefix = id_type.strip().lower() + ':'
+ # return next((x[len(prefix):] for x in self.lookup_ids if x.startswith(prefix)), None)
+
+ class Meta:
+ unique_together = [['polymorphic_ctype_id', 'primary_lookup_id_type', 'primary_lookup_id_value']]
+
+ def __str__(self):
+ return f"{self.id}{' ' + self.primary_lookup_id_type + ':' + self.primary_lookup_id_value if self.primary_lookup_id_value else ''} ({self.title})"
+
+ @classmethod
+ def get_best_lookup_id(cls, lookup_ids):
+ """ get best available lookup id, ideally commonly used """
+ best_id_types = [
+ IdType.ISBN, IdType.CUBN, IdType.ASIN,
+ IdType.GTIN, IdType.ISRC, IdType.MusicBrainz,
+ IdType.Feed,
+ IdType.IMDB, IdType.TMDB_TVSeason
+ ]
+ for t in best_id_types:
+ if lookup_ids.get(t):
+ return t, lookup_ids[t]
+ return list(lookup_ids.items())[0]
+
+ def update_lookup_ids(self, lookup_ids):
+ # TODO
+ # ll = set(lookup_ids)
+ # ll = list(filter(lambda a, b: b, ll))
+ # print(ll)
+ pass
+
+ METADATA_COPY_LIST = ['title', 'brief'] # list of metadata keys to copy from resource to item
+
+ @classmethod
+ def copy_metadata(cls, metadata):
+ return dict((k, v) for k, v in metadata.items() if k in cls.METADATA_COPY_LIST and v is not None)
+
+ def merge_data_from_external_resources(self):
+ """Subclass may override this"""
+ lookup_ids = []
+ for p in self.external_resources.all():
+ lookup_ids.append((p.id_type, p.id_value))
+ lookup_ids += p.other_lookup_ids.items()
+ for k in self.METADATA_COPY_LIST:
+ if not getattr(self, k) and p.metadata.get(k):
+ setattr(self, k, p.metadata.get(k))
+ if not self.cover and p.cover:
+ self.cover = p.cover
+ self.update_lookup_ids(lookup_ids)
+
+ def update_linked_items_from_external_resource(self, resource):
+ """Subclass should override this"""
+ pass
+
+
+class ItemLookupId(models.Model):
+ item = models.ForeignKey(Item, null=True, on_delete=models.SET_NULL, related_name='lookup_ids')
+ id_type = models.CharField(_("源网站"), blank=True, choices=IdType.choices, max_length=50)
+ id_value = models.CharField(_("源网站ID"), blank=True, max_length=1000)
+ raw_url = models.CharField(_("源网站ID"), blank=True, max_length=1000, unique=True)
+
+ class Meta:
+ unique_together = [['id_type', 'id_value']]
+
+
+class ExternalResource(models.Model):
+ item = models.ForeignKey(Item, null=True, on_delete=models.SET_NULL, related_name='external_resources')
+ id_type = models.CharField(_("IdType of the source site"), blank=False, choices=IdType.choices, max_length=50)
+ id_value = models.CharField(_("Primary Id on the source site"), blank=False, max_length=1000)
+ url = models.CharField(_("url to the resource"), blank=False, max_length=1000, unique=True)
+ cover = models.ImageField(upload_to=item_cover_path, default=DEFAULT_ITEM_COVER, blank=True)
+ other_lookup_ids = models.JSONField(default=dict)
+ metadata = models.JSONField(default=dict)
+ scraped_time = models.DateTimeField(null=True)
+ created_time = models.DateTimeField(auto_now_add=True)
+ edited_time = models.DateTimeField(auto_now=True)
+ required_resources = jsondata.ArrayField(null=False, blank=False, default=list)
+ related_resources = jsondata.ArrayField(null=False, blank=False, default=list)
+
+ class Meta:
+ unique_together = [['id_type', 'id_value']]
+
+ def __str__(self):
+ return f"{self.id}{':' + self.id_type + ':' + self.id_value if self.id_value else ''} ({self.url})"
+
+ def update_content(self, resource_content):
+ self.other_lookup_ids = resource_content.lookup_ids
+ self.metadata = resource_content.metadata
+ if resource_content.cover_image and resource_content.cover_image_extention:
+ self.cover = SimpleUploadedFile('temp.' + resource_content.cover_image_extention, resource_content.cover_image)
+ self.scraped_time = timezone.now()
+ self.save()
+
+ @property
+ def ready(self):
+ return bool(self.metadata and self.scraped_time)
+
+ def get_all_lookup_ids(self):
+ d = self.other_lookup_ids.copy()
+ d[self.id_type] = self.id_value
+ d = {k: v for k, v in d.items() if bool(v)}
+ return d
+
+ def get_preferred_model(self):
+ model = self.metadata.get('preferred_model')
+ if model:
+ m = ContentType.objects.filter(app_label='catalog', model=model.lower()).first()
+ if m:
+ return m.model_class()
+ else:
+ raise ValueError(f'preferred model {model} does not exist')
+ return None
diff --git a/catalog/common/scrapers.py b/catalog/common/scrapers.py
new file mode 100644
index 00000000..b97f6d0d
--- /dev/null
+++ b/catalog/common/scrapers.py
@@ -0,0 +1,4 @@
+class ParseError(Exception):
+ def __init__(self, scraper, field):
+ msg = f'{type(scraper).__name__}: Error parsing field "{field}" for url {scraper.url}'
+ super().__init__(msg)
diff --git a/catalog/common/sites.py b/catalog/common/sites.py
new file mode 100644
index 00000000..d23db01e
--- /dev/null
+++ b/catalog/common/sites.py
@@ -0,0 +1,155 @@
+"""
+Site and SiteList
+
+Site should inherite from AbstractSite
+a Site should map to a unique set of url patterns.
+a Site may scrape a url and store result in ResourceContent
+ResourceContent persists as an ExternalResource which may link to an Item
+"""
+from typing import *
+import re
+from .models import ExternalResource
+from dataclasses import dataclass, field
+import logging
+
+
+_logger = logging.getLogger(__name__)
+
+
+@dataclass
+class ResourceContent:
+ lookup_ids: dict = field(default_factory=dict)
+ metadata: dict = field(default_factory=dict)
+ cover_image: bytes = None
+ cover_image_extention: str = None
+
+
+class AbstractSite:
+ """
+ Abstract class to represent a site
+ """
+ ID_TYPE = None
+ WIKI_PROPERTY_ID = 'P0undefined0'
+ DEFAULT_MODEL = None
+ URL_PATTERNS = [r"\w+://undefined/(\d+)"]
+
+ @classmethod
+ def validate_url(self, url: str):
+ u = next(iter([re.match(p, url) for p in self.URL_PATTERNS if re.match(p, url)]), None)
+ return u is not None
+
+ @classmethod
+ def id_to_url(self, id_value):
+ return 'https://undefined/' + id_value
+
+ @classmethod
+ def url_to_id(self, url: str):
+ u = next(iter([re.match(p, url) for p in self.URL_PATTERNS if re.match(p, url)]), None)
+ return u[1] if u else None
+
+ def __str__(self):
+ return f'<{self.__class__.__name__}: {self.url}>'
+
+ def __init__(self, url=None):
+ self.id_value = self.url_to_id(url) if url else None
+ self.url = self.id_to_url(self.id_value) if url else None
+ self.resource = None
+
+ def get_resource(self):
+ if not self.resource:
+ self.resource = ExternalResource.objects.filter(url=self.url).first()
+ if self.resource is None:
+ self.resource = ExternalResource(id_type=self.ID_TYPE, id_value=self.id_value, url=self.url)
+ return self.resource
+
+ def bypass_scrape(self, data_from_link) -> ResourceContent | None:
+ """subclass may implement this to use data from linked resource and bypass actual scrape"""
+ return None
+
+ def scrape(self) -> ResourceContent:
+ """subclass should implement this, return ResourceContent object"""
+ data = ResourceContent()
+ return data
+
+ def get_item(self):
+ p = self.get_resource()
+ if not p:
+ raise ValueError(f'resource not available for {self.url}')
+ model = p.get_preferred_model()
+ if not model:
+ model = self.DEFAULT_MODEL
+ t, v = model.get_best_lookup_id(p.get_all_lookup_ids())
+ if t is not None:
+ p.item = model.objects.filter(primary_lookup_id_type=t, primary_lookup_id_value=v).first()
+ if p.item is None:
+ obj = model.copy_metadata(p.metadata)
+ obj['primary_lookup_id_type'] = t
+ obj['primary_lookup_id_value'] = v
+ p.item = model.objects.create(**obj)
+ return p.item
+
+ @property
+ def ready(self):
+ return bool(self.resource and self.resource.ready)
+
+ def get_resource_ready(self, auto_save=True, auto_create=True, auto_link=True, data_from_link=None):
+ """return a resource scraped, or scrape if not yet"""
+ if auto_link:
+ auto_create = True
+ if auto_create:
+ auto_save = True
+ p = self.get_resource()
+ resource_content = {}
+ if not self.resource:
+ return None
+ if not p.ready:
+ resource_content = self.bypass_scrape(data_from_link)
+ if not resource_content:
+ resource_content = self.scrape()
+ p.update_content(resource_content)
+ if not p.ready:
+ _logger.error(f'unable to get resource {self.url} ready')
+ return None
+ if auto_create and p.item is None:
+ self.get_item()
+ if auto_save:
+ p.save()
+ if p.item:
+ p.item.merge_data_from_external_resources()
+ p.item.save()
+ if auto_link:
+ for linked_resources in p.required_resources:
+ linked_site = SiteList.get_site_by_url(linked_resources['url'])
+ if linked_site:
+ linked_site.get_resource_ready(auto_link=False)
+ else:
+ _logger.error(f'unable to get site for {linked_resources["url"]}')
+ p.item.update_linked_items_from_external_resource(p)
+ p.item.save()
+ return p
+
+
+class SiteList:
+ registry = {}
+
+ @classmethod
+ def register(cls, target) -> Callable:
+ id_type = target.ID_TYPE
+ if id_type in cls.registry:
+ raise ValueError(f'Site for {id_type} already exists')
+ cls.registry[id_type] = target
+ return target
+
+ @classmethod
+ def get_site_by_id_type(cls, typ: str):
+ return cls.registry[typ]() if typ in cls.registry else None
+
+ @classmethod
+ def get_site_by_url(cls, url: str):
+ cls = next(filter(lambda p: p.validate_url(url), cls.registry.values()), None)
+ return cls(url) if cls else None
+
+ @classmethod
+ def get_id_by_url(cls, url: str):
+ site = cls.get_site_by_url(url)
+ return site.url_to_id(url) if site else None
diff --git a/catalog/common/utils.py b/catalog/common/utils.py
new file mode 100644
index 00000000..39b115a9
--- /dev/null
+++ b/catalog/common/utils.py
@@ -0,0 +1,14 @@
+import logging
+from django.utils import timezone
+import uuid
+
+
+_logger = logging.getLogger(__name__)
+
+
+DEFAULT_ITEM_COVER = 'item/default.svg'
+
+
+def item_cover_path(resource, filename):
+ fn = timezone.now().strftime('%Y/%m/%d/') + str(uuid.uuid4()) + '.' + filename.split('.')[-1]
+ return 'items/' + resource.id_type + '/' + fn
diff --git a/catalog/game/models.py b/catalog/game/models.py
new file mode 100644
index 00000000..08c07dc3
--- /dev/null
+++ b/catalog/game/models.py
@@ -0,0 +1,8 @@
+from catalog.common import *
+
+
+class Game(Item):
+ igdb = PrimaryLookupIdDescriptor(IdType.IGDB)
+ steam = PrimaryLookupIdDescriptor(IdType.Steam)
+ douban_game = PrimaryLookupIdDescriptor(IdType.DoubanGame)
+ platforms = jsondata.ArrayField(default=list)
diff --git a/catalog/game/tests.py b/catalog/game/tests.py
new file mode 100644
index 00000000..cf7437d6
--- /dev/null
+++ b/catalog/game/tests.py
@@ -0,0 +1,117 @@
+from django.test import TestCase
+from catalog.common import *
+from catalog.models import *
+
+
+class IGDBTestCase(TestCase):
+ def test_parse(self):
+ t_id_type = IdType.IGDB
+ t_id_value = 'portal-2'
+ t_url = 'https://www.igdb.com/games/portal-2'
+ site = SiteList.get_site_by_id_type(t_id_type)
+ self.assertIsNotNone(site)
+ self.assertEqual(site.validate_url(t_url), True)
+ site = SiteList.get_site_by_url(t_url)
+ self.assertEqual(site.url, t_url)
+ self.assertEqual(site.id_value, t_id_value)
+
+ @use_local_response
+ def test_scrape(self):
+ t_url = 'https://www.igdb.com/games/portal-2'
+ site = SiteList.get_site_by_url(t_url)
+ self.assertEqual(site.ready, False)
+ site.get_resource_ready()
+ self.assertEqual(site.ready, True)
+ self.assertEqual(site.resource.metadata['title'], 'Portal 2')
+ self.assertIsInstance(site.resource.item, Game)
+ self.assertEqual(site.resource.item.steam, '620')
+
+ @use_local_response
+ def test_scrape_non_steam(self):
+ t_url = 'https://www.igdb.com/games/the-legend-of-zelda-breath-of-the-wild'
+ site = SiteList.get_site_by_url(t_url)
+ self.assertEqual(site.ready, False)
+ site.get_resource_ready()
+ self.assertEqual(site.ready, True)
+ self.assertEqual(site.resource.metadata['title'], 'The Legend of Zelda: Breath of the Wild')
+ self.assertIsInstance(site.resource.item, Game)
+ self.assertEqual(site.resource.item.primary_lookup_id_type, IdType.IGDB)
+ self.assertEqual(site.resource.item.primary_lookup_id_value, 'the-legend-of-zelda-breath-of-the-wild')
+
+
+class SteamTestCase(TestCase):
+ def test_parse(self):
+ t_id_type = IdType.Steam
+ t_id_value = '620'
+ t_url = 'https://store.steampowered.com/app/620/Portal_2/'
+ t_url2 = 'https://store.steampowered.com/app/620'
+ site = SiteList.get_site_by_id_type(t_id_type)
+ self.assertIsNotNone(site)
+ self.assertEqual(site.validate_url(t_url), True)
+ site = SiteList.get_site_by_url(t_url)
+ self.assertEqual(site.url, t_url2)
+ self.assertEqual(site.id_value, t_id_value)
+
+ @use_local_response
+ def test_scrape(self):
+ t_url = 'https://store.steampowered.com/app/620/Portal_2/'
+ site = SiteList.get_site_by_url(t_url)
+ self.assertEqual(site.ready, False)
+ site.get_resource_ready()
+ self.assertEqual(site.ready, True)
+ self.assertEqual(site.resource.metadata['title'], 'Portal 2')
+ self.assertEqual(site.resource.metadata['brief'], '“终身测试计划”现已升级,您可以为您自己或您的好友设计合作谜题!')
+ self.assertIsInstance(site.resource.item, Game)
+ self.assertEqual(site.resource.item.steam, '620')
+
+
+class DoubanGameTestCase(TestCase):
+ def test_parse(self):
+ t_id_type = IdType.DoubanGame
+ t_id_value = '10734307'
+ t_url = 'https://www.douban.com/game/10734307/'
+ site = SiteList.get_site_by_id_type(t_id_type)
+ self.assertIsNotNone(site)
+ self.assertEqual(site.validate_url(t_url), True)
+ site = SiteList.get_site_by_url(t_url)
+ self.assertEqual(site.url, t_url)
+ self.assertEqual(site.id_value, t_id_value)
+
+ @use_local_response
+ def test_scrape(self):
+ t_url = 'https://www.douban.com/game/10734307/'
+ site = SiteList.get_site_by_url(t_url)
+ self.assertEqual(site.ready, False)
+ site.get_resource_ready()
+ self.assertEqual(site.ready, True)
+ self.assertEqual(site.resource.metadata['title'], '传送门2 Portal 2')
+ self.assertIsInstance(site.resource.item, Game)
+ self.assertEqual(site.resource.item.douban_game, '10734307')
+
+
+class BangumiGameTestCase(TestCase):
+ def test_parse(self):
+ t_id_type = IdType.Bangumi
+ t_id_value = '15912'
+ t_url = 'https://bgm.tv/subject/15912'
+ site = SiteList.get_site_by_id_type(t_id_type)
+ self.assertIsNotNone(site)
+ self.assertEqual(site.validate_url(t_url), True)
+ site = SiteList.get_site_by_url(t_url)
+ self.assertEqual(site.url, t_url)
+ self.assertEqual(site.id_value, t_id_value)
+
+ @use_local_response
+ def test_scrape(self):
+ # TODO
+ pass
+
+
+class MultiGameSitesTestCase(TestCase):
+ @use_local_response
+ def test_games(self):
+ url1 = 'https://www.igdb.com/games/portal-2'
+ url2 = 'https://store.steampowered.com/app/620/Portal_2/'
+ p1 = SiteList.get_site_by_url(url1).get_resource_ready()
+ p2 = SiteList.get_site_by_url(url2).get_resource_ready()
+ self.assertEqual(p1.item.id, p2.item.id)
diff --git a/catalog/management/commands/cat.py b/catalog/management/commands/cat.py
new file mode 100644
index 00000000..1f3ed236
--- /dev/null
+++ b/catalog/management/commands/cat.py
@@ -0,0 +1,22 @@
+from django.core.management.base import BaseCommand
+import pprint
+from catalog.common import SiteList
+from catalog.sites import *
+
+
+class Command(BaseCommand):
+ help = 'Scrape a catalog item from external resource (but not save it)'
+
+ def add_arguments(self, parser):
+ parser.add_argument('url', type=str, help='URL to scrape')
+
+ def handle(self, *args, **options):
+ url = str(options['url'])
+ site = SiteList.get_site_by_url(url)
+ if site is None:
+ self.stdout.write(self.style.ERROR(f'Unknown site for {url}'))
+ return
+ self.stdout.write(f'Fetching from {site}')
+ resource = site.get_resource_ready(auto_link=False, auto_save=False)
+ self.stdout.write(self.style.SUCCESS(f'Done.'))
+ pprint.pp(resource.metadata)
diff --git a/catalog/models.py b/catalog/models.py
new file mode 100644
index 00000000..68af2b67
--- /dev/null
+++ b/catalog/models.py
@@ -0,0 +1,25 @@
+from .book.models import Edition, Work, Series
+from .movie.models import Movie
+from .tv.models import TVShow, TVSeason, TVEpisode
+from .music.models import Album
+from .game.models import Game
+from .podcast.models import Podcast
+from .performance.models import Performance
+
+
+# class Exhibition(Item):
+
+# class Meta:
+# proxy = True
+
+
+# class Fanfic(Item):
+
+# class Meta:
+# proxy = True
+
+
+# class Boardgame(Item):
+
+# class Meta:
+# proxy = True
diff --git a/catalog/movie/models.py b/catalog/movie/models.py
new file mode 100644
index 00000000..9679a18c
--- /dev/null
+++ b/catalog/movie/models.py
@@ -0,0 +1,8 @@
+from catalog.common import *
+
+
+class Movie(Item):
+ imdb = PrimaryLookupIdDescriptor(IdType.IMDB)
+ tmdb_movie = PrimaryLookupIdDescriptor(IdType.TMDB_Movie)
+ douban_movie = PrimaryLookupIdDescriptor(IdType.DoubanMovie)
+ duration = jsondata.IntegerField(blank=True, default=None)
diff --git a/catalog/movie/tests.py b/catalog/movie/tests.py
new file mode 100644
index 00000000..b3deacce
--- /dev/null
+++ b/catalog/movie/tests.py
@@ -0,0 +1,90 @@
+from django.test import TestCase
+from catalog.common import *
+
+
+class DoubanMovieTestCase(TestCase):
+ def test_parse(self):
+ t_id = '3541415'
+ t_url = 'https://movie.douban.com/subject/3541415/'
+ p1 = SiteList.get_site_by_id_type(IdType.DoubanMovie)
+ self.assertIsNotNone(p1)
+ self.assertEqual(p1.validate_url(t_url), True)
+ p2 = SiteList.get_site_by_url(t_url)
+ self.assertEqual(p1.id_to_url(t_id), t_url)
+ self.assertEqual(p2.url_to_id(t_url), t_id)
+
+ @use_local_response
+ def test_scrape(self):
+ t_url = 'https://movie.douban.com/subject/3541415/'
+ site = SiteList.get_site_by_url(t_url)
+ self.assertEqual(site.ready, False)
+ self.assertEqual(site.id_value, '3541415')
+ site.get_resource_ready()
+ self.assertEqual(site.resource.metadata['title'], '盗梦空间')
+ self.assertEqual(site.resource.item.primary_lookup_id_type, IdType.IMDB)
+ self.assertEqual(site.resource.item.__class__.__name__, 'Movie')
+ self.assertEqual(site.resource.item.imdb, 'tt1375666')
+
+
+class TMDBMovieTestCase(TestCase):
+ def test_parse(self):
+ t_id = '293767'
+ t_url = 'https://www.themoviedb.org/movie/293767-billy-lynn-s-long-halftime-walk'
+ t_url2 = 'https://www.themoviedb.org/movie/293767'
+ p1 = SiteList.get_site_by_id_type(IdType.TMDB_Movie)
+ self.assertIsNotNone(p1)
+ self.assertEqual(p1.validate_url(t_url), True)
+ self.assertEqual(p1.validate_url(t_url2), True)
+ p2 = SiteList.get_site_by_url(t_url)
+ self.assertEqual(p1.id_to_url(t_id), t_url2)
+ self.assertEqual(p2.url_to_id(t_url), t_id)
+
+ @use_local_response
+ def test_scrape(self):
+ t_url = 'https://www.themoviedb.org/movie/293767'
+ site = SiteList.get_site_by_url(t_url)
+ self.assertEqual(site.ready, False)
+ self.assertEqual(site.id_value, '293767')
+ site.get_resource_ready()
+ self.assertEqual(site.resource.metadata['title'], '比利·林恩的中场战事')
+ self.assertEqual(site.resource.item.primary_lookup_id_type, IdType.IMDB)
+ self.assertEqual(site.resource.item.__class__.__name__, 'Movie')
+ self.assertEqual(site.resource.item.imdb, 'tt2513074')
+
+
+class IMDBMovieTestCase(TestCase):
+ def test_parse(self):
+ t_id = 'tt1375666'
+ t_url = 'https://www.imdb.com/title/tt1375666/'
+ t_url2 = 'https://www.imdb.com/title/tt1375666/'
+ p1 = SiteList.get_site_by_id_type(IdType.IMDB)
+ self.assertIsNotNone(p1)
+ self.assertEqual(p1.validate_url(t_url), True)
+ self.assertEqual(p1.validate_url(t_url2), True)
+ p2 = SiteList.get_site_by_url(t_url)
+ self.assertEqual(p1.id_to_url(t_id), t_url2)
+ self.assertEqual(p2.url_to_id(t_url), t_id)
+
+ @use_local_response
+ def test_scrape(self):
+ t_url = 'https://www.imdb.com/title/tt1375666/'
+ site = SiteList.get_site_by_url(t_url)
+ self.assertEqual(site.ready, False)
+ self.assertEqual(site.id_value, 'tt1375666')
+ site.get_resource_ready()
+ self.assertEqual(site.resource.metadata['title'], '盗梦空间')
+ self.assertEqual(site.resource.item.primary_lookup_id_type, IdType.IMDB)
+ self.assertEqual(site.resource.item.imdb, 'tt1375666')
+
+
+class MultiMovieSitesTestCase(TestCase):
+ @use_local_response
+ def test_movies(self):
+ url1 = 'https://www.themoviedb.org/movie/27205-inception'
+ url2 = 'https://movie.douban.com/subject/3541415/'
+ url3 = 'https://www.imdb.com/title/tt1375666/'
+ p1 = SiteList.get_site_by_url(url1).get_resource_ready()
+ p2 = SiteList.get_site_by_url(url2).get_resource_ready()
+ p3 = SiteList.get_site_by_url(url3).get_resource_ready()
+ self.assertEqual(p1.item.id, p2.item.id)
+ self.assertEqual(p2.item.id, p3.item.id)
diff --git a/catalog/music/models.py b/catalog/music/models.py
new file mode 100644
index 00000000..11d008ba
--- /dev/null
+++ b/catalog/music/models.py
@@ -0,0 +1,10 @@
+from catalog.common import *
+
+
+class Album(Item):
+ barcode = PrimaryLookupIdDescriptor(IdType.GTIN)
+ douban_music = PrimaryLookupIdDescriptor(IdType.DoubanMusic)
+ spotify_album = PrimaryLookupIdDescriptor(IdType.Spotify_Album)
+
+ class Meta:
+ proxy = True
diff --git a/catalog/music/tests.py b/catalog/music/tests.py
new file mode 100644
index 00000000..d035382d
--- /dev/null
+++ b/catalog/music/tests.py
@@ -0,0 +1,61 @@
+from django.test import TestCase
+from catalog.common import *
+from catalog.models import *
+
+
+class SpotifyTestCase(TestCase):
+ def test_parse(self):
+ t_id_type = IdType.Spotify_Album
+ t_id_value = '65KwtzkJXw7oT819NFWmEP'
+ t_url = 'https://open.spotify.com/album/65KwtzkJXw7oT819NFWmEP'
+ site = SiteList.get_site_by_id_type(t_id_type)
+ self.assertIsNotNone(site)
+ self.assertEqual(site.validate_url(t_url), True)
+ site = SiteList.get_site_by_url(t_url)
+ self.assertEqual(site.url, t_url)
+ self.assertEqual(site.id_value, t_id_value)
+
+ @use_local_response
+ def test_scrape(self):
+ t_url = 'https://open.spotify.com/album/65KwtzkJXw7oT819NFWmEP'
+ site = SiteList.get_site_by_url(t_url)
+ self.assertEqual(site.ready, False)
+ site.get_resource_ready()
+ self.assertEqual(site.ready, True)
+ self.assertEqual(site.resource.metadata['title'], 'The Race For Space')
+ self.assertIsInstance(site.resource.item, Album)
+ self.assertEqual(site.resource.item.barcode, '3610159662676')
+
+
+class DoubanMusicTestCase(TestCase):
+ def test_parse(self):
+ t_id_type = IdType.DoubanMusic
+ t_id_value = '33551231'
+ t_url = 'https://music.douban.com/subject/33551231/'
+ site = SiteList.get_site_by_id_type(t_id_type)
+ self.assertIsNotNone(site)
+ self.assertEqual(site.validate_url(t_url), True)
+ site = SiteList.get_site_by_url(t_url)
+ self.assertEqual(site.url, t_url)
+ self.assertEqual(site.id_value, t_id_value)
+
+ @use_local_response
+ def test_scrape(self):
+ t_url = 'https://music.douban.com/subject/33551231/'
+ site = SiteList.get_site_by_url(t_url)
+ self.assertEqual(site.ready, False)
+ site.get_resource_ready()
+ self.assertEqual(site.ready, True)
+ self.assertEqual(site.resource.metadata['title'], 'The Race For Space')
+ self.assertIsInstance(site.resource.item, Album)
+ self.assertEqual(site.resource.item.barcode, '3610159662676')
+
+
+class MultiMusicSitesTestCase(TestCase):
+ @use_local_response
+ def test_albums(self):
+ url1 = 'https://music.douban.com/subject/33551231/'
+ url2 = 'https://open.spotify.com/album/65KwtzkJXw7oT819NFWmEP'
+ p1 = SiteList.get_site_by_url(url1).get_resource_ready()
+ p2 = SiteList.get_site_by_url(url2).get_resource_ready()
+ self.assertEqual(p1.item.id, p2.item.id)
diff --git a/catalog/performance/models.py b/catalog/performance/models.py
new file mode 100644
index 00000000..68760eb6
--- /dev/null
+++ b/catalog/performance/models.py
@@ -0,0 +1,13 @@
+from catalog.common import *
+from django.utils.translation import gettext_lazy as _
+
+
+class Performance(Item):
+ douban_drama = LookupIdDescriptor(IdType.DoubanDrama)
+ versions = jsondata.ArrayField(_('版本'), null=False, blank=False, default=list)
+ directors = jsondata.ArrayField(_('导演'), null=False, blank=False, default=list)
+ playwrights = jsondata.ArrayField(_('编剧'), null=False, blank=False, default=list)
+ actors = jsondata.ArrayField(_('主演'), null=False, blank=False, default=list)
+
+ class Meta:
+ proxy = True
diff --git a/catalog/performance/tests.py b/catalog/performance/tests.py
new file mode 100644
index 00000000..9d3302ea
--- /dev/null
+++ b/catalog/performance/tests.py
@@ -0,0 +1,37 @@
+from django.test import TestCase
+from catalog.common import *
+
+
+class DoubanDramaTestCase(TestCase):
+ def setUp(self):
+ pass
+
+ def test_parse(self):
+ t_id = '24849279'
+ t_url = 'https://www.douban.com/location/drama/24849279/'
+ p1 = SiteList.get_site_by_id_type(IdType.DoubanDrama)
+ self.assertIsNotNone(p1)
+ p1 = SiteList.get_site_by_url(t_url)
+ self.assertIsNotNone(p1)
+ self.assertEqual(p1.validate_url(t_url), True)
+ self.assertEqual(p1.id_to_url(t_id), t_url)
+ self.assertEqual(p1.url_to_id(t_url), t_id)
+
+ @use_local_response
+ def test_scrape(self):
+ t_url = 'https://www.douban.com/location/drama/24849279/'
+ site = SiteList.get_site_by_url(t_url)
+ self.assertEqual(site.ready, False)
+ resource = site.get_resource_ready()
+ self.assertEqual(site.ready, True)
+ self.assertEqual(resource.metadata['title'], '红花侠')
+ item = site.get_item()
+ self.assertEqual(item.title, '红花侠')
+
+ # self.assertEqual(i.other_titles, ['スカーレットピンパーネル', 'THE SCARLET PIMPERNEL'])
+ # self.assertEqual(len(i.brief), 545)
+ # self.assertEqual(i.genres, ['音乐剧'])
+ # self.assertEqual(i.versions, ['08星组公演版', '10年月組公演版', '17年星組公演版', 'ュージカル(2017年)版'])
+ # self.assertEqual(i.directors, ['小池修一郎', '小池 修一郎', '石丸さち子'])
+ # self.assertEqual(i.playwrights, ['小池修一郎', 'Baroness Orczy(原作)', '小池 修一郎'])
+ # self.assertEqual(i.actors, ['安蘭けい', '柚希礼音', '遠野あすか', '霧矢大夢', '龍真咲'])
diff --git a/catalog/podcast/models.py b/catalog/podcast/models.py
new file mode 100644
index 00000000..1df67b49
--- /dev/null
+++ b/catalog/podcast/models.py
@@ -0,0 +1,13 @@
+from catalog.common import *
+
+
+class Podcast(Item):
+ feed_url = PrimaryLookupIdDescriptor(IdType.Feed)
+ apple_podcast = PrimaryLookupIdDescriptor(IdType.ApplePodcast)
+ # ximalaya = LookupIdDescriptor(IdType.Ximalaya)
+ # xiaoyuzhou = LookupIdDescriptor(IdType.Xiaoyuzhou)
+ hosts = jsondata.ArrayField(default=list)
+
+
+# class PodcastEpisode(Item):
+# pass
diff --git a/catalog/podcast/tests.py b/catalog/podcast/tests.py
new file mode 100644
index 00000000..0e70b3e1
--- /dev/null
+++ b/catalog/podcast/tests.py
@@ -0,0 +1,30 @@
+from django.test import TestCase
+from catalog.podcast.models import *
+from catalog.common import *
+
+
+class ApplePodcastTestCase(TestCase):
+ def setUp(self):
+ pass
+
+ def test_parse(self):
+ t_id = '657765158'
+ t_url = 'https://podcasts.apple.com/us/podcast/%E5%A4%A7%E5%86%85%E5%AF%86%E8%B0%88/id657765158'
+ t_url2 = 'https://podcasts.apple.com/us/podcast/id657765158'
+ p1 = SiteList.get_site_by_id_type(IdType.ApplePodcast)
+ self.assertIsNotNone(p1)
+ self.assertEqual(p1.validate_url(t_url), True)
+ p2 = SiteList.get_site_by_url(t_url)
+ self.assertEqual(p1.id_to_url(t_id), t_url2)
+ self.assertEqual(p2.url_to_id(t_url), t_id)
+
+ @use_local_response
+ def test_scrape(self):
+ t_url = 'https://podcasts.apple.com/gb/podcast/the-new-yorker-radio-hour/id1050430296'
+ site = SiteList.get_site_by_url(t_url)
+ self.assertEqual(site.ready, False)
+ self.assertEqual(site.id_value, '1050430296')
+ site.get_resource_ready()
+ self.assertEqual(site.resource.metadata['title'], 'The New Yorker Radio Hour')
+ # self.assertEqual(site.resource.metadata['feed_url'], 'http://feeds.wnyc.org/newyorkerradiohour')
+ self.assertEqual(site.resource.metadata['feed_url'], 'http://feeds.feedburner.com/newyorkerradiohour')
diff --git a/catalog/sites/__init__.py b/catalog/sites/__init__.py
new file mode 100644
index 00000000..5f103943
--- /dev/null
+++ b/catalog/sites/__init__.py
@@ -0,0 +1,15 @@
+from ..common.sites import SiteList
+from .apple_podcast import ApplePodcast
+from .douban_book import DoubanBook
+from .douban_movie import DoubanMovie
+from .douban_music import DoubanMusic
+from .douban_game import DoubanGame
+from .douban_drama import DoubanDrama
+from .goodreads import Goodreads
+from .google_books import GoogleBooks
+from .tmdb import TMDB_Movie
+from .imdb import IMDB
+from .spotify import Spotify
+from .igdb import IGDB
+from .steam import Steam
+from .bangumi import Bangumi
diff --git a/catalog/sites/apple_podcast.py b/catalog/sites/apple_podcast.py
new file mode 100644
index 00000000..ae2b3b54
--- /dev/null
+++ b/catalog/sites/apple_podcast.py
@@ -0,0 +1,40 @@
+from catalog.common import *
+from catalog.models import *
+import logging
+
+
+_logger = logging.getLogger(__name__)
+
+
+@SiteList.register
+class ApplePodcast(AbstractSite):
+ ID_TYPE = IdType.ApplePodcast
+ URL_PATTERNS = [r"https://[^.]+.apple.com/\w+/podcast/*[^/?]*/id(\d+)"]
+ WIKI_PROPERTY_ID = 'P5842'
+ DEFAULT_MODEL = Podcast
+
+ @classmethod
+ def id_to_url(self, id_value):
+ return "https://podcasts.apple.com/us/podcast/id" + id_value
+
+ def scrape(self):
+ api_url = f'https://itunes.apple.com/lookup?id={self.id_value}'
+ dl = BasicDownloader(api_url)
+ resp = dl.download()
+ r = resp.json()['results'][0]
+ pd = ResourceContent(metadata={
+ 'title': r['trackName'],
+ 'feed_url': r['feedUrl'],
+ 'hosts': [r['artistName']],
+ 'genres': r['genres'],
+ 'cover_image_url': r['artworkUrl600'],
+ })
+ pd.lookup_ids[IdType.Feed] = pd.metadata.get('feed_url')
+ if pd.metadata["cover_image_url"]:
+ imgdl = BasicImageDownloader(pd.metadata["cover_image_url"], self.url)
+ try:
+ pd.cover_image = imgdl.download().content
+ pd.cover_image_extention = imgdl.extention
+ except Exception:
+ _logger.debug(f'failed to download cover for {self.url} from {pd.metadata["cover_image_url"]}')
+ return pd
diff --git a/catalog/sites/bangumi.py b/catalog/sites/bangumi.py
new file mode 100644
index 00000000..21875536
--- /dev/null
+++ b/catalog/sites/bangumi.py
@@ -0,0 +1,24 @@
+from catalog.common import *
+from catalog.models import *
+import logging
+
+
+_logger = logging.getLogger(__name__)
+
+
+@SiteList.register
+class Bangumi(AbstractSite):
+ ID_TYPE = IdType.Bangumi
+ URL_PATTERNS = [
+ r"https://bgm\.tv/subject/(\d+)",
+ ]
+ WIKI_PROPERTY_ID = ''
+ DEFAULT_MODEL = None
+
+ @classmethod
+ def id_to_url(self, id_value):
+ return f"https://bgm.tv/subject/{id_value}"
+
+ def scrape(self):
+ # TODO rewrite with bangumi api https://bangumi.github.io/api/
+ pass
diff --git a/catalog/sites/douban.py b/catalog/sites/douban.py
new file mode 100644
index 00000000..b26d42fc
--- /dev/null
+++ b/catalog/sites/douban.py
@@ -0,0 +1,28 @@
+import re
+from catalog.common import *
+
+
+RE_NUMBERS = re.compile(r"\d+\d*")
+RE_WHITESPACES = re.compile(r"\s+")
+
+
+class DoubanDownloader(ProxiedDownloader):
+ def validate_response(self, response):
+ if response is None:
+ return RESPONSE_NETWORK_ERROR
+ elif response.status_code == 204:
+ return RESPONSE_CENSORSHIP
+ elif response.status_code == 200:
+ content = response.content.decode('utf-8')
+ if content.find('关于豆瓣') == -1:
+ # if content.find('你的 IP 发出') == -1:
+ # error = error + 'Content not authentic' # response is garbage
+ # else:
+ # error = error + 'IP banned'
+ return RESPONSE_NETWORK_ERROR
+ elif content.find('
页面不存在 ') != -1 or content.find('呃... 你想访问的条目豆瓣不收录。') != -1: # re.search('不存在[^<]+', content, re.MULTILINE):
+ return RESPONSE_CENSORSHIP
+ else:
+ return RESPONSE_OK
+ else:
+ return RESPONSE_INVALID_CONTENT
diff --git a/catalog/sites/douban_book.py b/catalog/sites/douban_book.py
new file mode 100644
index 00000000..021857c5
--- /dev/null
+++ b/catalog/sites/douban_book.py
@@ -0,0 +1,180 @@
+from catalog.common import *
+from .douban import *
+from catalog.book.models import *
+from catalog.book.utils import *
+import logging
+
+
+_logger = logging.getLogger(__name__)
+
+
+class ScraperMixin:
+ def set_field(self, field, value=None):
+ self.data[field] = value
+
+ def parse_str(self, query):
+ elem = self.html.xpath(query)
+ return elem[0].strip() if elem else None
+
+ def parse_field(self, field, query, error_when_missing=False):
+ elem = self.html.xpath(query)
+ if elem:
+ self.data[field] = elem[0].strip()
+ elif error_when_missing:
+ raise ParseError(self, field)
+ else:
+ self.data[field] = None
+ return elem
+
+
+@SiteList.register
+class DoubanBook(AbstractSite, ScraperMixin):
+ ID_TYPE = IdType.DoubanBook
+ URL_PATTERNS = [r"\w+://book\.douban\.com/subject/(\d+)/{0,1}", r"\w+://m.douban.com/book/subject/(\d+)/{0,1}"]
+ WIKI_PROPERTY_ID = '?'
+ DEFAULT_MODEL = Edition
+
+ @classmethod
+ def id_to_url(self, id_value):
+ return "https://book.douban.com/subject/" + id_value + "/"
+
+ def scrape(self):
+ self.data = {}
+ self.html = DoubanDownloader(self.url).download().html()
+ self.parse_field('title', "/html/body//h1/span/text()")
+ self.parse_field('isbn', "//div[@id='info']//span[text()='ISBN:']/following::text()")
+ # TODO does douban store ASIN as ISBN, need more cleanup if so
+ if not self.data['title']:
+ if self.data['isbn']:
+ self.data['title'] = 'isbn: ' + isbn
+ else:
+ raise ParseError(self, 'title')
+
+ self.parse_field('cover_image_url', "//*[@id='mainpic']/a/img/@src")
+ self.parse_field('brief', "//h2/span[text()='内容简介']/../following-sibling::div[1]//div[@class='intro'][not(ancestor::span[@class='short'])]/p/text()")
+ self.parse_field('series', "//div[@id='info']//span[text()='丛书:']/following-sibling::a[1]/text()")
+ self.parse_field('producer', "//div[@id='info']//span[text()='出品方:']/following-sibling::a[1]/text()")
+ self.parse_field('cubn', "//div[@id='info']//span[text()='统一书号:']/following::text()")
+ self.parse_field('subtitle', "//div[@id='info']//span[text()='副标题:']/following::text()")
+ self.parse_field('orig_title', "//div[@id='info']//span[text()='原作名:']/following::text()")
+ self.parse_field('language', "//div[@id='info']//span[text()='语言:']/following::text()")
+ self.parse_field('pub_house', "//div[@id='info']//span[text()='出版社:']/following::text()")
+ self.parse_field('pub_date', "//div[@id='info']//span[text()='出版年:']/following::text()")
+ year_month_day = RE_NUMBERS.findall(self.data['pub_date']) if self.data['pub_date'] else []
+ if len(year_month_day) in (2, 3):
+ pub_year = int(year_month_day[0])
+ pub_month = int(year_month_day[1])
+ elif len(year_month_day) == 1:
+ pub_year = int(year_month_day[0])
+ pub_month = None
+ else:
+ pub_year = None
+ pub_month = None
+ if pub_year and pub_month and pub_year < pub_month:
+ pub_year, pub_month = pub_month, pub_year
+ pub_year = None if pub_year is not None and pub_year not in range(
+ 0, 3000) else pub_year
+ pub_month = None if pub_month is not None and pub_month not in range(
+ 1, 12) else pub_month
+
+ self.parse_field('binding', "//div[@id='info']//span[text()='装帧:']/following::text()")
+ self.parse_field('price', "//div[@id='info']//span[text()='定价:']/following::text()")
+ self.parse_field('pages', "//div[@id='info']//span[text()='页数:']/following::text()")
+ if self.data['pages'] is not None:
+ self.data['pages'] = int(RE_NUMBERS.findall(self.data['pages'])[0]) if RE_NUMBERS.findall(self.data['pages']) else None
+ if self.data['pages'] and (self.data['pages'] > 999999 or self.data['pages'] < 1):
+ self.data['pages'] = None
+
+ contents = None
+ try:
+ contents_elem = self.html.xpath(
+ "//h2/span[text()='目录']/../following-sibling::div[1]")[0]
+ # if next the id of next sibling contains `dir`, that would be the full contents
+ if "dir" in contents_elem.getnext().xpath("@id")[0]:
+ contents_elem = contents_elem.getnext()
+ contents = '\n'.join(p.strip() for p in contents_elem.xpath("text()")[:-2]) if len(contents_elem) else None
+ else:
+ contents = '\n'.join(p.strip() for p in contents_elem.xpath("text()")) if len(contents_elem) else None
+ except Exception:
+ pass
+ self.data['contents'] = contents
+
+ # there are two html formats for authors and translators
+ authors_elem = self.html.xpath("""//div[@id='info']//span[text()='作者:']/following-sibling::br[1]/
+ preceding-sibling::a[preceding-sibling::span[text()='作者:']]/text()""")
+ if not authors_elem:
+ authors_elem = self.html.xpath(
+ """//div[@id='info']//span[text()=' 作者']/following-sibling::a/text()""")
+ if authors_elem:
+ authors = []
+ for author in authors_elem:
+ authors.append(RE_WHITESPACES.sub(' ', author.strip())[:200])
+ else:
+ authors = None
+ self.data['authors'] = authors
+
+ translators_elem = self.html.xpath("""//div[@id='info']//span[text()='译者:']/following-sibling::br[1]/
+ preceding-sibling::a[preceding-sibling::span[text()='译者:']]/text()""")
+ if not translators_elem:
+ translators_elem = self.html.xpath(
+ """//div[@id='info']//span[text()=' 译者']/following-sibling::a/text()""")
+ if translators_elem:
+ translators = []
+ for translator in translators_elem:
+ translators.append(RE_WHITESPACES.sub(' ', translator.strip()))
+ else:
+ translators = None
+ self.data['translators'] = translators
+
+ work_link = self.parse_str('//h2/span[text()="这本书的其他版本"]/following-sibling::span[@class="pl"]/a/@href')
+ if work_link:
+ r = re.match(r'\w+://book.douban.com/works/(\d+)', work_link)
+ self.data['required_resources'] = [{
+ 'model': 'Work',
+ 'id_type': IdType.DoubanBook_Work,
+ 'id_value': r[1] if r else None,
+ 'title': self.data['title'],
+ 'url': work_link,
+ }]
+ pd = ResourceContent(metadata=self.data)
+ pd.lookup_ids[IdType.ISBN] = self.data.get('isbn')
+ pd.lookup_ids[IdType.CUBN] = self.data.get('cubn')
+ if self.data["cover_image_url"]:
+ imgdl = BasicImageDownloader(self.data["cover_image_url"], self.url)
+ try:
+ pd.cover_image = imgdl.download().content
+ pd.cover_image_extention = imgdl.extention
+ except Exception:
+ _logger.debug(f'failed to download cover for {self.url} from {self.data["cover_image_url"]}')
+ return pd
+
+
+@SiteList.register
+class DoubanBook_Work(AbstractSite):
+ ID_TYPE = IdType.DoubanBook_Work
+ URL_PATTERNS = [r"\w+://book\.douban\.com/works/(\d+)"]
+ WIKI_PROPERTY_ID = '?'
+ DEFAULT_MODEL = Work
+
+ @classmethod
+ def id_to_url(self, id_value):
+ return "https://book.douban.com/works/" + id_value + "/"
+
+ def bypass_scrape(self, data_from_link):
+ if not data_from_link:
+ return None
+ pd = ResourceContent(metadata={
+ 'title': data_from_link['title'],
+ })
+ return pd
+
+ def scrape(self):
+ content = DoubanDownloader(self.url).download().html()
+ title_elem = content.xpath("//h1/text()")
+ title = title_elem[0].split('全部版本(')[0].strip() if title_elem else None
+ if not title:
+ raise ParseError(self, 'title')
+ pd = ResourceContent(metadata={
+ 'title': title,
+ })
+ return pd
diff --git a/catalog/sites/douban_drama.py b/catalog/sites/douban_drama.py
new file mode 100644
index 00000000..4a0c27b7
--- /dev/null
+++ b/catalog/sites/douban_drama.py
@@ -0,0 +1,58 @@
+from catalog.common import *
+from catalog.models import *
+from .douban import DoubanDownloader
+import logging
+
+
+_logger = logging.getLogger(__name__)
+
+
+@SiteList.register
+class DoubanDrama(AbstractSite):
+ ID_TYPE = IdType.DoubanDrama
+ URL_PATTERNS = [r"\w+://www.douban.com/location/drama/(\d+)/"]
+ WIKI_PROPERTY_ID = 'P6443'
+ DEFAULT_MODEL = Performance
+
+ @classmethod
+ def id_to_url(self, id_value):
+ return "https://www.douban.com/location/drama/" + id_value + "/"
+
+ def scrape(self):
+ h = DoubanDownloader(self.url).download().html()
+ data = {}
+
+ title_elem = h.xpath("/html/body//h1/span/text()")
+ if title_elem:
+ data["title"] = title_elem[0].strip()
+ else:
+ raise ParseError(self, "title")
+
+ data['other_titles'] = [s.strip() for s in title_elem[1:]]
+ other_title_elem = h.xpath("//dl//dt[text()='又名:']/following::dd[@itemprop='name']/text()")
+ if len(other_title_elem) > 0:
+ data['other_titles'].append(other_title_elem[0].strip())
+
+ plot_elem = h.xpath("//div[@id='link-report']/text()")
+ if len(plot_elem) == 0:
+ plot_elem = h.xpath("//div[@class='abstract']/text()")
+ data['brief'] = '\n'.join(plot_elem) if len(plot_elem) > 0 else ''
+
+ data['genres'] = [s.strip() for s in h.xpath("//dl//dt[text()='类型:']/following-sibling::dd[@itemprop='genre']/text()")]
+ data['versions'] = [s.strip() for s in h.xpath("//dl//dt[text()='版本:']/following-sibling::dd[@class='titles']/a//text()")]
+ data['directors'] = [s.strip() for s in h.xpath("//div[@class='meta']/dl//dt[text()='导演:']/following-sibling::dd/a[@itemprop='director']//text()")]
+ data['playwrights'] = [s.strip() for s in h.xpath("//div[@class='meta']/dl//dt[text()='编剧:']/following-sibling::dd/a[@itemprop='author']//text()")]
+ data['actors'] = [s.strip() for s in h.xpath("//div[@class='meta']/dl//dt[text()='主演:']/following-sibling::dd/a[@itemprop='actor']//text()")]
+
+ img_url_elem = h.xpath("//img[@itemprop='image']/@src")
+ data['cover_image_url'] = img_url_elem[0].strip() if img_url_elem else None
+
+ pd = ResourceContent(metadata=data)
+ if pd.metadata["cover_image_url"]:
+ imgdl = BasicImageDownloader(pd.metadata["cover_image_url"], self.url)
+ try:
+ pd.cover_image = imgdl.download().content
+ pd.cover_image_extention = imgdl.extention
+ except Exception:
+ _logger.debug(f'failed to download cover for {self.url} from {pd.metadata["cover_image_url"]}')
+ return pd
diff --git a/catalog/sites/douban_game.py b/catalog/sites/douban_game.py
new file mode 100644
index 00000000..4c50a42e
--- /dev/null
+++ b/catalog/sites/douban_game.py
@@ -0,0 +1,76 @@
+from catalog.common import *
+from catalog.models import *
+from .douban import DoubanDownloader
+import dateparser
+import logging
+
+
+_logger = logging.getLogger(__name__)
+
+
+@SiteList.register
+class DoubanGame(AbstractSite):
+ ID_TYPE = IdType.DoubanGame
+ URL_PATTERNS = [r"\w+://www\.douban\.com/game/(\d+)/{0,1}", r"\w+://m.douban.com/game/subject/(\d+)/{0,1}"]
+ WIKI_PROPERTY_ID = ''
+ DEFAULT_MODEL = Game
+
+ @classmethod
+ def id_to_url(self, id_value):
+ return "https://www.douban.com/game/" + id_value + "/"
+
+ def scrape(self):
+ content = DoubanDownloader(self.url).download().html()
+
+ elem = content.xpath("//div[@id='content']/h1/text()")
+ title = elem[0].strip() if len(elem) else None
+ if not title:
+ raise ParseError(self, "title")
+
+ other_title_elem = content.xpath(
+ "//dl[@class='game-attr']//dt[text()='别名:']/following-sibling::dd[1]/text()")
+ other_title = other_title_elem[0].strip().split(' / ') if other_title_elem else None
+
+ developer_elem = content.xpath(
+ "//dl[@class='game-attr']//dt[text()='开发商:']/following-sibling::dd[1]/text()")
+ developer = developer_elem[0].strip().split(' / ') if developer_elem else None
+
+ publisher_elem = content.xpath(
+ "//dl[@class='game-attr']//dt[text()='发行商:']/following-sibling::dd[1]/text()")
+ publisher = publisher_elem[0].strip().split(' / ') if publisher_elem else None
+
+ platform_elem = content.xpath(
+ "//dl[@class='game-attr']//dt[text()='平台:']/following-sibling::dd[1]/a/text()")
+ platform = platform_elem if platform_elem else None
+
+ genre_elem = content.xpath(
+ "//dl[@class='game-attr']//dt[text()='类型:']/following-sibling::dd[1]/a/text()")
+ genre = None
+ if genre_elem:
+ genre = [g for g in genre_elem if g != '游戏']
+
+ date_elem = content.xpath(
+ "//dl[@class='game-attr']//dt[text()='发行日期:']/following-sibling::dd[1]/text()")
+ release_date = dateparser.parse(date_elem[0].strip()).strftime('%Y-%m-%d') if date_elem else None
+
+ brief_elem = content.xpath("//div[@class='mod item-desc']/p/text()")
+ brief = '\n'.join(brief_elem) if brief_elem else None
+
+ img_url_elem = content.xpath(
+ "//div[@class='item-subject-info']/div[@class='pic']//img/@src")
+ img_url = img_url_elem[0].strip() if img_url_elem else None
+
+ pd = ResourceContent(metadata={
+ 'title': title,
+ 'other_title': other_title,
+ 'developer': developer,
+ 'publisher': publisher,
+ 'release_date': release_date,
+ 'genre': genre,
+ 'platform': platform,
+ 'brief': brief,
+ 'cover_image_url': img_url
+ })
+ if pd.metadata["cover_image_url"]:
+ pd.cover_image, pd.cover_image_extention = BasicImageDownloader.download_image(pd.metadata['cover_image_url'], self.url)
+ return pd
diff --git a/catalog/sites/douban_movie.py b/catalog/sites/douban_movie.py
new file mode 100644
index 00000000..d2a971c5
--- /dev/null
+++ b/catalog/sites/douban_movie.py
@@ -0,0 +1,275 @@
+from catalog.common import *
+from .douban import *
+from catalog.movie.models import *
+from catalog.tv.models import *
+import logging
+from django.db import models
+from django.utils.translation import gettext_lazy as _
+from .tmdb import TMDB_TV, search_tmdb_by_imdb_id
+
+
+_logger = logging.getLogger(__name__)
+
+
+class MovieGenreEnum(models.TextChoices):
+ DRAMA = 'Drama', _('剧情')
+ KIDS = 'Kids', _('儿童')
+ COMEDY = 'Comedy', _('喜剧')
+ BIOGRAPHY = 'Biography', _('传记')
+ ACTION = 'Action', _('动作')
+ HISTORY = 'History', _('历史')
+ ROMANCE = 'Romance', _('爱情')
+ WAR = 'War', _('战争')
+ SCI_FI = 'Sci-Fi', _('科幻')
+ CRIME = 'Crime', _('犯罪')
+ ANIMATION = 'Animation', _('动画')
+ WESTERN = 'Western', _('西部')
+ MYSTERY = 'Mystery', _('悬疑')
+ FANTASY = 'Fantasy', _('奇幻')
+ THRILLER = 'Thriller', _('惊悚')
+ ADVENTURE = 'Adventure', _('冒险')
+ HORROR = 'Horror', _('恐怖')
+ DISASTER = 'Disaster', _('灾难')
+ DOCUMENTARY = 'Documentary', _('纪录片')
+ MARTIAL_ARTS = 'Martial-Arts', _('武侠')
+ SHORT = 'Short', _('短片')
+ ANCIENT_COSTUM = 'Ancient-Costum', _('古装')
+ EROTICA = 'Erotica', _('情色')
+ SPORT = 'Sport', _('运动')
+ GAY_LESBIAN = 'Gay/Lesbian', _('同性')
+ OPERA = 'Opera', _('戏曲')
+ MUSIC = 'Music', _('音乐')
+ FILM_NOIR = 'Film-Noir', _('黑色电影')
+ MUSICAL = 'Musical', _('歌舞')
+ REALITY_TV = 'Reality-TV', _('真人秀')
+ FAMILY = 'Family', _('家庭')
+ TALK_SHOW = 'Talk-Show', _('脱口秀')
+ NEWS = 'News', _('新闻')
+ SOAP = 'Soap', _('肥皂剧')
+ TV_MOVIE = 'TV Movie', _('电视电影')
+ THEATRE = 'Theatre', _('舞台艺术')
+ OTHER = 'Other', _('其他')
+
+
+# MovieGenreTranslator = ChoicesDictGenerator(MovieGenreEnum)
+
+
+@SiteList.register
+class DoubanMovie(AbstractSite):
+ ID_TYPE = IdType.DoubanMovie
+ URL_PATTERNS = [r"\w+://movie\.douban\.com/subject/(\d+)/{0,1}", r"\w+://m.douban.com/movie/subject/(\d+)/{0,1}"]
+ WIKI_PROPERTY_ID = '?'
+ # no DEFAULT_MODEL as it may be either TV Season and Movie
+
+ @classmethod
+ def id_to_url(self, id_value):
+ return "https://movie.douban.com/subject/" + id_value + "/"
+
+ def scrape(self):
+ content = DoubanDownloader(self.url).download().html()
+
+ try:
+ raw_title = content.xpath(
+ "//span[@property='v:itemreviewed']/text()")[0].strip()
+ except IndexError:
+ raise ParseError(self, 'title')
+
+ orig_title = content.xpath(
+ "//img[@rel='v:image']/@alt")[0].strip()
+ title = raw_title.split(orig_title)[0].strip()
+ # if has no chinese title
+ if title == '':
+ title = orig_title
+
+ if title == orig_title:
+ orig_title = None
+
+ # there are two html formats for authors and translators
+ other_title_elem = content.xpath(
+ "//div[@id='info']//span[text()='又名:']/following-sibling::text()[1]")
+ other_title = other_title_elem[0].strip().split(
+ ' / ') if other_title_elem else None
+
+ imdb_elem = content.xpath(
+ "//div[@id='info']//span[text()='IMDb链接:']/following-sibling::a[1]/text()")
+ if not imdb_elem:
+ imdb_elem = content.xpath(
+ "//div[@id='info']//span[text()='IMDb:']/following-sibling::text()[1]")
+ imdb_code = imdb_elem[0].strip() if imdb_elem else None
+
+ director_elem = content.xpath(
+ "//div[@id='info']//span[text()='导演']/following-sibling::span[1]/a/text()")
+ director = director_elem if director_elem else None
+
+ playwright_elem = content.xpath(
+ "//div[@id='info']//span[text()='编剧']/following-sibling::span[1]/a/text()")
+ playwright = list(map(lambda a: a[:200], playwright_elem)) if playwright_elem else None
+
+ actor_elem = content.xpath(
+ "//div[@id='info']//span[text()='主演']/following-sibling::span[1]/a/text()")
+ actor = list(map(lambda a: a[:200], actor_elem)) if actor_elem else None
+
+ # construct genre translator
+ genre_translator = {}
+ attrs = [attr for attr in dir(MovieGenreEnum) if '__' not in attr]
+ for attr in attrs:
+ genre_translator[getattr(MovieGenreEnum, attr).label] = getattr(
+ MovieGenreEnum, attr).value
+
+ genre_elem = content.xpath("//span[@property='v:genre']/text()")
+ if genre_elem:
+ genre = []
+ for g in genre_elem:
+ g = g.split(' ')[0]
+ if g == '紀錄片': # likely some original data on douban was corrupted
+ g = '纪录片'
+ elif g == '鬼怪':
+ g = '惊悚'
+ if g in genre_translator:
+ genre.append(genre_translator[g])
+ elif g in genre_translator.values():
+ genre.append(g)
+ else:
+ _logger.error(f'unable to map genre {g}')
+ else:
+ genre = None
+
+ showtime_elem = content.xpath(
+ "//span[@property='v:initialReleaseDate']/text()")
+ if showtime_elem:
+ showtime = []
+ for st in showtime_elem:
+ parts = st.split('(')
+ if len(parts) == 1:
+ time = st.split('(')[0]
+ region = ''
+ else:
+ time = st.split('(')[0]
+ region = st.split('(')[1][0:-1]
+ showtime.append({time: region})
+ else:
+ showtime = None
+
+ site_elem = content.xpath(
+ "//div[@id='info']//span[text()='官方网站:']/following-sibling::a[1]/@href")
+ site = site_elem[0].strip()[:200] if site_elem else None
+ if site and not re.match(r'http.+', site):
+ site = None
+
+ area_elem = content.xpath(
+ "//div[@id='info']//span[text()='制片国家/地区:']/following-sibling::text()[1]")
+ if area_elem:
+ area = [a.strip()[:100] for a in area_elem[0].split('/')]
+ else:
+ area = None
+
+ language_elem = content.xpath(
+ "//div[@id='info']//span[text()='语言:']/following-sibling::text()[1]")
+ if language_elem:
+ language = [a.strip() for a in language_elem[0].split(' / ')]
+ else:
+ language = None
+
+ year_elem = content.xpath("//span[@class='year']/text()")
+ year = int(re.search(r'\d+', year_elem[0])[0]) if year_elem and re.search(r'\d+', year_elem[0]) else None
+
+ duration_elem = content.xpath("//span[@property='v:runtime']/text()")
+ other_duration_elem = content.xpath(
+ "//span[@property='v:runtime']/following-sibling::text()[1]")
+ if duration_elem:
+ duration = duration_elem[0].strip()
+ if other_duration_elem:
+ duration += other_duration_elem[0].rstrip()
+ duration = duration.split('/')[0].strip()
+ else:
+ duration = None
+
+ season_elem = content.xpath(
+ "//*[@id='season']/option[@selected='selected']/text()")
+ if not season_elem:
+ season_elem = content.xpath(
+ "//div[@id='info']//span[text()='季数:']/following-sibling::text()[1]")
+ season = int(season_elem[0].strip()) if season_elem else None
+ else:
+ season = int(season_elem[0].strip())
+
+ episodes_elem = content.xpath(
+ "//div[@id='info']//span[text()='集数:']/following-sibling::text()[1]")
+ episodes = int(episodes_elem[0].strip()) if episodes_elem and episodes_elem[0].strip().isdigit() else None
+
+ single_episode_length_elem = content.xpath(
+ "//div[@id='info']//span[text()='单集片长:']/following-sibling::text()[1]")
+ single_episode_length = single_episode_length_elem[0].strip(
+ )[:100] if single_episode_length_elem else None
+
+ # if has field `episodes` not none then must be series
+ is_series = True if episodes else False
+
+ brief_elem = content.xpath("//span[@class='all hidden']")
+ if not brief_elem:
+ brief_elem = content.xpath("//span[@property='v:summary']")
+ brief = '\n'.join([e.strip() for e in brief_elem[0].xpath(
+ './text()')]) if brief_elem else None
+
+ img_url_elem = content.xpath("//img[@rel='v:image']/@src")
+ img_url = img_url_elem[0].strip() if img_url_elem else None
+
+ pd = ResourceContent(metadata={
+ 'title': title,
+ 'orig_title': orig_title,
+ 'other_title': other_title,
+ 'imdb_code': imdb_code,
+ 'director': director,
+ 'playwright': playwright,
+ 'actor': actor,
+ 'genre': genre,
+ 'showtime': showtime,
+ 'site': site,
+ 'area': area,
+ 'language': language,
+ 'year': year,
+ 'duration': duration,
+ 'season_number': season,
+ 'episodes': episodes,
+ 'single_episode_length': single_episode_length,
+ 'brief': brief,
+ 'is_series': is_series,
+ 'cover_image_url': img_url,
+ })
+ pd.metadata['preferred_model'] = ('TVSeason' if season else 'TVShow') if is_series else 'Movie'
+
+ if imdb_code:
+ res_data = search_tmdb_by_imdb_id(imdb_code)
+ tmdb_show_id = None
+ if 'movie_results' in res_data and len(res_data['movie_results']) > 0:
+ pd.metadata['preferred_model'] = 'Movie'
+ elif 'tv_results' in res_data and len(res_data['tv_results']) > 0:
+ pd.metadata['preferred_model'] = 'TVShow'
+ elif 'tv_season_results' in res_data and len(res_data['tv_season_results']) > 0:
+ pd.metadata['preferred_model'] = 'TVSeason'
+ tmdb_show_id = res_data['tv_season_results'][0]['show_id']
+ elif 'tv_episode_results' in res_data and len(res_data['tv_episode_results']) > 0:
+ pd.metadata['preferred_model'] = 'TVSeason'
+ tmdb_show_id = res_data['tv_episode_results'][0]['show_id']
+ if res_data['tv_episode_results'][0]['episode_number'] != 1:
+ _logger.error(f'Douban Movie {self.url} mapping to unexpected imdb episode {imdb_code}')
+ # TODO correct the IMDB id
+ pd.lookup_ids[IdType.IMDB] = imdb_code
+ if tmdb_show_id:
+ pd.metadata['required_resources'] = [{
+ 'model': 'TVShow',
+ 'id_type': IdType.TMDB_TV,
+ 'id_value': tmdb_show_id,
+ 'title': title,
+ 'url': TMDB_TV.id_to_url(tmdb_show_id),
+ }]
+ # TODO parse sister seasons
+ # pd.metadata['related_resources'] = []
+ if pd.metadata["cover_image_url"]:
+ imgdl = BasicImageDownloader(pd.metadata["cover_image_url"], self.url)
+ try:
+ pd.cover_image = imgdl.download().content
+ pd.cover_image_extention = imgdl.extention
+ except Exception:
+ _logger.debug(f'failed to download cover for {self.url} from {pd.metadata["cover_image_url"]}')
+ return pd
diff --git a/catalog/sites/douban_music.py b/catalog/sites/douban_music.py
new file mode 100644
index 00000000..1aa157f2
--- /dev/null
+++ b/catalog/sites/douban_music.py
@@ -0,0 +1,115 @@
+from catalog.common import *
+from catalog.models import *
+from .douban import DoubanDownloader
+import dateparser
+import logging
+
+
+_logger = logging.getLogger(__name__)
+
+
+@SiteList.register
+class DoubanMusic(AbstractSite):
+ ID_TYPE = IdType.DoubanMusic
+ URL_PATTERNS = [r"\w+://music\.douban\.com/subject/(\d+)/{0,1}", r"\w+://m.douban.com/music/subject/(\d+)/{0,1}"]
+ WIKI_PROPERTY_ID = ''
+ DEFAULT_MODEL = Album
+
+ @classmethod
+ def id_to_url(self, id_value):
+ return "https://music.douban.com/subject/" + id_value + "/"
+
+ def scrape(self):
+ content = DoubanDownloader(self.url).download().html()
+
+ elem = content.xpath("//h1/span/text()")
+ title = elem[0].strip() if len(elem) else None
+ if not title:
+ raise ParseError(self, "title")
+
+ artists_elem = content.xpath("//div[@id='info']/span/span[@class='pl']/a/text()")
+ artist = None if not artists_elem else list(map(lambda a: a[:200], artists_elem))
+
+ genre_elem = content.xpath(
+ "//div[@id='info']//span[text()='流派:']/following::text()[1]")
+ genre = genre_elem[0].strip() if genre_elem else None
+
+ date_elem = content.xpath(
+ "//div[@id='info']//span[text()='发行时间:']/following::text()[1]")
+ release_date = dateparser.parse(date_elem[0].strip()).strftime('%Y-%m-%d') if date_elem else None
+
+ company_elem = content.xpath(
+ "//div[@id='info']//span[text()='出版者:']/following::text()[1]")
+ company = company_elem[0].strip() if company_elem else None
+
+ track_list_elem = content.xpath(
+ "//div[@class='track-list']/div[@class='indent']/div/text()"
+ )
+ if track_list_elem:
+ track_list = '\n'.join([track.strip() for track in track_list_elem])
+ else:
+ track_list = None
+
+ brief_elem = content.xpath("//span[@class='all hidden']")
+ if not brief_elem:
+ brief_elem = content.xpath("//span[@property='v:summary']")
+ brief = '\n'.join([e.strip() for e in brief_elem[0].xpath(
+ './text()')]) if brief_elem else None
+
+ gtin = None
+ isrc = None
+ other_info = {}
+ other_elem = content.xpath(
+ "//div[@id='info']//span[text()='又名:']/following-sibling::text()[1]")
+ if other_elem:
+ other_info['又名'] = other_elem[0].strip()
+ other_elem = content.xpath(
+ "//div[@id='info']//span[text()='专辑类型:']/following-sibling::text()[1]")
+ if other_elem:
+ other_info['专辑类型'] = other_elem[0].strip()
+ other_elem = content.xpath(
+ "//div[@id='info']//span[text()='介质:']/following-sibling::text()[1]")
+ if other_elem:
+ other_info['介质'] = other_elem[0].strip()
+ other_elem = content.xpath(
+ "//div[@id='info']//span[text()='ISRC:']/following-sibling::text()[1]")
+ if other_elem:
+ other_info['ISRC'] = other_elem[0].strip()
+ isrc = other_elem[0].strip()
+ other_elem = content.xpath(
+ "//div[@id='info']//span[text()='条形码:']/following-sibling::text()[1]")
+ if other_elem:
+ other_info['条形码'] = other_elem[0].strip()
+ gtin = other_elem[0].strip()
+ other_elem = content.xpath(
+ "//div[@id='info']//span[text()='碟片数:']/following-sibling::text()[1]")
+ if other_elem:
+ other_info['碟片数'] = other_elem[0].strip()
+
+ img_url_elem = content.xpath("//div[@id='mainpic']//img/@src")
+ img_url = img_url_elem[0].strip() if img_url_elem else None
+
+ pd = ResourceContent(metadata={
+ 'title': title,
+ 'artist': artist,
+ 'genre': genre,
+ 'release_date': release_date,
+ 'duration': None,
+ 'company': company,
+ 'track_list': track_list,
+ 'brief': brief,
+ 'other_info': other_info,
+ 'cover_image_url': img_url
+ })
+ if gtin:
+ pd.lookup_ids[IdType.GTIN] = gtin
+ if isrc:
+ pd.lookup_ids[IdType.ISRC] = isrc
+ if pd.metadata["cover_image_url"]:
+ imgdl = BasicImageDownloader(pd.metadata["cover_image_url"], self.url)
+ try:
+ pd.cover_image = imgdl.download().content
+ pd.cover_image_extention = imgdl.extention
+ except Exception:
+ _logger.debug(f'failed to download cover for {self.url} from {pd.metadata["cover_image_url"]}')
+ return pd
diff --git a/catalog/sites/goodreads.py b/catalog/sites/goodreads.py
new file mode 100644
index 00000000..be3d4c26
--- /dev/null
+++ b/catalog/sites/goodreads.py
@@ -0,0 +1,116 @@
+from catalog.book.models import Edition, Work
+from catalog.common import *
+from lxml import html
+import json
+import logging
+
+
+_logger = logging.getLogger(__name__)
+
+
+class GoodreadsDownloader(RetryDownloader):
+ def validate_response(self, response):
+ if response is None:
+ return RESPONSE_NETWORK_ERROR
+ elif response.status_code == 200:
+ if response.text.find('__NEXT_DATA__') != -1:
+ return RESPONSE_OK
+ else:
+ # Goodreads may return legacy version for a/b testing
+ # retry if so
+ return RESPONSE_NETWORK_ERROR
+ else:
+ return RESPONSE_INVALID_CONTENT
+
+
+@SiteList.register
+class Goodreads(AbstractSite):
+ ID_TYPE = IdType.Goodreads
+ WIKI_PROPERTY_ID = 'P2968'
+ DEFAULT_MODEL = Edition
+ URL_PATTERNS = [r".+goodreads.com/.*book/show/(\d+)", r".+goodreads.com/.*book/(\d+)"]
+
+ @classmethod
+ def id_to_url(self, id_value):
+ return "https://www.goodreads.com/book/show/" + id_value
+
+ def scrape(self, response=None):
+ data = {}
+ if response is not None:
+ h = html.fromstring(response.text.strip())
+ else:
+ dl = GoodreadsDownloader(self.url)
+ h = dl.download().html()
+ # Next.JS version of GoodReads
+ # JSON.parse(document.getElementById('__NEXT_DATA__').innerHTML)['props']['pageProps']['apolloState']
+ elem = h.xpath('//script[@id="__NEXT_DATA__"]/text()')
+ src = elem[0].strip() if elem else None
+ if not src:
+ raise ParseError(self, '__NEXT_DATA__ element')
+ d = json.loads(src)['props']['pageProps']['apolloState']
+ o = {'Book': [], 'Work': [], 'Series': [], 'Contributor': []}
+ for v in d.values():
+ t = v.get('__typename')
+ if t and t in o:
+ o[t].append(v)
+ b = next(filter(lambda x: x.get('title'), o['Book']), None)
+ if not b:
+ # Goodreads may return empty page template when internal service timeouts
+ raise ParseError(self, 'Book in __NEXT_DATA__ json')
+ data['title'] = b['title']
+ data['brief'] = b['description']
+ data['isbn'] = b['details'].get('isbn13')
+ asin = b['details'].get('asin')
+ if asin and asin != data['isbn']:
+ data['asin'] = asin
+ data['pages'] = b['details'].get('numPages')
+ data['cover_image_url'] = b['imageUrl']
+ w = next(filter(lambda x: x.get('details'), o['Work']), None)
+ if w:
+ data['required_resources'] = [{
+ 'model': 'Work',
+ 'id_type': IdType.Goodreads_Work,
+ 'id_value': str(w['legacyId']),
+ 'title': w['details']['originalTitle'],
+ 'url': w['editions']['webUrl'],
+ }]
+ pd = ResourceContent(metadata=data)
+ pd.lookup_ids[IdType.ISBN] = data.get('isbn')
+ pd.lookup_ids[IdType.ASIN] = data.get('asin')
+ if data["cover_image_url"]:
+ imgdl = BasicImageDownloader(data["cover_image_url"], self.url)
+ try:
+ pd.cover_image = imgdl.download().content
+ pd.cover_image_extention = imgdl.extention
+ except Exception:
+ _logger.debug(f'failed to download cover for {self.url} from {data["cover_image_url"]}')
+ return pd
+
+
+@SiteList.register
+class Goodreads_Work(AbstractSite):
+ ID_TYPE = IdType.Goodreads_Work
+ WIKI_PROPERTY_ID = ''
+ DEFAULT_MODEL = Work
+ URL_PATTERNS = [r".+goodreads.com/work/editions/(\d+)"]
+
+ @classmethod
+ def id_to_url(self, id_value):
+ return "https://www.goodreads.com/work/editions/" + id_value
+
+ def scrape(self, response=None):
+ content = BasicDownloader(self.url).download().html()
+ title_elem = content.xpath("//h1/a/text()")
+ title = title_elem[0].strip() if title_elem else None
+ if not title:
+ raise ParseError(self, 'title')
+ author_elem = content.xpath("//h2/a/text()")
+ author = author_elem[0].strip() if author_elem else None
+ first_published_elem = content.xpath("//h2/span/text()")
+ first_published = first_published_elem[0].strip() if first_published_elem else None
+ pd = ResourceContent(metadata={
+ 'title': title,
+ 'author': author,
+ 'first_published': first_published
+ })
+ return pd
diff --git a/catalog/sites/google_books.py b/catalog/sites/google_books.py
new file mode 100644
index 00000000..0554d3d8
--- /dev/null
+++ b/catalog/sites/google_books.py
@@ -0,0 +1,79 @@
+from catalog.common import *
+from catalog.models import *
+import re
+import logging
+
+
+_logger = logging.getLogger(__name__)
+
+
+@SiteList.register
+class GoogleBooks(AbstractSite):
+ ID_TYPE = IdType.GoogleBooks
+ URL_PATTERNS = [
+ r"https://books\.google\.co[^/]+/books\?id=([^]+)",
+ r"https://www\.google\.co[^/]+/books/edition/[^/]+/([^?]+)",
+ r"https://books\.google\.co[^/]+/books/about/[^?]+?id=([^?]+)",
+ ]
+ WIKI_PROPERTY_ID = ''
+ DEFAULT_MODEL = Edition
+
+ @classmethod
+ def id_to_url(self, id_value):
+ return "https://books.google.com/books?id=" + id_value
+
+ def scrape(self):
+ api_url = f'https://www.googleapis.com/books/v1/volumes/{self.id_value}'
+ b = BasicDownloader(api_url).download().json()
+ other = {}
+ title = b['volumeInfo']['title']
+ subtitle = b['volumeInfo']['subtitle'] if 'subtitle' in b['volumeInfo'] else None
+ pub_year = None
+ pub_month = None
+ if 'publishedDate' in b['volumeInfo']:
+ pub_date = b['volumeInfo']['publishedDate'].split('-')
+ pub_year = pub_date[0]
+ pub_month = pub_date[1] if len(pub_date) > 1 else None
+ pub_house = b['volumeInfo']['publisher'] if 'publisher' in b['volumeInfo'] else None
+ language = b['volumeInfo']['language'] if 'language' in b['volumeInfo'] else None
+ pages = b['volumeInfo']['pageCount'] if 'pageCount' in b['volumeInfo'] else None
+ if 'mainCategory' in b['volumeInfo']:
+ other['分类'] = b['volumeInfo']['mainCategory']
+ authors = b['volumeInfo']['authors'] if 'authors' in b['volumeInfo'] else None
+ if 'description' in b['volumeInfo']:
+ brief = b['volumeInfo']['description']
+ elif 'textSnippet' in b['volumeInfo']:
+ brief = b["volumeInfo"]["textSnippet"]["searchInfo"]
+ else:
+ brief = ''
+ brief = re.sub(r'<.*?>', '', brief.replace(' 0:
+ url = f"https://www.themoviedb.org/movie/{res_data['movie_results'][0]['id']}"
+ elif 'tv_results' in res_data and len(res_data['tv_results']) > 0:
+ url = f"https://www.themoviedb.org/tv/{res_data['tv_results'][0]['id']}"
+ elif 'tv_season_results' in res_data and len(res_data['tv_season_results']) > 0:
+ # this should not happen given IMDB only has ids for either show or episode
+ tv_id = res_data['tv_season_results'][0]['show_id']
+ season_number = res_data['tv_season_results'][0]['season_number']
+ url = f"https://www.themoviedb.org/tv/{tv_id}/season/{season_number}/episode/{episode_number}"
+ elif 'tv_episode_results' in res_data and len(res_data['tv_episode_results']) > 0:
+ tv_id = res_data['tv_episode_results'][0]['show_id']
+ season_number = res_data['tv_episode_results'][0]['season_number']
+ episode_number = res_data['tv_episode_results'][0]['episode_number']
+ if season_number == 0:
+ url = f"https://www.themoviedb.org/tv/{tv_id}/season/{season_number}/episode/{episode_number}"
+ elif episode_number == 1:
+ url = f"https://www.themoviedb.org/tv/{tv_id}/season/{season_number}"
+ else:
+ raise ParseError(self, "IMDB id matching TMDB but not first episode, this is not supported")
+ else:
+ raise ParseError(self, "IMDB id not found in TMDB")
+ tmdb = SiteList.get_site_by_url(url)
+ pd = tmdb.scrape()
+ pd.metadata['preferred_model'] = tmdb.DEFAULT_MODEL.__name__
+ return pd
diff --git a/catalog/sites/spotify.py b/catalog/sites/spotify.py
new file mode 100644
index 00000000..c29c32dd
--- /dev/null
+++ b/catalog/sites/spotify.py
@@ -0,0 +1,145 @@
+"""
+Spotify
+"""
+from django.conf import settings
+from catalog.common import *
+from catalog.models import *
+from .douban import *
+import time
+import datetime
+import requests
+import dateparser
+import logging
+
+
+_logger = logging.getLogger(__name__)
+
+
+spotify_token = None
+spotify_token_expire_time = time.time()
+
+
+@SiteList.register
+class Spotify(AbstractSite):
+ ID_TYPE = IdType.Spotify_Album
+ URL_PATTERNS = [r'\w+://open\.spotify\.com/album/([a-zA-Z0-9]+)']
+ WIKI_PROPERTY_ID = '?'
+ DEFAULT_MODEL = Album
+
+ @classmethod
+ def id_to_url(self, id_value):
+ return f"https://open.spotify.com/album/{id_value}"
+
+ def scrape(self):
+ api_url = "https://api.spotify.com/v1/albums/" + self.id_value
+ headers = {
+ 'Authorization': f"Bearer {get_spotify_token()}"
+ }
+ res_data = BasicDownloader(api_url, headers=headers).download().json()
+ artist = []
+ for artist_dict in res_data['artists']:
+ artist.append(artist_dict['name'])
+
+ title = res_data['name']
+
+ genre = ', '.join(res_data['genres'])
+
+ company = []
+ for com in res_data['copyrights']:
+ company.append(com['text'])
+
+ duration = 0
+ track_list = []
+ track_urls = []
+ for track in res_data['tracks']['items']:
+ track_urls.append(track['external_urls']['spotify'])
+ duration += track['duration_ms']
+ if res_data['tracks']['items'][-1]['disc_number'] > 1:
+ # more than one disc
+ track_list.append(str(
+ track['disc_number']) + '-' + str(track['track_number']) + '. ' + track['name'])
+ else:
+ track_list.append(str(track['track_number']) + '. ' + track['name'])
+ track_list = '\n'.join(track_list)
+
+ release_date = dateparser.parse(res_data['release_date']).strftime('%Y-%m-%d')
+
+ gtin = None
+ if res_data['external_ids'].get('upc'):
+ gtin = res_data['external_ids'].get('upc')
+ if res_data['external_ids'].get('ean'):
+ gtin = res_data['external_ids'].get('ean')
+ isrc = None
+ if res_data['external_ids'].get('isrc'):
+ isrc = res_data['external_ids'].get('isrc')
+
+ pd = ResourceContent(metadata={
+ 'title': title,
+ 'artist': artist,
+ 'genre': genre,
+ 'track_list': track_list,
+ 'release_date': release_date,
+ 'duration': duration,
+ 'company': company,
+ 'brief': None,
+ 'cover_image_url': res_data['images'][0]['url']
+ })
+ if gtin:
+ pd.lookup_ids[IdType.GTIN] = gtin
+ if isrc:
+ pd.lookup_ids[IdType.ISRC] = isrc
+ if pd.metadata["cover_image_url"]:
+ imgdl = BasicImageDownloader(pd.metadata["cover_image_url"], self.url)
+ try:
+ pd.cover_image = imgdl.download().content
+ pd.cover_image_extention = imgdl.extention
+ except Exception:
+ _logger.debug(f'failed to download cover for {self.url} from {pd.metadata["cover_image_url"]}')
+ return pd
+
+
+def get_spotify_token():
+ global spotify_token, spotify_token_expire_time
+ if get_mock_mode():
+ return 'mocked'
+ if spotify_token is None or is_spotify_token_expired():
+ invoke_spotify_token()
+ return spotify_token
+
+
+def is_spotify_token_expired():
+ global spotify_token_expire_time
+ return True if spotify_token_expire_time <= time.time() else False
+
+
+def invoke_spotify_token():
+ global spotify_token, spotify_token_expire_time
+ r = requests.post(
+ "https://accounts.spotify.com/api/token",
+ data={
+ "grant_type": "client_credentials"
+ },
+ headers={
+ "Authorization": f"Basic {settings.SPOTIFY_CREDENTIAL}"
+ }
+ )
+ data = r.json()
+ if r.status_code == 401:
+ # token expired, try one more time
+ # this maybe caused by external operations,
+ # for example debugging using a http client
+ r = requests.post(
+ "https://accounts.spotify.com/api/token",
+ data={
+ "grant_type": "client_credentials"
+ },
+ headers={
+ "Authorization": f"Basic {settings.SPOTIFY_CREDENTIAL}"
+ }
+ )
+ data = r.json()
+ elif r.status_code != 200:
+ raise Exception(f"Request to spotify API fails. Reason: {r.reason}")
+ # minus 2 for execution time error
+ spotify_token_expire_time = int(data['expires_in']) + time.time() - 2
+ spotify_token = data['access_token']
diff --git a/catalog/sites/steam.py b/catalog/sites/steam.py
new file mode 100644
index 00000000..c80bc769
--- /dev/null
+++ b/catalog/sites/steam.py
@@ -0,0 +1,64 @@
+from catalog.common import *
+from catalog.models import *
+from .igdb import search_igdb_by_3p_url
+import dateparser
+import logging
+
+
+_logger = logging.getLogger(__name__)
+
+
+@SiteList.register
+class Steam(AbstractSite):
+ ID_TYPE = IdType.Steam
+ URL_PATTERNS = [r"\w+://store\.steampowered\.com/app/(\d+)"]
+ WIKI_PROPERTY_ID = '?'
+ DEFAULT_MODEL = Game
+
+ @classmethod
+ def id_to_url(self, id_value):
+ return "https://store.steampowered.com/app/" + str(id_value)
+
+ def scrape(self):
+ i = search_igdb_by_3p_url(self.url)
+ pd = i.scrape() if i else ResourceContent()
+
+ headers = BasicDownloader.headers.copy()
+ headers['Host'] = 'store.steampowered.com'
+ headers['Cookie'] = "wants_mature_content=1; birthtime=754700401;"
+ content = BasicDownloader(self.url, headers=headers).download().html()
+
+ title = content.xpath("//div[@class='apphub_AppName']/text()")[0]
+ developer = content.xpath("//div[@id='developers_list']/a/text()")
+ publisher = content.xpath("//div[@class='glance_ctn']//div[@class='dev_row'][2]//a/text()")
+ release_date = dateparser.parse(
+ content.xpath(
+ "//div[@class='release_date']/div[@class='date']/text()")[0]
+ ).strftime('%Y-%m-%d')
+ genre = content.xpath(
+ "//div[@class='details_block']/b[2]/following-sibling::a/text()")
+ platform = ['PC']
+ brief = content.xpath(
+ "//div[@class='game_description_snippet']/text()")[0].strip()
+ # try Steam images if no image from IGDB
+ if pd.cover_image is None:
+ pd.metadata['cover_image_url'] = content.xpath("//img[@class='game_header_image_full']/@src")[0].replace("header.jpg", "library_600x900.jpg")
+ pd.cover_image, pd.cover_image_extention = BasicImageDownloader.download_image(pd.metadata['cover_image_url'], self.url)
+ if pd.cover_image is None:
+ pd.metadata['cover_image_url'] = content.xpath("//img[@class='game_header_image_full']/@src")[0]
+ pd.cover_image, pd.cover_image_extention = BasicImageDownloader.download_image(pd.metadata['cover_image_url'], self.url)
+ # merge data from IGDB, use localized Steam data if available
+ d = {
+ 'developer': developer,
+ 'publisher': publisher,
+ 'release_date': release_date,
+ 'genre': genre,
+ 'platform': platform,
+ }
+ d.update(pd.metadata)
+ pd.metadata = d
+ if title:
+ pd.metadata['title'] = title
+ if brief:
+ pd.metadata['brief'] = brief
+ return pd
diff --git a/catalog/sites/tmdb.py b/catalog/sites/tmdb.py
new file mode 100644
index 00000000..f0c65c90
--- /dev/null
+++ b/catalog/sites/tmdb.py
@@ -0,0 +1,328 @@
+"""
+The Movie Database
+"""
+
+import re
+from django.conf import settings
+from catalog.common import *
+from .douban import *
+from catalog.movie.models import *
+from catalog.tv.models import *
+import logging
+
+
+_logger = logging.getLogger(__name__)
+
+
+def search_tmdb_by_imdb_id(imdb_id):
+ tmdb_api_url = f"https://api.themoviedb.org/3/find/{imdb_id}?api_key={settings.TMDB_API3_KEY}&language=zh-CN&external_source=imdb_id"
+ res_data = BasicDownloader(tmdb_api_url).download().json()
+ return res_data
+
+
+def _copy_dict(s, key_map):
+ d = {}
+ for src, dst in key_map.items():
+ d[dst if dst else src] = s.get(src)
+ return d
+
+
+genre_map = {
+ 'Sci-Fi & Fantasy': 'Sci-Fi',
+ 'War & Politics': 'War',
+ '儿童': 'Kids',
+ '冒险': 'Adventure',
+ '剧情': 'Drama',
+ '动作': 'Action',
+ '动作冒险': 'Action',
+ '动画': 'Animation',
+ '历史': 'History',
+ '喜剧': 'Comedy',
+ '奇幻': 'Fantasy',
+ '家庭': 'Family',
+ '恐怖': 'Horror',
+ '悬疑': 'Mystery',
+ '惊悚': 'Thriller',
+ '战争': 'War',
+ '新闻': 'News',
+ '爱情': 'Romance',
+ '犯罪': 'Crime',
+ '电视电影': 'TV Movie',
+ '真人秀': 'Reality-TV',
+ '科幻': 'Sci-Fi',
+ '纪录': 'Documentary',
+ '肥皂剧': 'Soap',
+ '脱口秀': 'Talk-Show',
+ '西部': 'Western',
+ '音乐': 'Music',
+}
+
+
+@SiteList.register
+class TMDB_Movie(AbstractSite):
+ ID_TYPE = IdType.TMDB_Movie
+ URL_PATTERNS = [r'\w+://www.themoviedb.org/movie/(\d+)']
+ WIKI_PROPERTY_ID = '?'
+ DEFAULT_MODEL = Movie
+
+ @classmethod
+ def id_to_url(self, id_value):
+ return f"https://www.themoviedb.org/movie/{id_value}"
+
+ def scrape(self):
+ is_series = False
+ if is_series:
+ api_url = f"https://api.themoviedb.org/3/tv/{self.id_value}?api_key={settings.TMDB_API3_KEY}&language=zh-CN&append_to_response=external_ids,credits"
+ else:
+ api_url = f"https://api.themoviedb.org/3/movie/{self.id_value}?api_key={settings.TMDB_API3_KEY}&language=zh-CN&append_to_response=external_ids,credits"
+
+ res_data = BasicDownloader(api_url).download().json()
+
+ if is_series:
+ title = res_data['name']
+ orig_title = res_data['original_name']
+ year = int(res_data['first_air_date'].split(
+ '-')[0]) if res_data['first_air_date'] else None
+ imdb_code = res_data['external_ids']['imdb_id']
+ showtime = [{res_data['first_air_date']: "首播日期"}
+ ] if res_data['first_air_date'] else None
+ duration = None
+ else:
+ title = res_data['title']
+ orig_title = res_data['original_title']
+ year = int(res_data['release_date'].split('-')
+ [0]) if res_data['release_date'] else None
+ showtime = [{res_data['release_date']: "发布日期"}
+ ] if res_data['release_date'] else None
+ imdb_code = res_data['imdb_id']
+ # in minutes
+ duration = res_data['runtime'] if res_data['runtime'] else None
+
+ genre = list(map(lambda x: genre_map[x['name']] if x['name']
+ in genre_map else 'Other', res_data['genres']))
+ language = list(map(lambda x: x['name'], res_data['spoken_languages']))
+ brief = res_data['overview']
+
+ if is_series:
+ director = list(map(lambda x: x['name'], res_data['created_by']))
+ else:
+ director = list(map(lambda x: x['name'], filter(
+ lambda c: c['job'] == 'Director', res_data['credits']['crew'])))
+ playwright = list(map(lambda x: x['name'], filter(
+ lambda c: c['job'] == 'Screenplay', res_data['credits']['crew'])))
+ actor = list(map(lambda x: x['name'], res_data['credits']['cast']))
+ area = []
+
+ other_info = {}
+ # other_info['TMDB评分'] = res_data['vote_average']
+ # other_info['分级'] = res_data['contentRating']
+ # other_info['Metacritic评分'] = res_data['metacriticRating']
+ # other_info['奖项'] = res_data['awards']
+ # other_info['TMDB_ID'] = id
+ if is_series:
+ other_info['Seasons'] = res_data['number_of_seasons']
+ other_info['Episodes'] = res_data['number_of_episodes']
+
+ # TODO: use GET /configuration to get base url
+ img_url = ('https://image.tmdb.org/t/p/original/' + res_data['poster_path']) if res_data['poster_path'] is not None else None
+
+ pd = ResourceContent(metadata={
+ 'title': title,
+ 'orig_title': orig_title,
+ 'other_title': None,
+ 'imdb_code': imdb_code,
+ 'director': director,
+ 'playwright': playwright,
+ 'actor': actor,
+ 'genre': genre,
+ 'showtime': showtime,
+ 'site': None,
+ 'area': area,
+ 'language': language,
+ 'year': year,
+ 'duration': duration,
+ 'season': None,
+ 'episodes': None,
+ 'single_episode_length': None,
+ 'brief': brief,
+ 'cover_image_url': img_url,
+ })
+ if imdb_code:
+ pd.lookup_ids[IdType.IMDB] = imdb_code
+ if pd.metadata["cover_image_url"]:
+ imgdl = BasicImageDownloader(pd.metadata["cover_image_url"], self.url)
+ try:
+ pd.cover_image = imgdl.download().content
+ pd.cover_image_extention = imgdl.extention
+ except Exception:
+ _logger.debug(f'failed to download cover for {self.url} from {pd.metadata["cover_image_url"]}')
+ return pd
+
+
+@SiteList.register
+class TMDB_TV(AbstractSite):
+ ID_TYPE = IdType.TMDB_TV
+ URL_PATTERNS = [r'\w+://www.themoviedb.org/tv/(\d+)[^/]*$', r'\w+://www.themoviedb.org/tv/(\d+)[^/]*/seasons']
+ WIKI_PROPERTY_ID = '?'
+ DEFAULT_MODEL = TVShow
+
+ @classmethod
+ def id_to_url(self, id_value):
+ return f"https://www.themoviedb.org/tv/{id_value}"
+
+ def scrape(self):
+ is_series = True
+ if is_series:
+ api_url = f"https://api.themoviedb.org/3/tv/{self.id_value}?api_key={settings.TMDB_API3_KEY}&language=zh-CN&append_to_response=external_ids,credits"
+ else:
+ api_url = f"https://api.themoviedb.org/3/movie/{self.id_value}?api_key={settings.TMDB_API3_KEY}&language=zh-CN&append_to_response=external_ids,credits"
+
+ res_data = BasicDownloader(api_url).download().json()
+
+ if is_series:
+ title = res_data['name']
+ orig_title = res_data['original_name']
+ year = int(res_data['first_air_date'].split(
+ '-')[0]) if res_data['first_air_date'] else None
+ imdb_code = res_data['external_ids']['imdb_id']
+ showtime = [{res_data['first_air_date']: "首播日期"}
+ ] if res_data['first_air_date'] else None
+ duration = None
+ else:
+ title = res_data['title']
+ orig_title = res_data['original_title']
+ year = int(res_data['release_date'].split('-')
+ [0]) if res_data['release_date'] else None
+ showtime = [{res_data['release_date']: "发布日期"}
+ ] if res_data['release_date'] else None
+ imdb_code = res_data['imdb_id']
+ # in minutes
+ duration = res_data['runtime'] if res_data['runtime'] else None
+
+ genre = list(map(lambda x: genre_map[x['name']] if x['name']
+ in genre_map else 'Other', res_data['genres']))
+ language = list(map(lambda x: x['name'], res_data['spoken_languages']))
+ brief = res_data['overview']
+
+ if is_series:
+ director = list(map(lambda x: x['name'], res_data['created_by']))
+ else:
+ director = list(map(lambda x: x['name'], filter(
+ lambda c: c['job'] == 'Director', res_data['credits']['crew'])))
+ playwright = list(map(lambda x: x['name'], filter(
+ lambda c: c['job'] == 'Screenplay', res_data['credits']['crew'])))
+ actor = list(map(lambda x: x['name'], res_data['credits']['cast']))
+ area = []
+
+ other_info = {}
+ # other_info['TMDB评分'] = res_data['vote_average']
+ # other_info['分级'] = res_data['contentRating']
+ # other_info['Metacritic评分'] = res_data['metacriticRating']
+ # other_info['奖项'] = res_data['awards']
+ # other_info['TMDB_ID'] = id
+ if is_series:
+ other_info['Seasons'] = res_data['number_of_seasons']
+ other_info['Episodes'] = res_data['number_of_episodes']
+
+ # TODO: use GET /configuration to get base url
+ img_url = ('https://image.tmdb.org/t/p/original/' + res_data['poster_path']) if res_data['poster_path'] is not None else None
+
+ season_links = list(map(lambda s: {
+ 'model': 'TVSeason',
+ 'id_type': IdType.TMDB_TVSeason,
+ 'id_value': f'{self.id_value}-{s["season_number"]}',
+ 'title': s['name'],
+ 'url': f'{self.url}/season/{s["season_number"]}'}, res_data['seasons']))
+ pd = ResourceContent(metadata={
+ 'title': title,
+ 'orig_title': orig_title,
+ 'other_title': None,
+ 'imdb_code': imdb_code,
+ 'director': director,
+ 'playwright': playwright,
+ 'actor': actor,
+ 'genre': genre,
+ 'showtime': showtime,
+ 'site': None,
+ 'area': area,
+ 'language': language,
+ 'year': year,
+ 'duration': duration,
+ 'season': None,
+ 'episodes': None,
+ 'single_episode_length': None,
+ 'brief': brief,
+ 'cover_image_url': img_url,
+ 'related_resources': season_links,
+ })
+ if imdb_code:
+ pd.lookup_ids[IdType.IMDB] = imdb_code
+
+ if pd.metadata["cover_image_url"]:
+ imgdl = BasicImageDownloader(pd.metadata["cover_image_url"], self.url)
+ try:
+ pd.cover_image = imgdl.download().content
+ pd.cover_image_extention = imgdl.extention
+ except Exception:
+ _logger.debug(f'failed to download cover for {self.url} from {pd.metadata["cover_image_url"]}')
+ return pd
+
+
+@SiteList.register
+class TMDB_TVSeason(AbstractSite):
+ ID_TYPE = IdType.TMDB_TVSeason
+ URL_PATTERNS = [r'\w+://www.themoviedb.org/tv/(\d+)[^/]*/season/(\d+)[^/]*$']
+ WIKI_PROPERTY_ID = '?'
+ DEFAULT_MODEL = TVSeason
+ ID_PATTERN = r'^(\d+)-(\d+)$'
+
+ @classmethod
+ def url_to_id(cls, url: str):
+ u = next(iter([re.match(p, url) for p in cls.URL_PATTERNS if re.match(p, url)]), None)
+ return u[1] + '-' + u[2] if u else None
+
+ @classmethod
+ def id_to_url(cls, id_value):
+ v = id_value.split('-')
+ return f"https://www.themoviedb.org/tv/{v[0]}/season/{v[1]}"
+
+ def scrape(self):
+ v = self.id_value.split('-')
+ api_url = f"https://api.themoviedb.org/3/tv/{v[0]}/season/{v[1]}?api_key={settings.TMDB_API3_KEY}&language=zh-CN&append_to_response=external_ids,credits"
+ d = BasicDownloader(api_url).download().json()
+ if not d.get('id'):
+ raise ParseError('id')
+ pd = ResourceContent(metadata=_copy_dict(d, {'name': 'title', 'overview': 'brief', 'air_date': 'air_date', 'season_number': 0, 'external_ids': 0}))
+ pd.metadata['required_resources'] = [{
+ 'model': 'TVShow',
+ 'id_type': IdType.TMDB_TV,
+ 'id_value': v[0],
+ 'title': f'TMDB TV Show {v[0]}',
+ 'url': f"https://www.themoviedb.org/tv/{v[0]}",
+ }]
+ pd.lookup_ids[IdType.IMDB] = d['external_ids'].get('imdb_id')
+ pd.metadata['cover_image_url'] = ('https://image.tmdb.org/t/p/original/' + d['poster_path']) if d['poster_path'] else None
+ pd.metadata['title'] = pd.metadata['title'] if pd.metadata['title'] else f'Season {d["season_number"]}'
+ pd.metadata['episode_number_list'] = list(map(lambda ep: ep['episode_number'], d['episodes']))
+ pd.metadata['episode_count'] = len(pd.metadata['episode_number_list'])
+ if pd.metadata["cover_image_url"]:
+ imgdl = BasicImageDownloader(pd.metadata["cover_image_url"], self.url)
+ try:
+ pd.cover_image = imgdl.download().content
+ pd.cover_image_extention = imgdl.extention
+ except Exception:
+ _logger.debug(f'failed to download cover for {self.url} from {pd.metadata["cover_image_url"]}')
+
+ # get external id from 1st episode
+ if pd.lookup_ids[IdType.IMDB]:
+ _logger.warning("Unexpected IMDB id for TMDB tv season")
+ elif len(pd.metadata['episode_number_list']) == 0:
+ _logger.warning("Unable to lookup IMDB id for TMDB tv season with zero episodes")
+ else:
+ ep = pd.metadata['episode_number_list'][0]
+ api_url2 = f"https://api.themoviedb.org/3/tv/{v[0]}/season/{v[1]}/episode/{ep}?api_key={settings.TMDB_API3_KEY}&language=zh-CN&append_to_response=external_ids,credits"
+ d2 = BasicDownloader(api_url2).download().json()
+ if not d2.get('id'):
+ raise ParseError('episode id for season')
+ pd.lookup_ids[IdType.IMDB] = d2['external_ids'].get('imdb_id')
+ return pd
diff --git a/catalog/tests.py b/catalog/tests.py
new file mode 100644
index 00000000..952d0993
--- /dev/null
+++ b/catalog/tests.py
@@ -0,0 +1,10 @@
+from django.test import TestCase
+from catalog.book.tests import *
+from catalog.movie.tests import *
+from catalog.tv.tests import *
+from catalog.music.tests import *
+from catalog.game.tests import *
+from catalog.podcast.tests import *
+from catalog.performance.tests import *
+
+# imported tests with same name might be ignored silently
diff --git a/catalog/tv/models.py b/catalog/tv/models.py
new file mode 100644
index 00000000..ea1044f1
--- /dev/null
+++ b/catalog/tv/models.py
@@ -0,0 +1,62 @@
+"""
+Models for TV
+
+TVShow -> TVSeason -> TVEpisode
+
+TVEpisode is not fully implemented at the moment
+
+Three way linking between Douban / IMDB / TMDB are quite messy
+
+IMDB:
+most widely used.
+no ID for Season, only for Show and Episode
+
+TMDB:
+most friendly API.
+for some TV specials, both shown as an Episode of Season 0 and a Movie, with same IMDB id
+
+Douban:
+most wanted by our users.
+for single season show, IMDB id of the show id used
+for multi season show, IMDB id for Ep 1 will be used to repensent that season
+tv specials are are shown as movies
+
+For now, we follow Douban convention, but keep an eye on it in case it breaks its own rules...
+
+"""
+from catalog.common import *
+from django.db import models
+
+
+class TVShow(Item):
+ imdb = PrimaryLookupIdDescriptor(IdType.IMDB)
+ tmdb_tv = PrimaryLookupIdDescriptor(IdType.TMDB_TV)
+ imdb = PrimaryLookupIdDescriptor(IdType.IMDB)
+ season_count = jsondata.IntegerField(blank=True, default=None)
+
+
+class TVSeason(Item):
+ douban_movie = PrimaryLookupIdDescriptor(IdType.DoubanMovie)
+ imdb = PrimaryLookupIdDescriptor(IdType.IMDB)
+ tmdb_tvseason = PrimaryLookupIdDescriptor(IdType.TMDB_TVSeason)
+ show = models.ForeignKey(TVShow, null=True, on_delete=models.SET_NULL, related_name='seasons')
+ season_number = models.PositiveIntegerField()
+ episode_count = jsondata.IntegerField(blank=True, default=None)
+ METADATA_COPY_LIST = ['title', 'brief', 'season_number', 'episode_count']
+
+ def update_linked_items_from_external_resource(self, resource):
+ """add Work from resource.metadata['work'] if not yet"""
+ links = resource.required_resources + resource.related_resources
+ for w in links:
+ if w['model'] == 'TVShow':
+ p = ExternalResource.objects.filter(id_type=w['id_type'], id_value=w['id_value']).first()
+ if p and p.item and self.show != p.item:
+ self.show = p.item
+
+
+class TVEpisode(Item):
+ show = models.ForeignKey(TVShow, null=True, on_delete=models.SET_NULL, related_name='episodes')
+ season = models.ForeignKey(TVSeason, null=True, on_delete=models.SET_NULL, related_name='episodes')
+ episode_number = models.PositiveIntegerField()
+ imdb = PrimaryLookupIdDescriptor(IdType.IMDB)
+ METADATA_COPY_LIST = ['title', 'brief', 'episode_number']
diff --git a/catalog/tv/tests.py b/catalog/tv/tests.py
new file mode 100644
index 00000000..a25c45aa
--- /dev/null
+++ b/catalog/tv/tests.py
@@ -0,0 +1,128 @@
+from django.test import TestCase
+from catalog.common import *
+from catalog.tv.models import *
+
+
+class TMDBTVTestCase(TestCase):
+ def test_parse(self):
+ t_id = '57243'
+ t_url = 'https://www.themoviedb.org/tv/57243-doctor-who'
+ t_url1 = 'https://www.themoviedb.org/tv/57243-doctor-who/seasons'
+ t_url2 = 'https://www.themoviedb.org/tv/57243'
+ p1 = SiteList.get_site_by_id_type(IdType.TMDB_TV)
+ self.assertIsNotNone(p1)
+ self.assertEqual(p1.validate_url(t_url), True)
+ self.assertEqual(p1.validate_url(t_url1), True)
+ self.assertEqual(p1.validate_url(t_url2), True)
+ p2 = SiteList.get_site_by_url(t_url)
+ self.assertEqual(p1.id_to_url(t_id), t_url2)
+ self.assertEqual(p2.url_to_id(t_url), t_id)
+ wrong_url = 'https://www.themoviedb.org/tv/57243-doctor-who/season/13'
+ s1 = SiteList.get_site_by_url(wrong_url)
+ self.assertNotIsInstance(s1, TVShow)
+
+ @use_local_response
+ def test_scrape(self):
+ t_url = 'https://www.themoviedb.org/tv/57243-doctor-who'
+ site = SiteList.get_site_by_url(t_url)
+ self.assertEqual(site.ready, False)
+ self.assertEqual(site.id_value, '57243')
+ site.get_resource_ready()
+ self.assertEqual(site.ready, True)
+ self.assertEqual(site.resource.metadata['title'], '神秘博士')
+ self.assertEqual(site.resource.item.primary_lookup_id_type, IdType.IMDB)
+ self.assertEqual(site.resource.item.__class__.__name__, 'TVShow')
+ self.assertEqual(site.resource.item.imdb, 'tt0436992')
+
+
+class TMDBTVSeasonTestCase(TestCase):
+ def test_parse(self):
+ t_id = '57243-11'
+ t_url = 'https://www.themoviedb.org/tv/57243-doctor-who/season/11'
+ t_url_unique = 'https://www.themoviedb.org/tv/57243/season/11'
+ p1 = SiteList.get_site_by_id_type(IdType.TMDB_TVSeason)
+ self.assertIsNotNone(p1)
+ self.assertEqual(p1.validate_url(t_url), True)
+ self.assertEqual(p1.validate_url(t_url_unique), True)
+ p2 = SiteList.get_site_by_url(t_url)
+ self.assertEqual(p1.id_to_url(t_id), t_url_unique)
+ self.assertEqual(p2.url_to_id(t_url), t_id)
+
+ @use_local_response
+ def test_scrape(self):
+ t_url = 'https://www.themoviedb.org/tv/57243-doctor-who/season/4'
+ site = SiteList.get_site_by_url(t_url)
+ self.assertEqual(site.ready, False)
+ self.assertEqual(site.id_value, '57243-4')
+ site.get_resource_ready()
+ self.assertEqual(site.ready, True)
+ self.assertEqual(site.resource.metadata['title'], '第 4 季')
+ self.assertEqual(site.resource.item.primary_lookup_id_type, IdType.IMDB)
+ self.assertEqual(site.resource.item.__class__.__name__, 'TVSeason')
+ self.assertEqual(site.resource.item.imdb, 'tt1159991')
+ self.assertIsNotNone(site.resource.item.show)
+ self.assertEqual(site.resource.item.show.imdb, 'tt0436992')
+
+
+class DoubanMovieTVTestCase(TestCase):
+ @use_local_response
+ def test_scrape(self):
+ url3 = 'https://movie.douban.com/subject/3627919/'
+ p3 = SiteList.get_site_by_url(url3).get_resource_ready()
+ self.assertEqual(p3.item.__class__.__name__, 'TVSeason')
+ self.assertIsNotNone(p3.item.show)
+ self.assertEqual(p3.item.show.imdb, 'tt0436992')
+
+ @use_local_response
+ def test_scrape_singleseason(self):
+ url3 = 'https://movie.douban.com/subject/26895436/'
+ p3 = SiteList.get_site_by_url(url3).get_resource_ready()
+ self.assertEqual(p3.item.__class__.__name__, 'TVShow')
+
+
+class MultiTVSitesTestCase(TestCase):
+ @use_local_response
+ def test_tvshows(self):
+ url1 = 'https://www.themoviedb.org/tv/57243-doctor-who'
+ url2 = 'https://www.imdb.com/title/tt0436992/'
+ # url3 = 'https://movie.douban.com/subject/3541415/'
+ p1 = SiteList.get_site_by_url(url1).get_resource_ready()
+ p2 = SiteList.get_site_by_url(url2).get_resource_ready()
+ # p3 = SiteList.get_site_by_url(url3).get_resource_ready()
+ self.assertEqual(p1.item.id, p2.item.id)
+ # self.assertEqual(p2.item.id, p3.item.id)
+
+ @use_local_response
+ def test_tvseasons(self):
+ url1 = 'https://www.themoviedb.org/tv/57243-doctor-who/season/4'
+ url2 = 'https://www.imdb.com/title/tt1159991/'
+ url3 = 'https://movie.douban.com/subject/3627919/'
+ p1 = SiteList.get_site_by_url(url1).get_resource_ready()
+ p2 = SiteList.get_site_by_url(url2).get_resource_ready()
+ p3 = SiteList.get_site_by_url(url3).get_resource_ready()
+ self.assertEqual(p1.item.imdb, p2.item.imdb)
+ self.assertEqual(p2.item.imdb, p3.item.imdb)
+ self.assertEqual(p1.item.id, p2.item.id)
+ self.assertEqual(p2.item.id, p3.item.id)
+
+ @use_local_response
+ def test_miniseries(self):
+ url1 = 'https://www.themoviedb.org/tv/86941-the-north-water'
+ url3 = 'https://movie.douban.com/subject/26895436/'
+ p1 = SiteList.get_site_by_url(url1).get_resource_ready()
+ p3 = SiteList.get_site_by_url(url3).get_resource_ready()
+ self.assertEqual(p3.item.__class__.__name__, 'TVShow')
+ self.assertEqual(p1.item.id, p3.item.id)
+
+ @use_local_response
+ def test_tvspecial(self):
+ url1 = 'https://www.themoviedb.org/movie/282758-doctor-who-the-runaway-bride'
+ url2 = 'hhttps://www.imdb.com/title/tt0827573/'
+ url3 = 'https://movie.douban.com/subject/4296866/'
+ p1 = SiteList.get_site_by_url(url1).get_resource_ready()
+ p2 = SiteList.get_site_by_url(url2).get_resource_ready()
+ p3 = SiteList.get_site_by_url(url3).get_resource_ready()
+ self.assertEqual(p1.item.imdb, p2.item.imdb)
+ self.assertEqual(p2.item.imdb, p3.item.imdb)
+ self.assertEqual(p1.item.id, p2.item.id)
+ self.assertEqual(p2.item.id, p3.item.id)
diff --git a/catalog/urls.py b/catalog/urls.py
new file mode 100644
index 00000000..6a2855b5
--- /dev/null
+++ b/catalog/urls.py
@@ -0,0 +1,6 @@
+from django.urls import path
+from .api import api
+
+urlpatterns = [
+ path("", api.urls),
+]
diff --git a/catalog/views.py b/catalog/views.py
new file mode 100644
index 00000000..91ea44a2
--- /dev/null
+++ b/catalog/views.py
@@ -0,0 +1,3 @@
+from django.shortcuts import render
+
+# Create your views here.
diff --git a/common/scrapers/douban.py b/common/scrapers/douban.py
index 6dcaff69..1cfd7310 100644
--- a/common/scrapers/douban.py
+++ b/common/scrapers/douban.py
@@ -497,7 +497,7 @@ class DoubanMovieScraper(DoubanScrapperMixin, AbstractScraper):
episodes_elem = content.xpath(
"//div[@id='info']//span[text()='集数:']/following-sibling::text()[1]")
- episodes = int(episodes_elem[0].strip()) if episodes_elem and episodes_elem[0].isdigit() else None
+ episodes = int(episodes_elem[0].strip()) if episodes_elem and episodes_elem[0].strip().isdigit() else None
single_episode_length_elem = content.xpath(
"//div[@id='info']//span[text()='单集片长:']/following-sibling::text()[1]")
diff --git a/common/scrapers/igdb.py b/common/scrapers/igdb.py
index eb635f5c..2456497e 100644
--- a/common/scrapers/igdb.py
+++ b/common/scrapers/igdb.py
@@ -8,9 +8,22 @@ from common.scraper import *
from igdb.wrapper import IGDBWrapper
import json
import datetime
+import logging
-wrapper = IGDBWrapper(settings.IGDB_CLIENT_ID, settings.IGDB_ACCESS_TOKEN)
+_logger = logging.getLogger(__name__)
+
+
+def _igdb_access_token():
+ try:
+ token = requests.post(f'https://id.twitch.tv/oauth2/token?client_id={settings.IGDB_CLIENT_ID}&client_secret={settings.IGDB_CLIENT_SECRET}&grant_type=client_credentials').json()['access_token']
+ except Exception:
+ _logger.error('unable to obtain IGDB token')
+ token = ''
+ return token
+
+
+wrapper = IGDBWrapper(settings.IGDB_CLIENT_ID, _igdb_access_token())
class IgdbGameScraper(AbstractScraper):
diff --git a/common/static/css/boofilsic.css b/common/static/css/boofilsic.css
index 1307c064..b158c475 100644
--- a/common/static/css/boofilsic.css
+++ b/common/static/css/boofilsic.css
@@ -461,6 +461,11 @@ select::placeholder {
color: #606c76;
}
+.navbar .current {
+ color: #00a1cc;
+ font-weight: bold;
+}
+
.navbar .navbar__search-box {
margin: 0 12% 0 15px;
display: inline-flex;
diff --git a/common/static/css/boofilsic.min.css b/common/static/css/boofilsic.min.css
index 6b163092..461b5feb 100644
--- a/common/static/css/boofilsic.min.css
+++ b/common/static/css/boofilsic.min.css
@@ -1 +1 @@
-@import url(https://cdn.jsdelivr.net/npm/skeleton-css@2.0.4/css/normalize.css);.button,button,input[type='button'],input[type='reset'],input[type='submit']{background-color:#00a1cc;border:0.1rem solid #00a1cc;border-radius:.4rem;color:#fff;cursor:pointer;display:inline-block;font-size:1.1rem;font-weight:700;height:3.4rem;letter-spacing:.1rem;line-height:3.4rem;padding:0 2.8rem;text-align:center;text-decoration:none;text-transform:uppercase;white-space:nowrap}.button:focus,.button:hover,button:focus,button:hover,input[type='button']:focus,input[type='button']:hover,input[type='reset']:focus,input[type='reset']:hover,input[type='submit']:focus,input[type='submit']:hover{background-color:#606c76;border-color:#606c76;color:#fff;outline:0}.button[disabled],button[disabled],input[type='button'][disabled],input[type='reset'][disabled],input[type='submit'][disabled]{cursor:default;opacity:.5}.button[disabled]:focus,.button[disabled]:hover,button[disabled]:focus,button[disabled]:hover,input[type='button'][disabled]:focus,input[type='button'][disabled]:hover,input[type='reset'][disabled]:focus,input[type='reset'][disabled]:hover,input[type='submit'][disabled]:focus,input[type='submit'][disabled]:hover{background-color:#00a1cc;border-color:#00a1cc}.button.button-outline,button.button-outline,input[type='button'].button-outline,input[type='reset'].button-outline,input[type='submit'].button-outline{background-color:transparent;color:#00a1cc}.button.button-outline:focus,.button.button-outline:hover,button.button-outline:focus,button.button-outline:hover,input[type='button'].button-outline:focus,input[type='button'].button-outline:hover,input[type='reset'].button-outline:focus,input[type='reset'].button-outline:hover,input[type='submit'].button-outline:focus,input[type='submit'].button-outline:hover{background-color:transparent;border-color:#606c76;color:#606c76}.button.button-outline[disabled]:focus,.button.button-outline[disabled]:hover,button.button-outline[disabled]:focus,button.button-outline[disabled]:hover,input[type='button'].button-outline[disabled]:focus,input[type='button'].button-outline[disabled]:hover,input[type='reset'].button-outline[disabled]:focus,input[type='reset'].button-outline[disabled]:hover,input[type='submit'].button-outline[disabled]:focus,input[type='submit'].button-outline[disabled]:hover{border-color:inherit;color:#00a1cc}.button.button-clear,button.button-clear,input[type='button'].button-clear,input[type='reset'].button-clear,input[type='submit'].button-clear{background-color:transparent;border-color:transparent;color:#00a1cc}.button.button-clear:focus,.button.button-clear:hover,button.button-clear:focus,button.button-clear:hover,input[type='button'].button-clear:focus,input[type='button'].button-clear:hover,input[type='reset'].button-clear:focus,input[type='reset'].button-clear:hover,input[type='submit'].button-clear:focus,input[type='submit'].button-clear:hover{background-color:transparent;border-color:transparent;color:#606c76}.button.button-clear[disabled]:focus,.button.button-clear[disabled]:hover,button.button-clear[disabled]:focus,button.button-clear[disabled]:hover,input[type='button'].button-clear[disabled]:focus,input[type='button'].button-clear[disabled]:hover,input[type='reset'].button-clear[disabled]:focus,input[type='reset'].button-clear[disabled]:hover,input[type='submit'].button-clear[disabled]:focus,input[type='submit'].button-clear[disabled]:hover{color:#00a1cc}select{background:url('data:image/svg+xml;utf8, ') center right no-repeat;padding-right:3.0rem}select:focus{background-image:url('data:image/svg+xml;utf8, ')}textarea{min-height:6.5rem;width:100%}select{width:100%}label,legend{display:block;margin-bottom:.5rem}fieldset{border-width:0;padding:0}input[type='checkbox'],input[type='radio']{display:inline}.label-inline{display:inline-block;font-weight:normal;margin-left:.5rem}dl,ol,ul{list-style:none;margin-top:0;padding-left:0}ol{list-style:decimal inside}ul{list-style:circle inside}.button,button,dd,dt,li{margin-bottom:1.0rem}fieldset,input,select,textarea{margin-bottom:1.5rem}blockquote,dl,figure,form,ol,p,pre,table,ul{margin-bottom:1rem}b,strong{font-weight:bold}p{margin-top:0}h1,h2,h3,h4,h5,h6{font-weight:300;letter-spacing:-.1rem;margin-bottom:2.0rem;margin-top:0}h1{font-size:4.6rem;line-height:1.2}h2{font-size:3.6rem;line-height:1.25}h3{font-size:2.8rem;line-height:1.3}h4{font-size:2.2rem;letter-spacing:-.08rem;line-height:1.35}h5{font-size:1.8rem;letter-spacing:-.05rem;line-height:1.5}h6{font-size:1.6rem;letter-spacing:0;line-height:1.4}img{max-width:100%;object-fit:contain}img.emoji{height:14px;box-sizing:border-box;object-fit:contain;position:relative;top:3px}img.emoji--large{height:20px;position:relative;top:2px}.clearfix:after{clear:both;content:' ';display:table}.float-left{float:left}.float-right{float:right}.highlight{font-weight:bold}:root{font-size:10px}*,*:after,*:before{box-sizing:inherit}html{box-sizing:border-box;height:100%}body{color:#606c76;font-family:'Roboto', 'Helvetica Neue', 'Helvetica', 'Arial', 'Microsoft YaHei Light', sans-serif;font-size:1.3rem;font-weight:300;letter-spacing:.05rem;line-height:1.6;margin:0;height:100%}textarea{font-family:'Roboto', 'Helvetica Neue', 'Helvetica', 'Arial', 'Microsoft YaHei Light', sans-serif}a{color:#00a1cc;text-decoration:none}a:active,a:hover,a:hover:visited{color:#606c76}li{list-style:none}input[type=text]::-ms-clear,input[type=text]::-ms-reveal{display:none;width:0;height:0}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-results-button,input[type="search"]::-webkit-search-results-decoration{display:none}input[type='email'],input[type='number'],input[type='password'],input[type='search'],input[type='tel'],input[type='text'],input[type='url'],input[type='date'],input[type='time'],input[type='color'],textarea,select{appearance:none;background-color:transparent;border:0.1rem solid #ccc;border-radius:.4rem;box-shadow:none;box-sizing:inherit;padding:.6rem 1.0rem}input[type='email']:focus,input[type='number']:focus,input[type='password']:focus,input[type='search']:focus,input[type='tel']:focus,input[type='text']:focus,input[type='url']:focus,input[type='date']:focus,input[type='time']:focus,input[type='color']:focus,textarea:focus,select:focus{border-color:#00a1cc;outline:0}input[type='email']::placeholder,input[type='number']::placeholder,input[type='password']::placeholder,input[type='search']::placeholder,input[type='tel']::placeholder,input[type='text']::placeholder,input[type='url']::placeholder,input[type='date']::placeholder,input[type='time']::placeholder,input[type='color']::placeholder,textarea::placeholder,select::placeholder{color:#ccc}::selection{color:white;background-color:#00a1cc}.navbar{background-color:#f7f7f7;box-sizing:border-box;padding:10px 0;margin-bottom:50px;border-bottom:#ccc 0.5px solid}.navbar .navbar__wrapper{display:flex;justify-content:space-between;align-items:center;position:relative}.navbar .navbar__logo{flex-basis:100px}.navbar .navbar__logo-link{display:inline-block}.navbar .navbar__link-list{margin:0;display:flex;justify-content:space-around}.navbar .navbar__link{margin:9px;color:#606c76}.navbar .navbar__link:active,.navbar .navbar__link:hover,.navbar .navbar__link:hover:visited{color:#00a1cc}.navbar .navbar__link:visited{color:#606c76}.navbar .navbar__search-box{margin:0 12% 0 15px;display:inline-flex;flex:1}.navbar .navbar__search-box>input[type="search"]{border-top-right-radius:0;border-bottom-right-radius:0;margin:0;height:32px;background-color:white !important;width:100%}.navbar .navbar__search-box .navbar__search-dropdown{margin:0;margin-left:-1px;padding:0;padding-left:10px;color:#606c76;appearance:auto;background-color:white;height:32px;width:80px;border-top-left-radius:0;border-bottom-left-radius:0}.navbar .navbar__dropdown-btn{display:none;padding:0;margin:0;border:none;background-color:transparent;color:#00a1cc}.navbar .navbar__dropdown-btn:focus,.navbar .navbar__dropdown-btn:hover{background-color:transparent;color:#606c76}@media (max-width: 575.98px){.navbar{padding:2px 0}.navbar .navbar__wrapper{display:block}.navbar .navbar__logo-img{width:72px;margin-right:10px;position:relative;top:7px}.navbar .navbar__link-list{margin-top:7px;max-height:0;transition:max-height 0.6s ease-out;overflow:hidden}.navbar .navbar__dropdown-btn{display:block;position:absolute;right:5px;top:3px;transform:scale(0.7)}.navbar .navbar__dropdown-btn:hover+.navbar__link-list{max-height:500px;transition:max-height 0.6s ease-in}.navbar .navbar__search-box{margin:0;width:46vw}.navbar .navbar__search-box>input[type="search"]{height:26px;padding:4px 6px;width:32vw}.navbar .navbar__search-box .navbar__search-dropdown{cursor:pointer;height:26px;width:80px;padding-left:5px}}@media (max-width: 991.98px){.navbar{margin-bottom:20px}}.grid{margin:0 auto;position:relative;max-width:110rem;padding:0 2.0rem;width:100%}.grid .grid__main{width:70%;float:left;position:relative}.grid .grid__aside{width:26%;float:right;position:relative;display:flex;flex-direction:column;justify-content:space-around}.grid::after{content:' ';clear:both;display:table}@media (max-width: 575.98px){.grid .grid__aside{flex-direction:column !important}}@media (max-width: 991.98px){.grid .grid__main{width:100%;float:none}.grid .grid__aside{width:100%;float:none;flex-direction:row}.grid .grid__aside--tablet-column{flex-direction:column}.grid--reverse-order{transform:scaleY(-1)}.grid .grid__main--reverse-order{transform:scaleY(-1)}.grid .grid__aside--reverse-order{transform:scaleY(-1)}}.pagination{text-align:center;width:100%}.pagination .pagination__page-link{font-weight:normal;margin:0 5px}.pagination .pagination__page-link--current{font-weight:bold;font-size:1.2em;color:#606c76}.pagination .pagination__nav-link{font-size:1.4em;margin:0 2px}.pagination .pagination__nav-link--right-margin{margin-right:18px}.pagination .pagination__nav-link--left-margin{margin-left:18px}.pagination .pagination__nav-link--hidden{display:none}@media (max-width: 575.98px){.pagination .pagination__page-link{margin:0 3px}.pagination .pagination__nav-link{font-size:1.4em;margin:0 2px}.pagination .pagination__nav-link--right-margin{margin-right:10px}.pagination .pagination__nav-link--left-margin{margin-left:10px}}#page-wrapper{position:relative;min-height:100vh;z-index:0}#content-wrapper{padding-bottom:160px}.footer{padding-top:0.4em !important;text-align:center;margin-bottom:4px !important;position:absolute !important;left:50%;transform:translateX(-50%);bottom:0;width:100%}.footer__border{padding-top:4px;border-top:#f7f7f7 solid 2px}.footer__link{margin:0 12px;white-space:nowrap}@media (max-width: 575.98px){#content-wrapper{padding-bottom:120px}}.icon-lock svg{fill:#ccc;height:12px;position:relative;top:1px;margin-left:3px}.icon-edit svg{fill:#ccc;height:12px;position:relative;top:2px}.icon-save svg{fill:#ccc;height:12px;position:relative;top:2px}.icon-cross svg{fill:#ccc;height:10px;position:relative}.icon-arrow svg{fill:#606c76;height:15px;position:relative;top:3px}.spinner{display:inline-block;position:relative;left:50%;transform:translateX(-50%) scale(0.4);width:80px;height:80px}.spinner div{transform-origin:40px 40px;animation:spinner 1.2s linear infinite}.spinner div::after{content:" ";display:block;position:absolute;top:3px;left:37px;width:6px;height:18px;border-radius:20%;background:#606c76}.spinner div:nth-child(1){transform:rotate(0deg);animation-delay:-1.1s}.spinner div:nth-child(2){transform:rotate(30deg);animation-delay:-1s}.spinner div:nth-child(3){transform:rotate(60deg);animation-delay:-.9s}.spinner div:nth-child(4){transform:rotate(90deg);animation-delay:-.8s}.spinner div:nth-child(5){transform:rotate(120deg);animation-delay:-.7s}.spinner div:nth-child(6){transform:rotate(150deg);animation-delay:-.6s}.spinner div:nth-child(7){transform:rotate(180deg);animation-delay:-.5s}.spinner div:nth-child(8){transform:rotate(210deg);animation-delay:-.4s}.spinner div:nth-child(9){transform:rotate(240deg);animation-delay:-.3s}.spinner div:nth-child(10){transform:rotate(270deg);animation-delay:-.2s}.spinner div:nth-child(11){transform:rotate(300deg);animation-delay:-.1s}.spinner div:nth-child(12){transform:rotate(330deg);animation-delay:0s}@keyframes spinner{0%{opacity:1}100%{opacity:0}}.bg-mask{background-color:black;z-index:1;filter:opacity(20%);position:fixed;width:100%;height:100%;left:0;top:0;display:none}.mark-modal{z-index:2;display:none;position:fixed;width:500px;top:50%;left:50%;transform:translate(-50%, -50%);background-color:#f7f7f7;padding:20px 20px 10px 20px;color:#606c76}.mark-modal .mark-modal__head{margin-bottom:20px}.mark-modal .mark-modal__head::after{content:' ';clear:both;display:table}.mark-modal .mark-modal__title{font-weight:bold;font-size:1.2em;float:left}.mark-modal .mark-modal__close-button{float:right;cursor:pointer}.mark-modal .mark-modal__confirm-button{float:right}.mark-modal input[type="radio"]{margin-right:0}.mark-modal .mark-modal__rating-star{display:inline;float:left;position:relative;left:-3px}.mark-modal .mark-modal__status-radio{float:right}.mark-modal .mark-modal__status-radio ul{margin-bottom:0}.mark-modal .mark-modal__status-radio li,.mark-modal .mark-modal__status-radio label{display:inline}.mark-modal .mark-modal__status-radio input[type="radio"]{position:relative;top:1px}.mark-modal .mark-modal__clear{content:' ';clear:both;display:table}.mark-modal .mark-modal__content-input,.mark-modal form textarea{height:200px;width:100%;margin-top:5px;margin-bottom:5px;resize:vertical}.mark-modal .mark-modal__tag{margin-bottom:20px}.mark-modal .mark-modal__option{margin-bottom:24px}.mark-modal .mark-modal__option::after{content:' ';clear:both;display:table}.mark-modal .mark-modal__visibility-radio{float:left}.mark-modal .mark-modal__visibility-radio ul,.mark-modal .mark-modal__visibility-radio li,.mark-modal .mark-modal__visibility-radio label{display:inline}.mark-modal .mark-modal__visibility-radio label{font-size:normal}.mark-modal .mark-modal__visibility-radio input[type="radio"]{position:relative;top:2px}.mark-modal .mark-modal__share-checkbox{float:right}.mark-modal .mark-modal__share-checkbox input[type="checkbox"]{position:relative;top:2px}.confirm-modal{z-index:2;display:none;position:fixed;width:500px;top:50%;left:50%;transform:translate(-50%, -50%);background-color:#f7f7f7;padding:20px 20px 10px 20px;color:#606c76}.confirm-modal .confirm-modal__head{margin-bottom:20px}.confirm-modal .confirm-modal__head::after{content:' ';clear:both;display:table}.confirm-modal .confirm-modal__title{font-weight:bold;font-size:1.2em;float:left}.confirm-modal .confirm-modal__close-button{float:right;cursor:pointer}.confirm-modal .confirm-modal__confirm-button{float:right}.announcement-modal{z-index:2;display:none;position:fixed;width:500px;top:50%;left:50%;transform:translate(-50%, -50%);background-color:#f7f7f7;padding:20px 20px 10px 20px;color:#606c76}.announcement-modal .announcement-modal__head{margin-bottom:20px}.announcement-modal .announcement-modal__head::after{content:' ';clear:both;display:table}.announcement-modal .announcement-modal__title{font-weight:bold;font-size:1.2em;float:left}.announcement-modal .announcement-modal__close-button{float:right;cursor:pointer}.announcement-modal .announcement-modal__confirm-button{float:right}.announcement-modal .announcement-modal__body{overflow-y:auto;max-height:64vh}.announcement-modal .announcement-modal__body .announcement__title{display:inline-block}.announcement-modal .announcement-modal__body .announcement__datetime{color:#ccc;margin-left:10px}.announcement-modal .announcement-modal__body .announcement__content{word-break:break-all}.add-to-list-modal{z-index:2;display:none;position:fixed;width:500px;top:50%;left:50%;transform:translate(-50%, -50%);background-color:#f7f7f7;padding:20px 20px 10px 20px;color:#606c76}.add-to-list-modal .add-to-list-modal__head{margin-bottom:20px}.add-to-list-modal .add-to-list-modal__head::after{content:' ';clear:both;display:table}.add-to-list-modal .add-to-list-modal__title{font-weight:bold;font-size:1.2em;float:left}.add-to-list-modal .add-to-list-modal__close-button{float:right;cursor:pointer}.add-to-list-modal .add-to-list-modal__confirm-button{float:right}@media (max-width: 575.98px){.mark-modal,.confirm-modal,.announcement-modal .add-to-list-modal{width:100%}}.source-label{display:inline;background:transparent;border-radius:.3rem;border-style:solid;border-width:.1rem;line-height:1.2rem;font-size:1.1rem;margin:3px;padding:1px 3px;padding-top:2px;font-weight:lighter;letter-spacing:0.1rem;word-break:keep-all;opacity:1;position:relative;top:-1px}.source-label.source-label__in-site{border-color:#00a1cc;color:#00a1cc}.source-label.source-label__douban{border:none;color:#fff;background-color:#319840}.source-label.source-label__spotify{background-color:#1ed760;color:#000;border:none;font-weight:bold}.source-label.source-label__imdb{background-color:#F5C518;color:#121212;border:none;font-weight:bold}.source-label.source-label__igdb{background-color:#323A44;color:#DFE1E2;border:none;font-weight:bold}.source-label.source-label__steam{background:linear-gradient(30deg, #1387b8, #111d2e);color:white;border:none;font-weight:600;padding-top:2px}.source-label.source-label__bangumi{background:#FCFCFC;color:#F09199;font-style:italic;font-weight:600}.source-label.source-label__goodreads{background:#F4F1EA;color:#372213;font-weight:lighter}.source-label.source-label__tmdb{background:linear-gradient(90deg, #91CCA3, #1FB4E2);color:white;border:none;font-weight:lighter;padding-top:2px}.source-label.source-label__googlebooks{color:white;background-color:#4285F4;border-color:#4285F4}.source-label.source-label__bandcamp{color:#fff;background-color:#28A0C1;display:inline-block}.source-label.source-label__bandcamp span{display:inline-block;margin:0 4px}.main-section-wrapper{padding:32px 48px 32px 36px;background-color:#f7f7f7;overflow:auto}.main-section-wrapper input,.main-section-wrapper select{width:100%}.entity-list .entity-list__title{margin-bottom:20px}.entity-list .entity-list__entity{display:flex;margin-bottom:36px}.entity-list .entity-list__entity::after{content:' ';clear:both;display:table}.entity-list .entity-list__entity-img{object-fit:contain;min-width:130px;max-width:130px}.entity-list .entity-list__entity-text{margin-left:20px;overflow:hidden;width:100%}.entity-list .entity-list__entity-text .tag-collection{margin-left:-3px}.entity-list .entity-list__entity-link{font-size:1.2em}.entity-list .entity-list__entity-title{display:block}.entity-list .entity-list__entity-category{color:#bbb;margin-left:5px;position:relative;top:-1px}.entity-list .entity-list__entity-info{max-width:73%;white-space:nowrap;overflow:hidden;display:inline-block;text-overflow:ellipsis;position:relative;top:0.52em}.entity-list .entity-list__entity-info--full-length{max-width:100%}.entity-list .entity-list__entity-brief{margin-top:8px;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:4;overflow:hidden;margin-bottom:0}.entity-list .entity-list__rating{display:inline-block;margin:0}.entity-list .entity-list__rating--empty{margin-right:5px}.entity-list .entity-list__rating-score{margin-right:5px;position:relative;top:1px}.entity-list .entity-list__rating-star{display:inline;position:relative;top:0.3em;left:-0.3em}.entity-detail .entity-detail__img{height:210px;float:left;object-fit:contain;max-width:150px;object-position:top}.entity-detail .entity-detail__img-origin{cursor:zoom-in}.entity-detail .entity-detail__info{float:left;margin-left:20px;overflow:hidden;text-overflow:ellipsis;width:70%}.entity-detail .entity-detail__title{font-weight:bold}.entity-detail .entity-detail__title--secondary{color:#bbb}.entity-detail .entity-detail__fields{display:inline-block;vertical-align:top;width:46%;margin-left:2%}.entity-detail .entity-detail__fields div,.entity-detail .entity-detail__fields span{margin:1px 0}.entity-detail .entity-detail__fields+.tag-collection{margin-top:5px;margin-left:6px}.entity-detail .entity-detail__rating{position:relative;top:-5px}.entity-detail .entity-detail__rating-star{position:relative;left:-4px;top:3px}.entity-detail .entity-detail__rating-score{font-weight:bold}.entity-detail::after{content:' ';clear:both;display:table}.entity-desc{margin-bottom:28px}.entity-desc .entity-desc__title{display:inline-block;margin-bottom:8px}.entity-desc .entity-desc__content{overflow:hidden}.entity-desc .entity-desc__content--folded{max-height:202px}.entity-desc .entity-desc__unfold-button{display:flex;color:#00a1cc;background-color:transparent;justify-content:center;text-align:center}.entity-desc .entity-desc__unfold-button--hidden{display:none}.entity-marks{margin-bottom:28px}.entity-marks .entity-marks__title{margin-bottom:8px;display:inline-block}.entity-marks .entity-marks__title>a{margin-right:5px}.entity-marks .entity-marks__title--stand-alone{margin-bottom:20px}.entity-marks .entity-marks__more-link{margin-left:5px}.entity-marks .entity-marks__mark{margin:0;padding:3px 0;border-bottom:1px dashed #e5e5e5}.entity-marks .entity-marks__mark:last-child{border:none}.entity-marks .entity-marks__mark--wider{padding:6px 0}.entity-marks .entity-marks__mark-content{margin-bottom:0}.entity-marks .entity-marks__mark-time{color:#ccc;margin-left:2px}.entity-marks .entity-marks__rating-star{position:relative;top:4px}.entity-reviews:first-child{margin-bottom:28px}.entity-reviews .entity-reviews__title{display:inline-block;margin-bottom:8px}.entity-reviews .entity-reviews__title>a{margin-right:5px}.entity-reviews .entity-reviews__title--stand-alone{margin-bottom:20px}.entity-reviews .entity-reviews__more-link{margin-left:5px}.entity-reviews .entity-reviews__review{margin:0;padding:3px 0;border-bottom:1px dashed #e5e5e5}.entity-reviews .entity-reviews__review:last-child{border:none}.entity-reviews .entity-reviews__review--wider{padding:6px 0}.entity-reviews .entity-reviews__review-time{color:#ccc;margin-left:2px}.dividing-line{height:0;width:100%;margin:40px 0 24px 0;border-top:solid 1px #ccc}.dividing-line.dividing-line--dashed{margin:0;margin-top:10px;margin-bottom:2px;border-top:1px dashed #e5e5e5}.entity-sort{position:relative;margin-bottom:30px}.entity-sort .entity-sort__label{font-size:large;display:inline-block;margin-bottom:20px}.entity-sort .entity-sort__more-link{margin-left:8px}.entity-sort .entity-sort__count{color:#bbb}.entity-sort .entity-sort__count::before{content:'('}.entity-sort .entity-sort__count::after{content:')'}.entity-sort .entity-sort__entity-list{display:flex;justify-content:flex-start;flex-wrap:wrap}.entity-sort .entity-sort__entity{padding:0 10px;flex-basis:20%;text-align:center;display:inline-block;color:#606c76}.entity-sort .entity-sort__entity:hover{color:#00a1cc}.entity-sort .entity-sort__entity>a{color:inherit}.entity-sort .entity-sort__entity-img{height:110px}.entity-sort .entity-sort__entity-name{text-overflow:ellipsis;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.entity-sort--placeholder{border:dashed #bbb 4px}.entity-sort--hover{padding:10px;border:dashed #00a1cc 2px !important;border-radius:3px}.entity-sort--sortable{padding:10px;margin:10px 0;border:dashed #bbb 2px;cursor:all-scroll}.entity-sort--hidden{opacity:0.4}.entity-sort-control{display:flex;justify-content:flex-end}.entity-sort-control__button{margin-top:5px;margin-left:12px;padding:0 2px;cursor:pointer;color:#bbb}.entity-sort-control__button:hover{color:#00a1cc}.entity-sort-control__button:hover>.icon-save svg,.entity-sort-control__button:hover>.icon-edit svg{fill:#00a1cc}.entity-sort-control__button--float-right{position:absolute;top:4px;right:10px}.related-user-list .related-user-list__title{margin-bottom:20px}.related-user-list .related-user-list__user{display:flex;justify-content:flex-start;margin-bottom:20px}.related-user-list .related-user-list__user-info{margin-left:15px;overflow:auto}.related-user-list .related-user-list__user-avatar{max-height:72px;min-width:72px}.review-head .review-head__title{display:inline-block;font-weight:bold}.review-head .review-head__body{margin-bottom:10px}.review-head .review-head__body::after{content:' ';clear:both;display:table}.review-head .review-head__info{float:left}.review-head .review-head__owner-link{color:#ccc}.review-head .review-head__owner-link:hover{color:#00a1cc}.review-head .review-head__time{color:#ccc}.review-head .review-head__rating-star{position:relative;top:3px;left:-1px}.review-head .review-head__actions{float:right}.review-head .review-head__action-link:not(:first-child){margin-left:5px}.tag-collection{margin-left:-9px}.tag-collection .tag-collection__tag{position:relative;display:block;float:left;color:white;background:#ccc;padding:5px;border-radius:.3rem;line-height:1.2em;font-size:80%;margin:3px}.tag-collection .tag-collection__tag a{color:white}.tag-collection .tag-collection__tag a:hover{color:#00a1cc}.track-carousel{position:relative;margin-top:5px}.track-carousel__content{overflow:auto;scroll-behavior:smooth;scrollbar-width:none;display:flex;margin:auto;box-sizing:border-box;padding-bottom:10px}.track-carousel__content::-webkit-scrollbar{height:3px;width:1px;background-color:#e5e5e5}.track-carousel__content::-webkit-scrollbar-thumb{background-color:#bbb}.track-carousel__track{text-align:center;overflow:hidden;text-overflow:ellipsis;min-width:18%;max-width:18%;margin-right:2.5%}.track-carousel__track img{object-fit:contain}.track-carousel__track-title{white-space:nowrap}.track-carousel__button{display:flex;justify-content:center;align-content:center;background:white;border:none;padding:8px;border-radius:50%;outline:0;cursor:pointer;position:absolute;top:50%}.track-carousel__button--prev{left:0;transform:translate(50%, -50%)}.track-carousel__button--next{right:0;transform:translate(-50%, -50%)}@media (max-width: 575.98px){.entity-list .entity-list__entity{flex-direction:column;margin-bottom:30px}.entity-list .entity-list__entity-text{margin-left:0}.entity-list .entity-list__entity-img-wrapper{margin-bottom:8px}.entity-list .entity-list__entity-info{max-width:unset}.entity-list .entity-list__rating--empty+.entity-list__entity-info{max-width:70%}.entity-list .entity-list__entity-brief{-webkit-line-clamp:5}.entity-detail{flex-direction:column}.entity-detail .entity-detail__title{margin-bottom:5px}.entity-detail .entity-detail__info{margin-left:0;float:none;display:flex;flex-direction:column;width:100%}.entity-detail .entity-detail__img{margin-bottom:24px;float:none;height:unset;max-width:170px}.entity-detail .entity-detail__fields{width:unset;margin-left:unset}.entity-detail .entity-detail__fields+.tag-collection{margin-left:-3px}.dividing-line{margin-top:24px}.entity-sort .entity-sort__entity{flex-basis:50%}.entity-sort .entity-sort__entity-img{height:130px}.review-head .review-head__info{float:unset}.review-head .review-head__actions{float:unset}.track-carousel__content{padding-bottom:10px}.track-carousel__track{min-width:31%;max-width:31%;margin-right:4.5%}}@media (max-width: 991.98px){.main-section-wrapper{padding:32px 28px 28px 28px}.entity-detail{display:flex}}.aside-section-wrapper{display:flex;flex:1;flex-direction:column;width:100%;padding:28px 25px 12px 25px;background-color:#f7f7f7;margin-bottom:30px;overflow:auto}.aside-section-wrapper--transparent{background-color:unset}.aside-section-wrapper--collapse{padding:unset}.add-entity-entries .add-entity-entries__entry{margin-bottom:10px}.add-entity-entries .add-entity-entries__label{font-size:1.2em;margin-bottom:8px}.add-entity-entries .add-entity-entries__button{line-height:unset;height:unset;padding:4px 15px;margin:5px}.action-panel{margin-bottom:20px}.action-panel .action-panel__label{font-weight:bold;margin-bottom:12px}.action-panel .action-panel__button-group{display:flex;justify-content:space-between}.action-panel .action-panel__button-group--center{justify-content:center}.action-panel .action-panel__button{line-height:unset;height:unset;padding:4px 15px;margin:0 5px}.mark-panel{margin-bottom:20px}.mark-panel .mark-panel__status{font-weight:bold}.mark-panel .mark-panel__rating-star{position:relative;top:2px}.mark-panel .mark-panel__actions{float:right}.mark-panel .mark-panel__actions form{display:inline}.mark-panel .mark-panel__time{color:#ccc;margin-bottom:10px}.mark-panel .mark-panel__clear{content:' ';clear:both;display:table}.review-panel .review-panel__label{font-weight:bold}.review-panel .review-panel__actions{float:right}.review-panel .review-panel__time{color:#ccc;margin-bottom:10px}.review-panel .review-panel__review-title{display:block;margin-bottom:15px;font-weight:bold}.review-panel .review-panel__clear{content:' ';clear:both;display:table}.user-profile .user-profile__header{display:flex;align-items:flex-start;margin-bottom:15px}.user-profile .user-profile__avatar{width:72px}.user-profile .user-profile__username{font-size:large;margin-left:10px;margin-bottom:0}.user-profile .user-profile__report-link{color:#ccc}.user-relation .user-relation__label{display:inline-block;font-size:large;margin-bottom:10px}.user-relation .user-relation__more-link{margin-left:5px}.user-relation .user-relation__related-user-list{display:flex;justify-content:flex-start}.user-relation .user-relation__related-user-list:last-of-type{margin-bottom:0}.user-relation .user-relation__related-user{flex-basis:25%;padding:0px 3px;text-align:center;display:inline-block;overflow:hidden}.user-relation .user-relation__related-user>a:hover{color:#606c76}.user-relation .user-relation__related-user-avatar{background-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");width:48px;height:48px}@media (min-width: 575.98px) and (max-width: 991.98px){.user-relation .user-relation__related-user-avatar{height:unset;width:60%;max-width:96px}}.user-relation .user-relation__related-user-name{color:inherit;overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical;-webkit-line-clamp:2}.report-panel .report-panel__label{display:inline-block;margin-bottom:10px}.report-panel .report-panel__body{padding-left:0}.report-panel .report-panel__report{margin:2px 0}.report-panel .report-panel__user-link{margin:0 2px}.report-panel .report-panel__all-link{margin-left:5px}.import-panel{overflow-x:hidden}.import-panel .import-panel__label{display:inline-block;margin-bottom:10px}.import-panel .import-panel__body{padding-left:0;border:2px dashed #00a1cc;padding:6px 9px}.import-panel .import-panel__body form{margin:0}@media (max-width: 991.98px){.import-panel .import-panel__body{border:unset;padding-left:0}}.import-panel .import-panel__help{background-color:#e5e5e5;border-radius:100000px;display:inline-block;width:16px;height:16px;text-align:center;font-size:12px;cursor:help}.import-panel .import-panel__checkbox{display:inline-block;margin-right:10px}.import-panel .import-panel__checkbox label{display:inline}.import-panel .import-panel__checkbox input[type="checkbox"]{margin:0;position:relative;top:2px}.import-panel .import-panel__checkbox--last{margin-right:0}.import-panel .import-panel__file-input{margin-top:10px}.import-panel .import-panel__button{line-height:unset;height:unset;padding:4px 15px}.import-panel .import-panel__progress{padding-top:10px}.import-panel .import-panel__progress:not(:first-child){border-top:#bbb 1px dashed}.import-panel .import-panel__progress label{display:inline}.import-panel .import-panel__progress progress{background-color:#d5d5d5;border-radius:0;height:10px;width:54%}.import-panel .import-panel__progress progress::-webkit-progress-bar{background-color:#d5d5d5}.import-panel .import-panel__progress progress::-webkit-progress-value{background-color:#00a1cc}.import-panel .import-panel__progress progress::-moz-progress-bar{background-color:#d5d5d5}.import-panel .import-panel__last-task:not(:first-child){padding-top:4px;border-top:#bbb 1px dashed}.import-panel .import-panel__last-task .index:not(:last-of-type){margin-right:8px}.import-panel .import-panel__fail-urls{margin-top:10px}.import-panel .import-panel__fail-urls li{word-break:break-all}.import-panel .import-panel__fail-urls ul{max-height:100px;overflow-y:auto}.relation-dropdown .relation-dropdown__button{display:none}.entity-card{display:flex;margin-bottom:10px;flex-direction:column}.entity-card--horizontal{flex-direction:row}.entity-card .entity-card__img{height:150px}.entity-card .entity-card__rating-star{position:relative;top:4px;left:-3px}.entity-card .entity-card__rating-score{position:relative;top:1px;margin-left:2px}.entity-card .entity-card__title{margin-bottom:10px;margin-top:5px}.entity-card .entity-card__info-wrapper--horizontal{margin-left:20px}.entity-card .entity-card__img-wrapper{flex-basis:100px}@media (max-width: 575.98px){.add-entity-entries{display:block !important}.add-entity-entries .add-entity-entries__button{width:100%;margin:5px 0 5px 0}.aside-section-wrapper:first-child{margin-right:0 !important;margin-bottom:0 !important}.aside-section-wrapper--singular:first-child{margin-bottom:20px !important}.action-panel{flex-direction:column !important}.entity-card--horizontal{flex-direction:column !important}.entity-card .entity-card__info-wrapper{margin-left:10px !important}.entity-card .entity-card__info-wrapper--horizontal{margin-left:0 !important}}@media (max-width: 991.98px){.add-entity-entries{display:flex;justify-content:space-around}.aside-section-wrapper{padding:24px 25px 10px 25px;margin-top:20px}.aside-section-wrapper:not(:last-child){margin-right:20px}.aside-section-wrapper--collapse{padding:24px 25px 10px 25px !important;margin-top:0;margin-bottom:0}.aside-section-wrapper--collapse:first-child{margin-right:0}.aside-section-wrapper--no-margin{margin:0}.action-panel{flex-direction:row}.action-panel .action-panel__button-group{justify-content:space-evenly}.relation-dropdown{margin-bottom:20px}.relation-dropdown .relation-dropdown__button{padding-bottom:10px;background-color:#f7f7f7;width:100%;display:flex;justify-content:center;align-items:center;cursor:pointer;transition:transform 0.3s}.relation-dropdown .relation-dropdown__button:focus{background-color:red}.relation-dropdown .relation-dropdown__button>.icon-arrow{transition:transform 0.3s}.relation-dropdown .relation-dropdown__button:hover>.icon-arrow>svg{fill:#00a1cc}.relation-dropdown .relation-dropdown__button>.icon-arrow--expand{transform:rotate(-180deg)}.relation-dropdown .relation-dropdown__button+.relation-dropdown__body--expand{max-height:2000px;transition:max-height 1s ease-in}.relation-dropdown .relation-dropdown__body{background-color:#f7f7f7;max-height:0;transition:max-height 1s ease-out;overflow:hidden}.entity-card{flex-direction:row}.entity-card .entity-card__info-wrapper{margin-left:30px}}.single-section-wrapper{padding:32px 36px;background-color:#f7f7f7;overflow:auto}.single-section-wrapper .single-section-wrapper__link--secondary{display:inline-block;color:#ccc;margin-bottom:20px}.single-section-wrapper .single-section-wrapper__link--secondary:hover{color:#00a1cc}.entity-form,.review-form{overflow:auto}.entity-form>input[type='email'],.entity-form>input[type='number'],.entity-form>input[type='password'],.entity-form>input[type='search'],.entity-form>input[type='tel'],.entity-form>input[type='text'],.entity-form>input[type='url'],.entity-form textarea,.review-form>input[type='email'],.review-form>input[type='number'],.review-form>input[type='password'],.review-form>input[type='search'],.review-form>input[type='tel'],.review-form>input[type='text'],.review-form>input[type='url'],.review-form textarea{width:100%}.entity-form img,.review-form img{display:block}.review-form .review-form__preview-button{color:#00a1cc;font-weight:bold;cursor:pointer}.review-form .review-form__fyi{color:#ccc}.review-form .review-form__main-content,.review-form textarea{margin-bottom:5px;resize:vertical;height:400px}.review-form .review-form__option{margin-top:24px;margin-bottom:10px}.review-form .review-form__option::after{content:' ';clear:both;display:table}.review-form .review-form__visibility-radio{float:left}.review-form .review-form__visibility-radio ul,.review-form .review-form__visibility-radio li,.review-form .review-form__visibility-radio label{display:inline}.review-form .review-form__visibility-radio label{font-size:normal}.review-form .review-form__visibility-radio input[type="radio"]{position:relative;top:2px}.review-form .review-form__share-checkbox{float:right}.review-form .review-form__share-checkbox input[type="checkbox"]{position:relative;top:2px}.report-form input,.report-form select{width:100%}@media (max-width: 575.98px){.review-form .review-form__visibility-radio{float:unset}.review-form .review-form__share-checkbox{float:unset;position:relative;left:-3px}}.markdownx-preview{min-height:100px}.markdownx-preview ul li{list-style:circle inside}.markdownx-preview h1{font-size:2.5em}.markdownx-preview h2{font-size:2.0em}.markdownx-preview blockquote{border-left:lightgray solid 0.4em;padding-left:0.4em}.rating-star .jq-star{cursor:unset !important}.ms-parent>.ms-choice{margin-bottom:1.5rem;appearance:none;background-color:transparent;border:0.1rem solid #ccc;border-radius:.4rem;box-shadow:none;box-sizing:inherit;padding:.6rem 1.0rem;width:100%;height:30.126px}.ms-parent>.ms-choice:focus{border-color:#00a1cc}.ms-parent>.ms-choice>.icon-caret{top:15.5px}.ms-parent>.ms-choice>span{color:black;font-weight:initial;font-size:13.3333px;top:2.5px;left:2px}.ms-parent>.ms-choice>span:hover,.ms-parent>.ms-choice>span:focus{color:black}.ms-parent>.ms-drop>ul>li>label>span{margin-left:10px}.ms-parent>.ms-drop>ul>li>label>input{width:unset}.tippy-box{border:#606c76 1px solid;background-color:#f7f7f7;padding:3px 5px}.tag-input input{flex-grow:1}.tools-section-wrapper input,.tools-section-wrapper select{width:unset}
+@import url(https://cdn.jsdelivr.net/npm/skeleton-css@2.0.4/css/normalize.css);.button,button,input[type='button'],input[type='reset'],input[type='submit']{background-color:#00a1cc;border:0.1rem solid #00a1cc;border-radius:.4rem;color:#fff;cursor:pointer;display:inline-block;font-size:1.1rem;font-weight:700;height:3.4rem;letter-spacing:.1rem;line-height:3.4rem;padding:0 2.8rem;text-align:center;text-decoration:none;text-transform:uppercase;white-space:nowrap}.button:focus,.button:hover,button:focus,button:hover,input[type='button']:focus,input[type='button']:hover,input[type='reset']:focus,input[type='reset']:hover,input[type='submit']:focus,input[type='submit']:hover{background-color:#606c76;border-color:#606c76;color:#fff;outline:0}.button[disabled],button[disabled],input[type='button'][disabled],input[type='reset'][disabled],input[type='submit'][disabled]{cursor:default;opacity:.5}.button[disabled]:focus,.button[disabled]:hover,button[disabled]:focus,button[disabled]:hover,input[type='button'][disabled]:focus,input[type='button'][disabled]:hover,input[type='reset'][disabled]:focus,input[type='reset'][disabled]:hover,input[type='submit'][disabled]:focus,input[type='submit'][disabled]:hover{background-color:#00a1cc;border-color:#00a1cc}.button.button-outline,button.button-outline,input[type='button'].button-outline,input[type='reset'].button-outline,input[type='submit'].button-outline{background-color:transparent;color:#00a1cc}.button.button-outline:focus,.button.button-outline:hover,button.button-outline:focus,button.button-outline:hover,input[type='button'].button-outline:focus,input[type='button'].button-outline:hover,input[type='reset'].button-outline:focus,input[type='reset'].button-outline:hover,input[type='submit'].button-outline:focus,input[type='submit'].button-outline:hover{background-color:transparent;border-color:#606c76;color:#606c76}.button.button-outline[disabled]:focus,.button.button-outline[disabled]:hover,button.button-outline[disabled]:focus,button.button-outline[disabled]:hover,input[type='button'].button-outline[disabled]:focus,input[type='button'].button-outline[disabled]:hover,input[type='reset'].button-outline[disabled]:focus,input[type='reset'].button-outline[disabled]:hover,input[type='submit'].button-outline[disabled]:focus,input[type='submit'].button-outline[disabled]:hover{border-color:inherit;color:#00a1cc}.button.button-clear,button.button-clear,input[type='button'].button-clear,input[type='reset'].button-clear,input[type='submit'].button-clear{background-color:transparent;border-color:transparent;color:#00a1cc}.button.button-clear:focus,.button.button-clear:hover,button.button-clear:focus,button.button-clear:hover,input[type='button'].button-clear:focus,input[type='button'].button-clear:hover,input[type='reset'].button-clear:focus,input[type='reset'].button-clear:hover,input[type='submit'].button-clear:focus,input[type='submit'].button-clear:hover{background-color:transparent;border-color:transparent;color:#606c76}.button.button-clear[disabled]:focus,.button.button-clear[disabled]:hover,button.button-clear[disabled]:focus,button.button-clear[disabled]:hover,input[type='button'].button-clear[disabled]:focus,input[type='button'].button-clear[disabled]:hover,input[type='reset'].button-clear[disabled]:focus,input[type='reset'].button-clear[disabled]:hover,input[type='submit'].button-clear[disabled]:focus,input[type='submit'].button-clear[disabled]:hover{color:#00a1cc}select{background:url('data:image/svg+xml;utf8, ') center right no-repeat;padding-right:3.0rem}select:focus{background-image:url('data:image/svg+xml;utf8, ')}textarea{min-height:6.5rem;width:100%}select{width:100%}label,legend{display:block;margin-bottom:.5rem}fieldset{border-width:0;padding:0}input[type='checkbox'],input[type='radio']{display:inline}.label-inline{display:inline-block;font-weight:normal;margin-left:.5rem}dl,ol,ul{list-style:none;margin-top:0;padding-left:0}ol{list-style:decimal inside}ul{list-style:circle inside}.button,button,dd,dt,li{margin-bottom:1.0rem}fieldset,input,select,textarea{margin-bottom:1.5rem}blockquote,dl,figure,form,ol,p,pre,table,ul{margin-bottom:1rem}b,strong{font-weight:bold}p{margin-top:0}h1,h2,h3,h4,h5,h6{font-weight:300;letter-spacing:-.1rem;margin-bottom:2.0rem;margin-top:0}h1{font-size:4.6rem;line-height:1.2}h2{font-size:3.6rem;line-height:1.25}h3{font-size:2.8rem;line-height:1.3}h4{font-size:2.2rem;letter-spacing:-.08rem;line-height:1.35}h5{font-size:1.8rem;letter-spacing:-.05rem;line-height:1.5}h6{font-size:1.6rem;letter-spacing:0;line-height:1.4}img{max-width:100%;object-fit:contain}img.emoji{height:14px;box-sizing:border-box;object-fit:contain;position:relative;top:3px}img.emoji--large{height:20px;position:relative;top:2px}.clearfix:after{clear:both;content:' ';display:table}.float-left{float:left}.float-right{float:right}.highlight{font-weight:bold}:root{font-size:10px}*,*:after,*:before{box-sizing:inherit}html{box-sizing:border-box;height:100%}body{color:#606c76;font-family:'Roboto', 'Helvetica Neue', 'Helvetica', 'Arial', 'Microsoft YaHei Light', sans-serif;font-size:1.3rem;font-weight:300;letter-spacing:.05rem;line-height:1.6;margin:0;height:100%}textarea{font-family:'Roboto', 'Helvetica Neue', 'Helvetica', 'Arial', 'Microsoft YaHei Light', sans-serif}a{color:#00a1cc;text-decoration:none}a:active,a:hover,a:hover:visited{color:#606c76}li{list-style:none}input[type=text]::-ms-clear,input[type=text]::-ms-reveal{display:none;width:0;height:0}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-results-button,input[type="search"]::-webkit-search-results-decoration{display:none}input[type='email'],input[type='number'],input[type='password'],input[type='search'],input[type='tel'],input[type='text'],input[type='url'],input[type='date'],input[type='time'],input[type='color'],textarea,select{appearance:none;background-color:transparent;border:0.1rem solid #ccc;border-radius:.4rem;box-shadow:none;box-sizing:inherit;padding:.6rem 1.0rem}input[type='email']:focus,input[type='number']:focus,input[type='password']:focus,input[type='search']:focus,input[type='tel']:focus,input[type='text']:focus,input[type='url']:focus,input[type='date']:focus,input[type='time']:focus,input[type='color']:focus,textarea:focus,select:focus{border-color:#00a1cc;outline:0}input[type='email']::placeholder,input[type='number']::placeholder,input[type='password']::placeholder,input[type='search']::placeholder,input[type='tel']::placeholder,input[type='text']::placeholder,input[type='url']::placeholder,input[type='date']::placeholder,input[type='time']::placeholder,input[type='color']::placeholder,textarea::placeholder,select::placeholder{color:#ccc}::selection{color:white;background-color:#00a1cc}.navbar{background-color:#f7f7f7;box-sizing:border-box;padding:10px 0;margin-bottom:50px;border-bottom:#ccc 0.5px solid}.navbar .navbar__wrapper{display:flex;justify-content:space-between;align-items:center;position:relative}.navbar .navbar__logo{flex-basis:100px}.navbar .navbar__logo-link{display:inline-block}.navbar .navbar__link-list{margin:0;display:flex;justify-content:space-around}.navbar .navbar__link{margin:9px;color:#606c76}.navbar .navbar__link:active,.navbar .navbar__link:hover,.navbar .navbar__link:hover:visited{color:#00a1cc}.navbar .navbar__link:visited{color:#606c76}.navbar .current{color:#00a1cc;font-weight:bold}.navbar .navbar__search-box{margin:0 12% 0 15px;display:inline-flex;flex:1}.navbar .navbar__search-box>input[type="search"]{border-top-right-radius:0;border-bottom-right-radius:0;margin:0;height:32px;background-color:white !important;width:100%}.navbar .navbar__search-box .navbar__search-dropdown{margin:0;margin-left:-1px;padding:0;padding-left:10px;color:#606c76;appearance:auto;background-color:white;height:32px;width:80px;border-top-left-radius:0;border-bottom-left-radius:0}.navbar .navbar__dropdown-btn{display:none;padding:0;margin:0;border:none;background-color:transparent;color:#00a1cc}.navbar .navbar__dropdown-btn:focus,.navbar .navbar__dropdown-btn:hover{background-color:transparent;color:#606c76}@media (max-width: 575.98px){.navbar{padding:2px 0}.navbar .navbar__wrapper{display:block}.navbar .navbar__logo-img{width:72px;margin-right:10px;position:relative;top:7px}.navbar .navbar__link-list{margin-top:7px;max-height:0;transition:max-height 0.6s ease-out;overflow:hidden}.navbar .navbar__dropdown-btn{display:block;position:absolute;right:5px;top:3px;transform:scale(0.7)}.navbar .navbar__dropdown-btn:hover+.navbar__link-list{max-height:500px;transition:max-height 0.6s ease-in}.navbar .navbar__search-box{margin:0;width:46vw}.navbar .navbar__search-box>input[type="search"]{height:26px;padding:4px 6px;width:32vw}.navbar .navbar__search-box .navbar__search-dropdown{cursor:pointer;height:26px;width:80px;padding-left:5px}}@media (max-width: 991.98px){.navbar{margin-bottom:20px}}.grid{margin:0 auto;position:relative;max-width:110rem;padding:0 2.0rem;width:100%}.grid .grid__main{width:70%;float:left;position:relative}.grid .grid__aside{width:26%;float:right;position:relative;display:flex;flex-direction:column;justify-content:space-around}.grid::after{content:' ';clear:both;display:table}@media (max-width: 575.98px){.grid .grid__aside{flex-direction:column !important}}@media (max-width: 991.98px){.grid .grid__main{width:100%;float:none}.grid .grid__aside{width:100%;float:none;flex-direction:row}.grid .grid__aside--tablet-column{flex-direction:column}.grid--reverse-order{transform:scaleY(-1)}.grid .grid__main--reverse-order{transform:scaleY(-1)}.grid .grid__aside--reverse-order{transform:scaleY(-1)}}.pagination{text-align:center;width:100%}.pagination .pagination__page-link{font-weight:normal;margin:0 5px}.pagination .pagination__page-link--current{font-weight:bold;font-size:1.2em;color:#606c76}.pagination .pagination__nav-link{font-size:1.4em;margin:0 2px}.pagination .pagination__nav-link--right-margin{margin-right:18px}.pagination .pagination__nav-link--left-margin{margin-left:18px}.pagination .pagination__nav-link--hidden{display:none}@media (max-width: 575.98px){.pagination .pagination__page-link{margin:0 3px}.pagination .pagination__nav-link{font-size:1.4em;margin:0 2px}.pagination .pagination__nav-link--right-margin{margin-right:10px}.pagination .pagination__nav-link--left-margin{margin-left:10px}}#page-wrapper{position:relative;min-height:100vh;z-index:0}#content-wrapper{padding-bottom:160px}.footer{padding-top:0.4em !important;text-align:center;margin-bottom:4px !important;position:absolute !important;left:50%;transform:translateX(-50%);bottom:0;width:100%}.footer__border{padding-top:4px;border-top:#f7f7f7 solid 2px}.footer__link{margin:0 12px;white-space:nowrap}@media (max-width: 575.98px){#content-wrapper{padding-bottom:120px}}.icon-lock svg{fill:#ccc;height:12px;position:relative;top:1px;margin-left:3px}.icon-edit svg{fill:#ccc;height:12px;position:relative;top:2px}.icon-save svg{fill:#ccc;height:12px;position:relative;top:2px}.icon-cross svg{fill:#ccc;height:10px;position:relative}.icon-arrow svg{fill:#606c76;height:15px;position:relative;top:3px}.spinner{display:inline-block;position:relative;left:50%;transform:translateX(-50%) scale(0.4);width:80px;height:80px}.spinner div{transform-origin:40px 40px;animation:spinner 1.2s linear infinite}.spinner div::after{content:" ";display:block;position:absolute;top:3px;left:37px;width:6px;height:18px;border-radius:20%;background:#606c76}.spinner div:nth-child(1){transform:rotate(0deg);animation-delay:-1.1s}.spinner div:nth-child(2){transform:rotate(30deg);animation-delay:-1s}.spinner div:nth-child(3){transform:rotate(60deg);animation-delay:-.9s}.spinner div:nth-child(4){transform:rotate(90deg);animation-delay:-.8s}.spinner div:nth-child(5){transform:rotate(120deg);animation-delay:-.7s}.spinner div:nth-child(6){transform:rotate(150deg);animation-delay:-.6s}.spinner div:nth-child(7){transform:rotate(180deg);animation-delay:-.5s}.spinner div:nth-child(8){transform:rotate(210deg);animation-delay:-.4s}.spinner div:nth-child(9){transform:rotate(240deg);animation-delay:-.3s}.spinner div:nth-child(10){transform:rotate(270deg);animation-delay:-.2s}.spinner div:nth-child(11){transform:rotate(300deg);animation-delay:-.1s}.spinner div:nth-child(12){transform:rotate(330deg);animation-delay:0s}@keyframes spinner{0%{opacity:1}100%{opacity:0}}.bg-mask{background-color:black;z-index:1;filter:opacity(20%);position:fixed;width:100%;height:100%;left:0;top:0;display:none}.mark-modal{z-index:2;display:none;position:fixed;width:500px;top:50%;left:50%;transform:translate(-50%, -50%);background-color:#f7f7f7;padding:20px 20px 10px 20px;color:#606c76}.mark-modal .mark-modal__head{margin-bottom:20px}.mark-modal .mark-modal__head::after{content:' ';clear:both;display:table}.mark-modal .mark-modal__title{font-weight:bold;font-size:1.2em;float:left}.mark-modal .mark-modal__close-button{float:right;cursor:pointer}.mark-modal .mark-modal__confirm-button{float:right}.mark-modal input[type="radio"]{margin-right:0}.mark-modal .mark-modal__rating-star{display:inline;float:left;position:relative;left:-3px}.mark-modal .mark-modal__status-radio{float:right}.mark-modal .mark-modal__status-radio ul{margin-bottom:0}.mark-modal .mark-modal__status-radio li,.mark-modal .mark-modal__status-radio label{display:inline}.mark-modal .mark-modal__status-radio input[type="radio"]{position:relative;top:1px}.mark-modal .mark-modal__clear{content:' ';clear:both;display:table}.mark-modal .mark-modal__content-input,.mark-modal form textarea{height:200px;width:100%;margin-top:5px;margin-bottom:5px;resize:vertical}.mark-modal .mark-modal__tag{margin-bottom:20px}.mark-modal .mark-modal__option{margin-bottom:24px}.mark-modal .mark-modal__option::after{content:' ';clear:both;display:table}.mark-modal .mark-modal__visibility-radio{float:left}.mark-modal .mark-modal__visibility-radio ul,.mark-modal .mark-modal__visibility-radio li,.mark-modal .mark-modal__visibility-radio label{display:inline}.mark-modal .mark-modal__visibility-radio label{font-size:normal}.mark-modal .mark-modal__visibility-radio input[type="radio"]{position:relative;top:2px}.mark-modal .mark-modal__share-checkbox{float:right}.mark-modal .mark-modal__share-checkbox input[type="checkbox"]{position:relative;top:2px}.confirm-modal{z-index:2;display:none;position:fixed;width:500px;top:50%;left:50%;transform:translate(-50%, -50%);background-color:#f7f7f7;padding:20px 20px 10px 20px;color:#606c76}.confirm-modal .confirm-modal__head{margin-bottom:20px}.confirm-modal .confirm-modal__head::after{content:' ';clear:both;display:table}.confirm-modal .confirm-modal__title{font-weight:bold;font-size:1.2em;float:left}.confirm-modal .confirm-modal__close-button{float:right;cursor:pointer}.confirm-modal .confirm-modal__confirm-button{float:right}.announcement-modal{z-index:2;display:none;position:fixed;width:500px;top:50%;left:50%;transform:translate(-50%, -50%);background-color:#f7f7f7;padding:20px 20px 10px 20px;color:#606c76}.announcement-modal .announcement-modal__head{margin-bottom:20px}.announcement-modal .announcement-modal__head::after{content:' ';clear:both;display:table}.announcement-modal .announcement-modal__title{font-weight:bold;font-size:1.2em;float:left}.announcement-modal .announcement-modal__close-button{float:right;cursor:pointer}.announcement-modal .announcement-modal__confirm-button{float:right}.announcement-modal .announcement-modal__body{overflow-y:auto;max-height:64vh}.announcement-modal .announcement-modal__body .announcement__title{display:inline-block}.announcement-modal .announcement-modal__body .announcement__datetime{color:#ccc;margin-left:10px}.announcement-modal .announcement-modal__body .announcement__content{word-break:break-all}.add-to-list-modal{z-index:2;display:none;position:fixed;width:500px;top:50%;left:50%;transform:translate(-50%, -50%);background-color:#f7f7f7;padding:20px 20px 10px 20px;color:#606c76}.add-to-list-modal .add-to-list-modal__head{margin-bottom:20px}.add-to-list-modal .add-to-list-modal__head::after{content:' ';clear:both;display:table}.add-to-list-modal .add-to-list-modal__title{font-weight:bold;font-size:1.2em;float:left}.add-to-list-modal .add-to-list-modal__close-button{float:right;cursor:pointer}.add-to-list-modal .add-to-list-modal__confirm-button{float:right}@media (max-width: 575.98px){.mark-modal,.confirm-modal,.announcement-modal .add-to-list-modal{width:100%}}.source-label{display:inline;background:transparent;border-radius:.3rem;border-style:solid;border-width:.1rem;line-height:1.2rem;font-size:1.1rem;margin:3px;padding:1px 3px;padding-top:2px;font-weight:lighter;letter-spacing:0.1rem;word-break:keep-all;opacity:1;position:relative;top:-1px}.source-label.source-label__in-site{border-color:#00a1cc;color:#00a1cc}.source-label.source-label__douban{border:none;color:#fff;background-color:#319840}.source-label.source-label__spotify{background-color:#1ed760;color:#000;border:none;font-weight:bold}.source-label.source-label__imdb{background-color:#F5C518;color:#121212;border:none;font-weight:bold}.source-label.source-label__igdb{background-color:#323A44;color:#DFE1E2;border:none;font-weight:bold}.source-label.source-label__steam{background:linear-gradient(30deg, #1387b8, #111d2e);color:white;border:none;font-weight:600;padding-top:2px}.source-label.source-label__bangumi{background:#FCFCFC;color:#F09199;font-style:italic;font-weight:600}.source-label.source-label__goodreads{background:#F4F1EA;color:#372213;font-weight:lighter}.source-label.source-label__tmdb{background:linear-gradient(90deg, #91CCA3, #1FB4E2);color:white;border:none;font-weight:lighter;padding-top:2px}.source-label.source-label__googlebooks{color:white;background-color:#4285F4;border-color:#4285F4}.source-label.source-label__bandcamp{color:#fff;background-color:#28A0C1;display:inline-block}.source-label.source-label__bandcamp span{display:inline-block;margin:0 4px}.main-section-wrapper{padding:32px 48px 32px 36px;background-color:#f7f7f7;overflow:auto}.main-section-wrapper input,.main-section-wrapper select{width:100%}.entity-list .entity-list__title{margin-bottom:20px}.entity-list .entity-list__entity{display:flex;margin-bottom:36px}.entity-list .entity-list__entity::after{content:' ';clear:both;display:table}.entity-list .entity-list__entity-img{object-fit:contain;min-width:130px;max-width:130px}.entity-list .entity-list__entity-text{margin-left:20px;overflow:hidden;width:100%}.entity-list .entity-list__entity-text .tag-collection{margin-left:-3px}.entity-list .entity-list__entity-link{font-size:1.2em}.entity-list .entity-list__entity-title{display:block}.entity-list .entity-list__entity-category{color:#bbb;margin-left:5px;position:relative;top:-1px}.entity-list .entity-list__entity-info{max-width:73%;white-space:nowrap;overflow:hidden;display:inline-block;text-overflow:ellipsis;position:relative;top:0.52em}.entity-list .entity-list__entity-info--full-length{max-width:100%}.entity-list .entity-list__entity-brief{margin-top:8px;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:4;overflow:hidden;margin-bottom:0}.entity-list .entity-list__rating{display:inline-block;margin:0}.entity-list .entity-list__rating--empty{margin-right:5px}.entity-list .entity-list__rating-score{margin-right:5px;position:relative;top:1px}.entity-list .entity-list__rating-star{display:inline;position:relative;top:0.3em;left:-0.3em}.entity-detail .entity-detail__img{height:210px;float:left;object-fit:contain;max-width:150px;object-position:top}.entity-detail .entity-detail__img-origin{cursor:zoom-in}.entity-detail .entity-detail__info{float:left;margin-left:20px;overflow:hidden;text-overflow:ellipsis;width:70%}.entity-detail .entity-detail__title{font-weight:bold}.entity-detail .entity-detail__title--secondary{color:#bbb}.entity-detail .entity-detail__fields{display:inline-block;vertical-align:top;width:46%;margin-left:2%}.entity-detail .entity-detail__fields div,.entity-detail .entity-detail__fields span{margin:1px 0}.entity-detail .entity-detail__fields+.tag-collection{margin-top:5px;margin-left:6px}.entity-detail .entity-detail__rating{position:relative;top:-5px}.entity-detail .entity-detail__rating-star{position:relative;left:-4px;top:3px}.entity-detail .entity-detail__rating-score{font-weight:bold}.entity-detail::after{content:' ';clear:both;display:table}.entity-desc{margin-bottom:28px}.entity-desc .entity-desc__title{display:inline-block;margin-bottom:8px}.entity-desc .entity-desc__content{overflow:hidden}.entity-desc .entity-desc__content--folded{max-height:202px}.entity-desc .entity-desc__unfold-button{display:flex;color:#00a1cc;background-color:transparent;justify-content:center;text-align:center}.entity-desc .entity-desc__unfold-button--hidden{display:none}.entity-marks{margin-bottom:28px}.entity-marks .entity-marks__title{margin-bottom:8px;display:inline-block}.entity-marks .entity-marks__title>a{margin-right:5px}.entity-marks .entity-marks__title--stand-alone{margin-bottom:20px}.entity-marks .entity-marks__more-link{margin-left:5px}.entity-marks .entity-marks__mark{margin:0;padding:3px 0;border-bottom:1px dashed #e5e5e5}.entity-marks .entity-marks__mark:last-child{border:none}.entity-marks .entity-marks__mark--wider{padding:6px 0}.entity-marks .entity-marks__mark-content{margin-bottom:0}.entity-marks .entity-marks__mark-time{color:#ccc;margin-left:2px}.entity-marks .entity-marks__rating-star{position:relative;top:4px}.entity-reviews:first-child{margin-bottom:28px}.entity-reviews .entity-reviews__title{display:inline-block;margin-bottom:8px}.entity-reviews .entity-reviews__title>a{margin-right:5px}.entity-reviews .entity-reviews__title--stand-alone{margin-bottom:20px}.entity-reviews .entity-reviews__more-link{margin-left:5px}.entity-reviews .entity-reviews__review{margin:0;padding:3px 0;border-bottom:1px dashed #e5e5e5}.entity-reviews .entity-reviews__review:last-child{border:none}.entity-reviews .entity-reviews__review--wider{padding:6px 0}.entity-reviews .entity-reviews__review-time{color:#ccc;margin-left:2px}.dividing-line{height:0;width:100%;margin:40px 0 24px 0;border-top:solid 1px #ccc}.dividing-line.dividing-line--dashed{margin:0;margin-top:10px;margin-bottom:2px;border-top:1px dashed #e5e5e5}.entity-sort{position:relative;margin-bottom:30px}.entity-sort .entity-sort__label{font-size:large;display:inline-block;margin-bottom:20px}.entity-sort .entity-sort__more-link{margin-left:8px}.entity-sort .entity-sort__count{color:#bbb}.entity-sort .entity-sort__count::before{content:'('}.entity-sort .entity-sort__count::after{content:')'}.entity-sort .entity-sort__entity-list{display:flex;justify-content:flex-start;flex-wrap:wrap}.entity-sort .entity-sort__entity{padding:0 10px;flex-basis:20%;text-align:center;display:inline-block;color:#606c76}.entity-sort .entity-sort__entity:hover{color:#00a1cc}.entity-sort .entity-sort__entity>a{color:inherit}.entity-sort .entity-sort__entity-img{height:110px}.entity-sort .entity-sort__entity-name{text-overflow:ellipsis;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.entity-sort--placeholder{border:dashed #bbb 4px}.entity-sort--hover{padding:10px;border:dashed #00a1cc 2px !important;border-radius:3px}.entity-sort--sortable{padding:10px;margin:10px 0;border:dashed #bbb 2px;cursor:all-scroll}.entity-sort--hidden{opacity:0.4}.entity-sort-control{display:flex;justify-content:flex-end}.entity-sort-control__button{margin-top:5px;margin-left:12px;padding:0 2px;cursor:pointer;color:#bbb}.entity-sort-control__button:hover{color:#00a1cc}.entity-sort-control__button:hover>.icon-save svg,.entity-sort-control__button:hover>.icon-edit svg{fill:#00a1cc}.entity-sort-control__button--float-right{position:absolute;top:4px;right:10px}.related-user-list .related-user-list__title{margin-bottom:20px}.related-user-list .related-user-list__user{display:flex;justify-content:flex-start;margin-bottom:20px}.related-user-list .related-user-list__user-info{margin-left:15px;overflow:auto}.related-user-list .related-user-list__user-avatar{max-height:72px;min-width:72px}.review-head .review-head__title{display:inline-block;font-weight:bold}.review-head .review-head__body{margin-bottom:10px}.review-head .review-head__body::after{content:' ';clear:both;display:table}.review-head .review-head__info{float:left}.review-head .review-head__owner-link{color:#ccc}.review-head .review-head__owner-link:hover{color:#00a1cc}.review-head .review-head__time{color:#ccc}.review-head .review-head__rating-star{position:relative;top:3px;left:-1px}.review-head .review-head__actions{float:right}.review-head .review-head__action-link:not(:first-child){margin-left:5px}.tag-collection{margin-left:-9px}.tag-collection .tag-collection__tag{position:relative;display:block;float:left;color:white;background:#ccc;padding:5px;border-radius:.3rem;line-height:1.2em;font-size:80%;margin:3px}.tag-collection .tag-collection__tag a{color:white}.tag-collection .tag-collection__tag a:hover{color:#00a1cc}.track-carousel{position:relative;margin-top:5px}.track-carousel__content{overflow:auto;scroll-behavior:smooth;scrollbar-width:none;display:flex;margin:auto;box-sizing:border-box;padding-bottom:10px}.track-carousel__content::-webkit-scrollbar{height:3px;width:1px;background-color:#e5e5e5}.track-carousel__content::-webkit-scrollbar-thumb{background-color:#bbb}.track-carousel__track{text-align:center;overflow:hidden;text-overflow:ellipsis;min-width:18%;max-width:18%;margin-right:2.5%}.track-carousel__track img{object-fit:contain}.track-carousel__track-title{white-space:nowrap}.track-carousel__button{display:flex;justify-content:center;align-content:center;background:white;border:none;padding:8px;border-radius:50%;outline:0;cursor:pointer;position:absolute;top:50%}.track-carousel__button--prev{left:0;transform:translate(50%, -50%)}.track-carousel__button--next{right:0;transform:translate(-50%, -50%)}@media (max-width: 575.98px){.entity-list .entity-list__entity{flex-direction:column;margin-bottom:30px}.entity-list .entity-list__entity-text{margin-left:0}.entity-list .entity-list__entity-img-wrapper{margin-bottom:8px}.entity-list .entity-list__entity-info{max-width:unset}.entity-list .entity-list__rating--empty+.entity-list__entity-info{max-width:70%}.entity-list .entity-list__entity-brief{-webkit-line-clamp:5}.entity-detail{flex-direction:column}.entity-detail .entity-detail__title{margin-bottom:5px}.entity-detail .entity-detail__info{margin-left:0;float:none;display:flex;flex-direction:column;width:100%}.entity-detail .entity-detail__img{margin-bottom:24px;float:none;height:unset;max-width:170px}.entity-detail .entity-detail__fields{width:unset;margin-left:unset}.entity-detail .entity-detail__fields+.tag-collection{margin-left:-3px}.dividing-line{margin-top:24px}.entity-sort .entity-sort__entity{flex-basis:50%}.entity-sort .entity-sort__entity-img{height:130px}.review-head .review-head__info{float:unset}.review-head .review-head__actions{float:unset}.track-carousel__content{padding-bottom:10px}.track-carousel__track{min-width:31%;max-width:31%;margin-right:4.5%}}@media (max-width: 991.98px){.main-section-wrapper{padding:32px 28px 28px 28px}.entity-detail{display:flex}}.aside-section-wrapper{display:flex;flex:1;flex-direction:column;width:100%;padding:28px 25px 12px 25px;background-color:#f7f7f7;margin-bottom:30px;overflow:auto}.aside-section-wrapper--transparent{background-color:unset}.aside-section-wrapper--collapse{padding:unset}.add-entity-entries .add-entity-entries__entry{margin-bottom:10px}.add-entity-entries .add-entity-entries__label{font-size:1.2em;margin-bottom:8px}.add-entity-entries .add-entity-entries__button{line-height:unset;height:unset;padding:4px 15px;margin:5px}.action-panel{margin-bottom:20px}.action-panel .action-panel__label{font-weight:bold;margin-bottom:12px}.action-panel .action-panel__button-group{display:flex;justify-content:space-between}.action-panel .action-panel__button-group--center{justify-content:center}.action-panel .action-panel__button{line-height:unset;height:unset;padding:4px 15px;margin:0 5px}.mark-panel{margin-bottom:20px}.mark-panel .mark-panel__status{font-weight:bold}.mark-panel .mark-panel__rating-star{position:relative;top:2px}.mark-panel .mark-panel__actions{float:right}.mark-panel .mark-panel__actions form{display:inline}.mark-panel .mark-panel__time{color:#ccc;margin-bottom:10px}.mark-panel .mark-panel__clear{content:' ';clear:both;display:table}.review-panel .review-panel__label{font-weight:bold}.review-panel .review-panel__actions{float:right}.review-panel .review-panel__time{color:#ccc;margin-bottom:10px}.review-panel .review-panel__review-title{display:block;margin-bottom:15px;font-weight:bold}.review-panel .review-panel__clear{content:' ';clear:both;display:table}.user-profile .user-profile__header{display:flex;align-items:flex-start;margin-bottom:15px}.user-profile .user-profile__avatar{width:72px}.user-profile .user-profile__username{font-size:large;margin-left:10px;margin-bottom:0}.user-profile .user-profile__report-link{color:#ccc}.user-relation .user-relation__label{display:inline-block;font-size:large;margin-bottom:10px}.user-relation .user-relation__more-link{margin-left:5px}.user-relation .user-relation__related-user-list{display:flex;justify-content:flex-start}.user-relation .user-relation__related-user-list:last-of-type{margin-bottom:0}.user-relation .user-relation__related-user{flex-basis:25%;padding:0px 3px;text-align:center;display:inline-block;overflow:hidden}.user-relation .user-relation__related-user>a:hover{color:#606c76}.user-relation .user-relation__related-user-avatar{background-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");width:48px;height:48px}@media (min-width: 575.98px) and (max-width: 991.98px){.user-relation .user-relation__related-user-avatar{height:unset;width:60%;max-width:96px}}.user-relation .user-relation__related-user-name{color:inherit;overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical;-webkit-line-clamp:2}.report-panel .report-panel__label{display:inline-block;margin-bottom:10px}.report-panel .report-panel__body{padding-left:0}.report-panel .report-panel__report{margin:2px 0}.report-panel .report-panel__user-link{margin:0 2px}.report-panel .report-panel__all-link{margin-left:5px}.import-panel{overflow-x:hidden}.import-panel .import-panel__label{display:inline-block;margin-bottom:10px}.import-panel .import-panel__body{padding-left:0;border:2px dashed #00a1cc;padding:6px 9px}.import-panel .import-panel__body form{margin:0}@media (max-width: 991.98px){.import-panel .import-panel__body{border:unset;padding-left:0}}.import-panel .import-panel__help{background-color:#e5e5e5;border-radius:100000px;display:inline-block;width:16px;height:16px;text-align:center;font-size:12px;cursor:help}.import-panel .import-panel__checkbox{display:inline-block;margin-right:10px}.import-panel .import-panel__checkbox label{display:inline}.import-panel .import-panel__checkbox input[type="checkbox"]{margin:0;position:relative;top:2px}.import-panel .import-panel__checkbox--last{margin-right:0}.import-panel .import-panel__file-input{margin-top:10px}.import-panel .import-panel__button{line-height:unset;height:unset;padding:4px 15px}.import-panel .import-panel__progress{padding-top:10px}.import-panel .import-panel__progress:not(:first-child){border-top:#bbb 1px dashed}.import-panel .import-panel__progress label{display:inline}.import-panel .import-panel__progress progress{background-color:#d5d5d5;border-radius:0;height:10px;width:54%}.import-panel .import-panel__progress progress::-webkit-progress-bar{background-color:#d5d5d5}.import-panel .import-panel__progress progress::-webkit-progress-value{background-color:#00a1cc}.import-panel .import-panel__progress progress::-moz-progress-bar{background-color:#d5d5d5}.import-panel .import-panel__last-task:not(:first-child){padding-top:4px;border-top:#bbb 1px dashed}.import-panel .import-panel__last-task .index:not(:last-of-type){margin-right:8px}.import-panel .import-panel__fail-urls{margin-top:10px}.import-panel .import-panel__fail-urls li{word-break:break-all}.import-panel .import-panel__fail-urls ul{max-height:100px;overflow-y:auto}.relation-dropdown .relation-dropdown__button{display:none}.entity-card{display:flex;margin-bottom:10px;flex-direction:column}.entity-card--horizontal{flex-direction:row}.entity-card .entity-card__img{height:150px}.entity-card .entity-card__rating-star{position:relative;top:4px;left:-3px}.entity-card .entity-card__rating-score{position:relative;top:1px;margin-left:2px}.entity-card .entity-card__title{margin-bottom:10px;margin-top:5px}.entity-card .entity-card__info-wrapper--horizontal{margin-left:20px}.entity-card .entity-card__img-wrapper{flex-basis:100px}@media (max-width: 575.98px){.add-entity-entries{display:block !important}.add-entity-entries .add-entity-entries__button{width:100%;margin:5px 0 5px 0}.aside-section-wrapper:first-child{margin-right:0 !important;margin-bottom:0 !important}.aside-section-wrapper--singular:first-child{margin-bottom:20px !important}.action-panel{flex-direction:column !important}.entity-card--horizontal{flex-direction:column !important}.entity-card .entity-card__info-wrapper{margin-left:10px !important}.entity-card .entity-card__info-wrapper--horizontal{margin-left:0 !important}}@media (max-width: 991.98px){.add-entity-entries{display:flex;justify-content:space-around}.aside-section-wrapper{padding:24px 25px 10px 25px;margin-top:20px}.aside-section-wrapper:not(:last-child){margin-right:20px}.aside-section-wrapper--collapse{padding:24px 25px 10px 25px !important;margin-top:0;margin-bottom:0}.aside-section-wrapper--collapse:first-child{margin-right:0}.aside-section-wrapper--no-margin{margin:0}.action-panel{flex-direction:row}.action-panel .action-panel__button-group{justify-content:space-evenly}.relation-dropdown{margin-bottom:20px}.relation-dropdown .relation-dropdown__button{padding-bottom:10px;background-color:#f7f7f7;width:100%;display:flex;justify-content:center;align-items:center;cursor:pointer;transition:transform 0.3s}.relation-dropdown .relation-dropdown__button:focus{background-color:red}.relation-dropdown .relation-dropdown__button>.icon-arrow{transition:transform 0.3s}.relation-dropdown .relation-dropdown__button:hover>.icon-arrow>svg{fill:#00a1cc}.relation-dropdown .relation-dropdown__button>.icon-arrow--expand{transform:rotate(-180deg)}.relation-dropdown .relation-dropdown__button+.relation-dropdown__body--expand{max-height:2000px;transition:max-height 1s ease-in}.relation-dropdown .relation-dropdown__body{background-color:#f7f7f7;max-height:0;transition:max-height 1s ease-out;overflow:hidden}.entity-card{flex-direction:row}.entity-card .entity-card__info-wrapper{margin-left:30px}}.single-section-wrapper{padding:32px 36px;background-color:#f7f7f7;overflow:auto}.single-section-wrapper .single-section-wrapper__link--secondary{display:inline-block;color:#ccc;margin-bottom:20px}.single-section-wrapper .single-section-wrapper__link--secondary:hover{color:#00a1cc}.entity-form,.review-form{overflow:auto}.entity-form>input[type='email'],.entity-form>input[type='number'],.entity-form>input[type='password'],.entity-form>input[type='search'],.entity-form>input[type='tel'],.entity-form>input[type='text'],.entity-form>input[type='url'],.entity-form textarea,.review-form>input[type='email'],.review-form>input[type='number'],.review-form>input[type='password'],.review-form>input[type='search'],.review-form>input[type='tel'],.review-form>input[type='text'],.review-form>input[type='url'],.review-form textarea{width:100%}.entity-form img,.review-form img{display:block}.review-form .review-form__preview-button{color:#00a1cc;font-weight:bold;cursor:pointer}.review-form .review-form__fyi{color:#ccc}.review-form .review-form__main-content,.review-form textarea{margin-bottom:5px;resize:vertical;height:400px}.review-form .review-form__option{margin-top:24px;margin-bottom:10px}.review-form .review-form__option::after{content:' ';clear:both;display:table}.review-form .review-form__visibility-radio{float:left}.review-form .review-form__visibility-radio ul,.review-form .review-form__visibility-radio li,.review-form .review-form__visibility-radio label{display:inline}.review-form .review-form__visibility-radio label{font-size:normal}.review-form .review-form__visibility-radio input[type="radio"]{position:relative;top:2px}.review-form .review-form__share-checkbox{float:right}.review-form .review-form__share-checkbox input[type="checkbox"]{position:relative;top:2px}.report-form input,.report-form select{width:100%}@media (max-width: 575.98px){.review-form .review-form__visibility-radio{float:unset}.review-form .review-form__share-checkbox{float:unset;position:relative;left:-3px}}.markdownx-preview{min-height:100px}.markdownx-preview ul li{list-style:circle inside}.markdownx-preview h1{font-size:2.5em}.markdownx-preview h2{font-size:2.0em}.markdownx-preview blockquote{border-left:lightgray solid 0.4em;padding-left:0.1em;margin-left:0}.markdownx-preview code{border-left:#00a1cc solid 0.3em;padding-left:0.1em}.rating-star .jq-star{cursor:unset !important}.ms-parent>.ms-choice{margin-bottom:1.5rem;appearance:none;background-color:transparent;border:0.1rem solid #ccc;border-radius:.4rem;box-shadow:none;box-sizing:inherit;padding:.6rem 1.0rem;width:100%;height:30.126px}.ms-parent>.ms-choice:focus{border-color:#00a1cc}.ms-parent>.ms-choice>.icon-caret{top:15.5px}.ms-parent>.ms-choice>span{color:black;font-weight:initial;font-size:13.3333px;top:2.5px;left:2px}.ms-parent>.ms-choice>span:hover,.ms-parent>.ms-choice>span:focus{color:black}.ms-parent>.ms-drop>ul>li>label>span{margin-left:10px}.ms-parent>.ms-drop>ul>li>label>input{width:unset}.tippy-box{border:#606c76 1px solid;background-color:#f7f7f7;padding:3px 5px}.tag-input input{flex-grow:1}.tools-section-wrapper input,.tools-section-wrapper select{width:unset}
diff --git a/common/static/sass/_Navbar.sass b/common/static/sass/_Navbar.sass
index 2b007ffa..f03a12a6 100644
--- a/common/static/sass/_Navbar.sass
+++ b/common/static/sass/_Navbar.sass
@@ -35,6 +35,10 @@
&:visited
color: $color-secondary
+ .current
+ color: $color-primary
+ font-weight: bold
+
& &__search-box
margin: 0 12% 0 15px
display: inline-flex
diff --git a/common/templates/partial/_navbar.html b/common/templates/partial/_navbar.html
index 90d7a459..a2e9c989 100644
--- a/common/templates/partial/_navbar.html
+++ b/common/templates/partial/_navbar.html
@@ -23,13 +23,13 @@
• • •
-
+
{% if request.user.is_authenticated %}
-
- {% trans '主页' %}
- {% trans '动态' %}
- {% trans '数据' %}
- {% trans '设置' %}
+
+ {% trans '主页' %}
+ {% trans '动态' %}
+ {% trans '数据' %}
+ {% trans '设置' %}
{% trans '登出' %}
{% if request.user.is_staff %}
{% trans '后台' %}
diff --git a/requirements.txt b/requirements.txt
index 112739c1..8a5fc77f 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -8,12 +8,17 @@ django-rq
django-simple-history
django-hijack
django-user-messages
+django-slack
+#django-ninja
+#django-polymorphic
+meilisearch
easy-thumbnails
lxml
openpyxl
-psycopg2
+psycopg2-binary
requests
filetype
+setproctitle
tqdm
opencc
dnspython
diff --git a/test_data/https___api_spotify_com_v1_albums_65KwtzkJXw7oT819NFWmEP b/test_data/https___api_spotify_com_v1_albums_65KwtzkJXw7oT819NFWmEP
new file mode 100644
index 00000000..98d31c58
--- /dev/null
+++ b/test_data/https___api_spotify_com_v1_albums_65KwtzkJXw7oT819NFWmEP
@@ -0,0 +1,303 @@
+{
+ "album_type" : "album",
+ "artists" : [ {
+ "external_urls" : {
+ "spotify" : "https://open.spotify.com/artist/6VsiDFMZJlJ053P1uO4A6h"
+ },
+ "href" : "https://api.spotify.com/v1/artists/6VsiDFMZJlJ053P1uO4A6h",
+ "id" : "6VsiDFMZJlJ053P1uO4A6h",
+ "name" : "Public Service Broadcasting",
+ "type" : "artist",
+ "uri" : "spotify:artist:6VsiDFMZJlJ053P1uO4A6h"
+ } ],
+ "available_markets" : [ "AD", "AE", "AG", "AL", "AM", "AO", "AR", "AT", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BN", "BO", "BR", "BS", "BT", "BW", "BY", "BZ", "CA", "CD", "CG", "CH", "CI", "CL", "CM", "CO", "CR", "CV", "CW", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG", "ES", "FI", "FR", "GA", "GB", "GD", "GE", "GH", "GM", "GN", "GQ", "GR", "GT", "GW", "GY", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IN", "IQ", "IS", "IT", "JM", "JO", "KE", "KG", "KH", "KM", "KN", "KR", "KW", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "MG", "MK", "ML", "MN", "MO", "MR", "MT", "MU", "MV", "MW", "MX", "MZ", "NA", "NE", "NG", "NI", "NL", "NO", "NP", "NZ", "OM", "PA", "PE", "PG", "PH", "PK", "PL", "PS", "PT", "PW", "PY", "QA", "RO", "RW", "SA", "SC", "SE", "SI", "SK", "SL", "SM", "SN", "SR", "ST", "SV", "SZ", "TD", "TG", "TH", "TJ", "TL", "TN", "TR", "TT", "TZ", "UA", "UG", "US", "UY", "UZ", "VC", "VE", "VN", "ZA", "ZM", "ZW" ],
+ "copyrights" : [ {
+ "text" : "Test Card Recordings",
+ "type" : "C"
+ }, {
+ "text" : "Test Card Recordings",
+ "type" : "P"
+ } ],
+ "external_ids" : {
+ "upc" : "3610159662676"
+ },
+ "external_urls" : {
+ "spotify" : "https://open.spotify.com/album/65KwtzkJXw7oT819NFWmEP"
+ },
+ "genres" : [ ],
+ "href" : "https://api.spotify.com/v1/albums/65KwtzkJXw7oT819NFWmEP",
+ "id" : "65KwtzkJXw7oT819NFWmEP",
+ "images" : [ {
+ "height" : 640,
+ "url" : "https://i.scdn.co/image/ab67616d0000b273123ebfc7ca99a9bb6342cd36",
+ "width" : 640
+ }, {
+ "height" : 300,
+ "url" : "https://i.scdn.co/image/ab67616d00001e02123ebfc7ca99a9bb6342cd36",
+ "width" : 300
+ }, {
+ "height" : 64,
+ "url" : "https://i.scdn.co/image/ab67616d00004851123ebfc7ca99a9bb6342cd36",
+ "width" : 64
+ } ],
+ "label" : "Test Card Recordings",
+ "name" : "The Race For Space",
+ "popularity" : 44,
+ "release_date" : "2014",
+ "release_date_precision" : "year",
+ "total_tracks" : 9,
+ "tracks" : {
+ "href" : "https://api.spotify.com/v1/albums/65KwtzkJXw7oT819NFWmEP/tracks?offset=0&limit=50",
+ "items" : [ {
+ "artists" : [ {
+ "external_urls" : {
+ "spotify" : "https://open.spotify.com/artist/6VsiDFMZJlJ053P1uO4A6h"
+ },
+ "href" : "https://api.spotify.com/v1/artists/6VsiDFMZJlJ053P1uO4A6h",
+ "id" : "6VsiDFMZJlJ053P1uO4A6h",
+ "name" : "Public Service Broadcasting",
+ "type" : "artist",
+ "uri" : "spotify:artist:6VsiDFMZJlJ053P1uO4A6h"
+ } ],
+ "available_markets" : [ "AD", "AE", "AG", "AL", "AM", "AO", "AR", "AT", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BN", "BO", "BR", "BS", "BT", "BW", "BY", "BZ", "CA", "CD", "CG", "CH", "CI", "CL", "CM", "CO", "CR", "CV", "CW", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG", "ES", "ET", "FI", "FR", "GA", "GB", "GD", "GE", "GH", "GM", "GN", "GQ", "GR", "GT", "GW", "GY", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IN", "IQ", "IS", "IT", "JM", "JO", "KE", "KG", "KH", "KM", "KN", "KR", "KW", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "MG", "MK", "ML", "MN", "MO", "MR", "MT", "MU", "MV", "MW", "MX", "MZ", "NA", "NE", "NG", "NI", "NL", "NO", "NP", "NZ", "OM", "PA", "PE", "PG", "PH", "PK", "PL", "PS", "PT", "PW", "PY", "QA", "RO", "RW", "SA", "SC", "SE", "SI", "SK", "SL", "SM", "SN", "SR", "ST", "SV", "SZ", "TD", "TG", "TH", "TJ", "TL", "TN", "TR", "TT", "TZ", "UA", "UG", "US", "UY", "UZ", "VC", "VE", "VN", "ZA", "ZM", "ZW" ],
+ "disc_number" : 1,
+ "duration_ms" : 159859,
+ "explicit" : false,
+ "external_urls" : {
+ "spotify" : "https://open.spotify.com/track/3982V8R7oW3xyV8zASbCGG"
+ },
+ "href" : "https://api.spotify.com/v1/tracks/3982V8R7oW3xyV8zASbCGG",
+ "id" : "3982V8R7oW3xyV8zASbCGG",
+ "is_local" : false,
+ "name" : "The Race For Space",
+ "preview_url" : "https://p.scdn.co/mp3-preview/cc69663d5b6a7982e5f162e625f1b319b26956ec?cid=4b150d8d6d374d1e8dbb85f4f11a2ad9",
+ "track_number" : 1,
+ "type" : "track",
+ "uri" : "spotify:track:3982V8R7oW3xyV8zASbCGG"
+ }, {
+ "artists" : [ {
+ "external_urls" : {
+ "spotify" : "https://open.spotify.com/artist/6VsiDFMZJlJ053P1uO4A6h"
+ },
+ "href" : "https://api.spotify.com/v1/artists/6VsiDFMZJlJ053P1uO4A6h",
+ "id" : "6VsiDFMZJlJ053P1uO4A6h",
+ "name" : "Public Service Broadcasting",
+ "type" : "artist",
+ "uri" : "spotify:artist:6VsiDFMZJlJ053P1uO4A6h"
+ } ],
+ "available_markets" : [ "AD", "AE", "AG", "AL", "AM", "AO", "AR", "AT", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BN", "BO", "BR", "BS", "BT", "BW", "BY", "BZ", "CA", "CD", "CG", "CH", "CI", "CL", "CM", "CO", "CR", "CV", "CW", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG", "ES", "ET", "FI", "FR", "GA", "GB", "GD", "GE", "GH", "GM", "GN", "GQ", "GR", "GT", "GW", "GY", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IN", "IQ", "IS", "IT", "JM", "JO", "KE", "KG", "KH", "KM", "KN", "KR", "KW", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "MG", "MK", "ML", "MN", "MO", "MR", "MT", "MU", "MV", "MW", "MX", "MZ", "NA", "NE", "NG", "NI", "NL", "NO", "NP", "NZ", "OM", "PA", "PE", "PG", "PH", "PK", "PL", "PS", "PT", "PW", "PY", "QA", "RO", "RW", "SA", "SC", "SE", "SI", "SK", "SL", "SM", "SN", "SR", "ST", "SV", "SZ", "TD", "TG", "TH", "TJ", "TL", "TN", "TR", "TT", "TZ", "UA", "UG", "US", "UY", "UZ", "VC", "VE", "VN", "ZA", "ZM", "ZW" ],
+ "disc_number" : 1,
+ "duration_ms" : 429374,
+ "explicit" : false,
+ "external_urls" : {
+ "spotify" : "https://open.spotify.com/track/4EhQrGzqi8k24qWIJuG5CH"
+ },
+ "href" : "https://api.spotify.com/v1/tracks/4EhQrGzqi8k24qWIJuG5CH",
+ "id" : "4EhQrGzqi8k24qWIJuG5CH",
+ "is_local" : false,
+ "name" : "Sputnik",
+ "preview_url" : "https://p.scdn.co/mp3-preview/32ccf0b8f7ef1251c35e97acb405e4e7cc2660d2?cid=4b150d8d6d374d1e8dbb85f4f11a2ad9",
+ "track_number" : 2,
+ "type" : "track",
+ "uri" : "spotify:track:4EhQrGzqi8k24qWIJuG5CH"
+ }, {
+ "artists" : [ {
+ "external_urls" : {
+ "spotify" : "https://open.spotify.com/artist/6VsiDFMZJlJ053P1uO4A6h"
+ },
+ "href" : "https://api.spotify.com/v1/artists/6VsiDFMZJlJ053P1uO4A6h",
+ "id" : "6VsiDFMZJlJ053P1uO4A6h",
+ "name" : "Public Service Broadcasting",
+ "type" : "artist",
+ "uri" : "spotify:artist:6VsiDFMZJlJ053P1uO4A6h"
+ } ],
+ "available_markets" : [ "AD", "AE", "AG", "AL", "AM", "AO", "AR", "AT", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BN", "BO", "BR", "BS", "BT", "BW", "BY", "BZ", "CA", "CD", "CG", "CH", "CI", "CL", "CM", "CO", "CR", "CV", "CW", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG", "ES", "ET", "FI", "FR", "GA", "GB", "GD", "GE", "GH", "GM", "GN", "GQ", "GR", "GT", "GW", "GY", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IN", "IQ", "IS", "IT", "JM", "JO", "KE", "KG", "KH", "KM", "KN", "KR", "KW", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "MG", "MK", "ML", "MN", "MO", "MR", "MT", "MU", "MV", "MW", "MX", "MZ", "NA", "NE", "NG", "NI", "NL", "NO", "NP", "NZ", "OM", "PA", "PE", "PG", "PH", "PK", "PL", "PS", "PT", "PW", "PY", "QA", "RO", "RW", "SA", "SC", "SE", "SI", "SK", "SL", "SM", "SN", "SR", "ST", "SV", "SZ", "TD", "TG", "TH", "TJ", "TL", "TN", "TR", "TT", "TZ", "UA", "UG", "US", "UY", "UZ", "VC", "VE", "VN", "ZA", "ZM", "ZW" ],
+ "disc_number" : 1,
+ "duration_ms" : 228623,
+ "explicit" : false,
+ "external_urls" : {
+ "spotify" : "https://open.spotify.com/track/4IaRxPHdzLJ78tm7lxg9M8"
+ },
+ "href" : "https://api.spotify.com/v1/tracks/4IaRxPHdzLJ78tm7lxg9M8",
+ "id" : "4IaRxPHdzLJ78tm7lxg9M8",
+ "is_local" : false,
+ "name" : "Gagarin",
+ "preview_url" : "https://p.scdn.co/mp3-preview/1d91010dc50a73caa3831c4617f3d658ae279339?cid=4b150d8d6d374d1e8dbb85f4f11a2ad9",
+ "track_number" : 3,
+ "type" : "track",
+ "uri" : "spotify:track:4IaRxPHdzLJ78tm7lxg9M8"
+ }, {
+ "artists" : [ {
+ "external_urls" : {
+ "spotify" : "https://open.spotify.com/artist/6VsiDFMZJlJ053P1uO4A6h"
+ },
+ "href" : "https://api.spotify.com/v1/artists/6VsiDFMZJlJ053P1uO4A6h",
+ "id" : "6VsiDFMZJlJ053P1uO4A6h",
+ "name" : "Public Service Broadcasting",
+ "type" : "artist",
+ "uri" : "spotify:artist:6VsiDFMZJlJ053P1uO4A6h"
+ } ],
+ "available_markets" : [ "AD", "AE", "AG", "AL", "AM", "AO", "AR", "AT", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BN", "BO", "BR", "BS", "BT", "BW", "BY", "BZ", "CA", "CD", "CG", "CH", "CI", "CL", "CM", "CO", "CR", "CV", "CW", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG", "ES", "ET", "FI", "FR", "GA", "GB", "GD", "GE", "GH", "GM", "GN", "GQ", "GR", "GT", "GW", "GY", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IN", "IQ", "IS", "IT", "JM", "JO", "KE", "KG", "KH", "KM", "KN", "KR", "KW", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "MG", "MK", "ML", "MN", "MO", "MR", "MT", "MU", "MV", "MW", "MX", "MZ", "NA", "NE", "NG", "NI", "NL", "NO", "NP", "NZ", "OM", "PA", "PE", "PG", "PH", "PK", "PL", "PS", "PT", "PW", "PY", "QA", "RO", "RW", "SA", "SC", "SE", "SI", "SK", "SL", "SM", "SN", "SR", "ST", "SV", "SZ", "TD", "TG", "TH", "TJ", "TL", "TN", "TR", "TT", "TZ", "UA", "UG", "US", "UY", "UZ", "VC", "VE", "VN", "ZA", "ZM", "ZW" ],
+ "disc_number" : 1,
+ "duration_ms" : 181621,
+ "explicit" : false,
+ "external_urls" : {
+ "spotify" : "https://open.spotify.com/track/6SONXH9dJQgDY9vCjdkZfK"
+ },
+ "href" : "https://api.spotify.com/v1/tracks/6SONXH9dJQgDY9vCjdkZfK",
+ "id" : "6SONXH9dJQgDY9vCjdkZfK",
+ "is_local" : false,
+ "name" : "Fire in the Cockpit",
+ "preview_url" : "https://p.scdn.co/mp3-preview/a2180cec25187fa80ddc80dcbe36edda1cc169cc?cid=4b150d8d6d374d1e8dbb85f4f11a2ad9",
+ "track_number" : 4,
+ "type" : "track",
+ "uri" : "spotify:track:6SONXH9dJQgDY9vCjdkZfK"
+ }, {
+ "artists" : [ {
+ "external_urls" : {
+ "spotify" : "https://open.spotify.com/artist/6VsiDFMZJlJ053P1uO4A6h"
+ },
+ "href" : "https://api.spotify.com/v1/artists/6VsiDFMZJlJ053P1uO4A6h",
+ "id" : "6VsiDFMZJlJ053P1uO4A6h",
+ "name" : "Public Service Broadcasting",
+ "type" : "artist",
+ "uri" : "spotify:artist:6VsiDFMZJlJ053P1uO4A6h"
+ } ],
+ "available_markets" : [ "AD", "AE", "AG", "AL", "AM", "AO", "AR", "AT", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BN", "BO", "BR", "BS", "BT", "BW", "BY", "BZ", "CA", "CD", "CG", "CH", "CI", "CL", "CM", "CO", "CR", "CV", "CW", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG", "ES", "ET", "FI", "FR", "GA", "GB", "GD", "GE", "GH", "GM", "GN", "GQ", "GR", "GT", "GW", "GY", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IN", "IQ", "IS", "IT", "JM", "JO", "KE", "KG", "KH", "KM", "KN", "KR", "KW", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "MG", "MK", "ML", "MN", "MO", "MR", "MT", "MU", "MV", "MW", "MX", "MZ", "NA", "NE", "NG", "NI", "NL", "NO", "NP", "NZ", "OM", "PA", "PE", "PG", "PH", "PK", "PL", "PS", "PT", "PW", "PY", "QA", "RO", "RW", "SA", "SC", "SE", "SI", "SK", "SL", "SM", "SN", "SR", "ST", "SV", "SZ", "TD", "TG", "TH", "TJ", "TL", "TN", "TR", "TT", "TZ", "UA", "UG", "US", "UY", "UZ", "VC", "VE", "VN", "ZA", "ZM", "ZW" ],
+ "disc_number" : 1,
+ "duration_ms" : 255606,
+ "explicit" : false,
+ "external_urls" : {
+ "spotify" : "https://open.spotify.com/track/52KMWPHDL84oo2Ncj3O6RX"
+ },
+ "href" : "https://api.spotify.com/v1/tracks/52KMWPHDL84oo2Ncj3O6RX",
+ "id" : "52KMWPHDL84oo2Ncj3O6RX",
+ "is_local" : false,
+ "name" : "E.V.A.",
+ "preview_url" : "https://p.scdn.co/mp3-preview/732171a4a5e27540b6709602b4af9662fda98595?cid=4b150d8d6d374d1e8dbb85f4f11a2ad9",
+ "track_number" : 5,
+ "type" : "track",
+ "uri" : "spotify:track:52KMWPHDL84oo2Ncj3O6RX"
+ }, {
+ "artists" : [ {
+ "external_urls" : {
+ "spotify" : "https://open.spotify.com/artist/6VsiDFMZJlJ053P1uO4A6h"
+ },
+ "href" : "https://api.spotify.com/v1/artists/6VsiDFMZJlJ053P1uO4A6h",
+ "id" : "6VsiDFMZJlJ053P1uO4A6h",
+ "name" : "Public Service Broadcasting",
+ "type" : "artist",
+ "uri" : "spotify:artist:6VsiDFMZJlJ053P1uO4A6h"
+ } ],
+ "available_markets" : [ "AD", "AE", "AG", "AL", "AM", "AO", "AR", "AT", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BN", "BO", "BR", "BS", "BT", "BW", "BY", "BZ", "CA", "CD", "CG", "CH", "CI", "CL", "CM", "CO", "CR", "CV", "CW", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG", "ES", "ET", "FI", "FR", "GA", "GB", "GD", "GE", "GH", "GM", "GN", "GQ", "GR", "GT", "GW", "GY", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IN", "IQ", "IS", "IT", "JM", "JO", "KE", "KG", "KH", "KM", "KN", "KR", "KW", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "MG", "MK", "ML", "MN", "MO", "MR", "MT", "MU", "MV", "MW", "MX", "MZ", "NA", "NE", "NG", "NI", "NL", "NO", "NP", "NZ", "OM", "PA", "PE", "PG", "PH", "PK", "PL", "PS", "PT", "PW", "PY", "QA", "RO", "RW", "SA", "SC", "SE", "SI", "SK", "SL", "SM", "SN", "SR", "ST", "SV", "SZ", "TD", "TG", "TH", "TJ", "TL", "TN", "TR", "TT", "TZ", "UA", "UG", "US", "UY", "UZ", "VC", "VE", "VN", "ZA", "ZM", "ZW" ],
+ "disc_number" : 1,
+ "duration_ms" : 379931,
+ "explicit" : false,
+ "external_urls" : {
+ "spotify" : "https://open.spotify.com/track/3jjMyq44OIjNgmpXLhpw7W"
+ },
+ "href" : "https://api.spotify.com/v1/tracks/3jjMyq44OIjNgmpXLhpw7W",
+ "id" : "3jjMyq44OIjNgmpXLhpw7W",
+ "is_local" : false,
+ "name" : "The Other Side",
+ "preview_url" : "https://p.scdn.co/mp3-preview/5eda4958044595b36842f2362799d91f080a7357?cid=4b150d8d6d374d1e8dbb85f4f11a2ad9",
+ "track_number" : 6,
+ "type" : "track",
+ "uri" : "spotify:track:3jjMyq44OIjNgmpXLhpw7W"
+ }, {
+ "artists" : [ {
+ "external_urls" : {
+ "spotify" : "https://open.spotify.com/artist/6VsiDFMZJlJ053P1uO4A6h"
+ },
+ "href" : "https://api.spotify.com/v1/artists/6VsiDFMZJlJ053P1uO4A6h",
+ "id" : "6VsiDFMZJlJ053P1uO4A6h",
+ "name" : "Public Service Broadcasting",
+ "type" : "artist",
+ "uri" : "spotify:artist:6VsiDFMZJlJ053P1uO4A6h"
+ }, {
+ "external_urls" : {
+ "spotify" : "https://open.spotify.com/artist/7wbZFLV3wwTqyrKNCJ8Y8D"
+ },
+ "href" : "https://api.spotify.com/v1/artists/7wbZFLV3wwTqyrKNCJ8Y8D",
+ "id" : "7wbZFLV3wwTqyrKNCJ8Y8D",
+ "name" : "Smoke Fairies",
+ "type" : "artist",
+ "uri" : "spotify:artist:7wbZFLV3wwTqyrKNCJ8Y8D"
+ } ],
+ "available_markets" : [ "AD", "AE", "AG", "AL", "AM", "AO", "AR", "AT", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BN", "BO", "BR", "BS", "BT", "BW", "BY", "BZ", "CA", "CD", "CG", "CH", "CI", "CL", "CM", "CO", "CR", "CV", "CW", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG", "ES", "ET", "FI", "FR", "GA", "GB", "GD", "GE", "GH", "GM", "GN", "GQ", "GR", "GT", "GW", "GY", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IN", "IQ", "IS", "IT", "JM", "JO", "KE", "KG", "KH", "KM", "KN", "KR", "KW", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "MG", "MK", "ML", "MN", "MO", "MR", "MT", "MU", "MV", "MW", "MX", "MZ", "NA", "NE", "NG", "NI", "NL", "NO", "NP", "NZ", "OM", "PA", "PE", "PG", "PH", "PK", "PL", "PS", "PT", "PW", "PY", "QA", "RO", "RW", "SA", "SC", "SE", "SI", "SK", "SL", "SM", "SN", "SR", "ST", "SV", "SZ", "TD", "TG", "TH", "TJ", "TL", "TN", "TR", "TT", "TZ", "UA", "UG", "US", "UY", "UZ", "VC", "VE", "VN", "ZA", "ZM", "ZW" ],
+ "disc_number" : 1,
+ "duration_ms" : 269376,
+ "explicit" : false,
+ "external_urls" : {
+ "spotify" : "https://open.spotify.com/track/5Um9ghqMlKALp9AcRMIk7B"
+ },
+ "href" : "https://api.spotify.com/v1/tracks/5Um9ghqMlKALp9AcRMIk7B",
+ "id" : "5Um9ghqMlKALp9AcRMIk7B",
+ "is_local" : false,
+ "name" : "Valentina",
+ "preview_url" : "https://p.scdn.co/mp3-preview/9e812bde9e2944d22f1eae78eab2adb89ce1f1cd?cid=4b150d8d6d374d1e8dbb85f4f11a2ad9",
+ "track_number" : 7,
+ "type" : "track",
+ "uri" : "spotify:track:5Um9ghqMlKALp9AcRMIk7B"
+ }, {
+ "artists" : [ {
+ "external_urls" : {
+ "spotify" : "https://open.spotify.com/artist/6VsiDFMZJlJ053P1uO4A6h"
+ },
+ "href" : "https://api.spotify.com/v1/artists/6VsiDFMZJlJ053P1uO4A6h",
+ "id" : "6VsiDFMZJlJ053P1uO4A6h",
+ "name" : "Public Service Broadcasting",
+ "type" : "artist",
+ "uri" : "spotify:artist:6VsiDFMZJlJ053P1uO4A6h"
+ } ],
+ "available_markets" : [ "AD", "AE", "AG", "AL", "AM", "AO", "AR", "AT", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BN", "BO", "BR", "BS", "BT", "BW", "BY", "BZ", "CA", "CD", "CG", "CH", "CI", "CL", "CM", "CO", "CR", "CV", "CW", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG", "ES", "ET", "FI", "FR", "GA", "GB", "GD", "GE", "GH", "GM", "GN", "GQ", "GR", "GT", "GW", "GY", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IN", "IQ", "IS", "IT", "JM", "JO", "KE", "KG", "KH", "KM", "KN", "KR", "KW", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "MG", "MK", "ML", "MN", "MO", "MR", "MT", "MU", "MV", "MW", "MX", "MZ", "NA", "NE", "NG", "NI", "NL", "NO", "NP", "NZ", "OM", "PA", "PE", "PG", "PH", "PK", "PL", "PS", "PT", "PW", "PY", "QA", "RO", "RW", "SA", "SC", "SE", "SI", "SK", "SL", "SM", "SN", "SR", "ST", "SV", "SZ", "TD", "TG", "TH", "TJ", "TL", "TN", "TR", "TT", "TZ", "UA", "UG", "US", "UY", "UZ", "VC", "VE", "VN", "ZA", "ZM", "ZW" ],
+ "disc_number" : 1,
+ "duration_ms" : 252720,
+ "explicit" : false,
+ "external_urls" : {
+ "spotify" : "https://open.spotify.com/track/5xYZXIgVAND5sWjN8G0hID"
+ },
+ "href" : "https://api.spotify.com/v1/tracks/5xYZXIgVAND5sWjN8G0hID",
+ "id" : "5xYZXIgVAND5sWjN8G0hID",
+ "is_local" : false,
+ "name" : "Go!",
+ "preview_url" : "https://p.scdn.co/mp3-preview/a7f4e9d98224dea630ee6604938848c3fd0c2842?cid=4b150d8d6d374d1e8dbb85f4f11a2ad9",
+ "track_number" : 8,
+ "type" : "track",
+ "uri" : "spotify:track:5xYZXIgVAND5sWjN8G0hID"
+ }, {
+ "artists" : [ {
+ "external_urls" : {
+ "spotify" : "https://open.spotify.com/artist/6VsiDFMZJlJ053P1uO4A6h"
+ },
+ "href" : "https://api.spotify.com/v1/artists/6VsiDFMZJlJ053P1uO4A6h",
+ "id" : "6VsiDFMZJlJ053P1uO4A6h",
+ "name" : "Public Service Broadcasting",
+ "type" : "artist",
+ "uri" : "spotify:artist:6VsiDFMZJlJ053P1uO4A6h"
+ } ],
+ "available_markets" : [ "AD", "AE", "AG", "AL", "AM", "AO", "AR", "AT", "AZ", "BA", "BB", "BD", "BE", "BF", "BG", "BH", "BI", "BJ", "BN", "BO", "BR", "BS", "BT", "BW", "BY", "BZ", "CA", "CD", "CG", "CH", "CI", "CL", "CM", "CO", "CR", "CV", "CW", "CY", "CZ", "DE", "DJ", "DK", "DM", "DO", "DZ", "EC", "EE", "EG", "ES", "ET", "FI", "FR", "GA", "GB", "GD", "GE", "GH", "GM", "GN", "GQ", "GR", "GT", "GW", "GY", "HN", "HR", "HT", "HU", "ID", "IE", "IL", "IN", "IQ", "IS", "IT", "JM", "JO", "KE", "KG", "KH", "KM", "KN", "KR", "KW", "KZ", "LA", "LB", "LC", "LI", "LK", "LR", "LS", "LT", "LU", "LV", "LY", "MA", "MC", "MD", "MG", "MK", "ML", "MN", "MO", "MR", "MT", "MU", "MV", "MW", "MX", "MZ", "NA", "NE", "NG", "NI", "NL", "NO", "NP", "NZ", "OM", "PA", "PE", "PG", "PH", "PK", "PL", "PS", "PT", "PW", "PY", "QA", "RO", "RW", "SA", "SC", "SE", "SI", "SK", "SL", "SM", "SN", "SR", "ST", "SV", "SZ", "TD", "TG", "TH", "TJ", "TL", "TN", "TR", "TT", "TZ", "UA", "UG", "US", "UY", "UZ", "VC", "VE", "VN", "ZA", "ZM", "ZW" ],
+ "disc_number" : 1,
+ "duration_ms" : 442359,
+ "explicit" : false,
+ "external_urls" : {
+ "spotify" : "https://open.spotify.com/track/5ERrJuNLnmHj525ooOKyqJ"
+ },
+ "href" : "https://api.spotify.com/v1/tracks/5ERrJuNLnmHj525ooOKyqJ",
+ "id" : "5ERrJuNLnmHj525ooOKyqJ",
+ "is_local" : false,
+ "name" : "Tomorrow",
+ "preview_url" : "https://p.scdn.co/mp3-preview/779a285aca862b886613815a0c1d1817446b550e?cid=4b150d8d6d374d1e8dbb85f4f11a2ad9",
+ "track_number" : 9,
+ "type" : "track",
+ "uri" : "spotify:track:5ERrJuNLnmHj525ooOKyqJ"
+ } ],
+ "limit" : 50,
+ "next" : null,
+ "offset" : 0,
+ "previous" : null,
+ "total" : 9
+ },
+ "type" : "album",
+ "uri" : "spotify:album:65KwtzkJXw7oT819NFWmEP"
+}
\ No newline at end of file
diff --git a/test_data/https___api_themoviedb_org_3_find_tt0436992_api_key_19890604_language_zh_CN_external_source_imdb_id b/test_data/https___api_themoviedb_org_3_find_tt0436992_api_key_19890604_language_zh_CN_external_source_imdb_id
new file mode 100644
index 00000000..77e9c692
--- /dev/null
+++ b/test_data/https___api_themoviedb_org_3_find_tt0436992_api_key_19890604_language_zh_CN_external_source_imdb_id
@@ -0,0 +1 @@
+{"movie_results":[],"person_results":[],"tv_results":[{"adult":false,"backdrop_path":"/sRfl6vyzGWutgG0cmXmbChC4iN6.jpg","id":57243,"name":"神秘博士","original_language":"en","original_name":"Doctor Who","overview":"名为“博士”的宇宙最后一个时间领主,有着重生的能力、体力及优越的智力,利用时光机器TARDIS英国传统的蓝色警亭,展开他勇敢的时光冒险之旅,拯救外星生物、地球与时空。","poster_path":"/sz4zF5z9zyFh8Z6g5IQPNq91cI7.jpg","media_type":"tv","genre_ids":[10759,18,10765],"popularity":158.575,"first_air_date":"2005-03-26","vote_average":7.402,"vote_count":2475,"origin_country":["GB"]}],"tv_episode_results":[],"tv_season_results":[]}
\ No newline at end of file
diff --git a/test_data/https___api_themoviedb_org_3_find_tt0827573_api_key_19890604_language_zh_CN_external_source_imdb_id b/test_data/https___api_themoviedb_org_3_find_tt0827573_api_key_19890604_language_zh_CN_external_source_imdb_id
new file mode 100644
index 00000000..c77c0491
--- /dev/null
+++ b/test_data/https___api_themoviedb_org_3_find_tt0827573_api_key_19890604_language_zh_CN_external_source_imdb_id
@@ -0,0 +1 @@
+{"movie_results":[{"adult":false,"backdrop_path":"/13qDzilftzRZMUEHcpi57VLqNPw.jpg","id":282758,"title":"神秘博士:逃跑新娘","original_language":"en","original_title":"Doctor Who: The Runaway Bride","overview":"失去了罗斯的博士正在心灰意冷,而正在举行婚礼的多娜却被突然传送到塔迪斯里。博士带坏脾气的多娜返回地球,却被一群外星机器人追杀,塔迪斯上演了一场公路飚车。后来博士发现多娜身上带有异常含量的Huon粒子,而该粒子来源于上一代宇宙霸主。而博士的母星加利弗雷在宇宙中崛起时,已经消灭了所有的Huon粒子。最终博士揭开了一个藏于地球40亿年的秘密。","poster_path":"/gkTCC4VLv8jATM3kouAUK3EaoGd.jpg","media_type":"movie","genre_ids":[878],"popularity":7.214,"release_date":"2006-12-25","video":false,"vote_average":7.739,"vote_count":201}],"person_results":[],"tv_results":[],"tv_episode_results":[{"id":1008547,"name":"2006年圣诞特辑:逃跑新娘","overview":"失去了罗斯的博士正在心灰意冷,而正在举行婚礼的多娜却被突然传送到塔迪斯里。博士带坏脾气的多娜返回地球,却被一群外星机器人追杀,塔迪斯上演了一场公路飚车。后来博士发现多娜身上带有异常含量的Huon粒子,而该粒子来源于上一代宇宙霸主。而博士的母星加利弗雷在宇宙中崛起时,已经消灭了所有的Huon粒子。最终博士揭开了一个藏于地球40亿年的秘密。","media_type":"tv_episode","vote_average":6.8,"vote_count":14,"air_date":"2006-12-25","episode_number":4,"production_code":"NCFT094N","runtime":64,"season_number":0,"show_id":57243,"still_path":"/mkJufoqvEBMVvnVUjYlR9lGarZB.jpg"}],"tv_season_results":[]}
\ No newline at end of file
diff --git a/test_data/https___api_themoviedb_org_3_find_tt1159991_api_key_19890604_language_zh_CN_external_source_imdb_id b/test_data/https___api_themoviedb_org_3_find_tt1159991_api_key_19890604_language_zh_CN_external_source_imdb_id
new file mode 100644
index 00000000..a5454687
--- /dev/null
+++ b/test_data/https___api_themoviedb_org_3_find_tt1159991_api_key_19890604_language_zh_CN_external_source_imdb_id
@@ -0,0 +1 @@
+{"movie_results":[],"person_results":[],"tv_results":[],"tv_episode_results":[{"id":941505,"name":"活宝搭档","overview":"博士在伦敦发现艾迪派斯公司新产品药物有问题,人类服用后会悄悄的产生土豆状生物,并在夜里1点10分逃走回到保姆身边,于是博士潜入公司决定探查究竟,在探查时遇到了多娜原来Adiposian人丢失了他们的繁育星球,于是跑到地球利用人类做代孕母繁殖宝宝。最后保姆在高空中被抛弃,脂肪球回到了父母身边,博士邀请多娜一同旅行。【Rose从平行宇宙回归】","media_type":"tv_episode","vote_average":7.2,"vote_count":43,"air_date":"2008-04-05","episode_number":1,"production_code":"","runtime":null,"season_number":4,"show_id":57243,"still_path":"/cq1zrCS267vGXa3rCYQkVKNJE9v.jpg"}],"tv_season_results":[]}
\ No newline at end of file
diff --git a/test_data/https___api_themoviedb_org_3_find_tt1375666_api_key_19890604_language_zh_CN_external_source_imdb_id b/test_data/https___api_themoviedb_org_3_find_tt1375666_api_key_19890604_language_zh_CN_external_source_imdb_id
new file mode 100644
index 00000000..a52e76f3
--- /dev/null
+++ b/test_data/https___api_themoviedb_org_3_find_tt1375666_api_key_19890604_language_zh_CN_external_source_imdb_id
@@ -0,0 +1 @@
+{"movie_results":[{"adult":false,"backdrop_path":"/s3TBrRGB1iav7gFOCNx3H31MoES.jpg","id":27205,"title":"盗梦空间","original_language":"en","original_title":"Inception","overview":"道姆·柯布与同事阿瑟和纳什在一次针对日本能源大亨齐藤的盗梦行动中失败,反被齐藤利用。齐藤威逼利诱因遭通缉而流亡海外的柯布帮他拆分他竞争对手的公司,采取极端措施在其唯一继承人罗伯特·费希尔的深层潜意识中种下放弃家族公司、自立门户的想法。为了重返美国,柯布偷偷求助于岳父迈尔斯,吸收了年轻的梦境设计师艾里阿德妮、梦境演员艾姆斯和药剂师约瑟夫加入行动。在一层层递进的梦境中,柯布不仅要对付费希尔潜意识的本能反抗,还必须直面已逝妻子梅的处处破坏,实际情况远比预想危险得多…","poster_path":"/lQEjWasu07JbQHdfFI5VnEUfId2.jpg","media_type":"movie","genre_ids":[28,878,12],"popularity":74.425,"release_date":"2010-07-15","video":false,"vote_average":8.359,"vote_count":32695}],"person_results":[],"tv_results":[],"tv_episode_results":[],"tv_season_results":[]}
\ No newline at end of file
diff --git a/test_data/https___api_themoviedb_org_3_find_tt7660970_api_key_19890604_language_zh_CN_external_source_imdb_id b/test_data/https___api_themoviedb_org_3_find_tt7660970_api_key_19890604_language_zh_CN_external_source_imdb_id
new file mode 100644
index 00000000..31ef4b53
--- /dev/null
+++ b/test_data/https___api_themoviedb_org_3_find_tt7660970_api_key_19890604_language_zh_CN_external_source_imdb_id
@@ -0,0 +1 @@
+{"movie_results":[],"person_results":[],"tv_results":[{"adult":false,"backdrop_path":"/8IC1q0lHFwi5m8VtChLzIfmpaZH.jpg","id":86941,"name":"北海鲸梦","original_language":"en","original_name":"The North Water","overview":"改编自伊恩·麦奎尔的同名获奖小说,聚焦19世纪一次灾难性的捕鲸活动。故事围绕帕特里克·萨姆纳展开,他是一名声名狼藉的前战地医生,后成为捕鲸船上的医生,在船上遇到了鱼叉手亨利·德拉克斯,一个残忍、不道德的杀手。萨姆纳没有逃离过去的恐惧,而是被迫在北极荒原上为生存而进行残酷的斗争...","poster_path":"/9CM0ca8pX1os3SJ24hsIc0nN8ph.jpg","media_type":"tv","genre_ids":[18,9648],"popularity":11.318,"first_air_date":"2021-07-14","vote_average":7.5,"vote_count":75,"origin_country":["US"]}],"tv_episode_results":[],"tv_season_results":[]}
\ No newline at end of file
diff --git a/test_data/https___api_themoviedb_org_3_movie_27205_api_key_19890604_language_zh_CN_append_to_response_external_ids_credits b/test_data/https___api_themoviedb_org_3_movie_27205_api_key_19890604_language_zh_CN_append_to_response_external_ids_credits
new file mode 100644
index 00000000..3d023bcd
--- /dev/null
+++ b/test_data/https___api_themoviedb_org_3_movie_27205_api_key_19890604_language_zh_CN_append_to_response_external_ids_credits
@@ -0,0 +1 @@
+{"adult":false,"backdrop_path":"/s3TBrRGB1iav7gFOCNx3H31MoES.jpg","belongs_to_collection":null,"budget":160000000,"genres":[{"id":28,"name":"动作"},{"id":878,"name":"科幻"},{"id":12,"name":"冒险"}],"homepage":"","id":27205,"imdb_id":"tt1375666","original_language":"en","original_title":"Inception","overview":"道姆·柯布与同事阿瑟和纳什在一次针对日本能源大亨齐藤的盗梦行动中失败,反被齐藤利用。齐藤威逼利诱因遭通缉而流亡海外的柯布帮他拆分他竞争对手的公司,采取极端措施在其唯一继承人罗伯特·费希尔的深层潜意识中种下放弃家族公司、自立门户的想法。为了重返美国,柯布偷偷求助于岳父迈尔斯,吸收了年轻的梦境设计师艾里阿德妮、梦境演员艾姆斯和药剂师约瑟夫加入行动。在一层层递进的梦境中,柯布不仅要对付费希尔潜意识的本能反抗,还必须直面已逝妻子梅的处处破坏,实际情况远比预想危险得多…","popularity":74.425,"poster_path":"/lQEjWasu07JbQHdfFI5VnEUfId2.jpg","production_companies":[{"id":174,"logo_path":"/IuAlhI9eVC9Z8UQWOIDdWRKSEJ.png","name":"Warner Bros. Pictures","origin_country":"US"},{"id":923,"logo_path":"/5UQsZrfbfG2dYJbx8DxfoTr2Bvu.png","name":"Legendary Pictures","origin_country":"US"},{"id":9996,"logo_path":"/3tvBqYsBhxWeHlu62SIJ1el93O7.png","name":"Syncopy","origin_country":"GB"}],"production_countries":[{"iso_3166_1":"GB","name":"United Kingdom"},{"iso_3166_1":"US","name":"United States of America"}],"release_date":"2010-07-15","revenue":825532764,"runtime":148,"spoken_languages":[{"english_name":"English","iso_639_1":"en","name":"English"},{"english_name":"Japanese","iso_639_1":"ja","name":"日本語"},{"english_name":"Swahili","iso_639_1":"sw","name":"Kiswahili"}],"status":"Released","tagline":"你的梦境就是犯罪现场","title":"盗梦空间","video":false,"vote_average":8.359,"vote_count":32695,"external_ids":{"imdb_id":"tt1375666","wikidata_id":null,"facebook_id":"inception","instagram_id":null,"twitter_id":null},"credits":{"cast":[{"adult":false,"gender":2,"id":6193,"known_for_department":"Acting","name":"Leonardo DiCaprio","original_name":"Leonardo DiCaprio","popularity":50.488,"profile_path":"/wo2hJpn04vbtmh0B9utCFdsQhxM.jpg","cast_id":1,"character":"Dom Cobb","credit_id":"52fe4534c3a368484e04de03","order":0},{"adult":false,"gender":2,"id":24045,"known_for_department":"Acting","name":"Joseph Gordon-Levitt","original_name":"Joseph Gordon-Levitt","popularity":34.256,"profile_path":"/dhv9f3AaozOjpvjAwVzOWlmmT2V.jpg","cast_id":3,"character":"Arthur","credit_id":"52fe4534c3a368484e04de0b","order":1},{"adult":false,"gender":2,"id":3899,"known_for_department":"Acting","name":"Ken Watanabe","original_name":"Ken Watanabe","popularity":9.998,"profile_path":"/psAXOYp9SBOXvg6AXzARDedNQ9P.jpg","cast_id":2,"character":"Saito","credit_id":"52fe4534c3a368484e04de07","order":2},{"adult":false,"gender":2,"id":2524,"known_for_department":"Acting","name":"Tom Hardy","original_name":"Tom Hardy","popularity":60.206,"profile_path":"/sGMA6pA2D6X0gun49igJT3piHs3.jpg","cast_id":7,"character":"Eames","credit_id":"52fe4534c3a368484e04de1b","order":3},{"adult":false,"gender":3,"id":27578,"known_for_department":"Acting","name":"Elliot Page","original_name":"Elliot Page","popularity":32.4,"profile_path":"/596bLvD4iEz8VGc6TOEhzmPwTMe.jpg","cast_id":5,"character":"Ariadne","credit_id":"52fe4534c3a368484e04de13","order":4},{"adult":false,"gender":2,"id":95697,"known_for_department":"Acting","name":"Dileep Rao","original_name":"Dileep Rao","popularity":2.617,"profile_path":"/jRNn8SZqFXuI5wOOlHwYsWh0hXs.jpg","cast_id":19,"character":"Yusuf","credit_id":"52fe4534c3a368484e04de4f","order":5},{"adult":false,"gender":2,"id":2037,"known_for_department":"Acting","name":"Cillian Murphy","original_name":"Cillian Murphy","popularity":87.896,"profile_path":"/i8dOTC0w6V274ev5iAAvo4Ahhpr.jpg","cast_id":8,"character":"Robert Fischer, Jr.","credit_id":"52fe4534c3a368484e04de1f","order":6},{"adult":false,"gender":2,"id":13022,"known_for_department":"Acting","name":"Tom Berenger","original_name":"Tom Berenger","popularity":20.024,"profile_path":"/zLxzAdAfu7y02yEx29JSLDgXJZ4.jpg","cast_id":9,"character":"Peter Browning","credit_id":"52fe4534c3a368484e04de23","order":7},{"adult":false,"gender":1,"id":8293,"known_for_department":"Acting","name":"Marion Cotillard","original_name":"Marion Cotillard","popularity":19.655,"profile_path":"/zChwjQ9D90fxx6cgWz5mUWHNd5b.jpg","cast_id":4,"character":"Mal Cobb","credit_id":"52fe4534c3a368484e04de0f","order":8},{"adult":false,"gender":2,"id":4935,"known_for_department":"Acting","name":"Pete Postlethwaite","original_name":"Pete Postlethwaite","popularity":16.416,"profile_path":"/2gpa75Ci4y2OKmOc8WXnaeGgyKF.jpg","cast_id":22,"character":"Maurice Fischer","credit_id":"52fe4534c3a368484e04de59","order":9},{"adult":false,"gender":2,"id":3895,"known_for_department":"Acting","name":"Michael Caine","original_name":"Michael Caine","popularity":32.499,"profile_path":"/hZruclwEPCKw3e83rnFSIH5sRFZ.jpg","cast_id":6,"character":"Stephen Miles","credit_id":"52fe4534c3a368484e04de17","order":10},{"adult":false,"gender":2,"id":526,"known_for_department":"Acting","name":"Lukas Haas","original_name":"Lukas Haas","popularity":8.693,"profile_path":"/vabZQXlAhyW2GxQfDM1PhKURA8.jpg","cast_id":10,"character":"Nash","credit_id":"52fe4534c3a368484e04de27","order":11},{"adult":false,"gender":1,"id":66441,"known_for_department":"Acting","name":"Talulah Riley","original_name":"Talulah Riley","popularity":14.395,"profile_path":"/wIfzSnKvvREEi8lJ6cbuX04HiNG.jpg","cast_id":89,"character":"Blonde","credit_id":"52fe4534c3a368484e04de99","order":12},{"adult":false,"gender":2,"id":173212,"known_for_department":"Acting","name":"Tohoru Masamune","original_name":"Tohoru Masamune","popularity":1.564,"profile_path":"/7rNjiFzY8KAf4kiZBJK1nBWOz8G.jpg","cast_id":92,"character":"Japanese Security Guard","credit_id":"57d488dec3a3685568007ba1","order":13},{"adult":false,"gender":1,"id":967376,"known_for_department":"Acting","name":"Taylor Geare","original_name":"Taylor Geare","popularity":4.295,"profile_path":"/av6jHo6Sn9H0Bklb4oiJHO3OUy4.jpg","cast_id":93,"character":"Phillipa (5 years)","credit_id":"57d488f8c3a368154b0011a1","order":14},{"adult":false,"gender":1,"id":973135,"known_for_department":"Acting","name":"Claire Geare","original_name":"Claire Geare","popularity":4.328,"profile_path":"/hE8prndXq5IE0RS3IvevTq9iXoN.jpg","cast_id":94,"character":"Phillipa (3 years)","credit_id":"57d48919925141382f0011ca","order":15},{"adult":false,"gender":2,"id":1677266,"known_for_department":"Acting","name":"Johnathan Geare","original_name":"Johnathan Geare","popularity":1.4,"profile_path":null,"cast_id":95,"character":"James (3 years)","credit_id":"57d48aca925141369d00113d","order":16},{"adult":false,"gender":2,"id":56120,"known_for_department":"Acting","name":"Yuji Okumoto","original_name":"Yuji Okumoto","popularity":7.127,"profile_path":"/eACYrrdj8kZnYMCpUTghbpJ9nVk.jpg","cast_id":96,"character":"Saito's Attendant","credit_id":"57d48b45c3a3680b9f00179e","order":17},{"adult":false,"gender":2,"id":2246,"known_for_department":"Acting","name":"Earl Cameron","original_name":"Earl Cameron","popularity":2.006,"profile_path":"/jV8eAMdtMZCgwJqmWKdzcl3Wqnm.jpg","cast_id":97,"character":"Elderly Bald Man","credit_id":"57d48b59c3a3685568007cd7","order":18},{"adult":false,"gender":2,"id":1677267,"known_for_department":"Acting","name":"Ryan Hayward","original_name":"Ryan Hayward","popularity":0.742,"profile_path":null,"cast_id":98,"character":"Lawyer","credit_id":"57d48b6dc3a3680ccd001433","order":19},{"adult":false,"gender":1,"id":1334309,"known_for_department":"Acting","name":"Miranda Nolan","original_name":"Miranda Nolan","popularity":3.395,"profile_path":"/xzQJpQicKgeFtCqZ1xwr0Rhdf5t.jpg","cast_id":99,"character":"Flight Attendant","credit_id":"57d48b84925141382f0012af","order":20},{"adult":false,"gender":2,"id":535,"known_for_department":"Acting","name":"Russ Fega","original_name":"Russ Fega","popularity":1.565,"profile_path":"/d0W7kq97Ul8Iz5LZIVNDKxSly8M.jpg","cast_id":100,"character":"Cab Driver","credit_id":"57d53da09251415c1e000263","order":21},{"adult":false,"gender":2,"id":72864,"known_for_department":"Acting","name":"Tim Kelleher","original_name":"Tim Kelleher","popularity":2.104,"profile_path":"/8W3KgoIPUMNjqb3CxC9B8QjBsjM.jpg","cast_id":101,"character":"Thin Man","credit_id":"57d53db4c3a368556800ce41","order":22},{"adult":false,"gender":1,"id":1677498,"known_for_department":"Acting","name":"Coralie Dedykere","original_name":"Coralie Dedykere","popularity":0.6,"profile_path":null,"cast_id":102,"character":"Bridge Sub Con","credit_id":"57d53e46c3a36812b2000308","order":23},{"adult":false,"gender":1,"id":13695,"known_for_department":"Acting","name":"Silvie Laguna","original_name":"Silvie Laguna","popularity":2.141,"profile_path":"/qDRqkAVWYhUN6P3flH5VuKKVcM8.jpg","cast_id":103,"character":"Bridge Sub Con","credit_id":"57d53ee6c3a3686e3c000cd9","order":24},{"adult":false,"gender":2,"id":133257,"known_for_department":"Acting","name":"Virgile Bramly","original_name":"Virgile Bramly","popularity":2.481,"profile_path":"/1bbSzSPfT61YV2SI7cgTkbVPMeK.jpg","cast_id":104,"character":"Bridge Sub Con","credit_id":"57d53efcc3a36813230002f5","order":25},{"adult":false,"gender":2,"id":1677507,"known_for_department":"Acting","name":"Nicolas Clerc","original_name":"Nicolas Clerc","popularity":0.6,"profile_path":null,"cast_id":105,"character":"Bridge Sub Con","credit_id":"57d53fde9251415c1e000324","order":26},{"adult":false,"gender":2,"id":1536351,"known_for_department":"Acting","name":"Jean-Michel Dagory","original_name":"Jean-Michel Dagory","popularity":0.976,"profile_path":null,"cast_id":106,"character":"Bridge Sub Con","credit_id":"57d5405f9251415bb300037f","order":27},{"adult":false,"gender":2,"id":203087,"known_for_department":"Acting","name":"Marc Raducci","original_name":"Marc Raducci","popularity":0.998,"profile_path":null,"cast_id":107,"character":"Lobby Sub Con","credit_id":"57d540c7c3a36813230003bc","order":28},{"adult":false,"gender":0,"id":2157567,"known_for_department":"Acting","name":"Tai-Li Lee","original_name":"Tai-Li Lee","popularity":0.6,"profile_path":null,"cast_id":117,"character":"Tadashi","credit_id":"5bcdbc1a0e0a260151022053","order":29},{"adult":false,"gender":2,"id":2157568,"known_for_department":"Acting","name":"Magnus Nolan","original_name":"Magnus Nolan","popularity":1.876,"profile_path":null,"cast_id":118,"character":"James (20 months)","credit_id":"5bcdbc29c3a368286302325d","order":30},{"adult":false,"gender":0,"id":2157569,"known_for_department":"Acting","name":"Helena Cullinan","original_name":"Helena Cullinan","popularity":0.6,"profile_path":null,"cast_id":119,"character":"Penrose Sub Con","credit_id":"5bcdbc36925141613801df6b","order":31},{"adult":false,"gender":0,"id":1470134,"known_for_department":"Acting","name":"Mark Fleischmann","original_name":"Mark Fleischmann","popularity":3.069,"profile_path":"/4Xki6fvgwjRXVmV9pEinAhqK6XJ.jpg","cast_id":120,"character":"Penrose Sub Con","credit_id":"5bcdbc610e0a26015f0220a3","order":32},{"adult":false,"gender":0,"id":2157570,"known_for_department":"Acting","name":"Shelley Lang","original_name":"Shelley Lang","popularity":0.6,"profile_path":null,"cast_id":121,"character":"Penrose Sub Con","credit_id":"5bcdbc690e0a26016e0219d7","order":33},{"adult":false,"gender":2,"id":2157571,"known_for_department":"Acting","name":"Adam Cole","original_name":"Adam Cole","popularity":0.6,"profile_path":"/6stnyhAOiA0JuOJ1tTVQKnVvVWj.jpg","cast_id":122,"character":"Bar Sub Con","credit_id":"5bcdbcb2c3a3682870023a6a","order":34},{"adult":false,"gender":2,"id":1460686,"known_for_department":"Acting","name":"Jack Murray","original_name":"Jack Murray","popularity":3.718,"profile_path":"/kwSd0y9yBTLlHfvmDf5SKh6SX1k.jpg","cast_id":123,"character":"Bar Sub Con","credit_id":"5bcdbcc6c3a368286a024f6a","order":35},{"adult":false,"gender":0,"id":1742659,"known_for_department":"Acting","name":"Kraig Thornber","original_name":"Kraig Thornber","popularity":1.572,"profile_path":null,"cast_id":124,"character":"Bar Sub Con","credit_id":"5bcdbcd1925141613e01de41","order":36},{"adult":false,"gender":0,"id":2157572,"known_for_department":"Acting","name":"Angela Nathenson","original_name":"Angela Nathenson","popularity":0.6,"profile_path":null,"cast_id":125,"character":"Bar Sub Con","credit_id":"5bcdbcda925141612d020ddc","order":37},{"adult":false,"gender":1,"id":61642,"known_for_department":"Acting","name":"Natasha Beaumont","original_name":"Natasha Beaumont","popularity":1.545,"profile_path":"/svKLagcLLHidlpGpjEnSaYOZxeP.jpg","cast_id":126,"character":"Bar Sub Con","credit_id":"5bcdbce3c3a3682863023393","order":38},{"adult":false,"gender":2,"id":155308,"known_for_department":"Acting","name":"Carl Gilliard","original_name":"Carl Gilliard","popularity":0.848,"profile_path":"/s8guLnLc4HrAbqucANUlYI1SHb0.jpg","cast_id":127,"character":"Lobby Sub Con","credit_id":"5bcdbcecc3a368286d02475e","order":39},{"adult":false,"gender":1,"id":2157573,"known_for_department":"Acting","name":"Jill Maddrell","original_name":"Jill Maddrell","popularity":0.6,"profile_path":null,"cast_id":128,"character":"Lobby Sub Con","credit_id":"5bcdbcf5925141613401f960","order":40},{"adult":false,"gender":1,"id":565500,"known_for_department":"Acting","name":"Alex Lombard","original_name":"Alex Lombard","popularity":1.746,"profile_path":"/7rRd2byURAqE2QObL3wJyHYQbpL.jpg","cast_id":129,"character":"Lobby Sub Con","credit_id":"5bcdbd26c3a368286a025014","order":41},{"adult":false,"gender":1,"id":98811,"known_for_department":"Acting","name":"Nicole Pulliam","original_name":"Nicole Pulliam","popularity":1.4,"profile_path":"/XcJAw0P7bPE9ET52P4fZ2hdokk.jpg","cast_id":130,"character":"Lobby Sub Con","credit_id":"5bcdbd2f925141612a01f459","order":42},{"adult":false,"gender":2,"id":1168075,"known_for_department":"Acting","name":"Peter Basham","original_name":"Peter Basham","popularity":1.127,"profile_path":"/4AtYLZu7jX5ROgB9rCzYhicbLqk.jpg","cast_id":131,"character":"Fischer's Jet Captain","credit_id":"5bcdbd38925141612d020fa2","order":43},{"adult":false,"gender":2,"id":33241,"known_for_department":"Acting","name":"Michael Gaston","original_name":"Michael Gaston","popularity":5.991,"profile_path":"/lXhqiW4J1n9bnbfwz0Kdf2sjGLU.jpg","cast_id":132,"character":"Immigration Officer","credit_id":"5bcdbd41c3a3682873021710","order":44},{"adult":false,"gender":2,"id":208492,"known_for_department":"Acting","name":"Felix Scott","original_name":"Felix Scott","popularity":2.635,"profile_path":"/sRlcbtzrmVMEVdJAH6xocbYdfhr.jpg","cast_id":133,"character":"Businessman","credit_id":"5bcdbd4a925141612601fbd1","order":45},{"adult":false,"gender":2,"id":17291,"known_for_department":"Acting","name":"Andrew Pleavin","original_name":"Andrew Pleavin","popularity":2.762,"profile_path":"/hp20HveWeBveVYtE87DPwmXEpD2.jpg","cast_id":134,"character":"Businessman","credit_id":"5bcdbd57925141613b01ee04","order":46},{"adult":false,"gender":0,"id":2011839,"known_for_department":"Acting","name":"Lisa Reynolds","original_name":"Lisa Reynolds","popularity":0.772,"profile_path":"/kBFTzvYveef33Ci4PlKuDe7wGuD.jpg","cast_id":135,"character":"Private Nurse","credit_id":"5bcdbd6c0e0a26016b022cba","order":47},{"adult":false,"gender":0,"id":2157574,"known_for_department":"Acting","name":"Jason Tendell","original_name":"Jason Tendell","popularity":0.6,"profile_path":null,"cast_id":136,"character":"Fischer's Driver","credit_id":"5bcdbd770e0a260162022691","order":48},{"adult":false,"gender":0,"id":2157575,"known_for_department":"Acting","name":"Jack Gilroy","original_name":"Jack Gilroy","popularity":0.6,"profile_path":null,"cast_id":137,"character":"Old Cobb","credit_id":"5bcdbd84925141612d020ffc","order":49},{"adult":false,"gender":1,"id":1217812,"known_for_department":"Acting","name":"Shannon Welles","original_name":"Shannon Welles","popularity":1.144,"profile_path":null,"cast_id":138,"character":"Old Mal","credit_id":"5bcdbd93c3a368286302346f","order":50},{"adult":false,"gender":2,"id":3443663,"known_for_department":"Acting","name":"Daniel Girondeaud","original_name":"Daniel Girondeaud","popularity":0.6,"profile_path":"/oTLqQ4Cj5LhAbopXAq71hodKSdB.jpg","cast_id":804,"character":"Bridge Sub Con","credit_id":"621943570e597b00412a9812","order":51}],"crew":[{"adult":false,"gender":2,"id":947,"known_for_department":"Sound","name":"Hans Zimmer","original_name":"Hans Zimmer","popularity":10.54,"profile_path":"/tpQnDeHY15szIXvpnhlprufz4d.jpg","credit_id":"56e8462cc3a368408400354c","department":"Sound","job":"Original Music Composer"},{"adult":false,"gender":2,"id":525,"known_for_department":"Directing","name":"Christopher Nolan","original_name":"Christopher Nolan","popularity":13.598,"profile_path":"/xuAIuYSmsUzKlUMBFGVZaWsY3DZ.jpg","credit_id":"5e83ac2ee33f830018359a00","department":"Directing","job":"Director"},{"adult":false,"gender":2,"id":525,"known_for_department":"Directing","name":"Christopher Nolan","original_name":"Christopher Nolan","popularity":13.598,"profile_path":"/xuAIuYSmsUzKlUMBFGVZaWsY3DZ.jpg","credit_id":"52fe4534c3a368484e04de2d","department":"Production","job":"Producer"},{"adult":false,"gender":2,"id":525,"known_for_department":"Directing","name":"Christopher Nolan","original_name":"Christopher Nolan","popularity":13.598,"profile_path":"/xuAIuYSmsUzKlUMBFGVZaWsY3DZ.jpg","credit_id":"6168e57da802360043ef85d0","department":"Writing","job":"Writer"},{"adult":false,"gender":1,"id":556,"known_for_department":"Production","name":"Emma Thomas","original_name":"Emma Thomas","popularity":8.314,"profile_path":"/6GemtNCy856iLho6WRsFASxQTAp.jpg","credit_id":"52fe4534c3a368484e04de33","department":"Production","job":"Producer"},{"adult":false,"gender":2,"id":559,"known_for_department":"Camera","name":"Wally Pfister","original_name":"Wally Pfister","popularity":1.604,"profile_path":"/uyWeYsERTTLjpjkE79QeSETLIoA.jpg","credit_id":"52fe4534c3a368484e04de3f","department":"Camera","job":"Director of Photography"},{"adult":false,"gender":2,"id":561,"known_for_department":"Production","name":"John Papsidera","original_name":"John Papsidera","popularity":5.45,"profile_path":"/quM89TMS6BncoIh4NdlWugXVhuF.jpg","credit_id":"52fe4534c3a368484e04de6b","department":"Production","job":"Casting"},{"adult":false,"gender":2,"id":3904,"known_for_department":"Editing","name":"Lee Smith","original_name":"Lee Smith","popularity":2.372,"profile_path":"/zlnK1i7CqdzIFTFqfMsYLyt2Sk8.jpg","credit_id":"52fe4534c3a368484e04de45","department":"Editing","job":"Editor"},{"adult":false,"gender":0,"id":10571,"known_for_department":"Production","name":"John Bernard","original_name":"John Bernard","popularity":0.6,"profile_path":null,"credit_id":"5bcdec5e925141613e021637","department":"Production","job":"Line Producer"},{"adult":false,"gender":1,"id":5311,"known_for_department":"Acting","name":"Hélène Cardona","original_name":"Hélène Cardona","popularity":2.646,"profile_path":"/6Zuf0Xjtw1fDbUNM5AdJ0HBCfjO.jpg","credit_id":"5bcdd11e925141613e01f733","department":"Sound","job":"ADR & Dubbing"},{"adult":false,"gender":2,"id":6348,"known_for_department":"Costume & Make-Up","name":"Jeffrey Kurland","original_name":"Jeffrey Kurland","popularity":0.895,"profile_path":"/dd2RnT3UqP41wuQA8bQpftJbmJq.jpg","credit_id":"5bcdc144c3a368286a0256a9","department":"Costume & Make-Up","job":"Costume Design"},{"adult":false,"gender":0,"id":10958,"known_for_department":"Art","name":"Douglas A. Mowat","original_name":"Douglas A. Mowat","popularity":0.98,"profile_path":null,"credit_id":"52fe4534c3a368484e04de8f","department":"Art","job":"Set Decoration"},{"adult":false,"gender":2,"id":8281,"known_for_department":"Art","name":"Robert Fechtman","original_name":"Robert Fechtman","popularity":1.4,"profile_path":null,"credit_id":"5bcdf9920e0a260168027a7d","department":"Art","job":"Set Designer"},{"adult":false,"gender":2,"id":8705,"known_for_department":"Art","name":"Brad Ricker","original_name":"Brad Ricker","popularity":0.627,"profile_path":null,"credit_id":"5bcdc00ac3a3682866023c05","department":"Art","job":"Supervising Art Director"},{"adult":false,"gender":2,"id":9379,"known_for_department":"Camera","name":"Paul Wilkowsky","original_name":"Paul Wilkowsky","popularity":0.6,"profile_path":null,"credit_id":"5bcde4450e0a2601640247e8","department":"Camera","job":"Grip"},{"adult":false,"gender":2,"id":40767,"known_for_department":"Camera","name":"Clive Mackey","original_name":"Clive Mackey","popularity":0.98,"profile_path":null,"credit_id":"5bcde1db0e0a260164024500","department":"Camera","job":"First Assistant \"B\" Camera"},{"adult":false,"gender":2,"id":12234,"known_for_department":"Production","name":"Nigel Sinclair","original_name":"Nigel Sinclair","popularity":2.188,"profile_path":null,"credit_id":"5bcdfdd40e0a26016e0271ca","department":"Crew","job":"Special Effects Technician"},{"adult":false,"gender":2,"id":21984,"known_for_department":"Art","name":"Larry Dias","original_name":"Larry Dias","popularity":0.6,"profile_path":null,"credit_id":"52fe4534c3a368484e04de89","department":"Art","job":"Set Decoration"},{"adult":false,"gender":0,"id":28496,"known_for_department":"Production","name":"Paula Turnbull","original_name":"Paula Turnbull","popularity":1.465,"profile_path":null,"credit_id":"5bcdf8910e0a260162027a15","department":"Directing","job":"Second Assistant Director"},{"adult":false,"gender":2,"id":37301,"known_for_department":"Art","name":"Frank Walsh","original_name":"Frank Walsh","popularity":0.6,"profile_path":null,"credit_id":"5bcdff9dc3a3683d690001b0","department":"Art","job":"Supervising Art Director"},{"adult":false,"gender":0,"id":41018,"known_for_department":"Production","name":"Chris Brigham","original_name":"Chris Brigham","popularity":2.201,"profile_path":"/lbWFcY3aVB8vG7tWwBXILJM8jyH.jpg","credit_id":"52fe4534c3a368484e04de5f","department":"Production","job":"Executive Producer"},{"adult":false,"gender":0,"id":49192,"known_for_department":"Production","name":"Benoit Hemard","original_name":"Benoit Hemard","popularity":0.6,"profile_path":null,"credit_id":"5bcdd5d1925141613b020c39","department":"Production","job":"Assistant Unit Manager"},{"adult":false,"gender":2,"id":52193,"known_for_department":"Sound","name":"R.J. Kizer","original_name":"R.J. Kizer","popularity":0.65,"profile_path":null,"credit_id":"5bcdd1090e0a26016b024a0f","department":"Sound","job":"ADR Editor"},{"adult":false,"gender":0,"id":54211,"known_for_department":"Production","name":"Thomas Tull","original_name":"Thomas Tull","popularity":4.06,"profile_path":"/5UG4FK7rsmhzJDYxpU28acqfxtu.jpg","credit_id":"52fe4534c3a368484e04de65","department":"Production","job":"Executive Producer"},{"adult":false,"gender":2,"id":113211,"known_for_department":"Acting","name":"Chris Webb","original_name":"Chris Webb","popularity":3.123,"profile_path":"/lEDEd4EGe3hNNOnW5KlR7TPfwqK.jpg","credit_id":"5f8bb1ad90fca3003809519a","department":"Crew","job":"Stunts"},{"adult":false,"gender":2,"id":66650,"known_for_department":"Acting","name":"Rio Ahn","original_name":"Rio Ahn","popularity":0.618,"profile_path":null,"credit_id":"5bcdff0f925141057400011f","department":"Crew","job":"Stand In"},{"adult":false,"gender":0,"id":59961,"known_for_department":"Production","name":"Brian Leslie Parker","original_name":"Brian Leslie Parker","popularity":1.4,"profile_path":null,"credit_id":"5bce0593925141056f00097f","department":"Production","job":"Unit Production Manager"},{"adult":false,"gender":2,"id":68016,"known_for_department":"Sound","name":"Kevin Kaska","original_name":"Kevin Kaska","popularity":1.616,"profile_path":"/azlSu8Sz9QGeK3xgQS9p3ZvR9q9.jpg","credit_id":"579d07fe9251411b36008736","department":"Sound","job":"Orchestrator"},{"adult":false,"gender":0,"id":92356,"known_for_department":"Art","name":"Carmine Goglia","original_name":"Carmine Goglia","popularity":1.4,"profile_path":null,"credit_id":"5bcdfef592514105770000dd","department":"Art","job":"Standby Painter"},{"adult":false,"gender":2,"id":77511,"known_for_department":"Production","name":"Zakaria Alaoui","original_name":"Zakaria Alaoui","popularity":1.176,"profile_path":"/wOAZpt31Rv2EMazldNNcMPEheNW.jpg","credit_id":"5bcdec660e0a26016802676e","department":"Production","job":"Line Producer"},{"adult":false,"gender":2,"id":71577,"known_for_department":"Art","name":"Matthew Gray","original_name":"Matthew Gray","popularity":0.728,"profile_path":null,"credit_id":"5bcdfedb92514105870000c0","department":"Art","job":"Standby Art Director"},{"adult":false,"gender":0,"id":75095,"known_for_department":"Sound","name":"Christopher Atkinson","original_name":"Christopher Atkinson","popularity":0.6,"profile_path":null,"credit_id":"5bcdd6480e0a26015b023b6a","department":"Sound","job":"Boom Operator"},{"adult":false,"gender":2,"id":113913,"known_for_department":"Production","name":"Jordan Goldberg","original_name":"Jordan Goldberg","popularity":1.4,"profile_path":null,"credit_id":"5bcdd9abc3a368286d026eef","department":"Production","job":"Co-Producer"},{"adult":false,"gender":0,"id":76054,"known_for_department":"Art","name":"Luke Freeborn","original_name":"Luke Freeborn","popularity":0.646,"profile_path":null,"credit_id":"52fe4534c3a368484e04de77","department":"Art","job":"Art Direction"},{"adult":false,"gender":2,"id":106025,"known_for_department":"Production","name":"Derek Thornton","original_name":"Derek Thornton","popularity":0.6,"profile_path":null,"credit_id":"5bcdd60d925141613801fd1f","department":"Production","job":"Producer's Assistant"},{"adult":false,"gender":0,"id":91055,"known_for_department":"Production","name":"Jan Foster","original_name":"Jan Foster","popularity":0.621,"profile_path":null,"credit_id":"5bcdf1ed9251416134023733","department":"Production","job":"Production Manager"},{"adult":false,"gender":0,"id":91136,"known_for_department":"Editing","name":"Laura Rindner","original_name":"Laura Rindner","popularity":0.996,"profile_path":null,"credit_id":"5bcde2440e0a26016e024909","department":"Editing","job":"First Assistant Editor"},{"adult":false,"gender":0,"id":89291,"known_for_department":"Directing","name":"Nino Aldi","original_name":"Nino Aldi","popularity":0.6,"profile_path":null,"credit_id":"5bcdfa480e0a26016e026cb3","department":"Crew","job":"Set Production Assistant"},{"adult":false,"gender":1,"id":117218,"known_for_department":"Art","name":"Lisa Chugg","original_name":"Lisa Chugg","popularity":0.703,"profile_path":null,"credit_id":"5bcdf975925141613e0228cb","department":"Art","job":"Set Decoration"},{"adult":false,"gender":0,"id":129990,"known_for_department":"Acting","name":"Raymond Yu","original_name":"Raymond Yu","popularity":0.6,"profile_path":null,"credit_id":"5bcdff499251410581000130","department":"Crew","job":"Stand In"},{"adult":false,"gender":0,"id":135935,"known_for_department":"Art","name":"Scott Maginnis","original_name":"Scott Maginnis","popularity":1.273,"profile_path":null,"credit_id":"5bcdf3a40e0a2601620273a6","department":"Art","job":"Property Master"},{"adult":false,"gender":2,"id":138618,"known_for_department":"Sound","name":"Gary Rizzo","original_name":"Gary Rizzo","popularity":1.014,"profile_path":"/7FI3p2EeofGru26XD8bNpCjNLt1.jpg","credit_id":"5b24c590c3a36841e400417b","department":"Sound","job":"Sound Re-Recording Mixer"},{"adult":false,"gender":2,"id":159112,"known_for_department":"Editing","name":"David Orr","original_name":"David Orr","popularity":0.6,"profile_path":null,"credit_id":"5bcdd87e925141612d0232b5","department":"Editing","job":"Color Timer"},{"adult":false,"gender":1,"id":200465,"known_for_department":"Crew","name":"Diana R. Lupo","original_name":"Diana R. Lupo","popularity":4.345,"profile_path":"/dv5OWTfTyChhT9eWJhEmO1EENQ0.jpg","credit_id":"5be120189251414df8003d43","department":"Crew","job":"Stunts"},{"adult":false,"gender":2,"id":419327,"known_for_department":"Acting","name":"Johnny Marr","original_name":"Johnny Marr","popularity":0.84,"profile_path":"/vJESfF4XvN99aBXHgoxj1gTrEAj.jpg","credit_id":"5bcdecd4925141612d024a8a","department":"Sound","job":"Musician"},{"adult":false,"gender":0,"id":578724,"known_for_department":"Costume & Make-Up","name":"Stacy Kelly","original_name":"Stacy Kelly","popularity":1.719,"profile_path":null,"credit_id":"5bcdd5f4925141613b020c68","department":"Production","job":"Producer's Assistant"},{"adult":false,"gender":0,"id":589942,"known_for_department":"Costume & Make-Up","name":"Terry Baliel","original_name":"Terry Baliel","popularity":0.6,"profile_path":null,"credit_id":"5bcde513c3a368286d027db2","department":"Costume & Make-Up","job":"Key Hair Stylist"},{"adult":false,"gender":2,"id":929145,"known_for_department":"Sound","name":"Lorne Balfe","original_name":"Lorne Balfe","popularity":5.352,"profile_path":"/lHAhZC9RAUYtjhKDokKYyNNitLz.jpg","credit_id":"5bcdd8b3c3a3682863025a3d","department":"Crew","job":"Additional Music"},{"adult":false,"gender":2,"id":930532,"known_for_department":"Art","name":"Andy Thomson","original_name":"Andy Thomson","popularity":1.4,"profile_path":null,"credit_id":"5bcdd394925141612a0213fb","department":"Art","job":"Art Direction"},{"adult":false,"gender":2,"id":962164,"known_for_department":"Art","name":"Jason Knox-Johnston","original_name":"Jason Knox-Johnston","popularity":1.019,"profile_path":null,"credit_id":"5bcdd3a10e0a26015b0237ff","department":"Art","job":"Art Direction"},{"adult":false,"gender":1,"id":962165,"known_for_department":"Costume & Make-Up","name":"Nancy Thompson","original_name":"Nancy Thompson","popularity":0.6,"profile_path":null,"credit_id":"5bcdf936925141613e022879","department":"Costume & Make-Up","job":"Set Costumer"},{"adult":false,"gender":2,"id":969743,"known_for_department":"Art","name":"Dean Wolcott","original_name":"Dean Wolcott","popularity":1.757,"profile_path":null,"credit_id":"52fe4534c3a368484e04de83","department":"Art","job":"Art Direction"},{"adult":false,"gender":2,"id":1018001,"known_for_department":"Sound","name":"Bruce White","original_name":"Bruce White","popularity":0.678,"profile_path":null,"credit_id":"5bcdecf0925141612a022d95","department":"Sound","job":"Musician"},{"adult":false,"gender":0,"id":1032069,"known_for_department":"Production","name":"Mark Mostyn","original_name":"Mark Mostyn","popularity":1.011,"profile_path":null,"credit_id":"5bce05a00e0a265d440008ee","department":"Production","job":"Unit Production Manager"},{"adult":false,"gender":2,"id":1050930,"known_for_department":"Sound","name":"Hugo Weng","original_name":"Hugo Weng","popularity":0.792,"profile_path":null,"credit_id":"5bcddc3692514161260221e5","department":"Sound","job":"Dialogue Editor"},{"adult":false,"gender":0,"id":1050932,"known_for_department":"Costume & Make-Up","name":"Cheri Reed","original_name":"Cheri Reed","popularity":0.98,"profile_path":null,"credit_id":"5bcddbecc3a3682870026945","department":"Costume & Make-Up","job":"Costumer"},{"adult":false,"gender":0,"id":1056606,"known_for_department":"Camera","name":"Brian Kobo","original_name":"Brian Kobo","popularity":0.828,"profile_path":null,"credit_id":"5bcdf1c60e0a260151026421","department":"Production","job":"Production Coordinator"},{"adult":false,"gender":0,"id":1081073,"known_for_department":"Visual Effects","name":"Chris Corbould","original_name":"Chris Corbould","popularity":1.4,"profile_path":"/7cDAsWc7vcgZ2EdPxu3N5KJ0Mfl.jpg","credit_id":"5b24c6fa9251410d45003405","department":"Visual Effects","job":"Special Effects Supervisor"},{"adult":false,"gender":2,"id":1081488,"known_for_department":"Crew","name":"Doug Chapman","original_name":"Doug Chapman","popularity":2.35,"profile_path":"/woJlBx2I4Hv1nKkC8f1G5cXqvXu.jpg","credit_id":"635e4e08b87aec0079092499","department":"Crew","job":"Stunts"},{"adult":false,"gender":2,"id":1105644,"known_for_department":"Sound","name":"Diego Stocco","original_name":"Diego Stocco","popularity":1.094,"profile_path":null,"credit_id":"5bcdc3f10e0a26016b023804","department":"Crew","job":"Thanks"},{"adult":false,"gender":2,"id":1116937,"known_for_department":"Sound","name":"John Roesch","original_name":"John Roesch","popularity":1.106,"profile_path":null,"credit_id":"5bcde2710e0a260151024edd","department":"Sound","job":"Foley Artist"},{"adult":false,"gender":2,"id":1133968,"known_for_department":"Sound","name":"Matt Dunkley","original_name":"Matt Dunkley","popularity":1.207,"profile_path":"/7NE9BflY3sri76hQ6P84NAUs1Dl.jpg","credit_id":"5bcdd8f9925141613e0200e2","department":"Sound","job":"Conductor"},{"adult":false,"gender":0,"id":1151457,"known_for_department":"Art","name":"Hélène Dubreuil","original_name":"Hélène Dubreuil","popularity":0.6,"profile_path":null,"credit_id":"5bcdf96e9251416126024419","department":"Art","job":"Set Decoration"},{"adult":false,"gender":0,"id":1155668,"known_for_department":"Visual Effects","name":"Mike Chambers","original_name":"Mike Chambers","popularity":0.6,"profile_path":null,"credit_id":"5bce174fc3a3683d5a002295","department":"Visual Effects","job":"Visual Effects Producer"},{"adult":false,"gender":1,"id":1172414,"known_for_department":"Camera","name":"Melissa Moseley","original_name":"Melissa Moseley","popularity":1.4,"profile_path":null,"credit_id":"5bcdff64925141056f000235","department":"Camera","job":"Still Photographer"},{"adult":false,"gender":0,"id":1188581,"known_for_department":"Production","name":"Gilles Castera","original_name":"Gilles Castera","popularity":0.6,"profile_path":null,"credit_id":"5bcdf21cc3a36828700289e7","department":"Production","job":"Production Manager"},{"adult":false,"gender":0,"id":1205126,"known_for_department":"Costume & Make-Up","name":"Patricia Colin","original_name":"Patricia Colin","popularity":0.754,"profile_path":null,"credit_id":"5bce06490e0a265d390009c3","department":"Costume & Make-Up","job":"Wardrobe Supervisor"},{"adult":false,"gender":0,"id":1260602,"known_for_department":"Art","name":"William Eliscu","original_name":"William Eliscu","popularity":0.98,"profile_path":null,"credit_id":"5bcde2c49251416131023d5d","department":"Art","job":"Graphic Designer"},{"adult":false,"gender":0,"id":1268079,"known_for_department":"Production","name":"Josh Elwell","original_name":"Josh Elwell","popularity":0.6,"profile_path":null,"credit_id":"5bcdefb29251416131024d78","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":1270040,"known_for_department":"Costume & Make-Up","name":"Essouci Zakia","original_name":"Essouci Zakia","popularity":0.6,"profile_path":null,"credit_id":"5bce063dc3a3683d63000a71","department":"Costume & Make-Up","job":"Wardrobe Assistant"},{"adult":false,"gender":0,"id":1271644,"known_for_department":"Art","name":"Guy Hendrix Dyas","original_name":"Guy Hendrix Dyas","popularity":1.4,"profile_path":null,"credit_id":"52fe4534c3a368484e04de71","department":"Art","job":"Production Design"},{"adult":false,"gender":2,"id":1294863,"known_for_department":"Production","name":"Michael David Lynch","original_name":"Michael David Lynch","popularity":0.828,"profile_path":null,"credit_id":"5bcdd09ec3a3682870025a32","department":"Production","job":"Additional Production Assistant"},{"adult":false,"gender":2,"id":1298625,"known_for_department":"Camera","name":"Cory Geryak","original_name":"Cory Geryak","popularity":0.6,"profile_path":null,"credit_id":"5bcdd85ec3a368286d026da7","department":"Lighting","job":"Chief Lighting Technician"},{"adult":false,"gender":0,"id":1299326,"known_for_department":"Art","name":"Matt Wynne","original_name":"Matt Wynne","popularity":0.98,"profile_path":null,"credit_id":"5bcddc8692514161310235fe","department":"Art","job":"Draughtsman"},{"adult":false,"gender":0,"id":1319160,"known_for_department":"Costume & Make-Up","name":"Ken Crouch","original_name":"Ken Crouch","popularity":0.6,"profile_path":null,"credit_id":"5bcddb9a9251416134021e8a","department":"Costume & Make-Up","job":"Costume Supervisor"},{"adult":false,"gender":0,"id":1322015,"known_for_department":"Costume & Make-Up","name":"Luisa Abel","original_name":"Luisa Abel","popularity":0.6,"profile_path":null,"credit_id":"5bcded790e0a26016e02573b","department":"Costume & Make-Up","job":"Makeup Department Head"},{"adult":false,"gender":0,"id":1322016,"known_for_department":"Costume & Make-Up","name":"Bob Morgan","original_name":"Bob Morgan","popularity":0.6,"profile_path":null,"credit_id":"5bcddba2c3a3682873023ac7","department":"Costume & Make-Up","job":"Costume Supervisor"},{"adult":false,"gender":0,"id":1323769,"known_for_department":"Art","name":"Phillip Boutte Jr.","original_name":"Phillip Boutte Jr.","popularity":0.6,"profile_path":null,"credit_id":"5bcdd9e80e0a26016e02413a","department":"Costume & Make-Up","job":"Costume Illustrator"},{"adult":false,"gender":1,"id":1327030,"known_for_department":"Sound","name":"Lora Hirschberg","original_name":"Lora Hirschberg","popularity":0.625,"profile_path":"/gL4qn7THQn33BgSN2H4jRfuJJbU.jpg","credit_id":"5b24c57e9251410d540034e9","department":"Sound","job":"Sound Re-Recording Mixer"},{"adult":false,"gender":0,"id":1333087,"known_for_department":"Costume & Make-Up","name":"Jeffrey Fayle","original_name":"Jeffrey Fayle","popularity":0.652,"profile_path":null,"credit_id":"5bcddb8e0e0a260151024763","department":"Costume & Make-Up","job":"Costume Set Supervisor"},{"adult":false,"gender":0,"id":1334492,"known_for_department":"Crew","name":"Thomas Jones","original_name":"Thomas Jones","popularity":0.6,"profile_path":null,"credit_id":"5bcdf46d925141612d02566c","department":"Art","job":"Props"},{"adult":false,"gender":0,"id":1334493,"known_for_department":"Art","name":"Sarah Robinson","original_name":"Sarah Robinson","popularity":0.6,"profile_path":null,"credit_id":"5bcdd9dcc3a3682863025bd9","department":"Costume & Make-Up","job":"Costume Coordinator"},{"adult":false,"gender":0,"id":1335570,"known_for_department":"Crew","name":"Steven Brigden","original_name":"Steven Brigden","popularity":0.6,"profile_path":null,"credit_id":"5bce04e40e0a265d40000862","department":"Crew","job":"Transportation Coordinator"},{"adult":false,"gender":0,"id":1337414,"known_for_department":"Visual Effects","name":"Richard Bain","original_name":"Richard Bain","popularity":0.6,"profile_path":null,"credit_id":"5bce103a0e0a265d35001fb4","department":"Crew","job":"Compositor"},{"adult":false,"gender":0,"id":1339455,"known_for_department":"Costume & Make-Up","name":"David Fernandez","original_name":"David Fernandez","popularity":0.6,"profile_path":null,"credit_id":"5bcdf8f79251416134024090","department":"Costume & Make-Up","job":"Set Costumer"},{"adult":false,"gender":0,"id":1340318,"known_for_department":"Sound","name":"Paul Berolzheimer","original_name":"Paul Berolzheimer","popularity":0.6,"profile_path":null,"credit_id":"5bcdfb6b925141612a02407b","department":"Sound","job":"Sound Effects Editor"},{"adult":false,"gender":0,"id":1340769,"known_for_department":"Crew","name":"Khalid Ameskane","original_name":"Khalid Ameskane","popularity":0.6,"profile_path":null,"credit_id":"5bce04bcc3a3683d58000945","department":"Crew","job":"Transportation Captain"},{"adult":false,"gender":2,"id":1341403,"known_for_department":"Sound","name":"Richard King","original_name":"Richard King","popularity":0.6,"profile_path":"/hjOLOjY0SIs17TxXvzb2HwIpguX.jpg","credit_id":"5b24c4860e0a261e18002cd1","department":"Sound","job":"Sound Designer"},{"adult":false,"gender":2,"id":1341786,"known_for_department":"Sound","name":"Bryan O. Watkins","original_name":"Bryan O. Watkins","popularity":0.6,"profile_path":"/fapThJOs1Xq7y7xYJKp930ZPfog.jpg","credit_id":"5bcdfb7a9251416138022adb","department":"Sound","job":"Sound Effects Editor"},{"adult":false,"gender":0,"id":1343872,"known_for_department":"Acting","name":"Omar Benbrahim","original_name":"Omar Benbrahim","popularity":0.6,"profile_path":null,"credit_id":"5bcdfa5ac3a3682863028726","department":"Crew","job":"Set Production Assistant"},{"adult":false,"gender":0,"id":1354919,"known_for_department":"Crew","name":"Sophie Tarver","original_name":"Sophie Tarver","popularity":0.6,"profile_path":null,"credit_id":"5bcdf3dfc3a3682876021eac","department":"Crew","job":"Propmaker"},{"adult":false,"gender":0,"id":1357047,"known_for_department":"Art","name":"Aric Cheng","original_name":"Aric Cheng","popularity":0.6,"profile_path":null,"credit_id":"5bcdf98b9251416134024143","department":"Art","job":"Set Designer"},{"adult":false,"gender":0,"id":1357062,"known_for_department":"Crew","name":"Scott R. Fisher","original_name":"Scott R. Fisher","popularity":0.6,"profile_path":null,"credit_id":"5bcdfd1292514161340245fa","department":"Crew","job":"Special Effects Coordinator"},{"adult":false,"gender":0,"id":1357064,"known_for_department":"Camera","name":"Greg Baldi","original_name":"Greg Baldi","popularity":0.6,"profile_path":null,"credit_id":"5bcdd65fc3a36828730235a1","department":"Camera","job":"Camera Operator"},{"adult":false,"gender":0,"id":1357070,"known_for_department":"Crew","name":"Denny Caira","original_name":"Denny Caira","popularity":0.694,"profile_path":null,"credit_id":"5bce04eb9251410577000848","department":"Crew","job":"Transportation Coordinator"},{"adult":false,"gender":2,"id":1367508,"known_for_department":"Directing","name":"Steve Gehrke","original_name":"Steve Gehrke","popularity":1.13,"profile_path":null,"credit_id":"5bcdf7b80e0a26015b026657","department":"Directing","job":"Script Supervisor"},{"adult":false,"gender":0,"id":1372882,"known_for_department":"Crew","name":"Derrick Mitchell","original_name":"Derrick Mitchell","popularity":0.6,"profile_path":null,"credit_id":"5bce1717c3a3683d6f002062","department":"Crew","job":"Visual Effects Editor"},{"adult":false,"gender":0,"id":1373708,"known_for_department":"Art","name":"Pollyanna Seath","original_name":"Pollyanna Seath","popularity":0.6,"profile_path":null,"credit_id":"5bcdf156c3a3682866027f2b","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":1377222,"known_for_department":"Sound","name":"Michael W. Mitchell","original_name":"Michael W. Mitchell","popularity":0.6,"profile_path":null,"credit_id":"5bcdfb730e0a260162027d53","department":"Sound","job":"Sound Effects Editor"},{"adult":false,"gender":0,"id":1378726,"known_for_department":"Crew","name":"Francie Brown","original_name":"Francie Brown","popularity":0.6,"profile_path":null,"credit_id":"5bcddc2c0e0a26015f024931","department":"Crew","job":"Dialect Coach"},{"adult":false,"gender":2,"id":1379517,"known_for_department":"Crew","name":"Craig Hosking","original_name":"Craig Hosking","popularity":2.995,"profile_path":"/fBAS5WsGgyASXHWve1g5cVI0KXP.jpg","credit_id":"5bcdd15a925141612d022953","department":"Crew","job":"Aerial Coordinator"},{"adult":false,"gender":2,"id":1379517,"known_for_department":"Crew","name":"Craig Hosking","original_name":"Craig Hosking","popularity":2.995,"profile_path":"/fBAS5WsGgyASXHWve1g5cVI0KXP.jpg","credit_id":"5bcdd1630e0a260162024559","department":"Crew","job":"Pilot"},{"adult":false,"gender":0,"id":1386906,"known_for_department":"Art","name":"Jonas Kirk","original_name":"Jonas Kirk","popularity":0.785,"profile_path":null,"credit_id":"5bcdd91c0e0a260168024f4d","department":"Art","job":"Construction Coordinator"},{"adult":false,"gender":0,"id":1387215,"known_for_department":"Art","name":"Zachary Fannin","original_name":"Zachary Fannin","popularity":0.6,"profile_path":null,"credit_id":"5bcde2cf0e0a260168025a51","department":"Art","job":"Graphic Designer"},{"adult":false,"gender":0,"id":1388848,"known_for_department":"Art","name":"Jim Barr","original_name":"Jim Barr","popularity":0.6,"profile_path":"/myLNBZXXESp1YzDkBoKQX8g4Yup.jpg","credit_id":"5bcdf9830e0a260151026e4f","department":"Art","job":"Set Designer"},{"adult":false,"gender":0,"id":1388860,"known_for_department":"Art","name":"Matt Sims","original_name":"Matt Sims","popularity":0.828,"profile_path":null,"credit_id":"5bcdd3f8925141612a021461","department":"Art","job":"Assistant Art Director"},{"adult":false,"gender":2,"id":1390368,"known_for_department":"Camera","name":"Graham Hall","original_name":"Graham Hall","popularity":0.6,"profile_path":null,"credit_id":"5bcdd6880e0a260168024bf8","department":"Camera","job":"\"B\" Camera Operator"},{"adult":false,"gender":2,"id":1392095,"known_for_department":"Visual Effects","name":"Ian Hunter","original_name":"Ian Hunter","popularity":0.6,"profile_path":"/juxFhxXVBWaqu80S6hCwGVZEuml.jpg","credit_id":"5bce18090e0a265d2b0025fe","department":"Visual Effects","job":"Visual Effects"},{"adult":false,"gender":1,"id":1394117,"known_for_department":"Art","name":"Jennifer Lewicki","original_name":"Jennifer Lewicki","popularity":1.025,"profile_path":null,"credit_id":"5bcdd368c3a368286d026757","department":"Art","job":"Art Department Coordinator"},{"adult":false,"gender":0,"id":1394305,"known_for_department":"Costume & Make-Up","name":"Philip Goldsworthy","original_name":"Philip Goldsworthy","popularity":0.694,"profile_path":null,"credit_id":"5bcdf9130e0a26015b026805","department":"Costume & Make-Up","job":"Set Costumer"},{"adult":false,"gender":2,"id":1394415,"known_for_department":"Art","name":"Paul Laugier","original_name":"Paul Laugier","popularity":1.4,"profile_path":null,"credit_id":"5bcdd386c3a368286d02677e","department":"Art","job":"Art Direction"},{"adult":false,"gender":0,"id":1394445,"known_for_department":"Visual Effects","name":"David Sanger","original_name":"David Sanger","popularity":1.4,"profile_path":null,"credit_id":"5bce18120e0a265d400026fc","department":"Visual Effects","job":"Visual Effects"},{"adult":false,"gender":0,"id":1394739,"known_for_department":"Art","name":"Charlotte Raybourn","original_name":"Charlotte Raybourn","popularity":0.98,"profile_path":null,"credit_id":"5bcdd370925141613e01f9e0","department":"Art","job":"Art Department Coordinator"},{"adult":false,"gender":1,"id":1394956,"known_for_department":"Visual Effects","name":"Shannon Blake Gans","original_name":"Shannon Blake Gans","popularity":1.22,"profile_path":null,"credit_id":"5bce17fb925141056f0022ed","department":"Visual Effects","job":"Visual Effects"},{"adult":false,"gender":0,"id":1395432,"known_for_department":"Art","name":"Forest P. Fischer","original_name":"Forest P. Fischer","popularity":0.6,"profile_path":null,"credit_id":"5bce187b0e0a265d3c0024a7","department":"Visual Effects","job":"Visual Effects"},{"adult":false,"gender":0,"id":1395437,"known_for_department":"Art","name":"J. Bryan Holloway","original_name":"J. Bryan Holloway","popularity":0.6,"profile_path":null,"credit_id":"5bcdffb092514105770001e1","department":"Art","job":"Sculptor"},{"adult":false,"gender":1,"id":1397823,"known_for_department":"Sound","name":"Alyson Dee Moore","original_name":"Alyson Dee Moore","popularity":1.263,"profile_path":null,"credit_id":"5bcde2680e0a26015b0247ae","department":"Sound","job":"Foley Artist"},{"adult":false,"gender":0,"id":1398083,"known_for_department":"Art","name":"Abdellah Baadil","original_name":"Abdellah Baadil","popularity":0.6,"profile_path":null,"credit_id":"5bcdd3df925141613801fab5","department":"Art","job":"Assistant Art Director"},{"adult":false,"gender":2,"id":1398972,"known_for_department":"Camera","name":"Pete Romano","original_name":"Pete Romano","popularity":3.225,"profile_path":null,"credit_id":"5bce05370e0a265d400008ba","department":"Camera","job":"Underwater Director of Photography"},{"adult":false,"gender":2,"id":1399063,"known_for_department":"Visual Effects","name":"Rob Hodgson","original_name":"Rob Hodgson","popularity":0.6,"profile_path":null,"credit_id":"5bce17b90e0a265d390024f6","department":"Visual Effects","job":"Visual Effects Supervisor"},{"adult":false,"gender":2,"id":1399071,"known_for_department":"Camera","name":"Hans Bjerno","original_name":"Hans Bjerno","popularity":0.602,"profile_path":null,"credit_id":"5bcdd309925141613801fa13","department":"Camera","job":"Aerial Director of Photography"},{"adult":false,"gender":0,"id":1399322,"known_for_department":"Costume & Make-Up","name":"Elizabeth Frank","original_name":"Elizabeth Frank","popularity":0.84,"profile_path":null,"credit_id":"5bcdf909925141612d025c46","department":"Costume & Make-Up","job":"Set Costumer"},{"adult":false,"gender":0,"id":1400087,"known_for_department":"Costume & Make-Up","name":"Sean Haley","original_name":"Sean Haley","popularity":0.6,"profile_path":null,"credit_id":"5bcdf91a0e0a260162027ae6","department":"Costume & Make-Up","job":"Set Costumer"},{"adult":false,"gender":0,"id":1400089,"known_for_department":"Production","name":"Sam Breckman","original_name":"Sam Breckman","popularity":0.652,"profile_path":null,"credit_id":"5bcdf2240e0a2601640259fc","department":"Production","job":"Production Manager"},{"adult":false,"gender":0,"id":1400478,"known_for_department":"Costume & Make-Up","name":"Sarah Monfort","original_name":"Sarah Monfort","popularity":0.6,"profile_path":null,"credit_id":"5bcdd9d3c3a3682873023923","department":"Costume & Make-Up","job":"Costume Assistant"},{"adult":false,"gender":1,"id":1400527,"known_for_department":"Production","name":"Katherine Tibbetts","original_name":"Katherine Tibbetts","popularity":0.6,"profile_path":null,"credit_id":"5bcdf1afc3a3682876021c2a","department":"Production","job":"Production Coordinator"},{"adult":false,"gender":0,"id":1400539,"known_for_department":"Crew","name":"Amanda Brand","original_name":"Amanda Brand","popularity":0.6,"profile_path":null,"credit_id":"5bce05a80e0a265d440008fc","department":"Crew","job":"Unit Publicist"},{"adult":false,"gender":1,"id":1402015,"known_for_department":"Costume & Make-Up","name":"Kathryn Blondell","original_name":"Kathryn Blondell","popularity":0.602,"profile_path":null,"credit_id":"5bcde49ac3a36828730243ab","department":"Costume & Make-Up","job":"Hairstylist"},{"adult":false,"gender":0,"id":1402920,"known_for_department":"Costume & Make-Up","name":"Sharon O'Brien","original_name":"Sharon O'Brien","popularity":0.6,"profile_path":null,"credit_id":"5bcde51b0e0a26015f025352","department":"Costume & Make-Up","job":"Key Hair Stylist"},{"adult":false,"gender":0,"id":1403434,"known_for_department":"Art","name":"Brett C. Smith","original_name":"Brett C. Smith","popularity":1.38,"profile_path":null,"credit_id":"5bcdf9f4925141613e022962","department":"Art","job":"Set Dresser"},{"adult":false,"gender":2,"id":1403490,"known_for_department":"Sound","name":"Alex Gibson","original_name":"Alex Gibson","popularity":0.6,"profile_path":null,"credit_id":"5bcdffa50e0a265d2d00019a","department":"Sound","job":"Supervising Music Editor"},{"adult":false,"gender":0,"id":1403554,"known_for_department":"Crew","name":"Otniel Gonzalez","original_name":"Otniel Gonzalez","popularity":0.6,"profile_path":null,"credit_id":"5bcdd32b925141613801fa2c","department":"Crew","job":"Armorer"},{"adult":false,"gender":2,"id":1403708,"known_for_department":"Lighting","name":"Abderrahim Bissar","original_name":"Abderrahim Bissar","popularity":1.96,"profile_path":null,"credit_id":"5bcde10c0e0a260162025895","department":"Lighting","job":"Electrician"},{"adult":false,"gender":0,"id":1405423,"known_for_department":"Crew","name":"Mounir Badia","original_name":"Mounir Badia","popularity":0.6,"profile_path":null,"credit_id":"5bcdeeb80e0a26016402559f","department":"Crew","job":"Picture Car Coordinator"},{"adult":false,"gender":0,"id":1406105,"known_for_department":"Crew","name":"Steve Rhee","original_name":"Steve Rhee","popularity":0.606,"profile_path":null,"credit_id":"5bce169e9251410571001eb4","department":"Visual Effects","job":"Visual Effects Assistant Editor"},{"adult":false,"gender":0,"id":1406389,"known_for_department":"Sound","name":"Bruce Tanis","original_name":"Bruce Tanis","popularity":0.6,"profile_path":null,"credit_id":"5bcde279925141612a02221d","department":"Sound","job":"Foley Editor"},{"adult":false,"gender":0,"id":1406837,"known_for_department":"Visual Effects","name":"Matthew Plummer","original_name":"Matthew Plummer","popularity":0.98,"profile_path":null,"credit_id":"5bce175a925141056f0021b0","department":"Visual Effects","job":"Visual Effects Producer"},{"adult":false,"gender":2,"id":1406844,"known_for_department":"Lighting","name":"Jean-François Drigeard","original_name":"Jean-François Drigeard","popularity":1.4,"profile_path":null,"credit_id":"5bcde2a59251416138020a87","department":"Lighting","job":"Gaffer"},{"adult":false,"gender":0,"id":1406845,"known_for_department":"Lighting","name":"Brahim Amarak","original_name":"Brahim Amarak","popularity":0.6,"profile_path":null,"credit_id":"5bcde293c3a368285e022891","department":"Lighting","job":"Gaffer"},{"adult":false,"gender":0,"id":1406850,"known_for_department":"Crew","name":"Maxime Couteret","original_name":"Maxime Couteret","popularity":0.694,"profile_path":null,"credit_id":"5bce04f40e0a265d4400081f","department":"Crew","job":"Transportation Coordinator"},{"adult":false,"gender":0,"id":1407867,"known_for_department":"Crew","name":"James Starr","original_name":"James Starr","popularity":0.6,"profile_path":null,"credit_id":"5bcdfb37925141613e022a81","department":"Crew","job":"Set Runner"},{"adult":false,"gender":0,"id":1408347,"known_for_department":"Visual Effects","name":"Pete Bebb","original_name":"Pete Bebb","popularity":0.98,"profile_path":null,"credit_id":"5b24c71d9251410d580036bb","department":"Visual Effects","job":"Visual Effects Supervisor"},{"adult":false,"gender":0,"id":1408384,"known_for_department":"Visual Effects","name":"Charlie Noble","original_name":"Charlie Noble","popularity":0.63,"profile_path":null,"credit_id":"5bce1019c3a3683d730018c9","department":"Crew","job":"Compositor"},{"adult":false,"gender":0,"id":1408386,"known_for_department":"Crew","name":"Stuart Farley","original_name":"Stuart Farley","popularity":0.6,"profile_path":null,"credit_id":"5bce0f610e0a265d2b0017cc","department":"Crew","job":"CG Supervisor"},{"adult":false,"gender":0,"id":1412185,"known_for_department":"Costume & Make-Up","name":"Jay Wejebe","original_name":"Jay Wejebe","popularity":0.72,"profile_path":null,"credit_id":"5bcde526c3a3682870027500","department":"Costume & Make-Up","job":"Key Makeup Artist"},{"adult":false,"gender":0,"id":1412199,"known_for_department":"Crew","name":"John J. Downey","original_name":"John J. Downey","popularity":0.6,"profile_path":null,"credit_id":"5bcdfd3bc3a368286d02a2df","department":"Crew","job":"Special Effects Technician"},{"adult":false,"gender":0,"id":1412476,"known_for_department":"Costume & Make-Up","name":"Aya Yabuuchi","original_name":"Aya Yabuuchi","popularity":0.6,"profile_path":null,"credit_id":"5bcded51c3a368286d0289c8","department":"Costume & Make-Up","job":"Makeup Artist"},{"adult":false,"gender":2,"id":1413036,"known_for_department":"Lighting","name":"Andy Long","original_name":"Andy Long","popularity":0.6,"profile_path":null,"credit_id":"5bcde2ad0e0a260162025a80","department":"Lighting","job":"Gaffer"},{"adult":false,"gender":0,"id":1414174,"known_for_department":"Art","name":"Scott Bobbitt","original_name":"Scott Bobbitt","popularity":0.6,"profile_path":null,"credit_id":"5bcde713c3a368287002771d","department":"Art","job":"Leadman"},{"adult":false,"gender":0,"id":1415463,"known_for_department":"Sound","name":"Scott R. Lewis","original_name":"Scott R. Lewis","popularity":0.98,"profile_path":null,"credit_id":"5bcdedd0c3a368286a0292a2","department":"Sound","job":"Sound Mix Technician"},{"adult":false,"gender":0,"id":1415506,"known_for_department":"Costume & Make-Up","name":"Shelli Nishino","original_name":"Shelli Nishino","popularity":0.6,"profile_path":null,"credit_id":"5bcddbd7c3a36828660260e8","department":"Costume & Make-Up","job":"Costumer"},{"adult":false,"gender":0,"id":1417398,"known_for_department":"Costume & Make-Up","name":"Janice Alexander","original_name":"Janice Alexander","popularity":0.6,"profile_path":null,"credit_id":"5bcde46b0e0a260168025c13","department":"Costume & Make-Up","job":"Hair Department Head"},{"adult":false,"gender":0,"id":1417406,"known_for_department":"Production","name":"Michael Murray","original_name":"Michael Murray","popularity":0.6,"profile_path":null,"credit_id":"5bcdf2130e0a26015f0266ed","department":"Production","job":"Production Manager"},{"adult":false,"gender":0,"id":1417407,"known_for_department":"Production","name":"Thomas Hayslip","original_name":"Thomas Hayslip","popularity":0.84,"profile_path":null,"credit_id":"5bcdd6160e0a26015f024237","department":"Production","job":"Associate Producer"},{"adult":false,"gender":0,"id":1417514,"known_for_department":"Sound","name":"Michael Babcock","original_name":"Michael Babcock","popularity":1.448,"profile_path":null,"credit_id":"5bcdd0fe0e0a26015f023c89","department":"Sound","job":"Additional Sound Re-Recording Mixer"},{"adult":false,"gender":0,"id":1417823,"known_for_department":"Crew","name":"Steve Miller","original_name":"Steve Miller","popularity":1.38,"profile_path":null,"credit_id":"5bce170cc3a3683d69002003","department":"Crew","job":"Visual Effects Editor"},{"adult":false,"gender":0,"id":1417826,"known_for_department":"Visual Effects","name":"Paul J. Franklin","original_name":"Paul J. Franklin","popularity":0.6,"profile_path":null,"credit_id":"5b24c72f9251410d580036c4","department":"Visual Effects","job":"Visual Effects Supervisor"},{"adult":false,"gender":0,"id":1417827,"known_for_department":"Crew","name":"Nicola Hoyle","original_name":"Nicola Hoyle","popularity":0.6,"profile_path":null,"credit_id":"5bce13140e0a265d40001e1a","department":"Visual Effects","job":"VFX Supervisor"},{"adult":false,"gender":0,"id":1417828,"known_for_department":"Visual Effects","name":"Andrew Lockley","original_name":"Andrew Lockley","popularity":1.166,"profile_path":null,"credit_id":"5b24c70c92514152990022e7","department":"Visual Effects","job":"Visual Effects Supervisor"},{"adult":false,"gender":0,"id":1417829,"known_for_department":"Crew","name":"Alison Wortman","original_name":"Alison Wortman","popularity":0.6,"profile_path":null,"credit_id":"5bce0f9f9251410581001772","department":"Crew","job":"CG Supervisor"},{"adult":false,"gender":2,"id":1417834,"known_for_department":"Camera","name":"Dane Bjerno","original_name":"Dane Bjerno","popularity":0.648,"profile_path":null,"credit_id":"5bcdd13d0e0a26016b024a38","department":"Camera","job":"Aerial Camera Technician"},{"adult":false,"gender":0,"id":1417835,"known_for_department":"Lighting","name":"Ian Franklin","original_name":"Ian Franklin","popularity":0.6,"profile_path":null,"credit_id":"5bcdf74c0e0a26015f026e49","department":"Lighting","job":"Rigging Gaffer"},{"adult":false,"gender":2,"id":1417840,"known_for_department":"Editing","name":"Eric A. Lewy","original_name":"Eric A. Lewy","popularity":0.6,"profile_path":null,"credit_id":"5bcde23d0e0a26016b025cc9","department":"Editing","job":"First Assistant Editor"},{"adult":false,"gender":0,"id":1417841,"known_for_department":"Sound","name":"Ryan Rubin","original_name":"Ryan Rubin","popularity":1.38,"profile_path":null,"credit_id":"5bcdee0cc3a3682863027598","department":"Sound","job":"Music Editor"},{"adult":false,"gender":0,"id":1417843,"known_for_department":"Crew","name":"Tyler W. Gaisford","original_name":"Tyler W. Gaisford","popularity":0.728,"profile_path":null,"credit_id":"5bcdeec00e0a260162026c3e","department":"Crew","job":"Picture Car Coordinator"},{"adult":false,"gender":2,"id":1420326,"known_for_department":"Camera","name":"Daniel C. McFadden","original_name":"Daniel C. McFadden","popularity":0.6,"profile_path":null,"credit_id":"5bcdd40d925141612d022c46","department":"Camera","job":"Assistant Camera"},{"adult":false,"gender":1,"id":1420643,"known_for_department":"Costume & Make-Up","name":"Heather Moore","original_name":"Heather Moore","popularity":0.6,"profile_path":null,"credit_id":"5bcdf929c3a36828630285dc","department":"Costume & Make-Up","job":"Set Costumer"},{"adult":false,"gender":0,"id":1422420,"known_for_department":"Crew","name":"Robert E. Dingle","original_name":"Robert E. Dingle","popularity":0.6,"profile_path":null,"credit_id":"5bcddd12c3a368286d027466","department":"Crew","job":"Driver"},{"adult":false,"gender":0,"id":1422795,"known_for_department":"Costume & Make-Up","name":"Sian Grigg","original_name":"Sian Grigg","popularity":0.783,"profile_path":null,"credit_id":"5bcded6e925141612d024b6a","department":"Costume & Make-Up","job":"Makeup Artist"},{"adult":false,"gender":0,"id":1422985,"known_for_department":"Crew","name":"Ali Bakkioui","original_name":"Ali Bakkioui","popularity":0.6,"profile_path":null,"credit_id":"5bce04d90e0a265d35000e15","department":"Crew","job":"Transportation Coordinator"},{"adult":false,"gender":0,"id":1425530,"known_for_department":"Costume & Make-Up","name":"John Norster","original_name":"John Norster","popularity":0.6,"profile_path":null,"credit_id":"5bcdd4de0e0a26015f0240a7","department":"Costume & Make-Up","job":"Assistant Costume Designer"},{"adult":false,"gender":0,"id":1425547,"known_for_department":"Crew","name":"Gurel Mehmet","original_name":"Gurel Mehmet","popularity":0.6,"profile_path":null,"credit_id":"5bce16310e0a265d2d00212a","department":"Crew","job":"Visual Effects Art Director"},{"adult":false,"gender":0,"id":1425550,"known_for_department":"Crew","name":"Peter Olliff","original_name":"Peter Olliff","popularity":0.6,"profile_path":null,"credit_id":"5bce16ce92514105870021fb","department":"Visual Effects","job":"Visual Effects Coordinator"},{"adult":false,"gender":0,"id":1425828,"known_for_department":"Camera","name":"Brooks Robinson","original_name":"Brooks Robinson","popularity":0.6,"profile_path":null,"credit_id":"5bcdd692c3a36828730235f7","department":"Camera","job":"\"B\" Camera Operator"},{"adult":false,"gender":2,"id":1426727,"known_for_department":"Art","name":"Bill Ives","original_name":"Bill Ives","popularity":1.598,"profile_path":"/mXdUXEo0lwHSFJySeWrbIrbhUwJ.jpg","credit_id":"5bcdd37b925141613402161b","department":"Art","job":"Art Direction"},{"adult":false,"gender":0,"id":1426735,"known_for_department":"Art","name":"Paul Healy","original_name":"Paul Healy","popularity":0.6,"profile_path":null,"credit_id":"5bcdf95c0e0a260151026dfa","department":"Art","job":"Set Decoration"},{"adult":false,"gender":0,"id":1426745,"known_for_department":"Crew","name":"Jason Paradis","original_name":"Jason Paradis","popularity":0.6,"profile_path":null,"credit_id":"5bcdfb4dc3a3682866028cc2","department":"Crew","job":"Special Effects Coordinator"},{"adult":false,"gender":0,"id":1426845,"known_for_department":"Crew","name":"Aleksandar Pejic","original_name":"Aleksandar Pejic","popularity":0.98,"profile_path":null,"credit_id":"5bce0fa6925141058100177d","department":"Crew","job":"CG Supervisor"},{"adult":false,"gender":0,"id":1432024,"known_for_department":"Lighting","name":"Charlie McIntyre","original_name":"Charlie McIntyre","popularity":0.6,"profile_path":null,"credit_id":"5bcdf7550e0a260164026189","department":"Lighting","job":"Rigging Gaffer"},{"adult":false,"gender":0,"id":1440853,"known_for_department":"Editing","name":"Donald Likovich","original_name":"Donald Likovich","popularity":0.867,"profile_path":null,"credit_id":"5bcdd506925141613b020b4a","department":"Editing","job":"Assistant Editor"},{"adult":false,"gender":0,"id":1442172,"known_for_department":"Crew","name":"Charles Heidet","original_name":"Charles Heidet","popularity":0.6,"profile_path":null,"credit_id":"5bcdeec8c3a36828700283d8","department":"Crew","job":"Picture Car Coordinator"},{"adult":false,"gender":1,"id":1445820,"known_for_department":"Costume & Make-Up","name":"Teressa Hill","original_name":"Teressa Hill","popularity":0.6,"profile_path":null,"credit_id":"5bcdca819251416134020a9d","department":"Costume & Make-Up","job":"Additional Hairstylist"},{"adult":false,"gender":2,"id":1446558,"known_for_department":"Sound","name":"Chris Hall","original_name":"Chris Hall","popularity":0.6,"profile_path":null,"credit_id":"5bcdd08d0e0a26016b02483c","department":"Production","job":"Additional Production Assistant"},{"adult":false,"gender":0,"id":1447570,"known_for_department":"Art","name":"Joel Tobman","original_name":"Joel Tobman","popularity":0.6,"profile_path":null,"credit_id":"5bcdf0e8925141612a0232a2","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":1447601,"known_for_department":"Sound","name":"Andrew Bock","original_name":"Andrew Bock","popularity":0.6,"profile_path":null,"credit_id":"5bcde24c925141612d023d9c","department":"Sound","job":"First Assistant Sound Editor"},{"adult":false,"gender":0,"id":1447602,"known_for_department":"Sound","name":"Linda Yeaney","original_name":"Linda Yeaney","popularity":0.6,"profile_path":null,"credit_id":"5bcde254c3a3682863026675","department":"Sound","job":"First Assistant Sound Editor"},{"adult":false,"gender":0,"id":1447603,"known_for_department":"Crew","name":"Dan Neal","original_name":"Dan Neal","popularity":0.6,"profile_path":null,"credit_id":"5bce0f98925141057a001812","department":"Crew","job":"CG Supervisor"},{"adult":false,"gender":0,"id":1447614,"known_for_department":"Visual Effects","name":"Dorian Knapp","original_name":"Dorian Knapp","popularity":0.6,"profile_path":null,"credit_id":"5bce0f3d92514105810016a7","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":0,"id":1447627,"known_for_department":"Lighting","name":"Martin Keough","original_name":"Martin Keough","popularity":0.6,"profile_path":null,"credit_id":"5bcde29b0e0a2601640245b1","department":"Lighting","job":"Gaffer"},{"adult":false,"gender":0,"id":1447633,"known_for_department":"Costume & Make-Up","name":"Kelly Porter","original_name":"Kelly Porter","popularity":1.686,"profile_path":null,"credit_id":"5bcdf93092514161380227cc","department":"Costume & Make-Up","job":"Set Costumer"},{"adult":false,"gender":1,"id":1458115,"known_for_department":"Crew","name":"Leanne Young","original_name":"Leanne Young","popularity":0.6,"profile_path":null,"credit_id":"5bce17220e0a265d44002323","department":"Crew","job":"Visual Effects Editor"},{"adult":false,"gender":0,"id":1463292,"known_for_department":"Directing","name":"Zack Smith","original_name":"Zack Smith","popularity":0.98,"profile_path":null,"credit_id":"5bcde5ab0e0a26015f0253e5","department":"Production","job":"Key Set Production Assistant"},{"adult":false,"gender":2,"id":1463299,"known_for_department":"Crew","name":"Mark Bialuski","original_name":"Mark Bialuski","popularity":0.6,"profile_path":null,"credit_id":"5bcdf3b5c3a3682876021e83","department":"Crew","job":"Propmaker"},{"adult":false,"gender":0,"id":1463354,"known_for_department":"Acting","name":"Steve Rosolio","original_name":"Steve Rosolio","popularity":0.6,"profile_path":null,"credit_id":"5bcdef88c3a3682866027c22","department":"Production","job":"Production Assistant"},{"adult":false,"gender":2,"id":1463384,"known_for_department":"Art","name":"Ben Woodworth","original_name":"Ben Woodworth","popularity":0.6,"profile_path":null,"credit_id":"5bcdeea0c3a3682866027a08","department":"Art","job":"Painter"},{"adult":false,"gender":0,"id":1463571,"known_for_department":"Acting","name":"Terry Marriott","original_name":"Terry Marriott","popularity":0.6,"profile_path":null,"credit_id":"5bce15dcc3a3683d730021e9","department":"Visual Effects","job":"VFX Artist"},{"adult":false,"gender":0,"id":1465952,"known_for_department":"Production","name":"David Campbell-Bell","original_name":"David Campbell-Bell","popularity":0.6,"profile_path":null,"credit_id":"5bce05850e0a265d40000911","department":"Production","job":"Unit Manager"},{"adult":false,"gender":0,"id":1465987,"known_for_department":"Art","name":"Chris Kitisakkul","original_name":"Chris Kitisakkul","popularity":0.6,"profile_path":null,"credit_id":"5bcdd3e7925141613e01fa50","department":"Art","job":"Assistant Art Director"},{"adult":false,"gender":0,"id":1465990,"known_for_department":"Art","name":"Malcolm Roberts","original_name":"Malcolm Roberts","popularity":0.781,"profile_path":null,"credit_id":"5bcdd9260e0a26015f02460c","department":"Art","job":"Construction Coordinator"},{"adult":false,"gender":0,"id":1466007,"known_for_department":"Costume & Make-Up","name":"Ciara McArdle","original_name":"Ciara McArdle","popularity":0.98,"profile_path":null,"credit_id":"5bcdf9210e0a260151026dbb","department":"Costume & Make-Up","job":"Set Costumer"},{"adult":false,"gender":0,"id":1470165,"known_for_department":"Crew","name":"Andrea Pirisi","original_name":"Andrea Pirisi","popularity":0.6,"profile_path":null,"credit_id":"5bce110b925141057a001a1c","department":"Editing","job":"Digital Colorist"},{"adult":false,"gender":0,"id":1472774,"known_for_department":"Art","name":"Rachid Quiat","original_name":"Rachid Quiat","popularity":0.6,"profile_path":null,"credit_id":"5bcdd3efc3a3682873023334","department":"Art","job":"Assistant Art Director"},{"adult":false,"gender":0,"id":1478557,"known_for_department":"Sound","name":"Satnam Ramgotra","original_name":"Satnam Ramgotra","popularity":0.84,"profile_path":"/gGF34lLga6qNZyQf3pvTVXheM2H.jpg","credit_id":"5bcdecdf0e0a260162026947","department":"Sound","job":"Musician"},{"adult":false,"gender":0,"id":1478653,"known_for_department":"Production","name":"Aya Tanimura","original_name":"Aya Tanimura","popularity":0.6,"profile_path":null,"credit_id":"5bcdd5e2c3a36828700261ac","department":"Production","job":"Producer's Assistant"},{"adult":false,"gender":0,"id":1482842,"known_for_department":"Crew","name":"Philippe Leprince","original_name":"Philippe Leprince","popularity":0.6,"profile_path":null,"credit_id":"5bce0f8e92514105770015d1","department":"Crew","job":"CG Supervisor"},{"adult":false,"gender":2,"id":1495958,"known_for_department":"Directing","name":"Gregory J. Pawlik Jr.","original_name":"Gregory J. Pawlik Jr.","popularity":0.766,"profile_path":null,"credit_id":"5bcdf8a90e0a26016e026a52","department":"Directing","job":"Second Second Assistant Director"},{"adult":false,"gender":0,"id":1510438,"known_for_department":"Crew","name":"Ben Vokes","original_name":"Ben Vokes","popularity":0.6,"profile_path":null,"credit_id":"5bcdf0ef0e0a260168026f04","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":1512157,"known_for_department":"Visual Effects","name":"Robert Spurlock","original_name":"Robert Spurlock","popularity":0.6,"profile_path":null,"credit_id":"5bce1865925141056f002372","department":"Visual Effects","job":"Visual Effects"},{"adult":false,"gender":0,"id":1532597,"known_for_department":"Costume & Make-Up","name":"Terry Anderson","original_name":"Terry Anderson","popularity":0.6,"profile_path":null,"credit_id":"5bcdd4d70e0a26015102403b","department":"Costume & Make-Up","job":"Assistant Costume Designer"},{"adult":false,"gender":0,"id":1532610,"known_for_department":"Camera","name":"Bob Hall","original_name":"Bob Hall","popularity":0.6,"profile_path":null,"credit_id":"5bcde1d29251416131023bee","department":"Camera","job":"First Assistant \"A\" Camera"},{"adult":false,"gender":0,"id":1533084,"known_for_department":"Costume & Make-Up","name":"Pablo Borges","original_name":"Pablo Borges","popularity":1.214,"profile_path":null,"credit_id":"5bcddbbb925141613e02030c","department":"Costume & Make-Up","job":"Costumer"},{"adult":false,"gender":0,"id":1534821,"known_for_department":"Art","name":"Gabriel Hardman","original_name":"Gabriel Hardman","popularity":0.6,"profile_path":null,"credit_id":"5bcdff8492514105770001b3","department":"Art","job":"Storyboard Artist"},{"adult":false,"gender":2,"id":1534982,"known_for_department":"Crew","name":"Cesar Orozco","original_name":"Cesar Orozco","popularity":0.6,"profile_path":null,"credit_id":"5bcdf3d0925141612d025506","department":"Crew","job":"Propmaker"},{"adult":false,"gender":0,"id":1535087,"known_for_department":"Crew","name":"Robert Cole","original_name":"Robert Cole","popularity":0.6,"profile_path":null,"credit_id":"5bcdfc44925141613b023945","department":"Crew","job":"Special Effects"},{"adult":false,"gender":0,"id":1535096,"known_for_department":"Camera","name":"Adam Camacho","original_name":"Adam Camacho","popularity":0.6,"profile_path":null,"credit_id":"5bcde2e20e0a260151024f53","department":"Camera","job":"Grip"},{"adult":false,"gender":0,"id":1535102,"known_for_department":"Camera","name":"Shaun Sangkarat","original_name":"Shaun Sangkarat","popularity":0.6,"profile_path":null,"credit_id":"5bcde3d40e0a26015b0248de","department":"Camera","job":"Grip"},{"adult":false,"gender":2,"id":1540470,"known_for_department":"Editing","name":"Jeff Smithwick","original_name":"Jeff Smithwick","popularity":0.6,"profile_path":null,"credit_id":"5bcdd896925141613801ff73","department":"Editing","job":"Color Timer"},{"adult":false,"gender":0,"id":1541583,"known_for_department":"Crew","name":"John Whitby","original_name":"John Whitby","popularity":0.6,"profile_path":null,"credit_id":"5bcdd7f5c3a368286a0276f7","department":"Crew","job":"Carpenter"},{"adult":false,"gender":0,"id":1544396,"known_for_department":"Costume & Make-Up","name":"Estelle Tolstoukine","original_name":"Estelle Tolstoukine","popularity":0.6,"profile_path":null,"credit_id":"5bcde48d0e0a260162025d99","department":"Costume & Make-Up","job":"Hairstylist"},{"adult":false,"gender":0,"id":1546026,"known_for_department":"Art","name":"Kevin Jenkins","original_name":"Kevin Jenkins","popularity":0.6,"profile_path":null,"credit_id":"5bce057b0e0a265d39000874","department":"Production","job":"Unit Manager"},{"adult":false,"gender":0,"id":1546755,"known_for_department":"Crew","name":"Dave Evans","original_name":"Dave Evans","popularity":0.6,"profile_path":null,"credit_id":"5bcdd323c3a368286302543e","department":"Crew","job":"Armorer"},{"adult":false,"gender":2,"id":1546875,"known_for_department":"Sound","name":"Christopher Flick","original_name":"Christopher Flick","popularity":0.6,"profile_path":null,"credit_id":"5bcde281925141613e020990","department":"Sound","job":"Foley Supervisor"},{"adult":false,"gender":1,"id":1547313,"known_for_department":"Editing","name":"Paula Suhy","original_name":"Paula Suhy","popularity":1.389,"profile_path":null,"credit_id":"5bcdd5260e0a26015b0239ac","department":"Editing","job":"Assistant Editor"},{"adult":false,"gender":0,"id":1548668,"known_for_department":"Art","name":"David Carberry","original_name":"David Carberry","popularity":0.6,"profile_path":null,"credit_id":"5bcdee8b92514161260236ad","department":"Art","job":"Painter"},{"adult":false,"gender":0,"id":1549272,"known_for_department":"Costume & Make-Up","name":"Cookie Lopez","original_name":"Cookie Lopez","popularity":0.98,"profile_path":null,"credit_id":"5bcddbfc0e0a260164023c4f","department":"Costume & Make-Up","job":"Costumer"},{"adult":false,"gender":0,"id":1550832,"known_for_department":"Sound","name":"Ed Novick","original_name":"Ed Novick","popularity":0.6,"profile_path":null,"credit_id":"5b24c5a2c3a36841e4004184","department":"Sound","job":"Sound Mixer"},{"adult":false,"gender":0,"id":1550849,"known_for_department":"Camera","name":"Cyril Kuhnholtz","original_name":"Cyril Kuhnholtz","popularity":0.6,"profile_path":"/aNqeTlxWh5BTwgIknMIQYhCWM5M.jpg","credit_id":"5bcde500c3a36828700274b7","department":"Camera","job":"Key Grip"},{"adult":false,"gender":2,"id":1550851,"known_for_department":"Crew","name":"Tom Struthers","original_name":"Tom Struthers","popularity":1.594,"profile_path":"/xno5adpYLc7652mzr6jvMUyecBD.jpg","credit_id":"5d24f1d8bbd0b00011bb1fa1","department":"Crew","job":"Stunt Coordinator"},{"adult":false,"gender":0,"id":1551772,"known_for_department":"Crew","name":"Lynne Corbould","original_name":"Lynne Corbould","popularity":0.6,"profile_path":null,"credit_id":"5bcdfd05925141612a024286","department":"Crew","job":"Special Effects Coordinator"},{"adult":false,"gender":0,"id":1551796,"known_for_department":"Production","name":"Amin Rharda","original_name":"Amin Rharda","popularity":0.6,"profile_path":null,"credit_id":"5bcdd59c925141612d022ed1","department":"Art","job":"Assistant Property Master"},{"adult":false,"gender":0,"id":1551797,"known_for_department":"Crew","name":"Joss Skottowe","original_name":"Joss Skottowe","popularity":0.764,"profile_path":null,"credit_id":"5bcdd332c3a368287601fccb","department":"Crew","job":"Armorer"},{"adult":false,"gender":2,"id":1551971,"known_for_department":"Lighting","name":"Victor Abadia","original_name":"Victor Abadia","popularity":0.694,"profile_path":null,"credit_id":"5bcddf29925141613e02069c","department":"Lighting","job":"Electrician"},{"adult":false,"gender":2,"id":1552191,"known_for_department":"Lighting","name":"Larry Sushinski","original_name":"Larry Sushinski","popularity":0.6,"profile_path":null,"credit_id":"5bcdd4450e0a26015f02400f","department":"Lighting","job":"Assistant Chief Lighting Technician"},{"adult":false,"gender":0,"id":1553623,"known_for_department":"Crew","name":"Olivier Suffert","original_name":"Olivier Suffert","popularity":0.98,"profile_path":null,"credit_id":"5bcddeaa0e0a260151024aba","department":"Crew","job":"Driver"},{"adult":false,"gender":0,"id":1557584,"known_for_department":"Visual Effects","name":"Stewart Ash","original_name":"Stewart Ash","popularity":0.98,"profile_path":null,"credit_id":"5bce0f25c3a3683d6900154b","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":0,"id":1557584,"known_for_department":"Visual Effects","name":"Stewart Ash","original_name":"Stewart Ash","popularity":0.98,"profile_path":null,"credit_id":"5bce0f3392514105870016bb","department":"Visual Effects","job":"Visual Effects"},{"adult":false,"gender":0,"id":1558714,"known_for_department":"Crew","name":"Craig Myers","original_name":"Craig Myers","popularity":0.6,"profile_path":null,"credit_id":"5bcdd349925141612d022b39","department":"Crew","job":"Armorer"},{"adult":false,"gender":0,"id":1559583,"known_for_department":"Crew","name":"Alexander Aben","original_name":"Alexander Aben","popularity":0.6,"profile_path":null,"credit_id":"5bcddec59251416138020605","department":"Crew","job":"Driver"},{"adult":false,"gender":2,"id":1566280,"known_for_department":"Directing","name":"Nilo Otero","original_name":"Nilo Otero","popularity":1.4,"profile_path":"/bTTmCamw6hplmZpa7cNbTDWFxeh.jpg","credit_id":"5bcde22a0e0a260162025a10","department":"Directing","job":"First Assistant Director"},{"adult":false,"gender":0,"id":1568245,"known_for_department":"Production","name":"Tommaso Colognese","original_name":"Tommaso Colognese","popularity":0.6,"profile_path":null,"credit_id":"5bcdd5c3c3a368286d026a08","department":"Crew","job":"Actor's Assistant"},{"adult":false,"gender":0,"id":1570791,"known_for_department":"Production","name":"Elona Tsou","original_name":"Elona Tsou","popularity":0.608,"profile_path":null,"credit_id":"5bcdf24b9251416138021da4","department":"Production","job":"Production Supervisor"},{"adult":false,"gender":0,"id":1571601,"known_for_department":"Crew","name":"David E. Hall","original_name":"David E. Hall","popularity":0.6,"profile_path":null,"credit_id":"5bcdef5e0e0a2601510260d8","department":"Crew","job":"Post Production Supervisor"},{"adult":false,"gender":0,"id":1571749,"known_for_department":"Crew","name":"Erick Garibay","original_name":"Erick Garibay","popularity":0.6,"profile_path":null,"credit_id":"5bcdd58cc3a36828660259af","department":"Art","job":"Assistant Property Master"},{"adult":false,"gender":2,"id":1571979,"known_for_department":"Camera","name":"Alan Hall","original_name":"Alan Hall","popularity":0.6,"profile_path":null,"credit_id":"5bcdd402c3a368287601fd81","department":"Camera","job":"Assistant Camera"},{"adult":false,"gender":0,"id":1574834,"known_for_department":"Directing","name":"Myriam Loukili","original_name":"Myriam Loukili","popularity":0.6,"profile_path":null,"credit_id":"5bcdef81925141612a0230e3","department":"Production","job":"Production Accountant"},{"adult":false,"gender":2,"id":1575003,"known_for_department":"Editing","name":"John Lee","original_name":"John Lee","popularity":0.61,"profile_path":null,"credit_id":"5c83b8cac3a3684e95da6c60","department":"Editing","job":"Additional Editor"},{"adult":false,"gender":1,"id":1586890,"known_for_department":"Art","name":"Helen Kozora","original_name":"Helen Kozora","popularity":0.706,"profile_path":null,"credit_id":"5bcdf94892514161260243fb","department":"Art","job":"Set Decoration Buyer"},{"adult":false,"gender":0,"id":1597149,"known_for_department":"Crew","name":"Maurice Routly","original_name":"Maurice Routly","popularity":0.98,"profile_path":null,"credit_id":"5bcdfcf50e0a26015f027748","department":"Crew","job":"Special Effects Assistant"},{"adult":false,"gender":0,"id":1600114,"known_for_department":"Sound","name":"Alan Meyerson","original_name":"Alan Meyerson","popularity":0.996,"profile_path":null,"credit_id":"5bcdee30925141612d024c90","department":"Sound","job":"Scoring Mixer"},{"adult":false,"gender":0,"id":1603331,"known_for_department":"Sound","name":"Brian Robinson","original_name":"Brian Robinson","popularity":1.38,"profile_path":null,"credit_id":"5bcdd640925141612d022f4d","department":"Sound","job":"Boom Operator"},{"adult":false,"gender":0,"id":1608775,"known_for_department":"Visual Effects","name":"Tien Nguyen","original_name":"Tien Nguyen","popularity":0.6,"profile_path":null,"credit_id":"5bcdfabbc3a368286a02a659","department":"Crew","job":"Set Production Assistant"},{"adult":false,"gender":0,"id":1609057,"known_for_department":"Lighting","name":"Jeff Chassler","original_name":"Jeff Chassler","popularity":0.6,"profile_path":null,"credit_id":"5bcdec0a0e0a2601680266b9","department":"Lighting","job":"Lighting Technician"},{"adult":false,"gender":0,"id":1614549,"known_for_department":"Costume & Make-Up","name":"Jessie Mann","original_name":"Jessie Mann","popularity":0.6,"profile_path":null,"credit_id":"5bcddbd1c3a368285e022133","department":"Costume & Make-Up","job":"Costumer"},{"adult":false,"gender":0,"id":1616041,"known_for_department":"Camera","name":"Hugues Espinasse","original_name":"Hugues Espinasse","popularity":0.6,"profile_path":null,"credit_id":"5bcde1c89251416134022472","department":"Camera","job":"First Assistant Camera"},{"adult":false,"gender":0,"id":1616042,"known_for_department":"Lighting","name":"Manuel Gaspar","original_name":"Manuel Gaspar","popularity":0.6,"profile_path":null,"credit_id":"5bcdd625925141613b020c9d","department":"Lighting","job":"Best Boy Electric"},{"adult":false,"gender":0,"id":1622450,"known_for_department":"Camera","name":"Yasushi Miyata","original_name":"Yasushi Miyata","popularity":0.6,"profile_path":null,"credit_id":"5bcdd424c3a368287601fdac","department":"Camera","job":"Assistant Camera"},{"adult":false,"gender":2,"id":1624418,"known_for_department":"Art","name":"Garry Moore","original_name":"Garry Moore","popularity":0.6,"profile_path":null,"credit_id":"5bcdfee9c3a3683d600000b1","department":"Art","job":"Standby Carpenter"},{"adult":false,"gender":0,"id":1627975,"known_for_department":"Crew","name":"Saad Ajedigue","original_name":"Saad Ajedigue","popularity":0.6,"profile_path":null,"credit_id":"5bcdef8ec3a368286302779e","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":1635238,"known_for_department":"Camera","name":"Michael Duarte","original_name":"Michael Duarte","popularity":1.02,"profile_path":null,"credit_id":"5bcdca749251416131021f92","department":"Camera","job":"Additional Grip"},{"adult":false,"gender":1,"id":1637491,"known_for_department":"Production","name":"Kim Bailey","original_name":"Kim Bailey","popularity":0.6,"profile_path":null,"credit_id":"5bcdf140c3a3682876021ba4","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":1638552,"known_for_department":"Camera","name":"Kevin McGill","original_name":"Kevin McGill","popularity":0.6,"profile_path":null,"credit_id":"5bcdd66fc3a368287602004b","department":"Camera","job":"Camera Operator"},{"adult":false,"gender":2,"id":1646240,"known_for_department":"Crew","name":"Jason Inman","original_name":"Jason Inman","popularity":0.6,"profile_path":null,"credit_id":"5bcdfa0a0e0a26016e026c46","department":"Crew","job":"Set Medic"},{"adult":false,"gender":2,"id":1651238,"known_for_department":"Crew","name":"Chuck Martinez","original_name":"Chuck Martinez","popularity":0.6,"profile_path":null,"credit_id":"5bcdde91c3a36828660263e4","department":"Crew","job":"Driver"},{"adult":false,"gender":0,"id":1651247,"known_for_department":"Crew","name":"Kit Conners","original_name":"Kit Conners","popularity":0.838,"profile_path":null,"credit_id":"5bcdcaa8c3a368285e0210b4","department":"Production","job":"Additional Production Assistant"},{"adult":false,"gender":0,"id":1670877,"known_for_department":"Acting","name":"Kevin Caira","original_name":"Kevin Caira","popularity":0.6,"profile_path":null,"credit_id":"5bcddd00925141612d023847","department":"Crew","job":"Driver"},{"adult":false,"gender":2,"id":1691676,"known_for_department":"Lighting","name":"Damien Jousselin","original_name":"Damien Jousselin","popularity":0.6,"profile_path":null,"credit_id":"5bcddfbd0e0a26015b02450a","department":"Lighting","job":"Electrician"},{"adult":false,"gender":1,"id":1697630,"known_for_department":"Production","name":"Helen Medrano","original_name":"Helen Medrano","popularity":0.6,"profile_path":null,"credit_id":"5bcdf188c3a3682866027f96","department":"Crew","job":"Production Controller"},{"adult":false,"gender":0,"id":1698591,"known_for_department":"Art","name":"Linda Griffis","original_name":"Linda Griffis","popularity":0.6,"profile_path":null,"credit_id":"5bcdf7d39251416134023f97","department":"Production","job":"Second Assistant Accountant"},{"adult":false,"gender":0,"id":1701153,"known_for_department":"Art","name":"Jamie Rama","original_name":"Jamie Rama","popularity":0.6,"profile_path":null,"credit_id":"5bcddabb0e0a26015b023fcb","department":"Costume & Make-Up","job":"Costume Illustrator"},{"adult":false,"gender":0,"id":1701730,"known_for_department":"Acting","name":"Samuel Pactol","original_name":"Samuel Pactol","popularity":0.6,"profile_path":null,"credit_id":"5bcdee99c3a3682873024f8f","department":"Art","job":"Painter"},{"adult":false,"gender":1,"id":1706222,"known_for_department":"Lighting","name":"Dara Norman","original_name":"Dara Norman","popularity":0.6,"profile_path":null,"credit_id":"5bcdec2f9251416126023410","department":"Lighting","job":"Lighting Technician"},{"adult":false,"gender":2,"id":1707415,"known_for_department":"Crew","name":"John P. Cazin","original_name":"John P. Cazin","popularity":0.6,"profile_path":null,"credit_id":"5bce188ac3a3683d60002517","department":"Visual Effects","job":"Visual Effects"},{"adult":false,"gender":0,"id":1710259,"known_for_department":"Lighting","name":"Andy Hopkins","original_name":"Andy Hopkins","popularity":0.6,"profile_path":null,"credit_id":"5bcdd62ec3a368286302571c","department":"Camera","job":"Best Boy Grip"},{"adult":false,"gender":0,"id":1712105,"known_for_department":"Costume & Make-Up","name":"Debra Coleman","original_name":"Debra Coleman","popularity":0.986,"profile_path":null,"credit_id":"5bce122e9251410587001adf","department":"Visual Effects","job":"Digital Compositor"},{"adult":false,"gender":0,"id":1713701,"known_for_department":"Visual Effects","name":"Ciaran Crowley","original_name":"Ciaran Crowley","popularity":0.6,"profile_path":null,"credit_id":"5bce10050e0a265d400018ff","department":"Crew","job":"Compositor"},{"adult":false,"gender":0,"id":1720208,"known_for_department":"Writing","name":"Lauren Fash","original_name":"Lauren Fash","popularity":0.652,"profile_path":null,"credit_id":"5bcdefc8925141613e0219bc","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":1727295,"known_for_department":"Art","name":"Rich Andrade","original_name":"Rich Andrade","popularity":0.707,"profile_path":null,"credit_id":"5bcdf99b925141613402414d","department":"Art","job":"Set Dresser"},{"adult":false,"gender":2,"id":1733019,"known_for_department":"Sound","name":"Mark Berrow","original_name":"Mark Berrow","popularity":1.052,"profile_path":null,"credit_id":"5bcdec75c3a36828760215d7","department":"Sound","job":"Musician"},{"adult":false,"gender":0,"id":1733778,"known_for_department":"Lighting","name":"Eugene Grobler","original_name":"Eugene Grobler","popularity":0.6,"profile_path":null,"credit_id":"5bcdec189251416131024887","department":"Lighting","job":"Lighting Technician"},{"adult":false,"gender":0,"id":1733796,"known_for_department":"Sound","name":"Nourdine Zaoui","original_name":"Nourdine Zaoui","popularity":0.6,"profile_path":null,"credit_id":"5bcdfb5e0e0a26016402689a","department":"Sound","job":"Sound"},{"adult":false,"gender":0,"id":1734646,"known_for_department":"Crew","name":"Richard Berkeley","original_name":"Richard Berkeley","popularity":0.6,"profile_path":null,"credit_id":"5bce0571c3a3683d6000096a","department":"Production","job":"Unit Manager"},{"adult":false,"gender":0,"id":1736662,"known_for_department":"Costume & Make-Up","name":"Steve Newburn","original_name":"Steve Newburn","popularity":1.4,"profile_path":null,"credit_id":"5bce14290e0a265d35002553","department":"Visual Effects","job":"Modeling"},{"adult":false,"gender":2,"id":1738113,"known_for_department":"Crew","name":"Frédéric North","original_name":"Frédéric North","popularity":2.201,"profile_path":"/6Y9Us44RyRwFi2wqEqYckX6VBjz.jpg","credit_id":"5bcdd147c3a368285e0216ad","department":"Crew","job":"Aerial Coordinator"},{"adult":false,"gender":2,"id":1738113,"known_for_department":"Crew","name":"Frédéric North","original_name":"Frédéric North","popularity":2.201,"profile_path":"/6Y9Us44RyRwFi2wqEqYckX6VBjz.jpg","credit_id":"5bcdeeeac3a3682873024fe9","department":"Crew","job":"Pilot"},{"adult":false,"gender":0,"id":1739318,"known_for_department":"Crew","name":"Alexandre Millet","original_name":"Alexandre Millet","popularity":0.6,"profile_path":null,"credit_id":"5bce13540e0a265d3500242e","department":"Visual Effects","job":"Visual Effects"},{"adult":false,"gender":0,"id":1739881,"known_for_department":"Production","name":"Anthea Strangis","original_name":"Anthea Strangis","popularity":0.6,"profile_path":null,"credit_id":"5bcde1a6c3a3682866026870","department":"Production","job":"First Assistant Accountant"},{"adult":false,"gender":1,"id":1739962,"known_for_department":"Editing","name":"Mary Beth Smith","original_name":"Mary Beth Smith","popularity":0.828,"profile_path":null,"credit_id":"5bcdee38c3a36828700282dc","department":"Editing","job":"Negative Cutter"},{"adult":false,"gender":2,"id":1741194,"known_for_department":"Sound","name":"James Thatcher","original_name":"James Thatcher","popularity":1.788,"profile_path":null,"credit_id":"5bcdece8925141613e0216d3","department":"Sound","job":"Musician"},{"adult":false,"gender":0,"id":1748818,"known_for_department":"Crew","name":"Bruce Toy","original_name":"Bruce Toy","popularity":0.6,"profile_path":null,"credit_id":"5bcddea30e0a260164024135","department":"Crew","job":"Driver"},{"adult":false,"gender":0,"id":1750212,"known_for_department":"Crew","name":"Robert Lamkin","original_name":"Robert Lamkin","popularity":0.98,"profile_path":null,"credit_id":"5bcdd8069251416134021ace","department":"Crew","job":"Catering"},{"adult":false,"gender":0,"id":1759296,"known_for_department":"Camera","name":"Nick Infield","original_name":"Nick Infield","popularity":0.6,"profile_path":null,"credit_id":"5bcdca4d0e0a26016b0240ab","department":"Camera","job":"Additional Camera"},{"adult":false,"gender":0,"id":1759739,"known_for_department":"Crew","name":"Daniel F. Malone","original_name":"Daniel F. Malone","popularity":0.6,"profile_path":null,"credit_id":"5bcded8f925141613b022518","department":"Crew","job":"Marine Coordinator"},{"adult":false,"gender":0,"id":1765240,"known_for_department":"Camera","name":"Grégori Gajéro","original_name":"Grégori Gajéro","popularity":0.6,"profile_path":null,"credit_id":"5bcdf7f00e0a260164026274","department":"Camera","job":"Second Assistant Camera"},{"adult":false,"gender":0,"id":1772294,"known_for_department":"Production","name":"Roger McDonald","original_name":"Roger McDonald","popularity":0.694,"profile_path":null,"credit_id":"5bcdd667c3a3682866025abf","department":"Camera","job":"Camera Operator"},{"adult":false,"gender":0,"id":1772976,"known_for_department":"Sound","name":"Steve Mair","original_name":"Steve Mair","popularity":1.052,"profile_path":null,"credit_id":"5bcdecc90e0a26015b0255f8","department":"Sound","job":"Musician"},{"adult":false,"gender":0,"id":1775008,"known_for_department":"Production","name":"Satch Watanabe","original_name":"Satch Watanabe","popularity":0.6,"profile_path":null,"credit_id":"5bcdd5fd0e0a260168024b3b","department":"Crew","job":"Actor's Assistant"},{"adult":false,"gender":1,"id":1778307,"known_for_department":"Editing","name":"Alexis Seymour","original_name":"Alexis Seymour","popularity":0.6,"profile_path":null,"credit_id":"5bcdd51f0e0a260162024a35","department":"Editing","job":"Assistant Editor"},{"adult":false,"gender":0,"id":1779520,"known_for_department":"Camera","name":"John Curran","original_name":"John Curran","popularity":1.194,"profile_path":null,"credit_id":"5bcde2f30e0a260162025ae7","department":"Camera","job":"Grip"},{"adult":false,"gender":0,"id":1781644,"known_for_department":"Visual Effects","name":"Jason McCameron","original_name":"Jason McCameron","popularity":0.6,"profile_path":null,"credit_id":"5bcdfcd79251416138022cab","department":"Crew","job":"Special Effects"},{"adult":false,"gender":0,"id":1789573,"known_for_department":"Crew","name":"Josh O'Neill","original_name":"Josh O'Neill","popularity":0.6,"profile_path":null,"credit_id":"5bcdd6bf925141613801fdc4","department":"Crew","job":"Carpenter"},{"adult":false,"gender":0,"id":1789909,"known_for_department":"Art","name":"Gregory Byrne","original_name":"Gregory Byrne","popularity":0.6,"profile_path":null,"credit_id":"5bcdf9a70e0a260168027a98","department":"Art","job":"Set Dresser"},{"adult":false,"gender":2,"id":1792888,"known_for_department":"Lighting","name":"Scott Patten","original_name":"Scott Patten","popularity":0.6,"profile_path":null,"credit_id":"5bcdf763c3a368286a02a190","department":"Lighting","job":"Rigging Grip"},{"adult":false,"gender":0,"id":1794870,"known_for_department":"Crew","name":"Tony Marks","original_name":"Tony Marks","popularity":0.6,"profile_path":null,"credit_id":"5bcdd6b0c3a3682866025b22","department":"Crew","job":"Carpenter"},{"adult":false,"gender":0,"id":1813111,"known_for_department":"Production","name":"Hallam Rice-Edwards","original_name":"Hallam Rice-Edwards","popularity":1.38,"profile_path":null,"credit_id":"5bcdd56fc3a3682863025685","department":"Production","job":"Assistant Production Coordinator"},{"adult":false,"gender":0,"id":1814807,"known_for_department":"Camera","name":"Dan Schroer","original_name":"Dan Schroer","popularity":0.6,"profile_path":null,"credit_id":"5bcdf816925141613b023427","department":"Camera","job":"Second Assistant \"B\" Camera"},{"adult":false,"gender":0,"id":1814846,"known_for_department":"Camera","name":"Luke Towers","original_name":"Luke Towers","popularity":0.6,"profile_path":null,"credit_id":"5bcdf81c925141613802267d","department":"Camera","job":"Second Assistant Camera"},{"adult":false,"gender":1,"id":1816356,"known_for_department":"Directing","name":"Sarah Hood","original_name":"Sarah Hood","popularity":0.6,"profile_path":null,"credit_id":"5bce0114c3a3683d600003a0","department":"Directing","job":"Third Assistant Director"},{"adult":false,"gender":2,"id":1817066,"known_for_department":"Art","name":"Glenn Ferrara","original_name":"Glenn Ferrara","popularity":0.6,"profile_path":null,"credit_id":"5bcdefcf925141612d024f70","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":1826906,"known_for_department":"Crew","name":"Tim McGaughy","original_name":"Tim McGaughy","popularity":0.6,"profile_path":null,"credit_id":"5bcdf1e60e0a260151026440","department":"Production","job":"Production Driver"},{"adult":false,"gender":2,"id":1826915,"known_for_department":"Editing","name":"Scott Wesley Ross","original_name":"Scott Wesley Ross","popularity":0.6,"profile_path":null,"credit_id":"5ba8de7cc3a3680e650490a0","department":"Editing","job":"Assistant Editor"},{"adult":false,"gender":0,"id":1826925,"known_for_department":"Camera","name":"Ryan Monro","original_name":"Ryan Monro","popularity":0.6,"profile_path":null,"credit_id":"5bcde50a0e0a26015b024a24","department":"Camera","job":"Key Grip"},{"adult":false,"gender":2,"id":1827039,"known_for_department":"Directing","name":"Roger Williams","original_name":"Roger Williams","popularity":0.98,"profile_path":null,"credit_id":"5fedd159a44d09003f7bba09","department":"Camera","job":"BTS Footage"},{"adult":false,"gender":2,"id":1828264,"known_for_department":"Art","name":"Robert McKinnon","original_name":"Robert McKinnon","popularity":0.6,"profile_path":null,"credit_id":"5bcdd8e39251416134021bb0","department":"Art","job":"Concept Artist"},{"adult":false,"gender":0,"id":1828569,"known_for_department":"Crew","name":"Amanda Paller","original_name":"Amanda Paller","popularity":0.6,"profile_path":null,"credit_id":"5bcdfceec3a36828630289eb","department":"Crew","job":"Special Effects Assistant"},{"adult":false,"gender":0,"id":1831575,"known_for_department":"Costume & Make-Up","name":"Sasha McLaughlin","original_name":"Sasha McLaughlin","popularity":0.6,"profile_path":null,"credit_id":"5bcde47e0e0a26015b024974","department":"Costume & Make-Up","job":"Hairstylist"},{"adult":false,"gender":2,"id":1832320,"known_for_department":"Sound","name":"Bruce Fowler","original_name":"Bruce Fowler","popularity":0.6,"profile_path":null,"credit_id":"5bcdee570e0a260168026ac8","department":"Sound","job":"Orchestrator"},{"adult":false,"gender":1,"id":1835185,"known_for_department":"Crew","name":"Erin Stern","original_name":"Erin Stern","popularity":0.6,"profile_path":null,"credit_id":"5bcdfb050e0a260168027d23","department":"Crew","job":"Set Production Assistant"},{"adult":false,"gender":0,"id":1838173,"known_for_department":"Costume & Make-Up","name":"Christine Hawes","original_name":"Christine Hawes","popularity":0.6,"profile_path":null,"credit_id":"5bcddbca925141612a021c2e","department":"Costume & Make-Up","job":"Costumer"},{"adult":false,"gender":2,"id":1844512,"known_for_department":"Directing","name":"Jeff Hubbard","original_name":"Jeff Hubbard","popularity":0.6,"profile_path":null,"credit_id":"5bcdfa780e0a260151026f4c","department":"Crew","job":"Set Production Assistant"},{"adult":false,"gender":1,"id":1847883,"known_for_department":"Crew","name":"Amy Venghaus","original_name":"Amy Venghaus","popularity":0.6,"profile_path":null,"credit_id":"5bcdfafcc3a36828630287d2","department":"Crew","job":"Set Production Assistant"},{"adult":false,"gender":0,"id":1854360,"known_for_department":"Directing","name":"Richard Graysmark","original_name":"Richard Graysmark","popularity":1.847,"profile_path":null,"credit_id":"5bcdf86e925141612a023b7b","department":"Directing","job":"Second Assistant Director"},{"adult":false,"gender":0,"id":1855889,"known_for_department":"Visual Effects","name":"Renaud Madeline","original_name":"Renaud Madeline","popularity":0.6,"profile_path":null,"credit_id":"5bce15979251410577001e21","department":"Visual Effects","job":"Rotoscoping Artist"},{"adult":false,"gender":0,"id":1855917,"known_for_department":"Visual Effects","name":"Carlo Scaduto","original_name":"Carlo Scaduto","popularity":0.98,"profile_path":null,"credit_id":"5bce1136c3a3683d66001ac8","department":"Visual Effects","job":"Digital Compositor"},{"adult":false,"gender":0,"id":1855920,"known_for_department":"Visual Effects","name":"Brian Sepanzyk","original_name":"Brian Sepanzyk","popularity":0.6,"profile_path":null,"credit_id":"5bce00170e0a265d2d000207","department":"Directing","job":"Third Assistant Director"},{"adult":false,"gender":0,"id":1855926,"known_for_department":"Visual Effects","name":"Giuseppe Tagliavini","original_name":"Giuseppe Tagliavini","popularity":0.6,"profile_path":null,"credit_id":"5bce120a0e0a265d40001c7d","department":"Visual Effects","job":"Digital Compositor"},{"adult":false,"gender":0,"id":1857478,"known_for_department":"Directing","name":"Kevin Westley","original_name":"Kevin Westley","popularity":0.6,"profile_path":null,"credit_id":"5bce0565c3a3683d660009d7","department":"Production","job":"Unit Manager"},{"adult":false,"gender":1,"id":1857758,"known_for_department":"Production","name":"Sarah Spearing","original_name":"Sarah Spearing","popularity":0.694,"profile_path":null,"credit_id":"5bcdf1a80e0a2601640258fa","department":"Production","job":"Production Coordinator"},{"adult":false,"gender":2,"id":1867157,"known_for_department":"Directing","name":"Yann Mari Faget","original_name":"Yann Mari Faget","popularity":0.665,"profile_path":null,"credit_id":"5bcdf8990e0a26016e026a29","department":"Directing","job":"Second Assistant Director"},{"adult":false,"gender":0,"id":1867158,"known_for_department":"Directing","name":"Tarik Ait Ben Ali","original_name":"Tarik Ait Ben Ali","popularity":0.6,"profile_path":null,"credit_id":"5bcdf8b19251416126024350","department":"Directing","job":"Second Second Assistant Director"},{"adult":false,"gender":0,"id":1867160,"known_for_department":"Production","name":"Mohamed Essaghir Aabach","original_name":"Mohamed Essaghir Aabach","popularity":0.6,"profile_path":null,"credit_id":"5bce001f925141058700023d","department":"Directing","job":"Third Assistant Director"},{"adult":false,"gender":0,"id":1869084,"known_for_department":"Art","name":"Houman Eshraghi","original_name":"Houman Eshraghi","popularity":0.98,"profile_path":null,"credit_id":"5bcdff79925141057a000183","department":"Art","job":"Storyboard Artist"},{"adult":false,"gender":0,"id":1870638,"known_for_department":"Directing","name":"Brandon Lambdin","original_name":"Brandon Lambdin","popularity":2.794,"profile_path":null,"credit_id":"5bcdf87bc3a3682873025c60","department":"Directing","job":"Second Assistant Director"},{"adult":false,"gender":0,"id":1893947,"known_for_department":"Art","name":"Henry Stuart John","original_name":"Henry Stuart John","popularity":0.6,"profile_path":null,"credit_id":"5bcdd938925141612d0233d8","department":"Art","job":"Construction Foreman"},{"adult":false,"gender":1,"id":1894918,"known_for_department":"Acting","name":"Tina Guo","original_name":"Tina Guo","popularity":1.96,"profile_path":"/morbWADw22dm3qZB0kUL8UGwVpU.jpg","credit_id":"5bcdecb8c3a3682873024d76","department":"Sound","job":"Musician"},{"adult":false,"gender":2,"id":1899036,"known_for_department":"Production","name":"Kyle Photo Bucher","original_name":"Kyle Photo Bucher","popularity":0.6,"profile_path":null,"credit_id":"5bcdfa639251416134024237","department":"Crew","job":"Set Production Assistant"},{"adult":false,"gender":0,"id":1906599,"known_for_department":"Acting","name":"Alex Loubert","original_name":"Alex Loubert","popularity":0.6,"profile_path":null,"credit_id":"5bcdf09a0e0a2601640257d6","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":1913890,"known_for_department":"Lighting","name":"Trevor Steeves","original_name":"Trevor Steeves","popularity":0.6,"profile_path":null,"credit_id":"5bcde3e40e0a260164024756","department":"Camera","job":"Grip"},{"adult":false,"gender":0,"id":1918766,"known_for_department":"Crew","name":"Carlton Jarvis","original_name":"Carlton Jarvis","popularity":0.6,"profile_path":null,"credit_id":"5bcdeda3c3a368285e0235da","department":"Crew","job":"Medical Consultant"},{"adult":false,"gender":0,"id":1918773,"known_for_department":"Lighting","name":"Wailoon Chung","original_name":"Wailoon Chung","popularity":1.38,"profile_path":null,"credit_id":"5bcddf8ec3a3682873023e94","department":"Lighting","job":"Electrician"},{"adult":false,"gender":2,"id":1919507,"known_for_department":"Editing","name":"Adam Slutsky","original_name":"Adam Slutsky","popularity":1.4,"profile_path":"/mKhMVOQpilI0tyXKWbIKANMfiqb.jpg","credit_id":"5bcdfaf5c3a368286a02a6d5","department":"Crew","job":"Set Production Assistant"},{"adult":false,"gender":0,"id":1933258,"known_for_department":"Crew","name":"Alanna Hanson","original_name":"Alanna Hanson","popularity":0.6,"profile_path":null,"credit_id":"5bcdf003925141613b022848","department":"Production","job":"Production Assistant"},{"adult":false,"gender":1,"id":1935761,"known_for_department":"Production","name":"Agnes Bermejo","original_name":"Agnes Bermejo","popularity":0.6,"profile_path":null,"credit_id":"5bcdf19ac3a3682863027ac5","department":"Production","job":"Production Coordinator"},{"adult":false,"gender":0,"id":1936130,"known_for_department":"Visual Effects","name":"Paul Boyd","original_name":"Paul Boyd","popularity":0.6,"profile_path":null,"credit_id":"5bce164d925141057e001ed2","department":"Visual Effects","job":"VFX Artist"},{"adult":false,"gender":0,"id":1942673,"known_for_department":"Art","name":"Darryl Paterson","original_name":"Darryl Paterson","popularity":0.6,"profile_path":null,"credit_id":"5bcdd594c3a368286a027446","department":"Art","job":"Assistant Property Master"},{"adult":false,"gender":0,"id":1942705,"known_for_department":"Visual Effects","name":"Bronwyn Edwards","original_name":"Bronwyn Edwards","popularity":1.4,"profile_path":null,"credit_id":"5bce10680e0a265d35001fdf","department":"Crew","job":"Compositor"},{"adult":false,"gender":0,"id":1949890,"known_for_department":"Visual Effects","name":"Edward Andrews","original_name":"Edward Andrews","popularity":0.6,"profile_path":null,"credit_id":"5bce12c4c3a3683d69001a2a","department":"Visual Effects","job":"Rotoscoping Artist"},{"adult":false,"gender":0,"id":1963997,"known_for_department":"Sound","name":"Karym Ronda","original_name":"Karym Ronda","popularity":0.98,"profile_path":null,"credit_id":"5bcdfc14c3a368285e02475a","department":"Sound","job":"Sound Recordist"},{"adult":false,"gender":0,"id":1973210,"known_for_department":"Costume & Make-Up","name":"Fulvio Pozzobon","original_name":"Fulvio Pozzobon","popularity":1.391,"profile_path":null,"credit_id":"5bcde485c3a368286302692c","department":"Costume & Make-Up","job":"Hairstylist"},{"adult":false,"gender":0,"id":1973234,"known_for_department":"Costume & Make-Up","name":"Laurence Caines","original_name":"Laurence Caines","popularity":1.009,"profile_path":null,"credit_id":"5bcde4e3c3a368285e022b6a","department":"Costume & Make-Up","job":"Key Costumer"},{"adult":false,"gender":0,"id":1979354,"known_for_department":"Camera","name":"Ray Garcia","original_name":"Ray Garcia","popularity":0.6,"profile_path":null,"credit_id":"5bcde4f60e0a26015b024a0f","department":"Camera","job":"Key Grip"},{"adult":false,"gender":0,"id":1979370,"known_for_department":"Visual Effects","name":"Daniel Baldwin","original_name":"Daniel Baldwin","popularity":0.6,"profile_path":null,"credit_id":"5bce13919251410577001add","department":"Visual Effects","job":"Matchmove Supervisor"},{"adult":false,"gender":0,"id":1979385,"known_for_department":"Visual Effects","name":"Muhittin Bilginer","original_name":"Muhittin Bilginer","popularity":0.6,"profile_path":null,"credit_id":"5bce17e2925141056f0022c3","department":"Visual Effects","job":"Visual Effects Technical Director"},{"adult":false,"gender":0,"id":1992243,"known_for_department":"Art","name":"Simon Gustafsson","original_name":"Simon Gustafsson","popularity":1.4,"profile_path":null,"credit_id":"5bce13e8c3a3683d73001eaf","department":"Visual Effects","job":"Matte Painter"},{"adult":false,"gender":1,"id":1993184,"known_for_department":"Sound","name":"Rachel Bolt","original_name":"Rachel Bolt","popularity":2.102,"profile_path":"/cnvC2Kd4vMhKEKvBy8gqFb0phZ7.jpg","credit_id":"5bcdec7cc3a3682866027721","department":"Sound","job":"Musician"},{"adult":false,"gender":0,"id":1993199,"known_for_department":"Sound","name":"Roger Linley","original_name":"Roger Linley","popularity":0.615,"profile_path":null,"credit_id":"5bcdecc092514161380215d1","department":"Sound","job":"Musician"},{"adult":false,"gender":2,"id":1994224,"known_for_department":"Sound","name":"Thomas J. O'Connell","original_name":"Thomas J. O'Connell","popularity":1.688,"profile_path":null,"credit_id":"5bcdd133925141612a021169","department":"Sound","job":"ADR Mixer"},{"adult":false,"gender":0,"id":2000147,"known_for_department":"Lighting","name":"Christopher Franey","original_name":"Christopher Franey","popularity":0.6,"profile_path":null,"credit_id":"5bcdec110e0a2601680266c6","department":"Lighting","job":"Lighting Technician"},{"adult":false,"gender":0,"id":2001357,"known_for_department":"Production","name":"Frédéric Greene","original_name":"Frédéric Greene","popularity":0.6,"profile_path":null,"credit_id":"5bcdf18f0e0a26016b026e24","department":"Crew","job":"Production Controller"},{"adult":false,"gender":2,"id":2001870,"known_for_department":"Sound","name":"Jonathan Williams","original_name":"Jonathan Williams","popularity":0.753,"profile_path":null,"credit_id":"5bcded41c3a3682866027832","department":"Sound","job":"Musician"},{"adult":false,"gender":0,"id":2005019,"known_for_department":"Costume & Make-Up","name":"Maureen O'Heron","original_name":"Maureen O'Heron","popularity":0.6,"profile_path":null,"credit_id":"5bcddbf3c3a368287002694b","department":"Costume & Make-Up","job":"Costumer"},{"adult":false,"gender":0,"id":2011428,"known_for_department":"Crew","name":"Kirsty Clark","original_name":"Kirsty Clark","popularity":0.6,"profile_path":null,"credit_id":"5bce1153925141057400176e","department":"Visual Effects","job":"Digital Compositor"},{"adult":false,"gender":0,"id":2011616,"known_for_department":"Visual Effects","name":"Mike Gould","original_name":"Mike Gould","popularity":0.6,"profile_path":null,"credit_id":"5bcdd43ec3a368286a0271cd","department":"Lighting","job":"Assistant Chief Lighting Technician"},{"adult":false,"gender":0,"id":2015676,"known_for_department":"Visual Effects","name":"Daniel Leatherdale","original_name":"Daniel Leatherdale","popularity":0.6,"profile_path":null,"credit_id":"5bce14fdc3a3683d5a001ee3","department":"Visual Effects","job":"Rotoscoping Artist"},{"adult":false,"gender":0,"id":2015679,"known_for_department":"Visual Effects","name":"James McPherson","original_name":"James McPherson","popularity":0.6,"profile_path":null,"credit_id":"5bce11240e0a265d3c00192f","department":"Visual Effects","job":"Digital Compositor"},{"adult":false,"gender":0,"id":2018883,"known_for_department":"Crew","name":"Ben Hicks","original_name":"Ben Hicks","popularity":0.6,"profile_path":null,"credit_id":"5bce10710e0a265d35001fea","department":"Crew","job":"Compositor"},{"adult":false,"gender":0,"id":2024949,"known_for_department":"Art","name":"Adam Mull","original_name":"Adam Mull","popularity":0.6,"profile_path":null,"credit_id":"5bcdedee92514161260235e8","department":"Visual Effects","job":"Modeling"},{"adult":false,"gender":0,"id":2025838,"known_for_department":"Art","name":"Nicolas Brechat","original_name":"Nicolas Brechat","popularity":0.652,"profile_path":null,"credit_id":"5bcdffb9c3a3683d63000229","department":"Art","job":"Swing"},{"adult":false,"gender":0,"id":2026509,"known_for_department":"Crew","name":"Brian Kruse","original_name":"Brian Kruse","popularity":0.6,"profile_path":null,"credit_id":"5bcdff3e9251410574000144","department":"Crew","job":"Stand In"},{"adult":false,"gender":0,"id":2037438,"known_for_department":"Costume & Make-Up","name":"François-Louis Delfolie","original_name":"François-Louis Delfolie","popularity":0.6,"profile_path":null,"credit_id":"5bcddbc30e0a26016e0242c0","department":"Costume & Make-Up","job":"Costumer"},{"adult":false,"gender":0,"id":2038145,"known_for_department":"Visual Effects","name":"Llyr Tobias Johansen","original_name":"Llyr Tobias Johansen","popularity":0.6,"profile_path":null,"credit_id":"5bce16d9c3a3683d69001fbe","department":"Visual Effects","job":"Visual Effects Coordinator"},{"adult":false,"gender":0,"id":2038146,"known_for_department":"Visual Effects","name":"Paula Diane Lopez","original_name":"Paula Diane Lopez","popularity":0.6,"profile_path":null,"credit_id":"5bce16e4c3a3683d5800232e","department":"Visual Effects","job":"Visual Effects Coordinator"},{"adult":false,"gender":0,"id":2040910,"known_for_department":"Visual Effects","name":"John J. Galloway","original_name":"John J. Galloway","popularity":0.6,"profile_path":null,"credit_id":"5bce125b0e0a265d40001cef","department":"Visual Effects","job":"Digital Compositor"},{"adult":false,"gender":1,"id":2040947,"known_for_department":"Visual Effects","name":"Emma Moffat","original_name":"Emma Moffat","popularity":0.6,"profile_path":null,"credit_id":"5bcdfab10e0a26015f0272ff","department":"Crew","job":"Set Production Assistant"},{"adult":false,"gender":0,"id":2045401,"known_for_department":"Lighting","name":"Don Telles","original_name":"Don Telles","popularity":0.6,"profile_path":null,"credit_id":"5bcdf76a0e0a260151026be1","department":"Lighting","job":"Rigging Grip"},{"adult":false,"gender":0,"id":2045906,"known_for_department":"Crew","name":"Christy Richmond","original_name":"Christy Richmond","popularity":0.6,"profile_path":null,"credit_id":"5bcdd5179251416126021a10","department":"Editing","job":"Assistant Editor"},{"adult":false,"gender":0,"id":2046849,"known_for_department":"Crew","name":"Chad Wadsworth","original_name":"Chad Wadsworth","popularity":0.6,"profile_path":null,"credit_id":"5bcdde29c3a368286d0275cc","department":"Crew","job":"Driver"},{"adult":false,"gender":1,"id":2047123,"known_for_department":"Production","name":"Carrie Oyer","original_name":"Carrie Oyer","popularity":0.6,"profile_path":null,"credit_id":"5bce0518c3a3683d6f0007f0","department":"Production","job":"Travel Coordinator"},{"adult":false,"gender":0,"id":2053271,"known_for_department":"Directing","name":"Peres Owino","original_name":"Peres Owino","popularity":0.6,"profile_path":null,"credit_id":"5bcdd12cc3a368286a026dd8","department":"Sound","job":"ADR & Dubbing"},{"adult":false,"gender":2,"id":2053738,"known_for_department":"Sound","name":"Steve Nelson","original_name":"Steve Nelson","popularity":0.748,"profile_path":"/yLpUyQ0Qeoy0ION6hTK1fz6cZhY.jpg","credit_id":"5bcdfc0cc3a368285e02474f","department":"Sound","job":"Sound Mixer"},{"adult":false,"gender":0,"id":2053862,"known_for_department":"Editing","name":"Steven Cuellar","original_name":"Steven Cuellar","popularity":0.6,"profile_path":null,"credit_id":"5bcdef30925141612d024e50","department":"Crew","job":"Post Production Assistant"},{"adult":false,"gender":0,"id":2059550,"known_for_department":"Visual Effects","name":"Daniel Rauchwerger","original_name":"Daniel Rauchwerger","popularity":0.6,"profile_path":null,"credit_id":"5bce12000e0a265d44001ac3","department":"Visual Effects","job":"Digital Compositor"},{"adult":false,"gender":0,"id":2064768,"known_for_department":"Art","name":"Pete Washburn","original_name":"Pete Washburn","popularity":0.6,"profile_path":null,"credit_id":"5bcdf9fe0e0a260162027bcc","department":"Art","job":"Set Dresser"},{"adult":false,"gender":0,"id":2066934,"known_for_department":"Crew","name":"Christopher A. Suarez","original_name":"Christopher A. Suarez","popularity":0.6,"profile_path":null,"credit_id":"5bcdfdf2c3a3682866028fd2","department":"Crew","job":"Special Effects Technician"},{"adult":false,"gender":0,"id":2068450,"known_for_department":"Visual Effects","name":"Prateek Kaushal","original_name":"Prateek Kaushal","popularity":0.648,"profile_path":null,"credit_id":"5bce14e60e0a265d31002244","department":"Visual Effects","job":"Rotoscoping Artist"},{"adult":false,"gender":0,"id":2068879,"known_for_department":"Visual Effects","name":"David Hyde","original_name":"David Hyde","popularity":0.6,"profile_path":null,"credit_id":"5bce17c4c3a3683d5a00236f","department":"Visual Effects","job":"Visual Effects Technical Director"},{"adult":false,"gender":0,"id":2069553,"known_for_department":"Visual Effects","name":"Romain Bouvard","original_name":"Romain Bouvard","popularity":0.6,"profile_path":null,"credit_id":"5bce1114925141057a001a26","department":"Visual Effects","job":"Digital Compositor"},{"adult":false,"gender":0,"id":2069555,"known_for_department":"Visual Effects","name":"Kamelia Chabane","original_name":"Kamelia Chabane","popularity":0.98,"profile_path":null,"credit_id":"5bce1591c3a3683d69001e03","department":"Visual Effects","job":"Rotoscoping Artist"},{"adult":false,"gender":0,"id":2070812,"known_for_department":"Costume & Make-Up","name":"Sonny Merritt","original_name":"Sonny Merritt","popularity":0.6,"profile_path":null,"credit_id":"5bcde4dac3a3682870027484","department":"Costume & Make-Up","job":"Key Costumer"},{"adult":false,"gender":0,"id":2071239,"known_for_department":"Costume & Make-Up","name":"Sonia Akouz","original_name":"Sonia Akouz","popularity":0.6,"profile_path":null,"credit_id":"5bcded49c3a36828760216d3","department":"Costume & Make-Up","job":"Makeup Artist"},{"adult":false,"gender":0,"id":2072813,"known_for_department":"Crew","name":"Roy Goode","original_name":"Roy Goode","popularity":0.6,"profile_path":null,"credit_id":"5bce1622925141057a00211b","department":"Visual Effects","job":"Visual Effects"},{"adult":false,"gender":0,"id":2080553,"known_for_department":"Art","name":"Rossana De Cicco","original_name":"Rossana De Cicco","popularity":0.6,"profile_path":null,"credit_id":"5bcdee92c3a3682873024f85","department":"Art","job":"Painter"},{"adult":false,"gender":0,"id":2080815,"known_for_department":"Lighting","name":"Gabriel J. Lewis","original_name":"Gabriel J. Lewis","popularity":0.6,"profile_path":null,"credit_id":"5bcdec250e0a2601680266d6","department":"Lighting","job":"Lighting Technician"},{"adult":false,"gender":0,"id":2081258,"known_for_department":"Crew","name":"Simon Quinn","original_name":"Simon Quinn","popularity":0.6,"profile_path":null,"credit_id":"5bcdfdb40e0a260164026b09","department":"Crew","job":"Special Effects Technician"},{"adult":false,"gender":0,"id":2083198,"known_for_department":"Camera","name":"Sylvain Bardoux","original_name":"Sylvain Bardoux","popularity":0.6,"profile_path":null,"credit_id":"5bcdf7719251416126024197","department":"Lighting","job":"Rigging Grip"},{"adult":false,"gender":0,"id":2090026,"known_for_department":"Camera","name":"Ben Perry","original_name":"Ben Perry","popularity":0.6,"profile_path":null,"credit_id":"5bcdf7fc0e0a260162027966","department":"Camera","job":"Second Assistant Camera"},{"adult":false,"gender":0,"id":2092333,"known_for_department":"Crew","name":"John Giuliano","original_name":"John Giuliano","popularity":0.6,"profile_path":null,"credit_id":"5bcdf3ef925141612a023634","department":"Crew","job":"Propmaker"},{"adult":false,"gender":0,"id":2095273,"known_for_department":"Visual Effects","name":"Paul Brannan","original_name":"Paul Brannan","popularity":0.6,"profile_path":null,"credit_id":"5bce136d0e0a265d44001d8c","department":"Visual Effects","job":"Visual Effects"},{"adult":false,"gender":0,"id":2096530,"known_for_department":"Visual Effects","name":"Nik Brownlee","original_name":"Nik Brownlee","popularity":0.6,"profile_path":null,"credit_id":"5bce11cf9251410574001802","department":"Visual Effects","job":"Digital Compositor"},{"adult":false,"gender":0,"id":2096952,"known_for_department":"Visual Effects","name":"Katy Mummery","original_name":"Katy Mummery","popularity":0.6,"profile_path":null,"credit_id":"5bce16c7925141057a00220b","department":"Visual Effects","job":"Visual Effects Coordinator"},{"adult":false,"gender":0,"id":2100425,"known_for_department":"Camera","name":"David Gray","original_name":"David Gray","popularity":0.6,"profile_path":null,"credit_id":"5bcdfefec3a3683d580000e5","department":"Lighting","job":"Standby Rigger"},{"adult":false,"gender":0,"id":2101093,"known_for_department":"Lighting","name":"Brian Scotti","original_name":"Brian Scotti","popularity":0.6,"profile_path":null,"credit_id":"5bcde0fbc3a3682876020acc","department":"Lighting","job":"Electrician"},{"adult":false,"gender":0,"id":2116549,"known_for_department":"Crew","name":"Ryan Allen","original_name":"Ryan Allen","popularity":0.6,"profile_path":null,"credit_id":"5bcddcc4c3a368286a027c1e","department":"Crew","job":"Driver"},{"adult":false,"gender":0,"id":2121835,"known_for_department":"Lighting","name":"Antonin Drigeard","original_name":"Antonin Drigeard","popularity":0.6,"profile_path":null,"credit_id":"5bcde113c3a368286d027931","department":"Lighting","job":"Electrician"},{"adult":false,"gender":0,"id":2121845,"known_for_department":"Camera","name":"Laurent Martin","original_name":"Laurent Martin","popularity":0.6,"profile_path":null,"credit_id":"5bcdf75c925141612602417e","department":"Lighting","job":"Rigging Grip"},{"adult":false,"gender":1,"id":2125364,"known_for_department":"Art","name":"Dawn-Anne Coulson","original_name":"Dawn-Anne Coulson","popularity":0.98,"profile_path":"/1ue4eGyyHIi2J0UuzTmp1pJr1Eb.jpg","credit_id":"5bcdd913c3a3682873023832","department":"Art","job":"Construction Buyer"},{"adult":false,"gender":0,"id":2125551,"known_for_department":"Production","name":"Samantha Nottingham","original_name":"Samantha Nottingham","popularity":0.6,"profile_path":null,"credit_id":"5bcde1be0e0a26015f024ed7","department":"Production","job":"First Assistant Accountant"},{"adult":false,"gender":0,"id":2128700,"known_for_department":"Visual Effects","name":"Jeff Winkle","original_name":"Jeff Winkle","popularity":0.6,"profile_path":null,"credit_id":"5bcdef140e0a260164025605","department":"Crew","job":"Post Production Assistant"},{"adult":false,"gender":0,"id":2133610,"known_for_department":"Crew","name":"Simon O'Connell","original_name":"Simon O'Connell","popularity":0.6,"profile_path":null,"credit_id":"5bcdd150c3a368286302520b","department":"Crew","job":"Aerial Coordinator"},{"adult":false,"gender":0,"id":2133906,"known_for_department":"Crew","name":"Chuck Choi","original_name":"Chuck Choi","popularity":0.6,"profile_path":null,"credit_id":"5bcdf7aa92514161260241d6","department":"Crew","job":"Score Engineer"},{"adult":false,"gender":2,"id":2134008,"known_for_department":"Crew","name":"Stephen Lee","original_name":"Stephen Lee","popularity":0.609,"profile_path":null,"credit_id":"5bce0604c3a3683d6f0008fd","department":"Crew","job":"Video Assist Operator"},{"adult":false,"gender":0,"id":2134994,"known_for_department":"Crew","name":"Eric Vrba","original_name":"Eric Vrba","popularity":1.38,"profile_path":null,"credit_id":"5bcdfe0b0e0a26015f0278d4","department":"Crew","job":"Special Effects Technician"},{"adult":false,"gender":0,"id":2138452,"known_for_department":"Visual Effects","name":"Scott Marriott","original_name":"Scott Marriott","popularity":0.984,"profile_path":null,"credit_id":"5bce10810e0a265d3c001819","department":"Crew","job":"Compositor"},{"adult":false,"gender":0,"id":2139278,"known_for_department":"Production","name":"Kyla McFeat","original_name":"Kyla McFeat","popularity":0.84,"profile_path":null,"credit_id":"5bcdd3d0925141612d022c05","department":"Production","job":"Assistant Accountant"},{"adult":false,"gender":0,"id":2142341,"known_for_department":"Production","name":"Kim Goddard-Rains","original_name":"Kim Goddard-Rains","popularity":0.6,"profile_path":null,"credit_id":"5bcdf1b60e0a2601510263d7","department":"Production","job":"Production Coordinator"},{"adult":false,"gender":1,"id":2142494,"known_for_department":"Art","name":"Emily Kwong","original_name":"Emily Kwong","popularity":0.6,"profile_path":null,"credit_id":"5bce14499251410581002259","department":"Visual Effects","job":"Modeling"},{"adult":false,"gender":0,"id":2142513,"known_for_department":"Production","name":"Evan Godfrey","original_name":"Evan Godfrey","popularity":0.607,"profile_path":null,"credit_id":"5bcdefef0e0a26016402571a","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":2142527,"known_for_department":"Art","name":"Nathaniel West","original_name":"Nathaniel West","popularity":0.728,"profile_path":null,"credit_id":"5bcdd8eb0e0a26016e023ff5","department":"Art","job":"Concept Artist"},{"adult":false,"gender":0,"id":2142544,"known_for_department":"Crew","name":"Cammie Caira","original_name":"Cammie Caira","popularity":0.6,"profile_path":null,"credit_id":"5bcddccc925141613102362c","department":"Crew","job":"Driver"},{"adult":false,"gender":0,"id":2142552,"known_for_department":"Production","name":"Nolan B. Medrano","original_name":"Nolan B. Medrano","popularity":0.6,"profile_path":null,"credit_id":"5bcdef26c3a368286a029485","department":"Production","job":"Post Production Accountant"},{"adult":false,"gender":0,"id":2142554,"known_for_department":"Production","name":"Lena Schmigalla","original_name":"Lena Schmigalla","popularity":0.6,"profile_path":null,"credit_id":"5bcdd3d8c3a368286d0267d5","department":"Production","job":"Assistant Accountant"},{"adult":false,"gender":0,"id":2142639,"known_for_department":"Lighting","name":"Landin Walsh","original_name":"Landin Walsh","popularity":0.6,"profile_path":null,"credit_id":"5bcdec4cc3a3682873024d02","department":"Lighting","job":"Lighting Technician"},{"adult":false,"gender":0,"id":2142649,"known_for_department":"Visual Effects","name":"Adam Gelbart","original_name":"Adam Gelbart","popularity":0.6,"profile_path":null,"credit_id":"5bcdedfc9251416131024ad5","department":"Visual Effects","job":"Modeling"},{"adult":false,"gender":0,"id":2142659,"known_for_department":"Costume & Make-Up","name":"Steven Kajorinne","original_name":"Steven Kajorinne","popularity":0.6,"profile_path":null,"credit_id":"5bcdf9b50e0a26016e026bdb","department":"Art","job":"Set Dresser"},{"adult":false,"gender":0,"id":2142663,"known_for_department":"Crew","name":"Bobbie Shay","original_name":"Bobbie Shay","popularity":0.6,"profile_path":null,"credit_id":"5bcdef3c0e0a26015b02599b","department":"Crew","job":"Post Production Assistant"},{"adult":false,"gender":0,"id":2142673,"known_for_department":"Production","name":"Ron Landry","original_name":"Ron Landry","popularity":0.6,"profile_path":null,"credit_id":"5bcdf01f9251416138021b04","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":2142694,"known_for_department":"Production","name":"Richard S. Wilson","original_name":"Richard S. Wilson","popularity":0.6,"profile_path":null,"credit_id":"5bcdf7dcc3a36828630283bd","department":"Production","job":"Second Assistant Accountant"},{"adult":false,"gender":0,"id":2142709,"known_for_department":"Crew","name":"Olivia McCallum","original_name":"Olivia McCallum","popularity":1.4,"profile_path":null,"credit_id":"5bcdfb13c3a368286d02a00b","department":"Crew","job":"Set Production Assistant"},{"adult":false,"gender":0,"id":2142730,"known_for_department":"Crew","name":"Mark Stanton","original_name":"Mark Stanton","popularity":0.6,"profile_path":null,"credit_id":"5bcdfdea0e0a26016e0271f7","department":"Crew","job":"Special Effects Technician"},{"adult":false,"gender":0,"id":2142732,"known_for_department":"Crew","name":"Michael Rifkin","original_name":"Michael Rifkin","popularity":0.6,"profile_path":null,"credit_id":"5bcdfdc10e0a26016202808a","department":"Crew","job":"Special Effects Technician"},{"adult":false,"gender":2,"id":2142739,"known_for_department":"Crew","name":"Robert L. Slater","original_name":"Robert L. Slater","popularity":0.6,"profile_path":null,"credit_id":"5bcdfddec3a368286a02aa20","department":"Crew","job":"Special Effects Technician"},{"adult":false,"gender":0,"id":2142789,"known_for_department":"Sound","name":"Yasmeen Al-Mazeedi","original_name":"Yasmeen Al-Mazeedi","popularity":0.6,"profile_path":null,"credit_id":"5bcdec6e0e0a2601640251ce","department":"Sound","job":"Musician"},{"adult":false,"gender":0,"id":2142807,"known_for_department":"Camera","name":"Joe Wehmeyer","original_name":"Joe Wehmeyer","popularity":0.6,"profile_path":null,"credit_id":"5bce10f3c3a3683d63001aaf","department":"Camera","job":"Data Wrangler"},{"adult":false,"gender":0,"id":2142824,"known_for_department":"Visual Effects","name":"Samual Dawes","original_name":"Samual Dawes","popularity":0.6,"profile_path":null,"credit_id":"5bce156a0e0a265d310022f8","department":"Visual Effects","job":"Rotoscoping Artist"},{"adult":false,"gender":0,"id":2142853,"known_for_department":"Visual Effects","name":"Brandon Seifert","original_name":"Brandon Seifert","popularity":0.6,"profile_path":null,"credit_id":"5bce186d9251410571002192","department":"Visual Effects","job":"Visual Effects"},{"adult":false,"gender":0,"id":2143100,"known_for_department":"Visual Effects","name":"Mark H. Weingartner","original_name":"Mark H. Weingartner","popularity":0.6,"profile_path":null,"credit_id":"5bce16f90e0a265d390023c8","department":"Visual Effects","job":"VFX Director of Photography"},{"adult":false,"gender":0,"id":2143102,"known_for_department":"Crew","name":"Anne Putnam Kolbe","original_name":"Anne Putnam Kolbe","popularity":0.6,"profile_path":null,"credit_id":"5bce17330e0a265d40002512","department":"Crew","job":"Executive Visual Effects Producer"},{"adult":false,"gender":0,"id":2143769,"known_for_department":"Costume & Make-Up","name":"Michelle Wraight","original_name":"Michelle Wraight","popularity":0.657,"profile_path":null,"credit_id":"5bcdf1bc0e0a26016b026e79","department":"Production","job":"Production Coordinator"},{"adult":false,"gender":0,"id":2144850,"known_for_department":"Production","name":"Alexander Hamilton Westmore","original_name":"Alexander Hamilton Westmore","popularity":0.98,"profile_path":null,"credit_id":"5bcdf0f90e0a26015f02649b","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":2145451,"known_for_department":"Visual Effects","name":"Dimitri Delacovias","original_name":"Dimitri Delacovias","popularity":1.4,"profile_path":null,"credit_id":"5bce13f1925141056f001d1f","department":"Visual Effects","job":"Matte Painter"},{"adult":false,"gender":0,"id":2146042,"known_for_department":"Costume & Make-Up","name":"Darlene Forrester","original_name":"Darlene Forrester","popularity":0.728,"profile_path":null,"credit_id":"5bcde4a4c3a368285e022b2c","department":"Costume & Make-Up","job":"Hairdresser"},{"adult":false,"gender":0,"id":2146979,"known_for_department":"Production","name":"Fiona May McLaren","original_name":"Fiona May McLaren","popularity":0.6,"profile_path":null,"credit_id":"5bcdd3c2c3a368285e02196a","department":"Production","job":"Assistant Accountant"},{"adult":false,"gender":0,"id":2148433,"known_for_department":"Visual Effects","name":"Jeremy Hey","original_name":"Jeremy Hey","popularity":0.98,"profile_path":null,"credit_id":"5bce111b0e0a265d44001967","department":"Visual Effects","job":"Digital Compositor"},{"adult":false,"gender":0,"id":2148557,"known_for_department":"Visual Effects","name":"Ellen E. Miki","original_name":"Ellen E. Miki","popularity":0.6,"profile_path":null,"credit_id":"5bce15bd9251410571001d72","department":"Visual Effects","job":"Rotoscoping Artist"},{"adult":true,"gender":0,"id":2149397,"known_for_department":"Production","name":"Jonathan Fox","original_name":"Jonathan Fox","popularity":0.6,"profile_path":null,"credit_id":"5bcde54e925141613e020d5c","department":"Production","job":"Key Production Assistant"},{"adult":false,"gender":0,"id":2150471,"known_for_department":"Production","name":"Jennifer Webb","original_name":"Jennifer Webb","popularity":0.6,"profile_path":null,"credit_id":"5bcdf1dec3a3682863027b27","department":"Production","job":"Production Coordinator"},{"adult":false,"gender":0,"id":2150940,"known_for_department":"Visual Effects","name":"Sotiris Georghiou","original_name":"Sotiris Georghiou","popularity":0.6,"profile_path":null,"credit_id":"5bce16879251410577001f62","department":"Visual Effects","job":"VFX Artist"},{"adult":false,"gender":0,"id":2151817,"known_for_department":"Crew","name":"Richard Wulf","original_name":"Richard Wulf","popularity":0.6,"profile_path":null,"credit_id":"5bcdc4bcc3a3682866024417","department":"Crew","job":"Stand In"},{"adult":false,"gender":0,"id":2151842,"known_for_department":"Crew","name":"Paul Harford","original_name":"Paul Harford","popularity":0.6,"profile_path":null,"credit_id":"5bcdfccf0e0a260168027f4c","department":"Crew","job":"Special Effects"},{"adult":false,"gender":0,"id":2155277,"known_for_department":"Production","name":"Crystal Munson","original_name":"Crystal Munson","popularity":0.6,"profile_path":null,"credit_id":"5bcdf0b8c3a3682866027d9a","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":2156081,"known_for_department":"Visual Effects","name":"Bryan Davis","original_name":"Bryan Davis","popularity":0.6,"profile_path":null,"credit_id":"5bcdd5610e0a26015b023a1b","department":"Production","job":"Assistant Production Coordinator"},{"adult":false,"gender":0,"id":2156217,"known_for_department":"Visual Effects","name":"Michelle Kuginis","original_name":"Michelle Kuginis","popularity":0.6,"profile_path":null,"credit_id":"5bce16bfc3a3683d6000221b","department":"Visual Effects","job":"Visual Effects Coordinator"},{"adult":false,"gender":0,"id":2156240,"known_for_department":"Art","name":"Glenn Forbes","original_name":"Glenn Forbes","popularity":0.6,"profile_path":null,"credit_id":"5bcdd5810e0a2601640234c6","department":"Art","job":"Assistant Property Master"},{"adult":false,"gender":0,"id":2156257,"known_for_department":"Lighting","name":"Ryan Huston","original_name":"Ryan Huston","popularity":0.6,"profile_path":null,"credit_id":"5bcdec1ec3a368285e023369","department":"Lighting","job":"Lighting Technician"},{"adult":false,"gender":0,"id":2156328,"known_for_department":"Crew","name":"Ryan Amborn","original_name":"Ryan Amborn","popularity":0.6,"profile_path":null,"credit_id":"5bcdfd2c0e0a26015b026db0","department":"Crew","job":"Special Effects Technician"},{"adult":false,"gender":0,"id":2157600,"known_for_department":"Production","name":"James Babiarz","original_name":"James Babiarz","popularity":0.6,"profile_path":null,"credit_id":"5bcdca9e0e0a26016b0240f9","department":"Production","job":"Additional Production Assistant"},{"adult":false,"gender":0,"id":2157603,"known_for_department":"Production","name":"Lindsay Heller","original_name":"Lindsay Heller","popularity":0.6,"profile_path":null,"credit_id":"5bcdd096c3a36828660253c5","department":"Production","job":"Additional Production Assistant"},{"adult":false,"gender":0,"id":2157604,"known_for_department":"Production","name":"Roger Mohn","original_name":"Roger Mohn","popularity":0.6,"profile_path":null,"credit_id":"5bcdd0a5c3a368285e021618","department":"Production","job":"Additional Production Assistant"},{"adult":false,"gender":0,"id":2157605,"known_for_department":"Production","name":"Mishi Reyes","original_name":"Mishi Reyes","popularity":0.6,"profile_path":null,"credit_id":"5bcdd0acc3a3682873022f83","department":"Production","job":"Additional Production Assistant"},{"adult":false,"gender":0,"id":2157606,"known_for_department":"Production","name":"Matthew Switzer","original_name":"Matthew Switzer","popularity":0.6,"profile_path":null,"credit_id":"5bcdd0b392514161340211f4","department":"Production","job":"Additional Production Assistant"},{"adult":false,"gender":0,"id":2157621,"known_for_department":"Art","name":"Clinton Wade Childress","original_name":"Clinton Wade Childress","popularity":0.84,"profile_path":null,"credit_id":"5bcdd35dc3a3682863025487","department":"Art","job":"Art Department Assistant"},{"adult":false,"gender":0,"id":2157625,"known_for_department":"Production","name":"Hellen Marin","original_name":"Hellen Marin","popularity":0.6,"profile_path":null,"credit_id":"5bcdd3b9c3a368286d0267b8","department":"Production","job":"Assistant Accountant"},{"adult":false,"gender":0,"id":2157627,"known_for_department":"Production","name":"Kelly Johnson-Beaven","original_name":"Kelly Johnson-Beaven","popularity":0.6,"profile_path":null,"credit_id":"5bcdd3c90e0a260151023efe","department":"Production","job":"Assistant Accountant"},{"adult":false,"gender":0,"id":2157633,"known_for_department":"Crew","name":"Ian Zweig","original_name":"Ian Zweig","popularity":0.6,"profile_path":null,"credit_id":"5bcdd4310e0a26015b0238b6","department":"Crew","job":"Assistant Chef"},{"adult":false,"gender":0,"id":2157634,"known_for_department":"Directing","name":"Tetsuo Funabashi","original_name":"Tetsuo Funabashi","popularity":0.6,"profile_path":null,"credit_id":"5bcdd4e6c3a368286602590c","department":"Directing","job":"Assistant Director"},{"adult":false,"gender":0,"id":2157635,"known_for_department":"Directing","name":"Mohammed Hamza Regragui","original_name":"Mohammed Hamza Regragui","popularity":0.6,"profile_path":null,"credit_id":"5bcdd4eec3a3682870026073","department":"Directing","job":"Assistant Director"},{"adult":false,"gender":0,"id":2157635,"known_for_department":"Directing","name":"Mohammed Hamza Regragui","original_name":"Mohammed Hamza Regragui","popularity":0.6,"profile_path":null,"credit_id":"5bcdf173925141613e021ba5","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":2157636,"known_for_department":"Directing","name":"Kevin Frilet","original_name":"Kevin Frilet","popularity":0.828,"profile_path":null,"credit_id":"5bcdd4f7925141613e01fb79","department":"Directing","job":"Assistant Director"},{"adult":false,"gender":0,"id":2157637,"known_for_department":"Editing","name":"Katie Hedrich","original_name":"Katie Hedrich","popularity":0.833,"profile_path":null,"credit_id":"5bcdd4ff925141613801fbd3","department":"Editing","job":"Assistant Editor"},{"adult":false,"gender":0,"id":2157638,"known_for_department":"Editing","name":"Ben Renton","original_name":"Ben Renton","popularity":0.6,"profile_path":null,"credit_id":"5bcdd50f9251416126021a06","department":"Editing","job":"Assistant Editor"},{"adult":false,"gender":0,"id":2157639,"known_for_department":"Production","name":"Bouchra Bentayeb","original_name":"Bouchra Bentayeb","popularity":0.6,"profile_path":null,"credit_id":"5bcdd54dc3a368286d02697a","department":"Production","job":"Assistant Production Coordinator"},{"adult":false,"gender":0,"id":2157640,"known_for_department":"Production","name":"Cheryl Brauer","original_name":"Cheryl Brauer","popularity":0.6,"profile_path":null,"credit_id":"5bcdd555925141613e01fbfe","department":"Production","job":"Assistant Production Coordinator"},{"adult":false,"gender":0,"id":2157641,"known_for_department":"Production","name":"Frédéric Millet","original_name":"Frédéric Millet","popularity":0.6,"profile_path":null,"credit_id":"5bcdd567925141613e01fc21","department":"Production","job":"Assistant Production Coordinator"},{"adult":false,"gender":0,"id":2157642,"known_for_department":"Crew","name":"Mardie Anderson","original_name":"Mardie Anderson","popularity":0.6,"profile_path":null,"credit_id":"5bcdd5b9925141613e01fc6e","department":"Crew","job":"Actor's Assistant"},{"adult":false,"gender":0,"id":2157643,"known_for_department":"Crew","name":"Kevin Proctor","original_name":"Kevin Proctor","popularity":0.6,"profile_path":null,"credit_id":"5bcdd5d99251416126021adc","department":"Crew","job":"Actor's Assistant"},{"adult":false,"gender":0,"id":2157644,"known_for_department":"Crew","name":"Jason Irizarry","original_name":"Jason Irizarry","popularity":0.6,"profile_path":null,"credit_id":"5bcdd5eb92514161340218aa","department":"Crew","job":"Actor's Assistant"},{"adult":false,"gender":0,"id":2157645,"known_for_department":"Crew","name":"Carrie Gooch","original_name":"Carrie Gooch","popularity":0.6,"profile_path":null,"credit_id":"5bcdd605c3a3682873023551","department":"Crew","job":"Actor's Assistant"},{"adult":false,"gender":0,"id":2157646,"known_for_department":"Camera","name":"Walter Byrnes","original_name":"Walter Byrnes","popularity":0.6,"profile_path":null,"credit_id":"5bcdd6380e0a26015b023b5b","department":"Camera","job":"Best Boy Grip"},{"adult":false,"gender":0,"id":2157647,"known_for_department":"Camera","name":"Michelle Ortt","original_name":"Michelle Ortt","popularity":0.6,"profile_path":null,"credit_id":"5bcdd655c3a368286d026ae7","department":"Camera","job":"Camera Loader"},{"adult":false,"gender":0,"id":2157650,"known_for_department":"Camera","name":"Brannon D. Brown","original_name":"Brannon D. Brown","popularity":0.6,"profile_path":null,"credit_id":"5bcdd69ac3a3682870026372","department":"Camera","job":"Camera Technician"},{"adult":false,"gender":0,"id":2157651,"known_for_department":"Camera","name":"Jonathan England","original_name":"Jonathan England","popularity":0.6,"profile_path":null,"credit_id":"5bcdd6a3925141612a021726","department":"Camera","job":"Camera Trainee"},{"adult":false,"gender":0,"id":2157652,"known_for_department":"Crew","name":"Alan Neighbour","original_name":"Alan Neighbour","popularity":0.6,"profile_path":null,"credit_id":"5bcdd6b792514161340219b2","department":"Crew","job":"Carpenter"},{"adult":false,"gender":0,"id":2157658,"known_for_department":"Crew","name":"Michael Prokop","original_name":"Michael Prokop","popularity":0.6,"profile_path":null,"credit_id":"5bcdd8559251416131023163","department":"Crew","job":"Chef"},{"adult":false,"gender":0,"id":2157659,"known_for_department":"Art","name":"Paul Christopher","original_name":"Paul Christopher","popularity":0.6,"profile_path":null,"credit_id":"5bcdd8da925141613801ffe4","department":"Art","job":"Concept Artist"},{"adult":false,"gender":0,"id":2157661,"known_for_department":"Art","name":"Robert Voysey","original_name":"Robert Voysey","popularity":0.6,"profile_path":null,"credit_id":"5bcdd949c3a368285e021eb5","department":"Art","job":"Construction Manager"},{"adult":false,"gender":0,"id":2157665,"known_for_department":"Costume & Make-Up","name":"Othmane Ajana","original_name":"Othmane Ajana","popularity":0.6,"profile_path":null,"credit_id":"5bcdd9bb0e0a26016802500c","department":"Costume & Make-Up","job":"Costume Assistant"},{"adult":false,"gender":0,"id":2157666,"known_for_department":"Costume & Make-Up","name":"Warren Haigh","original_name":"Warren Haigh","popularity":0.6,"profile_path":null,"credit_id":"5bcdd9c39251416134021d02","department":"Costume & Make-Up","job":"Costume Assistant"},{"adult":false,"gender":1,"id":2157667,"known_for_department":"Costume & Make-Up","name":"Caroline Hickman","original_name":"Caroline Hickman","popularity":0.6,"profile_path":null,"credit_id":"5bcdd9cb0e0a26015f0246fb","department":"Costume & Make-Up","job":"Costume Assistant"},{"adult":false,"gender":0,"id":2157672,"known_for_department":"Costume & Make-Up","name":"Frances Sweeney","original_name":"Frances Sweeney","popularity":0.6,"profile_path":null,"credit_id":"5bcddbac925141613b02119f","department":"Costume & Make-Up","job":"Costume Supervisor"},{"adult":false,"gender":0,"id":2157673,"known_for_department":"Costume & Make-Up","name":"Kurt J. Blackwell","original_name":"Kurt J. Blackwell","popularity":0.6,"profile_path":null,"credit_id":"5bcddbb4c3a3682863025e81","department":"Costume & Make-Up","job":"Costumer"},{"adult":false,"gender":0,"id":2157674,"known_for_department":"Costume & Make-Up","name":"Jennifer Nunez","original_name":"Jennifer Nunez","popularity":0.6,"profile_path":null,"credit_id":"5bcddbde0e0a26016b025622","department":"Costume & Make-Up","job":"Costumer"},{"adult":false,"gender":1,"id":2157675,"known_for_department":"Costume & Make-Up","name":"Nina Padovano","original_name":"Nina Padovano","popularity":0.6,"profile_path":null,"credit_id":"5bcddbe5c3a368287002692a","department":"Costume & Make-Up","job":"Costumer"},{"adult":false,"gender":0,"id":2157676,"known_for_department":"Crew","name":"Alice Cordie","original_name":"Alice Cordie","popularity":0.6,"profile_path":null,"credit_id":"5bcddd0a925141613102369c","department":"Crew","job":"Driver"},{"adult":false,"gender":0,"id":2157678,"known_for_department":"Crew","name":"Charles Miambanzila","original_name":"Charles Miambanzila","popularity":0.6,"profile_path":null,"credit_id":"5bcddda2c3a3682870026b65","department":"Crew","job":"Driver"},{"adult":false,"gender":0,"id":2157679,"known_for_department":"Crew","name":"Chris Morse","original_name":"Chris Morse","popularity":0.6,"profile_path":null,"credit_id":"5bcdddcd92514161260223a3","department":"Crew","job":"Driver"},{"adult":false,"gender":0,"id":2157680,"known_for_department":"Crew","name":"Andrew Thurlbourne","original_name":"Andrew Thurlbourne","popularity":0.662,"profile_path":null,"credit_id":"5bcdddd60e0a26015b0242b8","department":"Crew","job":"Driver"},{"adult":false,"gender":0,"id":2157681,"known_for_department":"Crew","name":"Terry Woodcock","original_name":"Terry Woodcock","popularity":0.6,"profile_path":null,"credit_id":"5bcdde33c3a368285e022404","department":"Crew","job":"Driver"},{"adult":false,"gender":0,"id":2157682,"known_for_department":"Crew","name":"Danny Bress","original_name":"Danny Bress","popularity":0.6,"profile_path":null,"credit_id":"5bcdde3f0e0a26016b02583d","department":"Crew","job":"Driver"},{"adult":false,"gender":0,"id":2157683,"known_for_department":"Crew","name":"Denis Gilmore","original_name":"Denis Gilmore","popularity":0.6,"profile_path":null,"credit_id":"5bcdde62c3a3682863026205","department":"Crew","job":"Driver"},{"adult":false,"gender":0,"id":2157684,"known_for_department":"Crew","name":"Alexandre Thiery","original_name":"Alexandre Thiery","popularity":0.6,"profile_path":null,"credit_id":"5bcdde9b92514161380205df","department":"Crew","job":"Driver"},{"adult":false,"gender":0,"id":2157685,"known_for_department":"Crew","name":"Jamie Barham","original_name":"Jamie Barham","popularity":0.6,"profile_path":null,"credit_id":"5bcddeb492514161340221a6","department":"Crew","job":"Driver"},{"adult":false,"gender":0,"id":2157686,"known_for_department":"Crew","name":"Kaiser Clark","original_name":"Kaiser Clark","popularity":0.6,"profile_path":null,"credit_id":"5bcddebcc3a3682873023da7","department":"Crew","job":"Driver"},{"adult":false,"gender":0,"id":2157687,"known_for_department":"Lighting","name":"Adil Arbouch","original_name":"Adil Arbouch","popularity":0.6,"profile_path":null,"credit_id":"5bcddf31c3a36828660264c2","department":"Lighting","job":"Electrician"},{"adult":false,"gender":0,"id":2157689,"known_for_department":"Lighting","name":"Matthew Butler","original_name":"Matthew Butler","popularity":0.6,"profile_path":null,"credit_id":"5bcddf7f0e0a26016b025953","department":"Lighting","job":"Electrician"},{"adult":false,"gender":0,"id":2157690,"known_for_department":"Lighting","name":"Steve Charnow","original_name":"Steve Charnow","popularity":0.6,"profile_path":null,"credit_id":"5bcddf87c3a368285e02254c","department":"Lighting","job":"Electrician"},{"adult":false,"gender":0,"id":2157692,"known_for_department":"Lighting","name":"Paul Jarvis","original_name":"Paul Jarvis","popularity":0.6,"profile_path":null,"credit_id":"5bcddfb30e0a26016202567b","department":"Lighting","job":"Electrician"},{"adult":false,"gender":0,"id":2157693,"known_for_department":"Lighting","name":"Thami Lahrach","original_name":"Thami Lahrach","popularity":0.98,"profile_path":null,"credit_id":"5bcddfc492514161260225d0","department":"Lighting","job":"Electrician"},{"adult":false,"gender":0,"id":2157697,"known_for_department":"Lighting","name":"Adam Lee","original_name":"Adam Lee","popularity":0.6,"profile_path":null,"credit_id":"5bcde0ebc3a3682876020abb","department":"Lighting","job":"Electrician"},{"adult":false,"gender":0,"id":2157698,"known_for_department":"Lighting","name":"William Lehnhart","original_name":"William Lehnhart","popularity":0.6,"profile_path":null,"credit_id":"5bcde0f3c3a36828630264c4","department":"Lighting","job":"Electrician"},{"adult":false,"gender":0,"id":2157701,"known_for_department":"Production","name":"Becky Maxwell","original_name":"Becky Maxwell","popularity":0.6,"profile_path":null,"credit_id":"5bcde16792514161380208fc","department":"Production","job":"First Assistant Accountant"},{"adult":false,"gender":0,"id":2157704,"known_for_department":"Production","name":"Carlo Pratto","original_name":"Carlo Pratto","popularity":1.382,"profile_path":null,"credit_id":"5bcde18dc3a368285e022783","department":"Production","job":"First Assistant Accountant"},{"adult":false,"gender":0,"id":2157705,"known_for_department":"Production","name":"Barbara Unrau","original_name":"Barbara Unrau","popularity":0.662,"profile_path":null,"credit_id":"5bcde1b10e0a26016e0248b4","department":"Production","job":"First Assistant Accountant"},{"adult":false,"gender":0,"id":2157706,"known_for_department":"Directing","name":"Ahmed Hatimi","original_name":"Ahmed Hatimi","popularity":0.6,"profile_path":null,"credit_id":"5bcde2320e0a26016b025cb2","department":"Directing","job":"First Assistant Director"},{"adult":false,"gender":0,"id":2157708,"known_for_department":"Camera","name":"Zakaria Badreddine","original_name":"Zakaria Badreddine","popularity":0.6,"profile_path":null,"credit_id":"5bcde260925141613b021827","department":"Camera","job":"Focus Puller"},{"adult":false,"gender":0,"id":2157710,"known_for_department":"Camera","name":"Pierre-Loup Corvez","original_name":"Pierre-Loup Corvez","popularity":0.6,"profile_path":null,"credit_id":"5bcde2ea0e0a260162025ad8","department":"Camera","job":"Grip"},{"adult":false,"gender":0,"id":2157712,"known_for_department":"Camera","name":"David Draper","original_name":"David Draper","popularity":0.6,"profile_path":null,"credit_id":"5bcde302c3a3682876020c83","department":"Camera","job":"Grip"},{"adult":false,"gender":0,"id":2157713,"known_for_department":"Camera","name":"Charles Ehrlinger","original_name":"Charles Ehrlinger","popularity":0.6,"profile_path":null,"credit_id":"5bcde3099251416138020b35","department":"Camera","job":"Grip"},{"adult":false,"gender":0,"id":2157714,"known_for_department":"Camera","name":"Hassan Hajhouj","original_name":"Hassan Hajhouj","popularity":0.6,"profile_path":null,"credit_id":"5bcde3120e0a260162025b13","department":"Camera","job":"Grip"},{"adult":false,"gender":0,"id":2157715,"known_for_department":"Camera","name":"Matt Perry","original_name":"Matt Perry","popularity":0.6,"profile_path":null,"credit_id":"5bcde3cc0e0a26015f0251e0","department":"Camera","job":"Grip"},{"adult":false,"gender":0,"id":2157716,"known_for_department":"Camera","name":"Tony Sommo","original_name":"Tony Sommo","popularity":0.6,"profile_path":null,"credit_id":"5bcde3dc0e0a260151025077","department":"Camera","job":"Grip"},{"adult":false,"gender":0,"id":2157717,"known_for_department":"Camera","name":"Benjamin Vial","original_name":"Benjamin Vial","popularity":0.6,"profile_path":null,"credit_id":"5bcde43dc3a368286a028505","department":"Camera","job":"Grip"},{"adult":false,"gender":0,"id":2157718,"known_for_department":"Camera","name":"Mark Wojciechowski","original_name":"Mark Wojciechowski","popularity":0.6,"profile_path":null,"credit_id":"5bcde44f9251416138020c9b","department":"Camera","job":"Grip"},{"adult":false,"gender":0,"id":2157719,"known_for_department":"Camera","name":"Arthur Ehret","original_name":"Arthur Ehret","popularity":0.6,"profile_path":null,"credit_id":"5bcde457c3a368287302436a","department":"Camera","job":"Grip"},{"adult":false,"gender":0,"id":2157749,"known_for_department":"Lighting","name":"Steve Zvorsky","original_name":"Steve Zvorsky","popularity":0.6,"profile_path":null,"credit_id":"5bcdec55c3a368287602159a","department":"Lighting","job":"Lighting Technician"},{"adult":false,"gender":0,"id":2157753,"known_for_department":"Costume & Make-Up","name":"Maggie Elliott","original_name":"Maggie Elliott","popularity":0.6,"profile_path":null,"credit_id":"5bcded5fc3a3682866027866","department":"Costume & Make-Up","job":"Makeup Artist"},{"adult":false,"gender":0,"id":2157757,"known_for_department":"Crew","name":"RJ Casey","original_name":"RJ Casey","popularity":0.694,"profile_path":null,"credit_id":"5bcdedb0c3a368286a02923d","department":"Crew","job":"Military Consultant"},{"adult":false,"gender":0,"id":2157758,"known_for_department":"Visual Effects","name":"Nicholas Hiegel","original_name":"Nicholas Hiegel","popularity":0.98,"profile_path":null,"credit_id":"5bcdedf60e0a260162026b69","department":"Visual Effects","job":"Modeling"},{"adult":false,"gender":0,"id":2157762,"known_for_department":"Production","name":"Joe Downs","original_name":"Joe Downs","popularity":0.6,"profile_path":null,"credit_id":"5bcdeea70e0a26016e0258b7","department":"Production","job":"Payroll Accountant"},{"adult":false,"gender":0,"id":2157771,"known_for_department":"Production","name":"Hailey Murray","original_name":"Hailey Murray","popularity":0.6,"profile_path":null,"credit_id":"5bcdef480e0a26016e0259ba","department":"Production","job":"Post Production Coordinator"},{"adult":false,"gender":0,"id":2157772,"known_for_department":"Production","name":"Daniel Paress","original_name":"Daniel Paress","popularity":0.6,"profile_path":null,"credit_id":"5bcdef520e0a2601510260a1","department":"Production","job":"Post Production Coordinator"},{"adult":false,"gender":0,"id":2157773,"known_for_department":"Production","name":"Kanjirô Sakura","original_name":"Kanjirô Sakura","popularity":0.6,"profile_path":null,"credit_id":"5bcdef72c3a368287002852f","department":"Production","job":"Producer"},{"adult":false,"gender":0,"id":2157775,"known_for_department":"Production","name":"Yoshikuni Taki","original_name":"Yoshikuni Taki","popularity":0.6,"profile_path":null,"credit_id":"5bcdef7992514161260237d1","department":"Production","job":"Producer"},{"adult":false,"gender":0,"id":2157776,"known_for_department":"Production","name":"Mustapha Bentayeb","original_name":"Mustapha Bentayeb","popularity":0.612,"profile_path":null,"credit_id":"5bcdef950e0a260168026c8e","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":2157777,"known_for_department":"Production","name":"Kohl V. Bladen","original_name":"Kohl V. Bladen","popularity":0.6,"profile_path":null,"credit_id":"5bcdef9b925141612d024f1f","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":2157779,"known_for_department":"Production","name":"Rey Boemi","original_name":"Rey Boemi","popularity":0.6,"profile_path":null,"credit_id":"5bcdefa192514161340233fd","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":2157780,"known_for_department":"Production","name":"Valeria Bullo","original_name":"Valeria Bullo","popularity":0.6,"profile_path":null,"credit_id":"5bcdefa8c3a3682876021a21","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":2157782,"known_for_department":"Production","name":"Tony Fang","original_name":"Tony Fang","popularity":0.6,"profile_path":null,"credit_id":"5bcdefb9c3a368286a02954f","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":2157783,"known_for_department":"Production","name":"Timothy Farmer","original_name":"Timothy Farmer","popularity":0.84,"profile_path":null,"credit_id":"5bcdefbf0e0a26016b026bf1","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":2157785,"known_for_department":"Production","name":"Jeff Feuerhaken","original_name":"Jeff Feuerhaken","popularity":0.6,"profile_path":null,"credit_id":"5bcdefda925141613e0219dc","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":2157787,"known_for_department":"Production","name":"Colter Freeman","original_name":"Colter Freeman","popularity":0.6,"profile_path":null,"credit_id":"5bcdefe50e0a260168026d1b","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":2157788,"known_for_department":"Production","name":"Derick Green","original_name":"Derick Green","popularity":0.6,"profile_path":null,"credit_id":"5bcdeff6c3a368287302520c","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":2157789,"known_for_department":"Production","name":"Khalid Guouram","original_name":"Khalid Guouram","popularity":0.6,"profile_path":null,"credit_id":"5bcdeffc925141612a023193","department":"Production","job":"Production Assistant"},{"adult":false,"gender":2,"id":2157790,"known_for_department":"Production","name":"Robert Hoehn","original_name":"Robert Hoehn","popularity":0.6,"profile_path":"/gUj7lrh7ragb8BB9moK3kuXqkKi.jpg","credit_id":"5bcdf00ac3a3682873025229","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":2157791,"known_for_department":"Production","name":"Ryley Huston","original_name":"Ryley Huston","popularity":0.6,"profile_path":null,"credit_id":"5bcdf012c3a3682873025238","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":2157793,"known_for_department":"Production","name":"C.J. Izzo","original_name":"C.J. Izzo","popularity":0.6,"profile_path":null,"credit_id":"5bcdf0180e0a26015b025ad4","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":2157796,"known_for_department":"Production","name":"Jordan Londe","original_name":"Jordan Londe","popularity":0.6,"profile_path":null,"credit_id":"5bcdf078925141612d02501c","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":2157797,"known_for_department":"Production","name":"Aurélie Maerten","original_name":"Aurélie Maerten","popularity":0.6,"profile_path":null,"credit_id":"5bcdf0a40e0a26016e025b6d","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":2157798,"known_for_department":"Production","name":"Mark McSorley","original_name":"Mark McSorley","popularity":0.6,"profile_path":null,"credit_id":"5bcdf0aac3a3682873025300","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":2157799,"known_for_department":"Production","name":"Troy Proffitt","original_name":"Troy Proffitt","popularity":0.6,"profile_path":null,"credit_id":"5bcdf0c4925141612d025084","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":2157801,"known_for_department":"Production","name":"Alexandra Pursglove","original_name":"Alexandra Pursglove","popularity":0.6,"profile_path":null,"credit_id":"5bcdf0cc0e0a260162026eb8","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":2157802,"known_for_department":"Production","name":"Jamie Reiff","original_name":"Jamie Reiff","popularity":0.6,"profile_path":null,"credit_id":"5bcdf0d40e0a26016e025bab","department":"Production","job":"Production Assistant"},{"adult":false,"gender":2,"id":2157803,"known_for_department":"Production","name":"Paul Michael Saldaña","original_name":"Paul Michael Saldaña","popularity":0.98,"profile_path":null,"credit_id":"5bcdf0db925141613b022a06","department":"Production","job":"Production Assistant"},{"adult":false,"gender":1,"id":2157806,"known_for_department":"Production","name":"Adela Tirado","original_name":"Adela Tirado","popularity":0.6,"profile_path":"/jAmQ1Uv2zF0OtXTxMSjppcx747g.jpg","credit_id":"5bcdf1670e0a260151026357","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":2157807,"known_for_department":"Production","name":"Darius de Andrade","original_name":"Darius de Andrade","popularity":0.6,"profile_path":null,"credit_id":"5bcdf17a0e0a26016b026e11","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":2157808,"known_for_department":"Production","name":"Tucker Maloney","original_name":"Tucker Maloney","popularity":0.6,"profile_path":null,"credit_id":"5bcdf1810e0a260168026fed","department":"Production","job":"Production Assistant"},{"adult":false,"gender":0,"id":2157810,"known_for_department":"Production","name":"Khadja Koulla","original_name":"Khadja Koulla","popularity":0.6,"profile_path":null,"credit_id":"5bcdf1a1c3a368286a029842","department":"Production","job":"Production Coordinator"},{"adult":false,"gender":0,"id":2157812,"known_for_department":"Production","name":"Hollie Foster","original_name":"Hollie Foster","popularity":0.6,"profile_path":null,"credit_id":"5bcdf1d40e0a26016b026ea8","department":"Production","job":"Production Coordinator"},{"adult":false,"gender":0,"id":2157813,"known_for_department":"Production","name":"Barbara Russo","original_name":"Barbara Russo","popularity":0.6,"profile_path":null,"credit_id":"5bcdf2060e0a2601640259c6","department":"Production","job":"Production Manager"},{"adult":false,"gender":0,"id":2157814,"known_for_department":"Production","name":"Morgan Ahlborn","original_name":"Morgan Ahlborn","popularity":0.6,"profile_path":null,"credit_id":"5bcdf239c3a3682873025554","department":"Production","job":"Production Secretary"},{"adult":false,"gender":0,"id":2157816,"known_for_department":"Production","name":"Helen Christine Dwyer","original_name":"Helen Christine Dwyer","popularity":0.6,"profile_path":null,"credit_id":"5bcdf2420e0a26016e025e33","department":"Production","job":"Production Secretary"},{"adult":false,"gender":0,"id":2157818,"known_for_department":"Crew","name":"Michael Pennington","original_name":"Michael Pennington","popularity":0.6,"profile_path":null,"credit_id":"5bcdf2d49251416134023889","department":"Crew","job":"Prop Maker"},{"adult":false,"gender":0,"id":2157821,"known_for_department":"Art","name":"Shelly Goldsack","original_name":"Shelly Goldsack","popularity":0.6,"profile_path":null,"credit_id":"5bcdf3ad0e0a26015f026930","department":"Art","job":"Property Master"},{"adult":false,"gender":0,"id":2157822,"known_for_department":"Art","name":"Matthew Broderick","original_name":"Matthew Broderick","popularity":0.6,"profile_path":null,"credit_id":"5bcdf4300e0a26016e02611a","department":"Art","job":"Props"},{"adult":false,"gender":0,"id":2157823,"known_for_department":"Art","name":"Karim Elamri","original_name":"Karim Elamri","popularity":0.6,"profile_path":null,"credit_id":"5bcdf43a925141612d025622","department":"Art","job":"Props"},{"adult":false,"gender":0,"id":2157824,"known_for_department":"Art","name":"Ashlie Jump","original_name":"Ashlie Jump","popularity":0.6,"profile_path":null,"credit_id":"5bcdf475925141613b022f4a","department":"Art","job":"Props"},{"adult":false,"gender":0,"id":2157825,"known_for_department":"Art","name":"Tiara Motem","original_name":"Tiara Motem","popularity":0.6,"profile_path":null,"credit_id":"5bcdf490c3a368286a029dbc","department":"Art","job":"Props"},{"adult":false,"gender":0,"id":2157826,"known_for_department":"Art","name":"Francois Poublan","original_name":"Francois Poublan","popularity":0.6,"profile_path":null,"credit_id":"5bcdf497c3a368286d029661","department":"Art","job":"Props"},{"adult":false,"gender":0,"id":2157827,"known_for_department":"Art","name":"Gregor Telfer","original_name":"Gregor Telfer","popularity":0.6,"profile_path":null,"credit_id":"5bcdf49dc3a3682863027ffc","department":"Art","job":"Props"},{"adult":false,"gender":0,"id":2157829,"known_for_department":"Crew","name":"Michael Kay","original_name":"Michael Kay","popularity":0.6,"profile_path":null,"credit_id":"5bcdf711c3a368287002919e","department":"Crew","job":"Pyrotechnician"},{"adult":false,"gender":0,"id":2157831,"known_for_department":"Art","name":"Sarena Bhargava","original_name":"Sarena Bhargava","popularity":0.6,"profile_path":null,"credit_id":"5bcdf7c7c3a36828760222b5","department":"Art","job":"Sculptor"},{"adult":false,"gender":0,"id":2157832,"known_for_department":"Production","name":"Tara Howie","original_name":"Tara Howie","popularity":0.6,"profile_path":null,"credit_id":"5bcdf7e3c3a36828630283c8","department":"Production","job":"Second Assistant Accountant"},{"adult":false,"gender":0,"id":2157833,"known_for_department":"Camera","name":"Carrie Wilson","original_name":"Carrie Wilson","popularity":0.6,"profile_path":null,"credit_id":"5bcdf80cc3a368285e02429b","department":"Camera","job":"Second Assistant Camera"},{"adult":false,"gender":0,"id":2157834,"known_for_department":"Camera","name":"Allison Shok","original_name":"Allison Shok","popularity":0.6,"profile_path":null,"credit_id":"5bcdf82c0e0a2601640262b6","department":"Camera","job":"Second Assistant Camera"},{"adult":false,"gender":0,"id":2157835,"known_for_department":"Camera","name":"Eric Yu","original_name":"Eric Yu","popularity":0.6,"profile_path":null,"credit_id":"5bcdf862c3a3682873025c47","department":"Camera","job":"Second Assistant Camera"},{"adult":false,"gender":0,"id":2157836,"known_for_department":"Directing","name":"William D. Robinson","original_name":"William D. Robinson","popularity":0.6,"profile_path":null,"credit_id":"5bcdf881c3a36828630284e2","department":"Directing","job":"Second Assistant Director"},{"adult":false,"gender":0,"id":2157837,"known_for_department":"Directing","name":"Tracey Poirier","original_name":"Tracey Poirier","popularity":2.086,"profile_path":null,"credit_id":"5bcdf889925141612d025bd2","department":"Directing","job":"Second Assistant Director"},{"adult":false,"gender":0,"id":2157840,"known_for_department":"Costume & Make-Up","name":"Caroline Delaney","original_name":"Caroline Delaney","popularity":0.6,"profile_path":null,"credit_id":"5bcdf93d0e0a260151026dd6","department":"Costume & Make-Up","job":"Set Costumer"},{"adult":false,"gender":0,"id":2157841,"known_for_department":"Art","name":"Lahcen Elyazidi","original_name":"Lahcen Elyazidi","popularity":0.6,"profile_path":null,"credit_id":"5bcdf9ae0e0a26015b0268b6","department":"Art","job":"Set Dresser"},{"adult":false,"gender":0,"id":2157842,"known_for_department":"Art","name":"Antonio Nogueira","original_name":"Antonio Nogueira","popularity":0.6,"profile_path":null,"credit_id":"5bcdf9e1c3a3682870029541","department":"Art","job":"Set Dresser"},{"adult":false,"gender":0,"id":2157843,"known_for_department":"Art","name":"Thibaut Peschard","original_name":"Thibaut Peschard","popularity":0.6,"profile_path":null,"credit_id":"5bcdf9eb0e0a260168027b0b","department":"Art","job":"Set Dresser"},{"adult":false,"gender":0,"id":2157844,"known_for_department":"Crew","name":"Emily O'Banion","original_name":"Emily O'Banion","popularity":0.6,"profile_path":null,"credit_id":"5bcdfa11c3a36828760224bb","department":"Crew","job":"Set Medic"},{"adult":false,"gender":0,"id":2157845,"known_for_department":"Crew","name":"Sam Alvelo","original_name":"Sam Alvelo","popularity":0.6,"profile_path":null,"credit_id":"5bcdfa51c3a36828700295bc","department":"Crew","job":"Set Production Assistant"},{"adult":false,"gender":0,"id":2157846,"known_for_department":"Crew","name":"Jayson Chang","original_name":"Jayson Chang","popularity":0.6,"profile_path":null,"credit_id":"5bcdfa6a0e0a26016b0279f4","department":"Crew","job":"Set Production Assistant"},{"adult":false,"gender":0,"id":2157847,"known_for_department":"Crew","name":"Heather Kehayas","original_name":"Heather Kehayas","popularity":0.98,"profile_path":null,"credit_id":"5bcdfa7e0e0a260168027c39","department":"Crew","job":"Set Production Assistant"},{"adult":false,"gender":0,"id":2157848,"known_for_department":"Crew","name":"Kelly Lane","original_name":"Kelly Lane","popularity":0.6,"profile_path":null,"credit_id":"5bcdfaaac3a368285e024576","department":"Crew","job":"Set Production Assistant"},{"adult":false,"gender":0,"id":2157849,"known_for_department":"Crew","name":"Mandy Noack","original_name":"Mandy Noack","popularity":0.6,"profile_path":null,"credit_id":"5bcdfac2c3a368287002969f","department":"Crew","job":"Set Production Assistant"},{"adult":false,"gender":0,"id":2157850,"known_for_department":"Crew","name":"Gerson Paz","original_name":"Gerson Paz","popularity":0.6,"profile_path":null,"credit_id":"5bcdfac9c3a368286a02a670","department":"Crew","job":"Set Production Assistant"},{"adult":false,"gender":0,"id":2157851,"known_for_department":"Crew","name":"Prashant Roy","original_name":"Prashant Roy","popularity":0.6,"profile_path":null,"credit_id":"5bcdfacfc3a36828700296bb","department":"Crew","job":"Set Production Assistant"},{"adult":false,"gender":0,"id":2157853,"known_for_department":"Crew","name":"Sean Ip Fung Chun","original_name":"Sean Ip Fung Chun","popularity":0.6,"profile_path":null,"credit_id":"5bcdfb1f925141613b0237cb","department":"Crew","job":"Set Production Assistant"},{"adult":false,"gender":0,"id":2157855,"known_for_department":"Crew","name":"Alexander Fabre","original_name":"Alexander Fabre","popularity":0.6,"profile_path":null,"credit_id":"5bcdfc519251416126024ae3","department":"Crew","job":"Special Effects"},{"adult":false,"gender":0,"id":2157857,"known_for_department":"Crew","name":"Tom Goodman","original_name":"Tom Goodman","popularity":0.6,"profile_path":null,"credit_id":"5bcdfcc6925141613b0239ec","department":"Crew","job":"Special Effects"},{"adult":false,"gender":0,"id":2157859,"known_for_department":"Crew","name":"Pete Britten","original_name":"Pete Britten","popularity":0.6,"profile_path":null,"credit_id":"5bcdfce0c3a3682866028e80","department":"Crew","job":"Special Effects Assistant"},{"adult":false,"gender":0,"id":2157860,"known_for_department":"Crew","name":"Jeremy Maupin","original_name":"Jeremy Maupin","popularity":0.6,"profile_path":null,"credit_id":"5bcdfce7925141612d02609d","department":"Crew","job":"Special Effects Assistant"},{"adult":false,"gender":0,"id":2157863,"known_for_department":"Crew","name":"Kelly Coe","original_name":"Kelly Coe","popularity":0.6,"profile_path":null,"credit_id":"5bcdfd330e0a26015b026dbe","department":"Crew","job":"Special Effects Technician"},{"adult":false,"gender":0,"id":2157864,"known_for_department":"Crew","name":"Jody Eltham","original_name":"Jody Eltham","popularity":0.6,"profile_path":null,"credit_id":"5bcdfd46925141613e022c9f","department":"Crew","job":"Special Effects Technician"},{"adult":false,"gender":0,"id":2157865,"known_for_department":"Crew","name":"Thomas R. Homsher","original_name":"Thomas R. Homsher","popularity":1.38,"profile_path":null,"credit_id":"5bcdfd4d925141613402461e","department":"Crew","job":"Special Effects Technician"},{"adult":false,"gender":0,"id":2157866,"known_for_department":"Crew","name":"Hanin Ouidder","original_name":"Hanin Ouidder","popularity":0.6,"profile_path":null,"credit_id":"5bcdfd53c3a368286a02a993","department":"Crew","job":"Special Effects Technician"},{"adult":false,"gender":0,"id":2157867,"known_for_department":"Crew","name":"Jim Rollins","original_name":"Jim Rollins","popularity":0.6,"profile_path":null,"credit_id":"5bcdfdcb9251416126024c57","department":"Crew","job":"Special Effects Technician"},{"adult":false,"gender":0,"id":2157868,"known_for_department":"Crew","name":"Clark Templeman","original_name":"Clark Templeman","popularity":0.6,"profile_path":null,"credit_id":"5bcdfdfd0e0a26016b027dd8","department":"Crew","job":"Special Effects Technician"},{"adult":false,"gender":2,"id":2157869,"known_for_department":"Crew","name":"Leo Leoncio Solis","original_name":"Leo Leoncio Solis","popularity":0.6,"profile_path":null,"credit_id":"5bcdfe13c3a368286d02a3a7","department":"Crew","job":"Special Effects Technician"},{"adult":false,"gender":0,"id":2157870,"known_for_department":"Crew","name":"Chris Grondin","original_name":"Chris Grondin","popularity":0.6,"profile_path":null,"credit_id":"5bcdfe240e0a26016b027e08","department":"Crew","job":"Special Effects Technician"},{"adult":false,"gender":0,"id":2157874,"known_for_department":"Crew","name":"Fabrizia Dal Farra","original_name":"Fabrizia Dal Farra","popularity":0.6,"profile_path":null,"credit_id":"5bcdff159251410571000105","department":"Crew","job":"Stand In"},{"adult":false,"gender":0,"id":2157875,"known_for_department":"Crew","name":"Alex Richard","original_name":"Alex Richard","popularity":0.6,"profile_path":null,"credit_id":"5bcdff2ac3a3683d7300012c","department":"Crew","job":"Stand In"},{"adult":false,"gender":0,"id":2157876,"known_for_department":"Crew","name":"David A. Burt","original_name":"David A. Burt","popularity":0.6,"profile_path":null,"credit_id":"5bcdff309251410587000133","department":"Crew","job":"Stand In"},{"adult":false,"gender":2,"id":2157877,"known_for_department":"Crew","name":"Michael James Faradie","original_name":"Michael James Faradie","popularity":0.6,"profile_path":null,"credit_id":"5bcdff539251410574000164","department":"Crew","job":"Stand In"},{"adult":false,"gender":0,"id":2157878,"known_for_department":"Crew","name":"Caroline Fife","original_name":"Caroline Fife","popularity":0.6,"profile_path":null,"credit_id":"5bcdff5b9251410577000197","department":"Crew","job":"Stand In"},{"adult":false,"gender":0,"id":2157880,"known_for_department":"Directing","name":"Lorie Gibson","original_name":"Lorie Gibson","popularity":0.6,"profile_path":null,"credit_id":"5bcdffd60e0a265d350001b4","department":"Directing","job":"Third Assistant Director"},{"adult":false,"gender":0,"id":2157881,"known_for_department":"Directing","name":"Gordon Piper","original_name":"Gordon Piper","popularity":0.6,"profile_path":null,"credit_id":"5bcdfffcc3a3683d5a000273","department":"Directing","job":"Third Assistant Director"},{"adult":false,"gender":0,"id":2157882,"known_for_department":"Directing","name":"Jody Ryan","original_name":"Jody Ryan","popularity":0.6,"profile_path":null,"credit_id":"5bce000e0e0a265d2d0001f8","department":"Directing","job":"Third Assistant Director"},{"adult":false,"gender":0,"id":2157886,"known_for_department":"Crew","name":"Todd W. Nobles","original_name":"Todd W. Nobles","popularity":0.6,"profile_path":null,"credit_id":"5bce04c80e0a265d2b00099b","department":"Crew","job":"Transportation Captain"},{"adult":false,"gender":0,"id":2157887,"known_for_department":"Crew","name":"Steve Bridgen","original_name":"Steve Bridgen","popularity":0.6,"profile_path":null,"credit_id":"5bce04cfc3a3683d58000960","department":"Crew","job":"Transportation Captain"},{"adult":false,"gender":0,"id":2157889,"known_for_department":"Camera","name":"Sky Rockit","original_name":"Sky Rockit","popularity":0.6,"profile_path":null,"credit_id":"5bce052c925141057e00097f","department":"Camera","job":"Ultimate Arm Operator"},{"adult":false,"gender":0,"id":2157891,"known_for_department":"Production","name":"Shuhei Okabayashi","original_name":"Shuhei Okabayashi","popularity":0.6,"profile_path":null,"credit_id":"5bce05990e0a265d35000f0d","department":"Production","job":"Unit Production Manager"},{"adult":false,"gender":0,"id":2157906,"known_for_department":"Visual Effects","name":"Wesley Roberts","original_name":"Wesley Roberts","popularity":0.6,"profile_path":null,"credit_id":"5bce0f110e0a265d2d00167e","department":"Visual Effects","job":"Digital Compositor"},{"adult":false,"gender":0,"id":2157906,"known_for_department":"Visual Effects","name":"Wesley Roberts","original_name":"Wesley Roberts","popularity":0.6,"profile_path":null,"credit_id":"5bce0ef5c3a3683d69001517","department":"Visual Effects","job":"2D Artist"},{"adult":false,"gender":1,"id":2157907,"known_for_department":"Crew","name":"Vanessa Gratton","original_name":"Vanessa Gratton","popularity":0.6,"profile_path":null,"credit_id":"5bce0f69c3a3683d6300185b","department":"Crew","job":"CG Supervisor"},{"adult":false,"gender":0,"id":2157908,"known_for_department":"Crew","name":"Phillip Johnson","original_name":"Phillip Johnson","popularity":0.6,"profile_path":null,"credit_id":"5bce0f8292514105770015bf","department":"Crew","job":"CG Supervisor"},{"adult":false,"gender":0,"id":2157910,"known_for_department":"Crew","name":"Astrid Busser-Casas","original_name":"Astrid Busser-Casas","popularity":0.6,"profile_path":null,"credit_id":"5bce0fdfc3a3683d5a001750","department":"Crew","job":"Sequence Supervisor"},{"adult":false,"gender":0,"id":2157912,"known_for_department":"Crew","name":"Matthew Jacques","original_name":"Matthew Jacques","popularity":0.6,"profile_path":null,"credit_id":"5bce100f0e0a265d440017d6","department":"Crew","job":"Compositor"},{"adult":false,"gender":0,"id":2157913,"known_for_department":"Crew","name":"Sonny Pye","original_name":"Sonny Pye","popularity":0.6,"profile_path":null,"credit_id":"5bce1022925141057a0018ee","department":"Crew","job":"Compositor"},{"adult":false,"gender":0,"id":2157914,"known_for_department":"Crew","name":"Chandan Singh","original_name":"Chandan Singh","popularity":0.6,"profile_path":null,"credit_id":"5bce102992514105710015f9","department":"Crew","job":"Compositor"},{"adult":false,"gender":0,"id":2157915,"known_for_department":"Crew","name":"Oscar Tornincasa","original_name":"Oscar Tornincasa","popularity":0.6,"profile_path":null,"credit_id":"5bce102fc3a3683d730018ec","department":"Crew","job":"Compositor"},{"adult":false,"gender":0,"id":2157916,"known_for_department":"Crew","name":"Susanne Becker","original_name":"Susanne Becker","popularity":0.6,"profile_path":null,"credit_id":"5bce1040925141056f0017e8","department":"Crew","job":"Compositor"},{"adult":false,"gender":0,"id":2157917,"known_for_department":"Crew","name":"Bimla Chall","original_name":"Bimla Chall","popularity":0.6,"profile_path":null,"credit_id":"5bce10469251410581001867","department":"Crew","job":"Compositor"},{"adult":false,"gender":0,"id":2157918,"known_for_department":"Crew","name":"Dan Churchill","original_name":"Dan Churchill","popularity":0.6,"profile_path":null,"credit_id":"5bce1058c3a3683d5a00181f","department":"Crew","job":"Compositor"},{"adult":false,"gender":0,"id":2157919,"known_for_department":"Crew","name":"Helgi Laxdal","original_name":"Helgi Laxdal","popularity":0.6,"profile_path":null,"credit_id":"5bce1079c3a3683d5800199e","department":"Crew","job":"Compositor"},{"adult":false,"gender":0,"id":2157920,"known_for_department":"Crew","name":"Alice Mitchell","original_name":"Alice Mitchell","popularity":0.6,"profile_path":null,"credit_id":"5bce1088c3a3683d6600192c","department":"Crew","job":"Compositor"},{"adult":false,"gender":0,"id":2157921,"known_for_department":"Crew","name":"Per Mørk-Jensen","original_name":"Per Mørk-Jensen","popularity":0.6,"profile_path":null,"credit_id":"5bce1091c3a3683d73001979","department":"Crew","job":"Compositor"},{"adult":false,"gender":0,"id":2157922,"known_for_department":"Crew","name":"Mark Payne","original_name":"Mark Payne","popularity":0.6,"profile_path":null,"credit_id":"5bce10980e0a265d400019d3","department":"Crew","job":"Compositor"},{"adult":false,"gender":0,"id":2157923,"known_for_department":"Crew","name":"Sharon Warmington","original_name":"Sharon Warmington","popularity":0.6,"profile_path":null,"credit_id":"5bce10b90e0a265d40001a05","department":"Crew","job":"Compositor"},{"adult":false,"gender":0,"id":2157924,"known_for_department":"Crew","name":"Helen Wood","original_name":"Helen Wood","popularity":0.6,"profile_path":null,"credit_id":"5bce10e892514105740016f9","department":"Crew","job":"Compositor"},{"adult":false,"gender":0,"id":2157927,"known_for_department":"Visual Effects","name":"Ami Patel","original_name":"Ami Patel","popularity":0.6,"profile_path":null,"credit_id":"5bce112f9251410587001961","department":"Visual Effects","job":"Digital Compositor"},{"adult":false,"gender":0,"id":2157928,"known_for_department":"Visual Effects","name":"Miodrag Colombo","original_name":"Miodrag Colombo","popularity":1.38,"profile_path":null,"credit_id":"5bce11790e0a265d2d001a17","department":"Visual Effects","job":"Visual Effects"},{"adult":false,"gender":0,"id":2157928,"known_for_department":"Visual Effects","name":"Miodrag Colombo","original_name":"Miodrag Colombo","popularity":1.38,"profile_path":null,"credit_id":"5bce11b7c3a3683d63001bb8","department":"Visual Effects","job":"Digital Compositor"},{"adult":false,"gender":0,"id":2157929,"known_for_department":"Visual Effects","name":"Adam Hammond","original_name":"Adam Hammond","popularity":0.6,"profile_path":null,"credit_id":"5bce11a39251410587001a14","department":"Visual Effects","job":"Visual Effects"},{"adult":false,"gender":0,"id":2157929,"known_for_department":"Visual Effects","name":"Adam Hammond","original_name":"Adam Hammond","popularity":0.6,"profile_path":null,"credit_id":"5bce11bf925141057a001b06","department":"Visual Effects","job":"Digital Compositor"},{"adult":false,"gender":0,"id":2157930,"known_for_department":"Visual Effects","name":"Kim Wiseman","original_name":"Kim Wiseman","popularity":0.6,"profile_path":null,"credit_id":"5bce11ac0e0a265d2d001a67","department":"Visual Effects","job":"Visual Effects"},{"adult":false,"gender":0,"id":2157930,"known_for_department":"Visual Effects","name":"Kim Wiseman","original_name":"Kim Wiseman","popularity":0.6,"profile_path":null,"credit_id":"5bce11c69251410581001af9","department":"Visual Effects","job":"Digital Compositor"},{"adult":false,"gender":0,"id":2157932,"known_for_department":"Visual Effects","name":"Graham Day","original_name":"Graham Day","popularity":0.6,"profile_path":null,"credit_id":"5bce11de0e0a265d39001b4e","department":"Visual Effects","job":"Digital Compositor"},{"adult":false,"gender":0,"id":2157934,"known_for_department":"Visual Effects","name":"Andi Dorfan","original_name":"Andi Dorfan","popularity":0.6,"profile_path":null,"credit_id":"5bce11ea0e0a265d31001c72","department":"Visual Effects","job":"Digital Compositor"},{"adult":false,"gender":0,"id":2157936,"known_for_department":"Visual Effects","name":"Peter Vickery","original_name":"Peter Vickery","popularity":0.6,"profile_path":null,"credit_id":"5bce12160e0a265d2b001c03","department":"Visual Effects","job":"Digital Compositor"},{"adult":false,"gender":0,"id":2157938,"known_for_department":"Visual Effects","name":"Annie V. Wong","original_name":"Annie V. Wong","popularity":0.6,"profile_path":null,"credit_id":"5bce121f9251410581001bb6","department":"Visual Effects","job":"Digital Compositor"},{"adult":false,"gender":0,"id":2157939,"known_for_department":"Visual Effects","name":"Thomas Luff","original_name":"Thomas Luff","popularity":0.6,"profile_path":null,"credit_id":"5bce12649251410587001b43","department":"Visual Effects","job":"Digital Compositor"},{"adult":false,"gender":0,"id":2157940,"known_for_department":"Visual Effects","name":"Stephen Tew","original_name":"Stephen Tew","popularity":0.6,"profile_path":null,"credit_id":"5bce12b8c3a3683d63001d45","department":"Visual Effects","job":"Rotoscoping Artist"},{"adult":false,"gender":0,"id":2157941,"known_for_department":"Visual Effects","name":"Joe Thornley","original_name":"Joe Thornley","popularity":0.6,"profile_path":null,"credit_id":"5bce12ec9251410581001ca4","department":"Visual Effects","job":"VFX Artist"},{"adult":false,"gender":0,"id":2157942,"known_for_department":"Visual Effects","name":"Diccon Alexander","original_name":"Diccon Alexander","popularity":0.6,"profile_path":null,"credit_id":"5bce13aa0e0a265d39001dfb","department":"Visual Effects","job":"Matte Painter"},{"adult":false,"gender":0,"id":2157943,"known_for_department":"Visual Effects","name":"Philippe Gaulier","original_name":"Philippe Gaulier","popularity":0.6,"profile_path":null,"credit_id":"5bce13dec3a3683d6f001b42","department":"Visual Effects","job":"Matte Painter"},{"adult":false,"gender":0,"id":2157944,"known_for_department":"Visual Effects","name":"Enrico Altmann","original_name":"Enrico Altmann","popularity":0.6,"profile_path":null,"credit_id":"5bce1410c3a3683d60001e18","department":"Visual Effects","job":"Modeling"},{"adult":false,"gender":0,"id":2157945,"known_for_department":"Visual Effects","name":"Noah DePietro","original_name":"Noah DePietro","popularity":0.6,"profile_path":null,"credit_id":"5bce14169251410574001eb0","department":"Visual Effects","job":"Modeling"},{"adult":false,"gender":0,"id":2157946,"known_for_department":"Visual Effects","name":"Dave Horowitz","original_name":"Dave Horowitz","popularity":0.6,"profile_path":null,"credit_id":"5bce141d925141057e001bdc","department":"Visual Effects","job":"Modeling"},{"adult":false,"gender":0,"id":2157947,"known_for_department":"Visual Effects","name":"Kayte Sabicer","original_name":"Kayte Sabicer","popularity":0.6,"profile_path":null,"credit_id":"5bce142fc3a3683d58001f27","department":"Visual Effects","job":"Modeling"},{"adult":false,"gender":0,"id":2157948,"known_for_department":"Visual Effects","name":"Marcelo M. Santos","original_name":"Marcelo M. Santos","popularity":0.6,"profile_path":null,"credit_id":"5bce14390e0a265d3c001d92","department":"Visual Effects","job":"Modeling"},{"adult":false,"gender":0,"id":2157949,"known_for_department":"Visual Effects","name":"Paula Schneider","original_name":"Paula Schneider","popularity":0.6,"profile_path":null,"credit_id":"5bce14410e0a265d39001fca","department":"Visual Effects","job":"Modeling"},{"adult":false,"gender":0,"id":2157950,"known_for_department":"Production","name":"E.M. Bowen","original_name":"E.M. Bowen","popularity":0.6,"profile_path":null,"credit_id":"5bce146bc3a3683d58001f90","department":"Production","job":"Production Manager"},{"adult":false,"gender":0,"id":2157951,"known_for_department":"Visual Effects","name":"Arun Sharma","original_name":"Arun Sharma","popularity":0.6,"profile_path":null,"credit_id":"5bce14cfc3a3683d69001cf1","department":"Visual Effects","job":"Rotoscoping Artist"},{"adult":false,"gender":0,"id":2157953,"known_for_department":"Visual Effects","name":"Sherin Varghese","original_name":"Sherin Varghese","popularity":0.98,"profile_path":null,"credit_id":"5bce14d9925141057a001f3e","department":"Visual Effects","job":"Rotoscoping Artist"},{"adult":false,"gender":0,"id":2157954,"known_for_department":"Visual Effects","name":"Tara Roseblade","original_name":"Tara Roseblade","popularity":0.6,"profile_path":null,"credit_id":"5bce14ee9251410574001fc2","department":"Visual Effects","job":"Rotoscoping Artist"},{"adult":false,"gender":0,"id":2157955,"known_for_department":"Visual Effects","name":"Yoav Dolev","original_name":"Yoav Dolev","popularity":0.6,"profile_path":null,"credit_id":"5bce14f50e0a265d4000210d","department":"Visual Effects","job":"Rotoscoping Artist"},{"adult":false,"gender":0,"id":2157956,"known_for_department":"Visual Effects","name":"Luke Ballard","original_name":"Luke Ballard","popularity":0.6,"profile_path":null,"credit_id":"5bce1505c3a3683d66002058","department":"Visual Effects","job":"Rotoscoping Artist"},{"adult":false,"gender":0,"id":2157957,"known_for_department":"Visual Effects","name":"Christopher Jaques","original_name":"Christopher Jaques","popularity":0.6,"profile_path":null,"credit_id":"5bce1514c3a3683d69001d4e","department":"Visual Effects","job":"Rotoscoping Artist"},{"adult":false,"gender":0,"id":2157962,"known_for_department":"Visual Effects","name":"Kevin Norris","original_name":"Kevin Norris","popularity":0.6,"profile_path":null,"credit_id":"5bce155b9251410571001cfc","department":"Visual Effects","job":"Rotoscoping Artist"},{"adult":false,"gender":0,"id":2157964,"known_for_department":"Visual Effects","name":"Mary Stroumpouli","original_name":"Mary Stroumpouli","popularity":0.6,"profile_path":null,"credit_id":"5bce1563c3a3683d580020c9","department":"Visual Effects","job":"Rotoscoping Artist"},{"adult":false,"gender":0,"id":2157965,"known_for_department":"Visual Effects","name":"Luke Bigley","original_name":"Luke Bigley","popularity":0.6,"profile_path":null,"credit_id":"5bce1571925141056f001f33","department":"Visual Effects","job":"Rotoscoping Artist"},{"adult":false,"gender":0,"id":2157968,"known_for_department":"Visual Effects","name":"Lester Brown","original_name":"Lester Brown","popularity":0.6,"profile_path":null,"credit_id":"5bce15860e0a265d3c001f9b","department":"Visual Effects","job":"Rotoscoping Artist"},{"adult":false,"gender":0,"id":2157971,"known_for_department":"Visual Effects","name":"Yousaf Main","original_name":"Yousaf Main","popularity":0.6,"profile_path":null,"credit_id":"5bce15a7925141057a002069","department":"Visual Effects","job":"Rotoscoping Artist"},{"adult":false,"gender":0,"id":2157972,"known_for_department":"Visual Effects","name":"Enrik Pavdeja","original_name":"Enrik Pavdeja","popularity":0.6,"profile_path":null,"credit_id":"5bce15aec3a3683d600020a7","department":"Visual Effects","job":"Rotoscoping Artist"},{"adult":false,"gender":0,"id":2157974,"known_for_department":"Visual Effects","name":"Charlie H. Ellis","original_name":"Charlie H. Ellis","popularity":0.6,"profile_path":null,"credit_id":"5bce15b6c3a3683d600020b8","department":"Visual Effects","job":"Rotoscoping Artist"},{"adult":false,"gender":0,"id":2157977,"known_for_department":"Visual Effects","name":"Sourajit Bhattacharya","original_name":"Sourajit Bhattacharya","popularity":0.6,"profile_path":null,"credit_id":"5bce16180e0a265d44002178","department":"Visual Effects","job":"Visual Effects"},{"adult":false,"gender":0,"id":2157978,"known_for_department":"Visual Effects","name":"Mahesh Kumar","original_name":"Mahesh Kumar","popularity":0.6,"profile_path":null,"credit_id":"5bce165ac3a3683d69001f0c","department":"Visual Effects","job":"VFX Artist"},{"adult":false,"gender":0,"id":2157979,"known_for_department":"Visual Effects","name":"George Plakides","original_name":"George Plakides","popularity":0.6,"profile_path":null,"credit_id":"5bce166ac3a3683d66002249","department":"Visual Effects","job":"VFX Artist"},{"adult":false,"gender":0,"id":2157980,"known_for_department":"Visual Effects","name":"Erik Tvedt","original_name":"Erik Tvedt","popularity":0.6,"profile_path":null,"credit_id":"5bce16710e0a265d390022fd","department":"Visual Effects","job":"VFX Artist"},{"adult":false,"gender":0,"id":2157981,"known_for_department":"Visual Effects","name":"Dominic Carus","original_name":"Dominic Carus","popularity":0.6,"profile_path":null,"credit_id":"5bce1678c3a3683d6f001f81","department":"Visual Effects","job":"VFX Artist"},{"adult":false,"gender":0,"id":2157984,"known_for_department":"Visual Effects","name":"Ali Ingham","original_name":"Ali Ingham","popularity":0.6,"profile_path":null,"credit_id":"5bce16b80e0a265d3900235d","department":"Visual Effects","job":"Visual Effects Coordinator"},{"adult":false,"gender":0,"id":2157988,"known_for_department":"Visual Effects","name":"Shunsuke Tsuchiya","original_name":"Shunsuke Tsuchiya","popularity":0.6,"profile_path":null,"credit_id":"5bce1777c3a3683d73002471","department":"Visual Effects","job":"Visual Effects Production Assistant"},{"adult":false,"gender":0,"id":2157989,"known_for_department":"Visual Effects","name":"Curtis Michael Davey","original_name":"Curtis Michael Davey","popularity":0.6,"profile_path":null,"credit_id":"5bce1785c3a3683d5a0022f7","department":"Visual Effects","job":"Visual Effects Production Assistant"},{"adult":false,"gender":0,"id":2157990,"known_for_department":"Visual Effects","name":"Matthew Eberle","original_name":"Matthew Eberle","popularity":0.6,"profile_path":null,"credit_id":"5bce17920e0a265d31002626","department":"Visual Effects","job":"Visual Effects Production Assistant"},{"adult":false,"gender":0,"id":2157991,"known_for_department":"Visual Effects","name":"Kieran Ahern","original_name":"Kieran Ahern","popularity":0.6,"profile_path":null,"credit_id":"5bce179c0e0a265d35002aed","department":"Visual Effects","job":"Visual Effects Production Assistant"},{"adult":false,"gender":0,"id":2157995,"known_for_department":"Visual Effects","name":"Jean Claude Nouchy","original_name":"Jean Claude Nouchy","popularity":0.6,"profile_path":null,"credit_id":"5bce17db925141057e002128","department":"Visual Effects","job":"Visual Effects Technical Director"},{"adult":false,"gender":0,"id":2157997,"known_for_department":"Visual Effects","name":"Scott Beverly","original_name":"Scott Beverly","popularity":0.6,"profile_path":null,"credit_id":"5bce17efc3a3683d630025d3","department":"Visual Effects","job":"Visual Effects"},{"adult":false,"gender":0,"id":2158001,"known_for_department":"Visual Effects","name":"Scott Schneider","original_name":"Scott Schneider","popularity":0.6,"profile_path":null,"credit_id":"5bce185d925141058100288c","department":"Visual Effects","job":"Visual Effects"},{"adult":false,"gender":0,"id":2158004,"known_for_department":"Visual Effects","name":"Richard King Slifka","original_name":"Richard King Slifka","popularity":0.6,"profile_path":null,"credit_id":"5bce189292514105870024f5","department":"Visual Effects","job":"Visual Effects"},{"adult":false,"gender":2,"id":2238426,"known_for_department":"Visual Effects","name":"Jörg Baier","original_name":"Jörg Baier","popularity":0.6,"profile_path":null,"credit_id":"5c5f0faec3a3683cd18e0f8d","department":"Visual Effects","job":"Digital Compositor"},{"adult":false,"gender":0,"id":2311955,"known_for_department":"Camera","name":"Jessica Ward","original_name":"Jessica Ward","popularity":0.6,"profile_path":null,"credit_id":"5cd969b5c3a3683c67c2f194","department":"Camera","job":"Second Assistant Camera"}]}}
\ No newline at end of file
diff --git a/test_data/https___api_themoviedb_org_3_movie_282758_api_key_19890604_language_zh_CN_append_to_response_external_ids_credits b/test_data/https___api_themoviedb_org_3_movie_282758_api_key_19890604_language_zh_CN_append_to_response_external_ids_credits
new file mode 100644
index 00000000..3b0e7329
--- /dev/null
+++ b/test_data/https___api_themoviedb_org_3_movie_282758_api_key_19890604_language_zh_CN_append_to_response_external_ids_credits
@@ -0,0 +1 @@
+{"adult":false,"backdrop_path":"/13qDzilftzRZMUEHcpi57VLqNPw.jpg","belongs_to_collection":null,"budget":0,"genres":[{"id":878,"name":"科幻"}],"homepage":"","id":282758,"imdb_id":"tt0827573","original_language":"en","original_title":"Doctor Who: The Runaway Bride","overview":"失去了罗斯的博士正在心灰意冷,而正在举行婚礼的多娜却被突然传送到塔迪斯里。博士带坏脾气的多娜返回地球,却被一群外星机器人追杀,塔迪斯上演了一场公路飚车。后来博士发现多娜身上带有异常含量的Huon粒子,而该粒子来源于上一代宇宙霸主。而博士的母星加利弗雷在宇宙中崛起时,已经消灭了所有的Huon粒子。最终博士揭开了一个藏于地球40亿年的秘密。","popularity":7.214,"poster_path":"/gkTCC4VLv8jATM3kouAUK3EaoGd.jpg","production_companies":[{"id":4762,"logo_path":"/igWZmjr5Zhbnxf7DinSOLoiggLU.png","name":"BBC Wales","origin_country":"GB"}],"production_countries":[{"iso_3166_1":"GB","name":"United Kingdom"}],"release_date":"2006-12-25","revenue":0,"runtime":60,"spoken_languages":[{"english_name":"English","iso_639_1":"en","name":"English"}],"status":"Released","tagline":"","title":"神秘博士:逃跑新娘","video":false,"vote_average":7.739,"vote_count":201,"credits":{"cast":[{"adult":false,"gender":2,"id":20049,"known_for_department":"Acting","name":"David Tennant","original_name":"David Tennant","popularity":26.286,"profile_path":"/zM76EBPZkdkSHyESyIUa47aP87R.jpg","cast_id":0,"character":"The Doctor","credit_id":"53ca05180e0a264748001142","order":0},{"adult":false,"gender":1,"id":47646,"known_for_department":"Acting","name":"Catherine Tate","original_name":"Catherine Tate","popularity":8.958,"profile_path":"/xqaqetDBODzlm4Yky99NOOzLstL.jpg","cast_id":1,"character":"Donna Noble","credit_id":"53ca052d0e0a26474b00123b","order":1},{"adult":false,"gender":1,"id":17693,"known_for_department":"Acting","name":"Sarah Parish","original_name":"Sarah Parish","popularity":12.376,"profile_path":"/5GmD0kvvZH6TOEoIxkzj0U1ItUP.jpg","cast_id":5,"character":"Empress","credit_id":"5ea9e7afa128560022680a13","order":2},{"adult":false,"gender":2,"id":1225318,"known_for_department":"Acting","name":"Don Gilet","original_name":"Don Gilet","popularity":2.661,"profile_path":"/9pXhLmYZRLi9HZ1WJ7UmOydZOQu.jpg","cast_id":6,"character":"Lance Bennett","credit_id":"5ea9e7c0514c4a00218cf183","order":3},{"adult":false,"gender":2,"id":1230421,"known_for_department":"Acting","name":"Howard Attfield","original_name":"Howard Attfield","popularity":1.731,"profile_path":null,"cast_id":7,"character":"Geoff Noble","credit_id":"5ea9e7cfa12856001d67f4f0","order":4},{"adult":false,"gender":1,"id":1230422,"known_for_department":"Acting","name":"Jacqueline King","original_name":"Jacqueline King","popularity":2.397,"profile_path":"/7vsacSnnE9vUXc2BZR6y0ISrl6a.jpg","cast_id":8,"character":"Sylvia Noble","credit_id":"5ea9e7e1426ae800214a5a08","order":5},{"adult":false,"gender":0,"id":2337637,"known_for_department":"Acting","name":"Trevor Michael Georges","original_name":"Trevor Michael Georges","popularity":1.4,"profile_path":null,"cast_id":9,"character":"Vicar (as Trevor Georges)","credit_id":"5ea9e8032d1e400024850a70","order":6},{"adult":false,"gender":0,"id":2775936,"known_for_department":"Acting","name":"Glen Wilson","original_name":"Glen Wilson","popularity":0.6,"profile_path":null,"cast_id":16,"character":"Taxi Driver","credit_id":"5f5da95663d9370036bbc289","order":7},{"adult":false,"gender":1,"id":1230420,"known_for_department":"Acting","name":"Krystal Archer","original_name":"Krystal Archer","popularity":1.96,"profile_path":null,"cast_id":17,"character":"Nerys","credit_id":"5f5da97afd7aa4003be75119","order":8},{"adult":false,"gender":2,"id":970112,"known_for_department":"Acting","name":"Rhodri Meilir","original_name":"Rhodri Meilir","popularity":1.4,"profile_path":null,"cast_id":18,"character":"Rhodri","credit_id":"5f5da9a40b5fd600356b6a04","order":9},{"adult":false,"gender":0,"id":1230424,"known_for_department":"Acting","name":"Zafirah Boateng","original_name":"Zafirah Boateng","popularity":0.6,"profile_path":null,"cast_id":19,"character":"Little Girl","credit_id":"5f5da9ba688cd0003af5cc06","order":10},{"adult":false,"gender":2,"id":100085,"known_for_department":"Acting","name":"Paul Kasey","original_name":"Paul Kasey","popularity":2.029,"profile_path":"/f6P4xudwJVEtkzIYh8Ur23U44Sj.jpg","cast_id":20,"character":"Robot Santa","credit_id":"5f5da9c61cc4ff0034b4ca60","order":11}],"crew":[{"adult":false,"gender":2,"id":47203,"known_for_department":"Sound","name":"Murray Gold","original_name":"Murray Gold","popularity":1.62,"profile_path":"/ih1ELPTC9QMDbK2KxskidkRqMFM.jpg","credit_id":"5eeb818581da3900344f8a67","department":"Sound","job":"Music"},{"adult":false,"gender":2,"id":95894,"known_for_department":"Writing","name":"Russell T Davies","original_name":"Russell T Davies","popularity":1.815,"profile_path":"/rDDLhm0Sw7JUqIf7CVkFbu06IEp.jpg","credit_id":"5eeb81680f1e580034b4bd59","department":"Production","job":"Executive Producer"},{"adult":false,"gender":2,"id":95894,"known_for_department":"Writing","name":"Russell T Davies","original_name":"Russell T Davies","popularity":1.815,"profile_path":"/rDDLhm0Sw7JUqIf7CVkFbu06IEp.jpg","credit_id":"58d02b4fc3a3683f2b001c8b","department":"Writing","job":"Writer"},{"adult":false,"gender":2,"id":1106312,"known_for_department":"Camera","name":"Rory Taylor","original_name":"Rory Taylor","popularity":0.84,"profile_path":null,"credit_id":"5eeb8194db4ed60035cbe736","department":"Camera","job":"Director of Photography"},{"adult":false,"gender":0,"id":1141534,"known_for_department":"Editing","name":"John Richards","original_name":"John Richards","popularity":0.6,"profile_path":null,"credit_id":"5eeb81a50f1e580035b4da4b","department":"Editing","job":"Editor"},{"adult":false,"gender":0,"id":1213443,"known_for_department":"Production","name":"Julie Gardner","original_name":"Julie Gardner","popularity":2.376,"profile_path":null,"credit_id":"5eeb8176b0460500350a41e6","department":"Production","job":"Executive Producer"},{"adult":false,"gender":2,"id":1213445,"known_for_department":"Production","name":"Phil Collinson","original_name":"Phil Collinson","popularity":1.583,"profile_path":null,"credit_id":"5eeb815a0f1e580037b4f571","department":"Production","job":"Producer"},{"adult":false,"gender":2,"id":1216417,"known_for_department":"Directing","name":"Euros Lyn","original_name":"Euros Lyn","popularity":2.064,"profile_path":"/7EUPE3Umh3wsL0LkOMqmEqFPgDH.jpg","credit_id":"58d02b5c925141519d001e7f","department":"Directing","job":"Director"}]},"external_ids":{"imdb_id":"tt0827573","wikidata_id":null,"facebook_id":null,"instagram_id":null,"twitter_id":null}}
\ No newline at end of file
diff --git a/test_data/https___api_themoviedb_org_3_movie_293767_api_key_19890604_language_zh_CN_append_to_response_external_ids_credits b/test_data/https___api_themoviedb_org_3_movie_293767_api_key_19890604_language_zh_CN_append_to_response_external_ids_credits
new file mode 100644
index 00000000..0f8e91c8
--- /dev/null
+++ b/test_data/https___api_themoviedb_org_3_movie_293767_api_key_19890604_language_zh_CN_append_to_response_external_ids_credits
@@ -0,0 +1 @@
+{"adult":false,"backdrop_path":"/62Mjm9I9Ul6iUqe63NYM84dA4cm.jpg","belongs_to_collection":null,"budget":40000000,"genres":[{"id":18,"name":"剧情"},{"id":10752,"name":"战争"}],"homepage":"","id":293767,"imdb_id":"tt2513074","original_language":"en","original_title":"Billy Lynn's Long Halftime Walk","overview":" 伊拉克战争时期,来自美国德州的19岁技术兵比利·林恩因为一段偶然拍摄的视频而家喻户晓。那是一次规模不大却激烈非常的遭遇战,战斗中林恩所在的B班班长遭到当地武装分子的伏击和劫持,而林恩为了营救班长不惜铤而走险冲锋陷阵。视频公布于世让他成为全美民众所崇拜的英雄,然而却鲜有人理解他和战友们所经历的一切。为了安葬班长,B班得到了短暂的休假,因此他们得以受邀参加一场在德州举行的橄榄球比赛。林恩的姐姐因某事件深感愧疚,她希望弟弟能借此机缘回归普通生活。而周围的经纪人、球迷、大老板、普通民众则对战争、卫国、士兵有着各种各样想当然的理解。球场上的庆典盛大开幕,林恩和战友们的心却愈加沉重与焦躁……","popularity":22.959,"poster_path":"/vOclkOXgsMQ0o7a8jg04jJGb2ky.jpg","production_companies":[{"id":559,"logo_path":"/jqWioYeGSyTLuHth0141bTGvu6H.png","name":"TriStar Pictures","origin_country":"US"},{"id":2527,"logo_path":"/osO7TGmlRMistSQ5JZusPhbKUHk.png","name":"Marc Platt Productions","origin_country":"US"},{"id":6705,"logo_path":"/e8EXNSfwr5E9d3TR8dHKbQnQK4W.png","name":"Film4 Productions","origin_country":"GB"},{"id":28275,"logo_path":"/b6VatRipyJYN52xLAV7TtzJtuXv.png","name":"The Ink Factory","origin_country":"GB"},{"id":30148,"logo_path":"/zerhOenUD6CkH8SMgZUhrDkOs4w.png","name":"Bona Film Group","origin_country":"CN"},{"id":77863,"logo_path":"/7z6YOzvdk70YY8OaRbn5mfxrvbO.png","name":"Studio 8","origin_country":"US"}],"production_countries":[{"iso_3166_1":"CN","name":"China"},{"iso_3166_1":"GB","name":"United Kingdom"},{"iso_3166_1":"US","name":"United States of America"}],"release_date":"2016-11-10","revenue":30930984,"runtime":113,"spoken_languages":[{"english_name":"English","iso_639_1":"en","name":"English"}],"status":"Released","tagline":"要走上英雄之路,你必须看到这一切是如何开始的。","title":"比利·林恩的中场战事","video":false,"vote_average":5.997,"vote_count":491,"external_ids":{"imdb_id":"tt2513074","wikidata_id":null,"facebook_id":null,"instagram_id":null,"twitter_id":null},"credits":{"cast":[{"adult":false,"gender":2,"id":1496392,"known_for_department":"Acting","name":"Joe Alwyn","original_name":"Joe Alwyn","popularity":11.848,"profile_path":"/npvlAf0f2zciFdB6uwPx9j8xJHj.jpg","cast_id":23,"character":"Billy Lynn","credit_id":"56904c569251414563000084","order":0},{"adult":false,"gender":1,"id":37917,"known_for_department":"Acting","name":"Kristen Stewart","original_name":"Kristen Stewart","popularity":42.895,"profile_path":"/rCU7XhHavFAKatkrC2yFWO4FCXX.jpg","cast_id":1,"character":"Kathryn Lynn","credit_id":"552d437ac3a3687941002de0","order":1},{"adult":false,"gender":2,"id":66,"known_for_department":"Acting","name":"Chris Tucker","original_name":"Chris Tucker","popularity":13.692,"profile_path":"/xtAK4hFyDjSYhZ9oRhppuVcLi80.jpg","cast_id":4,"character":"Albert","credit_id":"552d43a09251413873005589","order":2},{"adult":false,"gender":2,"id":9828,"known_for_department":"Acting","name":"Garrett Hedlund","original_name":"Garrett Hedlund","popularity":7.095,"profile_path":"/v5gztlEVgGJEQVp1Mf7URJJBuop.jpg","cast_id":2,"character":"David Dime","credit_id":"552d438f92514103ce003eb0","order":3},{"adult":false,"gender":2,"id":12835,"known_for_department":"Acting","name":"Vin Diesel","original_name":"Vin Diesel","popularity":57.594,"profile_path":"/7rwSXluNWZAluYMOEWBxkPmckES.jpg","cast_id":0,"character":"Shroom","credit_id":"552d436ac3a3684ad6000ea8","order":4},{"adult":false,"gender":2,"id":67773,"known_for_department":"Acting","name":"Steve Martin","original_name":"Steve Martin","popularity":14.934,"profile_path":"/d0KthX8hVWU9BxTCG1QUO8FURRm.jpg","cast_id":3,"character":"Norm Oglesby","credit_id":"552d439ac3a3680dab0014fa","order":5},{"adult":false,"gender":1,"id":1376883,"known_for_department":"Acting","name":"Makenzie Leigh","original_name":"Makenzie Leigh","popularity":7.161,"profile_path":"/1lKaB2pEA1fTcljDS7pbf7Lqi3B.jpg","cast_id":35,"character":"Faison","credit_id":"57d6b35b9251416f65007f5e","order":6},{"adult":false,"gender":2,"id":1100144,"known_for_department":"Acting","name":"Ismael Cruz Córdova","original_name":"Ismael Cruz Córdova","popularity":14.965,"profile_path":"/gx59ZkpGgGLEH79ciDgyWpUG8nt.jpg","cast_id":40,"character":"Sgt. Holliday","credit_id":"5832561dc3a3685ba10358b1","order":7},{"adult":false,"gender":2,"id":1457999,"known_for_department":"Acting","name":"Arturo Castro","original_name":"Arturo Castro","popularity":10.559,"profile_path":"/pbLoDCfjm3fLtGHVqQcnbM2d0cu.jpg","cast_id":9,"character":"Marcellino 'Mango' Montoya","credit_id":"55383ace92514138a90008ff","order":8},{"adult":false,"gender":2,"id":1107296,"known_for_department":"Acting","name":"Ben Platt","original_name":"Ben Platt","popularity":5.179,"profile_path":"/iklBiGKKs28gNcZ3vrbegLlpmfK.jpg","cast_id":5,"character":"Josh","credit_id":"55383a8dc3a3681be4003419","order":9},{"adult":false,"gender":1,"id":58966,"known_for_department":"Acting","name":"Deirdre Lovejoy","original_name":"Deirdre Lovejoy","popularity":11.17,"profile_path":"/8Iv7NcwLcxen5ql8PAkCy9VpsTf.jpg","cast_id":6,"character":"Denise Lynn","credit_id":"55383a979251411256003dbe","order":10},{"adult":false,"gender":2,"id":1462,"known_for_department":"Acting","name":"Tim Blake Nelson","original_name":"Tim Blake Nelson","popularity":18.451,"profile_path":"/rWuTGiAMaaHIJ30eRkQS23LbRSW.jpg","cast_id":41,"character":"Wayne Foster","credit_id":"5832563392514162cb0315bd","order":11},{"adult":false,"gender":2,"id":1078613,"known_for_department":"Acting","name":"Beau Knapp","original_name":"Beau Knapp","popularity":6.237,"profile_path":"/246hy6vVtTQ26R8iXHCXcwwbGSu.jpg","cast_id":7,"character":"Crack","credit_id":"55383a9f9251416518007927","order":12},{"adult":false,"gender":2,"id":145039,"known_for_department":"Acting","name":"Bruce McKinnon","original_name":"Bruce McKinnon","popularity":2.271,"profile_path":"/m4ygUs0es0BGd7Qpf2WpdsoaYNH.jpg","cast_id":12,"character":"Ray Lynn","credit_id":"55383aeac3a3681be4003429","order":13},{"adult":false,"gender":2,"id":544123,"known_for_department":"Acting","name":"Astro","original_name":"Astro","popularity":2.054,"profile_path":"/dqS3kBv2DpiAMPv5J6ZIl2v3ik3.jpg","cast_id":26,"character":"Lodis","credit_id":"577e2d86c3a368562900094a","order":14},{"adult":false,"gender":2,"id":37937,"known_for_department":"Acting","name":"Gregory Alan Williams","original_name":"Gregory Alan Williams","popularity":2.263,"profile_path":"/3IM9qtI4c4zgraPNtRI3kCPivAo.jpg","cast_id":31,"character":"Raise n' Praise Preacher","credit_id":"577e3137925141440c000527","order":15},{"adult":false,"gender":2,"id":1241339,"known_for_department":"Acting","name":"Bo Mitchell","original_name":"Bo Mitchell","popularity":3.577,"profile_path":"/aYcyxjKuCB892UJP8w2lXeS7Z6E.jpg","cast_id":10,"character":"Anxious / Grateful American","credit_id":"55383ad7c3a36815ac007c02","order":16},{"adult":false,"gender":2,"id":118595,"known_for_department":"Acting","name":"Ric Reitz","original_name":"Ric Reitz","popularity":3.404,"profile_path":"/PILYr8ZQsCop1Yz5UQ1FOeh2h5.jpg","cast_id":14,"character":"Anchor","credit_id":"55383afec3a36831dd006106","order":17},{"adult":false,"gender":2,"id":1619529,"known_for_department":"Acting","name":"Barney Harris","original_name":"Barney Harris","popularity":5.489,"profile_path":"/ovNv1lQorACDfoPCDQRoMmuLX0x.jpg","cast_id":28,"character":"Sykes","credit_id":"577e2e21925141329700095f","order":18},{"adult":false,"gender":1,"id":1521874,"known_for_department":"Acting","name":"Laura Lundy Wheale","original_name":"Laura Lundy Wheale","popularity":0.6,"profile_path":null,"cast_id":29,"character":"Patty Lynn","credit_id":"577e2fd1c3a3686be30003e9","order":19},{"adult":false,"gender":0,"id":1646660,"known_for_department":"Acting","name":"Allen Daniel","original_name":"Allen Daniel","popularity":0.6,"profile_path":"/bdTdYLvR30cErhuRtR4E5ERxMEy.jpg","cast_id":27,"character":"Major Mac","credit_id":"577e2dfc925141320a000894","order":20},{"adult":false,"gender":2,"id":1711813,"known_for_department":"Acting","name":"Randy Gonzalez","original_name":"Randy Gonzalez","popularity":0.6,"profile_path":"/mfmChNafTCpvTyUOho9JYGsWy9A.jpg","cast_id":43,"character":"Hector","credit_id":"58325679c3a3685bb002ea94","order":21},{"adult":false,"gender":0,"id":1498656,"known_for_department":"Acting","name":"Matthew Barnes","original_name":"Matthew Barnes","popularity":1.992,"profile_path":null,"cast_id":44,"character":"Travis","credit_id":"58325684c3a3685b9a030812","order":22},{"adult":false,"gender":0,"id":1646661,"known_for_department":"Acting","name":"Austin McLamb","original_name":"Austin McLamb","popularity":0.6,"profile_path":null,"cast_id":30,"character":"Brian","credit_id":"577e3027c3a36817ea00820e","order":23},{"adult":false,"gender":2,"id":543138,"known_for_department":"Acting","name":"Mason Lee","original_name":"Mason Lee","popularity":9.71,"profile_path":"/zVJfscd1rBPCXOMnsqTmlohCo8i.jpg","cast_id":45,"character":"Foo","credit_id":"58a3104692514153a2007d6d","order":24},{"adult":false,"gender":0,"id":1757681,"known_for_department":"Acting","name":"Tommy McNulty","original_name":"Tommy McNulty","popularity":0.6,"profile_path":"/74xBkQnwKWGFbOoCSfZnE358Rek.jpg","cast_id":46,"character":"Reporter","credit_id":"58a311a3c3a368295d007c4d","order":25},{"adult":false,"gender":1,"id":1757682,"known_for_department":"Acting","name":"Markina Brown","original_name":"Markina Brown","popularity":1.38,"profile_path":"/kH4vGtTkJpPuSWCK0bMjFeITFRl.jpg","cast_id":47,"character":"Reporter","credit_id":"58a311bcc3a36828e300751d","order":26},{"adult":false,"gender":0,"id":1757683,"known_for_department":"Acting","name":"Eric Kan","original_name":"Eric Kan","popularity":0.6,"profile_path":null,"cast_id":48,"character":"Reporter","credit_id":"58a311d5c3a3682941008550","order":27},{"adult":false,"gender":1,"id":1757684,"known_for_department":"Acting","name":"Dana Barrett","original_name":"Dana Barrett","popularity":0.6,"profile_path":null,"cast_id":49,"character":"Reporter","credit_id":"58a31200c3a36828e3007546","order":28},{"adult":false,"gender":0,"id":1757685,"known_for_department":"Acting","name":"Richard Sherman","original_name":"Richard Sherman","popularity":0.6,"profile_path":null,"cast_id":50,"character":"Football Player","credit_id":"58a312a4925141538b007e08","order":29},{"adult":false,"gender":2,"id":1704775,"known_for_department":"Acting","name":"J.J. Watt","original_name":"J.J. Watt","popularity":0.6,"profile_path":"/pfnuLrfwnyABip8bvYcI5oxoLwZ.jpg","cast_id":51,"character":"Football Player","credit_id":"58a312c49251415392007b47","order":30},{"adult":false,"gender":2,"id":1358061,"known_for_department":"Acting","name":"Christopher Matthew Cook","original_name":"Christopher Matthew Cook","popularity":2.046,"profile_path":"/vwBubfT4jCNH7TVt5dXjBzUJbKt.jpg","cast_id":52,"character":"Roadie Foreman","credit_id":"58a312ddc3a368295d007d17","order":31},{"adult":false,"gender":1,"id":1070201,"known_for_department":"Acting","name":"Kristin Erickson","original_name":"Kristin Erickson","popularity":1.631,"profile_path":null,"cast_id":53,"character":"Travis' Girlfriend","credit_id":"58a3131d925141537f007e39","order":32},{"adult":false,"gender":0,"id":552276,"known_for_department":"Acting","name":"Brad Mills","original_name":"Brad Mills","popularity":1.4,"profile_path":"/f6O3Br2EygYU3jDTeN4vdki66qO.jpg","cast_id":54,"character":"Travis' Friend","credit_id":"58a313db925141537b007ce6","order":33},{"adult":false,"gender":1,"id":1375636,"known_for_department":"Acting","name":"Genevieve Adams","original_name":"Genevieve Adams","popularity":1.62,"profile_path":"/uYCuvbW5ogIr4gpo2oYoXLdd1A5.jpg","cast_id":55,"character":"Stage Manager","credit_id":"58a313f1c3a36828e3007680","order":34},{"adult":false,"gender":2,"id":1831887,"known_for_department":"Acting","name":"David Ramsey","original_name":"David Ramsey","popularity":0.6,"profile_path":null,"cast_id":179,"character":"Field Manager","credit_id":"593d291c92514105b701ca6a","order":35},{"adult":false,"gender":2,"id":1181566,"known_for_department":"Acting","name":"Matthew Brady","original_name":"Matthew Brady","popularity":0.6,"profile_path":null,"cast_id":57,"character":"Stadium Security Guy","credit_id":"58a31454925141537b007d37","order":36},{"adult":false,"gender":1,"id":1757689,"known_for_department":"Acting","name":"Holly Morris","original_name":"Holly Morris","popularity":1.896,"profile_path":null,"cast_id":58,"character":"Grateful / Anxious American","credit_id":"58a31485c3a36828e30076df","order":37},{"adult":false,"gender":2,"id":1711695,"known_for_department":"Acting","name":"Alan Gilmer","original_name":"Alan Gilmer","popularity":0.6,"profile_path":"/ysaSIOi007sUFn4OpWEkOSos8np.jpg","cast_id":59,"character":"Grateful / Anxious American","credit_id":"58a3150b925141539b00795c","order":38},{"adult":false,"gender":0,"id":1367319,"known_for_department":"Acting","name":"Andy Glen","original_name":"Andy Glen","popularity":0.6,"profile_path":null,"cast_id":60,"character":"Grateful / Anxious American","credit_id":"58a3152792514153a2008065","order":39},{"adult":false,"gender":0,"id":1757691,"known_for_department":"Acting","name":"Brandin Jenkins","original_name":"Brandin Jenkins","popularity":0.6,"profile_path":null,"cast_id":61,"character":"Grateful / Anxious American","credit_id":"58a31560c3a368292a007a34","order":40},{"adult":false,"gender":1,"id":1757693,"known_for_department":"Acting","name":"Chesta Drake","original_name":"Chesta Drake","popularity":0.668,"profile_path":null,"cast_id":62,"character":"Grateful / Anxious American","credit_id":"58a315859251415392007d13","order":41},{"adult":false,"gender":2,"id":111698,"known_for_department":"Acting","name":"Cooper Andrews","original_name":"Cooper Andrews","popularity":4.322,"profile_path":"/uyvhcj3hrhCWqXmS4VSM36LhISt.jpg","cast_id":63,"character":"Grateful / Anxious American","credit_id":"58a3160fc3a3682962007ea5","order":42},{"adult":false,"gender":1,"id":1381627,"known_for_department":"Acting","name":"Katie Deal","original_name":"Katie Deal","popularity":0.6,"profile_path":"/5G570aJes6pqTYjhOBxnQxxW0Aq.jpg","cast_id":64,"character":"Grateful American","credit_id":"58a316379251415383008183","order":43},{"adult":false,"gender":1,"id":1106266,"known_for_department":"Acting","name":"Tatom Pender","original_name":"Tatom Pender","popularity":0.6,"profile_path":"/cmgwEKAFhltRNlH6MgzIEDPoigZ.jpg","cast_id":65,"character":"Anxious / Grateful American","credit_id":"58a316c1c3a368295d007f6e","order":44},{"adult":false,"gender":0,"id":1757694,"known_for_department":"Acting","name":"Katrina Pettiford","original_name":"Katrina Pettiford","popularity":0.6,"profile_path":null,"cast_id":66,"character":"Kelly","credit_id":"58a316fbc3a368295d007f8e","order":45},{"adult":false,"gender":0,"id":1757695,"known_for_department":"Acting","name":"Erin Moore","original_name":"Erin Moore","popularity":0.6,"profile_path":null,"cast_id":67,"character":"Michelle","credit_id":"58a31720c3a368291d007875","order":46},{"adult":false,"gender":0,"id":1757696,"known_for_department":"Acting","name":"Elizabeth Chestang","original_name":"Elizabeth Chestang","popularity":0.6,"profile_path":null,"cast_id":68,"character":"Beyoncé","credit_id":"58a3173a92514153a200819f","order":47},{"adult":false,"gender":1,"id":1218614,"known_for_department":"Acting","name":"Kellie Pickler","original_name":"Kellie Pickler","popularity":2.15,"profile_path":"/abU9jIRATFUSdpYsWZdxm30Ri85.jpg","cast_id":69,"character":"National Anthem Singer","credit_id":"58a3174cc3a368291d007890","order":48},{"adult":false,"gender":0,"id":1398066,"known_for_department":"Acting","name":"Marc Inniss","original_name":"Marc Inniss","popularity":1.318,"profile_path":"/foMPMiQUuO7tFx1MzF2J0136gdT.jpg","cast_id":70,"character":"Pushy Halftime Singer","credit_id":"58a3177f925141538b008131","order":49},{"adult":false,"gender":2,"id":1383721,"known_for_department":"Acting","name":"Fajer Kaisi","original_name":"Fajer Kaisi","popularity":0.6,"profile_path":"/wow3lQKOE8wDk9IfgX3CcnwZL8n.jpg","cast_id":71,"character":"Interpreter","credit_id":"58a3178ec3a3682962007f9b","order":50},{"adult":false,"gender":0,"id":1757698,"known_for_department":"Acting","name":"Antonio Badrani","original_name":"Antonio Badrani","popularity":0.6,"profile_path":null,"cast_id":72,"character":"Iraqi Father","credit_id":"58a317a9c3a368295d007ffe","order":51},{"adult":false,"gender":1,"id":1757699,"known_for_department":"Acting","name":"Badia Obaid","original_name":"Badia Obaid","popularity":0.6,"profile_path":null,"cast_id":73,"character":"Iraqi Grandmother","credit_id":"58a317c69251415387007d1d","order":52},{"adult":false,"gender":1,"id":1757700,"known_for_department":"Acting","name":"Leila Kadiri","original_name":"Leila Kadiri","popularity":0.6,"profile_path":null,"cast_id":74,"character":"Iraqi Mother","credit_id":"58a318049251415387007d52","order":53},{"adult":false,"gender":0,"id":1525441,"known_for_department":"Acting","name":"Mansour Badri","original_name":"Mansour Badri","popularity":2.188,"profile_path":"/1vsUyHuHFOQYA36lF0IS1dymN6k.jpg","cast_id":75,"character":"Iraqi Uncle","credit_id":"58a3184e9251415387007d7d","order":54},{"adult":false,"gender":2,"id":1074351,"known_for_department":"Acting","name":"Azim Rizk","original_name":"Azim Rizk","popularity":1.221,"profile_path":null,"cast_id":76,"character":"Waleed","credit_id":"58a3185c925141539b007b79","order":55},{"adult":false,"gender":0,"id":1757701,"known_for_department":"Acting","name":"Jay Peterson","original_name":"Jay Peterson","popularity":0.828,"profile_path":null,"cast_id":77,"character":"Rude Fan","credit_id":"58a3187f925141538300830b","order":56},{"adult":false,"gender":0,"id":1757702,"known_for_department":"Acting","name":"Zaydun Khalaf","original_name":"Zaydun Khalaf","popularity":0.6,"profile_path":"/vZPMRDIfgxjnPGXtF9ysK8Mh5RJ.jpg","cast_id":78,"character":"Shopkeeper","credit_id":"58a3188d92514153a200826f","order":57},{"adult":false,"gender":0,"id":1757703,"known_for_department":"Acting","name":"Phil Armijo","original_name":"Phil Armijo","popularity":0.6,"profile_path":"/zjeNoTl56cFlUMoGjJDwMDAw71W.jpg","cast_id":79,"character":"Texas Aristocrat (uncredited)","credit_id":"58a318b5925141537f008192","order":58},{"adult":false,"gender":0,"id":1757704,"known_for_department":"Acting","name":"Stevie Baggs Jr.","original_name":"Stevie Baggs Jr.","popularity":0.751,"profile_path":"/9XpM1DM1jnBPnmyuPKBBcLJQnZ5.jpg","cast_id":80,"character":"Sportscaster (uncredited)","credit_id":"58a318c2925141537b007fc0","order":59},{"adult":false,"gender":1,"id":1635194,"known_for_department":"Acting","name":"Adrienne Ballenger","original_name":"Adrienne Ballenger","popularity":0.762,"profile_path":null,"cast_id":81,"character":"Cheerleader (uncredited)","credit_id":"58a318ee925141537f0081b9","order":60},{"adult":false,"gender":0,"id":1663959,"known_for_department":"Acting","name":"Paul Barlow Jr.","original_name":"Paul Barlow Jr.","popularity":0.6,"profile_path":null,"cast_id":82,"character":"Concourse Comic (uncredited)","credit_id":"58a31998c3a36829620080bd","order":61},{"adult":false,"gender":1,"id":1458000,"known_for_department":"Acting","name":"Alexandra Bartee","original_name":"Alexandra Bartee","popularity":0.652,"profile_path":null,"cast_id":11,"character":"Cheerleader (uncredited)","credit_id":"55383ae0c3a36842ae005f83","order":62},{"adult":false,"gender":1,"id":1757707,"known_for_department":"Acting","name":"Ashley Lyn Blair","original_name":"Ashley Lyn Blair","popularity":0.6,"profile_path":null,"cast_id":83,"character":"Football Fan (uncredited)","credit_id":"58a31a56c3a368295d00815d","order":63},{"adult":false,"gender":1,"id":1757709,"known_for_department":"Acting","name":"Brooke Borba","original_name":"Brooke Borba","popularity":0.6,"profile_path":null,"cast_id":84,"character":"Woman (uncredited)","credit_id":"58a31af492514153a20083c1","order":64},{"adult":false,"gender":1,"id":557505,"known_for_department":"Acting","name":"Claire Bronson","original_name":"Claire Bronson","popularity":5.589,"profile_path":"/zJ7a126cfmpd04SygoO04faCte1.jpg","cast_id":85,"character":"Female Referee (uncredited)","credit_id":"58a31b5892514153830084ae","order":65},{"adult":false,"gender":2,"id":1635305,"known_for_department":"Acting","name":"Bricine Brown","original_name":"Bricine Brown","popularity":0.6,"profile_path":null,"cast_id":86,"character":"EMT / Paramedic (uncredited)","credit_id":"58a31b99c3a368295d008201","order":66},{"adult":false,"gender":1,"id":1757710,"known_for_department":"Acting","name":"Amanda Burke Buczek","original_name":"Amanda Burke Buczek","popularity":0.6,"profile_path":null,"cast_id":87,"character":"Aristocrat (uncredited)","credit_id":"58a31bbbc3a36828e3007abe","order":67},{"adult":false,"gender":1,"id":1568703,"known_for_department":"Acting","name":"Jordanne Calvin","original_name":"Jordanne Calvin","popularity":0.98,"profile_path":null,"cast_id":88,"character":"Bar Patron (uncredited)","credit_id":"58a31c51c3a368295d008282","order":68},{"adult":false,"gender":0,"id":1757712,"known_for_department":"Acting","name":"Todd Chapman","original_name":"Todd Chapman","popularity":0.6,"profile_path":null,"cast_id":90,"character":"Norm's Aide (uncredited)","credit_id":"58a31db3925141537f00845d","order":69},{"adult":false,"gender":0,"id":1757713,"known_for_department":"Acting","name":"Chuck Clark","original_name":"Chuck Clark","popularity":0.6,"profile_path":null,"cast_id":91,"character":"VIP Fan (uncredited)","credit_id":"58a31ddc925141537f008477","order":70},{"adult":false,"gender":0,"id":1509777,"known_for_department":"Acting","name":"Alex Coker","original_name":"Alex Coker","popularity":0.6,"profile_path":"/x2OZgBJZzQWQIhjnOQGtLSzxOoG.jpg","cast_id":92,"character":"Honor Guard Team Leader (uncredited)","credit_id":"58a31e0fc3a36828e3007bec","order":71},{"adult":false,"gender":0,"id":1757714,"known_for_department":"Acting","name":"Jameson Jamey Copeland","original_name":"Jameson Jamey Copeland","popularity":0.6,"profile_path":null,"cast_id":93,"character":"Flag Holder (uncredited)","credit_id":"58a31e1dc3a36829020085e0","order":72},{"adult":false,"gender":0,"id":1737036,"known_for_department":"Acting","name":"Xavier Cortes","original_name":"Xavier Cortes","popularity":0.6,"profile_path":null,"cast_id":94,"character":"Camera Operator (uncredited)","credit_id":"58a31e2bc3a3682962008311","order":73},{"adult":false,"gender":1,"id":1757716,"known_for_department":"Acting","name":"Erin Dangler","original_name":"Erin Dangler","popularity":0.6,"profile_path":null,"cast_id":96,"character":"Reporter (uncredited)","credit_id":"58a31e83925141537b0082c5","order":74},{"adult":false,"gender":0,"id":1757717,"known_for_department":"Acting","name":"Patrick Darcey","original_name":"Patrick Darcey","popularity":0.6,"profile_path":null,"cast_id":97,"character":"Honor Guard (uncredited)","credit_id":"58a31f2792514153830086e0","order":75},{"adult":false,"gender":1,"id":1319519,"known_for_department":"Acting","name":"Deena Dill","original_name":"Deena Dill","popularity":1.234,"profile_path":null,"cast_id":8,"character":"Co-Anchor (uncredited)","credit_id":"55383aa8c3a36842ae005f6b","order":76},{"adult":false,"gender":1,"id":1757719,"known_for_department":"Acting","name":"Sydney Durso","original_name":"Sydney Durso","popularity":0.6,"profile_path":null,"cast_id":99,"character":"Cheerleader (uncredited)","credit_id":"58a31fa292514153a2008643","order":77},{"adult":false,"gender":1,"id":1757721,"known_for_department":"Acting","name":"Angela Everhart","original_name":"Angela Everhart","popularity":0.6,"profile_path":null,"cast_id":100,"character":"Dallas Cowboys Cheerleader (uncredited)","credit_id":"58a3202a92514153a2008693","order":78},{"adult":false,"gender":0,"id":1383478,"known_for_department":"Acting","name":"Gregory Fears","original_name":"Gregory Fears","popularity":1.4,"profile_path":"/eYmWGZCgl9AKOJxagGTOQqYTtf6.jpg","cast_id":101,"character":"Jones VIP (uncredited)","credit_id":"58a320c9c3a368291d007d9f","order":79},{"adult":false,"gender":0,"id":1757722,"known_for_department":"Acting","name":"DeRon Ford","original_name":"DeRon Ford","popularity":0.6,"profile_path":null,"cast_id":102,"character":"VIP Corridor Fan (uncredited)","credit_id":"58a320d9925141538b008647","order":80},{"adult":false,"gender":0,"id":1757723,"known_for_department":"Acting","name":"Courtland Fuller","original_name":"Courtland Fuller","popularity":0.6,"profile_path":null,"cast_id":103,"character":"Journalist (uncredited)","credit_id":"58a320e7c3a368295d008526","order":81},{"adult":false,"gender":2,"id":1757724,"known_for_department":"Acting","name":"Gabriel 'G-Rod' Rodriguez","original_name":"Gabriel 'G-Rod' Rodriguez","popularity":0.787,"profile_path":"/t7GOyMDDMYWRwnQveCEUFDSapk7.jpg","cast_id":104,"character":"Bouncer (uncredited)","credit_id":"58a320fac3a368291d007dc3","order":82},{"adult":false,"gender":0,"id":1358965,"known_for_department":"Acting","name":"Fred Galle","original_name":"Fred Galle","popularity":1.361,"profile_path":"/98X9Rv3rIdj90LdOKWtLeVLQbbD.jpg","cast_id":105,"character":"Super Wealthy Texan (uncredited)","credit_id":"58a3211bc3a368292a0080a1","order":83},{"adult":false,"gender":1,"id":196899,"known_for_department":"Acting","name":"Marion Guyot","original_name":"Marion Guyot","popularity":1.852,"profile_path":"/5444iiLk5xgZQh5u1UmPXAsYEBV.jpg","cast_id":107,"character":"Nice Lady (uncredited)","credit_id":"58a3215492514153a200872c","order":84},{"adult":false,"gender":0,"id":1757727,"known_for_department":"Acting","name":"Jas Hardy","original_name":"Jas Hardy","popularity":0.6,"profile_path":null,"cast_id":108,"character":"Dallas Bravo Football Fan (uncredited)","credit_id":"58a3218cc3a368292a0080ea","order":85},{"adult":false,"gender":0,"id":1757728,"known_for_department":"Acting","name":"De'Adrian Harmon","original_name":"De'Adrian Harmon","popularity":0.6,"profile_path":null,"cast_id":109,"character":"VIP / Millionaire (uncredited)","credit_id":"58a3219ec3a36829020087d4","order":86},{"adult":false,"gender":0,"id":1757730,"known_for_department":"Acting","name":"Jon Hartley","original_name":"Jon Hartley","popularity":0.6,"profile_path":null,"cast_id":110,"character":"Dallas Tailgater (uncredited)","credit_id":"58a321ab925141537f008677","order":87},{"adult":false,"gender":2,"id":1757731,"known_for_department":"Acting","name":"Robert Hendren","original_name":"Robert Hendren","popularity":0.6,"profile_path":null,"cast_id":111,"character":"VIP Fan (uncredited)","credit_id":"58a321ba92514153a200876d","order":88},{"adult":false,"gender":2,"id":1383490,"known_for_department":"Acting","name":"Walter Hendrix III","original_name":"Walter Hendrix III","popularity":0.769,"profile_path":null,"cast_id":112,"character":"Cameraman (uncredited)","credit_id":"58a321c892514153920083be","order":89},{"adult":false,"gender":1,"id":1757732,"known_for_department":"Acting","name":"Danni Heverin","original_name":"Danni Heverin","popularity":0.84,"profile_path":"/egC74VpYyRwbWQYvZIFXWpCkdcX.jpg","cast_id":113,"character":"Cheerleader (uncredited)","credit_id":"58a321e9925141539b008072","order":90},{"adult":false,"gender":2,"id":1757735,"known_for_department":"Acting","name":"Dennis Hill","original_name":"Dennis Hill","popularity":0.6,"profile_path":"/1ZSxpnz7MCTsk7gU6dtFIpTFnEV.jpg","cast_id":114,"character":"Soldier #1 (uncredited)","credit_id":"58a322d09251411b58000035","order":91},{"adult":false,"gender":2,"id":1683093,"known_for_department":"Acting","name":"Terayle Hill","original_name":"Terayle Hill","popularity":5.032,"profile_path":"/6AuY4EWa5lKBhWTWHpKvuNqtrQq.jpg","cast_id":115,"character":"Roadie (uncredited)","credit_id":"58a322df9251411b4a00004b","order":92},{"adult":false,"gender":0,"id":1757736,"known_for_department":"Acting","name":"Geoffrey Howard","original_name":"Geoffrey Howard","popularity":0.6,"profile_path":null,"cast_id":116,"character":"Bravo Fan (uncredited)","credit_id":"58a322eec3a3684c5e000048","order":93},{"adult":false,"gender":0,"id":1757738,"known_for_department":"Acting","name":"Billy James","original_name":"Billy James","popularity":0.6,"profile_path":null,"cast_id":117,"character":"Roadie (uncredited)","credit_id":"58a32312c3a3684c83000056","order":94},{"adult":false,"gender":0,"id":1757739,"known_for_department":"Acting","name":"Dale Anthony Jennings","original_name":"Dale Anthony Jennings","popularity":0.6,"profile_path":null,"cast_id":118,"character":"VIP (uncredited)","credit_id":"58a3231e9251411b58000064","order":95},{"adult":false,"gender":1,"id":1757740,"known_for_department":"Acting","name":"Racquel Bianca John","original_name":"Racquel Bianca John","popularity":1.4,"profile_path":"/cUKOsRNbbnPKJbedU3bY4U7lPX.jpg","cast_id":119,"character":"Military Teenage Girl (uncredited)","credit_id":"58a3232e9251411b4e000061","order":96},{"adult":false,"gender":0,"id":1757742,"known_for_department":"Acting","name":"Kendall Kiker","original_name":"Kendall Kiker","popularity":0.6,"profile_path":null,"cast_id":121,"character":"Event Staff (uncredited)","credit_id":"58a3234f9251411b5f000074","order":97},{"adult":false,"gender":2,"id":1757745,"known_for_department":"Acting","name":"Brian Kim","original_name":"Brian Kim","popularity":0.6,"profile_path":null,"cast_id":122,"character":"Vendor (uncredited)","credit_id":"58a3235d9251411b58000088","order":98},{"adult":false,"gender":2,"id":1689331,"known_for_department":"Acting","name":"Alex Kramer","original_name":"Alex Kramer","popularity":0.864,"profile_path":"/qL0Sw6jbfgPYaTpbH99i60OYyei.jpg","cast_id":123,"character":"Wounded Soldier (uncredited)","credit_id":"58a323909251411b580000ae","order":99},{"adult":false,"gender":0,"id":1757747,"known_for_department":"Acting","name":"Avery Laraki","original_name":"Avery Laraki","popularity":0.6,"profile_path":null,"cast_id":124,"character":"Hispanic Teenager (uncredited)","credit_id":"58a3239f9251411b580000b7","order":100},{"adult":false,"gender":0,"id":1757748,"known_for_department":"Acting","name":"Roy Larsen","original_name":"Roy Larsen","popularity":0.6,"profile_path":null,"cast_id":125,"character":"Texas Billionaire (uncredited)","credit_id":"58a323ae9251411b4a0000cb","order":101},{"adult":false,"gender":2,"id":1757749,"known_for_department":"Acting","name":"Adrian Lockett","original_name":"Adrian Lockett","popularity":0.833,"profile_path":"/gNpb9xJKWZjmMcWKIdK9s5xtEGZ.jpg","cast_id":127,"character":"Military (uncredited)","credit_id":"58a323d19251411b4e0000aa","order":102},{"adult":false,"gender":1,"id":1757750,"known_for_department":"Acting","name":"Shannon Long","original_name":"Shannon Long","popularity":0.6,"profile_path":null,"cast_id":128,"character":"Cheerleader (uncredited)","credit_id":"58a323ea9251411ba10000d8","order":103},{"adult":false,"gender":2,"id":1757751,"known_for_department":"Acting","name":"Luke Loveless","original_name":"Luke Loveless","popularity":1.45,"profile_path":"/fttilU3JHFQfm1TOPTOMAcmw7E9.jpg","cast_id":129,"character":"Jumbotron Kid (uncredited)","credit_id":"58a32408c3a3684c8e0000fe","order":104},{"adult":false,"gender":0,"id":1757752,"known_for_department":"Acting","name":"Zamadia Lyles","original_name":"Zamadia Lyles","popularity":0.6,"profile_path":null,"cast_id":131,"character":"Cheerleader (uncredited)","credit_id":"58a32431c3a3684c8e000119","order":105},{"adult":false,"gender":2,"id":1694509,"known_for_department":"Acting","name":"Shaun Michael Lynch","original_name":"Shaun Michael Lynch","popularity":0.98,"profile_path":null,"cast_id":132,"character":"Grateful / Anxious American (uncredited)","credit_id":"58a324449251411b46000104","order":106},{"adult":false,"gender":0,"id":1757753,"known_for_department":"Acting","name":"Eric Maldonado","original_name":"Eric Maldonado","popularity":0.6,"profile_path":null,"cast_id":133,"character":"Physical Therapist (uncredited)","credit_id":"58a32455c3a3684c760000f3","order":107},{"adult":false,"gender":0,"id":1757754,"known_for_department":"Acting","name":"Asia Diamond Mason","original_name":"Asia Diamond Mason","popularity":0.6,"profile_path":null,"cast_id":134,"character":"Pep Squad / Dancer (uncredited)","credit_id":"58a32467c3a3684c83000103","order":108},{"adult":false,"gender":2,"id":1757755,"known_for_department":"Acting","name":"Ronny Mathew","original_name":"Ronny Mathew","popularity":1.257,"profile_path":"/e319puw6iVEzATL9FXYY0MGiQCy.jpg","cast_id":135,"character":"Grateful / Anxious American (uncredited)","credit_id":"58a32479c3a36852dd000004","order":109},{"adult":false,"gender":2,"id":1635144,"known_for_department":"Acting","name":"Trey McGriff","original_name":"Trey McGriff","popularity":1.156,"profile_path":"/iuGh6AGdnfLdPEB93bQxnGiq48W.jpg","cast_id":136,"character":"VIP Dallas Bravo Football Fan (uncredited)","credit_id":"58a32489c3a3685272000012","order":110},{"adult":false,"gender":2,"id":1704659,"known_for_department":"Acting","name":"Jock McKissic","original_name":"Jock McKissic","popularity":0.6,"profile_path":"/wdBhUtdo11JmSbYlWgkTxRJZDTF.jpg","cast_id":137,"character":"Offensive Lineman (uncredited)","credit_id":"58a32498c3a36852dd000017","order":111},{"adult":false,"gender":1,"id":1757756,"known_for_department":"Acting","name":"Dana Clark McPherson","original_name":"Dana Clark McPherson","popularity":0.6,"profile_path":null,"cast_id":138,"character":"VIP Fan (uncredited)","credit_id":"58a324aec3a3685255000028","order":112},{"adult":false,"gender":2,"id":1705851,"known_for_department":"Acting","name":"Matt Mercurio","original_name":"Matt Mercurio","popularity":0.725,"profile_path":"/GgvUolaiAFTnTxj6YnbSFPT45b.jpg","cast_id":139,"character":"Grateful / Anxious American (uncredited)","credit_id":"58a324c392514121d0000037","order":113},{"adult":false,"gender":0,"id":1757757,"known_for_department":"Acting","name":"Gary Miller","original_name":"Gary Miller","popularity":0.6,"profile_path":"/tof9qDjHYY5hxwijXeahoUtSPvh.jpg","cast_id":140,"character":"Texas Aristocrat (uncredited)","credit_id":"58a324e092514121d0000044","order":114},{"adult":false,"gender":0,"id":1757759,"known_for_department":"Acting","name":"Michael Montgomery","original_name":"Michael Montgomery","popularity":0.608,"profile_path":null,"cast_id":142,"character":"Inspiring Football Player (uncredited)","credit_id":"58a3251592514121d7000053","order":115},{"adult":false,"gender":2,"id":1181570,"known_for_department":"Acting","name":"Ricky Muse","original_name":"Ricky Muse","popularity":1.259,"profile_path":"/2tGntlFcMUEzZYyfzpKRF3DyhS7.jpg","cast_id":144,"character":"Grateful / Anxious American (uncredited)","credit_id":"58a3253892514121d7000064","order":116},{"adult":false,"gender":0,"id":1610738,"known_for_department":"Acting","name":"Tommy O'Brien","original_name":"Tommy O'Brien","popularity":0.6,"profile_path":"/rqfRf8RgjBQUz5WKQTc8JZAVWh3.jpg","cast_id":147,"character":"Patriotic Reporter - Press Conference (uncredited)","credit_id":"58a32586c3a36852dd0000a1","order":117},{"adult":false,"gender":2,"id":1540119,"known_for_department":"Acting","name":"Afsheen Olyaie","original_name":"Afsheen Olyaie","popularity":0.831,"profile_path":null,"cast_id":149,"character":"Slumdog / Soldier (uncredited)","credit_id":"58a325afc3a36852a40000c8","order":118},{"adult":false,"gender":0,"id":1757763,"known_for_department":"Acting","name":"George Pringle","original_name":"George Pringle","popularity":0.6,"profile_path":null,"cast_id":153,"character":"Cameraman Press (uncredited)","credit_id":"58a326abc3a368527200011d","order":119},{"adult":false,"gender":1,"id":928963,"known_for_department":"Production","name":"Moneca S. Reid","original_name":"Moneca S. Reid","popularity":0.6,"profile_path":null,"cast_id":154,"character":"Football Fan (uncredited)","credit_id":"58a32774c3a36859dc000052","order":120},{"adult":false,"gender":0,"id":1757764,"known_for_department":"Acting","name":"Shuntel Renay","original_name":"Shuntel Renay","popularity":0.6,"profile_path":null,"cast_id":155,"character":"Pep Squad Dancer (uncredited)","credit_id":"58a3278592514127d600006c","order":121},{"adult":false,"gender":1,"id":1367909,"known_for_department":"Acting","name":"Kristin McKenzie","original_name":"Kristin McKenzie","popularity":0.6,"profile_path":null,"cast_id":156,"character":"Soldier in Iraq (uncredited)","credit_id":"58a327b4c3a368596300007f","order":122},{"adult":false,"gender":1,"id":1757765,"known_for_department":"Acting","name":"Chan Ta Rivers","original_name":"Chan Ta Rivers","popularity":0.6,"profile_path":null,"cast_id":157,"character":"Grateful / Anxious American (uncredited)","credit_id":"58a3288dc3a36859af0000ce","order":123},{"adult":false,"gender":0,"id":1507552,"known_for_department":"Acting","name":"Giovanni Rodriguez","original_name":"Giovanni Rodriguez","popularity":0.649,"profile_path":"/kDoNPV2NpXN1pH37pc8UkOcK7MB.jpg","cast_id":158,"character":"Cameraman (uncredited)","credit_id":"58a328b8c3a36859dc0000df","order":124},{"adult":false,"gender":2,"id":1502291,"known_for_department":"Acting","name":"Joel Rogers","original_name":"Joel Rogers","popularity":0.6,"profile_path":null,"cast_id":159,"character":"VIP Dinner Guest (uncredited)","credit_id":"58a328de92514127ce000145","order":125},{"adult":false,"gender":1,"id":1757767,"known_for_department":"Acting","name":"Kourtney Shales","original_name":"Kourtney Shales","popularity":0.6,"profile_path":null,"cast_id":161,"character":"Cheerleader (uncredited)","credit_id":"58a32942c3a36859bc000151","order":126},{"adult":false,"gender":2,"id":558318,"known_for_department":"Acting","name":"Jack Teague","original_name":"Jack Teague","popularity":0.6,"profile_path":"/kZ35qXAp37UvcFRS6uoLpVC8OXP.jpg","cast_id":164,"character":"Sideline VIP Guest (uncredited)","credit_id":"58a32a0bc3a36859bc0001c8","order":127},{"adult":false,"gender":0,"id":1347326,"known_for_department":"Acting","name":"Kenneth Tipton","original_name":"Kenneth Tipton","popularity":0.6,"profile_path":null,"cast_id":168,"character":"Dancer (uncredited)","credit_id":"58a32ac092514127ca00020e","order":128},{"adult":false,"gender":2,"id":1744066,"known_for_department":"Acting","name":"Jordan Verroi","original_name":"Jordan Verroi","popularity":0.6,"profile_path":"/dW184f1g2JoG4cB9s6ToSHIJVoG.jpg","cast_id":169,"character":"Military Mechanic (uncredited)","credit_id":"58a32acf92514127d6000224","order":129},{"adult":false,"gender":2,"id":123703,"known_for_department":"Acting","name":"Steve Warren","original_name":"Steve Warren","popularity":0.6,"profile_path":null,"cast_id":171,"character":"Football Fan (uncredited)","credit_id":"58a32b06c3a36859bc000235","order":130},{"adult":false,"gender":0,"id":1757773,"known_for_department":"Acting","name":"Erick Wofford","original_name":"Erick Wofford","popularity":0.6,"profile_path":null,"cast_id":173,"character":"Marine Marcher (uncredited)","credit_id":"58a32b5992514127d2000280","order":131},{"adult":false,"gender":0,"id":1757775,"known_for_department":"Acting","name":"Brian Wyatt","original_name":"Brian Wyatt","popularity":0.6,"profile_path":null,"cast_id":175,"character":"New Van Crew Member (uncredited)","credit_id":"58a32b8fc3a368598800025a","order":132},{"adult":false,"gender":2,"id":1466629,"known_for_department":"Acting","name":"Jesse Yarborough","original_name":"Jesse Yarborough","popularity":0.6,"profile_path":"/ljLKsMlBajNIHjS3aAJNlrTNDgo.jpg","cast_id":176,"character":"Football Fan (uncredited)","credit_id":"58a32ba1c3a36859d0000278","order":133},{"adult":false,"gender":0,"id":1737097,"known_for_department":"Acting","name":"Jonathan Yaskoff","original_name":"Jonathan Yaskoff","popularity":0.6,"profile_path":null,"cast_id":177,"character":"Reporter (uncredited)","credit_id":"58a32bafc3a36859630002ad","order":134},{"adult":false,"gender":2,"id":3642720,"known_for_department":"Acting","name":"Jay Busbee","original_name":"Jay Busbee","popularity":0.6,"profile_path":null,"cast_id":180,"character":"Photographer (uncredited)","credit_id":"62e5de26bd588b005e1b46dc","order":135}],"crew":[{"adult":false,"gender":1,"id":2952,"known_for_department":"Production","name":"Avy Kaufman","original_name":"Avy Kaufman","popularity":1.963,"profile_path":null,"credit_id":"5801dcb1c3a368312b003be6","department":"Production","job":"Casting"},{"adult":false,"gender":2,"id":1614,"known_for_department":"Directing","name":"Ang Lee","original_name":"Ang Lee","popularity":6.373,"profile_path":"/jrmdsPZI5WT4rmOl20Gb1Y2femb.jpg","credit_id":"55383b1dc3a36815ac007c13","department":"Directing","job":"Director"},{"adult":false,"gender":2,"id":1614,"known_for_department":"Directing","name":"Ang Lee","original_name":"Ang Lee","popularity":6.373,"profile_path":"/jrmdsPZI5WT4rmOl20Gb1Y2femb.jpg","credit_id":"55383b699251413f5a00016c","department":"Production","job":"Producer"},{"adult":false,"gender":2,"id":1635,"known_for_department":"Editing","name":"Tim Squyres","original_name":"Tim Squyres","popularity":0.608,"profile_path":"/vVYTsqt6fEr6rS1UhLU2aejPDlt.jpg","credit_id":"578853c7c3a3683919004841","department":"Editing","job":"Editor"},{"adult":false,"gender":2,"id":2483,"known_for_department":"Camera","name":"John Toll","original_name":"John Toll","popularity":0.731,"profile_path":"/cfL9A6tC7L5Ps5fq1o3WpVKGMb1.jpg","credit_id":"5801da189251410136003ff7","department":"Camera","job":"Director of Photography"},{"adult":false,"gender":2,"id":5670,"known_for_department":"Art","name":"Mark Friedberg","original_name":"Mark Friedberg","popularity":0.6,"profile_path":null,"credit_id":"5801dce4925141013200401a","department":"Art","job":"Production Design"},{"adult":false,"gender":2,"id":5359,"known_for_department":"Sound","name":"Mychael Danna","original_name":"Mychael Danna","popularity":3.386,"profile_path":"/uGkvVeKZspg3BwgRmdCIENT7Sqm.jpg","credit_id":"578853e692514131bd00415b","department":"Sound","job":"Original Music Composer"},{"adult":false,"gender":2,"id":8320,"known_for_department":"Sound","name":"Jeff Danna","original_name":"Jeff Danna","popularity":1.052,"profile_path":"/vrMSt7FaXyejKTgpkS58wuTrgqu.jpg","credit_id":"578853d8c3a368393000413c","department":"Sound","job":"Original Music Composer"},{"adult":false,"gender":2,"id":23485,"known_for_department":"Production","name":"Marc Platt","original_name":"Marc Platt","popularity":2.807,"profile_path":"/1V51JQqDdoXnC4LElFfSPSjYGfY.jpg","credit_id":"56b291bfc3a36845b1000f51","department":"Production","job":"Producer"},{"adult":false,"gender":2,"id":36429,"known_for_department":"Costume & Make-Up","name":"Joseph G. Aulisi","original_name":"Joseph G. Aulisi","popularity":0.6,"profile_path":null,"credit_id":"5801dccec3a368310d004519","department":"Costume & Make-Up","job":"Costume Design"},{"adult":false,"gender":2,"id":57631,"known_for_department":"Writing","name":"Simon Beaufoy","original_name":"Simon Beaufoy","popularity":2.513,"profile_path":"/5K3SYkrzvBLBusV0Js22QFds8Ok.jpg","credit_id":"55383b28925141651800795b","department":"Writing","job":"Screenplay"},{"adult":false,"gender":1,"id":76003,"known_for_department":"Crew","name":"Susan Hegarty","original_name":"Susan Hegarty","popularity":1.528,"profile_path":null,"credit_id":"58c6b353c3a3684114016be3","department":"Crew","job":"Dialect Coach"},{"adult":false,"gender":2,"id":132350,"known_for_department":"Production","name":"Stephen Cornwell","original_name":"Stephen Cornwell","popularity":1.593,"profile_path":null,"credit_id":"55383b5fc3a3687845004cc3","department":"Production","job":"Producer"},{"adult":false,"gender":0,"id":1281632,"known_for_department":"Production","name":"Simon Cornwell","original_name":"Simon Cornwell","popularity":1.4,"profile_path":null,"credit_id":"55383b559251414201005374","department":"Production","job":"Producer"},{"adult":false,"gender":0,"id":1458001,"known_for_department":"Writing","name":"Jean-Christophe Castelli","original_name":"Jean-Christophe Castelli","popularity":0.6,"profile_path":null,"credit_id":"55383b339251414201005367","department":"Writing","job":"Screenplay"},{"adult":false,"gender":0,"id":1458002,"known_for_department":"Writing","name":"Ben Fountain","original_name":"Ben Fountain","popularity":1.214,"profile_path":null,"credit_id":"55383b459251413f5a000160","department":"Writing","job":"Novel"},{"adult":false,"gender":0,"id":2657300,"known_for_department":"Production","name":"Jeff Robinov","original_name":"Jeff Robinov","popularity":0.6,"profile_path":null,"credit_id":"632e330ec525c4007a210a7c","department":"Production","job":"Producer"}]}}
\ No newline at end of file
diff --git a/test_data/https___api_themoviedb_org_3_tv_57243_api_key_19890604_language_zh_CN_append_to_response_external_ids_credits b/test_data/https___api_themoviedb_org_3_tv_57243_api_key_19890604_language_zh_CN_append_to_response_external_ids_credits
new file mode 100644
index 00000000..d60bdc10
--- /dev/null
+++ b/test_data/https___api_themoviedb_org_3_tv_57243_api_key_19890604_language_zh_CN_append_to_response_external_ids_credits
@@ -0,0 +1 @@
+{"adult":false,"backdrop_path":"/sRfl6vyzGWutgG0cmXmbChC4iN6.jpg","created_by":[{"id":57293,"credit_id":"527f9c6b19c29514f208c30e","name":"Sydney Newman","gender":2,"profile_path":"/b50k5xcXgxgrXrZegFccQmKvyU2.jpg"},{"id":1213433,"credit_id":"527f9c8119c29514ef0a0829","name":"Donald Wilson","gender":2,"profile_path":null},{"id":1213434,"credit_id":"527f9c7619c29514f208c31e","name":"C. E. Webber","gender":2,"profile_path":"/lHzDADWGW2ESV1uDovZzLG79sRc.jpg"}],"episode_run_time":[80,70,50,60,45],"first_air_date":"2005-03-26","genres":[{"id":10759,"name":"动作冒险"},{"id":18,"name":"剧情"},{"id":10765,"name":"Sci-Fi & Fantasy"}],"homepage":"http://www.bbc.co.uk/programmes/b006q2x0","id":57243,"in_production":true,"languages":["en"],"last_air_date":"2021-12-05","last_episode_to_air":{"air_date":"2021-12-05","episode_number":6,"id":3336493,"name":"征服者","overview":"在 Flux 故事的最后一章中,所有的希望都破灭了。 黑暗势力在掌控之中。 但是,当怪物获胜时,您可以指望谁来拯救宇宙?","production_code":"","runtime":59,"season_number":13,"show_id":57243,"still_path":"/20wu1cj5iZWyphnYQvKY1M9yBYQ.jpg","vote_average":6.1,"vote_count":11},"name":"神秘博士","next_episode_to_air":null,"networks":[{"id":4,"name":"BBC One","logo_path":"/mVn7xESaTNmjBUyUtGNvDQd3CT1.png","origin_country":"GB"}],"number_of_episodes":153,"number_of_seasons":13,"origin_country":["GB"],"original_language":"en","original_name":"Doctor Who","overview":"名为“博士”的宇宙最后一个时间领主,有着重生的能力、体力及优越的智力,利用时光机器TARDIS英国传统的蓝色警亭,展开他勇敢的时光冒险之旅,拯救外星生物、地球与时空。","popularity":158.575,"poster_path":"/sz4zF5z9zyFh8Z6g5IQPNq91cI7.jpg","production_companies":[{"id":4762,"logo_path":"/igWZmjr5Zhbnxf7DinSOLoiggLU.png","name":"BBC Wales","origin_country":"GB"},{"id":12113,"logo_path":"/lwnLVleFG0sRAYBq5IObgN30r9F.png","name":"CBC","origin_country":"CA"},{"id":80893,"logo_path":"/8rITuQjEtHEjdyU49sv9fKBYf8E.png","name":"BBC Studios","origin_country":"GB"},{"id":82996,"logo_path":"/sxxPhM3Qt3OCQaFUyeegZ8eqcs9.png","name":"Bad Wolf","origin_country":"GB"}],"production_countries":[{"iso_3166_1":"CA","name":"Canada"},{"iso_3166_1":"GB","name":"United Kingdom"}],"seasons":[{"air_date":"2005-11-18","episode_count":199,"id":58476,"name":"特别篇","overview":"","poster_path":"/oKUI2vCVGpakvfZJ4GmEZC8AvRX.jpg","season_number":0},{"air_date":"2005-03-26","episode_count":13,"id":58468,"name":"第 1 季","overview":"2005年版的第九任博士是忧郁的战争幸存者,经历了时之战争,他封印了他的种族和敌人戴立克,是唯一活下来的人。 该剧讲述了名为“Doctor”(克里斯托弗·埃克莱斯顿 Christopher Eccleston 饰)的神秘外星时间旅行者,随着他的时空机器TARDIS的(Time And Relative Dimensions In Space)冒险故事,他的时空机器外观看上去像1950年代的警亭。博士带着他的伙伴罗斯(比莉·派佩 Billie Piper 饰)在时间、空间中探索悠游、打击邪恶力量、拯救文明、帮助人民、纠正错误、解决各类问题。 ©豆瓣","poster_path":"/8VQbOkGMJ1a7aIFnmwyiQhryNVH.jpg","season_number":1},{"air_date":"2006-04-15","episode_count":13,"id":58469,"name":"第 2 季","overview":"","poster_path":"/7pJPE3P9lv6WRKlprMHRcUQ36rF.jpg","season_number":2},{"air_date":"2007-04-01","episode_count":13,"id":58470,"name":"第 3 季","overview":"神秘博士第三季,电视剧名,主演David,Tennant,2007年在欧美发行,该剧是一个内容丰富、极具追看性的科幻历险故事。故事主人翁the Doctor是一个机智英勇,能穿越时间空间的冒险家。他与其亲密拍挡Rose在进行紧张刺激的宇宙探索之际,竟遇上了有意毁灭地球的外层空间怪物 Dalek。凭着the Doctor的机智及能力,究竟他能否阻止 Dalek 侵袭地球,避免这场浩劫的发生。","poster_path":"/nXMsNC0AWqorc2JcH7z2DKBLRjV.jpg","season_number":3},{"air_date":"2008-04-05","episode_count":13,"id":58471,"name":"第 4 季","overview":"在第十任博士的故事里,他始终强烈的孤独。仿佛诅咒,他的同伴——所有的人总有一天离开他;自己并一个人地走向死亡。在他的生命最终结束的时候,坐着塔迪斯和过去的同伴一一告别。第十任是一个轻松健谈,随和机智的人,对敌人总会给予第二次机会却又绝不过分仁慈。曾经和女伴罗斯有过一场恋爱,最后以两人分隔在不同的宇宙告终,之后也和其它的同伴一起环游宇宙,拯救世界。第十任一般穿深褐色(蓝色条纹)或蓝色(铁锈红条纹)四个扣子的西装,衬衫和领带,浅棕色的人造麂皮大衣。","poster_path":"/jQmM0kRXf5yHD8y5exkLQttkHtX.jpg","season_number":4},{"air_date":"2010-04-03","episode_count":13,"id":58472,"name":"第 5 季","overview":"第十一任博士第一次出现在特别篇《时之终结》的最后一分钟时,然后在《第十一小时 11th》中他第一次见到艾米,并调查墙上的一个神秘裂缝。然后艾米在她的结婚前夕,同意加入博士的旅行。而后博士也选择了第二个同伴罗利。在第六季博士获悉,艾米和罗利的孩子长大后会成为River Song,并在结婚仪式上阻止了博士的死亡,以防止世界崩溃。第十一任被描绘成一个充满活力,童心活泼的灵魂,拥有傲慢的脾气,性急但富有同情心的人。第十一任声称他是“一个愚蠢的自私的人”,甚至说,宇宙中没有人恨他,他恨自己。尽管他的自我厌恶,或许正因为如此,博士愿意牺牲自己,如果需要的话。River曾表示,博士总是领先一步,心中始终有一个计划。","poster_path":"/986K0cfD4TsuhOhtQDgefaNwZea.jpg","season_number":5},{"air_date":"2011-04-23","episode_count":13,"id":58473,"name":"第 6 季","overview":"神秘博士再度归来!博士将踏足美国,与Amy和百夫长Rory展开全新征程,等等,还有!River Song,这个神秘莫测的女人将再次回到博士身边,River Song到底是谁?她和博士是什么关系?万众期待的“博士的妻子”一集也将在本季中播出,由科幻大师尼尔·盖曼亲自撰写的该集将会把剧情推向何处?又会揭开博士的哪些秘密?","poster_path":"/121nKj7KSMVIBBwMHIJd8ArzRHE.jpg","season_number":6},{"air_date":"2012-09-01","episode_count":13,"id":58474,"name":"第 7 季","overview":"新一季的《神秘博士》,Amy和Rory将伴随博士走完2012,他们将在今年播出的5集当中与博士告别,在圣诞节特别集中,我们将认识新的博士伙伴,并和她一起跨入神秘博士的第50个年头。","poster_path":"/w3LRDMX6sqFwkvTD0bi1ZR9HS5q.jpg","season_number":7},{"air_date":"2014-08-23","episode_count":12,"id":58475,"name":"第 8 季","overview":"系列8共有12集,于2013年5月20日获得英国广播公司正式预订。[1]史蒂芬·莫法特担任本系列的首席编剧,与布瑞恩·明钦同为执行制片人。本系列于2005年复活后的第8季,整个系列的第34季。\n\n彼得·卡帕尔蒂饰演类人外星人第十二任博士,一位能够通过TARDIS穿越时空的时间领主。珍娜·科尔曼饰演博士的同伴克拉拉·奥斯瓦德。塞缪尔·安德森剧中饰演一个常规角色,克拉拉的男朋友丹尼·平克。本系列故事主要围绕米歇尔·戈麦斯所饰演的女法师蜜西(Missy)展开。","poster_path":"/s5mWlS1L3QAa0vrSWRjJEfA4ctQ.jpg","season_number":8},{"air_date":"2015-09-19","episode_count":12,"id":64188,"name":"第 9 季","overview":"这是第二系列主演彼得作为第十二任博士,一个外星人时间领主们穿越时间和空间,通过他的TARDIS,看起来像是在英国警察岗亭。珍娜科尔曼将作为医生的伴侣克拉拉奥斯瓦尔德。","poster_path":"/AeFY6HsLGcanP2fhD6Feii9BhHW.jpg","season_number":9},{"air_date":"2017-04-15","episode_count":12,"id":76615,"name":"第 10 季","overview":"系列10共有14集,包括2016年和2017年的2集圣诞特辑和12集常规剧。本系列常规剧于2017年4月15日首播,7月1日完结。史蒂芬·莫法特继续担任首席编剧和执行制片人,这是他担任本剧首席编剧的第6个也是最后一个系列。本系列是2005年复活后的第10季,整个系列的第36季。\n\n这是彼得·卡帕尔蒂主演的第三个也是最后一个常规系列,他饰演类人外星人第十二任博士,一位能够通过TARDIS穿越时空的时间领主。卡帕尔蒂于2017年1月宣布在本系列结束后会离开本剧。本系列引入了由珀尔·麦琪饰演的新同伴比尔·波茨。此外,马修·卢卡斯饰演纳多尔,他出现于2015年和2016年的圣诞特辑中。米歇尔·戈麦斯和约翰·西姆饰演法师的不同化身。","poster_path":"/m6Y9BZVCEUA9woJvSlclTgqHfxC.jpg","season_number":10},{"air_date":"2018-10-07","episode_count":10,"id":97100,"name":"第 11 季","overview":"BBC宣布续订《神秘博士》第十一季,不过重点在于,《神探夏洛克》编剧Steven Moffat将在第十季结束后退出该剧,将帅印交给《小镇疑云》编剧Chris Chibnall。\n\n朱迪·惠特克接替彼得·卡帕尔蒂饰演第十三任博士,一位通过塔迪斯穿越时空的外星人,是本剧自1963年开播以来的第一位女博士。同时引入全新角色格雷姆·奥布莱恩(布拉德利·沃尔什饰)、瑞恩·辛克莱(托辛·科尔饰)和娅斯敏·坎(曼迪·吉尔饰)作为博士的最新同伴。本系列紧承2018年圣诞特辑《曾有两次》的剧情,以重生后的博士寻找丢失的塔迪斯为开端,无意之中带领格雷姆、瑞恩和娅斯敏一同开始时空旅行。本系列中每集讲述一个相对独立的的完整故事,没有出现由连续多集组成的故事。\n\n除克里斯·奇布诺尔执笔参与撰写包括特辑在内的7集剧本之外,玛洛丽·布莱克曼、维奈·帕特尔、皮特·麦克蒂格、乔伊·威尔金森和艾德·希姆各为其中1集编剧。杰米·蔡尔兹、马克·托德莱、萨利·阿帕拉哈米安和珍妮弗·佩罗特分别执导常规剧集中的两集,韦恩·叶执导新年特辑。本系列于2017年11月开拍,2018年8月完成拍摄,2018年10月7日首播,定于每周日播出。与重启以来传统的圣诞特辑不同,本系列相关的特辑《新年决心》于2019年的元旦播出。","poster_path":"/udAbZBo8P23Y4jAP0Z3wrzgDDOr.jpg","season_number":11},{"air_date":"2020-01-01","episode_count":10,"id":135741,"name":"第 12 季","overview":"本系列在剧情上承接2019年元旦播出的新年特辑《新年决心》,朱迪·惠特克继续饰演第十三任博士,一位通过塔迪斯穿越时空的外星人,是她主演博士的第2个常规系列。布拉德利·沃尔什、托辛·科尔和曼迪·吉尔继续饰演博士的同伴格雷姆·奥布莱恩、瑞恩·辛克莱和娅斯敏·坎。\n\n共有10集的的常规系列由杰米·马格努斯·斯通、李·海文·钟斯(Lee Haven Jones)、奈达·曼祖尔(Nida Manzoor)和艾玛·沙利文(Emma Sullivan)执导,克里斯·奇布诺尔为其中4集编剧,艾德·希姆(Ed Hime)、皮特·麦克蒂格和维奈·帕特尔回归为本系列执笔剧本,新编剧尼娜·梅蒂维尔(Nina Métivier)、玛克辛·奥尔德顿(Maxine Alderton)和夏琳·詹姆斯加入创作团队。在常规剧集全部播出之后,于2021年元旦播出新年特辑《戴立克革命》。","poster_path":"/cDDb7WA2i7cENhkEEjXEDrXGyNL.jpg","season_number":12},{"air_date":"2021-10-31","episode_count":6,"id":175012,"name":"第 13 季","overview":"《神秘博士》第13季宣布开拍。运作人Chris Chibnall透露新季将缩短为8集,因为该剧拍摄的复杂性,在新冠疫情下拍每一集所需的时间延长了,“不过《神秘博士》的雄心、幽默、乐趣和惊吓是不会少的。如今对全世界来说充满考验,但博士从不逃避挑战”。","poster_path":"/hnAwYE6NvC4UVdMRPd7FOX52PQy.jpg","season_number":13}],"spoken_languages":[{"english_name":"English","iso_639_1":"en","name":"English"}],"status":"Returning Series","tagline":"","type":"Scripted","vote_average":7.402,"vote_count":2475,"external_ids":{"imdb_id":"tt0436992","freebase_mid":"/m/0wp920q","freebase_id":null,"tvdb_id":78804,"tvrage_id":3332,"wikidata_id":null,"facebook_id":"DoctorWho","instagram_id":"bbcdoctorwho","twitter_id":"bbcdoctorwho"},"credits":{"cast":[{"adult":false,"gender":1,"id":66431,"known_for_department":"Acting","name":"Jodie Whittaker","original_name":"Jodie Whittaker","popularity":10.809,"profile_path":"/zS6EO1GsfOiuyaa66YqmUPWDX78.jpg","character":"The Doctor","credit_id":"597b356a925141364a0106fb","order":6},{"adult":false,"gender":1,"id":1752554,"known_for_department":"Acting","name":"Mandip Gill","original_name":"Mandip Gill","popularity":6.154,"profile_path":"/diYYg7qi2oXWL5ys4y7o51kp6oG.jpg","character":"Yasmin 'Yaz' Khan","credit_id":"5a6f45b90e0a26795f0000f9","order":8},{"adult":false,"gender":2,"id":216049,"known_for_department":"Acting","name":"John Bishop","original_name":"John Bishop","popularity":3.729,"profile_path":"/tooZmoOa6YLZTyak8gbbYXFeile.jpg","character":"Dan Lewis","credit_id":"5fef84a4140bad003ca577ad","order":10}],"crew":[{"adult":false,"gender":2,"id":9002,"known_for_department":"Production","name":"Andy Pryor","original_name":"Andy Pryor","popularity":0.828,"profile_path":"/vZj1ruX5JUJTtWZX0zs3QJGezyo.jpg","credit_id":"568d4604c3a3686075032d7f","department":"Production","job":"Casting"}]}}
\ No newline at end of file
diff --git a/test_data/https___api_themoviedb_org_3_tv_57243_season_4_api_key_19890604_language_zh_CN_append_to_response_external_ids_credits b/test_data/https___api_themoviedb_org_3_tv_57243_season_4_api_key_19890604_language_zh_CN_append_to_response_external_ids_credits
new file mode 100644
index 00000000..b7c44cad
--- /dev/null
+++ b/test_data/https___api_themoviedb_org_3_tv_57243_season_4_api_key_19890604_language_zh_CN_append_to_response_external_ids_credits
@@ -0,0 +1 @@
+{"_id":"52598aa3760ee34661b223bf","air_date":"2008-04-05","episodes":[{"air_date":"2008-04-05","episode_number":1,"id":941505,"name":"活宝搭档","overview":"博士在伦敦发现艾迪派斯公司新产品药物有问题,人类服用后会悄悄的产生土豆状生物,并在夜里1点10分逃走回到保姆身边,于是博士潜入公司决定探查究竟,在探查时遇到了多娜原来Adiposian人丢失了他们的繁育星球,于是跑到地球利用人类做代孕母繁殖宝宝。最后保姆在高空中被抛弃,脂肪球回到了父母身边,博士邀请多娜一同旅行。【Rose从平行宇宙回归】","production_code":"","runtime":null,"season_number":4,"show_id":57243,"still_path":"/cq1zrCS267vGXa3rCYQkVKNJE9v.jpg","vote_average":7.2,"vote_count":43,"crew":[{"job":"Director","department":"Directing","credit_id":"52598ab9760ee34661b23eba","adult":false,"gender":2,"id":95893,"known_for_department":"Directing","name":"James Strong","original_name":"James Strong","popularity":1.96,"profile_path":"/qOBBxMHqs6UcWYxE4P7LGa3nT10.jpg"},{"job":"Writer","department":"Writing","credit_id":"52598aa4760ee34661b22580","adult":false,"gender":2,"id":95894,"known_for_department":"Writing","name":"Russell T Davies","original_name":"Russell T Davies","popularity":1.815,"profile_path":"/rDDLhm0Sw7JUqIf7CVkFbu06IEp.jpg"}],"guest_stars":[{"character":"Rose Tyler","credit_id":"5276b22a760ee35a9a263838","order":18,"adult":false,"gender":1,"id":26076,"known_for_department":"Acting","name":"Billie Piper","original_name":"Billie Piper","popularity":9.945,"profile_path":"/gBduwAWEZ1bwuL6f7cjMzBvKlJz.jpg"},{"character":"Suzette Chambers","credit_id":"52598acd760ee34661b257cb","order":507,"adult":false,"gender":1,"id":1226727,"known_for_department":"Acting","name":"Sue Kelvin","original_name":"Sue Kelvin","popularity":0.694,"profile_path":null},{"character":"Taxi Driver","credit_id":"52598acd760ee34661b257f9","order":533,"adult":false,"gender":2,"id":1227548,"known_for_department":"Acting","name":"Jonathan Stratt","original_name":"Jonathan Stratt","popularity":1.954,"profile_path":null},{"character":"Roger Davey","credit_id":"52598ace760ee34661b25827","order":560,"adult":false,"gender":2,"id":1231420,"known_for_department":"Acting","name":"Martin Ball","original_name":"Martin Ball","popularity":0.84,"profile_path":"/no3sxDXskEKdcNPvnVkKs1liCGI.jpg"},{"character":"Penny Carter","credit_id":"52598acf760ee34661b2585e","order":617,"adult":false,"gender":0,"id":1261083,"known_for_department":"Acting","name":"Verona Joseph","original_name":"Verona Joseph","popularity":0.98,"profile_path":null},{"character":"Clare Pope","credit_id":"52598acf760ee34661b258c6","order":694,"adult":false,"gender":0,"id":1229194,"known_for_department":"Acting","name":"Chandra Ruegg","original_name":"Chandra Ruegg","popularity":1.62,"profile_path":"/p0ettgThedI6tFOo7k51bdHFiCx.jpg"},{"character":"Miss Foster","credit_id":"52598acf760ee34661b258f4","order":705,"adult":false,"gender":1,"id":115680,"known_for_department":"Acting","name":"Sarah Lancashire","original_name":"Sarah Lancashire","popularity":4.457,"profile_path":"/aDYVBAAbUgPyZ3qCyQnEfR807Np.jpg"},{"character":"Craig Staniland","credit_id":"52598ad1760ee34661b25953","order":724,"adult":false,"gender":2,"id":1261084,"known_for_department":"Acting","name":"Rachid Sabitri","original_name":"Rachid Sabitri","popularity":0.6,"profile_path":null},{"character":"Stacey Harris","credit_id":"52598ad1760ee34661b259af","order":739,"adult":false,"gender":1,"id":1196101,"known_for_department":"Acting","name":"Jessica Gunning","original_name":"Jessica Gunning","popularity":3.995,"profile_path":"/c4nC6usiZdRlw4VkOcHFLXtrPa0.jpg"},{"character":"Wilfred Mott","credit_id":"5403c798c3a3684366005b58","order":1486,"adult":false,"gender":2,"id":40943,"known_for_department":"Acting","name":"Bernard Cribbins","original_name":"Bernard Cribbins","popularity":7.108,"profile_path":"/lLdaHLskigTNayxy4Tbrt7EKly2.jpg"},{"character":"Sylvia Noble","credit_id":"5403c7adc3a3684363005864","order":1866,"adult":false,"gender":1,"id":1230422,"known_for_department":"Acting","name":"Jacqueline King","original_name":"Jacqueline King","popularity":2.397,"profile_path":"/7vsacSnnE9vUXc2BZR6y0ISrl6a.jpg"}]},{"air_date":"2008-04-12","episode_number":2,"id":941506,"name":"庞贝烈焰","overview":"博士和多娜来到了古罗马的庞贝古城,在庞贝被火山毁灭的前一天。在这里,博士发现预言家拥有精确无比的预言能力,但他们并没有预言到第二天火山的爆发。一种名为Pyrovile靠吸收火山热量生存的外星人控制了预言家和圣女会,企图将庞贝人变成Pyrovile并占领地球。","production_code":"","runtime":null,"season_number":4,"show_id":57243,"still_path":"/4WoJP6if8546yPrWjvJ3SBfHClg.jpg","vote_average":7.5,"vote_count":42,"crew":[{"department":"Writing","job":"Writer","credit_id":"52598ad2760ee34661b25c35","adult":false,"gender":2,"id":41844,"known_for_department":"Writing","name":"James Moran","original_name":"James Moran","popularity":1.932,"profile_path":null},{"department":"Directing","job":"Director","credit_id":"52598acc760ee34661b25647","adult":false,"gender":2,"id":28839,"known_for_department":"Directing","name":"Colin Teague","original_name":"Colin Teague","popularity":1.96,"profile_path":"/BuLsEb5avaevQZyiU1FlWFvREM.jpg"}],"guest_stars":[{"character":"Metella","credit_id":"52598ad1760ee34661b25a5c","order":534,"adult":false,"gender":1,"id":1221733,"known_for_department":"Acting","name":"Tracey Childs","original_name":"Tracey Childs","popularity":1.985,"profile_path":null},{"character":"Spurrina","credit_id":"52598ad1760ee34661b25a8a","order":564,"adult":false,"gender":1,"id":1211864,"known_for_department":"Acting","name":"Sasha Behar","original_name":"Sasha Behar","popularity":2.245,"profile_path":"/jAexiEsIiLxbV7q6RZthyCzvRmK.jpg"},{"character":"High Priestess","credit_id":"52598ad1760ee34661b25ab8","order":595,"adult":false,"gender":1,"id":1221046,"known_for_department":"Acting","name":"Victoria Wicks","original_name":"Victoria Wicks","popularity":3.585,"profile_path":"/825xs638WYUFd7Kq4ZvGrRKBqWE.jpg"},{"character":"Quintus","credit_id":"52598ad2760ee34661b25b17","order":640,"adult":false,"gender":0,"id":1261085,"known_for_department":"Acting","name":"Francois Pandolfo","original_name":"Francois Pandolfo","popularity":1.286,"profile_path":"/p1gHfpDYs6WwodzMTT3wpuW2orl.jpg"},{"character":"Thalina","credit_id":"52598ad2760ee34661b25b47","order":657,"adult":false,"gender":1,"id":125245,"known_for_department":"Acting","name":"Lorraine Burroughs","original_name":"Lorraine Burroughs","popularity":3.469,"profile_path":"/vw29pjB2HmoScL5nRPdZnwns5hs.jpg"},{"character":"Lucius","credit_id":"52598ad2760ee34661b25b75","order":673,"adult":false,"gender":2,"id":26854,"known_for_department":"Acting","name":"Phil Davis","original_name":"Phil Davis","popularity":8.404,"profile_path":"/sNJ9nFWxpGVmQYvq7rU9xqryu0F.jpg"},{"character":"Stallholder","credit_id":"52598ad2760ee34661b25ba3","order":695,"adult":false,"gender":2,"id":191601,"known_for_department":"Acting","name":"Phil Cornwell","original_name":"Phil Cornwell","popularity":2.946,"profile_path":"/xZSHsL2uSrvsfARAZhMEN7KYeNd.jpg"},{"character":"Caecilius","credit_id":"52598ad2760ee34661b25bd1","order":706,"adult":false,"gender":2,"id":12982,"known_for_department":"Acting","name":"Peter Capaldi","original_name":"Peter Capaldi","popularity":14.976,"profile_path":"/wcsd1tMVFjgplfZlTUfb7fiD2zP.jpg"},{"character":"Evelina","credit_id":"52598ad2760ee34661b25bff","order":713,"adult":false,"gender":1,"id":1227648,"known_for_department":"Acting","name":"Francesca Fowler","original_name":"Francesca Fowler","popularity":1.728,"profile_path":"/1dO150dgBiudZg1DP8VFxI9TLqP.jpg"},{"character":"Soothsayer","credit_id":"5915b4ee92514105da015be8","order":1257,"adult":false,"gender":1,"id":543261,"known_for_department":"Acting","name":"Karen Gillan","original_name":"Karen Gillan","popularity":41.65,"profile_path":"/kFLXcFdok3ShDxylr3WNreQphQm.jpg"},{"character":"Major Domo","credit_id":"61e9b948df2945001b861b37","order":1578,"adult":false,"gender":0,"id":1713158,"known_for_department":"Acting","name":"Gerard Bell","original_name":"Gerard Bell","popularity":0.6,"profile_path":null}]},{"air_date":"2008-04-19","episode_number":3,"id":941507,"name":"Ood之星","overview":"博士带着多娜来到了Ood的繁育星球,在这里多娜对Ood作为人类仆人这一点产生了怀疑,而一向温顺的Ood在这里表现为疯狂,嗜杀。在博士和多娜帮助下,解放了Ood主脑,而Ood的长老们却预言了博士的“歌声将要结束”。","production_code":"","runtime":null,"season_number":4,"show_id":57243,"still_path":"/pqzflnCz2QgRC2lUSfCSTofsZJ1.jpg","vote_average":7.7,"vote_count":42,"crew":[{"department":"Writing","job":"Writer","credit_id":"52598ad4760ee34661b25db5","adult":false,"gender":0,"id":1232050,"known_for_department":"Writing","name":"Keith Temple","original_name":"Keith Temple","popularity":0.84,"profile_path":null},{"job":"Director","department":"Directing","credit_id":"52598ab8760ee34661b23b32","adult":false,"gender":0,"id":1213659,"known_for_department":"Directing","name":"Graeme Harper","original_name":"Graeme Harper","popularity":2.68,"profile_path":null}],"guest_stars":[{"character":"Commander Kess","credit_id":"52598ad3760ee34661b25c8a","order":540,"adult":false,"gender":2,"id":1225357,"known_for_department":"Acting","name":"Roger Griffiths","original_name":"Roger Griffiths","popularity":4.281,"profile_path":"/x8n0VqAfRImHMrUFGRSf4tgvDnd.jpg"},{"character":"Mr Halpen","credit_id":"52598ad3760ee34661b25cb8","order":561,"adult":false,"gender":2,"id":41043,"known_for_department":"Acting","name":"Tim McInnerny","original_name":"Tim McInnerny","popularity":7.674,"profile_path":"/nOLjLixEDo1xFhBmAfRLMKwB9Fv.jpg"},{"character":"Solana Mercurio","credit_id":"52598ad3760ee34661b25ce6","order":585,"adult":false,"gender":1,"id":33191,"known_for_department":"Acting","name":"Ayesha Dharker","original_name":"Ayesha Dharker","popularity":4.556,"profile_path":"/6LNt1MmG22qPQxQgRVmoOPfQofQ.jpg"},{"character":"Mr Bartle","credit_id":"52598ad3760ee34661b25d14","order":614,"adult":false,"gender":2,"id":559814,"known_for_department":"Acting","name":"Paul Clayton","original_name":"Paul Clayton","popularity":2.404,"profile_path":"/v991vcdrQodIm2zdb59odfWWG1D.jpg"},{"character":"Rep","credit_id":"52598ad4760ee34661b25d4b","order":667,"adult":false,"gender":2,"id":1261086,"known_for_department":"Acting","name":"Tariq Jordan","original_name":"Tariq Jordan","popularity":0.766,"profile_path":null},{"character":"Dr Ryder","credit_id":"52598ad4760ee34661b25d79","order":681,"adult":false,"gender":2,"id":1643,"known_for_department":"Acting","name":"Adrian Rawlins","original_name":"Adrian Rawlins","popularity":8.654,"profile_path":"/G0PGZqTjenuVTAQiib4ScU7vAI.jpg"},{"character":"Ood Sigma","credit_id":"61e9ba063faba0001d3d864e","order":1580,"adult":false,"gender":2,"id":100085,"known_for_department":"Acting","name":"Paul Kasey","original_name":"Paul Kasey","popularity":2.029,"profile_path":"/f6P4xudwJVEtkzIYh8Ur23U44Sj.jpg"},{"character":"Ood (voice)","credit_id":"61e9ba29d75bd600995251fd","order":1581,"adult":false,"gender":2,"id":20806,"known_for_department":"Acting","name":"Silas Carson","original_name":"Silas Carson","popularity":4.679,"profile_path":"/kCAq5Ma1usCYLtJAFd2iwx6eQn1.jpg"}]},{"air_date":"2008-04-26","episode_number":4,"id":941508,"name":"桑塔人的阴谋(1)","overview":"球出现一种名为atmos的汽车废气处理系统,可实现污染零排放,并100%无碳,这一古怪科技引起了unit部队的注意, 他们让玛莎通知博士前来调查。博士调查中发现了桑塔人,原来桑塔人控制了地球上的天才少年,利用atoms将地球上4亿辆汽车改装成他们的武器。好战的桑塔人视博士为敌人,就在这时桑塔人克隆了玛莎。【桑塔人和UNIT回归】","production_code":"","runtime":null,"season_number":4,"show_id":57243,"still_path":"/7nKSO79WS60wbECOD8iNASsEJwk.jpg","vote_average":7.0,"vote_count":40,"crew":[{"department":"Writing","job":"Writer","credit_id":"52598abe760ee34661b24a4f","adult":false,"gender":0,"id":1216395,"known_for_department":"Writing","name":"Helen Raynor","original_name":"Helen Raynor","popularity":1.22,"profile_path":null},{"department":"Directing","job":"Director","credit_id":"52598ad7760ee34661b25fd6","adult":false,"gender":2,"id":152111,"known_for_department":"Directing","name":"Douglas Mackinnon","original_name":"Douglas Mackinnon","popularity":2.551,"profile_path":null}],"guest_stars":[{"character":"Martha Jones","credit_id":"527f9b2419c29514f5090d76","order":19,"adult":false,"gender":1,"id":1182929,"known_for_department":"Acting","name":"Freema Agyeman","original_name":"Freema Agyeman","popularity":14.495,"profile_path":"/qL741lSB4GJIzBRCMz2xzrO7C45.jpg"},{"character":"Commander Stark","credit_id":"52598ad4760ee34661b25e0a","order":541,"adult":false,"gender":2,"id":1225782,"known_for_department":"Acting","name":"Christopher Ryan","original_name":"Christopher Ryan","popularity":2.778,"profile_path":"/vWUUWNrWUzbxeTKQluoPMKEHXm1.jpg"},{"character":"Luke Rattigan","credit_id":"52598ad5760ee34661b25e3e","order":609,"adult":false,"gender":2,"id":208323,"known_for_department":"Acting","name":"Ryan Sampson","original_name":"Ryan Sampson","popularity":2.909,"profile_path":"/1FfIn5bS8vUurvX7POg0Xlb02xy.jpg"},{"character":"Ross Jenkins","credit_id":"52598ad5760ee34661b25e6c","order":634,"adult":false,"gender":2,"id":116263,"known_for_department":"Acting","name":"Christian Cooke","original_name":"Christian Cooke","popularity":8.364,"profile_path":"/pqIqDP4HuRLc60KR8QMTHWhIJNq.jpg"},{"character":"Commander Skorr","credit_id":"52598ad6760ee34661b25ea9","order":685,"adult":false,"gender":2,"id":1261087,"known_for_department":"Acting","name":"Dan Starkey","original_name":"Dan Starkey","popularity":2.436,"profile_path":"/8eagydTg4BfKS1U1TJIequubBXO.jpg"},{"character":"Colonel Mace","credit_id":"52598ad6760ee34661b25f39","order":729,"adult":false,"gender":2,"id":1220510,"known_for_department":"Acting","name":"Rupert Holliday-Evans","original_name":"Rupert Holliday-Evans","popularity":2.076,"profile_path":"/acy2ziR9pFRpo1h8OHXwhHjNVKL.jpg"},{"character":"Jo Nakashima","credit_id":"52598ad6760ee34661b25f67","order":736,"adult":false,"gender":1,"id":62976,"known_for_department":"Acting","name":"Eleanor Matsuura","original_name":"Eleanor Matsuura","popularity":9.003,"profile_path":"/8PTKH2LHXVxoxPm4kULlQ0OdwTg.jpg"},{"character":"Private Gray","credit_id":"52598ad7760ee34661b25f98","order":744,"adult":false,"gender":2,"id":1261088,"known_for_department":"Acting","name":"Wesley Theobald","original_name":"Wesley Theobald","popularity":0.6,"profile_path":null},{"character":"Wilfred Mott","credit_id":"5403c798c3a3684366005b58","order":1486,"adult":false,"gender":2,"id":40943,"known_for_department":"Acting","name":"Bernard Cribbins","original_name":"Bernard Cribbins","popularity":7.108,"profile_path":"/lLdaHLskigTNayxy4Tbrt7EKly2.jpg"},{"character":"Private Harris","credit_id":"5403c811c3a3684366005b64","order":1579,"adult":false,"gender":2,"id":85977,"known_for_department":"Acting","name":"Clive Standen","original_name":"Clive Standen","popularity":8.532,"profile_path":"/8cxLoC2qnzk0FvuLFLRGxYSq9i9.jpg"},{"character":"Worker","credit_id":"61e9bb424df291004359a571","order":1582,"adult":false,"gender":2,"id":1138897,"known_for_department":"Acting","name":"Radosław Kaim","original_name":"Radosław Kaim","popularity":1.62,"profile_path":"/gBx1QdsjrtSOIJUfvXOIGfhOSiX.jpg"},{"character":"Atmos (voice)","credit_id":"61e9bb6013a3880067b783f5","order":1584,"adult":false,"gender":0,"id":3213558,"known_for_department":"Acting","name":"Elizabeth Ryder","original_name":"Elizabeth Ryder","popularity":0.6,"profile_path":null},{"character":"Sylvia Noble","credit_id":"5403c7adc3a3684363005864","order":1866,"adult":false,"gender":1,"id":1230422,"known_for_department":"Acting","name":"Jacqueline King","original_name":"Jacqueline King","popularity":2.397,"profile_path":"/7vsacSnnE9vUXc2BZR6y0ISrl6a.jpg"}]},{"air_date":"2008-05-03","episode_number":5,"id":941509,"name":"灰色天空(2)","overview":"桑塔人激活了atmos装置释放出了气体,使全球扩散了毒气。危及关头博士救下了玛莎,玛莎利用自己的记忆感动克隆人说出了桑塔人的目的,原来他们是要改造地球成为桑塔人的繁育基地。","production_code":"","runtime":null,"season_number":4,"show_id":57243,"still_path":"/o0OQByMgT3W9AzGg98HgBq9KkA.jpg","vote_average":7.0,"vote_count":41,"crew":[{"department":"Writing","job":"Writer","credit_id":"52598abe760ee34661b24a4f","adult":false,"gender":0,"id":1216395,"known_for_department":"Writing","name":"Helen Raynor","original_name":"Helen Raynor","popularity":1.22,"profile_path":null},{"department":"Directing","job":"Director","credit_id":"52598ad7760ee34661b25fd6","adult":false,"gender":2,"id":152111,"known_for_department":"Directing","name":"Douglas Mackinnon","original_name":"Douglas Mackinnon","popularity":2.551,"profile_path":null}],"guest_stars":[{"character":"Rose Tyler","credit_id":"5276b22a760ee35a9a263838","order":18,"adult":false,"gender":1,"id":26076,"known_for_department":"Acting","name":"Billie Piper","original_name":"Billie Piper","popularity":9.945,"profile_path":"/gBduwAWEZ1bwuL6f7cjMzBvKlJz.jpg"},{"character":"Martha Jones","credit_id":"527f9b2419c29514f5090d76","order":19,"adult":false,"gender":1,"id":1182929,"known_for_department":"Acting","name":"Freema Agyeman","original_name":"Freema Agyeman","popularity":14.495,"profile_path":"/qL741lSB4GJIzBRCMz2xzrO7C45.jpg"},{"character":"Commander Stark","credit_id":"52598ad4760ee34661b25e0a","order":541,"adult":false,"gender":2,"id":1225782,"known_for_department":"Acting","name":"Christopher Ryan","original_name":"Christopher Ryan","popularity":2.778,"profile_path":"/vWUUWNrWUzbxeTKQluoPMKEHXm1.jpg"},{"character":"Luke Rattigan","credit_id":"52598ad5760ee34661b25e3e","order":609,"adult":false,"gender":2,"id":208323,"known_for_department":"Acting","name":"Ryan Sampson","original_name":"Ryan Sampson","popularity":2.909,"profile_path":"/1FfIn5bS8vUurvX7POg0Xlb02xy.jpg"},{"character":"Ross Jenkins","credit_id":"52598ad5760ee34661b25e6c","order":634,"adult":false,"gender":2,"id":116263,"known_for_department":"Acting","name":"Christian Cooke","original_name":"Christian Cooke","popularity":8.364,"profile_path":"/pqIqDP4HuRLc60KR8QMTHWhIJNq.jpg"},{"character":"Commander Skorr","credit_id":"52598ad6760ee34661b25ea9","order":685,"adult":false,"gender":2,"id":1261087,"known_for_department":"Acting","name":"Dan Starkey","original_name":"Dan Starkey","popularity":2.436,"profile_path":"/8eagydTg4BfKS1U1TJIequubBXO.jpg"},{"character":"Captain Price","credit_id":"52598ad8760ee34661b26056","order":717,"adult":false,"gender":0,"id":1261089,"known_for_department":"Acting","name":"Bridget Hodgson","original_name":"Bridget Hodgson","popularity":0.734,"profile_path":null},{"character":"Colonel Mace","credit_id":"52598ad6760ee34661b25f39","order":729,"adult":false,"gender":2,"id":1220510,"known_for_department":"Acting","name":"Rupert Holliday-Evans","original_name":"Rupert Holliday-Evans","popularity":2.076,"profile_path":"/acy2ziR9pFRpo1h8OHXwhHjNVKL.jpg"},{"character":"Male Student","credit_id":"52598ad9760ee34661b26090","order":742,"adult":false,"gender":2,"id":1229419,"known_for_department":"Acting","name":"Leeshon Alexander","original_name":"Leeshon Alexander","popularity":0.743,"profile_path":null},{"character":"Private Gray","credit_id":"52598ad7760ee34661b25f98","order":744,"adult":false,"gender":2,"id":1261088,"known_for_department":"Acting","name":"Wesley Theobald","original_name":"Wesley Theobald","popularity":0.6,"profile_path":null},{"character":"Kirsty Wark","credit_id":"52598ada760ee34661b260fb","order":751,"adult":false,"gender":1,"id":108125,"known_for_department":"Acting","name":"Kirsty Wark","original_name":"Kirsty Wark","popularity":0.6,"profile_path":"/dryHI25Zw0y4FIG6LjeIwzLkXPv.jpg"},{"character":"Wilfred Mott","credit_id":"5403c798c3a3684366005b58","order":1486,"adult":false,"gender":2,"id":40943,"known_for_department":"Acting","name":"Bernard Cribbins","original_name":"Bernard Cribbins","popularity":7.108,"profile_path":"/lLdaHLskigTNayxy4Tbrt7EKly2.jpg"},{"character":"Private Harris","credit_id":"5403c811c3a3684366005b64","order":1579,"adult":false,"gender":2,"id":85977,"known_for_department":"Acting","name":"Clive Standen","original_name":"Clive Standen","popularity":8.532,"profile_path":"/8cxLoC2qnzk0FvuLFLRGxYSq9i9.jpg"},{"character":"Female Student","credit_id":"61e9bbf9b513a80044054c4e","order":1583,"adult":false,"gender":0,"id":3390960,"known_for_department":"Acting","name":"Meryl Fernandes","original_name":"Meryl Fernandes","popularity":0.6,"profile_path":null},{"character":"Trinity Wells","credit_id":"61e9de193faba00096079a0b","order":1857,"adult":false,"gender":1,"id":59088,"known_for_department":"Acting","name":"Lachele Carl","original_name":"Lachele Carl","popularity":1.96,"profile_path":"/me1nkBO717RiYUeoHQht0VFNoYv.jpg"},{"character":"Sylvia Noble","credit_id":"5403c7adc3a3684363005864","order":1866,"adult":false,"gender":1,"id":1230422,"known_for_department":"Acting","name":"Jacqueline King","original_name":"Jacqueline King","popularity":2.397,"profile_path":"/7vsacSnnE9vUXc2BZR6y0ISrl6a.jpg"}]},{"air_date":"2008-05-10","episode_number":6,"id":941510,"name":"博士之女","overview":"博士被塔迪斯带到了梅莎林星球,这里的人类正在和名叫hath的鱼人战斗。博士被强迫进行了单体克隆,于是博士的女儿出生了,但是繁育机器只教会了她怎么战斗,其他一概没有。多娜给她取名Jenny,博士教给她和平的处事态度。进行了几天时间的两族的战争结束了,杰妮被杀,博士最终放弃了报仇,和玛莎与多娜离去,博士离去后,杰妮重生了,她开走飞船独自去宇宙中旅行。","production_code":"","runtime":null,"season_number":4,"show_id":57243,"still_path":"/tqqn9eTtZlSMe1Nng2qmduloOe0.jpg","vote_average":7.1,"vote_count":42,"crew":[{"department":"Writing","job":"Writer","credit_id":"52598abe760ee34661b24b55","adult":false,"gender":2,"id":125267,"known_for_department":"Writing","name":"Stephen Greenhorn","original_name":"Stephen Greenhorn","popularity":1.22,"profile_path":null},{"department":"Directing","job":"Director","credit_id":"52598add760ee34661b2628e","adult":false,"gender":1,"id":1214518,"known_for_department":"Directing","name":"Alice Troughton","original_name":"Alice Troughton","popularity":1.4,"profile_path":"/1dRPhg2YIk1rw8j2asQJOJJLzUJ.jpg"}],"guest_stars":[{"character":"Martha Jones","credit_id":"527f9b2419c29514f5090d76","order":19,"adult":false,"gender":1,"id":1182929,"known_for_department":"Acting","name":"Freema Agyeman","original_name":"Freema Agyeman","popularity":14.495,"profile_path":"/qL741lSB4GJIzBRCMz2xzrO7C45.jpg"},{"character":"Soldier","credit_id":"52598adb760ee34661b26183","order":562,"adult":false,"gender":0,"id":1261091,"known_for_department":"Acting","name":"Olalekan Lawal Jr.","original_name":"Olalekan Lawal Jr.","popularity":1.96,"profile_path":null},{"character":"Carter","credit_id":"52598add760ee34661b261ba","order":623,"adult":false,"gender":0,"id":1261092,"known_for_department":"Acting","name":"Akin Gazi","original_name":"Akin Gazi","popularity":1.644,"profile_path":"/c0syqzuQ8cD56VcnLhbew8cS3EX.jpg"},{"character":"Cline","credit_id":"52598add760ee34661b261e8","order":639,"adult":false,"gender":2,"id":570296,"known_for_department":"Acting","name":"Joe Dempsie","original_name":"Joe Dempsie","popularity":6.597,"profile_path":"/lnR0AMIwxQR6zUCOhp99GnMaRet.jpg"},{"character":"Jenny","credit_id":"52598add760ee34661b26216","order":655,"adult":false,"gender":1,"id":1219970,"known_for_department":"Acting","name":"Georgia Tennant","original_name":"Georgia Tennant","popularity":5.7,"profile_path":"/wVyPwNhA1QkKYTYY2zOiTWyF8XW.jpg"},{"character":"Cobb","credit_id":"52598add760ee34661b26244","order":677,"adult":false,"gender":2,"id":31431,"known_for_department":"Acting","name":"Nigel Terry","original_name":"Nigel Terry","popularity":3.099,"profile_path":"/gC8I37q7rjSVKXRaXhkcqA2IpVg.jpg"},{"character":"Hath Gable","credit_id":"52598ad6760ee34661b25ed7","order":688,"adult":false,"gender":0,"id":100086,"known_for_department":"Acting","name":"Ruari Mears","original_name":"Ruari Mears","popularity":1.271,"profile_path":null},{"character":"Hath Peck","credit_id":"61e9bcc7fdf8b70091311cd4","order":1585,"adult":false,"gender":2,"id":100085,"known_for_department":"Acting","name":"Paul Kasey","original_name":"Paul Kasey","popularity":2.029,"profile_path":"/f6P4xudwJVEtkzIYh8Ur23U44Sj.jpg"}]},{"air_date":"2008-05-17","episode_number":7,"id":941511,"name":"阿加莎·克里斯蒂之谜","overview":"20世纪20年代,博士来到了curbishleys家族庄园参加酒会,这时却发生了一连串的命案,看博士与阿加莎·克里斯蒂(英国著名女侦探小说家、剧作家,三大推理文学宗师之一)怎么破案。","production_code":"","runtime":null,"season_number":4,"show_id":57243,"still_path":"/i5hsME3OLt4hQOXBo9zg5Wc2WfL.jpg","vote_average":6.7,"vote_count":41,"crew":[{"job":"Writer","department":"Writing","credit_id":"52598abe760ee34661b24906","adult":false,"gender":2,"id":1214510,"known_for_department":"Writing","name":"Gareth Roberts","original_name":"Gareth Roberts","popularity":0.84,"profile_path":"/rbE4HD6ta6OLUuAukfr7E8YQrM5.jpg"},{"job":"Director","department":"Directing","credit_id":"52598ab8760ee34661b23b32","adult":false,"gender":0,"id":1213659,"known_for_department":"Directing","name":"Graeme Harper","original_name":"Graeme Harper","popularity":2.68,"profile_path":null}],"guest_stars":[{"character":"Professor Peach","credit_id":"52598add760ee34661b262cf","order":538,"adult":false,"gender":2,"id":1220106,"known_for_department":"Acting","name":"Ian Barritt","original_name":"Ian Barritt","popularity":1.207,"profile_path":null},{"character":"Agatha Christie","credit_id":"52598add760ee34661b2632b","order":597,"adult":false,"gender":1,"id":6973,"known_for_department":"Acting","name":"Fenella Woolgar","original_name":"Fenella Woolgar","popularity":6.877,"profile_path":"/hD9Z0A5nPQzp2YkfEKlvRNm9ytP.jpg"},{"character":"Greeves","credit_id":"52598add760ee34661b26359","order":615,"adult":false,"gender":2,"id":1225735,"known_for_department":"Acting","name":"David Quilter","original_name":"David Quilter","popularity":1.567,"profile_path":null},{"character":"Colonel Hugh","credit_id":"52598ade760ee34661b263b8","order":659,"adult":false,"gender":2,"id":94021,"known_for_department":"Acting","name":"Christopher Benjamin","original_name":"Christopher Benjamin","popularity":3.484,"profile_path":"/q5n2itp6aUHnGU4tBRSwVyL6ta7.jpg"},{"character":"Robina Redmond","credit_id":"52598ade760ee34661b263e6","order":672,"adult":false,"gender":1,"id":72855,"known_for_department":"Acting","name":"Felicity Jones","original_name":"Felicity Jones","popularity":21.528,"profile_path":"/35KdWSfTldNEdsn4MUGFIRoxJEu.jpg"},{"character":"Mrs Hart","credit_id":"52598ade760ee34661b26414","order":689,"adult":false,"gender":1,"id":1232861,"known_for_department":"Acting","name":"Charlotte Eaton","original_name":"Charlotte Eaton","popularity":1.111,"profile_path":null},{"character":"Reverend Golightly","credit_id":"52598ade760ee34661b26448","order":716,"adult":false,"gender":2,"id":43034,"known_for_department":"Acting","name":"Tom Goodman-Hill","original_name":"Tom Goodman-Hill","popularity":5.443,"profile_path":"/2rC1qhYmJiuk3iY15Ms7VLau6XD.jpg"},{"character":"Miss Chandrakala","credit_id":"52598ade760ee34661b26476","order":725,"adult":false,"gender":1,"id":1229291,"known_for_department":"Acting","name":"Leena Dhingra","original_name":"Leena Dhingra","popularity":1.22,"profile_path":"/bsNE9aWoP1Jgxxzy3xPoKd2Rvln.jpg"},{"character":"Davenport","credit_id":"52598ade760ee34661b264a4","order":731,"adult":false,"gender":0,"id":1250249,"known_for_department":"Acting","name":"Daniel King","original_name":"Daniel King","popularity":1.4,"profile_path":null},{"character":"Roger Curbishley","credit_id":"52598ade760ee34661b264d2","order":740,"adult":false,"gender":2,"id":144292,"known_for_department":"Acting","name":"Adam Rayner","original_name":"Adam Rayner","popularity":5.113,"profile_path":"/3BPfA65U7R0gKSEpLv69oNVb1Q8.jpg"},{"character":"Lady Eddison","credit_id":"5a83c930c3a36862e1004f63","order":1309,"adult":false,"gender":1,"id":200632,"known_for_department":"Acting","name":"Felicity Kendal","original_name":"Felicity Kendal","popularity":5.843,"profile_path":"/8TuwT4vka66qLlnoP08pbguepPV.jpg"}]},{"air_date":"2008-05-31","episode_number":8,"id":941512,"name":"噬命图书馆(1)","overview":"51世纪全宇宙最大的图书馆居然空无一人,就在博士意识到问题严重时felman lux公司探险队来到了图书馆,为的是发现一百年前图书馆发生了什么。考古学家River Song的队员和多娜却接连被神秘的影子吞噬。【与博士时间线相反的博士之妻River Song首次出场】","production_code":"","runtime":null,"season_number":4,"show_id":57243,"still_path":"/pA3KBOYK60cqJ6qkbeOBSSTUdGj.jpg","vote_average":8.8,"vote_count":50,"crew":[{"job":"Director","department":"Directing","credit_id":"52598aa6760ee34661b2274c","adult":false,"gender":2,"id":1216417,"known_for_department":"Directing","name":"Euros Lyn","original_name":"Euros Lyn","popularity":2.064,"profile_path":"/7EUPE3Umh3wsL0LkOMqmEqFPgDH.jpg"},{"job":"Writer","department":"Writing","credit_id":"52598ab0760ee34661b23049","adult":false,"gender":2,"id":146459,"known_for_department":"Writing","name":"Steven Moffat","original_name":"Steven Moffat","popularity":4.05,"profile_path":"/fjW3laJlDnHxQbuj9LLc6EYEDy.jpg"}],"guest_stars":[{"character":"Strackman Lux","credit_id":"52598ade760ee34661b26523","order":535,"adult":false,"gender":2,"id":28485,"known_for_department":"Acting","name":"Steve Pemberton","original_name":"Steve Pemberton","popularity":5.027,"profile_path":"/j4AFPsF6DM9nfccol3VFQgPJ6Ia.jpg"},{"character":"Gantok","credit_id":"52598abe760ee34661b24b13","order":558,"adult":false,"gender":2,"id":34546,"known_for_department":"Acting","name":"Mark Gatiss","original_name":"Mark Gatiss","popularity":11.026,"profile_path":"/rdinP6RQwKBab7BawJDBzF1I7Qz.jpg"},{"character":"Dr Moon","credit_id":"52598adf760ee34661b26551","order":563,"adult":false,"gender":2,"id":5414,"known_for_department":"Acting","name":"Colin Salmon","original_name":"Colin Salmon","popularity":11.458,"profile_path":"/mLlAU6Zl2MIL5znp5UHdX3sVTN7.jpg"},{"character":"Miss Evangelista","credit_id":"52598adf760ee34661b2657f","order":586,"adult":false,"gender":1,"id":66441,"known_for_department":"Acting","name":"Talulah Riley","original_name":"Talulah Riley","popularity":16.687,"profile_path":"/wIfzSnKvvREEi8lJ6cbuX04HiNG.jpg"},{"character":"Anita","credit_id":"52598ae0760ee34661b265e4","order":661,"adult":false,"gender":0,"id":1261094,"known_for_department":"Acting","name":"Jessika Williams","original_name":"Jessika Williams","popularity":0.84,"profile_path":null},{"character":"The Girl","credit_id":"52598ae2760ee34661b26615","order":678,"adult":false,"gender":0,"id":1261095,"known_for_department":"Acting","name":"Eve Newton","original_name":"Eve Newton","popularity":1.62,"profile_path":null},{"character":"Node 1","credit_id":"52598ae2760ee34661b26643","order":692,"adult":false,"gender":1,"id":65447,"known_for_department":"Acting","name":"Sarah Niles","original_name":"Sarah Niles","popularity":5.201,"profile_path":"/ySelhnmCCX9VnlPvceO9c5XOelK.jpg"},{"character":"Node 2","credit_id":"52598ae3760ee34661b26674","order":712,"adult":false,"gender":2,"id":77880,"known_for_department":"Acting","name":"Josh Dallas","original_name":"Josh Dallas","popularity":12.6,"profile_path":"/f9cjzUtgasJTZgpdqFIREhUUxbQ.jpg"},{"character":"Proper Dave","credit_id":"52598ae3760ee34661b266a2","order":718,"adult":false,"gender":2,"id":157753,"known_for_department":"Acting","name":"Harry Peacock","original_name":"Harry Peacock","popularity":1.87,"profile_path":"/jjCPCCOGQrEZnRLh5SCOBneMqy2.jpg"},{"character":"Other Dave","credit_id":"52598ae3760ee34661b266d0","order":726,"adult":false,"gender":2,"id":113970,"known_for_department":"Acting","name":"O.T. Fagbenle","original_name":"O.T. Fagbenle","popularity":4.036,"profile_path":"/baIiZBDYpYXfG4SlonbcqyYg6l.jpg"},{"character":"Dad","credit_id":"52598ae3760ee34661b26704","order":743,"adult":false,"gender":2,"id":211738,"known_for_department":"Acting","name":"Mark Dexter","original_name":"Mark Dexter","popularity":2.697,"profile_path":"/KP6Lqz1W8lPx0jNQXe9lY8NclM.jpg"},{"character":"Professor River Song","credit_id":"61e9be4e9c97bd00b6a29b2a","order":1587,"adult":false,"gender":1,"id":83701,"known_for_department":"Acting","name":"Alex Kingston","original_name":"Alex Kingston","popularity":9.473,"profile_path":"/ql1s3xla8hkYQl3dQNjENes9WHM.jpg"}]},{"air_date":"2008-06-07","episode_number":9,"id":941513,"name":"死亡森林(2)","overview":"接上集,多娜在图书馆里消失了,却出现在另一个地方,而一个叫moon的医生为她编制了另一个故事,而这一切只是电脑为了保护人类不被vashta narada所吸食而存储的数据。最后一百年前被困的人类还原后离开了,记录在音速起子里的River到电脑里和队员一起生活。【博士第一次遇到River Song】","production_code":"","runtime":null,"season_number":4,"show_id":57243,"still_path":"/xAW7SCNkOsfyCLFZiGmeanSaR8L.jpg","vote_average":9.0,"vote_count":50,"crew":[{"job":"Director","department":"Directing","credit_id":"52598aa6760ee34661b2274c","adult":false,"gender":2,"id":1216417,"known_for_department":"Directing","name":"Euros Lyn","original_name":"Euros Lyn","popularity":2.064,"profile_path":"/7EUPE3Umh3wsL0LkOMqmEqFPgDH.jpg"},{"job":"Writer","department":"Writing","credit_id":"52598ab0760ee34661b23049","adult":false,"gender":2,"id":146459,"known_for_department":"Writing","name":"Steven Moffat","original_name":"Steven Moffat","popularity":4.05,"profile_path":"/fjW3laJlDnHxQbuj9LLc6EYEDy.jpg"}],"guest_stars":[{"character":"Strackman Lux","credit_id":"52598ade760ee34661b26523","order":535,"adult":false,"gender":2,"id":28485,"known_for_department":"Acting","name":"Steve Pemberton","original_name":"Steve Pemberton","popularity":5.027,"profile_path":"/j4AFPsF6DM9nfccol3VFQgPJ6Ia.jpg"},{"character":"Dr Moon","credit_id":"52598adf760ee34661b26551","order":563,"adult":false,"gender":2,"id":5414,"known_for_department":"Acting","name":"Colin Salmon","original_name":"Colin Salmon","popularity":11.458,"profile_path":"/mLlAU6Zl2MIL5znp5UHdX3sVTN7.jpg"},{"character":"Miss Evangelista","credit_id":"52598adf760ee34661b2657f","order":586,"adult":false,"gender":1,"id":66441,"known_for_department":"Acting","name":"Talulah Riley","original_name":"Talulah Riley","popularity":16.687,"profile_path":"/wIfzSnKvvREEi8lJ6cbuX04HiNG.jpg"},{"character":"Joshua","credit_id":"52598ae5760ee34661b2678f","order":603,"adult":false,"gender":0,"id":1261098,"known_for_department":"Acting","name":"Alex Midwood","original_name":"Alex Midwood","popularity":0.84,"profile_path":null},{"character":"Ella","credit_id":"52598ae7760ee34661b267c6","order":646,"adult":false,"gender":0,"id":1261099,"known_for_department":"Acting","name":"Eloise Rakic-Platt","original_name":"Eloise Rakic-Platt","popularity":1.4,"profile_path":null},{"character":"Anita","credit_id":"52598ae0760ee34661b265e4","order":661,"adult":false,"gender":0,"id":1261094,"known_for_department":"Acting","name":"Jessika Williams","original_name":"Jessika Williams","popularity":0.84,"profile_path":null},{"character":"Lee","credit_id":"52598ae7760ee34661b267fa","order":670,"adult":false,"gender":0,"id":1215327,"known_for_department":"Acting","name":"Jason Pitt","original_name":"Jason Pitt","popularity":0.828,"profile_path":null},{"character":"The Girl","credit_id":"52598ae2760ee34661b26615","order":678,"adult":false,"gender":0,"id":1261095,"known_for_department":"Acting","name":"Eve Newton","original_name":"Eve Newton","popularity":1.62,"profile_path":null},{"character":"Proper Dave","credit_id":"52598ae3760ee34661b266a2","order":718,"adult":false,"gender":2,"id":157753,"known_for_department":"Acting","name":"Harry Peacock","original_name":"Harry Peacock","popularity":1.87,"profile_path":"/jjCPCCOGQrEZnRLh5SCOBneMqy2.jpg"},{"character":"Other Dave","credit_id":"52598ae3760ee34661b266d0","order":726,"adult":false,"gender":2,"id":113970,"known_for_department":"Acting","name":"O.T. Fagbenle","original_name":"O.T. Fagbenle","popularity":4.036,"profile_path":"/baIiZBDYpYXfG4SlonbcqyYg6l.jpg"},{"character":"Man","credit_id":"52598ae8760ee34661b26843","order":733,"adult":false,"gender":0,"id":1261100,"known_for_department":"Acting","name":"Jonathan Reuben","original_name":"Jonathan Reuben","popularity":0.6,"profile_path":null},{"character":"Dad","credit_id":"52598ae3760ee34661b26704","order":743,"adult":false,"gender":2,"id":211738,"known_for_department":"Acting","name":"Mark Dexter","original_name":"Mark Dexter","popularity":2.697,"profile_path":"/KP6Lqz1W8lPx0jNQXe9lY8NclM.jpg"},{"character":"Professor River Song","credit_id":"61e9be4e9c97bd00b6a29b2a","order":1587,"adult":false,"gender":1,"id":83701,"known_for_department":"Acting","name":"Alex Kingston","original_name":"Alex Kingston","popularity":9.473,"profile_path":"/ql1s3xla8hkYQl3dQNjENes9WHM.jpg"}]},{"air_date":"2008-06-14","episode_number":10,"id":941514,"name":"午夜回声","overview":"在午夜星上到处都是钻石,可是行星却围绕着放射星球运转,在奇妙的旅程中博士遇到了一种全新的生命,他生活在这个存满放射线的星球,偷窃别人的语言,这一集,博士见识了什么是人性…","production_code":"","runtime":null,"season_number":4,"show_id":57243,"still_path":"/kPxhdqzj8vuhh36QfDLbENbgPVb.jpg","vote_average":8.3,"vote_count":47,"crew":[{"department":"Directing","job":"Director","credit_id":"52598add760ee34661b2628e","adult":false,"gender":1,"id":1214518,"known_for_department":"Directing","name":"Alice Troughton","original_name":"Alice Troughton","popularity":1.4,"profile_path":"/1dRPhg2YIk1rw8j2asQJOJJLzUJ.jpg"},{"job":"Writer","department":"Writing","credit_id":"52598aa4760ee34661b22580","adult":false,"gender":2,"id":95894,"known_for_department":"Writing","name":"Russell T Davies","original_name":"Russell T Davies","popularity":1.815,"profile_path":"/rDDLhm0Sw7JUqIf7CVkFbu06IEp.jpg"}],"guest_stars":[{"character":"Driver Joe","credit_id":"52598ae8760ee34661b268b8","order":546,"adult":false,"gender":2,"id":1218934,"known_for_department":"Acting","name":"Tony Bluto","original_name":"Tony Bluto","popularity":2.086,"profile_path":null},{"character":"Biff Cane","credit_id":"52598ae8760ee34661b268e6","order":575,"adult":false,"gender":2,"id":1221066,"known_for_department":"Acting","name":"Daniel Ryan","original_name":"Daniel Ryan","popularity":4.171,"profile_path":"/hBi6cMtlc4FXfCSfDvU68U70bwj.jpg"},{"character":"Jethro Cane","credit_id":"52598ae8760ee34661b26914","order":608,"adult":false,"gender":2,"id":228866,"known_for_department":"Acting","name":"Colin Morgan","original_name":"Colin Morgan","popularity":13.51,"profile_path":"/jeSLhhfUIZR3UQGGhtYTk0J2I5.jpg"},{"character":"Dee Dee Blasco","credit_id":"52598ae8760ee34661b26942","order":631,"adult":false,"gender":0,"id":1087563,"known_for_department":"Acting","name":"Ayesha Antoine","original_name":"Ayesha Antoine","popularity":1.4,"profile_path":null},{"character":"Professer Hobbes","credit_id":"52598ae8760ee34661b26970","order":647,"adult":false,"gender":0,"id":78427,"known_for_department":"Acting","name":"David Troughton","original_name":"David Troughton","popularity":2.828,"profile_path":"/lTotI39TNwteqMvXa4Tqm6mRTzP.jpg"},{"character":"Sky Silvestry","credit_id":"52598ae8760ee34661b2699e","order":668,"adult":false,"gender":1,"id":80366,"known_for_department":"Acting","name":"Lesley Sharp","original_name":"Lesley Sharp","popularity":11.492,"profile_path":"/pHlm4q7iIkuOQSyJNwK8WKWHacH.jpg"},{"character":"Mechanic Claude","credit_id":"52598ae8760ee34661b269cc","order":680,"adult":false,"gender":2,"id":1240417,"known_for_department":"Acting","name":"Duane Henry","original_name":"Duane Henry","popularity":3.06,"profile_path":"/mnYq3tMHrn5vnWFyMTVS2L5NrpU.jpg"},{"character":"Hostess","credit_id":"52598ae9760ee34661b269fa","order":699,"adult":false,"gender":1,"id":195575,"known_for_department":"Acting","name":"Rakie Ayola","original_name":"Rakie Ayola","popularity":3.481,"profile_path":"/oaLs5ACdurV2lij6GEidn0fSrUq.jpg"},{"character":"Val Cane","credit_id":"52598ae9760ee34661b26a28","order":709,"adult":false,"gender":1,"id":174760,"known_for_department":"Acting","name":"Lindsey Coulson","original_name":"Lindsey Coulson","popularity":4.195,"profile_path":"/2CYWXQ5G3ew7fGDm1QJHASPbqZm.jpg"}]},{"air_date":"2008-06-21","episode_number":11,"id":941515,"name":"左转","overview":"这集中多娜被巫师控制,试着想若向右走,没有进公司工作,没有认识她那该死的未婚夫,没有遇到博士,那么世界将会是什么样子?结果是在大战中,博士死了,一切都陷入了混乱。罗斯出现,指导多娜回到过去,强制选择向左走。结果多娜摆脱了控制,宇宙中出现了大量“恶狼”字样。(为第一季中罗斯所留,宇宙毁灭的前兆)","production_code":"4.11","runtime":null,"season_number":4,"show_id":57243,"still_path":"/etMTaIloNsHhSqDkqV66tLnJ8Z0.jpg","vote_average":8.0,"vote_count":43,"crew":[{"job":"Writer","department":"Writing","credit_id":"52598aa4760ee34661b22580","adult":false,"gender":2,"id":95894,"known_for_department":"Writing","name":"Russell T Davies","original_name":"Russell T Davies","popularity":1.815,"profile_path":"/rDDLhm0Sw7JUqIf7CVkFbu06IEp.jpg"},{"job":"Director","department":"Directing","credit_id":"52598ab8760ee34661b23b32","adult":false,"gender":0,"id":1213659,"known_for_department":"Directing","name":"Graeme Harper","original_name":"Graeme Harper","popularity":2.68,"profile_path":null},{"job":"Executive Producer","department":"Production","credit_id":"55d24924925141180a000389","adult":false,"gender":2,"id":95894,"known_for_department":"Writing","name":"Russell T Davies","original_name":"Russell T Davies","popularity":1.815,"profile_path":"/rDDLhm0Sw7JUqIf7CVkFbu06IEp.jpg"},{"job":"Executive Producer","department":"Production","credit_id":"568c3dea92514113340259c0","adult":false,"gender":0,"id":1213443,"known_for_department":"Production","name":"Julie Gardner","original_name":"Julie Gardner","popularity":2.376,"profile_path":null},{"job":"Producer","department":"Production","credit_id":"568c540f9251410ffb00419d","adult":false,"gender":0,"id":1213456,"known_for_department":"Production","name":"Susie Liggat","original_name":"Susie Liggat","popularity":1.96,"profile_path":null},{"job":"Script Editor","department":"Writing","credit_id":"61e968ada0b6b500a7510fbe","adult":false,"gender":0,"id":1376878,"known_for_department":"Production","name":"Brian Minchin","original_name":"Brian Minchin","popularity":0.828,"profile_path":null},{"job":"Executive Producer","department":"Production","credit_id":"61e968eeb513a800bc011064","adult":false,"gender":2,"id":1213445,"known_for_department":"Production","name":"Phil Collinson","original_name":"Phil Collinson","popularity":1.583,"profile_path":null},{"job":"Compositor","department":"Crew","credit_id":"61e96907df294500686ed45c","adult":false,"gender":2,"id":47203,"known_for_department":"Sound","name":"Murray Gold","original_name":"Murray Gold","popularity":1.62,"profile_path":"/ih1ELPTC9QMDbK2KxskidkRqMFM.jpg"}],"guest_stars":[{"character":"Rose Tyler","credit_id":"5276b22a760ee35a9a263838","order":18,"adult":false,"gender":1,"id":26076,"known_for_department":"Acting","name":"Billie Piper","original_name":"Billie Piper","popularity":9.945,"profile_path":"/gBduwAWEZ1bwuL6f7cjMzBvKlJz.jpg"},{"character":"Fortune Teller","credit_id":"5403c86ac3a3685b74001372","order":793,"adult":false,"gender":1,"id":59151,"known_for_department":"Acting","name":"Chipo Chung","original_name":"Chipo Chung","popularity":3.979,"profile_path":"/rlV6XFgDSXwOttkqza1LeWvBpkz.jpg"},{"character":"Rocco Colasanto","credit_id":"5403c882c3a3684366005b7d","order":795,"adult":false,"gender":2,"id":27649,"known_for_department":"Acting","name":"Joseph Long","original_name":"Joseph Long","popularity":7.15,"profile_path":"/kIh1s4CVXqcPb57ya3AMY2v1zxc.jpg"},{"character":"Captain Magambo","credit_id":"5403c899c3a368068c0059ce","order":796,"adult":false,"gender":1,"id":517103,"known_for_department":"Acting","name":"Noma Dumezweni","original_name":"Noma Dumezweni","popularity":5.085,"profile_path":"/1k4dg4i4AS3r1NwWBazvZrvnfUf.jpg"},{"character":"Jival Chowdry","credit_id":"5403c8dac3a3684366005b82","order":799,"adult":false,"gender":2,"id":119792,"known_for_department":"Acting","name":"Bhasker Patel","original_name":"Bhasker Patel","popularity":4.24,"profile_path":"/1OyDAhaJ5cmwRy5igRdeRtH3OUY.jpg"},{"character":"Wilfred Mott","credit_id":"5403c798c3a3684366005b58","order":1486,"adult":false,"gender":2,"id":40943,"known_for_department":"Acting","name":"Bernard Cribbins","original_name":"Bernard Cribbins","popularity":7.108,"profile_path":"/lLdaHLskigTNayxy4Tbrt7EKly2.jpg"},{"character":"Mooky Kahari","credit_id":"61e964fecd2046004442544b","order":1567,"adult":false,"gender":1,"id":1261102,"known_for_department":"Acting","name":"Marcia Lecky","original_name":"Marcia Lecky","popularity":0.6,"profile_path":"/vbLVtA8piDyC7liFkR8x3kPhmTh.jpg"},{"character":"Veena Brady","credit_id":"61e9651edf2945001b859697","order":1568,"adult":false,"gender":0,"id":1326088,"known_for_department":"Acting","name":"Suzann McLean","original_name":"Suzann McLean","popularity":0.828,"profile_path":null},{"character":"Alice Coltrane","credit_id":"61e96541fdf8b700f54f5a9a","order":1569,"adult":false,"gender":1,"id":1230770,"known_for_department":"Acting","name":"Natalie Walter","original_name":"Natalie Walter","popularity":2.188,"profile_path":"/bI0bdQaYt9yAJSIQGKyLDWS2ftq.jpg"},{"character":"Man in Pub","credit_id":"61e9655bfea0d700d0374b15","order":1570,"adult":false,"gender":0,"id":1261106,"known_for_department":"Acting","name":"Neil Clench","original_name":"Neil Clench","popularity":0.6,"profile_path":null},{"character":"Female Reporter","credit_id":"61e96587d75bd6006a64c6bd","order":1571,"adult":false,"gender":0,"id":1261103,"known_for_department":"Acting","name":"Catherine York","original_name":"Catherine York","popularity":0.98,"profile_path":null},{"character":"Spanish Maid","credit_id":"61e965c4b513a8004404bf6c","order":1572,"adult":false,"gender":1,"id":1261105,"known_for_department":"Acting","name":"Lorraine Velez","original_name":"Lorraine Velez","popularity":0.6,"profile_path":null},{"character":"Studio News Reader","credit_id":"61e965e7fdf8b7001b856b06","order":1573,"adult":false,"gender":2,"id":1230427,"known_for_department":"Acting","name":"Jason Mohammad","original_name":"Jason Mohammad","popularity":1.96,"profile_path":"/o1TRSxoJhO1TeFrm9ZopWkJgmnh.jpg"},{"character":"Housing Officer","credit_id":"61e96606a0b6b500747a9e7e","order":1574,"adult":false,"gender":0,"id":2586937,"known_for_department":"Acting","name":"Sanchia McCormack","original_name":"Sanchia McCormack","popularity":1.614,"profile_path":null},{"character":"Soldier #1","credit_id":"61e96631d75bd6001cf53aec","order":1575,"adult":false,"gender":0,"id":3390618,"known_for_department":"Acting","name":"Lawrence Stevenson","original_name":"Lawrence Stevenson","popularity":0.6,"profile_path":null},{"character":"Woman in Doorway","credit_id":"61e96657a9117f00e841dc4a","order":1576,"adult":false,"gender":0,"id":1261101,"known_for_department":"Acting","name":"Terri-Ann Brumby","original_name":"Terri-Ann Brumby","popularity":0.6,"profile_path":null},{"character":"Soldier #2","credit_id":"61e96698fdf8b7001b856be1","order":1577,"adult":false,"gender":0,"id":3390619,"known_for_department":"Acting","name":"Paul Richard Biggin","original_name":"Paul Richard Biggin","popularity":0.6,"profile_path":null},{"character":"Private Harris","credit_id":"5403c811c3a3684366005b64","order":1579,"adult":false,"gender":2,"id":85977,"known_for_department":"Acting","name":"Clive Standen","original_name":"Clive Standen","popularity":8.532,"profile_path":"/8cxLoC2qnzk0FvuLFLRGxYSq9i9.jpg"},{"character":"Oliver Morgenstern","credit_id":"61e96964aa659e004471fe5b","order":1755,"adult":false,"gender":0,"id":58783,"known_for_department":"Acting","name":"Ben Righton","original_name":"Ben Righton","popularity":1.343,"profile_path":"/kPWaa4fhrWtrgY3tpDDoP3zOhW0.jpg"},{"character":"Trinity Wells","credit_id":"61e9de193faba00096079a0b","order":1857,"adult":false,"gender":1,"id":59088,"known_for_department":"Acting","name":"Lachele Carl","original_name":"Lachele Carl","popularity":1.96,"profile_path":"/me1nkBO717RiYUeoHQht0VFNoYv.jpg"},{"character":"Sylvia Noble","credit_id":"5403c7adc3a3684363005864","order":1866,"adult":false,"gender":1,"id":1230422,"known_for_department":"Acting","name":"Jacqueline King","original_name":"Jacqueline King","popularity":2.397,"profile_path":"/7vsacSnnE9vUXc2BZR6y0ISrl6a.jpg"}]},{"air_date":"2008-06-28","episode_number":12,"id":941516,"name":"失窃的地球(1)","overview":"博士匆忙回到地球,一切正常,然而当博士进一步侦查时,怪事出现了,塔迪斯留在原地,而地球却不见了……于此同时,地球上的人类发现天空飘满了星球和宇宙飞船。博士来到影子联盟(银河系警察总局),查询到共有27颗星球丢失。由于地球被放在了美杜莎时空瀑布中,博士找不到地球。在危机关头火炬木、莎拉简等人的努力下将博士拉到了地球同步时空中。刚出塔迪斯的博士,看到了罗斯,但随后被戴立克击中,被迫重生。【博士第11次重生】","production_code":"","runtime":null,"season_number":4,"show_id":57243,"still_path":"/AsL6ph9Ouk7zSp4OlHB8Vx06v4V.jpg","vote_average":8.0,"vote_count":41,"crew":[{"job":"Writer","department":"Writing","credit_id":"52598aa4760ee34661b22580","adult":false,"gender":2,"id":95894,"known_for_department":"Writing","name":"Russell T Davies","original_name":"Russell T Davies","popularity":1.815,"profile_path":"/rDDLhm0Sw7JUqIf7CVkFbu06IEp.jpg"},{"job":"Director","department":"Directing","credit_id":"52598ab8760ee34661b23b32","adult":false,"gender":0,"id":1213659,"known_for_department":"Directing","name":"Graeme Harper","original_name":"Graeme Harper","popularity":2.68,"profile_path":null}],"guest_stars":[{"character":"Rose Tyler","credit_id":"5276b22a760ee35a9a263838","order":18,"adult":false,"gender":1,"id":26076,"known_for_department":"Acting","name":"Billie Piper","original_name":"Billie Piper","popularity":9.945,"profile_path":"/gBduwAWEZ1bwuL6f7cjMzBvKlJz.jpg"},{"character":"Martha Jones","credit_id":"527f9b2419c29514f5090d76","order":19,"adult":false,"gender":1,"id":1182929,"known_for_department":"Acting","name":"Freema Agyeman","original_name":"Freema Agyeman","popularity":14.495,"profile_path":"/qL741lSB4GJIzBRCMz2xzrO7C45.jpg"},{"character":"Sarah Jane Smith","credit_id":"52598ab4760ee34661b2375a","order":531,"adult":false,"gender":1,"id":207067,"known_for_department":"Acting","name":"Elisabeth Sladen","original_name":"Elisabeth Sladen","popularity":3.776,"profile_path":"/eEJWya2Kwha58GaS4iOUHFvZkEm.jpg"},{"character":"General Sanchez","credit_id":"52598af2760ee34661b26d9b","order":572,"adult":false,"gender":2,"id":131814,"known_for_department":"Acting","name":"Michael Brandon","original_name":"Michael Brandon","popularity":4.337,"profile_path":"/6rtmcXfrw6z57kkiLFGFCAJBLl3.jpg"},{"character":"Mr Smith (voice)","credit_id":"52598af2760ee34661b26dc9","order":589,"adult":false,"gender":2,"id":1250,"known_for_department":"Acting","name":"Alexander Armstrong","original_name":"Alexander Armstrong","popularity":4.487,"profile_path":"/e0kvGIfrjah4UmbUdKKobTgcxEd.jpg"},{"character":"Nestene (voice)","credit_id":"52598aa3760ee34661b22522","order":662,"adult":false,"gender":2,"id":1193572,"known_for_department":"Acting","name":"Nicholas Briggs","original_name":"Nicholas Briggs","popularity":2.784,"profile_path":"/7QUxZVfw8WqUSxPVHrhmRtXGFUl.jpg"},{"character":"Scared Man","credit_id":"52598af3760ee34661b26e1e","order":722,"adult":false,"gender":2,"id":1261108,"known_for_department":"Acting","name":"Gary Milner","original_name":"Gary Milner","popularity":2.104,"profile_path":"/2xnzWDxkFyPYCTkjlDpO4T814QJ.jpg"},{"character":"Albino Servant","credit_id":"52598af3760ee34661b26e52","order":734,"adult":false,"gender":1,"id":137411,"known_for_department":"Acting","name":"Amy Beth Hayes","original_name":"Amy Beth Hayes","popularity":1.96,"profile_path":"/qLc2768NjxcRUNRuTomiVAgi35S.jpg"},{"character":"Luke Smith","credit_id":"52598af4760ee34661b26eb4","order":749,"adult":false,"gender":2,"id":446476,"known_for_department":"Acting","name":"Tommy Knight","original_name":"Tommy Knight","popularity":6.776,"profile_path":"/jRlbL9XGHAxIgfOHe8xnwrdzEaY.jpg"},{"character":"Suzanne","credit_id":"52598af5760ee34661b26eeb","order":750,"adult":false,"gender":0,"id":1261109,"known_for_department":"Acting","name":"Andrea Harris","original_name":"Andrea Harris","popularity":1.306,"profile_path":null},{"character":"Drunk Man","credit_id":"52598af6760ee34661b26f1c","order":753,"adult":false,"gender":0,"id":1261110,"known_for_department":"Acting","name":"Marcus Cunningham","original_name":"Marcus Cunningham","popularity":0.728,"profile_path":null},{"character":"Newsreader","credit_id":"52598af2760ee34661b26d38","order":754,"adult":false,"gender":2,"id":1230427,"known_for_department":"Acting","name":"Jason Mohammad","original_name":"Jason Mohammad","popularity":1.96,"profile_path":"/o1TRSxoJhO1TeFrm9ZopWkJgmnh.jpg"},{"character":"Paul O'Grady","credit_id":"52598af6760ee34661b26fbe","order":755,"adult":false,"gender":2,"id":175578,"known_for_department":"Acting","name":"Paul O'Grady","original_name":"Paul O'Grady","popularity":2.252,"profile_path":"/iSHGbr01Fd8OT7NfDnHvBqsu4xN.jpg"},{"character":"Richard Dawkins","credit_id":"52598af6760ee34661b26fec","order":756,"adult":false,"gender":2,"id":74093,"known_for_department":"Acting","name":"Richard Dawkins","original_name":"Richard Dawkins","popularity":1.96,"profile_path":"/eHM9PMTDmdtwsfjFVC8S0ugd7rn.jpg"},{"character":"Gwen Cooper","credit_id":"568d5e379251416b4700007e","order":1084,"adult":false,"gender":1,"id":119908,"known_for_department":"Acting","name":"Eve Myles","original_name":"Eve Myles","popularity":6.008,"profile_path":"/5NipnvM12zbDjIbZf3tzLfQu4bf.jpg"},{"character":"Shadow Architect","credit_id":"56d9fe54925141429100b3f2","order":1143,"adult":false,"gender":1,"id":192940,"known_for_department":"Acting","name":"Kelly Hunter","original_name":"Kelly Hunter","popularity":2.765,"profile_path":"/mxHkBA31UbinH6iCDAbHrNVtF1k.jpg"},{"character":"Ianto Jones","credit_id":"595cab5f9251410a5906c414","order":1318,"adult":false,"gender":2,"id":110875,"known_for_department":"Acting","name":"Gareth David-Lloyd","original_name":"Gareth David-Lloyd","popularity":5.142,"profile_path":"/am5qnHQBGpRBWZ2l1DzlBFUY9xm.jpg"},{"character":"Wilfred Mott","credit_id":"5403c798c3a3684366005b58","order":1486,"adult":false,"gender":2,"id":40943,"known_for_department":"Acting","name":"Bernard Cribbins","original_name":"Bernard Cribbins","popularity":7.108,"profile_path":"/lLdaHLskigTNayxy4Tbrt7EKly2.jpg"},{"character":"Davros","credit_id":"52598af6760ee34661b26f7e","order":1562,"adult":false,"gender":2,"id":30086,"known_for_department":"Acting","name":"Julian Bleach","original_name":"Julian Bleach","popularity":4.421,"profile_path":"/bLgrVbB17jYhqwu9OYHWZdcQueA.jpg"},{"character":"Harriet Jones","credit_id":"528bcdb5760ee3014f1a3c27","order":1563,"adult":false,"gender":1,"id":1249,"known_for_department":"Acting","name":"Penelope Wilton","original_name":"Penelope Wilton","popularity":11.802,"profile_path":"/7sXOk96XiaeqI5ARr8tnBQHQGCf.jpg"},{"character":"Francine Jones","credit_id":"583426c4925141691b002700","order":1646,"adult":false,"gender":1,"id":109651,"known_for_department":"Acting","name":"Adjoa Andoh","original_name":"Adjoa Andoh","popularity":4.942,"profile_path":"/7bjdkwsEZi2An4kIiPw4R4yZTpK.jpg"},{"character":"Judoon","credit_id":"61e96236fdf8b70091308778","order":1708,"adult":false,"gender":2,"id":100085,"known_for_department":"Acting","name":"Paul Kasey","original_name":"Paul Kasey","popularity":2.029,"profile_path":"/f6P4xudwJVEtkzIYh8Ur23U44Sj.jpg"},{"character":"Trinity Wells","credit_id":"61e9de193faba00096079a0b","order":1857,"adult":false,"gender":1,"id":59088,"known_for_department":"Acting","name":"Lachele Carl","original_name":"Lachele Carl","popularity":1.96,"profile_path":"/me1nkBO717RiYUeoHQht0VFNoYv.jpg"},{"character":"Captain Jack Harkness","credit_id":"569abed2c3a36872cb000c8f","order":1865,"adult":false,"gender":2,"id":182287,"known_for_department":"Acting","name":"John Barrowman","original_name":"John Barrowman","popularity":8.559,"profile_path":"/kDx4ynZwEUtBgomulnCEO9mLobU.jpg"},{"character":"Sylvia Noble","credit_id":"5403c7adc3a3684363005864","order":1866,"adult":false,"gender":1,"id":1230422,"known_for_department":"Acting","name":"Jacqueline King","original_name":"Jacqueline King","popularity":2.397,"profile_path":"/7vsacSnnE9vUXc2BZR6y0ISrl6a.jpg"}]},{"air_date":"2008-07-05","episode_number":13,"id":941517,"name":"旅程终点(2)","overview":"接上集,博士身受重伤,被迫重生,但在重生时博士利用了圣诞节被砍下的手(详见2005年圣诞特别篇和S3E11)重生并保持了原样。就在这时躲在塔迪斯中的多娜在博士之手的召唤下触碰它,砍下的手又重新长出一个博士,多娜也拥有了半个时间领主的力量…罗斯和她的母亲以及新生的人类博士被送到恶狼湾,博士称担心他的分身会被报复,希望罗斯能照顾他,并对她说他就是我。多娜希望留在博士身边却因无法处理博士那庞大数据和记忆,被博士清除记忆后送回家过正常人的生活……","production_code":"","runtime":null,"season_number":4,"show_id":57243,"still_path":"/di3ZK4886uAdvhgfjD0IB9Gwcr6.jpg","vote_average":8.0,"vote_count":46,"crew":[{"job":"Writer","department":"Writing","credit_id":"52598aa4760ee34661b22580","adult":false,"gender":2,"id":95894,"known_for_department":"Writing","name":"Russell T Davies","original_name":"Russell T Davies","popularity":1.815,"profile_path":"/rDDLhm0Sw7JUqIf7CVkFbu06IEp.jpg"},{"job":"Director","department":"Directing","credit_id":"52598ab8760ee34661b23b32","adult":false,"gender":0,"id":1213659,"known_for_department":"Directing","name":"Graeme Harper","original_name":"Graeme Harper","popularity":2.68,"profile_path":null}],"guest_stars":[{"character":"Rose Tyler","credit_id":"5276b22a760ee35a9a263838","order":18,"adult":false,"gender":1,"id":26076,"known_for_department":"Acting","name":"Billie Piper","original_name":"Billie Piper","popularity":9.945,"profile_path":"/gBduwAWEZ1bwuL6f7cjMzBvKlJz.jpg"},{"character":"Martha Jones","credit_id":"527f9b2419c29514f5090d76","order":19,"adult":false,"gender":1,"id":1182929,"known_for_department":"Acting","name":"Freema Agyeman","original_name":"Freema Agyeman","popularity":14.495,"profile_path":"/qL741lSB4GJIzBRCMz2xzrO7C45.jpg"},{"character":"Sarah Jane Smith","credit_id":"52598ab4760ee34661b2375a","order":531,"adult":false,"gender":1,"id":207067,"known_for_department":"Acting","name":"Elisabeth Sladen","original_name":"Elisabeth Sladen","popularity":3.776,"profile_path":"/eEJWya2Kwha58GaS4iOUHFvZkEm.jpg"},{"character":"Mr Smith (voice)","credit_id":"52598af2760ee34661b26dc9","order":589,"adult":false,"gender":2,"id":1250,"known_for_department":"Acting","name":"Alexander Armstrong","original_name":"Alexander Armstrong","popularity":4.487,"profile_path":"/e0kvGIfrjah4UmbUdKKobTgcxEd.jpg"},{"character":"Anna Zhou","credit_id":"52598af7760ee34661b27064","order":619,"adult":false,"gender":1,"id":207723,"known_for_department":"Acting","name":"Elizabeth Tan","original_name":"Elizabeth Tan","popularity":3.636,"profile_path":"/tHrduQAmTOo8U00v4Y5SbKPBaRP.jpg"},{"character":"German Woman","credit_id":"52598af8760ee34661b2709b","order":660,"adult":false,"gender":1,"id":1261112,"known_for_department":"Acting","name":"Valda Aviks","original_name":"Valda Aviks","popularity":1.22,"profile_path":"/776DtrUnBvssyhhjkDgpVtKlLI5.jpg"},{"character":"Scared Woman","credit_id":"52598af9760ee34661b270c9","order":676,"adult":false,"gender":1,"id":62230,"known_for_department":"Acting","name":"Shobu Kapoor","original_name":"Shobu Kapoor","popularity":2.215,"profile_path":"/xYw04alDmANRMeSw9Xi7wt5HQwm.jpg"},{"character":"Liberian Man","credit_id":"52598afa760ee34661b2711e","order":746,"adult":false,"gender":0,"id":1261113,"known_for_department":"Acting","name":"Michael Price","original_name":"Michael Price","popularity":0.6,"profile_path":null},{"character":"Luke Smith","credit_id":"52598af4760ee34661b26eb4","order":749,"adult":false,"gender":2,"id":446476,"known_for_department":"Acting","name":"Tommy Knight","original_name":"Tommy Knight","popularity":6.776,"profile_path":"/jRlbL9XGHAxIgfOHe8xnwrdzEaY.jpg"},{"character":"Gwen Cooper","credit_id":"568d5e379251416b4700007e","order":1084,"adult":false,"gender":1,"id":119908,"known_for_department":"Acting","name":"Eve Myles","original_name":"Eve Myles","popularity":6.008,"profile_path":"/5NipnvM12zbDjIbZf3tzLfQu4bf.jpg"},{"character":"Ianto Jones","credit_id":"595cab5f9251410a5906c414","order":1318,"adult":false,"gender":2,"id":110875,"known_for_department":"Acting","name":"Gareth David-Lloyd","original_name":"Gareth David-Lloyd","popularity":5.142,"profile_path":"/am5qnHQBGpRBWZ2l1DzlBFUY9xm.jpg"},{"character":"Wilfred Mott","credit_id":"5403c798c3a3684366005b58","order":1486,"adult":false,"gender":2,"id":40943,"known_for_department":"Acting","name":"Bernard Cribbins","original_name":"Bernard Cribbins","popularity":7.108,"profile_path":"/lLdaHLskigTNayxy4Tbrt7EKly2.jpg"},{"character":"Davros","credit_id":"52598af6760ee34661b26f7e","order":1562,"adult":false,"gender":2,"id":30086,"known_for_department":"Acting","name":"Julian Bleach","original_name":"Julian Bleach","popularity":4.421,"profile_path":"/bLgrVbB17jYhqwu9OYHWZdcQueA.jpg"},{"character":"Francine Jones","credit_id":"583426c4925141691b002700","order":1646,"adult":false,"gender":1,"id":109651,"known_for_department":"Acting","name":"Adjoa Andoh","original_name":"Adjoa Andoh","popularity":4.942,"profile_path":"/7bjdkwsEZi2An4kIiPw4R4yZTpK.jpg"},{"character":"Dalek (voice)","credit_id":"61e9643cd75bd600f2f76d54","order":1754,"adult":false,"gender":2,"id":1193572,"known_for_department":"Acting","name":"Nicholas Briggs","original_name":"Nicholas Briggs","popularity":2.784,"profile_path":"/7QUxZVfw8WqUSxPVHrhmRtXGFUl.jpg"},{"character":"K9 (voice)","credit_id":"6245ac416dc507005de830c4","order":1861,"adult":false,"gender":2,"id":1213430,"known_for_department":"Acting","name":"John Leeson","original_name":"John Leeson","popularity":1.238,"profile_path":"/tmnsokNJvaXt6E5fvmTmcqoQJC5.jpg"},{"character":"Captain Jack Harkness","credit_id":"569abed2c3a36872cb000c8f","order":1865,"adult":false,"gender":2,"id":182287,"known_for_department":"Acting","name":"John Barrowman","original_name":"John Barrowman","popularity":8.559,"profile_path":"/kDx4ynZwEUtBgomulnCEO9mLobU.jpg"},{"character":"Sylvia Noble","credit_id":"5403c7adc3a3684363005864","order":1866,"adult":false,"gender":1,"id":1230422,"known_for_department":"Acting","name":"Jacqueline King","original_name":"Jacqueline King","popularity":2.397,"profile_path":"/7vsacSnnE9vUXc2BZR6y0ISrl6a.jpg"},{"character":"Jackie Tyler","credit_id":"52598aa3760ee34661b2246a","order":1867,"adult":false,"gender":1,"id":26071,"known_for_department":"Acting","name":"Camille Coduri","original_name":"Camille Coduri","popularity":3.123,"profile_path":"/vzzNfnKteOiuyXC1IxABapFrZaL.jpg"},{"character":"Mickey Smith","credit_id":"528bcd94760ee3014f1a3565","order":1868,"adult":false,"gender":2,"id":76242,"known_for_department":"Acting","name":"Noel Clarke","original_name":"Noel Clarke","popularity":3.451,"profile_path":"/52vN94YqyTlRTAIGwLmkz6ORMww.jpg"}]}],"name":"第 4 季","overview":"在第十任博士的故事里,他始终强烈的孤独。仿佛诅咒,他的同伴——所有的人总有一天离开他;自己并一个人地走向死亡。在他的生命最终结束的时候,坐着塔迪斯和过去的同伴一一告别。第十任是一个轻松健谈,随和机智的人,对敌人总会给予第二次机会却又绝不过分仁慈。曾经和女伴罗斯有过一场恋爱,最后以两人分隔在不同的宇宙告终,之后也和其它的同伴一起环游宇宙,拯救世界。第十任一般穿深褐色(蓝色条纹)或蓝色(铁锈红条纹)四个扣子的西装,衬衫和领带,浅棕色的人造麂皮大衣。","id":58471,"poster_path":"/jQmM0kRXf5yHD8y5exkLQttkHtX.jpg","season_number":4,"external_ids":{"freebase_mid":"/m/04gf0t4","freebase_id":"/en/doctor_who_series_4_2008","tvdb_id":31270,"tvrage_id":null,"wikidata_id":null},"credits":{"cast":[{"adult":false,"gender":2,"id":20049,"known_for_department":"Acting","name":"David Tennant","original_name":"David Tennant","popularity":26.286,"profile_path":"/zM76EBPZkdkSHyESyIUa47aP87R.jpg","character":"The Doctor","credit_id":"52767934760ee37a93052318","order":5},{"adult":false,"gender":1,"id":47646,"known_for_department":"Acting","name":"Catherine Tate","original_name":"Catherine Tate","popularity":8.958,"profile_path":"/xqaqetDBODzlm4Yky99NOOzLstL.jpg","character":"Donna Noble","credit_id":"527f9b4f19c29514ec0964ca","order":20}],"crew":[{"adult":false,"gender":0,"id":1213458,"known_for_department":"Production","name":"Catrin Lewis Defis","original_name":"Catrin Lewis Defis","popularity":1.456,"profile_path":null,"credit_id":"568c58879251414ecb0210af","department":"Production","job":"Associate Producer"},{"adult":false,"gender":0,"id":1394008,"known_for_department":"Visual Effects","name":"Will Cohen","original_name":"Will Cohen","popularity":1.4,"profile_path":null,"credit_id":"568d4b50c3a368227b0270f9","department":"Visual Effects","job":"Visual Effects Producer"},{"adult":false,"gender":0,"id":1559003,"known_for_department":"Visual Effects","name":"Dave Houghton","original_name":"Dave Houghton","popularity":0.828,"profile_path":null,"credit_id":"568d4bdcc3a3684bcc034830","department":"Visual Effects","job":"Visual Effects Supervisor"},{"adult":false,"gender":2,"id":1178977,"known_for_department":"Camera","name":"Ernest Vincze","original_name":"Ernest Vincze","popularity":1.388,"profile_path":null,"credit_id":"568c3fd792514169d001a2d9","department":"Camera","job":"Director of Photography"},{"adult":false,"gender":0,"id":221860,"known_for_department":"Art","name":"Edward Thomas","original_name":"Edward Thomas","popularity":1.094,"profile_path":null,"credit_id":"568c41079251410ffb003de3","department":"Art","job":"Production Design"},{"adult":false,"gender":2,"id":47203,"known_for_department":"Sound","name":"Murray Gold","original_name":"Murray Gold","popularity":1.62,"profile_path":"/ih1ELPTC9QMDbK2KxskidkRqMFM.jpg","credit_id":"568d4a0d92514132db030499","department":"Sound","job":"Original Music Composer"},{"adult":false,"gender":1,"id":79922,"known_for_department":"Sound","name":"Delia Derbyshire","original_name":"Delia Derbyshire","popularity":2.407,"profile_path":null,"credit_id":"5bf191d29251415cd905ddf3","department":"Sound","job":"Original Music Composer"},{"adult":false,"gender":2,"id":9002,"known_for_department":"Production","name":"Andy Pryor","original_name":"Andy Pryor","popularity":0.828,"profile_path":"/vZj1ruX5JUJTtWZX0zs3QJGezyo.jpg","credit_id":"568d4604c3a3686075032d7f","department":"Production","job":"Casting"}]}}
\ No newline at end of file
diff --git a/test_data/https___api_themoviedb_org_3_tv_57243_season_4_episode_1_api_key_19890604_language_zh_CN_append_to_response_external_ids_credits b/test_data/https___api_themoviedb_org_3_tv_57243_season_4_episode_1_api_key_19890604_language_zh_CN_append_to_response_external_ids_credits
new file mode 100644
index 00000000..e3a0a2c3
--- /dev/null
+++ b/test_data/https___api_themoviedb_org_3_tv_57243_season_4_episode_1_api_key_19890604_language_zh_CN_append_to_response_external_ids_credits
@@ -0,0 +1 @@
+{"air_date":"2008-04-05","crew":[{"job":"Director","department":"Directing","credit_id":"52598ab9760ee34661b23eba","adult":false,"gender":2,"id":95893,"known_for_department":"Directing","name":"James Strong","original_name":"James Strong","popularity":1.96,"profile_path":"/qOBBxMHqs6UcWYxE4P7LGa3nT10.jpg"},{"job":"Writer","department":"Writing","credit_id":"52598aa4760ee34661b22580","adult":false,"gender":2,"id":95894,"known_for_department":"Writing","name":"Russell T Davies","original_name":"Russell T Davies","popularity":1.815,"profile_path":"/rDDLhm0Sw7JUqIf7CVkFbu06IEp.jpg"}],"episode_number":1,"guest_stars":[{"character":"Rose Tyler","credit_id":"5276b22a760ee35a9a263838","order":18,"adult":false,"gender":1,"id":26076,"known_for_department":"Acting","name":"Billie Piper","original_name":"Billie Piper","popularity":9.945,"profile_path":"/gBduwAWEZ1bwuL6f7cjMzBvKlJz.jpg"},{"character":"Suzette Chambers","credit_id":"52598acd760ee34661b257cb","order":507,"adult":false,"gender":1,"id":1226727,"known_for_department":"Acting","name":"Sue Kelvin","original_name":"Sue Kelvin","popularity":0.694,"profile_path":null},{"character":"Taxi Driver","credit_id":"52598acd760ee34661b257f9","order":533,"adult":false,"gender":2,"id":1227548,"known_for_department":"Acting","name":"Jonathan Stratt","original_name":"Jonathan Stratt","popularity":1.954,"profile_path":null},{"character":"Roger Davey","credit_id":"52598ace760ee34661b25827","order":560,"adult":false,"gender":2,"id":1231420,"known_for_department":"Acting","name":"Martin Ball","original_name":"Martin Ball","popularity":0.84,"profile_path":"/no3sxDXskEKdcNPvnVkKs1liCGI.jpg"},{"character":"Penny Carter","credit_id":"52598acf760ee34661b2585e","order":617,"adult":false,"gender":0,"id":1261083,"known_for_department":"Acting","name":"Verona Joseph","original_name":"Verona Joseph","popularity":0.98,"profile_path":null},{"character":"Clare Pope","credit_id":"52598acf760ee34661b258c6","order":694,"adult":false,"gender":0,"id":1229194,"known_for_department":"Acting","name":"Chandra Ruegg","original_name":"Chandra Ruegg","popularity":1.62,"profile_path":"/p0ettgThedI6tFOo7k51bdHFiCx.jpg"},{"character":"Miss Foster","credit_id":"52598acf760ee34661b258f4","order":705,"adult":false,"gender":1,"id":115680,"known_for_department":"Acting","name":"Sarah Lancashire","original_name":"Sarah Lancashire","popularity":4.457,"profile_path":"/aDYVBAAbUgPyZ3qCyQnEfR807Np.jpg"},{"character":"Craig Staniland","credit_id":"52598ad1760ee34661b25953","order":724,"adult":false,"gender":2,"id":1261084,"known_for_department":"Acting","name":"Rachid Sabitri","original_name":"Rachid Sabitri","popularity":0.6,"profile_path":null},{"character":"Stacey Harris","credit_id":"52598ad1760ee34661b259af","order":739,"adult":false,"gender":1,"id":1196101,"known_for_department":"Acting","name":"Jessica Gunning","original_name":"Jessica Gunning","popularity":3.995,"profile_path":"/c4nC6usiZdRlw4VkOcHFLXtrPa0.jpg"},{"character":"Wilfred Mott","credit_id":"5403c798c3a3684366005b58","order":1486,"adult":false,"gender":2,"id":40943,"known_for_department":"Acting","name":"Bernard Cribbins","original_name":"Bernard Cribbins","popularity":7.108,"profile_path":"/lLdaHLskigTNayxy4Tbrt7EKly2.jpg"},{"character":"Sylvia Noble","credit_id":"5403c7adc3a3684363005864","order":1866,"adult":false,"gender":1,"id":1230422,"known_for_department":"Acting","name":"Jacqueline King","original_name":"Jacqueline King","popularity":2.397,"profile_path":"/7vsacSnnE9vUXc2BZR6y0ISrl6a.jpg"}],"name":"活宝搭档","overview":"博士在伦敦发现艾迪派斯公司新产品药物有问题,人类服用后会悄悄的产生土豆状生物,并在夜里1点10分逃走回到保姆身边,于是博士潜入公司决定探查究竟,在探查时遇到了多娜原来Adiposian人丢失了他们的繁育星球,于是跑到地球利用人类做代孕母繁殖宝宝。最后保姆在高空中被抛弃,脂肪球回到了父母身边,博士邀请多娜一同旅行。【Rose从平行宇宙回归】","id":941505,"production_code":"","runtime":null,"season_number":4,"still_path":"/cq1zrCS267vGXa3rCYQkVKNJE9v.jpg","vote_average":7.2,"vote_count":43,"credits":{"cast":[{"adult":false,"gender":2,"id":20049,"known_for_department":"Acting","name":"David Tennant","original_name":"David Tennant","popularity":26.286,"profile_path":"/zM76EBPZkdkSHyESyIUa47aP87R.jpg","character":"The Doctor","credit_id":"52767934760ee37a93052318","order":5},{"adult":false,"gender":1,"id":47646,"known_for_department":"Acting","name":"Catherine Tate","original_name":"Catherine Tate","popularity":8.958,"profile_path":"/xqaqetDBODzlm4Yky99NOOzLstL.jpg","character":"Donna Noble","credit_id":"527f9b4f19c29514ec0964ca","order":20}],"crew":[{"job":"Director","department":"Directing","credit_id":"52598ab9760ee34661b23eba","adult":false,"gender":2,"id":95893,"known_for_department":"Directing","name":"James Strong","original_name":"James Strong","popularity":1.96,"profile_path":"/qOBBxMHqs6UcWYxE4P7LGa3nT10.jpg"},{"job":"Writer","department":"Writing","credit_id":"52598aa4760ee34661b22580","adult":false,"gender":2,"id":95894,"known_for_department":"Writing","name":"Russell T Davies","original_name":"Russell T Davies","popularity":1.815,"profile_path":"/rDDLhm0Sw7JUqIf7CVkFbu06IEp.jpg"}],"guest_stars":[{"character":"Rose Tyler","credit_id":"5276b22a760ee35a9a263838","order":18,"adult":false,"gender":1,"id":26076,"known_for_department":"Acting","name":"Billie Piper","original_name":"Billie Piper","popularity":9.945,"profile_path":"/gBduwAWEZ1bwuL6f7cjMzBvKlJz.jpg"},{"character":"Suzette Chambers","credit_id":"52598acd760ee34661b257cb","order":507,"adult":false,"gender":1,"id":1226727,"known_for_department":"Acting","name":"Sue Kelvin","original_name":"Sue Kelvin","popularity":0.694,"profile_path":null},{"character":"Taxi Driver","credit_id":"52598acd760ee34661b257f9","order":533,"adult":false,"gender":2,"id":1227548,"known_for_department":"Acting","name":"Jonathan Stratt","original_name":"Jonathan Stratt","popularity":1.954,"profile_path":null},{"character":"Roger Davey","credit_id":"52598ace760ee34661b25827","order":560,"adult":false,"gender":2,"id":1231420,"known_for_department":"Acting","name":"Martin Ball","original_name":"Martin Ball","popularity":0.84,"profile_path":"/no3sxDXskEKdcNPvnVkKs1liCGI.jpg"},{"character":"Penny Carter","credit_id":"52598acf760ee34661b2585e","order":617,"adult":false,"gender":0,"id":1261083,"known_for_department":"Acting","name":"Verona Joseph","original_name":"Verona Joseph","popularity":0.98,"profile_path":null},{"character":"Clare Pope","credit_id":"52598acf760ee34661b258c6","order":694,"adult":false,"gender":0,"id":1229194,"known_for_department":"Acting","name":"Chandra Ruegg","original_name":"Chandra Ruegg","popularity":1.62,"profile_path":"/p0ettgThedI6tFOo7k51bdHFiCx.jpg"},{"character":"Miss Foster","credit_id":"52598acf760ee34661b258f4","order":705,"adult":false,"gender":1,"id":115680,"known_for_department":"Acting","name":"Sarah Lancashire","original_name":"Sarah Lancashire","popularity":4.457,"profile_path":"/aDYVBAAbUgPyZ3qCyQnEfR807Np.jpg"},{"character":"Craig Staniland","credit_id":"52598ad1760ee34661b25953","order":724,"adult":false,"gender":2,"id":1261084,"known_for_department":"Acting","name":"Rachid Sabitri","original_name":"Rachid Sabitri","popularity":0.6,"profile_path":null},{"character":"Stacey Harris","credit_id":"52598ad1760ee34661b259af","order":739,"adult":false,"gender":1,"id":1196101,"known_for_department":"Acting","name":"Jessica Gunning","original_name":"Jessica Gunning","popularity":3.995,"profile_path":"/c4nC6usiZdRlw4VkOcHFLXtrPa0.jpg"},{"character":"Wilfred Mott","credit_id":"5403c798c3a3684366005b58","order":1486,"adult":false,"gender":2,"id":40943,"known_for_department":"Acting","name":"Bernard Cribbins","original_name":"Bernard Cribbins","popularity":7.108,"profile_path":"/lLdaHLskigTNayxy4Tbrt7EKly2.jpg"},{"character":"Sylvia Noble","credit_id":"5403c7adc3a3684363005864","order":1866,"adult":false,"gender":1,"id":1230422,"known_for_department":"Acting","name":"Jacqueline King","original_name":"Jacqueline King","popularity":2.397,"profile_path":"/7vsacSnnE9vUXc2BZR6y0ISrl6a.jpg"}]},"external_ids":{"imdb_id":"tt1159991","freebase_mid":"/m/03w9ft4","freebase_id":null,"tvdb_id":357056,"tvrage_id":null,"wikidata_id":null}}
\ No newline at end of file
diff --git a/test_data/https___api_themoviedb_org_3_tv_86941_api_key_19890604_language_zh_CN_append_to_response_external_ids_credits b/test_data/https___api_themoviedb_org_3_tv_86941_api_key_19890604_language_zh_CN_append_to_response_external_ids_credits
new file mode 100644
index 00000000..76698aa6
--- /dev/null
+++ b/test_data/https___api_themoviedb_org_3_tv_86941_api_key_19890604_language_zh_CN_append_to_response_external_ids_credits
@@ -0,0 +1 @@
+{"adult":false,"backdrop_path":"/8IC1q0lHFwi5m8VtChLzIfmpaZH.jpg","created_by":[{"id":586002,"credit_id":"5e99a4b2d14443001452eb61","name":"Andrew Haigh","gender":2,"profile_path":"/pJAv105SAZiQ3lGY2wGURz4bENp.jpg"}],"episode_run_time":[50],"first_air_date":"2021-07-14","genres":[{"id":18,"name":"剧情"},{"id":9648,"name":"悬疑"}],"homepage":"https://www.bbc.co.uk/programmes/p09mqzmq","id":86941,"in_production":false,"languages":["en"],"last_air_date":"2021-08-11","last_episode_to_air":{"air_date":"2021-08-11","episode_number":5,"id":3057572,"name":"第 5 集","overview":"","production_code":"","runtime":57,"season_number":1,"show_id":86941,"still_path":"/yBDspe0CxvEd2j8Qy3kayDzbo6v.jpg","vote_average":7.2,"vote_count":5},"name":"北海鲸梦","next_episode_to_air":null,"networks":[{"id":332,"name":"BBC Two","logo_path":"/6kl5tMuct7u3ej5myL4c9QQVSW1.png","origin_country":"GB"}],"number_of_episodes":5,"number_of_seasons":1,"origin_country":["US"],"original_language":"en","original_name":"The North Water","overview":"改编自伊恩·麦奎尔的同名获奖小说,聚焦19世纪一次灾难性的捕鲸活动。故事围绕帕特里克·萨姆纳展开,他是一名声名狼藉的前战地医生,后成为捕鲸船上的医生,在船上遇到了鱼叉手亨利·德拉克斯,一个残忍、不道德的杀手。萨姆纳没有逃离过去的恐惧,而是被迫在北极荒原上为生存而进行残酷的斗争...","popularity":13.533,"poster_path":"/9CM0ca8pX1os3SJ24hsIc0nN8ph.jpg","production_companies":[{"id":164,"logo_path":"/v3zcUepvKC7Vz36yjklk1rw6k8Q.png","name":"Rhombus Media","origin_country":"CA"},{"id":3324,"logo_path":"/16fY7pucCzn7WSOYxOGRHlAayL3.png","name":"BBC","origin_country":"GB"},{"id":7217,"logo_path":"/vFbexaF70wSMUHRA6Fy6UcuA1ju.png","name":"See-Saw Films","origin_country":"GB"}],"production_countries":[{"iso_3166_1":"CA","name":"Canada"},{"iso_3166_1":"GB","name":"United Kingdom"}],"seasons":[{"air_date":"2021-07-14","episode_count":5,"id":119104,"name":"第 1 季","overview":"","poster_path":"/9CM0ca8pX1os3SJ24hsIc0nN8ph.jpg","season_number":1}],"spoken_languages":[{"english_name":"English","iso_639_1":"en","name":"English"}],"status":"Ended","tagline":"","type":"Miniseries","vote_average":7.5,"vote_count":75,"external_ids":{"imdb_id":"tt7660970","freebase_mid":null,"freebase_id":null,"tvdb_id":366476,"tvrage_id":null,"wikidata_id":null,"facebook_id":null,"instagram_id":"northwatertv","twitter_id":"NorthWaterTV"},"credits":{"cast":[{"adult":false,"gender":2,"id":72466,"known_for_department":"Acting","name":"Colin Farrell","original_name":"Colin Farrell","popularity":28.374,"profile_path":"/3iHqlaeSAQwJ0KraRKD1A4vBaCS.jpg","character":"Henry Drax","credit_id":"5c6c38e892514129a201b3aa","order":0},{"adult":false,"gender":2,"id":85065,"known_for_department":"Acting","name":"Jack O'Connell","original_name":"Jack O'Connell","popularity":41.091,"profile_path":"/tCzR4clrIkbkijuJBYsNoEuwRDa.jpg","character":"Patrick Sumner","credit_id":"5e99a36cfdf8b70015a4970e","order":1}],"crew":[{"adult":false,"gender":0,"id":55360,"known_for_department":"Production","name":"Jamie Laurenson","original_name":"Jamie Laurenson","popularity":1.15,"profile_path":null,"credit_id":"5c6c3a1c92514120d5017b44","department":"Production","job":"Executive Producer"},{"adult":false,"gender":0,"id":1024839,"known_for_department":"Production","name":"Hakan Kousetta","original_name":"Hakan Kousetta","popularity":1.114,"profile_path":null,"credit_id":"5c6c3a3292514129d502323e","department":"Production","job":"Executive Producer"},{"adult":false,"gender":0,"id":37276,"known_for_department":"Production","name":"Iain Canning","original_name":"Iain Canning","popularity":2.418,"profile_path":null,"credit_id":"5c6c3a48c3a3684fabe99871","department":"Production","job":"Executive Producer"},{"adult":false,"gender":2,"id":37270,"known_for_department":"Production","name":"Emile Sherman","original_name":"Emile Sherman","popularity":3.724,"profile_path":null,"credit_id":"5c6c3a56c3a3686fb6de07ee","department":"Production","job":"Executive Producer"},{"adult":false,"gender":1,"id":1460270,"known_for_department":"Production","name":"Lucy Richer","original_name":"Lucy Richer","popularity":0.6,"profile_path":null,"credit_id":"5c6c3a66c3a36848f1ddc26f","department":"Production","job":"Executive Producer"},{"adult":false,"gender":0,"id":2604693,"known_for_department":"Writing","name":"Ian McGuire","original_name":"Ian McGuire","popularity":0.6,"profile_path":null,"credit_id":"5e99a313fdf8b70015a49698","department":"Writing","job":"Writer"},{"adult":false,"gender":2,"id":959308,"known_for_department":"Camera","name":"Nicolas Bolduc","original_name":"Nicolas Bolduc","popularity":1.535,"profile_path":"/zno78ThM4dWT5TKIPDwZUdg7Qcz.jpg","credit_id":"5e99a32d8d22fc001c7e6db6","department":"Crew","job":"Cinematography"},{"adult":false,"gender":1,"id":70525,"known_for_department":"Production","name":"Kate Ogborn","original_name":"Kate Ogborn","popularity":1.214,"profile_path":null,"credit_id":"5e99a33dfdf8b70015a496e1","department":"Production","job":"Producer"},{"adult":false,"gender":2,"id":1919831,"known_for_department":"Sound","name":"Tim Hecker","original_name":"Tim Hecker","popularity":1.7,"profile_path":null,"credit_id":"61117682d05a03002df4c46d","department":"Sound","job":"Music"},{"adult":false,"gender":2,"id":1500501,"known_for_department":"Production","name":"Fraser Ash","original_name":"Fraser Ash","popularity":1.96,"profile_path":null,"credit_id":"6112eb6f5ed962007c344865","department":"Production","job":"Co-Executive Producer"},{"adult":false,"gender":0,"id":1677701,"known_for_department":"Production","name":"Alice Dawson","original_name":"Alice Dawson","popularity":1.96,"profile_path":null,"credit_id":"6112ebaba127e5002c2d9055","department":"Production","job":"Co-Producer"},{"adult":false,"gender":0,"id":1424568,"known_for_department":"Production","name":"Nicky Earnshaw","original_name":"Nicky Earnshaw","popularity":1.135,"profile_path":null,"credit_id":"6112ebcf22f5d7007e6e5405","department":"Production","job":"Co-Producer"},{"adult":false,"gender":2,"id":4583,"known_for_department":"Production","name":"Niv Fichman","original_name":"Niv Fichman","popularity":1.96,"profile_path":"/oDetf7f01a6yWVGO4JN2LM32FGV.jpg","credit_id":"6112ebf25ed962007c3449b3","department":"Production","job":"Executive Producer"},{"adult":false,"gender":2,"id":586002,"known_for_department":"Directing","name":"Andrew Haigh","original_name":"Andrew Haigh","popularity":1.22,"profile_path":"/pJAv105SAZiQ3lGY2wGURz4bENp.jpg","credit_id":"6112ec178e20c5002c7458da","department":"Production","job":"Executive Producer"},{"adult":false,"gender":2,"id":62982,"known_for_department":"Production","name":"Ildikó Kemény","original_name":"Ildikó Kemény","popularity":1.268,"profile_path":null,"credit_id":"6112ec5922f5d7007e6e54e6","department":"Production","job":"Co-Producer"},{"adult":false,"gender":2,"id":1500500,"known_for_department":"Production","name":"Kevin Krikst","original_name":"Kevin Krikst","popularity":0.6,"profile_path":null,"credit_id":"6112eca622f5d7007e6e55b6","department":"Production","job":"Co-Executive Producer"},{"adult":false,"gender":2,"id":4854,"known_for_department":"Production","name":"David Minkowski","original_name":"David Minkowski","popularity":3.287,"profile_path":null,"credit_id":"6112ecdf839d93005e123849","department":"Production","job":"Co-Producer"},{"adult":false,"gender":1,"id":928373,"known_for_department":"Production","name":"Mónika Nagy","original_name":"Mónika Nagy","popularity":1.176,"profile_path":null,"credit_id":"6112ed05af58cb007e0b0ab1","department":"Production","job":"Line Producer"},{"adult":false,"gender":1,"id":16899,"known_for_department":"Production","name":"Kahleen Crawford","original_name":"Kahleen Crawford","popularity":1.84,"profile_path":null,"credit_id":"6112ed3f25cd85008062334b","department":"Production","job":"Casting"},{"adult":false,"gender":0,"id":1151933,"known_for_department":"Art","name":"Emmanuel Frechette","original_name":"Emmanuel Frechette","popularity":1.22,"profile_path":null,"credit_id":"6112ed5e8e8d3000269f6ecc","department":"Art","job":"Production Design"},{"adult":false,"gender":0,"id":1671897,"known_for_department":"Production","name":"Péter Annus","original_name":"Péter Annus","popularity":0.6,"profile_path":null,"credit_id":"6112ede222f5d700458c7114","department":"Crew","job":"Set Production Assistant"},{"adult":false,"gender":0,"id":2933715,"known_for_department":"Production","name":"Edward Rastelli-Lewis","original_name":"Edward Rastelli-Lewis","popularity":0.98,"profile_path":null,"credit_id":"6112ee24b39e35002ceb7aa0","department":"Production","job":"Production Manager"},{"adult":false,"gender":0,"id":1662946,"known_for_department":"Crew","name":"George Jardon","original_name":"George Jardon","popularity":0.84,"profile_path":null,"credit_id":"6112ee3fda9ef200442cda96","department":"Crew","job":"Post Production Supervisor"}]}}
\ No newline at end of file
diff --git a/test_data/https___book_douban_com_subject_1089243_ b/test_data/https___book_douban_com_subject_1089243_
new file mode 100644
index 00000000..d28fb51f
--- /dev/null
+++ b/test_data/https___book_douban_com_subject_1089243_
@@ -0,0 +1,3319 @@
+
+
+
+
+
+
+ 黄金时代 (豆瓣)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 作者 :
+
+ 王小波
+
+
+
+
+
+
出版社:
+
花城出版社
+
+
+
+
+
+
+
+
+
+
副标题: 时代三部曲
+
+
+
+
+
+
+
+
+
+
+
+
+
出版年: 1999-3
+
+
+
+
+
页数: 375
+
+
+
+
+
定价: 19.00元
+
+
+
+
+
装帧: 平装
+
+
+
+
+
丛书: 王小波《时代三部曲》
+
+
+
+
+
+
+
ISBN: 9787536025080
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 豆瓣评分
+
+
+
+
+
+
+ 5星
+
+
+
+
+
+
56.4%
+
+
+
+
+ 4星
+
+
+
+
+
+
34.7%
+
+
+
+
+ 3星
+
+
+
+
+
+
8.1%
+
+
+
+
+ 2星
+
+
+
+
+
+
0.6%
+
+
+
+
+ 1星
+
+
+
+
+
+
0.2%
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 当前版本有售
+ · · · · · ·
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 这本书的其他版本
+ · · · · · ·
+ (
+ 全部31
+ )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 在哪儿借这本书
+ · · · · · ·
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 以下书单推荐
+ · · · · · ·
+ (
+ 全部
+ )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 谁读这本书?
+ · · · · · ·
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 二手市场
+ · · · · · ·
+
+
+
+
+
+
+
+
+ 43本二手书欲转让
+
+ (1.00
+ 至 200.00元)
+
+
+
+ 在豆瓣转让
+
+ 有112450人想读,手里有一本闲着?
+
+
+
+ 转让给其他二手平台?
+
+
+
+
+
+
订阅关于黄金时代的评论:
+ feed: rss 2.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test_data/https___book_douban_com_subject_2037260_ b/test_data/https___book_douban_com_subject_2037260_
new file mode 100644
index 00000000..a35b7800
--- /dev/null
+++ b/test_data/https___book_douban_com_subject_2037260_
@@ -0,0 +1,3042 @@
+
+
+
+
+
+
+ Wang in Love and Bondage (豆瓣)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Wang in Love and Bondage
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 作者 :
+
+ Wang Xiaobo
+
+
+
+
+
+
+
出版社: State University of New York Press
+
+
+
+
+
+
+
+
+
副标题: Three Novellas by Wang Xiaobo
+
+
+
+
+
+
+
+
+
+ 译者 :
+
+
+ Hongling Zhang
+
+ /
+
+ Jason Sommer
+
+
+
+
+
+
出版年: 2007-3-8
+
+
+
+
+
页数: 155
+
+
+
+
+
定价: USD 26.00
+
+
+
+
+
装帧: Hardcover
+
+
+
+
+
+
+
+
+
+
+
ISBN: 9780791470657
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 豆瓣评分
+
+
+
+
+
+
+ 5星
+
+
+
+
+
+
53.3%
+
+
+
+
+ 4星
+
+
+
+
+
+
26.7%
+
+
+
+
+ 3星
+
+
+
+
+
+
16.7%
+
+
+
+
+ 2星
+
+
+
+
+
+
3.3%
+
+
+
+
+ 1星
+
+
+
+
+
+
0.0%
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 这本书的其他版本
+ · · · · · ·
+ (
+ 全部31
+ )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 以下书单推荐
+ · · · · · ·
+ (
+ 全部
+ )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 谁读这本书?
+ · · · · · ·
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 二手市场
+ · · · · · ·
+
+
+
+
+
+
+
+
+ 1本二手书欲转让
+
+ (120.00
+ 元)
+
+
+
+ 在豆瓣转让
+
+ 有107人想读,手里有一本闲着?
+
+
+
+ 转让给其他二手平台?
+
+
+
+
+
+
订阅关于Wang in Love and Bondage的评论:
+ feed: rss 2.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test_data/https___book_douban_com_subject_35902899_ b/test_data/https___book_douban_com_subject_35902899_
new file mode 100644
index 00000000..7cfa54ec
--- /dev/null
+++ b/test_data/https___book_douban_com_subject_35902899_
@@ -0,0 +1,1446 @@
+
+
+
+
+
+
+ 1984 Nineteen Eighty-Four (豆瓣)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1984 Nineteen Eighty-Four
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 作者 :
+
+
+ George Orwell
+
+
+
+
+
+
+
出版社: Alma Classics
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
页数: 400
+
+
+
+
+
定价: 5.99
+
+
+
+
+
装帧: Paperback
+
+
+
+
+
丛书: Alma Classics
+
+
+
+
+
+
+
ISBN: 9781847498571
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 当前版本有售
+ · · · · · ·
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 谁读这本书?
+ · · · · · ·
+
+
+
+
+
+
+
+
+
+
+
+
繁星在吾心
+
11月29日 想读
+
+
+
+
+
+
+
+
+
+
+
> 3人想读
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 二手市场
+ · · · · · ·
+
+
+
+
+
+
+
+
+ 在豆瓣转让
+
+ 有3人想读,手里有一本闲着?
+
+
+
+ 转让给其他二手平台?
+
+
+
+
+
+
订阅关于1984 Nineteen Eighty-Four的评论:
+ feed: rss 2.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test_data/https___book_douban_com_works_1008677_ b/test_data/https___book_douban_com_works_1008677_
new file mode 100644
index 00000000..d0478b45
--- /dev/null
+++ b/test_data/https___book_douban_com_works_1008677_
@@ -0,0 +1,2516 @@
+
+
+
+
+
+
+
+ 黄金时代 全部版本(31)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
黄金时代 全部版本(31)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 花城出版社
+
+
+ 出版年:
+
+ 1999-3
+
+
+
+ 112518人想读
+
+ /
+
+ 243284人读过
+
+
+ 8.9
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 陕西师范大学出版社
+
+
+ 出版年:
+
+ 2009-07-01
+
+
+
+ 13627人想读
+
+ /
+
+ 50872人读过
+
+
+ 8.9
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代
+
+
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 北京十月文艺出版社
+
+
+ 出版年:
+
+ 2017-4
+
+
+
+ 11603人想读
+
+ /
+
+ 44936人读过
+
+
+ 8.8
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 长江文艺出版社
+
+
+ 出版年:
+
+ 2006-8
+
+
+
+ 7372人想读
+
+ /
+
+ 10621人读过
+
+
+ 9.0
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 上海锦绣文章出版社
+
+
+ 出版年:
+
+ 2008-5
+
+
+
+ 949人想读
+
+ /
+
+ 5307人读过
+
+
+ 8.7
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 北京十月文艺出版社
+
+
+ 出版年:
+
+ 2011-10
+
+
+
+ 496人想读
+
+ /
+
+ 4052人读过
+
+
+ 8.8
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 译林出版社
+
+
+ 出版年:
+
+ 2012-1
+
+
+
+ 676人想读
+
+ /
+
+ 3189人读过
+
+
+ 9.1
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+
+ 王小波全集(第六卷)
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 云南人民出版社
+
+
+ 出版年:
+
+ 2007-1
+
+
+
+ 4207人想读
+
+ /
+
+ 4473人读过
+
+
+ 9.1
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 上海三联书店
+
+
+ 出版年:
+
+ 2013-1
+
+
+
+ 277人想读
+
+ /
+
+ 2494人读过
+
+
+ 8.8
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 北京十月文艺出版社
+
+
+ 出版年:
+
+ 2021-6
+
+
+
+ 1380人想读
+
+ /
+
+ 2372人读过
+
+
+ 9.1
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 长江文艺出版社
+
+
+ 出版年:
+
+ 2010-7-1
+
+
+
+ 265人想读
+
+ /
+
+ 2425人读过
+
+
+ 8.7
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 长江文艺出版社
+
+
+ 出版年:
+
+ 2016-10
+
+
+
+ 276人想读
+
+ /
+
+ 1951人读过
+
+
+ 8.9
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 湖南文艺出版社
+
+
+ 出版年:
+
+ 2016-1-1
+
+
+
+ 249人想读
+
+ /
+
+ 1982人读过
+
+
+ 8.8
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代
+
+
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 上海三联书店
+
+
+ 出版年:
+
+ 2008-1
+
+
+
+ 506人想读
+
+ /
+
+ 1695人读过
+
+
+ 9.0
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+ 王小波全集(第六卷 中篇小说)
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 北京理工大学出版社
+
+
+ 出版年:
+
+ 2009-9
+
+
+
+ 25671人想读
+
+ /
+
+ 12093人读过
+
+
+ 9.2
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 北京工业大学出版社
+
+
+ 出版年:
+
+ 2012-10
+
+
+
+ 102人想读
+
+ /
+
+ 1273人读过
+
+
+ 8.8
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 北京联合出版公司
+
+
+ 出版年:
+
+ 2016-5-20
+
+
+
+ 242人想读
+
+ /
+
+ 864人读过
+
+
+ 8.7
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代
+
+
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 中信出版社
+
+
+ 出版年:
+
+ 2015-8-30
+
+
+
+ 101人想读
+
+ /
+
+ 799人读过
+
+
+ 9.0
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 华夏出版社
+
+
+ 出版年:
+
+ 1994年9月
+
+
+
+ 141人想读
+
+ /
+
+ 836人读过
+
+
+ 8.8
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 作家出版社
+
+
+ 出版年:
+
+ 2016-7-1
+
+
+
+ 135人想读
+
+ /
+
+ 672人读过
+
+
+ 9.1
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 长江文艺出版社
+
+
+ 出版年:
+
+ 2014-7
+
+
+
+ 321人想读
+
+ /
+
+ 1304人读过
+
+
+ 8.9
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 重庆出版社
+
+
+ 出版年:
+
+ 2009年4月1日
+
+
+
+ 81人想读
+
+ /
+
+ 465人读过
+
+
+ 9.1
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 群言出版社
+
+
+ 出版年:
+
+ 2014-12-1
+
+
+
+ 26人想读
+
+ /
+
+ 349人读过
+
+
+ 8.8
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 上海文化出版社
+
+
+ 出版年:
+
+ 2012-1
+
+
+
+ 67人想读
+
+ /
+
+ 381人读过
+
+
+ 8.7
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代(珍藏版)
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 译林出版社
+
+
+ 出版年:
+
+ 2017-2
+
+
+
+ 145人想读
+
+ /
+
+ 309人读过
+
+
+ 9.5
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代(精装珍藏版)
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 浙江文艺出版社
+
+
+ 出版年:
+
+ 2016-2
+
+
+
+ 99人想读
+
+ /
+
+ 251人读过
+
+
+ 9.3
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 译林出版社
+
+
+ 出版年:
+
+ 2015-8
+
+
+
+ 19人想读
+
+ /
+
+ 107人读过
+
+
+ 9.3
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 北京十月文艺出版社
+
+
+ 出版年:
+
+ 2014-11
+
+
+
+ 7人想读
+
+ /
+
+ 66人读过
+
+
+ 8.2
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+ 黃金時代
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ 王小波
+
+
+ 出版社:
+
+ 自由之丘
+
+
+ 出版年:
+
+ 2012-11-10
+
+
+
+ 38人想读
+
+ /
+
+ 55人读过
+
+
+ 9.6
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+ Wang in Love and Bondage
+
+
+
+
+
+
+
+
+ 译者:
+
+ Hongling Zhang
+
+
+ 作者:
+
+ Wang Xiaobo
+
+
+ 出版社:
+
+ State University of New York Press
+
+
+ 出版年:
+
+ 2007-3-8
+
+
+
+ 107人想读
+
+ /
+
+ 35人读过
+
+
+ 8.1
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+ L'Age d'or
+
+
+
+
+
+
+
+
+
+ 作者:
+
+ Wang Xiaobo
+
+
+ 出版社:
+
+ Éditions du Sorgho
+
+
+ 出版年:
+
+ 2001-7-1
+
+
+
+ 2人想读
+
+ /
+
+ 2人读过
+
+ 评价人数不足
+
+
+
+
+
+
+
+ 加入购书单
+ 已在购书单
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test_data/https___images_na_ssl_images_amazon_com_images_S_compressed_photo_goodreads_com_books_1405546838i_77566_jpg b/test_data/https___images_na_ssl_images_amazon_com_images_S_compressed_photo_goodreads_com_books_1405546838i_77566_jpg
new file mode 100644
index 00000000..9884f476
Binary files /dev/null and b/test_data/https___images_na_ssl_images_amazon_com_images_S_compressed_photo_goodreads_com_books_1405546838i_77566_jpg differ
diff --git a/test_data/https___itunes_apple_com_lookup_id_1050430296 b/test_data/https___itunes_apple_com_lookup_id_1050430296
new file mode 100644
index 00000000..fee6a21d
--- /dev/null
+++ b/test_data/https___itunes_apple_com_lookup_id_1050430296
@@ -0,0 +1,10 @@
+
+
+
+{
+ "resultCount":1,
+ "results": [
+{"wrapperType":"track", "kind":"podcast", "artistId":127981066, "collectionId":1050430296, "trackId":1050430296, "artistName":"WNYC Studios and The New Yorker", "collectionName":"The New Yorker Radio Hour", "trackName":"The New Yorker Radio Hour", "collectionCensoredName":"The New Yorker Radio Hour", "trackCensoredName":"The New Yorker Radio Hour", "artistViewUrl":"https://podcasts.apple.com/us/artist/wnyc/127981066?uo=4", "collectionViewUrl":"https://podcasts.apple.com/us/podcast/the-new-yorker-radio-hour/id1050430296?uo=4", "feedUrl":"http://feeds.feedburner.com/newyorkerradiohour", "trackViewUrl":"https://podcasts.apple.com/us/podcast/the-new-yorker-radio-hour/id1050430296?uo=4", "artworkUrl30":"https://is2-ssl.mzstatic.com/image/thumb/Podcasts115/v4/e3/83/42/e38342fa-712d-ec74-2f31-946601e04e27/mza_2714925949638887112.png/30x30bb.jpg", "artworkUrl60":"https://is2-ssl.mzstatic.com/image/thumb/Podcasts115/v4/e3/83/42/e38342fa-712d-ec74-2f31-946601e04e27/mza_2714925949638887112.png/60x60bb.jpg", "artworkUrl100":"https://is2-ssl.mzstatic.com/image/thumb/Podcasts115/v4/e3/83/42/e38342fa-712d-ec74-2f31-946601e04e27/mza_2714925949638887112.png/100x100bb.jpg", "collectionPrice":0.00, "trackPrice":0.00, "collectionHdPrice":0, "releaseDate":"2022-11-29T11:00:00Z", "collectionExplicitness":"notExplicit", "trackExplicitness":"cleaned", "trackCount":150, "trackTimeMillis":1097, "country":"USA", "currency":"USD", "primaryGenreName":"News Commentary", "contentAdvisoryRating":"Clean", "artworkUrl600":"https://is2-ssl.mzstatic.com/image/thumb/Podcasts115/v4/e3/83/42/e38342fa-712d-ec74-2f31-946601e04e27/mza_2714925949638887112.png/600x600bb.jpg", "genreIds":["1530", "26", "1489", "1527"], "genres":["News Commentary", "Podcasts", "News", "Politics"]}]
+}
+
+
diff --git a/test_data/https___movie_douban_com_subject_26895436_ b/test_data/https___movie_douban_com_subject_26895436_
new file mode 100644
index 00000000..ae82f9d7
--- /dev/null
+++ b/test_data/https___movie_douban_com_subject_26895436_
@@ -0,0 +1,3228 @@
+
+
+
+
+
+
+
+
+ 北海鲸梦 (豆瓣)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 北海鲸梦 The North Water
+ (2021)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 北海鲸梦的分集短评
+ · · · · · ·
+
+
+
+
+
+
+
+
+
+
+
+
1集
+
+
+
2集
+
+
+
3集
+
+
+
4集
+
+
+
5集
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 喜欢这部剧集的人也喜欢
+ · · · · · ·
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 北海鲸梦的剧评 · · · · · ·
+
+ ( 全部 29 条 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 昊子
+
+
+
+ 2021-08-31 17:33:58
+
+
+
+
+
+
+
+
+
+
+
+
+ 1 想想用击打一只海豹的方式击打一个人的头颅。 在北海波里尼捕鲸,猎豹。为的是把一只只木箱子装满鲸酯,赚成千上万英镑。剩下的鲸鱼骨头还能给当时英国女人做成裙子(petticoat)。 对,你能看到这惊心动魄的《白鲸记》场面!简直比梅尔维尔还要激动人心,而且没有他那么唠里...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 深焦DeepFocus
+
+
+ 2021-08-31 17:04:47
+
+
+
+
+
+
+
+
+
+
+
+
+ 作者:特洛伊 《北海鲸梦》第一集开篇,哲学家叔本华的一句言论缓缓出现在屏幕中央——“人间是炼狱;人是饱受折磨的灵魂也是作恶多端的魔鬼”。灵魂与魔鬼,一个讨论人的内核,一个讨论人的本性,该带有哲学意义的思考似乎在开头便已被主创安德鲁·海格提炼为剧集核心,用来描...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 悲辛無盡獨行夜
+
+
+
+ 2021-08-21 17:51:03
+
+
+
+
+
+
+
+
+
+
+
+
+ 安德鲁·海格(Andrew Haigh)新剧《北海鲸梦》(The North Water)片尾曲《驾着老战车前进》(Roll the Old Chariot Along)是一首水手号子(sea shanty),是水手们在帆船上劳作时唱的歌,往往由一名水手起头领唱,随后其他水手加入合唱,据说源自黑人灵歌(African-American spiritua...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Favillae
+
+
+
+ 2021-08-21 11:27:35
+
+
+
+
+
+
+
+
+
+
+
+
+ 船长的原计划是从巴芬湾北上向西进兰开斯特海峡,然后在那里碰瓷伪造事故沉船以骗保,之所以进兰开斯特海峡是因为一般捕鲸船不会跑到那么深的区域(捕鲸船通常在戴维斯海峡和巴芬湾区域活动,其实气候严峻的时候这片区域一样结冻得厉害,广阔的北极浮冰流足以困死再坚固的捕鲸...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 20个小明≯
+
+
+
+ 2021-08-16 15:38:23
+
+
+
+
+
+
+
+
+
+
+
+
这篇剧评可能有剧透
+
+ 酷暑难耐,热浪滚滚。 在这漫无止境的八月,up发现一部消夏神剧。 王炸团队BBC出品,改编自《纽约时报》头版畅销书,英国名导安德鲁·海格自编自导,剧组远赴北纬81°,在北极圈实景拍摄。 巨浪浮冰、暴风利雪、漫漫寒夜迎面袭来,而最让人脊背发凉的,其实是掩盖在辽阔苍茫雪...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 亲切的陆游
+
+
+
+ 2022-03-06 11:04:09
+
+
+
+
+
+
+
+
+
+
+
+
+ 萨姆纳最后在柏林动物园看到困在笼中的北极熊,其实那就是他以前的自己,饥肠辘辘、野心勃勃却被环境条件制约无法实现人生。萨姆纳小时候,父母双亡,很长一段时间内无人照管,可以想象那是一种怎样的状态,后来被父母的主治医师收养,算是稳定了一段时间,可以学医从军,但是...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SSHAFER
+
+
+
+ 2022-11-29 13:58:28
+
+
+
+
+
+
+
+
+
+
+
+
+ 深夜刷完,很有深度的电影。但基调压抑,虚无主义严重,慎重观影。 我想附上沈志明老师在《西西弗神话》中对萨德的评价:“这个极端虚无反抗主义者醉心于毁灭,要么死亡,要么重生,直逼极限的边缘:‘发现沙漠之后,就不得不生存下去’”。是为剧中鱼叉手 Drax 的写照,仔细观...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 看荐姐
+
+
+
+ 2022-10-17 23:17:09
+
+
+
+
+
+
+
+
+
+
+
+
这篇剧评可能有剧透
+
+ 第1集 比拳头,比狠,比道德无下限,比贪得无厌,船医好像一只无知小白兔走进了狼窝 看到英国人,船,19世纪,就想到《泰坦尼克号》,果然保险单一掏出..... 像《悲惨世界》底层的无序,比旅店老板夫妇更无良的人们夺一口自己的食,那个年代的服化道好像总喜欢脏兮兮得铁锈色 ...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 山山而川.
+
+
+
+ 2022-09-23 14:17:45
+
+
+
+
+
+
+
+
+
+
+
+
+ 人是饱受折磨的灵魂也是作恶多端的恶魔! 1.英音太太太太好听了 2.一点感情戏都没有 可太喜欢了! 3.全员恶人 些许压抑 一直希望医生能活到最后 不负众望 活着了 勇敢 勇敢 太勇敢 !! 看完剧想坐轮船 想看看飘在海上是什么感觉 虽然我很害怕 但想试试 英音太好听了是真的
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 小爷的五花肉
+
+
+
+ 2022-03-26 15:32:49
+
+
+
+
+
+
+
+
+
+
+
+
这篇剧评可能有剧透
+
+ 《北海鲸梦》,BBC出品,改编自《纽约时报》头版畅销书,英国名导安德鲁·海格自编自导,剧组远赴北纬81°,在北极圈实景拍摄。科林法瑞尔还是那个演技派玉面小生。 这不像是一部英剧,而更像是一部史诗级的电影,缓缓地在极寒之地的雪域下挖掘出血腥的人性。 人间是炼狱; 人...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+
+ 更多剧评
+ 29篇
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 在哪儿看这部剧集
+ · · · · · ·
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 以下片单推荐
+ · · · · · ·
+
+ (
+ 全部
+ )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 谁在看这部剧集
+ · · · · · ·
+
+
+
+
+
+
+
+
+
+
+
sss
+
+ 1小时前
+ 想看
+
+
+
+
+
+
+
+
+
+
+
苏打噜噜噜
+
+ 2小时前
+ 想看
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
订阅北海鲸梦的影评:
+ feed: rss 2.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test_data/https___movie_douban_com_subject_3541415_ b/test_data/https___movie_douban_com_subject_3541415_
new file mode 100644
index 00000000..a0721f27
--- /dev/null
+++ b/test_data/https___movie_douban_com_subject_3541415_
@@ -0,0 +1,3379 @@
+
+
+
+
+
+
+
+
+ 盗梦空间 (豆瓣)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 盗梦空间 Inception
+ (2010)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 盗梦空间的获奖情况
+ · · · · · ·
+
+ (
+ 全部
+ )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 喜欢这部电影的人也喜欢
+ · · · · · ·
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 盗梦空间的影评 · · · · · ·
+
+ ( 全部 6681 条 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 文艺复兴人
+
+
+
+ 2010-07-16 20:40:54
+
+
+
+
+
+
+
+
+
+
+
+
+ Inception 情节逻辑完全解析 (有不明白地方的进,没看过的别进) Inception 情节逻辑完全解析 (有不明白地方的进,没看过的别进) Inception就好象是玄幻小说,你必须接受它里面的无数天马行空的设定;但是它是最好的玄幻小说,因为在它的设定下情节无懈可击。所以...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Wiö
+
+
+
+ 2010-09-03 03:06:05
+
+
+
+
+
+
+
+
+
+
+
+
这篇影评可能有剧透
+
+ ** WARNING: This is long, and every word of it contains spoilers. Beware ** **注意:这很长,文章每个字都是剧透。慎入** It is NOT a dream: The WEDDING RING gives it away. 这不是个梦:婚戒泄露了真相 I have now seen this movie three times. The first time...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 高斯控
+
+
+
+ 2010-07-22 04:47:08
+
+
+
+
+
+
+
+
+
+
+
+
这篇影评可能有剧透
+
+ ( 新有一篇写的比我这篇中的数学分析更具体。 http://bbs.hoopchina.com/1009/1525287.html 我觉得一些东西是相通的, 那篇读者理解起来可能更形像 推荐给大家。 也许诺兰没学数学,读了那本书。 MIT 还有一个课件。 http://ocw.mit.edu/high-school/courses/godel-escher-ba...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 何倩彤
+
+
+
+ 2010-08-15 20:56:22
+
+
+
+
+
+
+
+
+
+
+
+
+ ★★★花絮部份★★★ 有关电影制作背后: ◆《Inception》其实早在2003年拍完《白夜追凶》时便已想投给华纳制作。而华纳也确实答应了。但当时剧本都还没写好。而Nolan也觉得不该把它当成一件差事来做,而是该慢慢的把它写好,写好了再找公司发行就行了。...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 脑洞要比脑门大
+
+
+
+ 2010-07-21 03:06:34
+
+
+
+
+
+
+
+
+
+
+
+
这篇影评可能有剧透
+
+ 开头 影片开头老saito和cobb的对话和之后小saito办晚宴不是一起的。老saito那段是结尾cobb去limbo拯救他,而小saito的晚宴是saito的梦,梦里cobb被cobol engineering派去盗取saito的秘密。Saito事后告诉他们,其实那段盗取记忆是他在audition他们,当时那个architect没过关,...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Monlina
+
+
+
+ 2010-07-20 10:08:14
+
+
+
+
+
+
+
+
+
+
+
+
+ 我是中国人,他是美国人。 我们在一起5年,结婚5个月。 7月17号晚上,刚从北京度假回来的我和丈夫一起坐在Cinemark里,专注地看《Inception》。 当Cobb的妻子要跳下去的时候,当他撕心裂肺地喊着“No!”的时候,我转过头看着我的丈夫。 他的眼眶湿了。我于是紧紧地握住他的手...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ParasItE
+
+
+
+ 2010-07-19 09:19:58
+
+
+
+
+
+
+
+
+
+
+
+
这篇影评可能有剧透
+
+ 序幕 大学时候深陷EVA和御姐情结作祟的深恋葛城美里,让我转遍了上海的小市场淘到了一个当时看来很高仿的不锈钢十字架,系着黑色的线,这些年无论我走到哪里,面对着哪一个陌生的天花板,我都会把它放在枕头底下。有一次想不起前因后果的在床上醒来,枕头上自己的头发一根根的...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 张佳玮
+
+
+
+ 2010-09-06 19:33:32
+
+
+
+
+
+
+
+
+
+
+
+
+ 看《盗梦空间》时脑子里依次不讲道理瞎蹦出来的,简略摘:《黑客帝国》,郑渊洁老师《第3180号专利》里的做梦帽,《世界尽头冷酷仙境》里“世界尽头”的虚拟世界构筑,埃舍尔楼梯,黄粱,庄周梦蝶,博尔赫斯的《双梦记》和《南方》以及其他名字忘掉意境类似的东西,《爱德华大...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 水木丁
+
+
+
+ 2010-09-12 13:11:14
+
+
+
+
+
+
+
+
+
+
+
+
+ 和COCO小姐一起去看《盗梦空间》,没有想象的那么复杂,关于技术的问题,我们只是出来以后简单的交换了几个情节,其他的到是很好理解。看电影的过程中,COCO小姐问我,你说如果咱俩坐在电影院里是场梦,醒来以后发现自己在家呢怎么办,我说那到不可怕,怕的就是醒来以后发现自...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Anthony
+
+
+
+ 2010-09-05 12:06:20
+
+
+
+
+
+
+
+
+
+
+
+
这篇影评可能有剧透
+
+ 建议看完的人再来看这。有不对的可以说出来,毕竟我也不敢我是对的。有很多人说《盗梦空间》还是在梦里,是个悲剧。又有很多人说这是诺兰的开放式结局,但是诺兰向来不用开放式这种方式来结局。其实结局是柯布回到了现实,两点证据,证据一:科布他一直忘不了妻子,一直以自己...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+
+ 更多影评
+ 6681篇
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 关于《盗梦空间》的问题
+ · · · · · ·
+
+ (
+ 全部111个
+ )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 在哪儿看这部电影
+ · · · · · ·
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本片原声正在播放
+ · · · · · ·
+
+
+
去豆瓣音乐收听
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 以下片单推荐
+ · · · · · ·
+
+ (
+ 全部
+ )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 谁在看这部电影
+ · · · · · ·
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
订阅盗梦空间的评论:
+ feed: rss 2.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test_data/https___movie_douban_com_subject_3627919_ b/test_data/https___movie_douban_com_subject_3627919_
new file mode 100644
index 00000000..a16e118a
--- /dev/null
+++ b/test_data/https___movie_douban_com_subject_3627919_
@@ -0,0 +1,3301 @@
+
+
+
+
+
+
+
+
+ 神秘博士 第四季 (豆瓣)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 神秘博士 第四季 Doctor Who Season 4
+ (2008)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 神秘博士 第四季的分集短评
+ · · · · · ·
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 喜欢这部剧集的人也喜欢
+ · · · · · ·
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 神秘博士 第四季的剧评 · · · · · ·
+
+ ( 全部 63 条 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 坐等1900
+
+
+
+ 2009-07-16 01:04:38
+
+
+
+
+
+
+
+
+
+
+
+
+ 从最开始时断时续的看Doctor Who,到最近一集不落的赶,越来越喜欢这部剧,也越来越不舍得第十任Doctor离开。 第一季的时候并不是非常喜欢科幻类型的片子,因而对第九任并没有太多留恋,虽然第一季末因为他的一句话无可救药喜欢上了这部天马行空的英剧。第二季,DT出现,不是因...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Allan
+
+
+
+ 2010-07-26 19:39:16
+
+
+
+
+
+
+
+
+
+
+
+
+ Doctor Who S0407说的是阿加莎克里斯蒂身边发生的一起神秘事件,在台词中埋了不少的彩蛋,不少台词其实是阿加莎的书名,以下是就我当时听出来的一些做一个整理。 1.博士和阿加莎两人最初去追逐巨大的黄蜂时,阿加莎不相信就巨大的黄蜂这种生物,说了一句“They do it with mirr...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ✪ω✪
+
+
+
+ 2014-06-13 11:29:48
+
+
+
+
+
+
+
+
+
+
+
+
+ 多娜是普通人,是底层的一员,跟普通人一样工作不出色,生活不出色,会因为车位问题跟人家吵架,会梦想一夜暴富买彩票,心底想着给挣大钱让爷爷过的更舒服。 多娜比罗斯和玛莎其实都惨,因为罗斯家穷但是有男友米奇的爱,玛莎没男友但是有高学历(职业医生),而多娜除了爷爷...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Charlie.G
+
+
+
+ 2012-09-03 22:54:43
+
+
+
+
+
+
+
+
+
+
+
+
这篇剧评可能有剧透
+
+ 看到第四季的时候突然想到这是dtt的最后一季了,俨然已经变成了dtt脑残粉的我于是零零碎碎的边看边回忆记下了一点感想,权当纪念一下吧。 PS,最后一段是对S5和小11的吐槽,非喜慎看。 ==================================================== S2 ROSE 燃烧一颗星球来向...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ sheepwhite
+
+
+
+ 2010-10-12 21:40:11
+
+
+
+
+
+
+
+
+
+
+
+
+ DW最吸引人的东西是DRAMA。DRAMA就是剧情百转千回、感情悱恻纠结、场面恢宏壮丽。DW每一集并不特别精彩,但电视剧的优势是长,可以慢慢铺垫,层层升高,最后到第四季结局上演了一出辉煌的太空歌剧。 DW常用的一个DRAMA手法是利用神奇的力量和封神,比如第一季结局是时间的力量...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 红豆芒果小西瓜
+
+
+
+ 2014-05-13 22:49:19
+
+
+
+
+
+
+
+
+
+
+
+
+ 我以为Rose在平行世界的恶狼湾跟Doctor告别的那一集就已经是虐心的顶峰了,Doctor最后一句话还没说出口,新行星爆裂产生的能量就用光了。 Doctor的那句“我燃烧一颗行星来向你说再见”,直接让我泪奔。 我真的以为这个程度已经是BBC的极限了,没想到我高估了他们的善良。 这...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ arne
+
+
+
+ 2010-05-12 23:56:35
+
+
+
+
+
+
+
+
+
+
+
+
+ (才看完第四季,各种番外篇还未看。) 人说只有在大雨中才会更深显露人的落寞和孤独。 四季末最后的镜头,雨中的博士,落寞回到TARDIS中,脱掉淋湿的西装上衣,一脸孤寂的望着沉静飞船的操作台。有一丝忧郁悄悄的进入我的心中,默默碎裂,裂缝无数,愈发心思沉重...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 老葡
+
+
+
+ 2015-01-07 19:00:40
+
+
+
+
+
+
+
+
+
+
+
+
这篇剧评可能有剧透
+
+ 第四季10集,这一集中,突发事件,群体的反应真是很有趣。 开往蓝宝石瀑布的宇宙卡车中,乘客分为:教授与他的研究员,一对夫妇和儿子,一个单身女人,Doctor。工作人员为一个女乘务员,司机和机师。 当危机开始,工作人员首先试图掩盖事实,让大家冷静。后来发生了不寻常的...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 葡萄
+
+
+
+ 2017-02-15 17:05:44
+
+
+
+
+
+
+
+
+
+
+
+
+ 不知不觉断断续续的追完了博士前四季,也就是RTD主编的全部剧集。魔法特主编的目前只看了一集半,还是有不适感,不知道之后的能不能继续看下去。因为没有看完所以无从比较,从旁人的观点来看,多数都认为RTD的风格是宏观大气悲悯,而魔法特的风格是有趣新奇温暖。所以反过来讲...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ CC
+
+
+
+ 2016-08-27 00:54:41
+
+
+
+
+
+
+
+
+
+
+
+
这篇剧评可能有剧透
+
+ 因为在圣诞特别篇里Donna出现过,她的出现我倒是并不反感,只是玛莎走掉还是觉得很遗憾。而且这一集Rose又回来了,那是什么鬼。 Donna在最初与博士分开后,觉得自己的生活将有所变化,并真的做了一些改变,只是到最后,生活那是原来那个样子,无聊又毫无生机。这是一件令人难过...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+
+ 更多剧评
+ 63篇
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本片原声正在播放
+ · · · · · ·
+
+
+
去豆瓣音乐收听
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 以下片单推荐
+ · · · · · ·
+
+ (
+ 全部
+ )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 谁在看这部剧集
+ · · · · · ·
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
沙蓬元帅
+
+ 12月6日
+ 想看
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
订阅神秘博士 第四季的影评:
+ feed: rss 2.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test_data/https___movie_douban_com_subject_4296866_ b/test_data/https___movie_douban_com_subject_4296866_
new file mode 100644
index 00000000..fb5d45d7
--- /dev/null
+++ b/test_data/https___movie_douban_com_subject_4296866_
@@ -0,0 +1,2522 @@
+
+
+
+
+
+
+
+
+ 神秘博士:逃跑新娘 (豆瓣)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 神秘博士:逃跑新娘 Doctor Who: The Runaway Bride
+ (2006)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 喜欢这部电影的人也喜欢
+ · · · · · ·
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 神秘博士:逃跑新娘的影评 · · · · · ·
+
+ ( 全部 1 条 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 遥若离
+
+
+
+ 2013-05-23 10:12:23
+
+
+
+
+
+
+
+
+
+
+
+
这篇影评可能有剧透
+
+ S03E00 Christmas Special 一 初见Donna时, 我真心讨厌她。 大呼小叫、举止粗鲁、完全是一个泼妇的表现,用现在流行的话来说,她几乎完全符合了女屌丝这一称谓。尤其是那些大呼小叫着的发问揭开Doctor的痛楚,也戳到了我的伤心处。即使是这...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+
+ 更多影评
+ 1篇
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 在哪儿看这部电影
+ · · · · · ·
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 以下片单推荐
+ · · · · · ·
+
+ (
+ 全部
+ )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 谁在看这部电影
+ · · · · · ·
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
订阅神秘博士:逃跑新娘的评论:
+ feed: rss 2.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test_data/https___music_douban_com_subject_33551231_ b/test_data/https___music_douban_com_subject_33551231_
new file mode 100644
index 00000000..8e13b9de
--- /dev/null
+++ b/test_data/https___music_douban_com_subject_33551231_
@@ -0,0 +1,1109 @@
+
+
+
+
+
+
+
+
+ The Race For Space (豆瓣)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The Race For Space
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 表演者:
+
+ Public Service Broadcasting
+
+
+
+
+
+
+
+
流派: 爵士
+
+
+
+
+
+
专辑类型: 专辑
+
+
+
+
+
+
发行时间: 2015-02-23
+
+
+
+
+
+
出版者: Believe Sas
+
+
+
+
+
+
条形码: 3610159662676
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 谁听这张唱片?
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
石斑鱼
+
+
2021年12月3日想听
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
>
+ 4人听过
+
+
+
>
+ 2人想听
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
订阅关于The Race For Space的评论:
+ feed: rss 2.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test_data/https___store_steampowered_com_app_620 b/test_data/https___store_steampowered_com_app_620
new file mode 100644
index 00000000..d6d271ad
--- /dev/null
+++ b/test_data/https___store_steampowered_com_app_620
@@ -0,0 +1,2717 @@
+
+
+
+
+
+
+ Steam 上的 Portal 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test_data/https___www_douban_com_game_10734307_ b/test_data/https___www_douban_com_game_10734307_
new file mode 100644
index 00000000..2d007b57
--- /dev/null
+++ b/test_data/https___www_douban_com_game_10734307_
@@ -0,0 +1,2044 @@
+
+
+
+
+
+
+
+
+ 传送门2 Portal 2 (豆瓣)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
传送门2 Portal 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 类型:
+
+ 游戏
+ /
+ 第一人称射击
+ /
+ 益智
+ /
+ 射击
+ /
+ 动作
+
+
+ 平台:
+
+
+ PC
+ /
+ Mac
+ /
+ PS3
+ /
+ Xbox 360
+ /
+ Linux
+
+
+ 开发商:
+
+ Valve Corporation
+
+ 发行商:
+
+ Valve Corporation / Electronic Arts
+
+ 发行日期:
+
+ 2011-04-19
+
+
+
+
+
+
+
+
+
+
+
+
+
豆瓣评分
+
+
+
+
+
+
+ 5星
+
+
+
+
+
+
81.3%
+
+
+
+
+ 4星
+
+
+
+
+
+
15.1%
+
+
+
+
+ 3星
+
+
+
+
+
+
3.0%
+
+
+
+
+ 2星
+
+
+
+
+
+
0.4%
+
+
+
+
+ 1星
+
+
+
+
+
+
0.2%
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
写文字
+
写攻略
+
+
+
+
+
+ 分享
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 传送门2 的游戏视频
+ · · · · · ·
+ (
+
+ 全部 1 个 · 添加视频
+ )
+
+
+
+
+
+
+
+
+
+
+
+
+ 传送门2 的游戏图片
+ · · · · · ·
+ (
+
+ 全部82张 · 添加图片
+ )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 简介
+ · · · · · ·
+
+
+
开发者:Valve 发行时间:04/18/2011 平台:Macintosh, PlayStation 3, Windows, Xbox 360 类型:Action 视角:1st-Person Perspective, Platform 评分: IGN 9.5/10 GameSpot 9/10 奖项: GameStar 2011 - #3 PC Action Game of the Year (Readers‘ Vote) PC Games Issue 01/2012 - Best Game in 2011 (Editor‘s Choice, together with Batman: Arkham City and The Elder Scrolls V: Skyrim Issue 01/2012 - #2 Best Action-Adventure in 2011 (Reader‘s Choice) Xbox 360 Achievements 2011 - Best Story Portal 2 is the sequel to Portal and offers the same first-person puzzle-platform gameplay. Players continue the story taking the role of the young woman Chell, who defeated the artificial intelligence computer system GLaDOS in the first game. After the events of the first game, she was placed in stasis until eventually woken up again. The sequel still takes place at Aperture Science Labs, but it is now overrun by decay and nature. Much more than in the first game, Chell moves past the clean test chambers and explores the gloomy industrial setting of the laboratory. Just like in the first game, the gameplay is based around portals. By shooting a starting portal and ending portal at suitable surfaces, certain uncrossable gaps can be bridged. Just like in the first game, there are also many test chambers where puzzles need to be solved, using cubes, turrets, platforms and special portal tricks to gain a lot of speed. GLaDOS makes a return to tease Chell and she plots revenge for her destruction, but there are a large number of twists that make her role very different from in the first game. Chell receives help from Wheatley, a small robot who opens entrances for her and provides witty insights about the environment. New elements to the sequel‘s gameplay include light bridges, laser redirection and paint-like gels, incorporated through the work of the student project Tag: The Power of Paint. Gels provide extra speed, a jump or neutralize the effects. They can also be used with objects such as cubes or turrets. The game’s two-player cooperative mode is entirely new and features its own entirely separate campaign with a unique story, test chambers, and two new player characters (Atlas and P-body). The PlayStation 3 version incorporates some elements of the Steamworks toolset and allows for cross-platform games against PC players.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 巨牙海民
+
+
+
+ 2017-03-01 17:57:56
+
+
+
+
+
+
+
+
+
+
+
+
+ 没攻略我就写一个吧,这个游戏你唯一应该看攻略的地方就是:别犹豫了,买吧 这就像你小时候的某个幻想,然后有一群神帮你把它还原了。不是电影,是游戏,你可以参与其中的游戏。 如果你觉得纪念碑谷类的高分解密游戏其实在侮辱你的智商,那你一定要玩。 速度和加速度在门之间都...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 萨尔斯堡的树枝
+
+
+
+ 2022-02-04 21:19:01
+
+
+
+
+
+
+
+
+
+
+
+
+ 失眠的第12个小时 我在很久没出现过的游戏群里问, “最近有啥游戏比较好玩的吗?” 然后根本忘记我提过这个问题, 下一秒打开《黑客帝国》看了起来。 (每年都会重看一遍1-3,本人还是小学生的时候第一次看黑客帝国觉得灵魂都被撼动了,太好看了以至于我觉得我都不配给它写影...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 留象鸣
+
+
+
+ 2015-04-21 22:01:21
+
+
+
+
+
+
+
+
+
+
+
+
+ “如果把《传送门2》比做是普通成年人难度,那么相比之下移动设备上的《纪念碑谷》简直就是婴儿难度。” 《一代宗师》中宫羽田在他的南方引退仪式上比的不是武功,是想法。 2011年4月Valve公司发行了《传送门》的续作《传送门2》。作为一款另类的射击游戏,《传送门》比的...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 小彼
+
+
+
+ 2015-05-04 01:29:56
+
+
+
+
+
+
+
+
+
+
+
+
+ 正如Valve官方放出的某个宣传视频一样,这款游戏非常适合送给你的女票。当然,你要确保对方不晕3D,否则像这种上上下下飞来飞去的游戏要比普通的FPS更容易让人晕的。恋爱中的两人,尤其是对异地恋来说,没什么可一起做的事情,就一起玩游戏吧。 Portal 2支持双人coop,不多不少...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Thesharing
+
+
+
+ 2015-08-31 00:09:13
+
+
+
+
+
+
+
+
+
+
+
+
+ 之前听室友说《传送门2》很好玩,在圣诞打折的时候入了正开始玩,玩到一半的时候实在为智商感到捉急,于是弃坑不玩。 寒假的时候闲着无事又捡起来玩,结果一口气通关,看到最后炮塔们共鸣齐响,感觉整个心都跟着它们一起动起来了。然后怒入《传送门》,把剧情补齐。 作为一个...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Kensnow
+
+
+
+ 2019-10-21 12:57:09
+
+
+
+
+
+
+
+
+
+
+
+
+ 作为一个剧情狗,我向来比较少打解谜游戏,对科幻和废土朋克题材也不太感兴趣。之所以翻箱倒柜重新装好PS3玩传送门2的原因只有一个:它经常出现在某某游戏排行榜单的前几名,比如这次IGN TOP100中它又排在第3位,引发了我无尽的好奇心 在游戏的第一部分,我和所有萌新一样学习...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ vegue
+
+
+
+ 2016-01-30 11:09:45
+
+
+
+
+
+
+
+
+
+
+
+
+ 传送门2与第一版的一个比较大的区别是增加了双人模式,极大地丰富了游戏的体验。去年买了传送门2的XBox的正版碟,一番苦战后打完单人模式,觉得这游戏特别给力,脑洞够大,关卡设计合理,画面也还不错。而且我很喜欢GlaDOS, EVA这样有点阴谋论的东西。 后来玩双人模式...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 嘉术2015
+
+
+
+ 2020-02-24 17:52:31
+
+
+
+
+
+
+
+
+
+
+
+
+ “这句是错的”前半句就是悖论本身,后半句“别想了,别想了”是glados对自己说的。” 这是很有名的“说谎悖论” “这句话是错的”如果是错的,那它表达的意思就是对的,如果是对的,就又和句子本身的意思相矛盾。 对于只能用逻辑和算法思考的ai,一直深入去想就只能是短路了,...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ❤INABA❤
+
+
+
+ 2020-05-23 14:46:10
+
+
+
+
+
+
+
+
+
+
+
+
+ 游戏的核心是玩家使用名为"光圈科技手持传送门设备"(Aperture Science Handheld Portal Device,简称"传送门枪"),来通过各种难关。所有的关卡目的都很类似,那就是将一个具有重量的物体放在一个圆形的按钮(游戏内名称"光圈科学超大型撞击按钮")上,通常这个物体是一个方块体(...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ┟西﹎;瓜╃
+
+
+
+ 2018-07-01 16:24:37
+
+
+
+
+
+
+
+
+
+
+
+
+ 每次玩PORTAL2都会被3D晕到恶心,每通过三四关就要关电脑躺下来,隔段时间才能继续。但是这是一个“通关就能说明我聪明”的游戏,作为一个喜欢向别人炫耀智商的人怎么可能不被通关的成就感吸引呢.... 于是忍着恶心打到了最后,原以为就是一个解谜通关的冰冷游戏但是却被结尾的...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 小坑坑
+
+
+
+ 2021-12-06 20:41:50
+
+
+
+
+
+
+
+
+
+
+
+
+ 通关传送门系列确实是一次非常独特的美妙的游戏旅程,从一个速通视频入坑,想要趁着秋促看看传送门系列是否打折,却发现其实已在库中。早在起源引擎的csgo里摸爬滚打了很久,却是第一款真正让我有些晕3D的游戏,这大概是不停旋转、重力方向更迭的游戏画面惹的祸吧。尽管如此,...
+
+ (
展开 )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+
+ 更多文字
+ 24篇
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 以下豆列推荐
+ · · · · · ·
+ (
+
+ 全部
+ )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 谁玩这部游戏
+ · · · · · ·
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Geist
+
+ 今天凌晨
+ 想玩
+
+
+
+
+
+
+
+
+
+
+
Shaun
+
+ 今天凌晨
+ 玩过
+
+
+
+
+
+
+
+
+
+
+
不逢林
+
+ 今天凌晨
+ 玩过
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 游戏资料贡献者
+ · · · · · ·
+ (
+
+ 全部14人
+ )
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test_data/https___www_douban_com_location_drama_24849279_ b/test_data/https___www_douban_com_location_drama_24849279_
new file mode 100644
index 00000000..47b2286d
--- /dev/null
+++ b/test_data/https___www_douban_com_location_drama_24849279_
@@ -0,0 +1,1344 @@
+
+
+
+
+
+
+
+
+ 红花侠 - 音乐剧 (豆瓣)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
红花侠的剧情简介 · · · · · ·
+
+
+
+
+
タイトルの「スカーレット・ピンパーネル(紅はこべ)」は、フランス革命の最中、革命政府に捕らえられた貴族達を救い出す、イギリスの秘密結社。その首領パーシー・ブレイクニーと、革命政府全権大使として組織の壊滅に乗り出したショーヴランとのかけひきを、パーシーの妻マルグリットを交えた三人の愛憎を絡ませながら描き出した冒険活劇です。
原作は歴史小説、探偵小説で有名な、イギリスの作家バロネス・オルツィの小説「THE SCARLET PIMPERNEL」。この小説は1905年にロンドンで出版されましたが、出版前の1903年にまずオルツィの戯曲化によりノッティンガムで上演されます。その後ロンドンでも上演され、4年間のロングラン公演と...
+
タイトルの「スカーレット・ピンパーネル(紅はこべ)」は、フランス革命の最中、革命政府に捕らえられた貴族達を救い出す、イギリスの秘密結社。その首領パーシー・ブレイクニーと、革命政府全権大使として組織の壊滅に乗り出したショーヴランとのかけひきを、パーシーの妻マルグリットを交えた三人の愛憎を絡ませながら描き出した冒険活劇です。
原作は歴史小説、探偵小説で有名な、イギリスの作家バロネス・オルツィの小説「THE SCARLET PIMPERNEL」。この小説は1905年にロンドンで出版されましたが、出版前の1903年にまずオルツィの戯曲化によりノッティンガムで上演されます。その後ロンドンでも上演され、4年間のロングラン公演となる大評判となりました。その評判を受けて小説が出版され、大ベストセラーとなったのです。その後、オルツィは次々と続編を発表し、「THE SCARLET PIMPERNEL」はシリーズ化されていきます。
1917年にはアメリカで白黒・無声映画として映画化され(リチャード・スタントン監督、ダスティン・ファーナム主演)、その後1934年、1950年にはイギリスでも映画化。1955年を皮切りにイギリス、アメリカでテレビドラマとしても5度にわたり取り上げられています。
+
显示全部
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 红花侠的演出版本 · · · · · ·
+ ( 添加版本 )
+
+
+
+
+
+
+
+
08星组公演版
+
+
+
+
+
+
+
+ 导演:
+
+小池修一郎
+
+
+
+ 编剧:
+
+小池修一郎 /
+Baroness Orczy(原作)
+
+
+
+
+
+
+
+ 主演:
+
+安蘭けい (饰 パーシー・ブレイクニー) /
+柚希礼音 (饰 ショーヴラン) /
+遠野あすか (饰 マルグリット・サン・ジュスト)
+
+
+
+
+ 语言:
+ 日语Japanese
+
+
+
+ 演出日期:
+ 2008-06-20-08-04
+
+
+
+ 演出团体:
+
+星组
+
+
+
+ 演出剧院:
+
+宝塚大劇場
+
+
+
+
+
+
+
+
+
10年月組公演版
+
+
+
+
+
+
+
+ 导演:
+
+小池修一郎
+
+
+
+ 编剧:
+
+Baroness Orczy(原作) /
+小池修一郎
+
+
+
+
+
+
+
+ 主演:
+
+霧矢大夢 (饰 パーシー・ブレイクニー) /
+龍真咲 (饰 ショーヴラン) /
+蒼乃夕妃 (饰 マルグリット・サン・ジュスト)
+
+
+
+
+ 语言:
+ 日语Japanese
+
+
+
+ 演出日期:
+ 2010-04-16-05-17
+
+
+
+ 演出团体:
+
+月組
+
+
+
+ 演出剧院:
+
+宝塚大劇場
+
+
+
+
+
+
+
+
+
17年星組公演版
+
+
+
+
+
+
+
+ 导演:
+
+小池 修一郎
+
+
+
+ 编剧:
+
+Baroness Orczy(原作) /
+小池 修一郎
+
+
+
+
+
+
+
+ 主演:
+
+紅 ゆずる (饰 パーシー・ブレイクニー) /
+礼 真琴 (饰 ショーヴラン) /
+綺咲 愛里 (饰 マルグリット・サン・ジュスト)
+
+
+
+
+ 语言:
+ 日语
+
+
+
+ 演出日期:
+ 2017-03-10-17
+
+
+
+ 演出团体:
+
+星组
+
+
+
+ 演出剧院:
+
+宝塚大剧场
+
+
+
+
+
+
+
+
+
ミュージカル(2017年)版
+
+
+
+
+
+
+
+ 导演:
+
+石丸さち子
+
+
+
+
+
+
+
+
+
+ 主演:
+
+石丸幹二 (饰 パーシー・ブレイクニー) /
+石井一孝 (饰 ショーヴラン) /
+安蘭けい (饰 マルグリット・サン・ジュスト) /
+上原理生 /
+泉見洋平 /
+松下洸平 (饰 アルマン)
+
+
+
+
+ 语言:
+ 日语
+
+
+
+ 演出日期:
+ 2017-11-13
+
+
+
+
+
+ 演出剧院:
+
+梅田芸術劇場メインホール
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 以下豆列推荐· · · · · ·
+ (全部 )
+
+
+
+
+
+
+
+
谁看这部剧?
+
+
+
+
+
+
+
+
+
+
+ 奔袭
+
+
+ 11月27日想看
+
+
+
+
+
+
+
+
+
+
+ Z
+
+
+ 11月22日看过
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 月夜矢
+
+
+ 11月27日想看
+
+
+
+
+
+
+ > 326人看过
+
+
+ > 169人想看
+
+
+
+
+
+
+
+
+
喜欢这部剧的人也可能喜欢 · · · · · ·
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test_data/https___www_goodreads_com_book_show_11798823 b/test_data/https___www_goodreads_com_book_show_11798823
new file mode 100644
index 00000000..3edf198c
--- /dev/null
+++ b/test_data/https___www_goodreads_com_book_show_11798823
@@ -0,0 +1,20 @@
+黄金时代 by Wang Xiaobo | Goodreads Jump to ratings and reviews 这是以文革时期为背景的系列作品构成的长篇。发生“文化大革命”的二十世纪六七十年代,正是我们国家和民族的灾难年代。那时,知识分子群体无能为力而极“左”政治泛滥横行。作为倍受歧视的知识分子,往往丧失了自我意志和个人尊严。在这组系列作品里面,名叫“王二”的男主人公处于恐怖和荒谬的环境,遭到各种不公正待遇,但他却摆脱了传统文化人的悲愤心态,创造出一种反抗和超越的方式:既然不能证明自己无辜,便倾向于证明自己不无辜。于是他以性爱作为对抗外部世界的最后据点,将性爱表现得既放浪形骸又纯净无邪,不但不觉羞耻,还轰轰烈烈地进行到底,对陈规陋习和政治偏见展开了极其尖锐而又饱含幽默的挑战。一次次被斗、挨整,他都处之坦然,乐观为本,获得了价值境界上的全线胜利。作者用一种机智的光辉烛照当年那种无处不在的压抑,使人的精神世界从悲惨暗淡的历史阴影中超拔出来。
375 pages, Paperback
First published January 1, 1991
About the author Wang Xiaobo (Chinese: 王小波 ) was a Chinese writer who became famous after his death.Wang Xiaobo on paper-republic.org . Wang was born in an intellectual family in Beijing in 1952. He was sent to a farm in Yunnan province as an "intellectual youth" at the beginning of the Cultural Revolution in 1968. In 1971, he was sent to the countryside of Shandong province, and became a teacher. In 1972, he was allowed to return to Beijing, and he got a job as a working in a local factory. He met Li Yinhe in 1977, who was working as an editor for "Guangming Daily", and she later became his wife. He was accepted by Renmin University of China in 1978 where he studied economics and trade and got his Bachelor's Degree. He received his Master's Degree at the University of Pittsburgh in 1988. After he returned to China, he began to teach at Peking University and Renmin University of China. He quit his job as a college lecturer in 1992, and became a freelance writer. On April 11, 1997 he died suddenly of heart disease at his apartment.
Can't find what you're looking for? Get help and learn more about the design.
\ No newline at end of file
diff --git a/test_data/https___www_goodreads_com_book_show_3597767 b/test_data/https___www_goodreads_com_book_show_3597767
new file mode 100644
index 00000000..56f729b6
--- /dev/null
+++ b/test_data/https___www_goodreads_com_book_show_3597767
@@ -0,0 +1,20 @@
+Rok 1984 by George Orwell | Goodreads Jump to ratings and reviews 1984 (tytuł oryginalny: Nineteen Eighty-Four) – futurystyczna antyutopia o licznych podtekstach politycznych, napisana przez George’a Orwella i opublikowana w roku 1949. Autor napisał ją pod wpływem kontaktu z praktyczną stroną ideologii komunistycznej, do jakiego po raz pierwszy doszło w Hiszpanii w 1938 roku (w czasie wojny domowej), gdzie pojechał jako dziennikarz i sympatyk strony republikańskiej. Pierwsze polskie tłumaczenie - Juliusza Mieroszewskiego opublikowane zostało na emigracji w Instytucie Literackim w Paryżu w roku 1953. Do upadku ustroju komunistycznego w Polsce (1989) była to powieść zakazana przez cenzurę, od roku 1980 była jednak publikowana w postaci przedruków z wydania paryskiego w wydawnictwach niezależnych - tzw. "drugiego obiegu". Wszystkie wydania krajowe oficjalne od 1988 r. ukazały się w tłumaczeniu Tomasza Mirkowicza. Do kultury masowej przeniknęły pewne pojęcia z tej powieści np. Wielki Brat (ang. Big Brother), nowomowa (ang. newspeak) czy unperson (polityk odsunięty od wpływów lub obywatel o wrogich lub nieortodoksyjnych poglądach politycznych).
206 pages, Paperback
First published June 8, 1949
About the author Eric Arthur Blair , better known by his pen name George Orwell , was an English author and journalist. His work is marked by keen intelligence and wit, a profound awareness of social injustice, an intense opposition to totalitarianism, a passion for clarity in language, and a belief in democratic socialism. In addition to his literary career Orwell served as a police officer with the Indian Imperial Police in Burma from 1922-1927 and fought with the Republicans in the Spanish Civil War from 1936-1937. Orwell was severely wounded when he was shot through his throat. Later the organization that he had joined when he joined the Republican cause, The Workers Party of Marxist Unification (POUM), was painted by the pro-Soviet Communists as a Trotskyist organization (Trotsky was Joseph Stalin's enemy) and disbanded. Orwell and his wife were accused of "rabid Trotskyism" and tried in absentia in Barcelona, along with other leaders of the POUM, in 1938. However by then they had escaped from Spain and returned to England. Between 1941 and 1943, Orwell worked on propaganda for the BBC. In 1943, he became literary editor of the Tribune, a weekly left-wing magazine. He was a prolific polemical journalist, article writer, literary critic, reviewer, poet, and writer of fiction, and, considered perhaps the twentieth century's best chronicler of English culture. Orwell is best known for the dystopian novel Nineteen Eighty-Four (published in 1949) and the satirical novella Animal Farm (1945) — they have together sold more copies than any two books by any other twentieth-century author. His 1938 book Homage to Catalonia , an account of his experiences as a volunteer on the Republican side during the Spanish Civil War, together with numerous essays on politics, literature, language, and culture, have been widely acclaimed. Orwell's influence on contemporary culture, popular and political, continues decades after his death. Several of his neologisms, along with the term "Orwellian" — now a byword for any oppressive or manipulative social phenomenon opposed to a free society — have entered the vernacular.
4,010,848 ratings 95,224 reviews
Can't find what you're looking for? Get help and learn more about the design.
\ No newline at end of file
diff --git a/test_data/https___www_goodreads_com_book_show_40961427 b/test_data/https___www_goodreads_com_book_show_40961427
new file mode 100644
index 00000000..cff86c6c
--- /dev/null
+++ b/test_data/https___www_goodreads_com_book_show_40961427
@@ -0,0 +1,20 @@
+1984 by George Orwell | Goodreads Jump to ratings and reviews Among the seminal texts of the 20th century, Nineteen Eighty-Four is a rare work that grows more haunting as its futuristic purgatory becomes more real. Published in 1949, the book offers political satirist George Orwell's nightmarish vision of a totalitarian, bureaucratic world and one poor stiff's attempt to find individuality. The brilliance of the novel is Orwell's prescience of modern life—the ubiquity of television, the distortion of the language—and his ability to construct such a thorough version of hell. Required reading for students since it was published, it ranks among the most terrifying novels ever written.
298 pages, Kindle Edition
First published June 8, 1949
About the author Eric Arthur Blair , better known by his pen name George Orwell , was an English author and journalist. His work is marked by keen intelligence and wit, a profound awareness of social injustice, an intense opposition to totalitarianism, a passion for clarity in language, and a belief in democratic socialism. In addition to his literary career Orwell served as a police officer with the Indian Imperial Police in Burma from 1922-1927 and fought with the Republicans in the Spanish Civil War from 1936-1937. Orwell was severely wounded when he was shot through his throat. Later the organization that he had joined when he joined the Republican cause, The Workers Party of Marxist Unification (POUM), was painted by the pro-Soviet Communists as a Trotskyist organization (Trotsky was Joseph Stalin's enemy) and disbanded. Orwell and his wife were accused of "rabid Trotskyism" and tried in absentia in Barcelona, along with other leaders of the POUM, in 1938. However by then they had escaped from Spain and returned to England. Between 1941 and 1943, Orwell worked on propaganda for the BBC. In 1943, he became literary editor of the Tribune, a weekly left-wing magazine. He was a prolific polemical journalist, article writer, literary critic, reviewer, poet, and writer of fiction, and, considered perhaps the twentieth century's best chronicler of English culture. Orwell is best known for the dystopian novel Nineteen Eighty-Four (published in 1949) and the satirical novella Animal Farm (1945) — they have together sold more copies than any two books by any other twentieth-century author. His 1938 book Homage to Catalonia , an account of his experiences as a volunteer on the Republican side during the Spanish Civil War, together with numerous essays on politics, literature, language, and culture, have been widely acclaimed. Orwell's influence on contemporary culture, popular and political, continues decades after his death. Several of his neologisms, along with the term "Orwellian" — now a byword for any oppressive or manipulative social phenomenon opposed to a free society — have entered the vernacular.
4,010,785 ratings 95,219 reviews
Can't find what you're looking for? Get help and learn more about the design.
\ No newline at end of file
diff --git a/test_data/https___www_goodreads_com_book_show_45064996 b/test_data/https___www_goodreads_com_book_show_45064996
new file mode 100644
index 00000000..2d648e6e
--- /dev/null
+++ b/test_data/https___www_goodreads_com_book_show_45064996
@@ -0,0 +1,1509 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Hyperion (Hyperion Cantos, #1) by Dan Simmons | Goodreads
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Jump to ratings and reviews
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Rate this book
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Rate this book
+
+
+
+
+
+
+
+
+
+
+
+ A stunning tour de force filled with transcendent awe and wonder,
+ Hyperion
+ is a masterwork of science fiction that resonates with excitement and invention, the first volume in a remarkable epic by the multiple-award-winning author of
+ The Hollow Man
+ .
+
+
+
+ On the world called Hyperion, beyond the reach of galactic law, waits a creature called the Shrike. There are those who worship it. There are those who fear it. And there are those who have vowed to destroy it. In the Valley of the Time Tombs, where huge, brooding structures move backward through time, the Shrike waits for them all.
+
+
+ On the eve of Armageddon, with the entire galaxy at war, seven pilgrims set forth on a final voyage to Hyperion seeking the answers to the unsolved riddles of their lives. Each carries a desperate hope—and a terrible secret. And one may hold the fate of humanity in his hands.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
483 pages, Kindle Edition
+
First published May 26, 1989
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Loading interface...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Loading interface...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
About the author
+
+
+
+
+
+
+
+
+
+
+ 222
+
+ books
+
+ 10.8k
+
+ followers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Dan Simmons
+ grew up in various cities and small towns in the Midwest, including Brimfield, Illinois, which was the source of his fictional "Elm Haven" in 1991's SUMMER OF NIGHT and 2002's A WINTER HAUNTING. Dan received a B.A. in English from Wabash College in 1970, winning a national Phi Beta Kappa Award during his senior year for excellence in fiction, journalism and art.
+
+
+ Dan received his Masters in Education from Washington University in St. Louis in 1971. He then worked in elementary education for 18 years—2 years in Missouri, 2 years in Buffalo, New York—one year as a specially trained BOCES "resource teacher" and another as a sixth-grade teacher—and 14 years in Colorado.
+
+
+ ABOUT DAN
+
+ Biographic Sketch
+
+
+ His last four years in teaching were spent creating, coordinating, and teaching in APEX, an extensive gifted/talented program serving 19 elementary schools and some 15,000 potential students. During his years of teaching, he won awards from the Colorado Education Association and was a finalist for the Colorado Teacher of the Year. He also worked as a national language-arts consultant, sharing his own "Writing Well" curriculum which he had created for his own classroom. Eleven and twelve-year-old students in Simmons' regular 6th-grade class averaged junior-year in high school writing ability according to annual standardized and holistic writing assessments. Whenever someone says "writing can't be taught," Dan begs to differ and has the track record to prove it. Since becoming a full-time writer, Dan likes to visit college writing classes, has taught in New Hampshire's Odyssey writing program for adults, and is considering hosting his own Windwalker Writers' Workshop.
+
+
+ Dan's first published story appeared on Feb. 15, 1982, the day his daughter, Jane Kathryn, was born. He's always attributed that coincidence to "helping in keeping things in perspective when it comes to the relative importance of writing and life."
+
+
+ Dan has been a full-time writer since 1987 and lives along the Front Range of Colorado—in the same town where he taught for 14 years—with his wife, Karen, his daughter, Jane, (when she's home from Hamilton College) and their Pembroke Welsh Corgi, Fergie. He does much of his writing at Windwalker—their mountain property and cabin at 8,400 feet of altitude at the base of the Continental Divide, just south of Rocky Mountain National Park. An 8-ft.-tall sculpture of the Shrike—a thorned and frightening character from the four Hyperion/Endymion novels—was sculpted by an ex-student and friend, Clee Richeson, and the sculpture now stands guard near the isolated cabin.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ What do
+ you
+ think?
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Rate this book
+
+
+
+
+
+ Write a Review
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4.25
+
+
+
+
+ 221,962
+
+ ratings
+
+
+ 10,528
+
+ reviews
+
+
+
+
+
+
+
+
+
5 stars
+
+
112,299 (50%)
+
+
+
4 stars
+
+
68,725 (30%)
+
+
+
3 stars
+
+
28,728 (12%)
+
+
+
2 stars
+
+
8,496 (3%)
+
+
+
1 star
+
+
3,714 (1%)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Join the discussion
+
+
+
+
+
+
+
Can't find what you're looking for?
+
+
+ Get help and learn more about the design.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test_data/https___www_goodreads_com_book_show_56821625 b/test_data/https___www_goodreads_com_book_show_56821625
new file mode 100644
index 00000000..80fcf327
--- /dev/null
+++ b/test_data/https___www_goodreads_com_book_show_56821625
@@ -0,0 +1,20 @@
+1984 by George Orwell | Goodreads Jump to ratings and reviews Among the seminal texts of the 20th century, Nineteen Eighty-Four is a rare work that grows more haunting as its futuristic purgatory becomes more real. Published in 1949, the book offers political satirist George Orwell's nightmare vision of a totalitarian, bureaucratic world and one poor stiff's attempt to find individuality. The brilliance of the novel is Orwell's prescience of modern life--the ubiquity of television, the distortion of the language--and his ability to construct such a thorough version of hell. Required reading for students since it was published, it ranks among the most terrifying novels ever written.
254 pages, Paperback
First published June 8, 1949
About the author Eric Arthur Blair , better known by his pen name George Orwell , was an English author and journalist. His work is marked by keen intelligence and wit, a profound awareness of social injustice, an intense opposition to totalitarianism, a passion for clarity in language, and a belief in democratic socialism. In addition to his literary career Orwell served as a police officer with the Indian Imperial Police in Burma from 1922-1927 and fought with the Republicans in the Spanish Civil War from 1936-1937. Orwell was severely wounded when he was shot through his throat. Later the organization that he had joined when he joined the Republican cause, The Workers Party of Marxist Unification (POUM), was painted by the pro-Soviet Communists as a Trotskyist organization (Trotsky was Joseph Stalin's enemy) and disbanded. Orwell and his wife were accused of "rabid Trotskyism" and tried in absentia in Barcelona, along with other leaders of the POUM, in 1938. However by then they had escaped from Spain and returned to England. Between 1941 and 1943, Orwell worked on propaganda for the BBC. In 1943, he became literary editor of the Tribune, a weekly left-wing magazine. He was a prolific polemical journalist, article writer, literary critic, reviewer, poet, and writer of fiction, and, considered perhaps the twentieth century's best chronicler of English culture. Orwell is best known for the dystopian novel Nineteen Eighty-Four (published in 1949) and the satirical novella Animal Farm (1945) — they have together sold more copies than any two books by any other twentieth-century author. His 1938 book Homage to Catalonia , an account of his experiences as a volunteer on the Republican side during the Spanish Civil War, together with numerous essays on politics, literature, language, and culture, have been widely acclaimed. Orwell's influence on contemporary culture, popular and political, continues decades after his death. Several of his neologisms, along with the term "Orwellian" — now a byword for any oppressive or manipulative social phenomenon opposed to a free society — have entered the vernacular.
4,010,690 ratings 95,217 reviews
Can't find what you're looking for? Get help and learn more about the design.
\ No newline at end of file
diff --git a/test_data/https___www_goodreads_com_book_show_59952545 b/test_data/https___www_goodreads_com_book_show_59952545
new file mode 100644
index 00000000..1dcc5bd4
--- /dev/null
+++ b/test_data/https___www_goodreads_com_book_show_59952545
@@ -0,0 +1,20 @@
+Golden Age: A Novel by Wang Xiaobo | Goodreads Jump to ratings and reviews Like Gary Shteyngart or Michel Houellebecq, Wang Xiaobo is a Chinese literary icon whose satire forces us to reconsider the ironies of history. “Apparently, there was a rumour that Chen Qingyang and I were having an affair. She wanted me to prove our innocence. I said, to prove our innocence, we must prove one of the following: 1. Chen Qingyang is a virgin; 2. I was born without a penis. Both of these propositions were hard to prove, therefore, we couldn’t prove our innocence. Infact, I was leaning more toward proving that we weren’t innocent.” And so begins Wang Er’s story of his long affair with Chen Qinyang. Wang Er, a 21-year-old ox herder, is shamed by the local authorities and forced to write a confession for his crimes but instead, takes it upon himself to write a modernist literary tract. Later, as a lecturer at a chaotic, newly built university, Wang Er navigates the bureaucratic maze of 1980’s China, boldly writing about the Cultural Revolution’s impact on his life and those around him. Finally, alone and humbled, Wang Er must come to terms with the banality of his own existence. But what makes this novel both hilarious and important is Xiaobo’s use of the awkwardness of sex as a metaphor for all that occured during the Cultural Revolution. This achievement was revolutionary in China and places Golden Age in the great pantheon of novels that argue against governmental control. A leading icon of his generation, Wang Xiaobo’s cerebral and sarcastic narrative is a reflection on the failures of individuals and the enormous political, social, and personal changes in 20thcentury China.
288 pages, Hardcover
First published January 1, 1991
About the author Wang Xiaobo (Chinese: 王小波 ) was a Chinese writer who became famous after his death.Wang Xiaobo on paper-republic.org . Wang was born in an intellectual family in Beijing in 1952. He was sent to a farm in Yunnan province as an "intellectual youth" at the beginning of the Cultural Revolution in 1968. In 1971, he was sent to the countryside of Shandong province, and became a teacher. In 1972, he was allowed to return to Beijing, and he got a job as a working in a local factory. He met Li Yinhe in 1977, who was working as an editor for "Guangming Daily", and she later became his wife. He was accepted by Renmin University of China in 1978 where he studied economics and trade and got his Bachelor's Degree. He received his Master's Degree at the University of Pittsburgh in 1988. After he returned to China, he began to teach at Peking University and Renmin University of China. He quit his job as a college lecturer in 1992, and became a freelance writer. On April 11, 1997 he died suddenly of heart disease at his apartment.
Can't find what you're looking for? Get help and learn more about the design.
\ No newline at end of file
diff --git a/test_data/https___www_goodreads_com_book_show_77566 b/test_data/https___www_goodreads_com_book_show_77566
new file mode 100644
index 00000000..5bcec7f0
--- /dev/null
+++ b/test_data/https___www_goodreads_com_book_show_77566
@@ -0,0 +1,20 @@
+Hyperion (Hyperion Cantos, #1) by Dan Simmons | Goodreads Jump to ratings and reviews On the world called Hyperion, beyond the law of the Hegemony of Man, there waits the creature called the Shrike. There are those who worship it. There are those who fear it. And there are those who have vowed to destroy it. In the Valley of the Time Tombs, where huge, brooding structures move backward through time, the Shrike waits for them all. On the eve of Armageddon, with the entire galaxy at war, seven pilgrims set forth on a final voyage to Hyperion seeking the answers to the unsolved riddles of their lives. Each carries a desperate hope—and a terrible secret. And one may hold the fate of humanity in his hands.
500 pages, Mass Market Paperback
First published May 26, 1989
About the author Dan Simmons grew up in various cities and small towns in the Midwest, including Brimfield, Illinois, which was the source of his fictional "Elm Haven" in 1991's SUMMER OF NIGHT and 2002's A WINTER HAUNTING. Dan received a B.A. in English from Wabash College in 1970, winning a national Phi Beta Kappa Award during his senior year for excellence in fiction, journalism and art. Dan received his Masters in Education from Washington University in St. Louis in 1971. He then worked in elementary education for 18 years—2 years in Missouri, 2 years in Buffalo, New York—one year as a specially trained BOCES "resource teacher" and another as a sixth-grade teacher—and 14 years in Colorado. ABOUT DAN Biographic Sketch His last four years in teaching were spent creating, coordinating, and teaching in APEX, an extensive gifted/talented program serving 19 elementary schools and some 15,000 potential students. During his years of teaching, he won awards from the Colorado Education Association and was a finalist for the Colorado Teacher of the Year. He also worked as a national language-arts consultant, sharing his own "Writing Well" curriculum which he had created for his own classroom. Eleven and twelve-year-old students in Simmons' regular 6th-grade class averaged junior-year in high school writing ability according to annual standardized and holistic writing assessments. Whenever someone says "writing can't be taught," Dan begs to differ and has the track record to prove it. Since becoming a full-time writer, Dan likes to visit college writing classes, has taught in New Hampshire's Odyssey writing program for adults, and is considering hosting his own Windwalker Writers' Workshop. Dan's first published story appeared on Feb. 15, 1982, the day his daughter, Jane Kathryn, was born. He's always attributed that coincidence to "helping in keeping things in perspective when it comes to the relative importance of writing and life." Dan has been a full-time writer since 1987 and lives along the Front Range of Colorado—in the same town where he taught for 14 years—with his wife, Karen, his daughter, Jane, (when she's home from Hamilton College) and their Pembroke Welsh Corgi, Fergie. He does much of his writing at Windwalker—their mountain property and cabin at 8,400 feet of altitude at the base of the Continental Divide, just south of Rocky Mountain National Park. An 8-ft.-tall sculpture of the Shrike—a thorned and frightening character from the four Hyperion/Endymion novels—was sculpted by an ex-student and friend, Clee Richeson, and the sculpture now stands guard near the isolated cabin.
221,963 ratings 10,528 reviews
Can't find what you're looking for? Get help and learn more about the design.
\ No newline at end of file
diff --git a/test_data/https___www_goodreads_com_work_editions_1383900 b/test_data/https___www_goodreads_com_work_editions_1383900
new file mode 100644
index 00000000..e4f53e8f
--- /dev/null
+++ b/test_data/https___www_goodreads_com_work_editions_1383900
@@ -0,0 +1,4165 @@
+
+
+
+ Editions of Hyperion by Dan Simmons
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Hyperion
+ > Editions
+
+
+
+
+
+
+ by Dan Simmons
+
+ First published May 26th 1989
+
+
+
+
+
+
+
+
+
+
+
+ Published March 1990
+ by Bantam Doubleday Dell Publishing Group
+
+
+ Mass Market Paperback, 500 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9780553283686
+
+ (ISBN10: 0553283685)
+
+
+
+
+
+ ASIN:
+
+
+ 0553283685
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.24
+
+ (197,888 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published January 12th 2011
+ by Spectra
+
+
+ Kindle Edition, 483 pages
+
+
+
+
+
+ ASIN:
+
+
+ B004G60EHS
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.38
+
+ (6,609 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published January 12th 2011
+ by Spectra
+
+
+ Kindle Edition, 483 pages
+
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.32
+
+ (6,696 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published August 5th 2010
+ by Gateway
+
+
+ Kindle Edition, 498 pages
+
+
+
+
+
+ ASIN:
+
+
+ B0043M6780
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.33
+
+ (2,279 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published January 12th 2011
+ by Spectra
+
+
+ Kindle Edition, 483 pages
+
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.33
+
+ (1,121 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published May 12th 2011
+ by Gollancz
+
+
+ SF Masterworks, Paperback, 473 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9780575099432
+
+ (ISBN10: 0575099437)
+
+
+
+
+
+ ASIN:
+
+
+ 0575099437
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.26
+
+ (853 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published August 15th 2017
+ by Del Rey Books
+
+
+ Paperback, 483 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9780399178610
+
+ (ISBN10: 0399178619)
+
+
+
+
+
+ ASIN:
+
+
+ 0399178619
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.32
+
+ (423 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published November 2015
+ by Ediciones B
+
+
+ NOVA, Hardcover, 646 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9788466658034
+
+ (ISBN10: 8466658033)
+
+
+
+
+
+ ASIN:
+
+
+ 8466658033
+
+
+
+
+ Edition language:
+
+
+ Spanish
+
+
+
+
+ Average rating:
+
+
+ 4.34
+
+ (370 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published 2000
+ by АСТ
+
+
+ Золотая библиотека фантастики, Hardcover, 672 pages
+
+
+
+
+
+ ISBN:
+
+
+
+ (ISBN10: 5237045200)
+
+
+
+
+
+ ASIN:
+
+
+ 5237045200
+
+
+
+
+ Edition language:
+
+
+ Russian
+
+
+
+
+ Average rating:
+
+
+ 4.47
+
+ (517 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published December 2005
+ by Gollancz
+
+
+ Paperback, 480 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9780575076372
+
+ (ISBN10: 0575076372)
+
+
+
+
+
+ ASIN:
+
+
+ 0575076372
+
+
+
+
+ Average rating:
+
+
+ 4.24
+
+ (377 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published September 9th 2015
+ by MAG
+
+
+ Artefakty, Hardcover, 624 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9788374805575
+
+ (ISBN10: 8374805579)
+
+
+
+
+
+ ASIN:
+
+
+ 8374805579
+
+
+
+
+ Edition language:
+
+
+ Polish
+
+
+
+
+ Average rating:
+
+
+ 4.43
+
+ (295 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published 2005
+ by Laguna
+
+
+ Paperback, 436 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9788674362440
+
+ (ISBN10: 8674362443)
+
+
+
+
+
+ ASIN:
+
+
+ B004HBU5IU
+
+
+
+
+ Edition language:
+
+
+ Serbian
+
+
+
+
+ Average rating:
+
+
+ 4.49
+
+ (291 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published January 12th 2011
+ by Bantam Spectra
+
+
+ ebook, 496 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9780307781888
+
+ (ISBN10: 0307781887)
+
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.19
+
+ (203 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published December 22nd 2008
+ by Audible Studios
+
+
+ Unabridged, Audible Audio, 22 pages
+
+
+
+
+
+ Edition language:
+
+
+ Spanish
+
+
+
+
+ Average rating:
+
+
+ 3.97
+
+ (173 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published May 26th 1989
+ by Broadway Books
+
+
+ Paperback, 492 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9780385263481
+
+ (ISBN10: 0385263481)
+
+
+
+
+
+ ASIN:
+
+
+ 0385263481
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.38
+
+ (148 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published October 2011
+ by Fanucci
+
+
+ TIF Extra, Paperback, 455 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9788834718155
+
+ (ISBN10: 8834718151)
+
+
+
+
+
+ ASIN:
+
+
+ 8834718151
+
+
+
+
+ Edition language:
+
+
+ Italian
+
+
+
+
+ Average rating:
+
+
+ 4.23
+
+ (193 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published 2005
+ by Gollancz
+
+
+ Paperback, 473 pages
+
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.31
+
+ (173 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published 1995
+ by Бард
+
+
+ "Избрана световна фантастика", № 20, Paperback, 544 pages
+
+
+
+
+
+ ISBN:
+
+
+
+ (ISBN10: 9545850031)
+
+
+
+
+
+ Edition language:
+
+
+ Bulgarian
+
+
+
+
+ Average rating:
+
+
+ 4.50
+
+ (206 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published 1990
+ by Headline
+
+
+ Paperback, 502 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9780747234821
+
+ (ISBN10: 0747234825)
+
+
+
+
+
+ ASIN:
+
+
+ 0747234825
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.23
+
+ (191 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published May 26th 1989
+ by Doubleday
+
+
+ Hardcover, 482 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9780385249492
+
+ (ISBN10: 0385249497)
+
+
+
+
+
+ ASIN:
+
+
+ 0385249497
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.35
+
+ (133 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published December 22nd 2008
+ by Audible Frontiers
+
+
+ Audiobook
+
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.05
+
+ (242 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published June 1st 2005
+ by Ediciones B
+
+
+ Paperback, 618 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9788466617352
+
+ (ISBN10: 8466617353)
+
+
+
+
+
+ ASIN:
+
+
+ 8466617353
+
+
+
+
+ Edition language:
+
+
+ Spanish
+
+
+
+
+ Average rating:
+
+
+ 4.29
+
+ (194 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published October 26th 2007
+ by Wydawnictwo Mag
+
+
+ Polish Edition, Hardcover, 617 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9788374800747
+
+ (ISBN10: 8374800747)
+
+
+
+
+
+ ASIN:
+
+
+ 8374800747
+
+
+
+
+ Edition language:
+
+
+ Polish
+
+
+
+
+ Average rating:
+
+
+ 4.41
+
+ (229 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published September 2009
+ by B de Bolsillo
+
+
+ Mass Market Paperback, 618 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9788498723069
+
+ (ISBN10: 849872306X)
+
+
+
+
+
+ ASIN:
+
+
+ 849872306X
+
+
+
+
+ Edition language:
+
+
+ Spanish
+
+
+
+
+ Average rating:
+
+
+ 4.32
+
+ (159 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published 2011
+ by Gollancz
+
+
+ Paperback, 473 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9781407234663
+
+ (ISBN10: 1407234668)
+
+
+
+
+
+ ASIN:
+
+
+ 1407234668
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.18
+
+ (129 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published 2016
+ by Навчальна книга — Богдан
+
+
+ Hardcover, 448 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9789661046435
+
+
+
+
+ Edition language:
+
+
+ Ukrainian
+
+
+
+
+ Average rating:
+
+
+ 4.63
+
+ (134 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published October 1993
+ by Mondadori
+
+
+ Bestsellers #350, Paperback, 422 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9788804376149
+
+ (ISBN10: 8804376147)
+
+
+
+
+
+ ASIN:
+
+
+ 8804376147
+
+
+
+
+ Edition language:
+
+
+ Italian
+
+
+
+
+ Average rating:
+
+
+ 4.25
+
+ (125 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published September 10th 2014
+ by Pocket
+
+
+ Mass Market Paperback, 638 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9782266252584
+
+ (ISBN10: 2266252585)
+
+
+
+
+
+ ASIN:
+
+
+ 2266252585
+
+
+
+
+ Edition language:
+
+
+ French
+
+
+
+
+ Average rating:
+
+
+ 4.14
+
+ (97 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published November 18th 2015
+ by B DE BOOKS
+
+
+ Kindle Edition, 618 pages
+
+
+
+
+
+ ASIN:
+
+
+ B016OK7L38
+
+
+
+
+ Edition language:
+
+
+ Spanish
+
+
+
+
+ Average rating:
+
+
+ 4.53
+
+ (106 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published 2004
+ by Gollancz
+
+
+ Hardcover, 473 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9780575081147
+
+ (ISBN10: 0575081147)
+
+
+
+
+
+ ASIN:
+
+
+ 0575081147
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.33
+
+ (97 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Welcome back. Just a moment while we sign you in to your Goodreads account.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test_data/https___www_goodreads_com_work_editions_153313 b/test_data/https___www_goodreads_com_work_editions_153313
new file mode 100644
index 00000000..66e07e99
--- /dev/null
+++ b/test_data/https___www_goodreads_com_work_editions_153313
@@ -0,0 +1,4019 @@
+
+
+
+ Editions of 1984 by George Orwell
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1984
+ > Editions
+
+
+
+
+
+
+ by George Orwell
+
+ First published June 8th 1949
+
+
+
+
+
+
+
+
+
+
+
+ Published July 1st 1950
+ by New American Library
+
+
+ Signet Classics, Mass Market Paperback, 328 pages
+
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.15
+
+ (2,243,089 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published September 3rd 2013
+ by Houghton Mifflin Harcourt
+
+
+ Kindle Edition, 298 pages
+
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.24
+
+ (1,412,268 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published July 2022
+ by Plume
+
+
+ Centennial Edition, Paperback, 368 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9780452284234
+
+ (ISBN10: 0452284236)
+
+
+
+
+
+ ASIN:
+
+
+ B00A2MTYAI
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.20
+
+ (128,662 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published September 3rd 2013
+ by Houghton Mifflin Harcourt
+
+
+ Kindle Edition, 258 pages
+
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.23
+
+ (20,195 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published July 3rd 2008
+ by Penguin Books
+
+
+ Paperback, 336 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9780141036144
+
+ (ISBN10: 0141036141)
+
+
+
+
+
+ ASIN:
+
+
+ B006QNC5VC
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.21
+
+ (23,826 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published May 6th 2003
+ by Plume
+
+
+ Centennial Edition, Paperback, 339 pages
+
+
+
+
+
+ ASIN:
+
+
+ 0452284236
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.23
+
+ (12,939 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published June 1st 2006
+ by المركز الثقافي العربي
+
+
+ First Edition, Paperback, 351 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9789953681443
+
+ (ISBN10: 9953681449)
+
+
+
+
+
+ ASIN:
+
+
+ 9953681449
+
+
+
+
+ Edition language:
+
+
+ Arabic
+
+
+
+
+ Average rating:
+
+
+ 4.28
+
+ (5,545 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published January 29th 2004
+ by Penguin Books Ltd
+
+
+ Penguin Modern Classics, Paperback, 355 pages
+
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.28
+
+ (5,764 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published 1989
+ by Mondadori
+
+
+ Oscar classici moderni #19, Paperback, 322 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9788804507451
+
+ (ISBN10: 8804507454)
+
+
+
+
+
+ ASIN:
+
+
+ 8804507454
+
+
+
+
+ Edition language:
+
+
+ Italian
+
+
+
+
+ Average rating:
+
+
+ 4.44
+
+ (3,995 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published March 2013
+ by Debolsillo
+
+
+ Paperback, 350 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9788499890944
+
+ (ISBN10: 8499890946)
+
+
+
+
+
+ ASIN:
+
+
+ 8499890946
+
+
+
+
+ Edition language:
+
+
+ Spanish
+
+
+
+
+ Average rating:
+
+
+ 4.26
+
+ (3,796 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published 1998
+ by Panstwowy Instytut Wydawniczy
+
+
+ Klub interesujacej ksiazki, Paperback, 206 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9788306018066
+
+ (ISBN10: 8306018060)
+
+
+
+
+
+ ASIN:
+
+
+ 8306018060
+
+
+
+
+ Edition language:
+
+
+ Polish
+
+
+
+
+ Average rating:
+
+
+ 4.43
+
+ (3,090 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published 1982
+ by نیلوفر
+
+
+ Paperback, 272 pages
+
+
+
+
+
+ ASIN:
+
+
+ 9644480449
+
+
+
+
+ Edition language:
+
+
+ Persian
+
+
+
+
+ Average rating:
+
+
+ 4.25
+
+ (3,022 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published 2013
+ by Penguin Books
+
+
+ Great Orwell, Paperback, 355 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9780141393049
+
+ (ISBN10: 0141393041)
+
+
+
+
+
+ ASIN:
+
+
+ 0141393041
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.30
+
+ (3,966 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published February 2014
+ by Can Yayınları
+
+
+ Paperback, 352 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9789750718533
+
+
+
+
+ ASIN:
+
+
+ 9750718534
+
+
+
+
+ Edition language:
+
+
+ Turkish
+
+
+
+
+ Average rating:
+
+
+ 4.56
+
+ (3,112 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published September 2021
+ by Houghton Mifflin Harcourt
+
+
+ Kindle Edition, 205 pages
+
+
+
+
+
+ ASIN:
+
+
+ B003JTHWKU
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.19
+
+ (1,517 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published July 1950
+ by Signet Classics
+
+
+ Mass Market Paperback, 268 pages
+
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.12
+
+ (3,854 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published 1990
+ by Penguin
+
+
+ Paperback, 326 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9780140126716
+
+ (ISBN10: 0140126716)
+
+
+
+
+
+ ASIN:
+
+
+ 0140126716
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.23
+
+ (3,246 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published 2003
+ by Signet Classic
+
+
+ George Orwell Centennial Edition, Mass Market Paperback, 328 pages
+
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.24
+
+ (2,422 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published July 21st 2009
+ by Companhia das Letras
+
+
+ Paperback, 416 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9788535914849
+
+ (ISBN10: 8535914846)
+
+
+
+
+
+ ASIN:
+
+
+ 8535914846
+
+
+
+
+ Edition language:
+
+
+ Portuguese
+
+
+
+
+ Average rating:
+
+
+ 4.47
+
+ (2,573 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published January 29th 2004
+ by Penguin
+
+
+ Kindle Edition, 322 pages
+
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.39
+
+ (2,981 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published March 14th 2012
+ by Penguin Books
+
+
+ Penguin Modern Classics, Paperback, 355 pages
+
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.19
+
+ (2,761 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published May 16th 2020
+
+
+ Kindle Edition, 205 pages
+
+
+
+
+
+ ASIN:
+
+
+ B088RKKYCC
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.25
+
+ (1,229 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published April 1st 1983
+ by Plume
+
+
+ Paperback, 294 pages
+
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.14
+
+ (2,301 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published January 5th 2021
+
+
+ Kindle Edition, 310 pages
+
+
+
+
+
+ ASIN:
+
+
+ B088H7KLCG
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.28
+
+ (1,687 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published 2007
+ by Antígona
+
+
+ Paperback, 327 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9789726081890
+
+ (ISBN10: 9726081890)
+
+
+
+
+
+ ASIN:
+
+
+ B004ZKY8NG
+
+
+
+
+ Edition language:
+
+
+ Portuguese
+
+
+
+
+ Average rating:
+
+
+ 4.45
+
+ (2,078 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published 1996
+ by Signet Classics
+
+
+ Mass Market Paperback, 268 pages
+
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.06
+
+ (2,398 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published 2013
+ by ناوەندی ئەندێشە
+
+
+ چاپی دووەم, 380 pages
+
+
+
+
+
+ Edition language:
+
+
+ Kurdish
+
+
+
+
+ Average rating:
+
+
+ 4.31
+
+ (1,209 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published May 25th 2017
+ by Biblios
+
+
+ Kindle Edition, 255 pages
+
+
+
+
+
+ ASIN:
+
+
+ B07DBP8T2F
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 4.25
+
+ (1,460 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published 2013
+ by المركز الثقافي العربي
+
+
+ الثالثة, Paperback, 351 pages
+
+
+
+
+
+ Edition language:
+
+
+ Arabic
+
+
+
+
+ Average rating:
+
+
+ 4.27
+
+ (1,352 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published June 21st 2016
+ by Mondadori
+
+
+ Oscar Moderni #36, Paperback, 323 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9788804668237
+
+ (ISBN10: 8804668237)
+
+
+
+
+
+ ASIN:
+
+
+ 8804668237
+
+
+
+
+ Edition language:
+
+
+ Italian
+
+
+
+
+ Average rating:
+
+
+ 4.35
+
+ (1,622 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Welcome back. Just a moment while we sign you in to your Goodreads account.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test_data/https___www_goodreads_com_work_editions_24173962 b/test_data/https___www_goodreads_com_work_editions_24173962
new file mode 100644
index 00000000..926b3443
--- /dev/null
+++ b/test_data/https___www_goodreads_com_work_editions_24173962
@@ -0,0 +1,4160 @@
+
+
+
+ Editions of 黄金时代 by Wang Xiaobo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 黄金时代
+ > Editions
+
+
+
+
+
+
+ by Wang Xiaobo
+
+ First published 1991
+
+
+
+
+
+
+
+
+
+
+
+ Published November 22nd 2012
+ by 长江文艺出版社
+
+
+ 第1版, Kindle Edition, 298 pages
+
+
+
+
+
+ ASIN:
+
+
+ B009PG5Z96
+
+
+
+
+ Edition language:
+
+
+ Chinese
+
+
+
+
+ Average rating:
+
+
+ 4.39
+
+ (482 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published July 26th 2022
+ by Astra House
+
+
+ Hardcover, 288 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9781662601217
+
+ (ISBN10: 1662601212)
+
+
+
+
+
+ ASIN:
+
+
+ 1662601212
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 3.58
+
+ (31 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published March 11th 2020
+ by Galaxia Gutenberg
+
+
+ Paperback, 136 pages
+
+
+
+
+
+ ISBN:
+
+
+
+ (ISBN10: 9788417971)
+
+
+
+
+
+ Edition language:
+
+
+ Spanish
+
+
+
+
+ Average rating:
+
+
+ 3.26
+
+ (61 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published October 1st 2019
+ by منشورات المتوسط - بيت الحكمة
+
+
+ الطبعة الأولى, Paperback, 512 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9788832201154
+
+
+
+
+ ASIN:
+
+
+ 8832201151
+
+
+
+
+ Edition language:
+
+
+ Arabic
+
+
+
+
+ Average rating:
+
+
+ 3.42
+
+ (12 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published November 18th 2021
+ by Państwowy Instytut Wydawniczy
+
+
+ Paperback, 190 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9788381963343
+
+ (ISBN10: 8381963346)
+
+
+
+
+
+ ASIN:
+
+
+ 8381963346
+
+
+
+
+ Edition language:
+
+
+ Polish
+
+
+
+
+ Average rating:
+
+
+ 3.84
+
+ (19 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published July 1st 2010
+ by 长江文艺出版社
+
+
+ 王小波小说全集 丛书, Kindle Edition, 304 pages
+
+
+
+
+
+ ASIN:
+
+
+ B00DNX7Y1E
+
+
+
+
+ Edition language:
+
+
+ Chinese
+
+
+
+
+ Average rating:
+
+
+ 4.68
+
+ (22 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published December 1st 2014
+ by 群言出版社
+
+
+ 先锋文库03, Hardcover, 331 pages
+
+
+
+
+
+ ISBN:
+
+
+
+ (ISBN10: 780256610X)
+
+
+
+
+
+ Edition language:
+
+
+ Chinese
+
+
+
+
+ Average rating:
+
+
+ 4.57
+
+ (21 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published April 1999
+ by 花城出版社
+
+
+ Paperback, 375 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9787536025080
+
+ (ISBN10: 7536025084)
+
+
+
+
+
+ ASIN:
+
+
+ 7806859950
+
+
+
+
+ Edition language:
+
+
+ Chinese
+
+
+
+
+ Average rating:
+
+
+ 4.63
+
+ (27 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published July 1st 2001
+ by Éditions du Sorgho
+
+
+ Paperback, 146 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9782914446013
+
+ (ISBN10: 2914446012)
+
+
+
+
+
+ ASIN:
+
+
+ 2914446012
+
+
+
+
+ Edition language:
+
+
+ French
+
+
+
+
+ Average rating:
+
+
+ 4.27
+
+ (22 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published June 1st 2013
+ by 长江文艺出版社
+
+
+ Hardcover, 396 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9787535464187
+
+ (ISBN10: 7535464181)
+
+
+
+
+
+ ASIN:
+
+
+ 7535464181
+
+
+
+
+ Edition language:
+
+
+ Chinese
+
+
+
+
+ Average rating:
+
+
+ 4.46
+
+ (24 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published
+ by 长江文艺出版社
+
+
+ 王小波小说全集 丛书, Kindle Edition, 357 pages
+
+
+
+
+
+ ASIN:
+
+
+ B075QD9NZZ
+
+
+
+
+ Edition language:
+
+
+ Chinese
+
+
+
+
+ Average rating:
+
+
+ 4.80
+
+ (10 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published July 1st 2009
+ by 陕西师范大学出版社
+
+
+ Paperback, 413 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9787561327470
+
+ (ISBN10: 7561327471)
+
+
+
+
+
+ ASIN:
+
+
+ 7561327471
+
+
+
+
+ Edition language:
+
+
+ Chinese
+
+
+
+
+ Average rating:
+
+
+ 4.65
+
+ (20 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published November 10th 2012
+ by 自由之丘
+
+
+ Paperback, 448 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9789868835986
+
+
+
+
+ ASIN:
+
+
+ 9868835984
+
+
+
+
+ Edition language:
+
+
+ Chinese
+
+
+
+
+ Average rating:
+
+
+ 4.20
+
+ (15 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published July 26th 2022
+ by Astra House
+
+
+ Kindle Edition, 288 pages
+
+
+
+
+
+ ASIN:
+
+
+ B09KFYM9HX
+
+
+
+
+ Edition language:
+
+
+ English
+
+
+
+
+ Average rating:
+
+
+ 2.60
+
+ (5 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published April 1st 2017
+ by 北京十月文艺出版社
+
+
+ Hardcover, 235 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9787530216606
+
+
+
+
+ ASIN:
+
+
+ 7530216600
+
+
+
+
+ Edition language:
+
+
+ Chinese
+
+
+
+
+ Average rating:
+
+
+ 4.33
+
+ (15 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published April 1st 2017
+ by 北京十月文艺出版社
+
+
+ Kindle Edition, 235 pages
+
+
+
+
+
+ ASIN:
+
+
+ B074K4GLBX
+
+
+
+
+ Edition language:
+
+
+ Chinese
+
+
+
+
+ Average rating:
+
+
+ 4.20
+
+ (5 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published December 1st 2014
+ by 群言出版社
+
+
+ 先锋文库03, Hardcover, 331 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9787802566101
+
+
+
+
+ ASIN:
+
+
+ 780256610X
+
+
+
+
+ Edition language:
+
+
+ Chinese
+
+
+
+
+ Average rating:
+
+
+ 4.22
+
+ (9 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published January 7th 2009
+ by 陕西师范大学出版社
+
+
+ 最新修订插图典藏版, Kindle Edition, 299 pages
+
+
+
+
+
+ ASIN:
+
+
+ B075QCLDHC
+
+
+
+
+ Edition language:
+
+
+ Chinese
+
+
+
+
+ Average rating:
+
+
+ 4.40
+
+ (5 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published March 11th 2020
+ by Galaxia Gutenberg
+
+
+ Paperback, 132 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9788417971625
+
+ (ISBN10: 8417971629)
+
+
+
+
+
+ ASIN:
+
+
+ 8417971629
+
+
+
+
+ Edition language:
+
+
+ Spanish
+
+
+
+
+ Average rating:
+
+
+ 3.50
+
+ (4 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published January 1st 2016
+ by 湖南文藝出版社
+
+
+ 插图珍藏本, Paperback, 393 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9787540473853
+
+
+
+
+ ASIN:
+
+
+ 7540473851
+
+
+
+
+ Edition language:
+
+
+ Chinese
+
+
+
+
+ Average rating:
+
+
+ 5.00
+
+ (3 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published September 8th 2020
+ by Pine & Crane
+
+
+ Hardcover
+
+
+
+
+
+ ISBN:
+
+
+ 9781635923049
+
+ (ISBN10: 1635923042)
+
+
+
+
+
+ ASIN:
+
+
+ 1635923042
+
+
+
+
+ Average rating:
+
+
+ 2.50
+
+ (2 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published July 1st 2010
+
+
+ Kindle Edition, 400 pages
+
+
+
+
+
+ ASIN:
+
+
+ B07143MQKL
+
+
+
+
+ Edition language:
+
+
+ Chinese
+
+
+
+
+ Average rating:
+
+
+ 4.00
+
+ (2 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published August 1st 2006
+ by 长江文艺出版社
+
+
+ 王小波小说全集 丛书, Kindle Edition, 355 pages
+
+
+
+
+
+ ASIN:
+
+
+ B06XC77YJS
+
+
+
+
+ Edition language:
+
+
+ Chinese
+
+
+
+
+ Average rating:
+
+
+ 4.67
+
+ (3 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published May 2008
+ by 上海锦绣文章出版社
+
+
+ Large Print, Paperback, 138 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9787806859957
+
+
+
+
+ Edition language:
+
+
+ Chinese
+
+
+
+
+ Average rating:
+
+
+ 4.00
+
+ (1 rating)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published July 1st 2016
+ by 作家出版社
+
+
+ Paperback, 384 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9787506384100
+
+ (ISBN10: 7506384108)
+
+
+
+
+
+ ASIN:
+
+
+ 7506384108
+
+
+
+
+ Edition language:
+
+
+ Chinese
+
+
+
+
+ Average rating:
+
+
+ 2.00
+
+ (1 rating)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published January 2013
+ by 上海三联书店
+
+
+ Paperback, 400 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9787542637949
+
+
+
+
+ ASIN:
+
+
+ 7542637940
+
+
+
+
+ Edition language:
+
+
+ Chinese
+
+
+
+
+ Average rating:
+
+
+ 5.00
+
+ (1 rating)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published January 1st 2016
+ by 浙江文藝出版社
+
+
+ 精选珍藏04, Hardcover, 386 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9787533944254
+
+
+
+
+ ASIN:
+
+
+ 7533944259
+
+
+
+
+ Edition language:
+
+
+ Chinese
+
+
+
+
+ Average rating:
+
+
+ 0.0
+
+ (0 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published January 2008
+ by 上海三联书店
+
+
+ 505 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9787542627049
+
+
+
+
+ ASIN:
+
+
+ 754262704X
+
+
+
+
+ Average rating:
+
+
+ 0.0
+
+ (0 ratings)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published July 2010
+ by 长江文艺出版社
+
+
+ Paperback, 298 pages
+
+
+
+
+
+ ISBN:
+
+
+ 9787535444752
+
+
+
+
+ ASIN:
+
+
+ 753544475X
+
+
+
+
+ Edition language:
+
+
+ Chinese
+
+
+
+
+ Average rating:
+
+
+ 5.00
+
+ (1 rating)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Published August 1st 2006
+ by 长江文艺出版社
+
+
+ 王小波小说全集 丛书, Paperback
+
+
+
+
+
+ ISBN:
+
+
+ 9787535433459
+
+ (ISBN10: 7535433456)
+
+
+
+
+
+ ASIN:
+
+
+ 7535433456
+
+
+
+
+ Edition language:
+
+
+ Chinese
+
+
+
+
+ Average rating:
+
+
+ 4.00
+
+ (1 rating)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Welcome back. Just a moment while we sign you in to your Goodreads account.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test_data/https___www_googleapis_com_books_v1_volumes_hV__zQEACAAJ b/test_data/https___www_googleapis_com_books_v1_volumes_hV__zQEACAAJ
new file mode 100644
index 00000000..ed286c6a
--- /dev/null
+++ b/test_data/https___www_googleapis_com_books_v1_volumes_hV__zQEACAAJ
@@ -0,0 +1,75 @@
+{
+ "kind": "books#volume",
+ "id": "hV--zQEACAAJ",
+ "etag": "lwbqGlV/h5s",
+ "selfLink": "https://www.googleapis.com/books/v1/volumes/hV--zQEACAAJ",
+ "volumeInfo": {
+ "title": "1984 Nineteen Eighty-Four",
+ "authors": [
+ "George Orwell"
+ ],
+ "publisher": "Alma Classics",
+ "publishedDate": "2021-01-07",
+ "description": "In 1984, London is a grim city in the totalitarian state of Oceania where Big Brother is always watching you and the Thought Police can practically read your mind. Winston Smith is a man in grave danger for the simple reason that his memory still functions. Drawn into a forbidden love affair, Winston finds the courage to join a secret revolutionary organization called The Brotherhood, dedicated to the destruction of the Party. Together with his beloved Julia, he hazards his life in a deadly match against the powers that be.Lionel Trilling said of Orwell's masterpiece \" 1984 is a profound, terrifying, and wholly fascinating book. It is a fantasy of the political future, and like any such fantasy, serves its author as a magnifying device for an examination of the present.\" Though the year 1984 now exists in the past, Orwell's novel remains an urgent call for the individual willing to speak truth to power.\"",
+ "industryIdentifiers": [
+ {
+ "type": "ISBN_10",
+ "identifier": "1847498574"
+ },
+ {
+ "type": "ISBN_13",
+ "identifier": "9781847498571"
+ }
+ ],
+ "readingModes": {
+ "text": false,
+ "image": false
+ },
+ "pageCount": 400,
+ "printedPageCount": 400,
+ "dimensions": {
+ "height": "19.90 cm",
+ "width": "13.10 cm",
+ "thickness": "2.20 cm"
+ },
+ "printType": "BOOK",
+ "averageRating": 4,
+ "ratingsCount": 564,
+ "maturityRating": "NOT_MATURE",
+ "allowAnonLogging": false,
+ "contentVersion": "preview-1.0.0",
+ "panelizationSummary": {
+ "containsEpubBubbles": false,
+ "containsImageBubbles": false
+ },
+ "imageLinks": {
+ "smallThumbnail": "http://books.google.com/books/content?id=hV--zQEACAAJ&printsec=frontcover&img=1&zoom=5&imgtk=AFLRE72QQ6bzD4LfhArQGJHoUdX5wex-wfg5FVAKOo2MbmCbFSF_HbDUwhZ-gAvmSKiEBTyoRkC3Kvbo9k1jB0uiOyOXcvgAc2643MV091Ny8TySRaV2HSVXtch-MYK2qfzNvUKwGEhx&source=gbs_api",
+ "thumbnail": "http://books.google.com/books/content?id=hV--zQEACAAJ&printsec=frontcover&img=1&zoom=1&imgtk=AFLRE70UTuB9rf2_mqyGrJGsI2XbzpjV2vGQP9Oyjc441rCvvRiGMhMGYXsgTMbAUZ3rHtxarPvPIqaT-RGH9JzzFEbrXs3cp7f2jaHVh3M-fyPcEkg0eao_AuYUePhckBN-PtHZNyy-&source=gbs_api"
+ },
+ "language": "en",
+ "previewLink": "http://books.google.com/books?id=hV--zQEACAAJ&hl=&source=gbs_api",
+ "infoLink": "https://play.google.com/store/books/details?id=hV--zQEACAAJ&source=gbs_api",
+ "canonicalVolumeLink": "https://play.google.com/store/books/details?id=hV--zQEACAAJ"
+ },
+ "saleInfo": {
+ "country": "US",
+ "saleability": "NOT_FOR_SALE",
+ "isEbook": false
+ },
+ "accessInfo": {
+ "country": "US",
+ "viewability": "NO_PAGES",
+ "embeddable": false,
+ "publicDomain": false,
+ "textToSpeechPermission": "ALLOWED",
+ "epub": {
+ "isAvailable": false
+ },
+ "pdf": {
+ "isAvailable": false
+ },
+ "webReaderLink": "http://play.google.com/books/reader?id=hV--zQEACAAJ&hl=&source=gbs_api",
+ "accessViewStatus": "NONE",
+ "quoteSharingAllowed": false
+ }
+}
diff --git a/test_data/igdb_games_fields____cover_url__genres_name__platforms_name__involved_companies____involved_companies_company_name__where_url____https___www_igdb_com_games_portal_2__ b/test_data/igdb_games_fields____cover_url__genres_name__platforms_name__involved_companies____involved_companies_company_name__where_url____https___www_igdb_com_games_portal_2__
new file mode 100644
index 00000000..3ea6fa21
--- /dev/null
+++ b/test_data/igdb_games_fields____cover_url__genres_name__platforms_name__involved_companies____involved_companies_company_name__where_url____https___www_igdb_com_games_portal_2__
@@ -0,0 +1 @@
+[{"id": 72, "age_ratings": [11721, 32022, 47683, 47684, 47685, 47686, 47687, 91785], "aggregated_rating": 92.4444444444444, "aggregated_rating_count": 13, "alternative_names": [50135], "artworks": [36972], "bundles": [55025, 191406], "category": 0, "collection": 87, "cover": {"id": 82660, "url": "//images.igdb.com/igdb/image/upload/t_thumb/co1rs4.jpg"}, "created_at": 1297956069, "dlcs": [99969, 114140], "external_games": [15150, 73156, 81867, 92870, 92979, 137388, 189642, 214010, 245334, 403070, 1303428, 1929756, 1931953, 2082680, 2161690, 2590310, 2600814], "first_release_date": 1303171200, "follows": 971, "franchises": [1724], "game_engines": [3], "game_modes": [1, 2, 3, 4], "genres": [{"id": 5, "name": "Shooter"}, {"id": 8, "name": "Platform"}, {"id": 9, "name": "Puzzle"}, {"id": 31, "name": "Adventure"}], "involved_companies": [{"id": 106733, "company": {"id": 56, "name": "Valve Corporation"}, "created_at": 1598486400, "developer": true, "game": 72, "porting": false, "publisher": true, "supporting": false, "updated_at": 1598486400, "checksum": "fa403088-a40a-1d83-16be-a68849472a6d"}, {"id": 106734, "company": {"id": 1, "name": "Electronic Arts"}, "created_at": 1598486400, "developer": false, "game": 72, "porting": false, "publisher": true, "supporting": false, "updated_at": 1598486400, "checksum": "53e59e19-f746-1195-c4e7-2b388e621317"}], "keywords": [350, 453, 575, 592, 1026, 1158, 1181, 1293, 1440, 1559, 1761, 2071, 2800, 3984, 4004, 4134, 4145, 4162, 4266, 4345, 4363, 4428, 4575, 4578, 4617, 4644, 4725, 4888, 4944, 4956, 4974, 5185, 5261, 5633, 5772, 5935, 5938, 5956, 6137, 6326, 6735, 6854, 7079, 7172, 7313, 7535, 7570, 7579, 8141, 8262, 8896, 9814, 10435, 11023, 11208, 12516, 14224, 18139, 18567, 27032], "multiplayer_modes": [11591, 11592, 11593, 11594, 11595], "name": "Portal 2", "platforms": [{"id": 3, "name": "Linux"}, {"id": 6, "name": "PC (Microsoft Windows)"}, {"id": 9, "name": "PlayStation 3"}, {"id": 12, "name": "Xbox 360"}, {"id": 14, "name": "Mac"}], "player_perspectives": [1], "rating": 91.6894220983232, "rating_count": 2765, "release_dates": [104964, 104965, 208203, 208204, 208205, 208206, 208207, 208208], "screenshots": [725, 726, 727, 728, 729], "similar_games": [71, 1877, 7350, 11646, 16992, 22387, 28070, 55038, 55190, 56033], "slug": "portal-2", "storyline": "You lost your memory, you are alone in a world full of danger, and your mission is survive using your mind. The only way to get out from this hell is.....Hi i'm GLAdOS, and welcome to the amazing world of portal 2, here i will expose you to a lot of tests, and try to k.. help Aperture Science envolve in a new era.\nYour job is advance in the levels i propose and get better and better, you will have an portal gun to help you, and remember nothing is impossible if you try, and try again and again and again....\nThe puzzles are waiting for you!", "summary": "Sequel to the acclaimed Portal (2007), Portal 2 pits the protagonist of the original game, Chell, and her new robot friend, Wheatley, against more puzzles conceived by GLaDOS, an A.I. with the sole purpose of testing the Portal Gun's mechanics and taking revenge on Chell for the events of Portal. As a result of several interactions and revelations, Chell once again pushes to escape Aperture Science Labs.", "tags": [1, 18, 27, 268435461, 268435464, 268435465, 268435487, 536871262, 536871365, 536871487, 536871504, 536871938, 536872070, 536872093, 536872205, 536872352, 536872471, 536872673, 536872983, 536873712, 536874896, 536874916, 536875046, 536875057, 536875074, 536875178, 536875257, 536875275, 536875340, 536875487, 536875490, 536875529, 536875556, 536875637, 536875800, 536875856, 536875868, 536875886, 536876097, 536876173, 536876545, 536876684, 536876847, 536876850, 536876868, 536877049, 536877238, 536877647, 536877766, 536877991, 536878084, 536878225, 536878447, 536878482, 536878491, 536879053, 536879174, 536879808, 536880726, 536881347, 536881935, 536882120, 536883428, 536885136, 536889051, 536889479, 536897944], "themes": [1, 18, 27], "total_rating": 92.0669332713838, "total_rating_count": 2778, "updated_at": 1670514780, "url": "https://www.igdb.com/games/portal-2", "videos": [432, 16451, 17844, 17845], "websites": [17869, 17870, 41194, 41195, 150881, 150882, 150883, 296808], "checksum": "bcca1b61-2b30-13b8-a0ec-faf45d2ffdad", "game_localizations": [726]}]
\ No newline at end of file
diff --git a/test_data/igdb_games_fields____cover_url__genres_name__platforms_name__involved_companies____involved_companies_company_name__where_url____https___www_igdb_com_games_the_legend_of_zelda_breath_of_the_wild__ b/test_data/igdb_games_fields____cover_url__genres_name__platforms_name__involved_companies____involved_companies_company_name__where_url____https___www_igdb_com_games_the_legend_of_zelda_breath_of_the_wild__
new file mode 100644
index 00000000..bae37cd7
--- /dev/null
+++ b/test_data/igdb_games_fields____cover_url__genres_name__platforms_name__involved_companies____involved_companies_company_name__where_url____https___www_igdb_com_games_the_legend_of_zelda_breath_of_the_wild__
@@ -0,0 +1 @@
+[{"id": 7346, "age_ratings": [10942, 32771, 47171, 55134, 62638, 91197, 97621], "aggregated_rating": 97.5925925925926, "aggregated_rating_count": 31, "alternative_names": [24387, 50095, 51797, 51798, 71751, 111231], "artworks": [3469, 3470, 3471, 3472, 3473, 3474, 3476, 3477, 3478, 6227, 6228, 6229], "category": 0, "collection": 106, "cover": {"id": 172453, "url": "//images.igdb.com/igdb/image/upload/t_thumb/co3p2d.jpg"}, "created_at": 1402423357, "dlcs": [41825, 41826], "external_games": [37291, 119375, 189477, 221008, 221009, 250912, 1865369, 1865474, 1865566, 1865659, 1865752, 1865856, 1865904, 1928313, 1928447, 1928741, 1929066, 1930805, 1931125, 1931363, 1931396, 1931548, 1932118, 1932469, 1932898, 1934231, 1936310, 1936680, 1937428, 1937711, 2579890, 2595359, 2596353], "first_release_date": 1488499200, "follows": 694, "franchises": [596], "game_engines": [17], "game_modes": [1], "genres": [{"id": 12, "name": "Role-playing (RPG)"}, {"id": 31, "name": "Adventure"}], "hypes": 142, "involved_companies": [{"id": 131267, "company": {"id": 70, "name": "Nintendo"}, "created_at": 1620735418, "developer": true, "game": 7346, "porting": false, "publisher": true, "supporting": false, "updated_at": 1620816049, "checksum": "3afa08b7-684d-4481-9344-17334be3d6fa"}], "keywords": [64, 69, 132, 174, 227, 296, 301, 510, 637, 701, 758, 966, 1033, 1181, 1309, 1381, 1459, 1524, 1632, 1710, 1735, 2030, 2112, 2141, 2154, 2177, 2209, 2229, 2242, 2280, 2324, 2414, 2438, 2446, 2451, 2452, 2472, 2561, 2823, 3433, 4161, 4166, 4169, 4179, 4187, 4221, 4257, 4266, 4285, 4350, 4359, 4392, 4397, 4399, 4408, 4419, 4423, 4438, 4466, 4509, 4523, 4525, 4578, 4717, 4745, 4767, 4843, 4848, 4852, 4866, 4883, 4918, 4928, 4931, 4951, 5000, 5022, 5023, 5095, 5308, 5315, 5320, 5323, 5331, 5349, 5578, 5625, 5643, 5644, 5651, 5655, 5663, 5694, 5896, 5964, 5977, 6079, 6135, 6163, 6202, 6213, 6221, 6403, 6600, 6653, 6795, 6810, 6820, 6870, 7080, 7217, 7218, 7416, 7423, 7611, 7612, 7621, 8969, 9199, 9207, 9212, 9265, 9278, 9380, 9599, 9600, 9601, 9602, 9603, 9604, 9605, 9606, 9607, 9608, 9609, 9610, 12039, 12078, 12079, 12080, 12081, 12082, 12083, 12084, 12085, 12086, 12087, 12556, 14051, 14052, 14096, 14097, 15074, 15075, 15076, 17426, 23835, 29810, 32559, 32560, 32561, 32562, 32563, 32564, 32565], "name": "The Legend of Zelda: Breath of the Wild", "platforms": [{"id": 41, "name": "Wii U"}, {"id": 130, "name": "Nintendo Switch"}], "player_perspectives": [2], "rating": 92.26694983017181, "rating_count": 1689, "release_dates": [64163, 64164], "screenshots": [30198, 30199, 30200, 30201, 32659, 176250, 176251, 176252, 176253, 176254, 176255, 176256], "similar_games": [359, 472, 534, 1029, 1036, 1864, 1942, 3025, 11156, 19560], "slug": "the-legend-of-zelda-breath-of-the-wild", "storyline": "Link awakes in a mysterious chamber after 100 years of slumber to find that Calamity Ganon has taken over Hyrule Castle and left Hyrule to decay and be taken over by nature.", "summary": "In this 3D open-world entry in the Zelda series, Link is awakened from a deep slumber without his past memories in the post-apocalyptic Kingdom of Hyrule, and sets off on a journey to defeat the ancient evil Calamity Ganon. Link treks, climbs and glides through fields, forests and mountain ranges while meeting and helping friendly folk and defeating enemies in order to gather up the strength to face Ganon.", "tags": [1, 17, 21, 31, 33, 38, 268435468, 268435487, 536870976, 536870981, 536871044, 536871086, 536871139, 536871208, 536871213, 536871422, 536871549, 536871613, 536871670, 536871878, 536871945, 536872093, 536872221, 536872293, 536872371, 536872436, 536872544, 536872622, 536872647, 536872942, 536873024, 536873053, 536873066, 536873089, 536873121, 536873141, 536873154, 536873192, 536873236, 536873326, 536873350, 536873358, 536873363, 536873364, 536873384, 536873473, 536873735, 536874345, 536875073, 536875078, 536875081, 536875091, 536875099, 536875133, 536875169, 536875178, 536875197, 536875262, 536875271, 536875304, 536875309, 536875311, 536875320, 536875331, 536875335, 536875350, 536875378, 536875421, 536875435, 536875437, 536875490, 536875629, 536875657, 536875679, 536875755, 536875760, 536875764, 536875778, 536875795, 536875830, 536875840, 536875843, 536875863, 536875912, 536875934, 536875935, 536876007, 536876220, 536876227, 536876232, 536876235, 536876243, 536876261, 536876490, 536876537, 536876555, 536876556, 536876563, 536876567, 536876575, 536876606, 536876808, 536876876, 536876889, 536876991, 536877047, 536877075, 536877114, 536877125, 536877133, 536877315, 536877512, 536877565, 536877707, 536877722, 536877732, 536877782, 536877992, 536878129, 536878130, 536878328, 536878335, 536878523, 536878524, 536878533, 536879881, 536880111, 536880119, 536880124, 536880177, 536880190, 536880292, 536880511, 536880512, 536880513, 536880514, 536880515, 536880516, 536880517, 536880518, 536880519, 536880520, 536880521, 536880522, 536882951, 536882990, 536882991, 536882992, 536882993, 536882994, 536882995, 536882996, 536882997, 536882998, 536882999, 536883468, 536884963, 536884964, 536885008, 536885009, 536885986, 536885987, 536885988, 536888338, 536894747, 536900722, 536903471, 536903472, 536903473, 536903474, 536903475, 536903476, 536903477], "themes": [1, 17, 21, 31, 33, 38], "total_rating": 94.9297712113822, "total_rating_count": 1720, "updated_at": 1670280136, "url": "https://www.igdb.com/games/the-legend-of-zelda-breath-of-the-wild", "videos": [2613, 8544, 11112, 11648, 45596, 45597], "websites": [12644, 12645, 12646, 65034, 169666, 169667, 169668, 169669, 169670], "checksum": "448bbb33-d5e8-9908-7d2c-47dad47eea89", "game_localizations": [574, 575, 937]}]
\ No newline at end of file
diff --git a/test_data/igdb_websites_fields____game____where_url____https___store_steampowered_com_app_620__ b/test_data/igdb_websites_fields____game____where_url____https___store_steampowered_com_app_620__
new file mode 100644
index 00000000..6935afe1
--- /dev/null
+++ b/test_data/igdb_websites_fields____game____where_url____https___store_steampowered_com_app_620__
@@ -0,0 +1 @@
+[{"id": 17870, "category": 13, "game": {"id": 72, "age_ratings": [11721, 32022, 47683, 47684, 47685, 47686, 47687, 91785], "aggregated_rating": 92.4444444444444, "aggregated_rating_count": 13, "alternative_names": [50135], "artworks": [36972], "bundles": [55025, 191406], "category": 0, "collection": 87, "cover": 82660, "created_at": 1297956069, "dlcs": [99969, 114140], "external_games": [15150, 73156, 81867, 92870, 92979, 137388, 189642, 214010, 245334, 403070, 1303428, 1929756, 1931953, 2082680, 2161690, 2590310, 2600814], "first_release_date": 1303171200, "follows": 971, "franchises": [1724], "game_engines": [3], "game_modes": [1, 2, 3, 4], "genres": [5, 8, 9, 31], "involved_companies": [106733, 106734], "keywords": [350, 453, 575, 592, 1026, 1158, 1181, 1293, 1440, 1559, 1761, 2071, 2800, 3984, 4004, 4134, 4145, 4162, 4266, 4345, 4363, 4428, 4575, 4578, 4617, 4644, 4725, 4888, 4944, 4956, 4974, 5185, 5261, 5633, 5772, 5935, 5938, 5956, 6137, 6326, 6735, 6854, 7079, 7172, 7313, 7535, 7570, 7579, 8141, 8262, 8896, 9814, 10435, 11023, 11208, 12516, 14224, 18139, 18567, 27032], "multiplayer_modes": [11591, 11592, 11593, 11594, 11595], "name": "Portal 2", "platforms": [3, 6, 9, 12, 14], "player_perspectives": [1], "rating": 91.6894220983232, "rating_count": 2765, "release_dates": [104964, 104965, 208203, 208204, 208205, 208206, 208207, 208208], "screenshots": [725, 726, 727, 728, 729], "similar_games": [71, 1877, 7350, 11646, 16992, 22387, 28070, 55038, 55190, 56033], "slug": "portal-2", "storyline": "You lost your memory, you are alone in a world full of danger, and your mission is survive using your mind. The only way to get out from this hell is.....Hi i'm GLAdOS, and welcome to the amazing world of portal 2, here i will expose you to a lot of tests, and try to k.. help Aperture Science envolve in a new era.\nYour job is advance in the levels i propose and get better and better, you will have an portal gun to help you, and remember nothing is impossible if you try, and try again and again and again....\nThe puzzles are waiting for you!", "summary": "Sequel to the acclaimed Portal (2007), Portal 2 pits the protagonist of the original game, Chell, and her new robot friend, Wheatley, against more puzzles conceived by GLaDOS, an A.I. with the sole purpose of testing the Portal Gun's mechanics and taking revenge on Chell for the events of Portal. As a result of several interactions and revelations, Chell once again pushes to escape Aperture Science Labs.", "tags": [1, 18, 27, 268435461, 268435464, 268435465, 268435487, 536871262, 536871365, 536871487, 536871504, 536871938, 536872070, 536872093, 536872205, 536872352, 536872471, 536872673, 536872983, 536873712, 536874896, 536874916, 536875046, 536875057, 536875074, 536875178, 536875257, 536875275, 536875340, 536875487, 536875490, 536875529, 536875556, 536875637, 536875800, 536875856, 536875868, 536875886, 536876097, 536876173, 536876545, 536876684, 536876847, 536876850, 536876868, 536877049, 536877238, 536877647, 536877766, 536877991, 536878084, 536878225, 536878447, 536878482, 536878491, 536879053, 536879174, 536879808, 536880726, 536881347, 536881935, 536882120, 536883428, 536885136, 536889051, 536889479, 536897944], "themes": [1, 18, 27], "total_rating": 92.0669332713838, "total_rating_count": 2778, "updated_at": 1670514780, "url": "https://www.igdb.com/games/portal-2", "videos": [432, 16451, 17844, 17845], "websites": [17869, 17870, 41194, 41195, 150881, 150882, 150883, 296808], "checksum": "bcca1b61-2b30-13b8-a0ec-faf45d2ffdad", "game_localizations": [726]}, "trusted": true, "url": "https://store.steampowered.com/app/620", "checksum": "5281f967-6dfe-7658-96c6-af00ce010bbc"}]
\ No newline at end of file
diff --git a/test_data/igdb_websites_fields____where_game_url____https___www_igdb_com_games_portal_2__ b/test_data/igdb_websites_fields____where_game_url____https___www_igdb_com_games_portal_2__
new file mode 100644
index 00000000..2e05628c
--- /dev/null
+++ b/test_data/igdb_websites_fields____where_game_url____https___www_igdb_com_games_portal_2__
@@ -0,0 +1 @@
+[{"id": 17869, "category": 1, "game": 72, "trusted": false, "url": "http://www.thinkwithportals.com/", "checksum": "c40d590f-93bd-b86e-243c-73746c08be3b"}, {"id": 17870, "category": 13, "game": 72, "trusted": true, "url": "https://store.steampowered.com/app/620", "checksum": "5281f967-6dfe-7658-96c6-af00ce010bbc"}, {"id": 41194, "category": 3, "game": 72, "trusted": true, "url": "https://en.wikipedia.org/wiki/Portal_2", "checksum": "7354f471-16d6-5ed9-b4e4-049cceaab562"}, {"id": 41195, "category": 4, "game": 72, "trusted": true, "url": "https://www.facebook.com/Portal", "checksum": "035f6b48-3be1-77d5-1567-cf6fd8116ee7"}, {"id": 150881, "category": 9, "game": 72, "trusted": true, "url": "https://www.youtube.com/user/Valve", "checksum": "c1d4afb9-e96d-02f1-73bd-3384622e6aee"}, {"id": 150882, "category": 5, "game": 72, "trusted": true, "url": "https://twitter.com/valvesoftware", "checksum": "62bb9586-3293-bb01-f675-d65323ae371c"}, {"id": 150883, "category": 2, "game": 72, "trusted": false, "url": "https://theportalwiki.com/wiki/Portal_2", "checksum": "af689276-28c8-b145-7b19-f1d7df878c2a"}, {"id": 296808, "category": 6, "game": 72, "trusted": true, "url": "https://www.twitch.tv/directory/game/Portal%202", "checksum": "65629340-6190-833d-41b1-8eaf31918df3"}]
\ No newline at end of file
diff --git a/test_data/igdb_websites_fields____where_game_url____https___www_igdb_com_games_the_legend_of_zelda_breath_of_the_wild__ b/test_data/igdb_websites_fields____where_game_url____https___www_igdb_com_games_the_legend_of_zelda_breath_of_the_wild__
new file mode 100644
index 00000000..3303e0b1
--- /dev/null
+++ b/test_data/igdb_websites_fields____where_game_url____https___www_igdb_com_games_the_legend_of_zelda_breath_of_the_wild__
@@ -0,0 +1 @@
+[{"id": 12644, "category": 1, "game": 7346, "trusted": false, "url": "http://www.zelda.com/breath-of-the-wild/", "checksum": "3d2ca280-a2d0-5664-c8a5-69eeeaf13558"}, {"id": 12645, "category": 2, "game": 7346, "trusted": false, "url": "http://zelda.wikia.com/wiki/The_Legend_of_Zelda:_Breath_of_the_Wild", "checksum": "d5cb4657-dc8e-9de1-9643-b1ef64812d9f"}, {"id": 12646, "category": 3, "game": 7346, "trusted": true, "url": "https://en.wikipedia.org/wiki/The_Legend_of_Zelda:_Breath_of_the_Wild", "checksum": "c4570c3c-3a04-8d24-399a-0c04a17e7c56"}, {"id": 65034, "category": 14, "game": 7346, "trusted": true, "url": "https://www.reddit.com/r/Breath_of_the_Wild", "checksum": "f60505b3-18a4-3d60-9db2-febe4c6cb492"}, {"id": 169666, "category": 6, "game": 7346, "trusted": true, "url": "https://www.twitch.tv/nintendo", "checksum": "e2b20791-a9c4-76ad-4d76-3e7abc9148bb"}, {"id": 169667, "category": 9, "game": 7346, "trusted": true, "url": "https://www.youtube.com/nintendo", "checksum": "1e1c08ba-8f89-b567-0029-1d8aac22d147"}, {"id": 169668, "category": 4, "game": 7346, "trusted": true, "url": "https://www.facebook.com/Nintendo", "checksum": "046d8c8e-8f1d-8813-1266-c2911f490ba7"}, {"id": 169669, "category": 5, "game": 7346, "trusted": true, "url": "https://twitter.com/NintendoAmerica", "checksum": "e06dd12f-b6c5-ef72-f287-a9cebba12fa1"}, {"id": 169670, "category": 8, "game": 7346, "trusted": true, "url": "https://www.instagram.com/nintendo", "checksum": "dbff9e02-e9c2-f395-7e48-7e70cf58225c"}]
\ No newline at end of file
diff --git a/timeline/templates/timeline.html b/timeline/templates/timeline.html
index 17e89fd8..26a51fbb 100644
--- a/timeline/templates/timeline.html
+++ b/timeline/templates/timeline.html
@@ -43,7 +43,7 @@
- {% include "partial/_navbar.html" %}
+ {% include "partial/_navbar.html" with current="timeline" %}
diff --git a/users/templates/users/data.html b/users/templates/users/data.html
index d9f6a19a..f17374ec 100644
--- a/users/templates/users/data.html
+++ b/users/templates/users/data.html
@@ -20,7 +20,7 @@
- {% include "partial/_navbar.html" %}
+ {% include "partial/_navbar.html" with current="data" %}
diff --git a/users/templates/users/home.html b/users/templates/users/home.html
index 678fab01..f605486e 100644
--- a/users/templates/users/home.html
+++ b/users/templates/users/home.html
@@ -27,7 +27,7 @@
- {% include "partial/_navbar.html" %}
+ {% include "partial/_navbar.html" with current="home" %}
diff --git a/users/templates/users/preferences.html b/users/templates/users/preferences.html
index 4f0fa258..42e8274c 100644
--- a/users/templates/users/preferences.html
+++ b/users/templates/users/preferences.html
@@ -20,7 +20,7 @@
- {% include "partial/_navbar.html" %}
+ {% include "partial/_navbar.html" with current="preferences" %}
+ +-
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
++ + 185 + 有用 + + + + 柴斯卡 + 2015-04-15 10:36:39 + + +
++ + 1、他对女士们爱得深沉 2、他可真够自恋的 3、有点像曹雪芹一丝不苟地追忆童年的荣华富贵,王小波巨细无遗地回顾着他上过的姑娘 4、真·欧式文艺片:动乱的年代里用做爱来逃避一切,做到对青春的回忆大部分成为#SM学# (弥天大雾) +
+ ++ + 1475 + 有用 + + + + 小红帽 + + 2011-07-26 20:32:01 + + +
++ + 陈清扬极力想把性与爱分开。拍在她屁股上的两巴掌,让她放弃了所谓的“自尊”,爱上了王二这个混蛋 + +
+ ++ + 495 + 有用 + + + + 晚回舟 + + 2012-08-07 10:00:26 + + +
++ + 王小波该是个有趣的人,多黑暗的年代偏写得这么喜感,但两人相处细节部分又觉得他真是天才,写得出糙也写得出美。性很动人,情感挣扎很动人,最后终于承认的爱也很动人。PS,看全文实在太顺溜实在让人以为作者信手拈来,后来看他自己的评才知道这故事写了二十年,果然状似不经意的作品原来最费心力。 +
+ ++ + 4832 + 有用 + + + + 小岩井 + + 2012-07-10 20:01:08 + + +
++ + 那一天我二十一岁,在我一生的黄金时代。我有好多奢望。我想爱,想吃,还想在一瞬 +间变成天上半明半暗的云。后来我才知道,生活就是个缓慢受锤的过程,人一天天老下去,奢望也一天天消失,最后变得像挨了锤的牛一样。可是我过二十一岁生日时没有预见到这一点。我觉得自己会永远生猛下去,什么也锤不了 +
+ ++ + 352 + 有用 + + + + yesshen + + 2015-05-27 03:10:35 + + +
++ + 想不到人生中还有第二本与《麦田里的守望者》一样,十分有名,十分叫座,但我无论如何都无法喜爱的书。 +
+ ++ +-
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
++ + 0 + 有用 + + + + 在野按摩大师 + + 2022-12-06 00:17:13 + 上海 + +
++ + 我爱王小波 +
+ ++ + 0 + 有用 + + + + 😄 + + 2022-12-05 16:04:08 + 陕西 + +
++ + 五个短篇故事的合集。其中最喜欢黄金时代。王小波的书有一个特点,看的时候觉得蛮有意思,但是看完你忘了他在讲什么。在回家的高铁上“听”完《我的阴阳两届》 +看完啦 +也到家啦! +
+ ++ + 0 + 有用 + + + + selena + + 2022-12-05 14:26:36 + 广东 + +
++ + 刚读的时候觉得有点不舒服,因为里面的性描写太露骨了,但是慢慢读下去,却觉得荒谬而又正常。最难忘的是贺先生的死,读来很郁闷,在那样的年代这样的事也不少。很喜欢书里的一句话:我不能选择怎么生,怎么死;但我能决定怎么爱,怎么活。 +
+ ++ + 0 + 有用 + + + + Ggg + + 2022-12-05 01:48:08 + 浙江 + +
++ + 聪明的王二 +
+ ++ + 0 + 有用 + + + + qinghe + + 2022-12-04 23:54:48 + 河北 + +
++ + 色 +
+ +