IMDbPY is a Python package useful to retrieve and manage the data of the IMDb movie database about movies, people, characters and companies

Overview

PyPI version. Supported Python versions. Project license. Travis CI build status.

IMDbPY is a Python package for retrieving and managing the data of the IMDb movie database about movies, people and companies.

Revamp notice

Starting on November 2017, many things were improved and simplified:

  • moved the package to Python 3 (compatible with Python 2.7)
  • removed dependencies: SQLObject, C compiler, BeautifulSoup
  • removed the "mobile" and "httpThin" parsers
  • introduced a test suite (please help with it!)

Main features

  • written in Python 3 (compatible with Python 2.7)
  • platform-independent
  • can retrieve data from both the IMDb's web server, or a local copy of the database
  • simple and complete API
  • released under the terms of the GPL 2 license

IMDbPY powers many other software and has been used in various research papers. Curious about that?

Installation

Whenever possible, please use the latest version from the repository:

pip install git+https://github.com/alberanid/imdbpy

But if you want, you can also install the latest release from PyPI:

pip install imdbpy

Example

Here's an example that demonstrates how to use IMDbPY:

from imdb import IMDb

# create an instance of the IMDb class
ia = IMDb()

# get a movie
movie = ia.get_movie('0133093')

# print the names of the directors of the movie
print('Directors:')
for director in movie['directors']:
    print(director['name'])

# print the genres of the movie
print('Genres:')
for genre in movie['genres']:
    print(genre)

# search for a person name
people = ia.search_person('Mel Gibson')
for person in people:
   print(person.personID, person['name'])

Getting help

Please refer to the support page on the project homepage and to the the online documentation on Read The Docs.

The sources are available on GitHub.

License

Copyright (C) 2004-2019 Davide Alberani <da --> mimante.net> et al.

IMDbPY is released under the GPL license, version 2 or later. Read the included LICENSE.txt file for details.

NOTE: For a list of persons who share the copyright over specific portions of code, see the CONTRIBUTORS.txt file.

NOTE: See also the recommendations in the DISCLAIMER.txt file.

Comments
  • IMDb redesign broke most of the parsers on Dec. 19, 2017

    IMDb redesign broke most of the parsers on Dec. 19, 2017

    Issue description

    For the past couple of days, fetching information with imdpy is broken. For example, using the doc example of fetching data for "The Untouchables" yields a title of 'The leading information resource for the entertainment industry'

    Version of IMDbPY, Python and OS

    • Python: Python 3.6.4
    • IMDbPY: 6.2
    • OS: uname_result(system='Darwin', node='arioso', release='15.6.0', version='Darwin Kernel Version 15.6.0: Mon Nov 13 21:58:35 PST 2017; root:xnu-3248.72.11~1/RELEASE_X86_64', machine='x86_64', processor='i386')

    Steps to reproduce the issue

    >>> import imdb
    >>> ia = imdb.IMDb()
    >>> s_result = ia.search_movie("The Untouchables")
    >>> the_unt = s_result[0]
    >>> ia.update(the_unt)
    >>> the_unt['runtime']
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/local/lib/python3.6/site-packages/imdb/utils.py", line 1480, in __getitem__
        rawData = self.data[key]
    KeyError: 'runtimes'
    >>> the_unt['rating']
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/local/lib/python3.6/site-packages/imdb/utils.py", line 1480, in __getitem__
        rawData = self.data[key]
    KeyError: 'rating'
    >>> the_unt['title']
    'The leading information resource for the entertainment industry'
    >>> the_unt.keys()
    ['title', 'kind', 'year', 'akas', 'plot', 'canonical title', 'long imdb title', 'long imdb canonical title', 'smart canonical title', 'smart long imdb canonical title']
    >>> the_unt['kind']
    'movie'
    >>> the_unt['year']
    2017
    >>> the_unt['akas']
    ['The Untouchables']
    >>> the_unt['plot']
    ["A comedic look at the relationship between a wealthy paraplegic and an unemployed man with a criminal record who's hired to help him."]
    >>> the_unt['canonical title']
    'leading information resource for the entertainment industry, The'
    >>> the_unt['long imdb title']
    'The leading information resource for the entertainment industry (2017)'
    

    What's the expected result?

    • real movie data

    What's the actual result?

    • random marketing strings for imdb.com, or missing key errors of internal data

    Additional details

    bug http help needed 
    opened by itsayellow 27
  • Website redesign

    Website redesign

    Hi everyone!

    I don't know where tickets related to the website should go, so I'm writing this here, apologies if it's the wrong place.

    I am currently attending a UI design course and, as an exercise, I decided to redesign the current website. I thought it needed a fresh new look, so here it is: please comment, leave your feedback and thoughts.

    Thank you!

    Web 1280 – 1 Web 1280 – 2 Web 1280 – 3 Web 1280 – 4 Web 1280 – 5

    opened by albemala 21
  • More flaky tests

    More flaky tests

    Issue description

    Currently, during python3.7 rebuilds for Arch Linux, I see more broken tests

    Version of IMDbPY, Python and OS

    • Python: 3.7
    • IMDbPY: 6.5
    • OS: Arch Linux

    Steps to reproduce the issue

    python setup.py build
    export PYTHONPATH=${srcdir}/${pkgname}-${pkgver}/build:${PYTHONPATH}
    py.test
    

    What's the expected result?

    • All tests succeed

    What's the actual result?

    • Some tests fail.

    Additional details

    ============================= test session starts ==============================
    platform linux -- Python 3.7.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
    rootdir: /build/python-imdbpy/src/python-imdbpy-6.5, inifile:
    plugins: cov-2.5.1
    collected 157 items
    
    tests/test_http_chart_bottom.py ...                                      [  1%]
    tests/test_http_chart_top.py .....                                       [  5%]
    tests/test_http_company_main.py .                                        [  5%]
    tests/test_http_gather_refs.py .                                         [  6%]
    tests/test_http_movie_combined.py ..............ss..............ss...... [ 30%]
    ....................ss............................                       [ 62%]
    tests/test_http_movie_keywords.py ..                                     [ 63%]
    tests/test_http_movie_plot.py ...                                        [ 65%]
    tests/test_http_movie_reviews.py .                                       [ 66%]
    tests/test_http_movie_sites.py .                                         [ 66%]
    tests/test_http_movie_taglines.py F..                                    [ 68%]
    tests/test_http_movie_votes.py ....F.                                    [ 72%]
    tests/test_http_person_bio.py ..F.F.........F...                         [ 84%]
    tests/test_http_person_main.py ......                                    [ 87%]
    tests/test_http_person_otherworks.py ...                                 [ 89%]
    tests/test_http_search_company.py .                                      [ 90%]
    tests/test_http_search_keyword.py ....                                   [ 92%]
    tests/test_http_search_movie.py .F.....                                  [ 97%]
    tests/test_http_search_movie_keyword.py ...                              [ 99%]
    tests/test_http_search_person.py .                                       [100%]
    
    =================================== FAILURES ===================================
    ____________ test_movie_taglines_single_should_be_a_list_of_phrases ____________
    
    movie_taglines = <function movie_taglines.<locals>.retrieve at 0x7f4469627f28>
    
        def test_movie_taglines_single_should_be_a_list_of_phrases(movie_taglines):
            page = movie_taglines('if....')
            data = parser.parse(page)['data']
    >       assert data['taglines'] == ['Which side will you be on?']
    E       assert ['Which side ...ilm Festival'] == ['Which side will you be on?']
    E         Left contains more items, first extra item: 'Winner "Best Film" Cannes Film Festival'
    E         Use -v to get the full diff
    
    tests/test_http_movie_taglines.py:21: AssertionError
    _________________ test_movie_ratings_demographics_should_be_19 _________________
    
    movie_ratings = <function movie_ratings.<locals>.retrieve at 0x7f4469627510>
    
        def test_movie_ratings_demographics_should_be_19(movie_ratings):
            page = movie_ratings('matrix')
            data = parser.parse(page)['data']
    >       assert len(data['demographics']) == 19
    E       AssertionError: assert 18 == 19
    E        +  where 18 = len({'aged 18 29': {'rating': 8.6, 'votes': 391694}, 'aged 30 44': {'rating': 8.8, 'votes': 529555}, 'aged 45 plus': {'rating': 8.5, 'votes': 113536}, 'aged under 18': {'rating': 8.4, 'votes': 2120}, ...})
    
    tests/test_http_movie_votes.py:45: AssertionError
    ___________________ test_birth_date_should_be_in_ymd_format ____________________
    
    person_bio = <function person_bio.<locals>.retrieve at 0x7f446975dd90>
    
        def test_birth_date_should_be_in_ymd_format(person_bio):
            page = person_bio('fred astaire')
            data = parser.parse(page)['data']
    >       assert data['birth date'] == '1899-5-10'
    E       KeyError: 'birth date'
    
    tests/test_http_person_bio.py:35: KeyError
    ___________________ test_death_date_should_be_in_ymd_format ____________________
    
    person_bio = <function person_bio.<locals>.retrieve at 0x7f446975dd90>
    
        def test_death_date_should_be_in_ymd_format(person_bio):
            page = person_bio('fred astaire')
            data = parser.parse(page)['data']
    >       assert data['death date'] == '1987-6-22'
    E       KeyError: 'death date'
    
    tests/test_http_person_bio.py:47: KeyError
    _______________________ test_trade_mark_should_be_a_list _______________________
    
    person_bio = <function person_bio.<locals>.retrieve at 0x7f446975dd90>
    
        def test_trade_mark_should_be_a_list(person_bio):
            page = person_bio('julia roberts')
            data = parser.parse(page)['data']
    >       assert len(data['trade mark']) == 2
    E       AssertionError: assert 3 == 2
    E        +  where 3 = len(['Her bright smile', 'Gentle voice', 'Her mole.'])
    
    tests/test_http_person_bio.py:107: AssertionError
    ________ test_found_many_result_should_contain_correct_number_of_movies ________
    
    search_movie = <function search_movie.<locals>.retrieve at 0x7f44695ff730>
    
        @mark.fragile
        def test_found_many_result_should_contain_correct_number_of_movies(search_movie):
            page = search_movie('ace in the hole')
            data = parser.parse(page)['data']
    >       assert 185 < len(data) < 200
    E       AssertionError: assert 200 < 200
    E        +  where 200 = len([('0043338', {'kind': 'movie', 'title': 'Ace in the Hole', 'year': 1951}), ('1441232', {'kind': 'tv movie', 'title': '...tle': 'Ace in the Hole', 'year': 2015}), ('0149583', {'kind': 'short', 'title': 'Ace in the Hole', 'year': 1942}), ...])
    
    tests/test_http_search_movie.py:30: AssertionError
    ============== 6 failed, 145 passed, 6 skipped in 107.08 seconds ===============
    
    
    opened by dvzrv 16
  • Fix og_title matching - empty dict for kinds other than movie

    Fix og_title matching - empty dict for kinds other than movie

    Previous regexp didn't match TV series (and probably other kinds).

    Sample og_tilte values

    Agents of S.H.I.E.L.D. (TV Series 2013– )
    Lost (TV 2004–2010)
    The Matrix (1999)
    

    Related to #103

    Before

    In [7]: ia.get_movie('2364582')
    Out[7]: <Movie id:2364582[http] title:_None_>
    

    After

    In [3]: ia.get_movie('2364582')
    Out[3]: <Movie id:2364582[http] title:_"Agents of S.H.I.E.L.D." (2013)_>
    

    Parsed title

    In [6]: analyze_og_title(u'Agents of S.H.I.E.L.D. (TV Series 2013– )')
    Out[6]: 
    {'kind': u'tv series',
     'series years': u'',
     'title': u'Agents of S.H.I.E.L.D.',
     'year': 2013}
    
    In [7]: analyze_og_title(u'Lost (TV Series 2004–2010)')
    Out[7]: {'kind': u'tv series', 'series years': u'2010', 'title': u'Lost', 'year': 2004}
    
    In [8]: analyze_og_title(u'The Matrix (1999)')
    Out[8]: {'kind': 'movie', 'title': u'The Matrix', 'year': 1999}
    
    opened by jsynowiec 16
  • SSL: CERTIFICATE_VERIFY_FAILED certificate verify failed (_ssl.c:833)

    SSL: CERTIFICATE_VERIFY_FAILED certificate verify failed (_ssl.c:833)

    Issue description

    First time trying the example sample code and receiving this error.

    Version of IMDbPY, Python and OS

    • Python: Python 3.6.5
    • IMDbPY: 6.5
    • OS: ('Darwin', 'MacBook-Pro-de-Tiago.local', '17.6.0', 'Darwin Kernel Version 17.6.0: Tue May 8 15:22:16 PDT 2018; root:xnu-4570.61.1~1/RELEASE_X86_64', 'x86_64', 'i386')

    Steps to reproduce the issue

    if possible, provide a minimal code to reproduce the problem

    from imdb import IMDb
    
    # create an instance of the IMDb class
    ia = IMDb()
    
    # get a movie
    movie = ia.get_movie('0133093')
    print(movie)
    

    What's the expected result?

    Not sure, exactly.. movie info?! First time..

    What's the actual result?

    Traceback (most recent call last):
      File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/imdb/__init__.py", line 706, in update
        ret = method(mopID)
      File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/imdb/parser/http/__init__.py", line 425, in get_movie_plot
        cont = self._retrieve(self.urls['movie_main'] % movieID + 'plotsummary')
      File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/imdb/parser/http/__init__.py", line 379, in _retrieve
        ret = self.urlOpener.retrieve_unicode(url, size=size)
      File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/imdb/parser/http/__init__.py", line 208, in retrieve_unicode
        'original exception': e}
    imdb._exceptions.IMDbDataAccessError: {'errcode': 'socket error', 'errmsg': '[Errno socket error] [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:833)', 'url': 'http://www.imdb.com/title/tt0133093/plotsummary', 'proxy': '', 'exception type': 'IOError', 'original exception': OSError('socket error', OSError('socket error', SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:833)')))}
    

    Additional details

    opened by tiagoaquinofl 13
  • imdbpy2sql.py never completes (OS X 10.7.5 Lion)

    imdbpy2sql.py never completes (OS X 10.7.5 Lion)

    I've tried to run imdbpy2sql.py three times now and each time it gets to the stage "adding foreign keys" and stalls. I left it running for more than 24 hours then gave up. Running it again I can see it get to around 47/48 minutes CPU time in Activity Monitor (which is like a GUI version of the top command) then nothing happens. There's no disk activity and the memory usage is zero.

    I set the computer never to sleep and ran the command through nohup in case that was a factor but the same thing happened.

    As it's done most of the work except for the foreign keys, is there a way I can re-run it, skipping everything else and just doing the foreign keys?

    opened by ambrosechapel 13
  • SSL handshake failure

    SSL handshake failure

    Issue description

    write the description here

    There appears to be some sort of requests handshake issue:

    All matching attempt leads to this:

    Traceback (most recent call last): File "/usr/local/lib/python3.6/site-packages/IMDbPY-6.6.dev20180501-py3.6.egg/imdb/parser/http/init.py", line 183, in retrieve_unicode uopener = self.open(url) File "/usr/local/lib/python3.6/urllib/request.py", line 1763, in open raise OSError('socket error', msg).with_traceback(sys.exc_info()[2]) File "/usr/local/lib/python3.6/urllib/request.py", line 1757, in open return getattr(self, name)(url) File "/usr/local/lib/python3.6/urllib/request.py", line 1936, in open_http return self._open_generic_http(http.client.HTTPConnection, url, data) File "/usr/local/lib/python3.6/urllib/request.py", line 1932, in _open_generic_http response.status, response.reason, response.msg, data) File "/usr/local/lib/python3.6/urllib/request.py", line 1948, in http_error result = method(url, fp, errcode, errmsg, headers) File "/usr/local/lib/python3.6/urllib/request.py", line 2136, in http_error_302 headers, data) File "/usr/local/lib/python3.6/urllib/request.py", line 2167, in redirect_internal return self.open(newurl) File "/usr/local/lib/python3.6/urllib/request.py", line 1763, in open raise OSError('socket error', msg).with_traceback(sys.exc_info()[2]) File "/usr/local/lib/python3.6/urllib/request.py", line 1757, in open return getattr(self, name)(url) File "/usr/local/lib/python3.6/urllib/request.py", line 1967, in open_https return self._open_generic_http(self._https_connection, url, data) File "/usr/local/lib/python3.6/urllib/request.py", line 1916, in _open_generic_http http_conn.request("GET", selector, headers=headers) File "/usr/local/lib/python3.6/http/client.py", line 1239, in request self._send_request(method, url, body, headers, encode_chunked) File "/usr/local/lib/python3.6/http/client.py", line 1285, in _send_request self.endheaders(body, encode_chunked=encode_chunked) File "/usr/local/lib/python3.6/http/client.py", line 1234, in endheaders self._send_output(message_body, encode_chunked=encode_chunked) File "/usr/local/lib/python3.6/http/client.py", line 1026, in _send_output self.send(msg) File "/usr/local/lib/python3.6/http/client.py", line 964, in send self.connect() File "/usr/local/lib/python3.6/http/client.py", line 1400, in connect server_hostname=server_hostname) File "/usr/local/lib/python3.6/ssl.py", line 407, in wrap_socket _context=self, _session=session) File "/usr/local/lib/python3.6/ssl.py", line 814, in init self.do_handshake() File "/usr/local/lib/python3.6/ssl.py", line 1068, in do_handshake self._sslobj.do_handshake() File "/usr/local/lib/python3.6/ssl.py", line 689, in do_handshake self._sslobj.do_handshake() OSError: [Errno socket error] [Errno socket error] EOF occurred in violation of protocol (_ssl.c:833)

    Version of IMDbPY, Python and OS

    • Python: python3 -V or, if you are using Python 2, python -V
    • IMDbPY: python3 -c 'import imdb ; print(imdb.VERSION)' or, if you are using Python 2, python -c 'import imdb ; print(imdb.VERSION)'
    • OS: python -c 'import platform ; print(platform.uname())'

    python - Python 3.6.5rc1 imdbpy - 6.6dev20180415 OS - uname_result(system='Linux', node='ushapld00167.stg-tfayd.com', release='2.6.32-573.26.1.el6.x86_64', version='#1 SMP Tue May 3 12:39:43 PDT 2016', machine='x86_64', processor='x86_64')

    Steps to reproduce the issue

    if possible, provide a minimal code to reproduce the problem

    #!python
    
    # your code here
    

    ia = imdb.IMDb() ia.set_proxy(proxy) results = ia.search_movie(title)

    What's the expected result?

    -A search for movies.

    What's the actual result?

    • SSL handshake issues.

    Additional details

    • I've attempting force reinstalling every module I can think of.
    bug http 
    opened by rednibia 12
  • HTTPError 403 fetching web pages

    HTTPError 403 fetching web pages

    Issue description

    As in the description.

    Version of Cinemagoer, Python and OS

    • Python: Python 3.9.2
    • Cinemagoer: 2022.02.11
    • OS: uname_result(system='Linux', node='raspberrypi', release='5.15.61+', version='#1579 Fri Aug 26 11:08:59 BST 2022', machine='armv6l')

    Steps to reproduce the issue

    import imdb
    ia = imdb.Cinemagoer()
    ia.search_movie('The Curious Case of Benjamin Button')
    

    Try multiple times. Occurs only sometimes.

    What's the expected result?

    [<Movie id:0421715[http] title:_The Curious Case of Benjamin Button (2008)_>, <Movie id:3011584[http] title:_"Zoom In" The Curious Case of Benjamin Button (2008)_>, <Movie id:7229412[http] title:_"Chris Stuckmann Movie Reviews" The Curious Case of Benjamin Button (2014)_>, <Movie id:18793490[http] title:_The Curious Case of Benjamin Button by F. Scott Fitzgerald (Short Story Month) (2019) (Podcast Episode) - The Drunk Guys Book Club Podcast (2017)_>, <Movie id:17184240[http] title:_The Curious Case of Benjamin Button by F. Scott Fitzgerald (2021) (Podcast Episode) - Just Sleep - Bedtime Stories for Adults (2021)_>, <Movie id:19831222[http] title:_The Curious Case of Benjamin Button âEUR¢ The Next Reel (2012) (Podcast Episode) - The Next Reel Film Podcast Master Feed (2011)_>, <Movie id:3487928[http] title:_"Partners" The Curious Case of Benjamin Butt-Ugly (2014)_>, <Movie id:1430122[http] title:_The Curious Birth of Benjamin Button (2009) (V)_>, <Movie id:8343064[http] title:_"RealTVFilms" Alexandre Desplat, Curious Case of Benjamin Button (2009)_>, <Movie id:22311096[http] title:_The Curious Case of Benja-Scam Button w/ Josh Brekhus (2022) (Podcast Episode) - Scam Goddess (2019)_>, <Movie id:17497930[http] title:_"SSDM" What is THE CURIOUS CASE OF BENJAMIN BUTTON really about? (2021)_>, <Movie id:2135211[http] title:_"Hollywood on Set" Ink Heart/Paul Blart: Mall Cop/The Curious Case of Benjamin Button (2009)_>, <Movie id:18151852[http] title:_Bavarian Podcast Works Flagship Show S4E14: Rotations for Bayern, the futures for Sabitzer & Musiala, the curious case of Benjamin Pavard, the Ballon d'Or, and more! (2021) (Podcast Episode) - Bavarian Football Works: For Bayern Munich fans (2019)_>]
    

    What's the actual result?

    Traceback (most recent call last):
      File "/home/roy/.local/lib/python3.9/site-packages/imdb/parser/http/__init__.py", line 221, in retrieve_unicode
        response = uopener.open(url)
      File "/usr/lib/python3.9/urllib/request.py", line 523, in open
        response = meth(req, response)
      File "/usr/lib/python3.9/urllib/request.py", line 632, in http_response
        response = self.parent.error(
      File "/usr/lib/python3.9/urllib/request.py", line 561, in error
        return self._call_chain(*args)
      File "/usr/lib/python3.9/urllib/request.py", line 494, in _call_chain
        result = func(*args)
      File "/usr/lib/python3.9/urllib/request.py", line 641, in http_error_default
        raise HTTPError(req.full_url, code, msg, hdrs, fp)
    urllib.error.HTTPError: HTTP Error 405: Not Allowed
    Traceback (most recent call last):
      File "/home/roy/.local/lib/python3.9/site-packages/imdb/parser/http/__init__.py", line 221, in retrieve_unicode
        response = uopener.open(url)
      File "/usr/lib/python3.9/urllib/request.py", line 523, in open
        response = meth(req, response)
      File "/usr/lib/python3.9/urllib/request.py", line 632, in http_response
        response = self.parent.error(
      File "/usr/lib/python3.9/urllib/request.py", line 561, in error
        return self._call_chain(*args)
      File "/usr/lib/python3.9/urllib/request.py", line 494, in _call_chain
        result = func(*args)
      File "/usr/lib/python3.9/urllib/request.py", line 641, in http_error_default
        raise HTTPError(req.full_url, code, msg, hdrs, fp)
    urllib.error.HTTPError: HTTP Error 405: Not Allowed
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/home/roy/.local/lib/python3.9/site-packages/imdb/__init__.py", line 444, in search_movie
        res = self._search_movie(title, results)
      File "/home/roy/.local/lib/python3.9/site-packages/imdb/parser/http/__init__.py", line 408, in _search_movie
        cont = self._get_search_content('tt', title, results)
      File "/home/roy/.local/lib/python3.9/site-packages/imdb/parser/http/__init__.py", line 396, in _get_search_content
        cont = self._retrieve(self.urls['find'] % params)
      File "/home/roy/.local/lib/python3.9/site-packages/imdb/parser/http/__init__.py", line 379, in _retrieve
        ret = self.urlOpener.retrieve_unicode(url, size=size)
      File "/home/roy/.local/lib/python3.9/site-packages/imdb/parser/http/__init__.py", line 249, in retrieve_unicode
        raise IMDbDataAccessError(
    imdb._exceptions.IMDbDataAccessError: {'errcode': None, 'errmsg': 'None', 'url': 'https://www.imdb.com/find?q=The+Curious+Case+of+Benjamin+Button&s=tt', 'proxy': '', 'exception type': 'IOError', 'original exception': <HTTPError 405: 'Not Allowed'>}
    
    bug http 
    opened by Ryo-Sajima 11
  • HTTPError 308: Permanent Redirect

    HTTPError 308: Permanent Redirect

    Have IMDB changed the URL structure?

    raise IMDbDataAccessError( imdb._exceptions.IMDbDataAccessError: {'errcode': None, 'errmsg': 'None', 'url': 'https://www.imdb.com/find?q=the+batman&s=tt', 'proxy': '', 'exception type': 'IOError', 'original exception': <HTTPError 308: 'Permanent Redirect'>}

    Redirect to: https://www.imdb.com/find/?q=the%20batman&s=tt

    bug http 
    opened by xalienxx 10
  • series

    series "creator" seems to be broken

    Issue description

    parsing of series "creator" seems to be broken

    Version of IMDbPY, Python and OS

    • Python: 3.6.9
    • IMDbPY: 6.8
    • OS: ('Linux', '5.3.0-62-generic', '#56~18.04.1-Ubuntu SMP Wed Jun 24 16:17:03 UTC 2020', 'x86_64', 'x86_64')

    Steps to reproduce the issue

    ia = IMDb()
    m = ia.get_movie("2861424")
    print(m['creator'])
    

    What's the expected result?

    [<Person id:1363595[http] name:_Dan Harmon_>, <Person id:1551598[http] name:_Justin Roiland_>]
    

    What's the actual result?

    KeyError: 'creator'
    

    Additional details

    The current code for extracting series creators is:

                    foreach='//td[starts-with(text(), "Creator")]/..//a',
    

    Changing it to match the code for extracting writers/directors seems to work:

                    foreach='//div[starts-with(normalize-space(text()), "Creator")]/ul/li[1]/a',
    

    Although why this is wasn't entirely clear to me. The actual structure of the html is this:

        <div class="credit_summary_item">
            <h4 class="inline">Creators:</h4>
            <a href="/name/nm1363595/?ref_=tt_ov_wr">Dan Harmon</a>, 
            <a href="/name/nm1551598/?ref_=tt_ov_wr">Justin Roiland</a>    
        </div>
    

    Which looks a lot more like ..//a than ul/li[1]/a to my untrained eye. But the latter form seems to work. (Note that Directors and Writers seem to have the same html form given above.)

    bug http 
    opened by meeotch 10
  • The

    The "in" operator doesn't work as described in the documentation

    Issue description

    The documentation states that "key in movieObject" should indicate whether the key is available for the given movieObject but this doesn't work.

    Version of IMDbPY, Python and OS

    • Python: 3.6.4
    • IMDbPY: 6.5dev20180410
    • OS: Linux 4.13.0-37-generic #42~16.04.1-Ubuntu SMP x86_64

    Steps to reproduce the issue

    #!python
    
    from imdb import IMDb
    
    ia = IMDb()
    movie = ia.get_movie('0133093')
    print('title' in movie, 'title' in movie.keys())
    

    What's the expected result?

    True True

    What's the actual result?

    False True

    Additional details

    bug 
    opened by uyar 10
  • Parsing lists with unreleased titles

    Parsing lists with unreleased titles

    When using get_movie_list on one of my personal lists with currently unreleased titles the program crashes as the parser can't find a release year for some of the titles. The list contains for example the title with the following ID: 0455788. I'm actually only interested on getting the movieIDs from the list and not the Movie objects, but I'm couldn't find such a function here.

    File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/imdb/init.py", line 459, in get_movie_list res = self.get_movie_list(list, results) File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/imdb/parser/http/init.py", line 425, in _get_movie_list result_part = self.listProxy.list_parser.parse(cont, results=results)['data'] File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/imdb/parser/http/utils.py", line 434, in parse data = self.parse_dom(dom) File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/imdb/parser/http/utils.py", line 526, in parse_dom return Rules(self.rules).extract(dom) File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/imdb/parser/http/piculet.py", line 373, in extract value = self.apply(element) File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/imdb/parser/http/piculet.py", line 517, in apply extracted = rule.extract(subroot) File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/imdb/parser/http/piculet.py", line 582, in extract raw_values = [self.extractor.extract(r, transform=False) File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/imdb/parser/http/piculet.py", line 582, in raw_values = [self.extractor.extract(r, transform=False) File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/imdb/parser/http/piculet.py", line 373, in extract value = self.apply(element) File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/imdb/parser/http/piculet.py", line 517, in apply extracted = rule.extract(subroot) File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/imdb/parser/http/piculet.py", line 574, in extract value = self.extractor.extract(subroot) File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/imdb/parser/http/piculet.py", line 376, in extract return value if self.transform is None else self.transform(value) File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/imdb/parser/http/listParser.py", line 75, in transform=lambda x: int(''.join(i for i in x if i.isdigit())[:4]) ) ValueError: invalid literal for int() with base 10: ''

    bug http 
    opened by jsteinba 1
  • Limited movies returned for actors

    Limited movies returned for actors

    This is noted on the website changelog: "Please notice that since now, the person pages will return a very limited list of movies for each role."

    Is this intentional or a limitation? If intentional is there a way to return all of their movies?

    Thanks

    http support 
    opened by clearcutgit 3
  • Request to add movie age-range

    Request to add movie age-range

    Issue description

    write the description here

    Version of Cinemagoer, Python and OS

    NOTICE: please always try the latest version from the repository before submitting a bug.

    • Python: python3 -V or, if you are using Python 2, python -V
    • Cinemagoer: python3 -c 'import imdb ; print(imdb.VERSION)' or, if you are using Python 2, python -c 'import imdb ; print(imdb.VERSION)'
    • OS: python -c 'import platform ; print(platform.uname())'

    Steps to reproduce the issue

    if possible, provide a minimal code to reproduce the problem

    #!/usr/bin/env python
    
    # your code here
    

    What's the expected result?

    What's the actual result?

    Additional details

    enhancement http 
    opened by zahra-ash0uri 1
  • Help using AKAs / languages

    Help using AKAs / languages

    Issue description

    Can someone help me figure out where I am going wrong please? I am trying to translate titles.

    Version of Cinemagoer, Python and OS

    Name: cinemagoer
    Version: 2022.2.11
    Summary: Python package to access the IMDb's database
    Home-page: https://cinemagoer.github.io/
    Author: Davide Alberani
    Author-email: [email protected]
    License: GPL
    Location: c:\users\chris\appdata\local\packages\pythonsoftwarefoundation.python.3.9_qbz5n2kfra8p0\localcache\local-packages\python39\site-packages
    Requires: lxml, SQLAlchemy
    Required-by:
    

    Steps to reproduce the issue

    import imdb
    from imdb import helpers
    
    ia = imdb.Cinemagoer()
    
    movies = ia.search_movie('Tuż przed tragedią')
    print(helpers.akasLanguages(movies[0]))
    

    What's the expected result?

    I expect to see all of the languages and titles shown here: https://www.imdb.com/title/tt0462133/releaseinfo

    What's the actual result?

    Outputs: [(None, 'Tuż przed tragedią')]

    Additional details

    Perhaps I am using it wrong? I want to input a title in whatever language, find the movie/show, then see if the desired output language is in the AKAs.

    The example given above is the Polish name of a show. Lets assume I want to translate it to English. I would get Seconds from Disaster

    Thanks, Chris

    bug http 
    opened by Chris230291 1
  • Mismatch in

    Mismatch in "kind" parameter when using "ia.search_movie" and "ia.get_movie"

    Hello!

    I've got to say, fantastic job with this tooling, this is a great tool.

    However, I noticed an issue: Occasionally, with some titles, there's a mismatch with the "kind" result of search_movie and get_movie commands. For example, where get_movie gives you a "podcast episode", search_movie gives you "movie".

    A way to reproduce this result: Search phrase: "Better call saul - season 01 -" First result: 'DE TV Recap: Better Call Saul Season 5 Finale' IMDB-ID: 18612522 search_movie kind: "movie" get_movie kind: "podcast episode"

    Information: Python 3.10.0 Windows 10 or Linux platform / Ubuntu Server 20.04 LTS (both reproduce this same output) Cinemagoer version 2022.02.11

    opened by FinlandApollo 0
Releases(2022.12.27)
  • 2022.12.27(Dec 27, 2022)

  • 2022.12.04(Dec 4, 2022)

    A lot of fixes for person and movie pages. Since now, the person pages will return a very limited list of movies for each role; there is nothing we can do about it.

    • #232: add get_showtimes() method (courtesy of Kostya Farber)
    • #388: add 'videos' key to extract movie trailer links
    • #391: add parental guide advisory votes (courtesy of salehdeh76)
    • #395: fix for some wrongly-formatted titles (courtesy of tsaklidis)
    • #396: raise exception on resize image (courtesy of tsaklidis)
    • #398: fix for production status
    • #415: change User-Agent to a more complete form
    • #419: fix movie and person searches
    • #420: introduce a contributor guide (courtesy of Elizabeth Thorne)
    • #421: fixes for person parsers
    Source code(tar.gz)
    Source code(zip)
    CHANGELOG.txt(56.63 KB)
    cinemagoer-2022.12.4-py3-none-any.whl(292.30 KB)
    cinemagoer-2022.12.4.tar.gz(259.48 KB)
  • 2022.02.11(Feb 11, 2022)

  • 2022.01.26(Jan 26, 2022)

    NOTICE: the project has been renamed from IMDbPY to Cinemagoer.

    Complete changelog:

    [general]

    • #238: by default, exceptions are raised
    • #315: include all script in the ./bin directory
    • #318: fix kind of tv mini series in search results
    • #369: do not rebuild locales running setup.py clean
    • #371: support for 8-digit imdbIDs
    • #378: renamed to cinemagoer

    [http]

    • #308: fix movie connections parser
    • #319: parse review rating
    • #327: do not strip new lines
    • #329: improve localized and original title
    • #330: fix for tv series for seasons not found
    • #331: fix kind of tv mini series in search results
    • #342: parse all information from full credits
    • #343: fix for mpaa and certificates from parental guide page
    • #344: extract advisories from parental guide page
    • #346: collect raw info from country code
    • #348: fix for series with no episodes
    • #349: relevant keywords
    • #357: add support for TV Special
    • #366: fix full-size image links
    • #372: support fox box office charts
    Source code(tar.gz)
    Source code(zip)
    cinemagoer-2022.1.26-py3-none-any.whl(294.23 KB)
    cinemagoer-2022.1.26.tar.gz(265.50 KB)
  • 2021.04.18(Apr 18, 2021)

    • What's new in release 2021.04.18 (Black Sails)

      [general]

      • #289: Serbian translations
      • #290: update Portuguese translations
      • #291: allow direct access to filmography keys
      • #299: add pagination to get_movie_list (courtesy of Stein van Broekhoven)
      • #300: any iterable can be used as season_nums parameter of update_series_seasons
      • #305: fix ability to set logging level
      • #310: fix build of locales .mo files
      • #312: extract localized title

      [sql]

      • #287: fix missing logger
    Source code(tar.gz)
    Source code(zip)
    IMDbPY-2021.4.18-py3-none-any.whl(291.53 KB)
    IMDbPY-2021.4.18.tar.gz(258.28 KB)
Owner
Davide Alberani
A programmer with a soft spot for trash movies.
Davide Alberani
VALORANT rank yoinker lets you retrieve the ranks and basic informations of everyone in the lobby, regardless of gamemode.

vRY VALORANT rank yoinker Retrieve the rank and basic information of everyone in the lobby, regardless of gamemode. Table of Contents Terms of Use Abo

Isaac Kenyon 270 Dec 30, 2022
A tool written in Python used to instalock agents in VALORANT using the local API.

Valorant Instalock Tool v2.1.0 by Mr. SOSA A tool written in Python used to instalock agents in VALORANT using the local API. This is NOT a hotkey pro

Mr. SOSA 3 Nov 18, 2021
Bezlik Year Calendar Planner

Bezlik Year Calendar Planner Scribus script for creating year planners on one page A1 paper format. Script is based on Year-Calendar-Script-for-Scribu

Bohdan Bobrowski 2 May 24, 2022
Wordle-bot: A Discord bot to track you and your friends' Wordle scores.

wordle-bot A Discord bot to track you and your friends' Wordle scores, so you can see who's the best! To submit a score to wordle-bot, just paste the

Spencer Murray 8 Feb 16, 2022
An EmbedBuilder for Discord bots in Python.

An EmbedBuilder for Discord bots in Python. You need discord.py to use this module.

6 Jan 13, 2022
Gorrabot is a bot made to automate checks and processes in the development process.

Gorrabot is a Gitlab bot made to automate checks and processes in the Faraday development. Features Check that the CHANGELOG is modified By default, m

Faraday 7 Dec 14, 2022
Elon Muschioso is a Telegram bot that you can use to manage your computer from the phone.

elon Elon Muschioso is a Telegram bot that you can use to manage your computer from the phone. what does it do? Elon Muschio makes a connection from y

4 Feb 28, 2022
A Telegram Music Bot written in Python using Pyrogram and Py-Tgcalls

A Telegram Music Bot written in Python using Pyrogram and Py-Tgcalls. This is Also The Source Code of The UserBot Which is Playing Music in @S1-BOTS Support Group ❤️

SAF ONE 224 Dec 28, 2022
AI-El-Yazisini-Tanima - Fotoğraflardaki El Yazını Yapay Zeka İle Otomatik Tanıma Yazılımı

AI-El Yazısını Tanıma Fotoğraflardaki El Yazını Yapay Zeka İle Otomatik Tanıma Yazılımı Amaç : Birden fazla makine öğrenmesi modelini bir arada kullan

Özgür Tokay 3 Mar 02, 2022
Repositorio dedicado a contener los archivos fuentes del bot de discord "Lector de Ejercicios".

Lector de Ejercicios Este bot de discord está pensado para usarse únicamente en el discord de la materia Algoritmos y Programación I, de la Facultad d

Franco Lighterman Reismann 3 Sep 17, 2022
Tiktok BOT 1 link Vidio otomatis : - Nambah view - Nambah love - Nambah share - Nambah love komen (semua komen ke love)

Install Bahannya pip install selenium pip install pyfiglet==0.7.5 Cara Install dan Menjalankannya Git-clone this repo! Install selenium and pyfiglet u

Ahmad Ghozali 1 Mar 01, 2022
Linkvertise-bypass - Tools pour bypass les liens Linkvertise

Installation | Important | Discord 🌟 Comme Linkvertise bypass est gratuit, les

GalackQSM 3 Aug 31, 2022
A Very Simple Telegram Files Rename Bot by @AbirHasan2005

Rename-Bot This is a very simple Telegram Files Rename Bot by @AbirHasan2005. Features Rename Videos, Files or Audios. Permanent Custom Thumbnail Supp

Abir Hasan 124 Dec 25, 2022
Surfline Forecast Bot For Python

Surfline Forecast Bot A telegram bot created using Telethon that allows users to

1 May 08, 2022
Non official, but friendly QvaPay library for the Python language.

Python SDK for the QvaPay API Non official, but friendly QvaPay library for the Python language. Setup You can install this package by using the pip t

Carlos Lugones 17 Nov 25, 2022
The open source version of Tentro - A multipurpose Discord bot.

Welcome to Tentro 👋 A multipurpose Discord bot. 🏠 Homepage Install pip install -r requirements.txt Usage py Tentro.py Contributors 👤 Tentro Dev Tea

6 Jul 14, 2022
Images to PDF Telegram Bot

ilovepdf Convert Images to PDF Bot This bot will helps you to create pdf's from your images [without leaving telegram] 😉 By Default: your pdf fil

✰Naͥbiͣlͫ A Navab✰ 116 Dec 29, 2022
MemeBot - A discord bot that tracks how good people's memes are

MemeBot A discord Meme "Karma" Tracking bot Dependancies Make sure you have pymongo installed and a mongodb cluster setup with two collections. pip in

Uday Sharma 3 Aug 10, 2022
Filters to block and remove copycat-websites from DuckDuckGo and Google

uBlock Origin - Shitty Copy-Paste websites filter Filter for uBlock origin to remove spam-website results from DuckDuckGo and Google that just blatant

99 Dec 15, 2022
Melissa Songs is a telegram bot to easily find songs sending music snippets and search tracks 💃🏽🎵

Find songs on Telegram, like on Shazam... 😎 Open on telegram · Report Bug · Request Feature ⬇️ Installation To get a local copy installed and working

Joaquim Roque 21 Nov 10, 2022