#!/usr/bin/env python # coding=UTF-8 # Script final de rendu du flim. Ça déchire, mec. # # Ce script est parallélisable; il peut être lancé plusieurs fois en même # temps pour aller plus vite sur du multicoeur. # # Environ 4 heures de calcul à vide # Moins de 6 secondes pour un dry-run # # Pour encoder les images en Theora (3h45) : # find final -type f | sort | ~/caca/libpipi/examples/makemovie final.ogg # # Pour une version qualité DVD (6 minutes) : # ~/ffmpeg/ffmpeg -i final.ogg -i audio-clean-8.4s.wav -acodec flac -vcodec copy final-dvd.ogg # # Et pour une version qualité DVDrip (1h25) : # ~/ffmpeg/ffmpeg -i final.ogg -i audio-clean-8.4s.wav -acodec libvorbis -ab 128000 -vb 1600000 -s 720x400 final-dvdrip.ogg # import os, sys, shutil, subprocess, glob, random # Variables globales DUMP = "/media/800g/laclasse/dump" DATA = "/media/800g/laclasse/data" FINAL = "/media/800g/laclasse/final" PIPI = "/home/sam/caca/libpipi/src/pipi" TMPFILE = "/tmp/tmp%i.%i.png" % (os.getpid(), 0x10000 * random.random()) def fulllist(*args): l = glob.glob(mkpath(*args)) l.sort() return l def baselist(*args): return [os.path.basename(x) for x in fulllist(*args)] def mkpath(*args): if len(args) == 0: return "." if len(args) == 1: return args[0] return os.path.join(args[0], mkpath(*args[1:])) # Discussion sur le resize, avec une surface utile dans l’image de WxH aux # coordonnées (X,Y) # # DVD non-anamorphosés, par exemple le DVD non officiel: on a deux cas # - W/H > 16/9, dans ce cas on coupe les bords et la nouvelle géométrie # devient : (H*16/9)x(H)+(X+(720-H*16/9)/2)+(Y) # - W/H < 16/9, dans ce cas on coupe en haut et en bas et la nouvelle # géométrie devient : (W)x(W/16*9)+(X)+(Y+(480-W/16*9)/2) # # DVD PAL anamorphosés : le nouveau ratio doit être 720:576 puisqu'on sait # que ce ratio deviendra du 16:9, donc la nouvelle largeur est H*720/576 et # la nouvelle géométrie devient : (H*720/576)x(H)+(X+(720-H*720/576)/2)+Y # # DVD NTSC anamorphosés : pareil avec 480 au lieu de 576 # # Crimson Pirate, Miracle of Fatima, Riding Shotgun: # - le DVD est encodé en 720x480 mais c'est du 4:3 # - pour l'affichage DVD, doit être resizé en 640x480 # - pour faire du 4:3, on doit garder 360 lignes sur 480 # - donc on croppe 720x360 à (0,30) (et pas 0,60 qui couperait les gens) # -> 720x360+0+30 # # Mad Max : c'est chiant... il est en 720x480 à upscaler en 4:3 # Towering Inferno : pareil def crop_any(w, h, x, y): if w * 9 > h * 16: w2 = (h * 16 + 9 / 2) / 9 x2 = x + (w - w2) / 2 return ["crop", "%ix%i+%i+%i" % (w2, h, x2, y)] h2 = (w * 9 + 16 / 2) / 16 y2 = y + (h - h2) / 2 return ["crop", "%ix%i+%i+%i" % (w, h2, x, y2)] def crop_pal(w, h, x, y): w2 = (h * 720 + 576 / 2) / 576 x2 = x + (w - w2) / 2 return ["crop", "%ix%i+%i+%i" % (w2, h, x2, y)] def crop_ntsc(w, h, x, y): w2 = (h * 720 + 480 / 2) / 480 x2 = x + (w - w2) / 2 return ["crop", "%ix%i+%i+%i" % (w2, h, x2, y)] # DVD non-officiel: 703x355 à (9,112) g_missing = crop_any(703, 355, 9, 112) # Anamorphic PAL movies g_bullitt = crop_pal(720, 576, 0, 0) # Bullitt g_candidate = crop_pal(720, 576, 0, 0) # The Candidate g_riobravo = crop_pal(720, 576, 0, 0) # Rio Bravo g_searchers = crop_pal(720, 576, 0, 0) # The Searchers g_gwangi = crop_pal(720, 576, 0, 0) # The Valley of Gwangi # Other PAL movies g_warner = crop_pal(720, 425, 0, 75) # Jingle Warner de I Am Legend g_around = crop_pal(720, 463, 0, 56) # Around the World... g_bulge = crop_pal(719, 437, 1, 64) # Battle of the Bulge g_blood = crop_pal(715, 400, 2, 88) # Blood Alley g_cahill = crop_pal(716, 431, 3, 73) # Cahill US Marshall g_chisum = crop_pal(716, 433, 3, 72) # Chisum g_deliverance = crop_pal(658, 391, 28, 93) # Deliverance g_mcq = crop_pal(718, 425, 2, 75) # McQ g_ocean = crop_pal(719, 423, 1, 77) # Ocean’s Eleven g_sea_chase = crop_pal(718, 411, 1, 83) # The Sea Chase g_crooked = crop_pal(720, 427, 0, 74) # There Was a Crooked Man g_train = crop_pal(718, 425, 1, 77) # The Train Robbers # Anamorphic NTSC movies g_president = crop_ntsc(720, 480, 0, 0) # All the President’s Men g_angels = crop_ntsc(720, 480, 0, 0) # Band of Angels g_executive = crop_ntsc(720, 480, 0, 0) # Executive Action g_fbi = crop_ntsc(720, 480, 0, 0) # The FBI Story g_texas = crop_ntsc(720, 480, 0, 0) # 4 for Texas g_good = crop_ntsc(720, 362, 0, 58) # The Good Guys... g_judge = crop_ntsc(720, 480, 0, 0) # The Life and Times of Judge Roy Bean g_oldman = crop_ntsc(720, 480, 0, 0) # The Old Man and the Sea g_revolution = crop_ntsc(720, 480, 0, 0) # Start the Revolution Without Me g_straight = crop_ntsc(720, 480, 0, 0) # Straight Time g_westbound = crop_ntsc(720, 480, 0, 0) # Westbound # Other NTSC movies g_arrangement = crop_ntsc(720, 362, 0, 57) # The Arrangement g_poseidon = crop_ntsc(720, 361, 0, 59) # Beyond the Poseidon... g_charro = crop_ntsc(720, 361, 0, 58) # Charro! g_cheyenne = crop_ntsc(720, 357, 0, 64) # The Cheyenne Social Club g_cleopatra = crop_ntsc(720, 366, 0, 57) # Cleopatra Jones g_cowboys = crop_ntsc(718, 368, 1, 54) # The Cowboys g_firecreek = crop_ntsc(720, 367, 0, 59) # Firecreek g_freebie = crop_ntsc(720, 360, 0, 62) # Freebie and the Bean g_harper = crop_ntsc(720, 361, 0, 60) # Harper g_jeremiah = crop_ntsc(719, 364, 0, 58) # Jeremiah Johnson g_time = crop_ntsc(718, 361, 1, 58) # When Time Ran Out # 4:3 NTSC movies g_crimson = ["crop", "720x360+0+30"] # Crimson Pirate g_hooper = ["crop", "720x360+0+30"] # Hooper g_miracle = ["crop", "720x360+0+30"] # The Miracle of Our Lady of Fatima g_riding = ["crop", "720x360+0+30"] # Riding Shotgun g_carson = ["crop", "720x360+0+60"] # Carson City # DVD de merde un peu spéciaux (du 720:480 à upscaler en 4:3) g_madmax = ["crop", "523x262+99+107"] # Mad Max g_inferno = ["crop", "551x276+84+101"] # The Towering Inferno # Pas encore dispo / pas encore calculé g_rampage = ["default"] g_city = ["default"] g_drumbeat = ["default"] g_horloge = ["default"] ############################################################################### # generate() # # Comme son nom l’indique, c’est la fonction de génération par défaut. Si # l’image destination existe déjà, elle ne fait rien. Sinon, elle va la # rechercher soit dans les scènes remasterisées (si un argument de crop est # fourni), soit dans le dump du DVD non-officiel (c’est mieux que rien). La # surface utile sur le DVD non-officiel fait 703x355 à (9,112). Comme on fait # du 16:9, la surface utile devrait être 631x355, qu’on va chercher en (45,112) # pour que ce soit centré. # def generate(dir, args): dump = fulllist(DUMP, dir, '*.png') ndone = ntodo = len(dump) seq = [] seq.append(fulllist(DATA, dir, 'seq1', '*.png')) seq.append(fulllist(DATA, dir, 'seq2', '*.png')) seq.append(fulllist(DATA, dir, 'seq3', '*.png')) # Traitement des images, une par une for i in range(ntodo): print " + image %i/%i...\r" % (i + 1, ntodo), sys.stdout.flush() # On construit la ligne de commande cmd = [] s = 0 delta = 0 bounce = 0 reverse = False speed = 1.0 for a in args: if a[0] == "default": # Séquence non remasterisée, on va la prendre dans la Betacam cmd += [dump[i], "--crop", "631x355+45+112", \ "--geometry", "720x576"] ndone -= 1 elif a[0] == "crop": i2 = (i - delta) * speed if reverse: i2 = len(seq[s]) - 1 - i2 while bounce > 0: bounce -= 1 if i2 > len(seq[s]) - 1: i2 = 2 * len(seq[s]) - 1 - i2 elif i2 < 0: i2 = -i2 if i2 >= 0 and i2 <= len(seq[s]) - 1: if int(i2) == i2: cmd += [seq[s][int(i2)]] else: cmd += [seq[s][int(i2)], seq[s][int(i2) + 1], "--merge", "%f" % (i2 - int(i2),)] if a[1] != "720x576+0+0": cmd += ["--crop", a[1], "--geometry", "720x576"] else: cmd += ["random:1x1"] # Image vide s += 1 speed = 1.0 elif a[0] == "logo": # Un logo en surimpression if i >= a[2] and i < a[3]: cmd += [mkpath(DATA, dir, a[1]), "--merge", "1"] elif a[0] == "xlogo": # Un logo avec fade in f = mkpath(DATA, dir, a[1]) t = (float)(i - a[2]) / (a[3] - a[2]) if i >= a[2] and i < a[3]: cmd += [f, "--merge", "%f" % (t,)] elif i >= a[3] and i < a[4]: cmd += [f, "--merge", "1"] elif a[0] == "pan": # Du panning sur une image fixe cmd += [mkpath(DATA, a[1]), "--crop", "%ix%i+%i+%i" % \ (a[2], a[3], a[4] + i * a[6], a[5] + i * a[7]), \ "--geometry", "720x576"] elif a[0] == "toblack": # On fade to black si nécessaire t = (float)(i - a[1]) / (a[2] - a[1]) if t < 0.0: t = 0.0 if t > 1.0: t = 1.0 cmd += ["--dup", "--brightness", "-1", "--merge", "%f" % (t,)] elif a[0] == "fromblack": # On fade from black si nécessaire t = (float)(a[2] - i) / (a[2] - a[1]) if t < 0.0: t = 0.0 if t > 1.0: t = 1.0 cmd += ["--dup", "--brightness", "-1", "--merge", "%f" % (t,)] elif a[0] == "fade": # Fade entre deux séquences if i < a[1]: cmd += ["--swap"] # TODO: --drop elif i < a[2]: t = (float)(i - a[1]) / (a[2] - a[1]) cmd += ["--merge", "%f" % (t,)] else: cmd += [] # TODO: --swap --drop elif a[0] == "special1": # Effet spéciau avec barre séparatrice de 16 pixels if i < a[1]: cmd += ["--swap"] # TODO: --drop else: t = (float)(i - a[1]) / (a[2] - a[1]) if t > 1.0: t = 1.0 t = t * t * (3 - 2 * t) # Image noire cmd += ["random:720x576", "--brightness", "-1.0"] # Premier crop cmd += ["--roll", "3", "--crop", "%ix576+%i+0" % (720 - t * 368, t * 130), "--blit", "0x0"] # Deuxième crop cmd += ["--roll", "2", "--crop", "352x576+320+0", "--blit", "%ix0" % (736 - t * 368,)] elif a[0] == "special2": # Effet spéciau aussi, avec barre de 16 pixels if i < a[1]: pass else: cmd += ["--dup"] # Image noire t = (float)(i - a[1]) / (a[2] - a[1]) if t < 0.0: t = 0.0 if t > 1.0: t = 1.0 t = t * t * (3 - 2 * t) cmd += ["random:408x576", "--brightness", "-1.0", "--blit", "%ix0" % ((t - 1.0) * 408,)] # Slide vertical t = (float)(i - a[3]) / (a[4] - a[3]) if t < 0.0: t = 0.0 if t > 1.0: t = 1.0 t = t * t * (3 - 2 * t) cmd += ["--roll", "2", "--crop", "392x576+0+0", "--split", "--roll", "3", "--dup", "--brightness", "-1", "--merge", "0.2", "--roll", "3", "--dup", "--brightness", "-1", "--merge", "0.2", "--roll", "3", "--dup", "--brightness", "1", "--merge", "0.1", "--combine", "--blit", "0x%i" % ((t - 1.0) * 576,)] elif a[0] == "special3": # Encore un effet spéciau, avec barre de 16 pixels if i > a[2]: pass else: t = (float)(a[2] - i) / (a[2] - a[1]) if t < 0.0: t = 0.0 if t > 1.0: t = 1.0 t = t * t * (3 - 2 * t) cmd += ["--dup", "--crop", "%ix576+0+0" % (t * 308,), "--split", "--roll", "3", "--dup", "--brightness", "-1", "--merge", "0.2", "--roll", "3", "--dup", "--brightness", "1", "--merge", "0.1", "--roll", "3", "--dup", "--brightness", "1", "--merge", "0.2", "--combine", "--blit", "0x0", "random:16x576", "--brightness", "-1", "--blit", "%ix0" % (t * 308 - 16,)] elif a[0] == "flashback": # Fade entre deux séquences avec blur et effet de vague if i < a[1]: cmd += ["--swap"] # TODO: --drop elif i < a[2]: blur1 = (float)(i - a[1]) blur2 = (float)(a[2] - i) w = 300 h1 = (float)(i - a[1]) h2 = (float)(a[2] - i) d = (float)(i - a[1]) r = 0.5 + (float)(i - a[1]) / 20 t = 0.5 - (float)((a[2] + a[1]) / 2 - i) / 10 if t <= 0.0: cmd += ["--swap"] # TODO: --drop cmd += ["--wave", "%fx%f+%fr%f" % (w, h1, d, r), "--blur", "%f" % (blur1,)] elif t >= 1.0: cmd += [] # TODO: --swap --drop cmd += ["--wave", "%fx%f+%fr%f" % (w, h2, d, r), "--blur", "%f" % (blur2,)] else: cmd += ["--swap"] cmd += ["--wave", "%fx%f+%fr%f" % (w, h1, d, r), "--blur", "%f" % (blur1,)] cmd += ["--swap"] cmd += ["--wave", "%fx%f+%fr%f" % (w, h2, d, r), "--blur", "%f" % (blur2,)] cmd += ["--merge", "%f" % (t,)] else: cmd += [] # TODO: --swap --drop elif a[0] == "delta": # On décale l'index de la prochaine séquence delta += a[1] elif a[0] == "reverse": # On inverse la séquence reverse = True elif a[0] == "bounce": # On fait rebondir l'index en fin de séquence bounce = a[1] elif a[0] == "speed": # On change la vitesse de la prochaine séquence speed = a[1] elif a[0] == "pipi": # Une commande pipi arbitraire cmd += a[1:] # On feinte les process parallèles dst = mkpath(FINAL, dir, "img%06d.png" % (i,)) if os.path.exists(dst): continue open(dst, "w").close() # On appelle pipi si nécessaire if len(cmd) == 1: shutil.copyfile(cmd[0], TMPFILE) else: subprocess.call([PIPI, "--gamma", "1"] + cmd + ["-o", TMPFILE]) # On met le fichier à sa place shutil.move(TMPFILE, dst) return ndone, ntodo SEQUENCES = { # Pour caser le joli jingle Warner, j'ai rajouté 210 images au flim # original (8.4 secondes) "0:00:01": [g_warner], # TODO: titre "ce flim n'est pas un flim..." "0:00:03": [["default"]], # Simple fondu depuis le noir "0:00:13-0:00:19": [g_sea_chase, ["fromblack", 0, 26]], "0:00:24": [g_sea_chase], "0:00:28": [g_sea_chase], "0:00:35": [g_sea_chase], "0:00:37": [g_sea_chase], "0:00:39": [g_crimson], "0:00:41": [g_sea_chase], "0:00:48": [g_crimson], "0:00:55": [g_sea_chase], "0:01:03": [g_crimson], "0:01:09": [g_sea_chase], "0:01:11": [g_crimson], "0:01:14": [g_sea_chase], "0:01:18": [g_sea_chase], "0:01:26": [g_crimson], "0:01:28": [g_sea_chase], "0:01:30": [g_sea_chase], "0:01:33": [g_crimson], "0:01:35": [g_sea_chase], "0:01:39": [g_crimson], "0:01:41": [g_sea_chase], "0:01:46": [g_sea_chase], "0:01:50": [g_crimson], # seq1: 81, seq2: 175, total: 206, fade: 56 -> 78 "0:01:53-0:01:57": [g_sea_chase, ["delta", 206 - 175], g_sea_chase, ["fade", 56, 78]], "0:02:02": [g_sea_chase], "0:02:11": [g_sea_chase], # J'ai pas trouvé le bon flim avec les éclairs, alors je prends au pif "0:02:22": [g_blood], "0:02:25": [g_sea_chase], "0:02:28": [g_sea_chase], # J'ai pas trouvé le bon flim avec les éclairs, alors je prends au pif "0:02:31": [g_blood], "0:02:32": [g_sea_chase], "0:02:39": [g_sea_chase], "0:02:41": [g_sea_chase], "0:02:49": [g_sea_chase], "0:02:55": [g_sea_chase], "0:02:59": [g_sea_chase], "0:03:01": [g_sea_chase], "0:03:02": [g_sea_chase], # J'ai pas trouvé le bon flim avec les éclairs, alors je prends au pif "0:03:05": [["delta", -27], g_blood, ["pipi", "--hflip"]], "0:03:07": [g_sea_chase], "0:03:15": [g_sea_chase], "0:03:18": [g_sea_chase], "0:03:20": [g_sea_chase], # Logo "Une production DUNE pour WARNER BROS. TELEVISION" "0:03:26-0:03:27": [g_arrangement, ["logo", "../opening_production_dune.png", 20, 151]], # Logo "John Wayne" "0:03:32": [g_arrangement, ["logo", "../opening_john_wayne.png", 0, 90]], # Logo "Dustin Hoffman" "0:03:37": [g_freebie, ["logo", "../opening_dustin_hoffman.png", 0, 108]], # Logo "Paul Newman" "0:03:41": [g_harper, ["logo", "../opening_paul_newman.png", 0, 43]], # Logo "Paul Newman" "0:03:44": [g_arrangement, ["logo", "../opening_paul_newman.png", 0, 26]], "0:03:45": [g_harper], # Logo "Robert Redford" "0:03:48": [g_freebie, ["logo", "../opening_robert_redford.png", 0, 55]], # Logo "Burt Lancaster" puis "Henry Fonda" "0:03:50-0:03:54": [g_freebie, ["logo", "../opening_burt_lancaster.png", 0, 75], ["logo", "../opening_henry_fonda.png", 93, 167]], "0:03:57": [g_harper], # Logo "James Stewart" "0:03:59": [g_freebie, ["logo", "../opening_james_stewart.png", 0, 59]], # On croppe comme pour Harper mais on décale à droite et on zoome pour # cacher le personnage qui n'a rien à foutre là "0:04:01": [["crop", "488x325+232+60"]], # Logo "Dean Martin" "0:04:02": [g_freebie, ["logo", "../opening_dean_martin.png", 0, 65]], # Logo "Frank Sinatra" "0:04:06": [g_freebie, ["logo", "../opening_frank_sinatra.png", 0, 42]], # On croppe comme pour Harper mais on décale à droite pour mieux cadrer "0:04:08": [["crop", "542x361+178+60"]], # Logo "Clark Gable" "0:04:10": [g_freebie, ["logo", "../opening_clark_gable.png", 0, 32]], "0:04:12": [g_harper], # Logo "Robert Mitchum" "0:04:14": [g_freebie, ["logo", "../opening_robert_mitchum.png", 0, 91]], # Logo "Lauren Bacall" "0:04:17": [g_freebie, ["logo", "../opening_lauren_bacall.png", 0, 43]], "0:04:18": [g_madmax], # Logo "Angie Dickinson" "0:04:19": [g_freebie, ["logo", "../opening_angie_dickinson.png", 0, 42]], # Logo "Angie Dickinson" "0:04:21": [g_freebie, ["logo", "../opening_angie_dickinson.png", 0, 28]], "0:04:23": [g_freebie], # Logo "Orson Welles" "0:04:25": [g_bullitt, ["logo", "../opening_orson_welles.png", 0, 66]], "0:04:27": [g_harper], # Logo "Musique originale Laurent Petitgirard" "0:04:28": [g_bullitt, ["logo", "../opening_laurent_petitgirard.png.png", 0, 43]], # Logo "Musique originale Laurent Petitgirard" "0:04:30": [g_freebie, ["logo", "../opening_laurent_petitgirard.png.png", 0, 25]], "0:04:31": [g_harper], "0:04:32": [g_freebie], # Logo "Un film produit par..." "0:04:33": [g_freebie, ["logo", "../opening_producers.png", 0, 29]], # Logo "Un film produit par..." "0:04:34": [g_freebie, ["logo", "../opening_producers.png", 0, 17]], # Logo "Un film produit par..." "0:04:35": [g_freebie, ["logo", "../opening_producers.png", 0, 20]], "0:04:36": [g_harper], # Logo "Écrit et réalisé par..." "0:04:37": [g_freebie, ["logo", "../opening_directors.png", 0, 34]], # Logo "Écrit et réalisé par..." "0:04:38": [g_freebie, ["logo", "../opening_directors.png", 0, 40]], # Logo "LA CLASSE AMÉRICAINE" # Arrive en fondu de l'image 34 (0%) à l'image 46 (100%) # Pour le fun, on rajoute un petit logo "84% restaurés" #"0:04:39-0:04:41": [g_freebie, ["xlogo", "../logo.png", 34, 46, 104]], "0:04:39-0:04:41": [g_freebie, ["xlogo", "../opening_title.png", 34, 46, 104]], "0:04:44": [g_inferno], "0:04:50": [g_president], "0:04:54": [g_harper], "0:04:58": [g_president], "0:05:01": [g_harper], "0:05:04": [g_president], "0:05:07": [g_harper], "0:05:09": [g_president], "0:05:13": [g_president], "0:05:18": [g_president], "0:05:26": [g_president], "0:05:32": [g_president], "0:05:34": [g_president], "0:05:36": [g_president], "0:05:38": [g_president], "0:05:44": [g_president], "0:05:46": [g_president], "0:05:55": [g_president], "0:06:00": [g_president], "0:06:04": [g_president], "0:06:08": [g_president], "0:06:11": [g_revolution], "0:06:31": [g_revolution], "0:06:42": [g_revolution], "0:06:50": [g_revolution], "0:06:51": [g_revolution], "0:06:52": [g_revolution], "0:06:56": [g_president], "0:07:03": [g_president], "0:07:09": [g_president], "0:07:15": [g_president], "0:07:22": [g_president], "0:07:24": [g_president], "0:07:27": [g_president], "0:07:32": [g_harper], # La séquence originale a une frame intermédiaire entrelacée (on s'en tape) "0:07:46-0:07:49": [g_harper], "0:07:52": [g_bulge], "0:07:54": [g_harper], "0:07:57": [g_bulge], "0:08:03": [g_harper], "0:08:04": [g_bulge], "0:08:09": [g_harper], # seq1: 517, seq2: 173, final: 605, fade: 433 -> 508 "0:08:12-0:08:32": [g_bulge, ["delta", 605 - 173], g_cheyenne, ["flashback", 433, 508]], "0:08:36": [g_cheyenne], "0:08:39": [g_cheyenne], "0:08:42": [g_cheyenne], "0:09:10": [g_cheyenne], "0:09:16": [g_cheyenne], # seq1: 150, seq2: 450, total: 551, fade: 116 -> 142 "0:09:20-0:09:27": [g_cheyenne, ["delta", 551 - 450], g_cheyenne, ["fade", 116, 142]], "0:09:44": [g_cheyenne], "0:09:53": [g_cheyenne], "0:09:55": [g_cheyenne], "0:10:10": [g_train], "0:10:18": [g_cheyenne], "0:10:25": [g_train], "0:10:34": [g_cheyenne], "0:10:41": [g_train], "0:10:45": [g_cheyenne], "0:10:48": [g_train], "0:10:56": [g_cheyenne], "0:11:11": [g_train], "0:11:17": [g_harper], "0:11:20": [g_bulge], "0:11:29": [g_harper], # seq1: 283, seq2: 130, final: 376, fade: 237 -> 290 "0:11:33-0:11:43": [g_bulge, ["delta", 376 - 130], g_crooked, ["flashback", 237, 290]], "0:11:47": [g_searchers], "0:11:50": [g_crooked], # XXX: Drum Beat n'est pas sorti en DVD "0:11:52": [g_drumbeat], "0:11:54": [g_crooked], # XXX: Drum Beat n'est pas sorti en DVD "0:11:55": [g_drumbeat], "0:12:01": [g_crooked], # XXX: Drum Beat n'est pas sorti en DVD "0:12:03": [g_drumbeat], "0:12:08": [g_crooked], # XXX: Drum Beat n'est pas sorti en DVD "0:12:11": [g_drumbeat], "0:12:15": [g_crooked], # XXX: Drum Beat n'est pas sorti en DVD "0:12:19": [g_drumbeat], "0:12:25": [g_crooked], # XXX: Drum Beat n'est pas sorti en DVD "0:12:27": [g_drumbeat], "0:12:33": [g_crooked], # XXX: Drum Beat n'est pas sorti en DVD "0:12:36": [g_drumbeat], "0:12:40": [g_crooked], "0:12:47": [g_harper], "0:12:49": [g_bulge], "0:12:57": [g_harper], # final: 656, split: 27 -> 50 # le speed 1.2 ne capture pas exactement les bonnes frames, mais c'est # quand même pas mal "0:13:07-0:13:09": [["speed", 1.2], g_president, ["delta", 27], ["reverse"], ["speed", 0.845], g_harper, ["special1", 27, 50]], # final: 709, black: 137 -> 177, slide: 197 -> 222 "0:13:34-0:13:40-0:13:42": [g_president, ["special2", 137, 177, 197, 222]], # final: 102, split: 52 -> 75 "0:14:02-0:14:05": [g_president, ["special3", 52, 75]], "0:14:06": [g_president], "0:14:18": [g_president], "0:14:21": [g_fbi], "0:14:26": [g_president], "0:14:31": [g_president], "0:14:36": [g_fbi], "0:14:44": [g_president], "0:14:54": [g_fbi], "0:14:59": [g_cheyenne], "0:15:01": [g_cheyenne], "0:15:05": [g_cheyenne], "0:15:24": [g_cheyenne], "0:15:28": [g_cheyenne], "0:15:33": [g_cheyenne], "0:15:38": [g_cheyenne], "0:15:44": [g_president], "0:15:54": [g_fbi], "0:16:00": [g_cheyenne], "0:16:04": [g_riobravo], "0:16:11": [g_cheyenne], "0:16:18": [g_riobravo], "0:16:35": [g_cheyenne], "0:16:37": [g_riobravo], "0:16:44": [g_cheyenne], "0:16:46": [g_riobravo], "0:16:52": [g_cheyenne], "0:16:58": [g_riobravo], "0:17:01": [g_firecreek], "0:17:05": [g_cheyenne], "0:17:11": [g_riobravo], "0:17:13": [g_riobravo], "0:17:21": [g_cheyenne], "0:17:24": [g_riobravo], "0:17:31": [g_cheyenne], "0:17:33": [g_riobravo], # seq1: 102, seq2: 58, total: 124, fade: 72 -> 92 "0:17:39-0:17:43": [g_riobravo, ["delta", 124 - 58], g_cheyenne, ["fade", 72, 92]], "0:17:45": [g_riobravo], "0:17:47": [g_cheyenne], "0:17:56": [g_cheyenne], # La transition est déjà dans le film original "0:18:14-0:18:21": [g_chisum], "0:18:23": [g_cheyenne], "0:18:25": [g_chisum], "0:18:29": [g_cheyenne], "0:18:31": [g_chisum], "0:18:35": [g_cheyenne], "0:18:37": [g_chisum], "0:18:42": [g_cheyenne], "0:18:44": [g_chisum], "0:18:52": [g_cheyenne], "0:18:54": [g_chisum], "0:18:57": [g_good], "0:19:00": [g_cheyenne], "0:19:04": [g_cheyenne], "0:19:09": [g_cheyenne], "0:19:11": [g_riobravo], "0:19:15": [g_good], "0:19:18": [g_cheyenne], "0:19:19": [g_cheyenne], "0:19:22": [g_cheyenne], "0:19:24": [g_cheyenne], "0:19:27": [g_riobravo], "0:19:32": [g_riobravo], "0:19:40": [g_riobravo], "0:19:44": [g_good], "0:19:47": [g_cheyenne], "0:19:48": [g_riobravo], "0:19:50": [g_cheyenne], "0:19:52": [g_cheyenne], "0:19:55": [g_riobravo], "0:19:57": [g_riobravo], "0:19:58": [g_riobravo], "0:19:59": [g_cheyenne], "0:20:01": [g_riobravo], "0:20:02": [g_cheyenne], "0:20:03": [g_cheyenne], "0:20:04": [g_firecreek], "0:20:05": [g_cheyenne], "0:20:08": [g_riobravo], "0:20:10": [g_cheyenne], "0:20:11": [g_cheyenne], "0:20:13": [g_riobravo], "0:20:17": [g_firecreek], "0:20:19": [g_cheyenne], "0:20:23": [g_riobravo], "0:20:27": [g_riobravo], "0:20:29": [g_cheyenne], "0:20:31": [g_firecreek], "0:20:35": [g_riobravo], "0:20:39": [g_cheyenne], "0:20:44": [g_riobravo], "0:20:48": [g_cheyenne], "0:20:50": [g_riobravo], "0:20:53": [g_riobravo], "0:20:55": [g_riobravo], "0:20:58": [g_president], "0:21:02": [g_president], "0:21:11": [g_fbi], "0:21:23": [g_firecreek], "0:21:26": [g_cahill], "0:21:30": [g_firecreek], "0:21:34": [g_cahill], "0:21:43": [g_firecreek], "0:21:47": [g_cahill], "0:21:55": [g_president], "0:22:00": [g_fbi], "0:22:14": [g_president], "0:22:27": [g_president], "0:22:45": [g_president], "0:23:06": [g_ocean], "0:23:12": [g_president], "0:23:14": [g_president], "0:23:16": [g_ocean], "0:23:20": [g_president], "0:23:29": [g_ocean], "0:23:40": [g_president], "0:23:44": [g_ocean], "0:23:50": [g_president], "0:23:59": [g_ocean], # À la fin de la première séquence on voit Peter ouvrir la bouche, je # vire donc les 5 dernières images de cette séquence. De toute façon # il faut un gros bounce pour compléter. # seq1: 192 (après bounce), seq2: 60, final: 235, fade: 159 -> 215 "0:24:06-0:24:15": [["bounce", 2], g_president, ["delta", 235 - 60], g_texas, ["flashback", 159, 215]], "0:24:16": [g_texas], "0:24:26": [g_texas], "0:24:28": [g_texas], "0:24:31": [g_texas], "0:24:34": [g_texas], "0:24:38": [g_texas], "0:24:40": [g_texas], "0:24:43": [g_texas], "0:24:45": [g_texas], "0:24:47": [g_texas], "0:24:57": [g_texas], "0:25:01": [g_texas], "0:25:05": [g_texas], # seq1: 100, seq2: 112, final: 189, fade: 82 -> 94 "0:25:08-0:25:12": [g_texas, ["delta", 189 - 112], g_fbi, ["fade", 82, 94]], "0:25:15": [g_fbi], "0:25:18": [g_fbi], "0:25:21": [g_fbi], "0:25:23": [g_texas], "0:25:25": [g_texas], "0:25:51": [g_texas], "0:26:03": [g_texas], "0:26:09": [g_texas], "0:26:24": [g_texas], "0:26:40": [g_texas], # seq1: 160, seq2: 51, final: 233, fade: 134 -> 149 "0:26:45-0:26:50": [g_texas, ["delta", 233 - 51], ["bounce", 1], g_texas, ["pipi", "--split", "--roll", "3", "--dup", "--brightness", "-1", "--merge", "0.2", "--roll", "3", "--dup", "--brightness", "-1", "--merge", "0.7", "--roll", "3", "--dup", "--brightness", "-1", "--merge", "0.6", "--combine"], ["fade", 134, 149]], "0:26:54": [g_cheyenne], "0:26:58": [g_cheyenne], "0:27:03": [g_texas], "0:27:09": [g_cheyenne], "0:27:16": [g_texas], "0:27:22": [g_cheyenne], "0:27:27": [g_cheyenne], "0:27:29": [g_texas], "0:27:31": [g_cheyenne], "0:27:32": [g_texas], "0:27:33": [g_cheyenne], "0:27:34": [g_texas], "0:27:35": [g_cheyenne], "0:27:39": [g_texas], "0:27:44": [g_cheyenne], "0:27:54": [g_ocean], "0:28:01": [g_president], "0:28:11": [g_ocean], # seq1: 135, seq2: 202, final: 302, fade: 88 -> 162 "0:28:20-0:28:24": [g_president, ["delta", 302 - 202], g_texas, ["flashback", 88, 162]], # TODO: fondu flashbacks # XXX: scène pas sur le DVD "0:28:31-0:28:38": [["default"]], "0:28:41-0:28:47": [g_chisum], "0:28:51": [g_texas], # TODO: fondu flashbacks # XXX: scène pas sur le DVD "0:28:56-0:29:04": [["default"]], "0:29:06": [g_riobravo], "0:29:09": [g_searchers], "0:29:11": [g_riobravo], # seq1: 182, seq2: 100, final: 264, fade: 152 -> 203 "0:29:13-0:29:22": [g_searchers, ["delta", 264 - 100], g_riobravo, ["flashback", 152, 203]], "0:29:24": [g_charro], "0:29:26": [g_riobravo], "0:29:28": [g_charro], "0:29:31": [g_riobravo], "0:29:33": [g_charro], "0:29:37": [g_riobravo], "0:29:39": [g_charro], "0:29:41": [g_charro], "0:29:43": [g_riobravo], # TODO: fondu flashbacks # XXX: scène pas sur le DVD "0:29:47-0:29:58-0:30:05": [["default"]], # TODO: fondu flashbacks # XXX: City Beneath the Sea n'est pas sorti en DVD "0:30:11-0:30:14-0:30:20": [["default"]], # XXX: City Beneath the Sea n'est pas sorti en DVD "0:30:22": [g_city], # XXX: City Beneath the Sea n'est pas sorti en DVD "0:30:46": [g_city], # XXX: City Beneath the Sea n'est pas sorti en DVD "0:30:51": [g_city], # XXX: City Beneath the Sea n'est pas sorti en DVD "0:30:55": [g_city], # XXX: City Beneath the Sea n'est pas sorti en DVD "0:30:57": [g_city], # XXX: City Beneath the Sea n'est pas sorti en DVD "0:30:58": [g_city], # XXX: City Beneath the Sea n'est pas sorti en DVD "0:31:00": [g_city], "0:31:01": [g_president], "0:31:20": [g_candidate], "0:31:22": [g_harper], "0:31:26": [g_candidate], "0:31:30": [g_harper], "0:31:34": [g_candidate], "0:31:36": [g_harper], "0:31:39": [g_candidate], "0:31:41": [g_harper], "0:31:43": [g_candidate], "0:31:48": [g_harper], "0:31:51": [g_candidate], "0:31:53": [g_harper], "0:31:57": [g_candidate], "0:32:02": [g_harper], "0:32:05": [g_candidate], "0:32:06": [g_candidate], "0:32:09": [g_harper], "0:32:11": [g_candidate], "0:32:15": [g_harper], "0:32:17": [g_candidate], "0:32:19": [g_candidate], "0:32:21": [g_president], "0:32:52": [g_president], "0:32:56": [g_president], "0:33:03": [g_president], "0:33:41": [g_straight], "0:33:56": [g_executive], "0:34:00": [g_straight], "0:34:04": [g_executive], "0:34:12": [g_straight], "0:34:15": [g_executive], "0:34:20": [g_straight], "0:34:42": [g_executive], "0:34:56": [g_straight], "0:34:59": [g_executive], "0:35:11": [g_straight], "0:35:14": [g_executive], "0:35:30": [g_straight], "0:35:34": [g_executive], "0:35:36": [g_straight], "0:35:42": [g_straight], "0:35:47": [g_straight], # On croppe comme pour Harper mais on décale à droite pour mieux cadrer "0:35:52": [["crop", "542x361+178+60"]], "0:35:54": [g_candidate], "0:36:23": [g_straight], "0:36:31": [g_candidate], # On croppe comme pour Harper mais on décale à droite pour mieux cadrer "0:36:41": [["crop", "542x361+178+60"]], "0:36:50": [g_straight], "0:36:54": [g_straight], "0:36:55": [g_straight], # Rotation de -15 degrés et zoom pour cacher les bords. On upscale et on # blurre un coup parce que libpipi ne sait pas encore interpoler. "0:36:57": [g_harper, ["pipi", "--geometry", "3072x1728", "--blur", "2", "--rotate", "-15", "--crop", "2160x1215+456+256", "--geometry", "720x576"]], "0:36:59": [g_straight], "0:37:02": [g_candidate], # On croppe comme pour Harper mais on décale à droite pour mieux cadrer "0:37:12": [["crop", "542x361+178+60"]], "0:37:16": [g_candidate], "0:37:19": [g_straight], "0:37:20": [g_madmax], "0:37:21": [g_madmax], "0:37:22": [g_madmax], "0:37:23": [g_straight], "0:37:24": [g_straight], "0:37:25": [g_inferno], "0:37:27": [g_straight], "0:37:37": [g_harper], "0:37:44": [g_straight], "0:37:54": [g_harper], "0:38:12": [g_straight], "0:38:21": [g_harper], "0:38:33": [g_straight], "0:38:44": [g_jeremiah], "0:38:49": [g_jeremiah], "0:38:54": [g_jeremiah], "0:39:00": [g_president], "0:39:04": [g_president], "0:39:06": [g_president], "0:39:10": [g_president], "0:39:16": [g_president], # seq1: 132, seq2: 109, final: 225, fade: 106 -> 154 "0:39:18-0:39:24": [g_president, ["delta", 225 - 109], g_deliverance, ["flashback", 106, 154]], # La séquence originale a une frame intermédiaire entrelacée (on s'en tape) "0:39:28-0:39:35": [g_deliverance], # seq1: 104, seq2: 197, final: 286, fade: 79 -> 128 "0:39:38-0:39:42": [g_deliverance, ["delta", 286 - 197], g_president, ["flashback", 79, 128]], # seq1: 70, seq2: 181, final: 237, fade: 62 -> 73 "0:39:49-0:39:52": [g_president, ["delta", 237 - 181], g_jeremiah, ["fade", 62, 73]], "0:39:59": [g_jeremiah], "0:40:03": [g_president], "0:40:06": [g_time], "0:40:09": [g_president], "0:40:16": [g_time], "0:40:19": [g_president], "0:40:21": [g_time], # seq1: 80, seq2: 80, seq3: 80, final: 183 # fade1: 51 -> 63, fade2: 105 -> 118 "0:40:25-0:40:27-0:40:29": [g_jeremiah, ["delta", 51], g_jeremiah, ["fade", 51, 63], ["delta", 105 - 51], g_jeremiah, ["fade", 105, 118]], "0:40:32": [g_judge], "0:40:36": [g_judge], "0:40:51": [g_around], "0:40:56": [g_judge], # seq1: 109, seq2: 62, final: 155, fade: 82 -> 135 "0:41:01-0:41:06": [g_around, ["delta", 155 - 62], g_chisum, ["flashback", 82, 135]], "0:41:07": [g_chisum], "0:41:09": [g_chisum], "0:41:11": [g_chisum], # seq1: 103, seq2: 107, final: 182, fade: 73 -> 119 "0:41:13-0:41:17": [g_chisum, ["delta", 182 - 107], g_around, ["flashback", 73, 119]], "0:41:21": [g_judge], "0:41:31": [g_jeremiah], "0:41:36": [g_jeremiah], "0:41:39": [g_jeremiah], "0:41:41": [g_president], "0:41:44": [g_ocean], "0:41:49": [g_president], "0:41:53": [g_ocean], "0:41:58": [g_president], # seq1: 385, seq2: 84, final: 449, fade: 357 -> 404 "0:42:04-0:42:19": [g_ocean, ["delta", 449 - 84], g_riobravo, ["flashback", 357, 404]], "0:42:21": [g_riobravo], "0:42:56": [g_riobravo], "0:42:59": [g_riobravo], "0:43:04": [g_riobravo], "0:43:12": [g_riobravo], "0:43:14": [g_riobravo], "0:43:16": [g_riobravo], # seq1: 106, seq2: 265, final: 346, fade: 73 -> 125 "0:43:20-0:43:25": [g_riobravo, ["delta", 346 - 265], g_ocean, ["flashback", 73, 125]], "0:43:34": [g_president], "0:43:38": [g_jeremiah], "0:43:41": [g_jeremiah], "0:43:46": [g_jeremiah], "0:43:49": [g_jeremiah], "0:43:53": [g_jeremiah], "0:43:54": [g_oldman], "0:44:00": [g_jeremiah], "0:44:03": [g_oldman], "0:44:06": [g_jeremiah], "0:44:08": [g_oldman], "0:44:12": [g_jeremiah], # seq1: 208, seq2: 195, final: 270, fade: 181 -> 193 "0:44:16-0:44:23": [g_oldman, ["delta", 270 - 195], g_train, ["fade", 181, 193]], "0:44:26": [g_oldman], "0:44:30": [g_train], "0:44:32": [g_oldman], "0:44:33": [g_cowboys], "0:44:35": [g_oldman], "0:44:37": [g_cowboys], # seq1: 162, seq2: 231, final: 379, fade: 148 -> 160 # + rajout du bout de porte # FIXME: le coup de la porte est pas terrible, on fait deux scalings et # ensuite seulement on merge; il vaudrait mieux faire l'inverse. En plus # on rajoute le logo même sur les séquences qui n'en ont pas besoin "0:44:40-0:44:46": [g_oldman, ["delta", 379 - 231], g_jeremiah, ["pipi", "--geometry", "720x576", mkpath(DATA, "porte.png"), "--crop", g_jeremiah[1], "--geometry", "720x576", "--merge", "1"], ["fade", 148, 160]], "0:44:55": [g_inferno], "0:44:58": [g_president], "0:45:17": [g_president], "0:45:21": [g_president], "0:45:27": [g_harper], # La séquence originale a des frames entrelacées (on s'en tape) "0:45:36-0:45:40-0:45:43-0:45:45-0:45:58": [g_harper], "0:46:02": [g_time], "0:46:04": [g_harper], "0:46:07": [g_time], "0:46:10": [g_harper], "0:46:11": [g_time], "0:46:19": [g_harper], "0:46:23": [g_harper], "0:46:25": [g_time], "0:46:32": [g_harper], "0:46:37": [g_harper], "0:46:44": [g_time], "0:46:50": [g_hooper], "0:46:52": [g_time], "0:46:56": [g_hooper], "0:47:03": [g_time], "0:47:07": [g_hooper], "0:47:10": [g_time], "0:47:16": [g_hooper], "0:47:17": [g_time], "0:47:22": [g_time], "0:47:24": [g_time], "0:47:25": [g_time], "0:47:26": [g_time], "0:47:28": [g_president], "0:47:31": [g_angels], "0:47:39": [g_president], "0:47:41": [g_angels], "0:47:47": [g_president], "0:47:57": [g_angels], # seq1: 88, seq2: 329, final: 378, fade: 34 -> 83 "0:48:00-0:48:02": [g_president, ["delta", 378 - 329], g_angels, ["flashback", 34, 83]], "0:48:14": [g_angels], "0:48:18": [g_angels], "0:48:21": [g_angels], "0:48:25": [g_angels], "0:48:27": [g_angels], "0:48:37": [g_angels], "0:48:40": [g_angels], "0:48:42": [g_angels], "0:48:46": [g_angels], "0:48:49": [g_angels], "0:48:52": [g_sea_chase], "0:48:54": [g_angels], "0:49:08": [g_sea_chase], # seq1: 221, seq2: 150, final: 359, fade: 190 -> 243 "0:49:18-0:49:28": [g_angels, ["delta", 359 - 150], g_angels, ["flashback", 190, 243]], "0:49:33": [g_president], "0:49:42": [g_angels], "0:49:43": [g_president], "0:49:46": [g_president], # XXX: Rampage n'est pas sorti en DVD "0:49:59": [g_rampage], "0:50:01": [g_harper], # XXX: Rampage n'est pas sorti en DVD "0:50:03": [g_rampage], "0:50:05": [g_harper], # TODO: fondu flashbacks # XXX: Rampage n'est pas sorti en DVD "0:50:11-0:50:17-0:50:28-0:50:44": [["default"]], # XXX: Rampage n'est pas sorti en DVD "0:50:49": [g_rampage], "0:50:50": [g_harper], # TODO: fondu flashbacks # XXX: Rampage n'est pas sorti en DVD "0:50:53-0:50:59": [["default"]], "0:51:02": [g_cahill], "0:51:04": [["speed", 1.25], g_westbound], "0:51:07": [g_cahill], "0:51:09": [["speed", 1.23], g_westbound], "0:51:22": [g_cahill], "0:51:23": [g_cahill], "0:51:26": [g_cahill], "0:51:31": [["speed", 1.25], g_westbound], "0:51:33": [g_cahill], "0:51:39": [g_cahill], # TODO: fondu flashbacks # XXX: Rampage n'est pas sorti en DVD "0:51:43-0:52:02": [["default"]], "0:52:04": [g_harper], "0:52:05": [g_harper], # XXX: Rampage n'est pas sorti en DVD "0:52:07": [g_rampage], # La séquence originale a des frames entrelacées (on s'en tape) "0:52:11-0:52:21-0:52:25-0:52:26": [g_harper], "0:52:28": [g_time], "0:52:42": [g_time], "0:52:57": [g_president], "0:53:04": [g_time], "0:53:18": [g_president], "0:53:24": [g_time], # XXX: LA PUTAIN D’HORLOGE "0:53:26": [g_horloge], "0:53:29": [g_candidate], "0:53:31": [g_time], "0:53:41": [g_candidate], "0:53:44": [g_time], "0:53:47": [g_candidate], "0:53:51": [g_time], "0:53:52": [g_candidate], # seq1: 77, seq2: 215, final: 237, fade: 23, 73 "0:53:59-0:54:01": [g_time, ["delta", 237 - 215], g_gwangi, ["flashback", 23, 73]], "0:54:08": [g_carson], "0:54:16": [g_gwangi], # La séquence originale a une frame intermédiaire entrelacée (on s'en tape) "0:54:21-0:54:23": [g_gwangi], "0:54:25": [g_carson], "0:54:28": [g_gwangi], "0:54:29": [g_carson], "0:54:34": [g_gwangi], # La séquence originale a une frame intermédiaire entrelacée (on s'en tape) "0:54:36-0:54:38": [g_gwangi], "0:54:43": [g_gwangi], "0:54:46": [g_gwangi], "0:54:47": [g_gwangi], "0:54:50": [g_searchers], "0:54:51": [g_gwangi], # Ici je triche parce que la vraie scène n'est pas sur le DVD "0:54:53": [g_gwangi], "0:54:54": [g_gwangi], # La séquence originale a une frame intermédiaire entrelacée (on s'en tape) "0:54:56-0:54:57": [g_gwangi], # La séquence originale a une frame intermédiaire entrelacée (on s'en tape) "0:55:01-0:55:02": [g_gwangi], "0:55:04": [g_searchers], "0:55:06": [g_gwangi], "0:55:09": [g_gwangi], "0:55:12": [g_gwangi], # seq1: 114, seq2: 81, final: 185, fade: 105 -> 119 "0:55:13-0:55:18": [g_gwangi, ["delta", 185 - 81], g_searchers, ["fade", 105, 119]], "0:55:21": [g_gwangi], # seq1: 81, seq2: 65, final: 134, fade: 69 -> 80 "0:55:29-0:55:32": [g_searchers, ["delta", 134 - 65], g_time, ["fade", 69, 80]], "0:55:35": [g_candidate], "0:55:37": [g_time], "0:55:39": [g_candidate], # seq1: 241, seq2: 113, final: 281, fade: 153 -> 200 "0:55:47-0:55:54": [g_time, ["delta", 281 - 113], g_riding, ["flashback", 153, 200]], "0:55:58": [g_gwangi], "0:56:00": [g_gwangi], "0:56:03": [g_riding], "0:56:05": [g_riding], "0:56:10": [g_riding], "0:56:13": [g_riding], "0:56:15": [g_riding], "0:56:17": [g_riding], "0:56:21": [g_riding], "0:56:25": [g_president], "0:56:30": [g_president], "0:56:34": [g_harper], "0:56:40": [g_president], "0:56:43": [g_harper], "0:56:46": [g_president], "0:56:52": [g_harper], "0:57:01": [g_blood], # XXX: Rampage n'est pas sorti en DVD "0:57:21": [g_rampage], "0:57:26": [g_blood], # XXX: Rampage n'est pas sorti en DVD "0:57:44": [g_rampage], "0:57:50": [g_blood], "0:57:53": [g_blood], # XXX: Rampage n'est pas sorti en DVD "0:57:57": [g_rampage], "0:58:01": [g_blood], "0:58:14": [g_harper], "0:58:19": [g_president], "0:58:29": [g_harper], "0:58:34": [g_president], "0:58:43": [g_harper], "0:58:59": [g_harper], "0:59:02": [g_president], "0:59:04": [g_president], "0:59:08": [g_harper], "0:59:20": [g_president], "0:59:25": [g_president], "0:59:28": [g_harper], "0:59:38": [g_president], "0:59:40": [g_president], "1:00:00": [g_president], "1:00:02": [g_harper], "1:00:06": [g_president], "1:00:14": [g_president], "1:00:19": [g_president], "1:00:21": [g_poseidon], "1:00:30": [g_president], "1:00:35": [g_mcq], "1:00:42": [g_poseidon], "1:00:53": [g_mcq], "1:00:58": [g_mcq], "1:01:03": [g_president], "1:01:09": [g_mcq], "1:01:10": [g_freebie], "1:01:12": [g_mcq], "1:01:13": [g_mcq], "1:01:14": [g_mcq], "1:01:19": [g_mcq], "1:01:22": [g_mcq], "1:01:24": [g_mcq], "1:01:26": [g_mcq], "1:01:30": [g_mcq], "1:01:35": [g_mcq], "1:01:46": [g_mcq], "1:01:56": [g_mcq], "1:01:57": [g_mcq], "1:01:59": [g_mcq], "1:02:02": [g_mcq], "1:02:07": [g_mcq], "1:02:12": [g_mcq], "1:02:14": [g_mcq], "1:02:26": [g_mcq], "1:02:30": [g_mcq], "1:02:33": [g_mcq], "1:02:35": [g_president], "1:02:38": [g_mcq], "1:02:40": [g_president], "1:02:44": [g_miracle], "1:02:45": [g_miracle], "1:02:48": [g_miracle], "1:02:53": [g_mcq], "1:03:03": [g_president], "1:03:08": [g_president], "1:03:10": [g_mcq], "1:03:15": [g_president], "1:03:19": [g_mcq], "1:03:23": [g_president], "1:03:25": [g_mcq], "1:03:30": [g_president], "1:03:33": [g_mcq], "1:03:40": [g_mcq], "1:03:43": [g_mcq], "1:03:45": [g_mcq], # On croppe comme pour McQ mais on décale à gauche pour mieux cadrer "1:03:46": [["crop", "531x425+2+75"]], "1:03:53": [g_mcq], "1:03:55": [g_mcq], "1:03:57": [g_cleopatra], "1:04:03": [g_mcq], "1:04:09": [g_cleopatra], "1:04:12": [g_mcq], "1:04:15": [g_cleopatra], "1:04:19": [g_mcq], "1:04:21": [g_cleopatra], "1:04:26": [g_cleopatra], "1:04:34": [g_mcq], "1:04:41": [g_cleopatra], "1:04:44": [g_mcq], "1:04:47": [g_cleopatra], "1:04:51": [g_mcq], "1:04:53": [g_president], "1:05:08": [g_president], "1:05:12": [g_president], "1:05:18": [g_ocean], # XXX: Rampage n'est pas sorti en DVD "1:05:20": [g_rampage], "1:05:23": [g_mcq], # XXX: Rampage n'est pas sorti en DVD "1:05:27": [g_rampage], "1:05:31": [g_mcq], # XXX: Rampage n'est pas sorti en DVD "1:05:40": [g_rampage], "1:05:42": [g_mcq], # XXX: Rampage n'est pas sorti en DVD "1:05:44": [g_rampage], "1:05:47": [g_mcq], # XXX: Rampage n'est pas sorti en DVD "1:05:49": [g_rampage], "1:05:52": [g_mcq], # XXX: Rampage n'est pas sorti en DVD "1:05:55": [g_rampage], "1:05:57": [g_mcq], # XXX: Rampage n'est pas sorti en DVD "1:06:01": [g_rampage], "1:06:04": [g_mcq], # XXX: Rampage n'est pas sorti en DVD "1:06:07": [g_rampage], "1:06:11": [g_deliverance], # La transition est déjà dans le film original "1:06:19-1:06:25": [g_president], "1:06:26": [g_president], "1:06:42": [g_president], "1:06:45": [g_president], "1:07:35": [g_president], "1:07:39": [g_president], "1:07:42": [g_president], "1:07:45": [g_president], "1:07:47": [g_president], "1:07:49": [g_president], "1:07:51": [g_president], "1:07:52": [g_president], "1:07:55": [g_president], "1:08:01": [g_president], "1:08:14": [g_president], "1:08:18": [g_president], "1:08:20": [g_president], "1:08:23": [g_president], "1:08:29": [g_president], "1:08:32": [g_madmax], # On croppe comme pour Harper mais on décale à droite pour mieux cadrer "1:08:35": [["crop", "542x361+178+60"]], "1:08:42": [g_mcq], # On croppe comme pour Harper mais on décale à droite pour mieux cadrer "1:08:51": [["crop", "542x361+178+60"]], "1:08:53": [g_madmax], "1:08:56": [g_madmax], # On croppe comme pour Harper mais on décale à droite pour mieux cadrer "1:08:58": [["crop", "542x361+178+60"]], "1:09:05": [g_mcq], # On croppe comme pour Harper mais on décale à droite pour mieux cadrer "1:09:13": [["crop", "542x361+178+60"]], "1:09:15": [g_mcq], # On croppe comme pour Harper mais on décale à droite pour mieux cadrer "1:09:23": [["crop", "542x361+178+60"]], "1:09:25": [g_mcq], "1:09:33": [g_madmax], "1:09:34": [g_madmax], "1:09:36": [g_mcq], # On croppe comme pour Harper mais on décale à droite pour mieux cadrer "1:09:38": [["crop", "542x361+178+60"]], "1:09:42": [g_mcq], # On croppe comme pour Harper mais on décale à droite pour mieux cadrer "1:09:51": [["crop", "542x361+178+60"]], "1:09:57": [g_madmax], "1:09:58": [g_madmax], "1:09:59": [g_madmax], "1:10:00": [g_madmax], "1:10:01": [g_madmax], "1:10:02": [g_madmax], "1:10:03": [g_madmax], "1:10:04": [g_madmax], "1:10:05": [g_hooper], "1:10:06": [g_madmax], "1:10:07": [g_madmax], "1:10:09": [g_madmax], "1:10:10": [g_bullitt], # Les 22 dernières images sont un fondu au noir. Le blur est déjà # dans la séquence originale "1:10:11": [g_bullitt, ["toblack", 119, 141]], # Pour faire le générique : exporter le SVG en bitmap 1080x12623 depuis # Inkscape, puis découper des morceaux de 1024x576 dedans, pour ensuite # les retailler en 720x576. Il y a 1722 images qu'on fait scroller de 7 # pixels par frame (oui ça tombe juste : 576 + (1722 - 1) * 7 = 12623). # À l'origine on ne scrollait que de 6 pixels, et la hauteur était 10902. # On blurre légèrement et on rajoute un masque supplémentaire pour # assombrir les bords. "1:10:21-1:10:24-1:10:28-1:10:32-1:10:36-1:10:39-1:10:43-1:10:47-1:10:51-1:10:54-1:10:58-1:11:02-1:11:06-1:11:09-1:11:13-1:11:17-1:11:21-1:11:24": [["pan", "credits.png", 1024, 576, 28, 0, 0, 7], ["pipi", "--blur", "0.5x1"], ["logo", "../credits_mask.png", 0, 1722]], # La fin du générique est un still sur la dernière frame avec fondu vers # le noir un peu plus tard "1:11:27": [["pan", "credits.png", 1024, 576, 28, 12623 - 576, 0, 0], ["toblack", 74, 97]], } ############################################################################### # main: # # C’est la fonction principale. On fait la liste de tous les sous-répertoires # de séquences, et pour chacun on appelle la bonne fonction de génération. # ndone, ntodo = 0, 0 for d in baselist(DUMP, '*:*:*'): print "* %s" % (d,) try: os.makedirs(mkpath(FINAL, d)) except: pass if SEQUENCES.has_key(d): d, t = generate(d, SEQUENCES[d]) ndone += d ntodo += t print " + %i images (%i restored)" % (t, d) else: print " + Unknown directory %s" % (d,) print "Done. %i images (%i restored)." % (ntodo, ndone)