Alyssa Smith revised this gist . Go to revision
1 file changed, 250 insertions
timestamps.sh(file created)
| @@ -0,0 +1,250 @@ | |||
| 1 | + | ffmpeg -i bandersnatch.mkv -ss 5 -t 153.52 1A.mkv 2>/dev/null | |
| 2 | + | ffmpeg -ss 00:02:28.560 -i bandersnatch.mkv -ss 5 -t 53.72 1E.mkv 2>/dev/null | |
| 3 | + | ffmpeg -ss 00:03:22.280 -i bandersnatch.mkv -ss 5 -t 274.12 1H.mkv 2>/dev/null | |
| 4 | + | ffmpeg -ss 00:07:56.400 -i bandersnatch.mkv -ss 5 -t 89.96 8A.mkv 2>/dev/null | |
| 5 | + | ffmpeg -ss 00:09:26.360 -i bandersnatch.mkv -ss 5 -t 139.92 1HA.mkv 2>/dev/null | |
| 6 | + | ffmpeg -ss 00:11:46.280 -i bandersnatch.mkv -ss 5 -t 317.36 1Qtt.mkv 2>/dev/null | |
| 7 | + | ffmpeg -ss 00:17:03.640 -i bandersnatch.mkv -ss 5 -t 196.6 2B.mkv 2>/dev/null | |
| 8 | + | ffmpeg -ss 00:20:20.240 -i bandersnatch.mkv -ss 5 -t 189.84 1R.mkv 2>/dev/null | |
| 9 | + | ffmpeg -ss 00:23:30.080 -i bandersnatch.mkv -ss 5 -t 10.28 3B.mkv 2>/dev/null | |
| 10 | + | ffmpeg -ss 00:23:40.360 -i bandersnatch.mkv -ss 5 -t 31.64 SS13.mkv 2>/dev/null | |
| 11 | + | ffmpeg -ss 00:24:12.000 -i bandersnatch.mkv -ss 5 -t 30.0 3Ax.mkv 2>/dev/null | |
| 12 | + | ffmpeg -ss 00:24:42.000 -i bandersnatch.mkv -ss 5 -t 22.12 3C.mkv 2>/dev/null | |
| 13 | + | ffmpeg -ss 00:25:04.120 -i bandersnatch.mkv -ss 5 -t 68.04 3J.mkv 2>/dev/null | |
| 14 | + | ffmpeg -ss 00:26:12.160 -i bandersnatch.mkv -ss 5 -t 68.68 3R.mkv 2>/dev/null | |
| 15 | + | ffmpeg -ss 00:27:20.840 -i bandersnatch.mkv -ss 5 -t 52.36 3U.mkv 2>/dev/null | |
| 16 | + | ffmpeg -ss 00:28:13.200 -i bandersnatch.mkv -ss 5 -t 40.72 3X.mkv 2>/dev/null | |
| 17 | + | ffmpeg -ss 00:28:53.920 -i bandersnatch.mkv -ss 5 -t 64.12 8B.mkv 2>/dev/null | |
| 18 | + | ffmpeg -ss 00:29:58.040 -i bandersnatch.mkv -ss 5 -t 31.64 SS15.mkv 2>/dev/null | |
| 19 | + | ffmpeg -ss 00:30:29.680 -i bandersnatch.mkv -ss 5 -t 30.0 3Xxa.mkv 2>/dev/null | |
| 20 | + | ffmpeg -ss 00:30:59.680 -i bandersnatch.mkv -ss 5 -t 244.96 3Vfs.mkv 2>/dev/null | |
| 21 | + | ffmpeg -ss 00:35:04.640 -i bandersnatch.mkv -ss 5 -t 19.52 3Y.mkv 2>/dev/null | |
| 22 | + | ffmpeg -ss 00:35:24.160 -i bandersnatch.mkv -ss 5 -t 31.64 SS17.mkv 2>/dev/null | |
| 23 | + | ffmpeg -ss 00:35:55.800 -i bandersnatch.mkv -ss 5 -t 32.96 3Vx.mkv 2>/dev/null | |
| 24 | + | ffmpeg -ss 00:36:28.760 -i bandersnatch.mkv -ss 5 -t 54.24 3Z.mkv 2>/dev/null | |
| 25 | + | ffmpeg -ss 00:37:23.000 -i bandersnatch.mkv -ss 5 -t 153.44 3AH.mkv 2>/dev/null | |
| 26 | + | ffmpeg -ss 00:39:56.440 -i bandersnatch.mkv -ss 5 -t 43.2 4C2.mkv 2>/dev/null | |
| 27 | + | ffmpeg -ss 00:40:39.640 -i bandersnatch.mkv -ss 5 -t 30.2 7A.mkv 2>/dev/null | |
| 28 | + | ffmpeg -ss 00:41:09.840 -i bandersnatch.mkv -ss 5 -t 24.64 7B.mkv 2>/dev/null | |
| 29 | + | ffmpeg -ss 00:41:34.480 -i bandersnatch.mkv -ss 5 -t 14.08 7C.mkv 2>/dev/null | |
| 30 | + | ffmpeg -ss 00:41:48.560 -i bandersnatch.mkv -ss 5 -t 145.76 7D.mkv 2>/dev/null | |
| 31 | + | ffmpeg -ss 00:44:14.320 -i bandersnatch.mkv -ss 5 -t 59.76 7L.mkv 2>/dev/null | |
| 32 | + | ffmpeg -ss 00:45:14.080 -i bandersnatch.mkv -ss 5 -t 31.6 SS51.mkv 2>/dev/null | |
| 33 | + | ffmpeg -ss 00:45:45.680 -i bandersnatch.mkv -ss 5 -t 26.16 R4.mkv 2>/dev/null | |
| 34 | + | ffmpeg -ss 00:46:11.840 -i bandersnatch.mkv -ss 5 -t 207.04 3M.mkv 2>/dev/null | |
| 35 | + | ffmpeg -ss 00:49:38.880 -i bandersnatch.mkv -ss 5 -t 269.68 3N.mkv 2>/dev/null | |
| 36 | + | ffmpeg -ss 00:54:08.560 -i bandersnatch.mkv -ss 5 -t 74.28 8L.mkv 2>/dev/null | |
| 37 | + | ffmpeg -ss 00:55:22.840 -i bandersnatch.mkv -ss 5 -t 31.64 SS20.mkv 2>/dev/null | |
| 38 | + | ffmpeg -ss 00:55:54.480 -i bandersnatch.mkv -ss 5 -t 31.24 3Nx.mkv 2>/dev/null | |
| 39 | + | ffmpeg -ss 00:56:25.720 -i bandersnatch.mkv -ss 5 -t 58.52 3Q.mkv 2>/dev/null | |
| 40 | + | ffmpeg -ss 00:57:24.240 -i bandersnatch.mkv -ss 5 -t 19.16 3S.mkv 2>/dev/null | |
| 41 | + | ffmpeg -ss 00:57:43.400 -i bandersnatch.mkv -ss 5 -t 83.0 ZHw6.mkv 2>/dev/null | |
| 42 | + | ffmpeg -ss 00:59:06.400 -i bandersnatch.mkv -ss 5 -t 81.52 3AC2.mkv 2>/dev/null | |
| 43 | + | ffmpeg -ss 01:00:27.920 -i bandersnatch.mkv -ss 5 -t 51.84 5A.mkv 2>/dev/null | |
| 44 | + | ffmpeg -ss 01:01:19.760 -i bandersnatch.mkv -ss 5 -t 17.36 5H.mkv 2>/dev/null | |
| 45 | + | ffmpeg -ss 01:01:37.120 -i bandersnatch.mkv -ss 5 -t 45.56 5V.mkv 2>/dev/null | |
| 46 | + | ffmpeg -ss 01:02:22.680 -i bandersnatch.mkv -ss 5 -t 47.76 5QA.mkv 2>/dev/null | |
| 47 | + | ffmpeg -ss 01:03:10.440 -i bandersnatch.mkv -ss 5 -t 35.88 5UA.mkv 2>/dev/null | |
| 48 | + | ffmpeg -ss 01:03:46.320 -i bandersnatch.mkv -ss 5 -t 72.64 5AD.mkv 2>/dev/null | |
| 49 | + | ffmpeg -ss 01:04:58.960 -i bandersnatch.mkv -ss 5 -t 78.52 5AF.mkv 2>/dev/null | |
| 50 | + | ffmpeg -ss 01:06:17.480 -i bandersnatch.mkv -ss 5 -t 102.4 8Q.mkv 2>/dev/null | |
| 51 | + | ffmpeg -ss 01:07:59.880 -i bandersnatch.mkv -ss 5 -t 31.6 SS52.mkv 2>/dev/null | |
| 52 | + | ffmpeg -ss 01:08:31.480 -i bandersnatch.mkv -ss 5 -t 38.92 Z7c.mkv 2>/dev/null | |
| 53 | + | ffmpeg -ss 01:09:10.400 -i bandersnatch.mkv -ss 5 -t 26.72 5VA.mkv 2>/dev/null | |
| 54 | + | ffmpeg -ss 01:09:37.120 -i bandersnatch.mkv -ss 5 -t 157.8 5Mp.mkv 2>/dev/null | |
| 55 | + | ffmpeg -ss 01:12:14.920 -i bandersnatch.mkv -ss 5 -t 125.84 8K.mkv 2>/dev/null | |
| 56 | + | ffmpeg -ss 01:14:20.760 -i bandersnatch.mkv -ss 5 -t 60.24 S37A.mkv 2>/dev/null | |
| 57 | + | ffmpeg -ss 01:15:21.000 -i bandersnatch.mkv -ss 5 -t 33.68 R2.mkv 2>/dev/null | |
| 58 | + | ffmpeg -ss 01:15:54.680 -i bandersnatch.mkv -ss 5 -t 118.48 3AD3.mkv 2>/dev/null | |
| 59 | + | ffmpeg -ss 01:17:53.160 -i bandersnatch.mkv -ss 5 -t 113.0 8J.mkv 2>/dev/null | |
| 60 | + | ffmpeg -ss 01:19:46.160 -i bandersnatch.mkv -ss 5 -t 78.4 8JA.mkv 2>/dev/null | |
| 61 | + | ffmpeg -ss 01:21:04.560 -i bandersnatch.mkv -ss 5 -t 31.6 SS57.mkv 2>/dev/null | |
| 62 | + | ffmpeg -ss 01:21:36.160 -i bandersnatch.mkv -ss 5 -t 48.36 R6.mkv 2>/dev/null | |
| 63 | + | ffmpeg -ss 01:22:24.520 -i bandersnatch.mkv -ss 5 -t 229.88 3AF1.mkv 2>/dev/null | |
| 64 | + | ffmpeg -ss 01:26:14.400 -i bandersnatch.mkv -ss 5 -t 129.84 6A.mkv 2>/dev/null | |
| 65 | + | ffmpeg -ss 01:28:24.240 -i bandersnatch.mkv -ss 5 -t 87.96 6C.mkv 2>/dev/null | |
| 66 | + | ffmpeg -ss 01:29:52.200 -i bandersnatch.mkv -ss 5 -t 45.32 8D.mkv 2>/dev/null | |
| 67 | + | ffmpeg -ss 01:30:37.520 -i bandersnatch.mkv -ss 5 -t 54.4 1D.mkv 2>/dev/null | |
| 68 | + | ffmpeg -ss 01:31:31.920 -i bandersnatch.mkv -ss 5 -t 276.12 1G.mkv 2>/dev/null | |
| 69 | + | ffmpeg -ss 01:36:08.040 -i bandersnatch.mkv -ss 5 -t 140.6 1GA.mkv 2>/dev/null | |
| 70 | + | ffmpeg -ss 01:38:28.640 -i bandersnatch.mkv -ss 5 -t 317.36 1Qnw.mkv 2>/dev/null | |
| 71 | + | ffmpeg -ss 01:43:46.000 -i bandersnatch.mkv -ss 5 -t 40.72 3Xcd.mkv 2>/dev/null | |
| 72 | + | ffmpeg -ss 01:44:26.720 -i bandersnatch.mkv -ss 5 -t 272.72 3Wff.mkv 2>/dev/null | |
| 73 | + | ffmpeg -ss 01:48:59.440 -i bandersnatch.mkv -ss 5 -t 154.68 3AB.mkv 2>/dev/null | |
| 74 | + | ffmpeg -ss 01:51:34.120 -i bandersnatch.mkv -ss 5 -t 32.92 7H.mkv 2>/dev/null | |
| 75 | + | ffmpeg -ss 01:52:07.040 -i bandersnatch.mkv -ss 5 -t 15.4 7K.mkv 2>/dev/null | |
| 76 | + | ffmpeg -ss 01:52:22.440 -i bandersnatch.mkv -ss 5 -t 31.6 SS56.mkv 2>/dev/null | |
| 77 | + | ffmpeg -ss 01:52:54.040 -i bandersnatch.mkv -ss 5 -t 20.68 8Aa.mkv 2>/dev/null | |
| 78 | + | ffmpeg -ss 01:53:14.720 -i bandersnatch.mkv -ss 5 -t 31.6 SS10.mkv 2>/dev/null | |
| 79 | + | ffmpeg -ss 01:53:46.320 -i bandersnatch.mkv -ss 5 -t 38.12 1PA.mkv 2>/dev/null | |
| 80 | + | ffmpeg -ss 01:54:24.440 -i bandersnatch.mkv -ss 5 -t 37.4 1QA.mkv 2>/dev/null | |
| 81 | + | ffmpeg -ss 01:55:01.840 -i bandersnatch.mkv -ss 5 -t 116.6 1GB.mkv 2>/dev/null | |
| 82 | + | ffmpeg -ss 01:56:58.440 -i bandersnatch.mkv -ss 5 -t 22.52 1QB.mkv 2>/dev/null | |
| 83 | + | ffmpeg -ss 01:57:20.960 -i bandersnatch.mkv -ss 5 -t 26.56 3L.mkv 2>/dev/null | |
| 84 | + | ffmpeg -ss 01:57:47.520 -i bandersnatch.mkv -ss 5 -t 31.76 ZP.mkv 2>/dev/null | |
| 85 | + | ffmpeg -ss 01:58:19.280 -i bandersnatch.mkv -ss 5 -t 34.24 ZJ.mkv 2>/dev/null | |
| 86 | + | ffmpeg -ss 01:58:53.520 -i bandersnatch.mkv -ss 5 -t 118.48 3AD.mkv 2>/dev/null | |
| 87 | + | ffmpeg -ss 02:00:52.000 -i bandersnatch.mkv -ss 5 -t 53.92 3AK.mkv 2>/dev/null | |
| 88 | + | ffmpeg -ss 02:01:45.920 -i bandersnatch.mkv -ss 5 -t 43.2 4C1.mkv 2>/dev/null | |
| 89 | + | ffmpeg -ss 02:02:29.120 -i bandersnatch.mkv -ss 5 -t 16.12 ZMC.mkv 2>/dev/null | |
| 90 | + | ffmpeg -ss 02:02:45.240 -i bandersnatch.mkv -ss 5 -t 62.52 6B.mkv 2>/dev/null | |
| 91 | + | ffmpeg -ss 02:03:47.760 -i bandersnatch.mkv -ss 5 -t 72.68 6D.mkv 2>/dev/null | |
| 92 | + | ffmpeg -ss 02:05:00.440 -i bandersnatch.mkv -ss 5 -t 45.32 8Da.mkv 2>/dev/null | |
| 93 | + | ffmpeg -ss 02:05:45.760 -i bandersnatch.mkv -ss 5 -t 174.36 2Bt1.mkv 2>/dev/null | |
| 94 | + | ffmpeg -ss 02:08:40.120 -i bandersnatch.mkv -ss 5 -t 169.84 2Bp2.mkv 2>/dev/null | |
| 95 | + | ffmpeg -ss 02:11:29.960 -i bandersnatch.mkv -ss 5 -t 31.08 2GA.mkv 2>/dev/null | |
| 96 | + | ffmpeg -ss 02:12:01.040 -i bandersnatch.mkv -ss 5 -t 174.36 2Bp1.mkv 2>/dev/null | |
| 97 | + | ffmpeg -ss 02:14:55.400 -i bandersnatch.mkv -ss 5 -t 169.84 2Bt2.mkv 2>/dev/null | |
| 98 | + | ffmpeg -ss 02:17:45.240 -i bandersnatch.mkv -ss 5 -t 9.96 3LA.mkv 2>/dev/null | |
| 99 | + | ffmpeg -ss 02:17:55.200 -i bandersnatch.mkv -ss 5 -t 244.96 3Vff.mkv 2>/dev/null | |
| 100 | + | ffmpeg -ss 02:22:00.160 -i bandersnatch.mkv -ss 5 -t 242.28 3Vbf.mkv 2>/dev/null | |
| 101 | + | ffmpeg -ss 02:26:02.440 -i bandersnatch.mkv -ss 5 -t 242.28 3Vbs.mkv 2>/dev/null | |
| 102 | + | ffmpeg -ss 02:30:04.720 -i bandersnatch.mkv -ss 5 -t 269.52 3Wbf.mkv 2>/dev/null | |
| 103 | + | ffmpeg -ss 02:34:34.240 -i bandersnatch.mkv -ss 5 -t 269.52 3Wbs.mkv 2>/dev/null | |
| 104 | + | ffmpeg -ss 02:39:03.760 -i bandersnatch.mkv -ss 5 -t 272.72 3Wfs.mkv 2>/dev/null | |
| 105 | + | ffmpeg -ss 02:43:36.480 -i bandersnatch.mkv -ss 5 -t 87.04 3AC.mkv 2>/dev/null | |
| 106 | + | ffmpeg -ss 02:45:03.520 -i bandersnatch.mkv -ss 5 -t 36.12 ZK1.mkv 2>/dev/null | |
| 107 | + | ffmpeg -ss 02:45:39.640 -i bandersnatch.mkv -ss 5 -t 55.24 3AL.mkv 2>/dev/null | |
| 108 | + | ffmpeg -ss 02:46:34.880 -i bandersnatch.mkv -ss 5 -t 36.12 ZK2.mkv 2>/dev/null | |
| 109 | + | ffmpeg -ss 02:47:11.000 -i bandersnatch.mkv -ss 5 -t 118.48 3AD1.mkv 2>/dev/null | |
| 110 | + | ffmpeg -ss 02:49:09.480 -i bandersnatch.mkv -ss 5 -t 81.52 3AC1.mkv 2>/dev/null | |
| 111 | + | ffmpeg -ss 02:50:31.000 -i bandersnatch.mkv -ss 5 -t 149.16 3AB1.mkv 2>/dev/null | |
| 112 | + | ffmpeg -ss 02:53:00.160 -i bandersnatch.mkv -ss 5 -t 149.16 3AB2.mkv 2>/dev/null | |
| 113 | + | ffmpeg -ss 02:55:29.320 -i bandersnatch.mkv -ss 5 -t 101.8 3AJ1.mkv 2>/dev/null | |
| 114 | + | ffmpeg -ss 02:57:11.120 -i bandersnatch.mkv -ss 5 -t 101.8 3AJ2.mkv 2>/dev/null | |
| 115 | + | ffmpeg -ss 02:58:52.920 -i bandersnatch.mkv -ss 5 -t 147.92 3AH2.mkv 2>/dev/null | |
| 116 | + | ffmpeg -ss 03:01:20.840 -i bandersnatch.mkv -ss 5 -t 22.32 ZMB.mkv 2>/dev/null | |
| 117 | + | ffmpeg -ss 03:01:43.160 -i bandersnatch.mkv -ss 5 -t 78.92 3VB.mkv 2>/dev/null | |
| 118 | + | ffmpeg -ss 03:03:02.080 -i bandersnatch.mkv -ss 5 -t 107.32 3AJ.mkv 2>/dev/null | |
| 119 | + | ffmpeg -ss 03:04:49.400 -i bandersnatch.mkv -ss 5 -t 42.2 4D1.mkv 2>/dev/null | |
| 120 | + | ffmpeg -ss 03:05:31.600 -i bandersnatch.mkv -ss 5 -t 147.92 3AH1.mkv 2>/dev/null | |
| 121 | + | ffmpeg -ss 03:07:59.520 -i bandersnatch.mkv -ss 5 -t 36.12 ZK.mkv 2>/dev/null | |
| 122 | + | ffmpeg -ss 03:08:35.640 -i bandersnatch.mkv -ss 5 -t 48.4 3AK2.mkv 2>/dev/null | |
| 123 | + | ffmpeg -ss 03:09:24.040 -i bandersnatch.mkv -ss 5 -t 65.16 ZH.mkv 2>/dev/null | |
| 124 | + | ffmpeg -ss 03:10:29.200 -i bandersnatch.mkv -ss 5 -t 48.76 2Gp1.mkv 2>/dev/null | |
| 125 | + | ffmpeg -ss 03:11:17.960 -i bandersnatch.mkv -ss 5 -t 48.76 2Gt1.mkv 2>/dev/null | |
| 126 | + | ffmpeg -ss 03:12:06.720 -i bandersnatch.mkv -ss 5 -t 44.24 2Gp2.mkv 2>/dev/null | |
| 127 | + | ffmpeg -ss 03:12:50.960 -i bandersnatch.mkv -ss 5 -t 44.24 2Gt2.mkv 2>/dev/null | |
| 128 | + | ffmpeg -ss 03:13:35.200 -i bandersnatch.mkv -ss 5 -t 71.44 2G.mkv 2>/dev/null | |
| 129 | + | ffmpeg -ss 03:14:46.640 -i bandersnatch.mkv -ss 5 -t 188.28 1S.mkv 2>/dev/null | |
| 130 | + | ffmpeg -ss 03:17:54.920 -i bandersnatch.mkv -ss 5 -t 49.72 3AL1.mkv 2>/dev/null | |
| 131 | + | ffmpeg -ss 03:18:44.640 -i bandersnatch.mkv -ss 5 -t 48.4 3AK1.mkv 2>/dev/null | |
| 132 | + | ffmpeg -ss 03:19:33.040 -i bandersnatch.mkv -ss 5 -t 229.88 3AF2.mkv 2>/dev/null | |
| 133 | + | ffmpeg -ss 03:23:22.920 -i bandersnatch.mkv -ss 5 -t 49.72 3AL2.mkv 2>/dev/null | |
| 134 | + | ffmpeg -ss 03:24:12.640 -i bandersnatch.mkv -ss 5 -t 42.2 4D2.mkv 2>/dev/null | |
| 135 | + | ffmpeg -ss 03:24:54.840 -i bandersnatch.mkv -ss 5 -t 235.4 3AF.mkv 2>/dev/null | |
| 136 | + | ffmpeg -ss 03:28:50.240 -i bandersnatch.mkv -ss 5 -t 34.64 3Xac.mkv 2>/dev/null | |
| 137 | + | ffmpeg -ss 03:29:24.880 -i bandersnatch.mkv -ss 5 -t 68.68 3VA.mkv 2>/dev/null | |
| 138 | + | ffmpeg -ss 03:30:33.560 -i bandersnatch.mkv -ss 5 -t 30.52 3Xa.mkv 2>/dev/null | |
| 139 | + | ffmpeg -ss 03:31:04.080 -i bandersnatch.mkv -ss 5 -t 54.2 ZQ.mkv 2>/dev/null | |
| 140 | + | ffmpeg -ss 03:31:58.280 -i bandersnatch.mkv -ss 5 -t 118.48 3AD2.mkv 2>/dev/null | |
| 141 | + | ffmpeg -ss 03:33:56.760 -i bandersnatch.mkv -ss 5 -t 56.56 ZG.mkv 2>/dev/null | |
| 142 | + | ffmpeg -ss 03:34:53.320 -i bandersnatch.mkv -ss 5 -t 115.92 1HB.mkv 2>/dev/null | |
| 143 | + | ffmpeg -ss 03:36:49.240 -i bandersnatch.mkv -ss 5 -t 31.96 8JB1.mkv 2>/dev/null | |
| 144 | + | ffmpeg -ss 03:37:21.200 -i bandersnatch.mkv -ss 5 -t 31.96 8JB2.mkv 2>/dev/null | |
| 145 | + | ffmpeg -ss 03:37:53.160 -i bandersnatch.mkv -ss 5 -t 147.24 5Mpc.mkv 2>/dev/null | |
| 146 | + | ffmpeg -ss 03:40:20.400 -i bandersnatch.mkv -ss 5 -t 147.24 5Mtc.mkv 2>/dev/null | |
| 147 | + | ffmpeg -ss 03:42:47.640 -i bandersnatch.mkv -ss 5 -t 157.16 5Mt.mkv 2>/dev/null | |
| 148 | + | ffmpeg -ss 03:45:24.800 -i bandersnatch.mkv -ss 5 -t 49.96 5Q.mkv 2>/dev/null | |
| 149 | + | ffmpeg -ss 03:46:14.760 -i bandersnatch.mkv -ss 5 -t 29.6 5U.mkv 2>/dev/null | |
| 150 | + | ffmpeg -ss 03:46:44.360 -i bandersnatch.mkv -ss 5 -t 38.0 5R.mkv 2>/dev/null | |
| 151 | + | ffmpeg -ss 03:47:22.360 -i bandersnatch.mkv -ss 5 -t 44.28 5RA.mkv 2>/dev/null | |
| 152 | + | ffmpeg -ss 03:48:06.640 -i bandersnatch.mkv -ss 5 -t 27.68 5S.mkv 2>/dev/null | |
| 153 | + | ffmpeg -ss 03:48:34.320 -i bandersnatch.mkv -ss 5 -t 41.08 5SA.mkv 2>/dev/null | |
| 154 | + | ffmpeg -ss 03:49:15.400 -i bandersnatch.mkv -ss 5 -t 41.16 5TA.mkv 2>/dev/null | |
| 155 | + | ffmpeg -ss 03:49:56.560 -i bandersnatch.mkv -ss 5 -t 79.16 5AG2.mkv 2>/dev/null | |
| 156 | + | ffmpeg -ss 03:51:15.720 -i bandersnatch.mkv -ss 5 -t 47.8 5AH.mkv 2>/dev/null | |
| 157 | + | ffmpeg -ss 03:52:03.520 -i bandersnatch.mkv -ss 5 -t 102.36 8M.mkv 2>/dev/null | |
| 158 | + | ffmpeg -ss 03:53:45.880 -i bandersnatch.mkv -ss 5 -t 92.4 5AC.mkv 2>/dev/null | |
| 159 | + | ffmpeg -ss 03:55:18.280 -i bandersnatch.mkv -ss 5 -t 94.08 8V.mkv 2>/dev/null | |
| 160 | + | ffmpeg -ss 03:56:52.360 -i bandersnatch.mkv -ss 5 -t 50.44 5AC2.mkv 2>/dev/null | |
| 161 | + | ffmpeg -ss 03:57:42.800 -i bandersnatch.mkv -ss 5 -t 94.08 8Va.mkv 2>/dev/null | |
| 162 | + | ffmpeg -ss 03:59:16.880 -i bandersnatch.mkv -ss 5 -t 48.96 R2cd.mkv 2>/dev/null | |
| 163 | + | ffmpeg -ss 04:00:05.840 -i bandersnatch.mkv -ss 5 -t 36.12 ZK3.mkv 2>/dev/null | |
| 164 | + | ffmpeg -ss 04:00:41.960 -i bandersnatch.mkv -ss 5 -t 42.64 5AD2.mkv 2>/dev/null | |
| 165 | + | ffmpeg -ss 04:01:24.600 -i bandersnatch.mkv -ss 5 -t 104.4 5AE.mkv 2>/dev/null | |
| 166 | + | ffmpeg -ss 04:03:09.000 -i bandersnatch.mkv -ss 5 -t 102.4 8Qa.mkv 2>/dev/null | |
| 167 | + | ffmpeg -ss 04:04:51.400 -i bandersnatch.mkv -ss 5 -t 109.16 5AG.mkv 2>/dev/null | |
| 168 | + | ffmpeg -ss 04:06:40.560 -i bandersnatch.mkv -ss 5 -t 56.48 5AJ.mkv 2>/dev/null | |
| 169 | + | ffmpeg -ss 04:07:37.040 -i bandersnatch.mkv -ss 5 -t 85.8 8S.mkv 2>/dev/null | |
| 170 | + | ffmpeg -ss 04:09:02.840 -i bandersnatch.mkv -ss 5 -t 85.8 8Sa.mkv 2>/dev/null | |
| 171 | + | ffmpeg -ss 04:10:28.640 -i bandersnatch.mkv -ss 5 -t 274.4 3P.mkv 2>/dev/null | |
| 172 | + | ffmpeg -ss 04:15:03.040 -i bandersnatch.mkv -ss 5 -t 102.36 8Ma.mkv 2>/dev/null | |
| 173 | + | ffmpeg -ss 04:16:45.400 -i bandersnatch.mkv -ss 5 -t 16.72 7J.mkv 2>/dev/null | |
| 174 | + | ffmpeg -ss 04:17:02.120 -i bandersnatch.mkv -ss 5 -t 52.96 3T.mkv 2>/dev/null | |
| 175 | + | ffmpeg -ss 04:17:55.080 -i bandersnatch.mkv -ss 5 -t 17.32 5G.mkv 2>/dev/null | |
| 176 | + | ffmpeg -ss 04:18:12.400 -i bandersnatch.mkv -ss 5 -t 40.76 5T.mkv 2>/dev/null | |
| 177 | + | ffmpeg -ss 04:18:53.160 -i bandersnatch.mkv -ss 5 -t 46.36 ZB.mkv 2>/dev/null | |
| 178 | + | ffmpeg -ss 04:19:39.520 -i bandersnatch.mkv -ss 5 -t 48.36 Z1.mkv 2>/dev/null | |
| 179 | + | ffmpeg -ss 04:20:27.880 -i bandersnatch.mkv -ss 5 -t 25.84 Z2.mkv 2>/dev/null | |
| 180 | + | ffmpeg -ss 04:20:53.720 -i bandersnatch.mkv -ss 5 -t 26.32 Z3.mkv 2>/dev/null | |
| 181 | + | ffmpeg -ss 04:21:20.040 -i bandersnatch.mkv -ss 5 -t 30.12 Z3cd.mkv 2>/dev/null | |
| 182 | + | ffmpeg -ss 04:21:50.160 -i bandersnatch.mkv -ss 5 -t 37.64 Z4.mkv 2>/dev/null | |
| 183 | + | ffmpeg -ss 04:22:27.800 -i bandersnatch.mkv -ss 5 -t 47.04 Z4cd.mkv 2>/dev/null | |
| 184 | + | ffmpeg -ss 04:23:14.840 -i bandersnatch.mkv -ss 5 -t 59.12 ZD.mkv 2>/dev/null | |
| 185 | + | ffmpeg -ss 04:24:13.960 -i bandersnatch.mkv -ss 5 -t 61.12 ZE.mkv 2>/dev/null | |
| 186 | + | ffmpeg -ss 04:25:15.080 -i bandersnatch.mkv -ss 5 -t 31.64 SS1.mkv 2>/dev/null | |
| 187 | + | ffmpeg -ss 04:25:46.720 -i bandersnatch.mkv -ss 5 -t 31.6 SS2.mkv 2>/dev/null | |
| 188 | + | ffmpeg -ss 04:26:18.320 -i bandersnatch.mkv -ss 5 -t 32.88 R1.mkv 2>/dev/null | |
| 189 | + | ffmpeg -ss 04:26:51.200 -i bandersnatch.mkv -ss 5 -t 31.6 SS3.mkv 2>/dev/null | |
| 190 | + | ffmpeg -ss 04:27:22.800 -i bandersnatch.mkv -ss 5 -t 31.6 SS4.mkv 2>/dev/null | |
| 191 | + | ffmpeg -ss 04:27:54.400 -i bandersnatch.mkv -ss 5 -t 31.6 SS5.mkv 2>/dev/null | |
| 192 | + | ffmpeg -ss 04:28:26.000 -i bandersnatch.mkv -ss 5 -t 31.6 SS6.mkv 2>/dev/null | |
| 193 | + | ffmpeg -ss 04:28:57.600 -i bandersnatch.mkv -ss 5 -t 30.16 R3.mkv 2>/dev/null | |
| 194 | + | ffmpeg -ss 04:29:27.760 -i bandersnatch.mkv -ss 5 -t 31.6 SS7.mkv 2>/dev/null | |
| 195 | + | ffmpeg -ss 04:29:59.360 -i bandersnatch.mkv -ss 5 -t 31.6 SS8.mkv 2>/dev/null | |
| 196 | + | ffmpeg -ss 04:30:30.960 -i bandersnatch.mkv -ss 5 -t 31.6 SS9.mkv 2>/dev/null | |
| 197 | + | ffmpeg -ss 04:31:02.560 -i bandersnatch.mkv -ss 5 -t 31.64 SS11.mkv 2>/dev/null | |
| 198 | + | ffmpeg -ss 04:31:34.200 -i bandersnatch.mkv -ss 5 -t 31.68 SS12.mkv 2>/dev/null | |
| 199 | + | ffmpeg -ss 04:32:05.880 -i bandersnatch.mkv -ss 5 -t 31.64 SS14.mkv 2>/dev/null | |
| 200 | + | ffmpeg -ss 04:32:37.520 -i bandersnatch.mkv -ss 5 -t 30.84 3Xxc.mkv 2>/dev/null | |
| 201 | + | ffmpeg -ss 04:33:08.360 -i bandersnatch.mkv -ss 5 -t 31.64 SS16.mkv 2>/dev/null | |
| 202 | + | ffmpeg -ss 04:33:40.000 -i bandersnatch.mkv -ss 5 -t 31.64 SS18.mkv 2>/dev/null | |
| 203 | + | ffmpeg -ss 04:34:11.640 -i bandersnatch.mkv -ss 5 -t 31.64 SS19.mkv 2>/dev/null | |
| 204 | + | ffmpeg -ss 04:34:43.280 -i bandersnatch.mkv -ss 5 -t 34.56 R5.mkv 2>/dev/null | |
| 205 | + | ffmpeg -ss 04:35:17.840 -i bandersnatch.mkv -ss 5 -t 31.6 SS21.mkv 2>/dev/null | |
| 206 | + | ffmpeg -ss 04:35:49.440 -i bandersnatch.mkv -ss 5 -t 31.6 SS22.mkv 2>/dev/null | |
| 207 | + | ffmpeg -ss 04:36:21.040 -i bandersnatch.mkv -ss 5 -t 31.6 SS50.mkv 2>/dev/null | |
| 208 | + | ffmpeg -ss 04:36:52.640 -i bandersnatch.mkv -ss 5 -t 41.6 R3cd.mkv 2>/dev/null | |
| 209 | + | ffmpeg -ss 04:37:34.240 -i bandersnatch.mkv -ss 5 -t 38.2 R4cd.mkv 2>/dev/null | |
| 210 | + | ffmpeg -ss 04:38:12.440 -i bandersnatch.mkv -ss 5 -t 31.6 SS53.mkv 2>/dev/null | |
| 211 | + | ffmpeg -ss 04:38:44.040 -i bandersnatch.mkv -ss 5 -t 31.6 SS54.mkv 2>/dev/null | |
| 212 | + | ffmpeg -ss 04:39:15.640 -i bandersnatch.mkv -ss 5 -t 31.6 SS55.mkv 2>/dev/null | |
| 213 | + | ffmpeg -ss 04:39:47.240 -i bandersnatch.mkv -ss 5 -t 47.0 R1cd.mkv 2>/dev/null | |
| 214 | + | ffmpeg -ss 04:40:34.240 -i bandersnatch.mkv -ss 5 -t 60.56 S44B.mkv 2>/dev/null | |
| 215 | + | ffmpeg -ss 04:41:34.800 -i bandersnatch.mkv -ss 5 -t 60.6 S34B.mkv 2>/dev/null | |
| 216 | + | ffmpeg -ss 04:42:35.400 -i bandersnatch.mkv -ss 5 -t 60.56 S35B.mkv 2>/dev/null | |
| 217 | + | ffmpeg -ss 04:43:35.960 -i bandersnatch.mkv -ss 5 -t 60.56 S59B.mkv 2>/dev/null | |
| 218 | + | ffmpeg -ss 04:44:36.520 -i bandersnatch.mkv -ss 5 -t 60.56 S36B.mkv 2>/dev/null | |
| 219 | + | ffmpeg -ss 04:45:37.080 -i bandersnatch.mkv -ss 5 -t 60.56 S37B.mkv 2>/dev/null | |
| 220 | + | ffmpeg -ss 04:46:37.640 -i bandersnatch.mkv -ss 5 -t 60.56 S38B.mkv 2>/dev/null | |
| 221 | + | ffmpeg -ss 04:47:38.200 -i bandersnatch.mkv -ss 5 -t 60.24 S38A.mkv 2>/dev/null | |
| 222 | + | ffmpeg -ss 04:48:38.440 -i bandersnatch.mkv -ss 5 -t 60.24 S44A.mkv 2>/dev/null | |
| 223 | + | ffmpeg -ss 04:49:38.680 -i bandersnatch.mkv -ss 5 -t 60.24 S34A.mkv 2>/dev/null | |
| 224 | + | ffmpeg -ss 04:50:38.920 -i bandersnatch.mkv -ss 5 -t 60.24 S59A.mkv 2>/dev/null | |
| 225 | + | ffmpeg -ss 04:51:39.160 -i bandersnatch.mkv -ss 5 -t 60.24 S35A.mkv 2>/dev/null | |
| 226 | + | ffmpeg -ss 04:52:39.400 -i bandersnatch.mkv -ss 5 -t 60.24 S36A.mkv 2>/dev/null | |
| 227 | + | ffmpeg -ss 04:53:39.640 -i bandersnatch.mkv -ss 5 -t 45.4 Z62a.mkv 2>/dev/null | |
| 228 | + | ffmpeg -ss 04:54:25.040 -i bandersnatch.mkv -ss 5 -t 41.6 Z62b.mkv 2>/dev/null | |
| 229 | + | ffmpeg -ss 04:55:06.640 -i bandersnatch.mkv -ss 5 -t 56.92 Z62c.mkv 2>/dev/null | |
| 230 | + | ffmpeg -ss 04:56:03.560 -i bandersnatch.mkv -ss 5 -t 51.8 Z62d.mkv 2>/dev/null | |
| 231 | + | ffmpeg -ss 04:56:55.360 -i bandersnatch.mkv -ss 5 -t 48.52 Z62e.mkv 2>/dev/null | |
| 232 | + | ffmpeg -ss 04:57:43.880 -i bandersnatch.mkv -ss 5 -t 44.76 Z62f.mkv 2>/dev/null | |
| 233 | + | ffmpeg -ss 04:58:28.640 -i bandersnatch.mkv -ss 5 -t 45.4 Z61a.mkv 2>/dev/null | |
| 234 | + | ffmpeg -ss 04:59:14.040 -i bandersnatch.mkv -ss 5 -t 41.6 Z61b.mkv 2>/dev/null | |
| 235 | + | ffmpeg -ss 04:59:55.640 -i bandersnatch.mkv -ss 5 -t 56.92 Z61c.mkv 2>/dev/null | |
| 236 | + | ffmpeg -ss 05:00:52.560 -i bandersnatch.mkv -ss 5 -t 51.8 Z61d.mkv 2>/dev/null | |
| 237 | + | ffmpeg -ss 05:01:44.360 -i bandersnatch.mkv -ss 5 -t 48.52 Z61e.mkv 2>/dev/null | |
| 238 | + | ffmpeg -ss 05:02:32.880 -i bandersnatch.mkv -ss 5 -t 44.76 Z61f.mkv 2>/dev/null | |
| 239 | + | ffmpeg -ss 05:03:17.640 -i bandersnatch.mkv -ss 5 -t 26.4 Z7a.mkv 2>/dev/null | |
| 240 | + | ffmpeg -ss 05:03:44.040 -i bandersnatch.mkv -ss 5 -t 23.0 Z7b.mkv 2>/dev/null | |
| 241 | + | ffmpeg -ss 05:04:07.040 -i bandersnatch.mkv -ss 5 -t 36.6 Z7d.mkv 2>/dev/null | |
| 242 | + | ffmpeg -ss 05:04:43.640 -i bandersnatch.mkv -ss 5 -t 31.64 Z7e.mkv 2>/dev/null | |
| 243 | + | ffmpeg -ss 05:05:15.280 -i bandersnatch.mkv -ss 5 -t 28.0 Z7f.mkv 2>/dev/null | |
| 244 | + | ffmpeg -ss 05:05:43.280 -i bandersnatch.mkv -ss 5 -t 5.56 8KB.mkv 2>/dev/null | |
| 245 | + | ffmpeg -ss 05:05:48.840 -i bandersnatch.mkv -ss 5 -t 5.24 8KA.mkv 2>/dev/null | |
| 246 | + | ffmpeg -ss 05:05:54.080 -i bandersnatch.mkv -ss 5 -t 156.24 0cr3.mkv 2>/dev/null | |
| 247 | + | ffmpeg -ss 05:08:30.320 -i bandersnatch.mkv -ss 5 -t 79.88 0Cr4.mkv 2>/dev/null | |
| 248 | + | ffmpeg -ss 05:09:50.200 -i bandersnatch.mkv -ss 5 -t 51.04 0cr1.mkv 2>/dev/null | |
| 249 | + | ffmpeg -ss 05:10:41.240 -i bandersnatch.mkv -ss 5 -t 78.04 0cr2.mkv 2>/dev/null | |
| 250 | + | ffmpeg -ss 05:11:59.280 -i bandersnatch.mkv -ss 5 IDNT.mkv 2>/dev/null | |
S Smith revised this gist . Go to revision
1 file changed, 2 insertions
bandersnatch.py
| @@ -1,3 +1,5 @@ | |||
| 1 | + | #!/usr/bin/env python3 | |
| 2 | + | from __future__ import print_function | |
| 1 | 3 | from random import choice | |
| 2 | 4 | import json | |
| 3 | 5 | from sys import stderr | |
S Smith revised this gist . Go to revision
1 file changed, 1 insertion, 1 deletion
bandersnatch.py
| @@ -5,7 +5,7 @@ from sys import stderr | |||
| 5 | 5 | with open("bandersnatch.json") as f: | |
| 6 | 6 | bandersnatch = json.load(f) | |
| 7 | 7 | ||
| 8 | - | with open("/srv/http/bi/assets/segmentmap.json") as f: | |
| 8 | + | with open("SegmentMap.json") as f: | |
| 9 | 9 | smap = json.load(f) | |
| 10 | 10 | ||
| 11 | 11 | initial_state = { "p_sp": True, "p_tt": True, "p_8a": False, "p_td": True, "p_cs": False, "p_w1": False, "p_2b": False, "p_3j": False, "p_pt": False, "p_cd": False, "p_cj": False, "p_sj": False, "p_sj2": False, "p_tud": False, "p_lsd": False, "p_vh": False, "p_3l": False, "p_3s": False, "p_3z": False, "p_ps": "n", "p_wb": False, "p_kd": False, "p_bo": False, "p_5v": False, "p_pc": "n", "p_sc": False, "p_ty": False, "p_cm": False, "p_pr": False, "p_3ad": False, "p_s3af": False, "p_nf": False, "p_np": False, "p_ne": False, "p_pp": False, "p_tp": False, "p_bup": False, "p_be": False, "p_pe": False, "p_pae": False, "p_te": False, "p_snt": False, "p_8j": False, "p_8d": False, "p_8m": False, "p_8q": False, "p_8s": False, "p_8v": False, "p_vs": "n", "p_scs": False, "p_3ab": False, "p_3ac": False, "p_3aj": False, "p_3ah": False, "p_3ak": False, "p_3al": False, "p_3af": False, "p_5h": False, "p_5ac": False, "p_5ag": False, "p_5ad": False, "p_6c": False, "length": 0 } | |
S Smith revised this gist . Go to revision
2 files changed, 45 insertions, 14 deletions
bandersnatch.md
| @@ -1,7 +1,7 @@ | |||
| 1 | 1 | Bandersnatch Maker | |
| 2 | 2 | ================== | |
| 3 | 3 | ||
| 4 | - | This is a program I wrote on a live stream on the 14th (and 15th) of June 2019. Video link coming soon. | |
| 4 | + | This is a program I wrote on a live stream on the 14th (and 15th) of June 2019. https://www.twitch.tv/videos/438871676 | |
| 5 | 5 | ||
| 6 | 6 | You'll need some things. | |
| 7 | 7 | ||
| @@ -31,18 +31,47 @@ def msToTS(ms): | |||
| 31 | 31 | for segment in smap.values(): | |
| 32 | 32 | ss = "" | |
| 33 | 33 | t = "" | |
| 34 | + | # working around ffmpeg seek to previous keyframe | |
| 34 | 35 | if segment["startTimeMs"] > 5000: | |
| 35 | - | ss = " -ss " + msToTS(segment["startTimeMs"]-5000) | |
| 36 | + | # 40ms subtracted to account for one frame difference in 25fps source video | |
| 37 | + | ss = " -ss " + msToTS(segment["startTimeMs"]-4960) | |
| 36 | 38 | if "endTimeMs" in segment: | |
| 37 | 39 | t = " -t {}".format((segment["endTimeMs"]-segment["startTimeMs"])/1000) | |
| 38 | 40 | print("""ffmpeg{} -i bandersnatch.mkv -ss 5{} {}.mkv 2>/dev/null""".format(ss, t, segment)) | |
| 39 | 41 | ``` | |
| 40 | 42 | ||
| 41 | 43 | You'll get a bunch of lines to run to generate clips from the full movie. I'd suggest putting these lines into a bash script | |
| 42 | - | and leaving it to run for a while. This will take a very long time. | |
| 44 | + | and leaving it to run for a while in screen or tmux. This will take a very long time dependent on your CPU. | |
| 43 | 45 | ||
| 44 | - | While that's going, generate some movies! They're produced in ffmpeg concat format, render them with: | |
| 46 | + | While that's going, generate some movies! | |
| 45 | 47 | ||
| 46 | 48 | ```bash | |
| 47 | - | ffmpeg -f concat -i FILENAME.txt -c copy `date +%Y%m%d-%H%M%S.mkv` | |
| 49 | + | $ python bandersnatch.py > concat.txt | |
| 50 | + | picked 1A | |
| 51 | + | out=['1E'] | |
| 52 | + | out=['1D'] | |
| 53 | + | poss=['1E', '1D'] | |
| 54 | + | picked 1D | |
| 55 | + | out=['1H'] | |
| 56 | + | out=['1G'] | |
| 57 | + | poss=['1H', '1G'] | |
| 58 | + | picked 1G | |
| 59 | + | ... | |
| 60 | + | out=['8JA'] | |
| 61 | + | out=['8JB1'] | |
| 62 | + | poss=['8JA', '8JB1'] | |
| 63 | + | picked 8JA | |
| 64 | + | out=['0Cr4', '0cr3'] | |
| 65 | + | out=['0Cr4', '0cr3'] | |
| 66 | + | poss=['0Cr4', '0cr3'] | |
| 67 | + | picked 0Cr4 and added IDNT | |
| 68 | + | 01:04:02.610 | |
| 69 | + | ``` | |
| 70 | + | ||
| 71 | + | The stderr output displays what choices were possible at each stage, which segment it picked, and the total length of the movie. | |
| 72 | + | ||
| 73 | + | The output file concat.txt is produced in ffmpeg concat format, render it in the same directory as the segment files (e.g IDNT.mkv) with: | |
| 74 | + | ||
| 75 | + | ```bash | |
| 76 | + | ffmpeg -f concat -i concat.txt -c copy `date +%Y%m%d-%H%M%S.mkv` | |
| 48 | 77 | ``` | |
bandersnatch.py
| @@ -1,11 +1,11 @@ | |||
| 1 | 1 | from random import choice | |
| 2 | 2 | import json | |
| 3 | - | #from sys import stderr | |
| 3 | + | from sys import stderr | |
| 4 | 4 | ||
| 5 | 5 | with open("bandersnatch.json") as f: | |
| 6 | 6 | bandersnatch = json.load(f) | |
| 7 | 7 | ||
| 8 | - | with open("SegmentMap.json") as f: | |
| 8 | + | with open("/srv/http/bi/assets/segmentmap.json") as f: | |
| 9 | 9 | smap = json.load(f) | |
| 10 | 10 | ||
| 11 | 11 | initial_state = { "p_sp": True, "p_tt": True, "p_8a": False, "p_td": True, "p_cs": False, "p_w1": False, "p_2b": False, "p_3j": False, "p_pt": False, "p_cd": False, "p_cj": False, "p_sj": False, "p_sj2": False, "p_tud": False, "p_lsd": False, "p_vh": False, "p_3l": False, "p_3s": False, "p_3z": False, "p_ps": "n", "p_wb": False, "p_kd": False, "p_bo": False, "p_5v": False, "p_pc": "n", "p_sc": False, "p_ty": False, "p_cm": False, "p_pr": False, "p_3ad": False, "p_s3af": False, "p_nf": False, "p_np": False, "p_ne": False, "p_pp": False, "p_tp": False, "p_bup": False, "p_be": False, "p_pe": False, "p_pae": False, "p_te": False, "p_snt": False, "p_8j": False, "p_8d": False, "p_8m": False, "p_8q": False, "p_8s": False, "p_8v": False, "p_vs": "n", "p_scs": False, "p_3ab": False, "p_3ac": False, "p_3aj": False, "p_3ah": False, "p_3ak": False, "p_3al": False, "p_3af": False, "p_5h": False, "p_5ac": False, "p_5ag": False, "p_5ad": False, "p_6c": False, "length": 0 } | |
| @@ -49,9 +49,9 @@ def groupHandler(group, segment=None): | |||
| 49 | 49 | if "precondition" in item: | |
| 50 | 50 | if conditionHandler( preconditions.get(item["precondition"],[]) ): | |
| 51 | 51 | out.append(item["segment"]) | |
| 52 | - | # print("out="+repr(out),file=stderr) | |
| 52 | + | print("out="+repr(out),file=stderr) | |
| 53 | 53 | return out | |
| 54 | - | ||
| 54 | + | ||
| 55 | 55 | ||
| 56 | 56 | def followTheStory(segment): | |
| 57 | 57 | global state | |
| @@ -78,7 +78,7 @@ def followTheStory(segment): | |||
| 78 | 78 | possibilities.append(segment) | |
| 79 | 79 | if segment in segmentGroups: | |
| 80 | 80 | possibilities += groupHandler(segmentGroups[segment]) | |
| 81 | - | # print("poss="+repr(possibilities),file=stderr) | |
| 81 | + | print("poss="+repr(possibilities),file=stderr) | |
| 82 | 82 | if not possibilities: | |
| 83 | 83 | # raise Exception("hoi") | |
| 84 | 84 | possibilities += groupHandler(segmentGroups["respawnOptions"]) | |
| @@ -89,17 +89,19 @@ def bandersnatch(): | |||
| 89 | 89 | state = dict(initial_state) | |
| 90 | 90 | current_segment = "1A" | |
| 91 | 91 | while True: | |
| 92 | + | state["length"] += smap[current_segment]["endTimeMs"] - smap[current_segment]["startTimeMs"] | |
| 92 | 93 | if current_segment[:3].lower() == "0cr": | |
| 93 | 94 | print("file '{}.mkv'".format(current_segment)) | |
| 94 | 95 | print("file 'IDNT.mkv'") | |
| 96 | + | print("picked {} and added IDNT".format(current_segment), file=stderr) | |
| 97 | + | state["length"] += 10 | |
| 95 | 98 | break | |
| 96 | - | if current_segment in smap: | |
| 97 | - | print("file '{}.mkv'".format(current_segment)) | |
| 98 | - | state["length"] += smap[current_segment]["endTimeMs"] - smap[current_segment]["startTimeMs"] | |
| 99 | + | print("file '{}.mkv'".format(current_segment)) | |
| 100 | + | print("picked {}".format(current_segment), file=stderr) | |
| 99 | 101 | current_segment = followTheStory(current_segment) | |
| 100 | 102 | if current_segment is None: | |
| 101 | 103 | break | |
| 102 | 104 | return msToTS(state["length"]) | |
| 103 | 105 | ||
| 104 | 106 | if __name__ == "__main__": | |
| 105 | - | bandersnatch() | |
| 107 | + | print(bandersnatch(),file=stderr) | |
S Smith revised this gist . Go to revision
1 file changed, 1 insertion, 1 deletion
bandersnatch.py
| @@ -93,7 +93,7 @@ def bandersnatch(): | |||
| 93 | 93 | print("file '{}.mkv'".format(current_segment)) | |
| 94 | 94 | print("file 'IDNT.mkv'") | |
| 95 | 95 | break | |
| 96 | - | if current_segment in moments: | |
| 96 | + | if current_segment in smap: | |
| 97 | 97 | print("file '{}.mkv'".format(current_segment)) | |
| 98 | 98 | state["length"] += smap[current_segment]["endTimeMs"] - smap[current_segment]["startTimeMs"] | |
| 99 | 99 | current_segment = followTheStory(current_segment) | |
S Smith revised this gist . Go to revision
1 file changed, 1 insertion, 1 deletion
bandersnatch.md
| @@ -35,7 +35,7 @@ for segment in smap.values(): | |||
| 35 | 35 | ss = " -ss " + msToTS(segment["startTimeMs"]-5000) | |
| 36 | 36 | if "endTimeMs" in segment: | |
| 37 | 37 | t = " -t {}".format((segment["endTimeMs"]-segment["startTimeMs"])/1000) | |
| 38 | - | print("""ffmpeg{} -i bandersnatch.mkv -ss 5{} {}.mkv 2>/dev/null""".format(ss, t, segment["segment"])) | |
| 38 | + | print("""ffmpeg{} -i bandersnatch.mkv -ss 5{} {}.mkv 2>/dev/null""".format(ss, t, segment)) | |
| 39 | 39 | ``` | |
| 40 | 40 | ||
| 41 | 41 | You'll get a bunch of lines to run to generate clips from the full movie. I'd suggest putting these lines into a bash script | |
S Smith revised this gist . Go to revision
2 files changed, 153 insertions
bandersnatch.md(file created)
| @@ -0,0 +1,48 @@ | |||
| 1 | + | Bandersnatch Maker | |
| 2 | + | ================== | |
| 3 | + | ||
| 4 | + | This is a program I wrote on a live stream on the 14th (and 15th) of June 2019. Video link coming soon. | |
| 5 | + | ||
| 6 | + | You'll need some things. | |
| 7 | + | ||
| 8 | + | * The movie (complete, with all clips, should be 05:12:14). See https://mehotkhan.github.io/BandersnatchInteractive/ for info on that. | |
| 9 | + | * Some data from BandersnatchInteractive. | |
| 10 | + | * https://mehotkhan.github.io/BandersnatchInteractive/assets/bandersnatch.js | |
| 11 | + | * https://mehotkhan.github.io/BandersnatchInteractive/assets/SegmentMap.js | |
| 12 | + | * ffmpeg | |
| 13 | + | ||
| 14 | + | You'll need to edit the two js files to remove `bandersnatch=` and `SegmentMap=` respectively so they parse as valid json. If you | |
| 15 | + | encounter an error about utf-8 bom use dos2unix to fix it. Rename the files to `bandersnatch.json` and `SegmentMap.json`. | |
| 16 | + | ||
| 17 | + | Open a python interpreter in the same directory as SegmentMap.js. I'd probably recommend 3.7. Paste this in: | |
| 18 | + | ||
| 19 | + | ```python | |
| 20 | + | import json | |
| 21 | + | ||
| 22 | + | with open("SegmentMap.json") as f: | |
| 23 | + | smap = json.load(f) | |
| 24 | + | ||
| 25 | + | def msToTS(ms): | |
| 26 | + | s,ms = divmod(ms,1000) | |
| 27 | + | m,s = divmod(s,60) | |
| 28 | + | h,m = divmod(m,60) | |
| 29 | + | return "{:02d}:{:02d}:{:02d}.{:03d}".format(h,m,s,ms) | |
| 30 | + | ||
| 31 | + | for segment in smap.values(): | |
| 32 | + | ss = "" | |
| 33 | + | t = "" | |
| 34 | + | if segment["startTimeMs"] > 5000: | |
| 35 | + | ss = " -ss " + msToTS(segment["startTimeMs"]-5000) | |
| 36 | + | if "endTimeMs" in segment: | |
| 37 | + | t = " -t {}".format((segment["endTimeMs"]-segment["startTimeMs"])/1000) | |
| 38 | + | print("""ffmpeg{} -i bandersnatch.mkv -ss 5{} {}.mkv 2>/dev/null""".format(ss, t, segment["segment"])) | |
| 39 | + | ``` | |
| 40 | + | ||
| 41 | + | You'll get a bunch of lines to run to generate clips from the full movie. I'd suggest putting these lines into a bash script | |
| 42 | + | and leaving it to run for a while. This will take a very long time. | |
| 43 | + | ||
| 44 | + | While that's going, generate some movies! They're produced in ffmpeg concat format, render them with: | |
| 45 | + | ||
| 46 | + | ```bash | |
| 47 | + | ffmpeg -f concat -i FILENAME.txt -c copy `date +%Y%m%d-%H%M%S.mkv` | |
| 48 | + | ``` | |
bandersnatch.py(file created)
| @@ -0,0 +1,105 @@ | |||
| 1 | + | from random import choice | |
| 2 | + | import json | |
| 3 | + | #from sys import stderr | |
| 4 | + | ||
| 5 | + | with open("bandersnatch.json") as f: | |
| 6 | + | bandersnatch = json.load(f) | |
| 7 | + | ||
| 8 | + | with open("SegmentMap.json") as f: | |
| 9 | + | smap = json.load(f) | |
| 10 | + | ||
| 11 | + | initial_state = { "p_sp": True, "p_tt": True, "p_8a": False, "p_td": True, "p_cs": False, "p_w1": False, "p_2b": False, "p_3j": False, "p_pt": False, "p_cd": False, "p_cj": False, "p_sj": False, "p_sj2": False, "p_tud": False, "p_lsd": False, "p_vh": False, "p_3l": False, "p_3s": False, "p_3z": False, "p_ps": "n", "p_wb": False, "p_kd": False, "p_bo": False, "p_5v": False, "p_pc": "n", "p_sc": False, "p_ty": False, "p_cm": False, "p_pr": False, "p_3ad": False, "p_s3af": False, "p_nf": False, "p_np": False, "p_ne": False, "p_pp": False, "p_tp": False, "p_bup": False, "p_be": False, "p_pe": False, "p_pae": False, "p_te": False, "p_snt": False, "p_8j": False, "p_8d": False, "p_8m": False, "p_8q": False, "p_8s": False, "p_8v": False, "p_vs": "n", "p_scs": False, "p_3ab": False, "p_3ac": False, "p_3aj": False, "p_3ah": False, "p_3ak": False, "p_3al": False, "p_3af": False, "p_5h": False, "p_5ac": False, "p_5ag": False, "p_5ad": False, "p_6c": False, "length": 0 } | |
| 12 | + | state = dict(initial_state) | |
| 13 | + | ||
| 14 | + | moments = bandersnatch["videos"]["80988062"]["interactiveVideoMoments"]["value"]["momentsBySegment"] | |
| 15 | + | preconditions = bandersnatch["videos"]["80988062"]["interactiveVideoMoments"]["value"]["preconditions"] | |
| 16 | + | segmentGroups = bandersnatch["videos"]["80988062"]["interactiveVideoMoments"]["value"]["segmentGroups"] | |
| 17 | + | ||
| 18 | + | def msToTS(ms): | |
| 19 | + | s,ms = divmod(ms,1000) | |
| 20 | + | m,s = divmod(s,60) | |
| 21 | + | h,m = divmod(m,60) | |
| 22 | + | return "{:02d}:{:02d}:{:02d}.{:03d}".format(h,m,s,ms) | |
| 23 | + | ||
| 24 | + | def conditionHandler(cond): | |
| 25 | + | global state | |
| 26 | + | if not cond: | |
| 27 | + | return True | |
| 28 | + | if cond[0] == "persistentState": | |
| 29 | + | return state[cond[1]] | |
| 30 | + | if cond[0] == "not": | |
| 31 | + | return not all(conditionHandler(c) for c in cond[1:]) | |
| 32 | + | if cond[0] == "and": | |
| 33 | + | return all(conditionHandler(c) for c in cond[1:]) | |
| 34 | + | if cond[0] == "eql": | |
| 35 | + | return conditionHandler(cond[1]) == cond[2] | |
| 36 | + | if cond[0] == "or": | |
| 37 | + | return any(conditionHandler(c) for c in cond[1:]) | |
| 38 | + | ||
| 39 | + | def groupHandler(group, segment=None): | |
| 40 | + | out = [] | |
| 41 | + | if segment: | |
| 42 | + | group.append(segment) | |
| 43 | + | for item in group: | |
| 44 | + | if type(item) is str and conditionHandler( preconditions.get(item,[]) ): | |
| 45 | + | out.append(item) | |
| 46 | + | if type(item) is dict: | |
| 47 | + | if "segmentGroup" in item: | |
| 48 | + | out += groupHandler(segmentGroups[item["segmentGroup"]]) | |
| 49 | + | if "precondition" in item: | |
| 50 | + | if conditionHandler( preconditions.get(item["precondition"],[]) ): | |
| 51 | + | out.append(item["segment"]) | |
| 52 | + | # print("out="+repr(out),file=stderr) | |
| 53 | + | return out | |
| 54 | + | ||
| 55 | + | ||
| 56 | + | def followTheStory(segment): | |
| 57 | + | global state | |
| 58 | + | global history | |
| 59 | + | possibilities = [] | |
| 60 | + | if segment in moments: | |
| 61 | + | m = moments[segment] | |
| 62 | + | for moment in m: | |
| 63 | + | if moment["type"] == "notification:playbackImpression": | |
| 64 | + | state.update( moment.get("impressionData",{}).get("data", {}).get("persistent", {}) ) | |
| 65 | + | if moment["type"] == "scene:cs_bs": | |
| 66 | + | for option in moment["choices"]: | |
| 67 | + | state.update( option.get("impressionData",{}).get("data", {}).get("persistent", {}) ) | |
| 68 | + | if "segmentId" in option: | |
| 69 | + | p = groupHandler([option["segmentId"]]) | |
| 70 | + | elif "sg" in option: | |
| 71 | + | p = groupHandler(segmentGroups[option["sg"]]) | |
| 72 | + | elif moment["trackingInfo"]["optionType"] == "fakeOption": | |
| 73 | + | continue | |
| 74 | + | else: | |
| 75 | + | raise Exception(option["id"]) | |
| 76 | + | possibilities += p | |
| 77 | + | if moment["type"] == "notification:action": | |
| 78 | + | possibilities.append(segment) | |
| 79 | + | if segment in segmentGroups: | |
| 80 | + | possibilities += groupHandler(segmentGroups[segment]) | |
| 81 | + | # print("poss="+repr(possibilities),file=stderr) | |
| 82 | + | if not possibilities: | |
| 83 | + | # raise Exception("hoi") | |
| 84 | + | possibilities += groupHandler(segmentGroups["respawnOptions"]) | |
| 85 | + | return choice(possibilities) | |
| 86 | + | ||
| 87 | + | def bandersnatch(): | |
| 88 | + | global state | |
| 89 | + | state = dict(initial_state) | |
| 90 | + | current_segment = "1A" | |
| 91 | + | while True: | |
| 92 | + | if current_segment[:3].lower() == "0cr": | |
| 93 | + | print("file '{}.mkv'".format(current_segment)) | |
| 94 | + | print("file 'IDNT.mkv'") | |
| 95 | + | break | |
| 96 | + | if current_segment in moments: | |
| 97 | + | print("file '{}.mkv'".format(current_segment)) | |
| 98 | + | state["length"] += smap[current_segment]["endTimeMs"] - smap[current_segment]["startTimeMs"] | |
| 99 | + | current_segment = followTheStory(current_segment) | |
| 100 | + | if current_segment is None: | |
| 101 | + | break | |
| 102 | + | return msToTS(state["length"]) | |
| 103 | + | ||
| 104 | + | if __name__ == "__main__": | |
| 105 | + | bandersnatch() | |