Exemple #1
0
def detail(request, movie_id):
    if not request.user.is_authenticated():
        return render(request, 'movies/base.html')
    else:
        user = request.user
        imdb = Imdb()
        titledetails = imdb.get_title(movie_id)
        dlist = []
        detlist = []
        try:
            dlist.append(titledetails['base']['image']['url'])
        except:
            # insert a null image
            dlist.append(' ')

        detlist.append(titledetails['base']['title'])
        title = titledetails['base']['title']
        detlist.append(titledetails['base']['year'])
        try:
            min = int(titledetails['base']['runningTimeInMinutes'])
            hrs = int(min / 60)
            minutes = min - 60 * hrs
            time = str(hrs) + 'hr ' + str(minutes) + 'min'

            detlist.append(time)
        except:
            detlist.append('-')

        detlist.append(imdb.get_title_genres(movie_id)['genres'])
        try:
            detlist.append(titledetails['plot']['summaries'][0]['text'])
        except:
            detlist.append('-')
        try:
            #print('hello')
            castandcrew = imdb.get_title_credits(movie_id)
            castlist = []
            detdict = {}
            detdict['director'] = castandcrew['credits']['director'][0]['name']
            detdict['producer'] = castandcrew['credits']['producer'][0]['name']
            writers = []
            for i in castandcrew['credits']['writer']:
                writers.append(i['name'])
            writerset = set(writers)
            detdict['writers'] = list(writerset)

            detlist.append(detdict)
            for i in range(0, 6):
                castdict = {}
                castdict[castandcrew['credits']['cast'][i][
                    'name']] = castandcrew['credits']['cast'][i]['characters']
                castlist.append(castdict)
            detlist.append(castlist)
        except:
            detlist.append('-')
        dlist.append(detlist)
        return render(request, 'movies/moviedetails.html', {
            'dlist': dlist,
            'title': title
        })
Exemple #2
0
    def _fetch_metadata(self):
        searchtitle = self._title
        if searchtitle.endswith(", The"):
            searchtitle = "The {}".format(searchtitle[:-5])
        elif searchtitle.endswith(", A"):
            searchtitle = "A {}".format(searchtitle[:-3])

        imdb = Imdb()
        if "id" not in self._md:
            print("  * Searching IMDB")
            results = imdb.search_for_title(searchtitle)
            movie_results = [r for r in results if r["type"] == "feature" and r["year"] is not None]

            while len(movie_results) == 0:
                searchtitle = input("No results for \"%s\" Enter alternate/correct movie title >> " % searchtitle)

                results = imdb.search_for_title(searchtitle)
                movie_results = [r for r in results if r["type"] == "feature" and r["year"] is not None]

            exact_matches = [r for r in movie_results if r["title"].lower() == searchtitle.lower()]

            if len(exact_matches) > 0:
                movie_results = exact_matches

            if len(movie_results) > 1:
                choices=[("%s (%s)" % (r["title"], r["year"]), idx) for idx, r in enumerate(movie_results)]
                choices.append(("Not found", -1))
                answer = inquirer.prompt([
                    inquirer.List("index",
                        message="Multiple results found:",
                        choices=choices
                    )
                ])
                if answer["index"] == -1:
                    self._md["id"] = input("Enter IMDB id: ")
                    movie_results = []
                else:
                    movie_results = [movie_results[answer["index"]]]

            if len(movie_results) > 0:
                mpr = movie_results[0]
                self._md["id"] = mpr["imdb_id"]
                print("  * Fetching data for {} ({})".format(mpr["title"], mpr["year"]))
        else:
            print("  * Fetching data for %s" % self._md["id"])

        imdb_movie = imdb.get_title(self._md["id"])

        self._md["title"] = imdb_movie["base"]["title"]
        self._md["year"] = imdb_movie["base"]["year"]

        if "outline" in imdb_movie["plot"]:
            self._md["plot"] = imdb_movie["plot"]["outline"]["text"]
        else:
            self._md["plot"] = imdb_movie["plot"]["summaries"][0]["text"]

        self._md["genres"] = imdb.get_title_genres(self._md["id"])["genres"]

        self._write_nfo()
Exemple #3
0
    def post(self, request, *arg, **kwargs ):
        content = request.data
        ia = Imdb()

        try:
            #pass in imdb movie id to get movie details
            data = content['movieId']
            try:
                movie = ia.get_title(data)
                return HttpResponse(json.dumps(movie))
            except ValueError:
                return HttpResponse("Invalid IMDB id", status = 400)
        except KeyError:
            pass




        try:
            #pass int argument between 1-100 to get a list
            #of the top movies right now
            numtop = content['top']
            top100 = ia.get_popular_movies()
            tosend = []

            index = 0

            for m in top100['ranks']:
                index = index + 1
                if index > int(numtop):
                    break
                m_dict = {}
                imdbId =  m['id'][7:16]
                m_dict['imdbId'] = str(imdbId)
                m_dict['title'] = str(m['title'])
                m_dict['posterUrl'] = str(m['image']['url'])
                m_dict['year'] = str(m['year'])
                tosend.append(m_dict)
    
            try:
                return HttpResponse(json.dumps(tosend))
            except ValueError:
                return HttpResponse("ValueError, int between 1-100 plz", status = 400)
        except KeyError:
            pass


        try:
            #pass imdb id to get a list of similar titles
            data = content['similar']
            try:
                similarTitles = ia.get_title_similarities(data)
                return HttpResponse(json.dumps(similarTitles))
            except ValueError:
                return HttpResponse("Invalid IMDB id", status = 400)
        except KeyError:
            return HttpResponse('Request Not Understood.', status = 400)
Exemple #4
0
def AddMovieToDB(imdbId):
    ia = Imdb()
    data = ia.get_title(imdbId)
    title = data['base']['title']
    imageUrl = data['base']['image']['url']
    genres = ia.get_title_genres(imdbId)['genres']
    year = data['base']['year']

    movie = Movie(imdbId = imdbId, year = year, poster = imageUrl, genre = genres, title = title)

    movie.save()

    return
Exemple #5
0
class IMDB(Miner):

    def __init__(self):

        self.handle = Imdb()
        super(IMDB, self).__init__()

    def top_list(self, number):
        pop_movies = self.handle.top_250()
        return pop_movies

    def get_movie_id(self, index):
        return "tt" + index  # formatting to IMDB_ID

    def get_movie_by_id(self, movie_id):
        return self.handle.get_title_images(movie_id), self.handle.get_title(movie_id)
Exemple #6
0
movie_genres = {}
actor_set = {}

with open('data.csv') as f:
    for row in f.readlines()[1:]:
        columns = row.split(',')
        movie_id = columns[0].split('/')[4]
        genres = columns[1][:-1].split('|')
        movie_list.append(movie_id)
        movie_genres[movie_id] = genres

imdb = Imdb()
movie_count = 0
for movie_id in movie_list:
    try:
        title = imdb.get_title(movie_id)
        sql = (
            '''INSERT INTO movie_movie VALUES (\'{}\',\'{}\',\'{}\',\'{}\',\'{}\',\'{}\',\'{}\',\'{}\',\'{}\')'''.format(
                movie_id,
                single_quote(str(title['base']['title'])),
                title['base']['year'],
                title['base']['runningTimeInMinutes'],
                movie_genres[movie_id],
                title['ratings']['rating'],
                single_quote(title['base']['image']['url']),
                single_quote(str(title['plot']['outline']['text'])),
                single_quote(str(imdb.get_title_videos(movie_id)['videos'][0]['encodings'][0]['play']))
            ))
        execute_sql(sql)
        movie_count += 1
        print("Insert movie: " + movie_id, movie_count)
Exemple #7
0
soup = BeautifulSoup(page.text, 'html.parser')

movie_diary = soup.find_all(class_='headline-3 prettify')

movies = []

for x in movie_diary:
    movies.append(x.find('a').text)

print('Finished getting movie list...')

imdb = Imdb()

poster = {}

if not os.path.isdir(USER):
    print('Folder for ' + USER + ' created!')
    os.mkdir(USER)
else:
    print('Folder for ' + USER + ' exists!')

for movie in movies:
    try:
        if not os.path.isfile(USER + '/' + movie + '.jpg'):
            print('Downloading image for: ' + movie)
            urllib.request.urlretrieve(imdb.get_title(imdb.search_for_title(movie)[0]['imdb_id'])['base']['image']['url'], USER + '/' + movie + '.jpg')
        else:
            print('Using local image for: ' + movie)
    except Exception as e:
        print('ERROR: ' + movie + ' could not be processed!')
        print(e)
Exemple #8
0
def APIGetTitle(id):
	imdb = Imdb()
	dict = imdb.get_title(id)
	return dict
Exemple #9
0
def parse_imdb_id_from_url(url):
    import re
    m = re.search('/(tt.*?)/', url)
    imdb_id = m.group(1)
    return imdb_id


if __name__ == '__main__':
    from sys import argv
    myargs = getopts(argv)
    if '--url' in myargs:
        imdb_id = parse_imdb_id_from_url(myargs['--url'])

# imdbpie https://github.com/richardasaurus/imdb-pie
from imdbpie import Imdb
import objdict
import json

imdb = Imdb()

film = imdb.get_title(imdb_id)
film = objdict.loads(json.dumps(film))

#print film.base
# duration is retuned in seconds
#print(film.base.title + ',' + film.directors_summary[0].name + ',' + str(film.base.year) + ',' + '0:' + str(int(film.runtime / 60)))

year_part = ' (' + str(film.base.year) + ')'
print('* [' + film.base.title + ']' + '(http://www.imdb.com/title/' + imdb_id +
      '/)' + year_part)
Exemple #10
0
class MovieList:
    def __init__(self):
        tmdbsimple.API_KEY = settings.TMDB_API_KEY

        self.filename = "movies.db"
        self.full_path = db_full_path(self.filename)

        if self.filename not in db_cons or not db_cons[self.filename]:
            movie.Session.configure(
                bind=create_engine(f"sqlite:///{self.full_path}",
                                   echo=True,
                                   connect_args={"check_same_thread": False},
                                   json_serializer=lambda obj: json.dumps(
                                       obj, ensure_ascii=False)))
            self.session: Session = movie.Session()
            movie.Base.metadata.create_all(self.session.bind, checkfirst=True)

            db_locks[self.filename] = threading.Lock()
            db_cons[self.filename] = self.session
        else:
            self.session: Session = db_cons[self.filename]

        self.imdb = Imdb(exclude_episodes=True)

    def __iter__(self):
        for item in self.query.all():
            yield item

    def __getitem__(self, pk):
        return self.query.get(pk)

    def __contains__(self, pk):
        try:
            self.__getitem__(pk)
            return True
        except KeyError:
            return False

    @staticmethod
    def search_tmdb(query=None,
                    tmdb_id=None,
                    year=None,
                    language=None,
                    adult=False):
        if tmdb_id:
            results = [movies.Movies(id=tmdb_id)]
        elif query:
            tmdb_kwargs = dict(query=query,
                               year=year,
                               language=language,
                               adult=adult)
            tmdb_kwargs = {
                key: value
                for key, value in tmdb_kwargs.items() if value
            }
            results = search.Search().movie(**tmdb_kwargs)['results']
        else:
            raise Exception('Query or tmdb id is required!')

        return results

    @staticmethod
    def popular_tmdb(language=None):
        tmdb_kwargs = dict(language=language) if language else dict()
        return movies.Movies().popular(**tmdb_kwargs)['results']

    def search_imdb(self, query: str = ''):
        return self.imdb.search_for_title(title=query)

    def popular_imdb(self):
        return self.imdb.get_popular_movies()['ranks']

    def add_from_tmdb(self,
                      tmdb_id: str,
                      language: str = settings.INDEXER_DEFAULT_LANGUAGE):
        logger.debug(f'Adding movie from tmdb with id: {tmdb_id}')
        existing = self.session.query(
            movie.IndexerData).filter_by(pk=tmdb_id).first()
        if existing:
            logger.debug(f'Movie already existed as {existing.movie.name}')
            return existing.movie

        tmdb_object = tmdbsimple.movies.Movies(id=tmdb_id).info()
        return self.add_from_imdb(tmdb_object['imdb_id'],
                                  language,
                                  tmdb_primary=True)

    def add_from_imdb(self,
                      imdb_id: str,
                      language: str = settings.INDEXER_DEFAULT_LANGUAGE,
                      tmdb_primary=False):
        if not tmdb_primary:
            logger.debug(f'Adding movie from imdb id: {imdb_id}')

        existing = self.session.query(
            movie.IndexerData).filter_by(pk=imdb_id).first()
        if existing:
            logger.debug(f'Movie already existed as {existing.movie.name}')
            return existing.movie

        imdb_object = self.imdb.get_title(imdb_id)
        tmdb_id = tmdbsimple.find.Find(id=imdb_id).info(
            external_source='imdb_id')['movie_results'][0]['id']
        tmdb_object = tmdbsimple.movies.Movies(id=tmdb_id).info()

        if tmdb_primary:
            instance = movie.Movie(
                tmdb_object['title'],
                year=tmdb_object['release_date'].split('-')[0])
            if imdb_object['base']['title'] and not instance.name:
                instance.name = imdb_object['base']['title']
        else:
            instance = movie.Movie(imdb_object['base']['title'],
                                   year=imdb_object['base']['year']
                                   or tmdb_object)
            if tmdb_object['release_date'] and not instance.year:
                instance.year = tmdb_object['release_date'].split('-')[0]
            if tmdb_object['title'] and not instance.name:
                instance.name = tmdb_object['title']

        if tmdb_object['release_date']:
            instance.date = datetime.datetime.strptime(
                tmdb_object['release_date'], '%Y-%m-%d').date()

        instance.language = tmdb_object['original_language'] or language

        tmdb_data = movie.IndexerData(site='tmdb',
                                      data=tmdb_object,
                                      pk=tmdb_id)
        imdb_data = movie.IndexerData(site='imdb',
                                      data=imdb_object,
                                      pk=imdb_id)

        imdb_genres = self.imdb.get_title_genres(imdb_id)['genres']

        def add_imdb_genres():
            for genre in imdb_genres:
                logger.debug(f'Adding imdb genre {genre}')
                imdb_data.genres.append(movie.Genres(pk=genre))
            instance.indexer_data.append(imdb_data)

        def add_tmdb_genres():
            for genre in tmdb_object['genres']:
                if genre['name'] not in imdb_genres:
                    logger.debug(f'Adding tmdb genre {genre["name"]}')
                    tmdb_data.genres.append(movie.Genres(pk=genre['name']))
            instance.indexer_data.append(tmdb_data)

        if tmdb_primary:
            add_tmdb_genres()
            add_imdb_genres()
        else:
            add_imdb_genres()
            add_tmdb_genres()

        self.commit(instance)

        logger.debug(f'Returning instance for {instance.name}')
        return instance

    def commit(self, instance=None):
        logger.debug('Committing')
        if instance:
            self.session.add(instance)
        self.session.flush()
        self.session.commit()

    def delete(self, pk):
        instance = self.query.get(pk)
        if instance:
            self.session.delete(instance)

    @property
    def query(self):
        return self.session.query(movie.Movie)

    def by_slug(self, slug):
        return self.query.filter_by(slug=slug).first()

    def search_providers(self, movie_object: movie.Movie):
        # We should only need to support backlog for movies manually
        # Movies should be returned in the existing RSS searches if we have movies in our list
        strings = movie_object.search_strings()
        for provider in settings.providerList:
            if provider.can_backlog and provider.backlog_enabled and provider.supports_movies:
                results = provider.search(strings)
                for result in results:
                    movie.Result(result=result,
                                 provider=provider,
                                 movie=movie_object)

            self.commit(movie_object)
            # TODO: Check if we need to break out here and stop hitting providers if we found a good result

    def snatch_movie(self, result: movie.Result):
        pass

    def search_thread(self):
        pass
Exemple #11
0
def start_process(filenames, mode):
    """
    This is the main funtion of the script
    where it does its main processing.\n
    filenames is the list of files to be processed\n
    mode = 1,2,3 or 4\n
    1 means mp4 to tagged mp4\n
    2 means mp4 with sub to subbed and tagged mp4\n
    3 means mkv to tagged mp4\n
    4 means mkv with sub to subbed and tagged mp4
    """

    for filename in filenames:
        try:
            title = filename[:-4]
            
            stream_md = collect_stream_metadata(filename)
            streams_to_process = []
            dvdsub_exists=False
            for stream in stream_md['streams']:
                if not stream['codec_name'] in sub_codec_blacklist:
                    streams_to_process.append(stream['index'])
                else:
                    dvdsub_exists=True
            
            print('\nSearching IMDb for "{}"'.format(title))
            
            imdb = Imdb()
            movie_results = []
            results = imdb.search_for_title(title)
            for result in results:
                if result['type'] == "feature":
                    movie_results.append(result)
                    
            if not movie_results:
                while not movie_results:
                    title = input('\nNo results for "' + title +
                                  '" Enter alternate/correct movie title >> ')
                    
                    results = imdb.search_for_title(title)
                    for result in results:
                        if result['type'] == "feature":
                            movie_results.append(result)
                
            # The most prominent result is the first one
            # mpr - Most Prominent Result
            mpr = movie_results[0]
            print('\nFetching data for {} ({})'.format(mpr['title'],
                                                       mpr['year']))
                                                     
            # imdb_movie is a dict of info about the movie
            imdb_movie = imdb.get_title(mpr['imdb_id'])
            
            imdb_movie_title = imdb_movie['base']['title']
            imdb_movie_year = imdb_movie['base']['year']
            imdb_movie_id = mpr['imdb_id']
                        
            
            imdb_movie_rating = imdb_movie['ratings']['rating']
            
            if not 'outline' in imdb_movie['plot']:
                imdb_movie_plot_outline = (imdb_movie['plot']['summaries'][0]
                                           ['text'])
                print("\nPlot outline does not exist. Fetching plot summary "
                        "instead.\n\n")
            else:
                imdb_movie_plot_outline = imdb_movie['plot']['outline']['text']
            
            # Composing a string to have the rating and the plot of the
            # movie which will go into the 'comment' metadata of the 
            # mp4 file.
            imdb_rating_and_plot = str('IMDb rating ['
                                       + str(float(imdb_movie_rating))
                                       + '/10] - '
                                       + imdb_movie_plot_outline)
                                       
            
            imdb_movie_genres = imdb.get_title_genres(imdb_movie_id)['genres']
            
            # Composing the 'genre' string of the movie.
            # I use ';' as a delimeter to searate the multiple genre values
            genre = ';'.join(imdb_movie_genres)
            
            
            newfilename = (imdb_movie_title
                           + ' ('
                           + str(imdb_movie_year)
                           + ').mp4')
                           
            # We don't want the characters not allowed in a filename
            newfilename = (newfilename
                           .replace(':', ' -')
                           .replace('/', ' ')
                           .replace('?', ''))

            command = ""
            stream_map = []
            for f in streams_to_process:
                stream_map.append("-map 0:{}".format(f))
            stream_map_str = ' '.join(stream_map)           
            
            

            if mode == 1:
                # it is required to rename it as its already an mp4 file that
                # wasn't proccessed by ffmpeg
                os.rename(filename, newfilename)
            if mode == 2 or mode == 4:

                command = ('ffmpeg -i "'
                           + filename
                           + '" -sub_charenc UTF-8 -i "'
                           + filename[:-4]
                           + '.srt" '
                           + stream_map_str
                           + ' -map 1 -c copy -c:s mov_text '
                             '"' + newfilename + '"')
                subprocess.run(shlex.split(command))
            if mode == 3:
                command = ('ffmpeg -i '
                           + '"' + filename + '" '
                           + stream_map_str
                           + ' -c copy -c:s mov_text '
                             '"' + newfilename + '"')
                subprocess.run(shlex.split(command))
                
            if dvdsub_exists:
                print("\nRemoved DVD Subtitles due to uncompatibility with "
                      "mp4 file format")

            # The poster is fetched from tmdb only if there is no file
            # named " filename + '.jpg' " in the working directory
            # this way user can provide their own poster image to be used
            poster_filename = filename[:-4] + '.jpg'
            if not os.path.isfile(poster_filename):
                print('\nFetching the movie poster...')
                tmdb_find = tmdb.Find(imdb_movie_id)
                tmdb_find.info(external_source = 'imdb_id')
                
                path = tmdb_find.movie_results[0]['poster_path']
                complete_path = r'https://image.tmdb.org/t/p/w780' + path
                
                uo = urllib.request.urlopen(complete_path)
                with open(poster_filename, "wb") as poster_file:
                    poster_file.write(uo.read())
                    poster_file.close()
            
            

            video = MP4(newfilename)
            with open(poster_filename, "rb") as f:
                video["covr"] = [MP4Cover(
                                    f.read(),
                                    imageformat=MP4Cover.FORMAT_JPEG)]
                video['\xa9day'] = str(imdb_movie_year)
                video['\xa9nam'] = imdb_movie_title
                video['\xa9cmt'] = imdb_rating_and_plot
                video['\xa9gen'] = genre
                print('\nAdding poster and tagging file...')

            try:
                video.save()
                #  I have encounterd this error in pevious version
                #  of script, now I handle it by removing the metadata
                #  of the file. That seems to solve the probelem
            except OverflowError:
                remove_meta_command = ('ffmpeg -i "' + newfilename
                                       + '" -codec copy -map_metadata -1 "'
                                       + newfilename[:-4] + 'new.mp4"')
                subprocess.run(shlex.split(remove_meta_command))
                video_new = MP4(newfilename[:-4] + 'new.mp4')
                with open(poster_filename, "rb") as f:
                    video_new["covr"] = [MP4Cover(
                                            f.read(),
                                            imageformat=MP4Cover.FORMAT_JPEG)]
                    video_new['\xa9day'] = str(imdb_movie_year)
                    video_new['\xa9nam'] = imdb_movie_title
                    video_new['\xa9cmt'] = imdb_rating_and_plot
                    video_new['\xa9gen'] = genre
                    print('\nAdding poster and tagging file...')

                try:
                    video_new.save()
                    if not os.path.exists('auto fixed files'):
                        os.makedirs('auto fixed files')
                    os.rename(newfilename[:-4]
                              + 'new.mp4', 'auto fixed files\\'
                              + newfilename[:-4] + '.mp4')
                    os.remove(newfilename)

                except OverflowError:
                    errored_files.append(filename
                                         + (' - Could not save even after'
                                            'striping metadata'))
                    continue

            os.remove(poster_filename)
            print('\n' + filename
                       + (' was proccesed successfuly!\n\n===================='
                          '======================================'))
        except Exception as e:
            print('\nSome error occured while processing '
                  + filename
                  + '\n\n====================================================')
            errored_files.append(filename + ' - ' + str(e))
            PrintException()
Exemple #12
0
            'duration': "",
            "release_date": "",
            "genres": [],
            "main_id": "",
            "trailer_id": "",
            "tall": "",
            "wide": "",
            "progress": 0
        }
    if "" in tempData.values() or [] in tempData.values(
    ) or "progress" not in tempData.keys() or uDP:
        try:
            if tempData["imdb_id"] == "":
                imdb_id = imdb.search_for_title(name)[0]["imdb_id"]
                print(imdb_id)
                movie = imdb.get_title(imdb_id)
                if input(movie["base"]["title"] + " == " + name) == "n":
                    imdb_id = input("Enter id:")
                    movie = imdb.get_title(imdb_id)
                tempData["imdb_id"] = imdb_id
            else:
                movie = imdb.get_title(tempData["imdb_id"])
        except:
            print("something Failed")
            imdb_id = imdb.search_for_title(name)[0]["imdb_id"]
            movie = imdb.get_title(imdb_id)
            if input(movie["base"]["title"] + " == " + name) == "n":
                imdb_id = input("Enter id:")
                movie = imdb.get_title(imdb_id)
            tempData["imdb_id"] = imdb_id
Exemple #13
0
        def get_imdb_best_title(torrent_info, comparator):
            try:
                from operator import itemgetter
                from imdbpie import Imdb
                
                imdb            = Imdb()
                updated_imdb    = []
                imdb_selected   = []
                item_selected   = {}
                year_found      = None
                torrent_title   = torrent_info['torrent_title']

                ## Using torrent title until year,
                ##   only if torrent title has a year
                title_has_year  = re.match(r'.*([1-3][0-9]{3})', torrent_title)
                if title_has_year is not None:
                    year_found  = title_has_year.group(1)
                    
                    ## Adding torrent title year
                    torrent_info.update({'year':year_found})
                    splitted = str(torrent_title.split(year_found)[0])
                else:
                    splitted = str(torrent_title)
                    
                ## Remove non-required specific characters
                if not splitted.isalpha():
                    splitted = splitted.translate(None, "([_#@&*|~`%^<>").strip()
                torrent_info['torrent_title'] = splitted
                
                ## Getting IMDB information
                imdb_data       = imdb.search_for_title(splitted)
                self.logger.debug("+ Getting IMDB [%s] items"%(str(len(imdb_data))))
                
                ## Pre-selecting only IMDB titles that 
                ##   look very similar to torrent title
                ignored_items   = 0
                for imdb_item in imdb_data:
                    score = comparator.score(splitted, imdb_item['title'])
                    year_matches    = year_found == imdb_item['year']
                    item_type       = 'feature' == imdb_item['type']
                    
                    ## Adding only very similar titles
                    if score > 0.98:
                        imdb_item.update({'score':score})
                        imdb_item.update({'year_matches':year_matches})
                        updated_imdb.append(imdb_item)
                    else:
                        ignored_items += 1
                        self.logger.debug("      Ignored [%s] vs [%s] = %f"%
                                          (splitted, imdb_item['title'], score))

                self.logger.debug("+   Ignored [%s] item(s)"%(str(ignored_items)))
                
                ## Sorting IMDB retrieved items by similarity score
                sorted_imdb = sorted(updated_imdb, key=itemgetter('score'), reverse=True) 
                
                ## Checking if torrent year matches, otherwise 
                ##   provide only feature type IMDB items
                better_item_not_found           = False
                for imdb_item in sorted_imdb:
                    item_added                  = False
                    new_item                    = {}
                    if imdb_item['year_matches']:
                        better_item_not_found   = True
                        item_added              = True
                    elif not better_item_not_found and 'feature' == imdb_item['type']:
                        item_added              = True
                        
                    ## Retrieving additional IMDB information
                    ##   and adding item
                    if item_added:
                        imdb_id                 = imdb_item['imdb_id']
                        title_info              = imdb.get_title(imdb_id)
                        title_genres            = imdb.get_title_genres(imdb_id)
                        
                        
                        if title_genres is not None and 'genres' in title_genres:
                            genres_label         = str(', '.join(title_genres['genres']))
                            imdb_item.update({'genres': genres_label})

                        imdb_image_url          = ''
                        if 'image' in title_info['base'].keys():
                            imdb_image_url          = title_info['base']['image']['url']
                        else:
                            self.logger.debug("-   Image URL not found")
                            self.logger.debug("-   Looking in similarities for images...")
                            for similarity_item in title_info['similarities']:
                                itemKeys        = similarity_item.keys()
                                if 'image' in itemKeys:
                                    imageKey    = similarity_item['image'].keys()
                                    if 'url' in imageKey:
                                        imdb_image_url = similarity_item['image']['url']
                                        self.logger.debug("      Using image from similarities")
                                        break
                        imdb_raiting            = ''
                        if 'rating' in title_info['ratings'].keys():
                            imdb_raiting        = str(title_info['ratings']['rating'])
                        else:
                            self.logger.debug("-   Raiting not found")

                        imdb_plot               = ''
                        if 'outline' in title_info['plot'].keys():
                            imdb_plot           = title_info['plot']['outline']['text']
                        else:
                            self.logger.debug("-   Plot not found")

                        
                        imdb_title_url          = title_info['base']['id']

                        imdb_item.update({'raiting':    imdb_raiting})
                        imdb_item.update({'plot':       imdb_plot})
                        imdb_item.update({'image_url':  imdb_image_url})
                        imdb_item.update({'title_url':  'http://www.imdb.com/'+imdb_title_url})
                        imdb_selected.append(imdb_item)
                
                item_selected.update({'imdb_info':imdb_selected})
                item_selected.update({'torrent_info':torrent_info})
            except Exception as inst:
              Utilities.ParseException(inst, logger=self.logger)
            finally:
                return item_selected