Ticket #6219: imdb_script4.patch

File imdb_script4.patch, 9.2 KB (added by jyavenard@…, 12 years ago)

Add retries parameter.. scripts can't generate exceptions now

  • imdbpy.py

     
    327327                shortest_found = None
    328328                #print "%d plots found" % len(plots)
    329329                for plot in plots:
    330                         text = plot.split("::")[1]
     330                        #IMDbPY 3.9 doesn't order the content of plot like earlier version of IMDbPY.
     331                        # IMDB 3.6 is : plot_content::author
     332                        # IMDB 3.9 is : author::plot_content
     333                        #So we assume that should one side longer than the other, it's actually where the description is
     334                        splitvalue = plot.split("::")
     335                        if len(splitvalue[0]) > len(splitvalue[1]):
     336                                text = splitvalue[0]
     337                        else:
     338                                text = splitvalue[1]
    331339                        if shortest_found == None or len(text) < len(shortest_found):
    332340                                shortest_found = text
    333341                metadata.plot = shortest_found
  • fetch_poster.py

     
    4646http://www.pythonware.com/products/pil/"""
    4747        imaging_library = False
    4848
     49#Number of default IMDb retry
     50import time
     51defaultretries=3
     52
     53def functionretry(func, arg1, arg2=None, retries=None):
     54        global defaultretries
     55       
     56        if retries == None:
     57                retries = defaultretries
     58       
     59        attempts = 0
     60        stop = False
     61        while (not stop):
     62                try:
     63                        if arg2:
     64                                result = func(arg1, arg2)
     65                        else:
     66                                result = func(arg1)                             
     67                        stop = True
     68                except:
     69                        result = None
     70                if not stop:
     71                        attempts += 1
     72                        if attempts > retries:
     73                                stop = True
     74                        if attempts <= retries:
     75                                print 'Failed to retrieve data, retry in 5s'
     76                                time.sleep(5)
     77                       
     78        if attempts > retries:
     79                print 'Error retrieving data : No more attempts'
     80        return result
     81
    4982class PosterImage:
    5083        """
    5184        Holds a single poster image.
     
    104137                max_results = 4
    105138                images = []
    106139               
    107                 for url in poster_urls:
    108                         image_url = self.find_poster_image_url(url)
    109                         if image_url is not None:
    110                                 images.append(self.download_image(image_url, ".jpg"))
    111                                 results += 1
    112                         if results >= max_results:
    113                                 break
     140                if poster_urls:
     141                        for url in poster_urls:
     142                                image_url = self.find_poster_image_url(url)
     143                                if image_url is not None:
     144                                        images.append(self.download_image(image_url, ".jpg"))
     145                                        results += 1
     146                                if results >= max_results:
     147                                        break
    114148                return images
    115149                               
    116150        def find_poster_image_url(self, poster_page_url):
     
    196230                        return [self.download_image(poster_url, extension)]
    197231                return []
    198232                       
    199 def find_best_posters(title, count=1, accept_horizontal=False, imdb_id=None):
     233def find_best_posters(title, count=1, accept_horizontal=False, imdb_id=None, retries=None):
    200234               
    201235        fetchers = [MoviePosterPosterFetcher(), IMDbPosterFetcher()]
    202236        #fetchers = [IMDbPosterFetcher()]       
     
    218252                        break
    219253               
    220254        for fetcher in fetchers:
    221                 new_posters = fetcher.fetch(title, imdb_id)
    222                 for poster in new_posters:
    223                         if not accept_horizontal and not poster.is_vertical():
    224                                 os.remove(poster.file_name)
    225                                 continue
    226                         posters.append(poster)
     255                new_posters = functionretry(fetcher.fetch, title, arg2=imdb_id, retries=retries)
     256                if new_posters:
     257                        for poster in new_posters:
     258                                if not accept_horizontal and not poster.is_vertical():
     259                                        os.remove(poster.file_name)
     260                                        continue
     261                                posters.append(poster)
    227262               
    228263        def size_cmp(a, b):
    229264                return cmp(a.pixels(), b.pixels())
     
    237272        return posters[0:count]
    238273               
    239274def main():
     275        global defaultretries
    240276       
    241        
    242277        p = optparse.OptionParser()
    243278        p.add_option('--number', '-n', action="store", type="int", default=1,
    244279                help="the count of biggest posters to get")
     
    247282        p.add_option('--poster_search', '-P', metavar='IMDB_ID', default=None, dest="imdb_id",
    248283                help="Displays a list of URL's to movie posters.  The lines are "\
    249284                "ranked by descending value. For MythVideo.")           
     285        p.add_option('--retry', '-t', action="store", type="int", dest="retries",default=3,
     286                help="Number of retries, 0 means no retry [default 3]")
    250287               
    251288        options, arguments = p.parse_args()
    252289       
     290        defaultretries = options.retries
     291
    253292        title = ""
    254293        if len(arguments) != 1:
    255294                if options.imdb_id:
    256295                        # TODO: Fetch the title from IMDb.
    257                         metadata = imdbpy.metadata_search(options.imdb_id)
    258                         title = imdbpy.parse_meta(metadata, "Title")
     296                        metadata = functionretry(imdbpy.metadata_search,options.imdb_id)
     297                        if metadata:
     298                                title = imdbpy.parse_meta(metadata, "Title")
     299                        else:
     300                                print "Error can't retrieve title from IMDb"
     301                                sys.exit(1)                             
    259302                else:
    260303                        print "Please give a video title as argument."
    261304                        sys.exit(1)                             
     
    263306                title = arguments[0]
    264307               
    265308        posters = find_best_posters(title, options.number, options.all,
    266                                 imdb_id=options.imdb_id)       
     309                                imdb_id=options.imdb_id, retries=defaultretries)       
    267310       
    268311        if options.imdb_id is not None:
    269312                for poster in posters:
     
    276319               
    277320if __name__ == '__main__':
    278321        main()         
    279        
    280  No newline at end of file
     322       
  • find_meta.py

     
    102102# MythTV settings table).
    103103poster_dir = "./"
    104104
     105#Number of default IMDb retry
     106import time
     107defaultretries=3
     108
     109def functionretry(func, arg1, arg2=None, retries=None):
     110        global defaultretries
     111       
     112        if retries == None:
     113                retries = defaultretries
     114       
     115        attempts = 0
     116        stop = False
     117        while (not stop):
     118                try:
     119                        if arg2:
     120                                result = func(arg1, arg2)
     121                        else:
     122                                result = func(arg1)                             
     123                        stop = True
     124                except:
     125                        result = None
     126                if not stop:
     127                        attempts += 1
     128                        if attempts > retries:
     129                                stop = True
     130                        if attempts <= retries:
     131                                print_verbose ('Failed to retrieve data, retry in 5s')
     132                                time.sleep(5)
     133                       
     134        if attempts > retries:
     135                print_verbose ('Error retrieving data : No more attempts')
     136        return result
     137
    105138def print_verbose(string):
    106139        global verbose
    107140        if verbose:
     
    153186                        lowest_cutpoint = pos
    154187
    155188        title = title[0:lowest_cutpoint]
     189        # Remove trailing year in the form of "name [year]" or "name (year)"if any
     190        m = re.compile(r"(.*)([\(\[]([0-9]+)[\]\)])$")
     191        found = m.match(title.strip())
     192        if found:
     193                title = found.group(1)
     194
    156195        return title.strip()
    157196
    158197def parse_meta(variable, oldvalue, emptyvalue="", meta=""):
     
    427466        otherwise returns the base name of the poster image file.
    428467        """
    429468        global poster_dir,overwrite
     469        global defaultretries
    430470        image_extensions = ["png", "jpg", "bmp"]
    431471
    432472        poster_files = []
     
    436476        if len(poster_files) == 0 or overwrite:
    437477                # Try to fetch the poster image from the web.
    438478                posters = fetch_poster.find_best_posters(\
    439                         title, count=1, accept_horizontal=True, imdb_id=imdb_id)
     479                        title, count=1, accept_horizontal=True, imdb_id=imdb_id,retries=defaultretries)
    440480
    441481                if len(posters) == 0:
    442482                        return None
     
    528568
    529569                print_verbose("Title search '%s'" % title)
    530570
    531                 candidates = imdbpy.title_search(title)
     571                candidates = functionretry(imdbpy.title_search, title)
     572                       
    532573                if candidates is None or len(candidates) == 0:
    533574                        # TODO: Try with the dirname
    534575                        pass
     
    560601
    561602        print_verbose("Querying IMDb for meta data for ID %s..." % imdb_id)
    562603        try:
    563                 meta = imdbpy.fetch_metadata(imdb_id)
     604                meta = functionretry(imdbpy.fetch_metadata,imdb_id)
    564605                if meta is not None:
    565606                        if meta.series_episode:
    566607                                title, season, episode = imdbpy.detect_series_title(title)
     
    708749                metadata = load_metadata_file(metadata_target)
    709750
    710751        if imdb_id is not None:
    711                 meta = imdbpy.fetch_metadata(imdb_id)
     752                meta = functionretry(imdbpy.fetch_metadata,imdb_id)
    712753                if meta.series_episode:
    713754                        fileName = os.path.basename(pathName)
    714755                        t, season, episode = imdbpy.detect_series_title(fileName)
     
    734775                return
    735776
    736777        if imdb_id is not None:
    737                 metadata = imdbpy.metadata_search(imdb_id)
     778                metadata = functionretry(imdbpy.metadata_search,imdb_id)
     779
    738780                if metadata is not None:
    739781                        metadata += "IMDb:%s" % imdb_id + "\n"
    740782                        save_metadata(dirName, dirName + "/video.metadata", metadata)
     
    815857        global verbose, overwrite, interactive, recursive, dbimport
    816858        global import_from_files, metafiles, poster_dir, poster_search
    817859        global aka_language
     860        global defaultretries
    818861
    819862        usage = "usage: %prog [options] videopath1 [videopath2 videopath3...]"
    820863
     
    831874                help="Traverse sub directories of the given directory recursively.")
    832875
    833876        p.add_option('--no_dbimport', '-n', action="store_true", default=False,
    834                 help="Do not import metadata directly to MythDB.")
     877                help="Do not import      metadata directly to MythDB.")
    835878        p.add_option('--fromfiles', '-f', action="store_true", default=False,
    836879                help="Import data to MythDB from .metadata files if found. Requires -d.")
    837880        p.add_option('--metafiles', '-m', action="store_true", default=False,
     
    848891                default=None,
    849892                help="Add the title name in the given country (two letter code, e.g., 'fi') "\
    850893                "to the movie title.")
     894        p.add_option('--retry', '-t', action="store", type="int", dest="retries",default=3,
     895                help="Number of retries, 0 means no retry [default 3]")
    851896
    852897        options, arguments = p.parse_args()
    853898
     
    865910        prune = options.prune
    866911        poster_search = not options.skip_poster_search
    867912        aka_language = options.lang_code
     913       
     914        defaultretries = options.retries
    868915
    869916        if not (metafiles or dbimport):
    870917                print "You must define writing to either MythDB import (-d) or metadata files (-m)."