Ticket #2734: updates-07-03-09.patch

File updates-07-03-09.patch, 10.9 KB (added by Pekka Jääskeläinen <pekka.jaaskelainen gmail.com>, 17 years ago)

Here's a patch fixing this problem and cleaning up the code a bit.

  • mythvideo/scripts/imdbpy.py

     
    2222                "from (http://imdbpy.sourceforge.net/?page=download)"
    2323        sys.exit(1)
    2424
    25 episode_title_format = '%(series_title)s S%(season)d E%(episode)d "%(episode_title)s"'
    2625
    27 def detect_series_query(search_string):
     26
     27def detect_series_title(search_string):
    2828        """
    29         Detects a series episode query.
     29        Detects a series episode title.
    3030       
    3131        Currently the following formats are detected:
    3232        "Sopranos Season 1 Episode 2"
     
    6565                                        continue
    6666                                # Found an exact episode match, return that match only.
    6767                                matches = []
    68                                 episode_title = episode_title_format % \
    69                                                 {
    70                                                         'series_title': ep['series title'],
    71                                                         'season': season,
    72                                                         'episode': episode,
    73                                                         'episode_title': ep['title']
    74                                                 }
    75                                 matches.append([imdb_access.get_imdbID(ep), episode_title ,int(ep['year'])])           
     68                                meta = VideoMetadata()
     69                                meta.series_episode = True
     70                                meta.series_title = ep['series title']
     71                                meta.season = season
     72                                meta.episode = episode
     73                                meta.episode_title = ep['title']
     74                                matches.append([imdb_access.get_imdbID(ep), meta.toMetadataString() ,int(ep['year'])]) 
    7675                                return matches
    7776                        else:
    7877                                matches.append([imdb_access.get_imdbID(serie),
     
    8483        Returns a list of 3-tuples [imdb id, title, year] for possible matches.
    8584        """
    8685
    87         (title, season, episode) = detect_series_query(search_string)
     86        (title, season, episode) = detect_series_title(search_string)
    8887
    8988        #print title,"--", season,"--", episode
    9089        #return
     
    159158        if url is not None:
    160159                print url
    161160
    162 def metadata_search(imdb_id):
    163         metadata = unicode()
     161class VideoMetadata:
     162       
     163        series_episode = False
     164        series_title = ""
     165        season = None
     166        episode = None
     167       
     168        title = ""
     169        runtime = None
     170        year = None
     171        directors = None
     172        plot = None
     173        rating = None
     174        mpaa_rating = None
     175        genres = None
     176        countries = None
     177       
     178        episode_title_format = '%(series_title)s S%(season)d E%(episode)d %(episode_title)s'
     179       
     180        def __init__(self):
     181                pass
     182       
     183        def toMetadataString(self):
     184               
     185                def createMetadataLine(keyName, value):
     186                        if value is not None:
     187                                return keyName + ":" + value + "\n"
     188                        else:
     189                                return ""
     190                metadata = ""
     191                if self.series_episode == True and self.season is not None and \
     192                        self.episode is not None:
     193                        metadata += 'Title:' + self.episode_title_format % \
     194                                {
     195                                        'series_title': self.series_title,
     196                                        'season': int(self.season),
     197                                        'episode': int(self.episode),
     198                                        'episode_title': self.episode_title,
     199                                } + '\n'
     200                else:
     201                        metadata += createMetadataLine("Title", self.title).decode("utf8")
     202                metadata += createMetadataLine("Runtime", self.runtime)
     203                metadata += createMetadataLine('Year', self.year)
     204                if self.directors is not None and len(self.directors) > 0:
     205                        metadata += createMetadataLine("Director", unicode(self.directors[0]))
     206                metadata += createMetadataLine("Plot", self.plot)
     207       
     208                metadata += createMetadataLine('UserRating', self.rating)
     209                metadata += createMetadataLine('MovieRating', self.mpaa_rating)
     210                metadata += createMetadataLine('Runtime', self.runtime)
     211                metadata += createMetadataLine('Genres', self.genres)
     212                metadata += createMetadataLine('Countries', self.countries)
     213               
     214                return metadata
     215
     216def fetch_metadata(imdb_id):
     217       
     218        metadata = VideoMetadata()
     219       
    164220        imdb_access = imdb.IMDb()
    165221        movie = imdb_access.get_movie(imdb_id)
    166222        imdb_access.update(movie)
    167223
    168         def createMetadataFromField(key, searchKey=None, m=movie):
    169                 if searchKey == None:
    170                         searchKey = key.lower()
    171                 if searchKey not in m.keys(): return ""
     224        def metadataFromField(key, default=None, m=movie):
     225               
     226                searchKey = key.lower()
     227                if searchKey not in m.keys():
     228                        return default
    172229                value = unicode(m[searchKey])
    173230                try:
    174231                        value = value.encode("utf8")
    175232                except AttributeError:
    176233                        pass
    177234                if value is not None:
    178                         return "%s:%s\n" % (key, value)
     235                        return value
    179236                else:
    180                         return ""
     237                        return default
    181238
    182         def createMetadataFromFirst(key, searchKey=None, m=movie):
    183                 if searchKey == None:
    184                         searchKey = key.lower()
    185                 if searchKey not in m.keys(): return ""
     239        def metadataFromFirst(key, default=None, m=movie):
     240               
     241                searchKey = key.lower()
     242                if searchKey not in m.keys():
     243                        return default
     244               
    186245                value = m[searchKey]
    187246                if value is not None and len(value) > 0:
    188247                        if len(value) > 1:
    189                                 return "%s:%s\n" % (key, ','.join(value).encode("utf8"))
     248                                return ','.join(value).encode("utf8")
    190249                        else:
    191                                 return "%s:%s\n" % (key, value[0].encode("utf8"))
     250                                return value[0].encode("utf8")
    192251                else:
    193                         return ""
     252                        return default
    194253
    195254        if movie['kind'] == 'episode':
    196                 # print "TV Series episode detected"
    197                 metadata += 'Title:' + episode_title_format % \
    198                                                 {
    199                                                         'series_title': movie['series title'],
    200                                                         'season': int(movie['season']),
    201                                                         'episode': int(movie['episode']),
    202                                                         'episode_title': movie['title'],
    203                                                 } + '\n'
    204                 series = movie['episode of']
    205                 imdb_access.update(series)
    206                 metadata += createMetadataFromFirst('Runtime', 'runtimes', m=series)
     255                # print "TV Series episode detected"           
     256                metadata.series_episode = True
     257                if 'series title' in movie.keys():
     258                        metadata.series_title = movie['series title']
     259                if 'season' in movie.keys():
     260                        metadata.season = movie['season']
     261                if 'episode' in movie.keys():
     262                        metadata.episode = movie['episode']
     263                if 'title' in movie.keys():
     264                        metadata.episode_title = movie['title']
     265
     266                if 'episode of' in movie.keys():
     267                        series = movie['episode of']
     268                        imdb_access.update(series)
     269                        metadata.runtime = metadataFromFirst('runtimes', None)
    207270        else:
    208                 metadata += createMetadataFromField('Title').decode("utf8")
    209         metadata += createMetadataFromField('Year')
     271                metadata.title = metadataFromField('title').decode("utf8")
     272       
     273        metadata.year = metadataFromField('year')
    210274
    211275        if 'director' in movie.keys():
    212276                directors = movie['director']
    213277                if directors is not None:
    214                         metadata += "Director:%s" % unicode(directors[0]) + "\n"
     278                        metadata.directors = directors                 
    215279
     280        plots = []
    216281        if 'plot' in movie.keys():
    217282                plots = movie['plot']
    218                 if movie.has_key('plot outline') and len(movie['plot outline']):
    219                         plots.append("Outline::" + movie['plot outline'])
    220                 if plots is not None:
    221                         # Find the shortest plot.
    222                         shortest_found = None
    223                         #print "%d plots found" % len(plots)
    224                         for plot in plots:
    225                                 text = plot.split("::")[1]
    226                                 if shortest_found == None or len(text) < len(shortest_found):
    227                                         shortest_found = text
    228                         metadata += "Plot:%s" % shortest_found + "\n"
     283        if movie.has_key('plot outline') and len(movie['plot outline']):
     284                plots.append("Outline::" + movie['plot outline'])
     285       
     286        if plots is not None:
     287                # Find the shortest plot.
     288                shortest_found = None
     289                #print "%d plots found" % len(plots)
     290                for plot in plots:
     291                        text = plot.split("::")[1]
     292                        if shortest_found == None or len(text) < len(shortest_found):
     293                                shortest_found = text
     294                metadata.plot = shortest_found
    229295
    230         metadata += createMetadataFromField('UserRating', 'rating')
    231         metadata += createMetadataFromField('MovieRating', 'mpaa')
    232         metadata += createMetadataFromFirst('Runtime', 'runtimes')
    233         metadata += createMetadataFromFirst('Genres', 'genres')
    234         metadata += createMetadataFromFirst('Countries', 'countries')
     296        metadata.rating = metadataFromField('rating', metadata.rating)
     297        metadata.mpaa_rating = metadataFromField('mpaa', metadata.mpaa_rating)
     298        metadata.runtime = metadataFromFirst('runtimes', metadata.runtime)
     299        metadata.genres = metadataFromFirst('genres', metadata.genres)
     300        metadata.countries = metadataFromFirst('countries', metadata.countries)
     301
    235302        return metadata
     303       
    236304
     305def metadata_search(imdb_id):
     306        meta = fetch_metadata(imdb_id)
     307        if meta is not None:
     308                return meta.toMetadataString()
     309       
     310
    237311def parse_meta(meta, key):
    238312        for line in meta.split("\n"):
    239313                beginning = key + ":"
  • mythvideo/scripts/fetch_poster.py

     
    190190                        return [self.download_image(poster_url, extension)]
    191191                return []
    192192                       
    193 def find_best_posters(title, count=1, accept_horizontal=False, imdb_id=None):           
     193def find_best_posters(title, count=1, accept_horizontal=False, imdb_id=None):
     194               
    194195        fetchers = [MoviePosterPosterFetcher(), IMDbPosterFetcher()]
    195196        #fetchers = [IMDbPosterFetcher()]       
    196197        posters = []
    197198       
    198199        # If it's a series title 'Sopranos, S06E14' then use just the series
    199200        # name for finding the poster. Strip the episode number.
    200         (series_title, season, episode) = imdbpy.detect_series_query(title)     
     201        (series_title, season, episode) = imdbpy.detect_series_title(title)     
    201202        if series_title is not None and season is not None and episode is not None:
    202203                title = series_title.strip()
    203204                if title.endswith(","):
  • mythvideo/scripts/find_meta.py

    Property changes on: mythvideo/scripts/fetch_poster.py
    ___________________________________________________________________
    Name: svn:executable
       + *
    
     
    579579                        source_nfo = nfo
    580580                        break
    581581                       
     582        title = unicode(cleanup_title(title), "utf8", "ignore")                 
    582583        if imdb_id is None:
    583                 # A title search
    584                 title = unicode(cleanup_title(title), "utf8", "ignore")
     584                # A title search               
    585585               
    586586                print_verbose("Title search '%s'" % title)             
    587587               
     
    617617                        return None
    618618                       
    619619        print_verbose("Querying IMDb for meta data for ID %s..." % imdb_id)
    620         metadata = imdbpy.metadata_search(imdb_id)
    621         if metadata is not None:
     620        meta = imdbpy.fetch_metadata(imdb_id)
     621        if meta is not None:
     622                if meta.series_episode:
     623                        title, season, episode = imdbpy.detect_series_title(title)                     
     624                        if meta.season is None:
     625                                meta.season = season
     626                        if meta.episode is None:
     627                                meta.episode = episode
     628                metadata = meta.toMetadataString()
    622629                metadata += "IMDb:%s" % imdb_id + "\n"
    623630        return metadata
    624631
     
    691698                        # Detect that the file names don't look like series episodes
    692699                        filename_length = len(videos[0])
    693700                        for video in videos:
    694                                 if imdbpy.detect_series_query(cleanup_title(video)) != (None, None, None):
     701                                if imdbpy.detect_series_title(cleanup_title(video)) != (None, None, None):
    695702                                        print_verbose("'%s' looks like a TV-series episode." % video)
    696703                                        return False
    697704                       
     
    751758                metadata = load_metadata_file(metadata_target)
    752759       
    753760        if imdb_id is not None:
    754                 metadata = imdbpy.metadata_search(imdb_id)
     761                meta = imdbpy.fetch_metadata(imdb_id)
     762                if meta.series_episode:
     763                        fileName = os.path.basename(pathName)
     764                        t, season, episode = imdbpy.detect_series_title(fileName)                       
     765                        if meta.season is None:
     766                                meta.season = season
     767                        if meta.episode is None:
     768                                meta.episode = episode
     769                metadata = meta.toMetadataString()
    755770                metadata += "IMDb:%s" % imdb_id + "\n"
    756771               
    757772        if metadata is None: