| 1 | ### -*-makefile-*- |
| 2 | |
| 3 | all: |
| 4 | clean::; rm -f $(CLEANFILES) |
| 5 | force: |
| 6 | .PHONY: all clean |
| 7 | .SECONDEXPANSION: # not sorry |
| 8 | |
| 9 | V ?= 0 |
| 10 | V_AT = $(V_AT_$V) |
| 11 | V_AT_0 = @ |
| 12 | v-print = $(call v-print.$V,$1,$2) |
| 13 | v-print.1 = : |
| 14 | v-print.0 = printf " %-8s %s\n" "$1" "$2" |
| 15 | v-tag = $(call v-tag.$V,$1) |
| 16 | v-tag.0 = @$(call v-print.0,$1,$@); |
| 17 | |
| 18 | TARGETS = |
| 19 | CLEANFILES += $(TARGETS) |
| 20 | |
| 21 | define %declare-playlist |
| 22 | PLAYLISTS += $1 |
| 23 | $1_FULLNAME = $2 |
| 24 | endef |
| 25 | |
| 26 | define %declare-simple-playlist |
| 27 | $1_EPLS = $1.epls |
| 28 | $1_MKM3UFLAGS = |
| 29 | endef |
| 30 | |
| 31 | define %declare-chapter-playlist |
| 32 | $1_EPLS = $2.epls |
| 33 | $1_MKM3UFLAGS = -c |
| 34 | endef |
| 35 | |
| 36 | define %declare-filter-playlist |
| 37 | $1_EPLS = $2.epls |
| 38 | $1_MKM3UFLAGS = -s$3 |
| 39 | endef |
| 40 | |
| 41 | declare-playlist = \ |
| 42 | $(eval $(call %declare-playlist,$1,$2)) \ |
| 43 | $(eval $(call %declare-simple-playlist,$1)) |
| 44 | declare-chapters-only = \ |
| 45 | $(eval $(call %declare-playlist,$1,$2)) \ |
| 46 | $(eval $(call %declare-chapter-playlist,$1,$1)) |
| 47 | declare-chapters = \ |
| 48 | $(eval $(call %declare-playlist,$1,$2)) \ |
| 49 | $(eval $(call %declare-simple-playlist,$1)) \ |
| 50 | $(eval $(call %declare-playlist,$1-chap,$2 (chapters))) \ |
| 51 | $(eval $(call %declare-chapter-playlist,$1-chap,$1)) |
| 52 | declare-filter = \ |
| 53 | $(eval $(call %declare-playlist,$1,$4)) \ |
| 54 | $(eval $(call %declare-filter-playlist,$1,$2,$3)) |
| 55 | |
| 56 | ARCHIVEROOT = ../archive |
| 57 | |
| 58 | $(call declare-playlist, 24, \#/24) |
| 59 | $(call declare-playlist, agent-carter, A/Agent Carter) |
| 60 | $(call declare-playlist, agents-of-shield, A/Agents of SHIELD) |
| 61 | $(call declare-playlist, andromeda, A/Andromeda) |
| 62 | $(call declare-playlist, arrowverse, A/Arrowverse) |
| 63 | $(call declare-filter, arrow, arrowverse,arr, A/Arrow) |
| 64 | $(call declare-filter, the-flash, arrowverse,fls, F/The Flash) |
| 65 | $(call declare-filter, constantine, arrowverse,cns, C/Constantine) |
| 66 | $(call declare-filter, supergirl, arrowverse,spg, S/Supergirl) |
| 67 | $(call declare-filter, legends-of-tomorrow, arrowverse,lot, L/Legends of Tomorrow) |
| 68 | $(call declare-filter, batwoman, arrowverse,bwm, B/Batwoman) |
| 69 | $(call declare-playlist, a-team, A/The A-Team) |
| 70 | $(call declare-playlist, the-americans, A/The Americans) |
| 71 | $(call declare-playlist, allo-allo, A/'Allo 'Allo!) |
| 72 | $(call declare-playlist, babylon-5, B/Babylon 5) |
| 73 | $(call declare-playlist, batman-1966, B/Batman (1966 series)) |
| 74 | $(call declare-playlist, bsg-1978, B/Battlestar Galactica (1978)) |
| 75 | $(call declare-playlist, bsg-1980, B/Battlestar Galactica 1980) |
| 76 | $(call declare-playlist, bsg-2003, B/Battlestar Galactica (2003)) |
| 77 | $(call declare-playlist, between-the-lines, B/Between the Lines) |
| 78 | $(call declare-playlist, blackadder, B/Blackadder) |
| 79 | $(call declare-playlist, blakes-7, B/Blake's 7) #' |
| 80 | $(call declare-playlist, brass-eye, B/Brass Eye) |
| 81 | $(call declare-playlist, the-bridge, B/The Bridge) |
| 82 | $(call declare-playlist, buffyverse, B/Buffyverse) |
| 83 | $(call declare-filter, btvs, buffyverse,b, B/Buffy the Vampire Slayer) |
| 84 | $(call declare-filter, angel, buffyverse,a, A/Angel) |
| 85 | $(call declare-playlist, caprica, C/Caprica) |
| 86 | $(call declare-playlist, cracker, C/Cracker) |
| 87 | $(call declare-playlist, crow-stairway, C/The Crow—Stairway to Heaven) |
| 88 | $(call declare-playlist, danger-mouse, D/Danger Mouse) |
| 89 | $(call declare-playlist, dark-angel, D/Dark Angel) |
| 90 | $(call declare-playlist, the-day-today, D/The Day Today) |
| 91 | $(call declare-playlist, dexter, D/Dexter) |
| 92 | $(call declare-playlist, dollhouse, D/Dollhouse) |
| 93 | $(call declare-playlist, engrenages, E/Engrenages) |
| 94 | $(call declare-playlist, equalizer, E/The Equalizer (1985)) |
| 95 | $(call declare-playlist, fawlty-towers, F/Fawlty Towers) |
| 96 | $(call declare-playlist, firefly, F/Firefly) |
| 97 | $(call declare-chapters, fry-and-laurie, F/A Bit of Fry and Laurie) |
| 98 | $(call declare-playlist, game-of-thrones, G/Game of Thrones) |
| 99 | #$(call declare-playlist, godfather-ii, G/The Godfather Trilogy/02. Part II) |
| 100 | #$(call declare-playlist, gotham, G/Gotham) |
| 101 | #$(call declare-playlist, hannibal, H/Hannibal) |
| 102 | #$(call declare-playlist, hhgttg, H/The Hitchhiker's Guide to the Galaxy) #' |
| 103 | $(call declare-playlist, sherlock-holmes, H/Sherlock Holmes (1984)) |
| 104 | #$(call declare-playlist, house-of-cards, H/House of Cards) |
| 105 | #$(call declare-playlist, into-the-labyrinth, I/Into the Labyrinth) |
| 106 | #$(call declare-playlist, it-2017, I/It (2017)) |
| 107 | #$(call declare-playlist, snyder-justice, J/Justice League (Snyder cut)) |
| 108 | #$(call declare-playlist, kill-bill, K/Kill Bill) |
| 109 | #$(call declare-playlist, the-killing, K/The Killing) |
| 110 | #$(call declare-playlist, kingdom-of-heaven, K/Kingdom of Heaven (Definitive Edition)) |
| 111 | $(call declare-playlist, knight-rider, K/Knight Rider) |
| 112 | #$(call declare-playlist, lexx, L/Lexx) |
| 113 | #$(call declare-playlist, lois-and-clark, L/Lois and Clark—The New Adventures of Superman) |
| 114 | $(call declare-playlist, morse, M/Inspector Morse) |
| 115 | $(call declare-playlist, macgyver, M/MacGyver) |
| 116 | #$(call declare-playlist, metallica-s-and-m, M/Metallica—S&M) |
| 117 | #$(call declare-playlist, the-night-manager, N/The Night Manager) |
| 118 | #$(call declare-playlist, person-of-interest, P/Person of Interest) |
| 119 | #$(call declare-playlist, harry-potter, P/Harry Potter) |
| 120 | $(call declare-playlist, flying-circus-restored, P/Monty Python's Flying Circus (restored)) #' |
| 121 | $(call declare-chapters-only, flying-circus-sketches, P/Monty Python's Flying Circus (sketches)) #' |
| 122 | $(call declare-playlist, robin-of-sherwood, R/Robin of Sherwood) |
| 123 | $(call declare-playlist, rome, R/Rome) |
| 124 | #$(call declare-playlist, sanctuary, S/Sanctuary) |
| 125 | $(call declare-playlist, shark, S/Shark) |
| 126 | #$(call declare-playlist, the-shield, S/The Shield) |
| 127 | #$(call declare-playlist, smallville, S/Smallville) |
| 128 | #$(call declare-playlist, george-smiley, S/George Smiley) |
| 129 | $(call declare-playlist, spartacus, S/Spartacus) |
| 130 | #$(call declare-playlist, spooks, S/Spooks) |
| 131 | #$(call declare-playlist, star-wars, S/Star Wars) |
| 132 | $(call declare-playlist, stargate, S/Stargate) |
| 133 | $(call declare-filter, stargate-sg1, stargate,sg1, S/Stargate SG-1) |
| 134 | $(call declare-filter, stargate-atlantis, stargate,sga, S/Stargate Atlantis) |
| 135 | $(call declare-filter, stargate-universe, stargate,sgu, S/Stargate Universe) |
| 136 | #$(call declare-playlist, state-of-play, S/State of Play) |
| 137 | $(call declare-playlist, terminator-scc, T/Terminator—The Sarah Connor Chronicles) |
| 138 | #$(call declare-playlist, traffik, T/Traffik) |
| 139 | #$(call declare-playlist, the-tripods, T/The Tripods) |
| 140 | #$(call declare-playlist, tru-calling, T/Tru Calling) |
| 141 | #$(call declare-playlist, ultraviolet, U/Ultraviolet) |
| 142 | #$(call declare-playlist, v-1983, V/V (1983)) |
| 143 | $(call declare-playlist, v-2009, V/V (2009)) |
| 144 | $(call declare-playlist, the-wire, W/The Wire) |
| 145 | $(call declare-playlist, waking-the-dead, W/Waking the Dead) |
| 146 | #$(call declare-playlist, wonder-woman-1975, W/Wonder Woman (1975)) |
| 147 | #$(call declare-playlist, yes-minister, Y/Yes Minister) |
| 148 | #$(call declare-playlist, the-young-ones, Y/The Young Ones) |
| 149 | |
| 150 | $(call declare-playlist, drwho-marco-polo, D/Doctor Who/S01E04 D. Marco Polo) |
| 151 | $(call declare-playlist, drwho-crusade, D/Doctor Who/S02E06 P. The Crusade) |
| 152 | $(call declare-playlist, drwho-masterplan, D/Doctor Who/S03E04 V. The Daleks' Master Plan) #' |
| 153 | $(call declare-playlist, drwho-massacre, D/Doctor Who/S03E05 W. The Massacre of St Bartholomew's Eve) #' |
| 154 | $(call declare-playlist, drwho-toymaker, D/Doctor Who/S03E07 Y. The Celestial Toymaker) |
| 155 | $(call declare-playlist, drwho-savages, D/Doctor Who/S03E09 AA. The Savages) |
| 156 | $(call declare-playlist, drwho-smugglers, D/Doctor Who/S04E01 CC. The Smugglers) |
| 157 | $(call declare-playlist, drwho-highlanders, D/Doctor Who/S04E04 FF. The Highlanders) |
| 158 | $(call declare-playlist, drwho-snowmen, D/Doctor Who/S05E02 NN. The Abominable Snowmen) |
| 159 | $(call declare-playlist, drwho-wheel, D/Doctor Who/S05E07 SS. The Wheel in Space) |
| 160 | $(call declare-playlist, drwho-invasion, D/Doctor Who/S06E03 VV. The Invasion) |
| 161 | $(call declare-playlist, drwho-pirates, D/Doctor Who/S06E06 YY. The Space Pirates) |
| 162 | $(call declare-playlist, drwho-war-games, D/Doctor Who/S06E07 ZZ. The War Games) |
| 163 | $(call declare-playlist, drwho-silurians, D/Doctor Who/S07E02 BBB. Doctor Who and the Silurians) |
| 164 | |
| 165 | M3US = $(addsuffix .m3u8,$(PLAYLISTS)) |
| 166 | TARGETS += $(M3US) |
| 167 | |
| 168 | $(M3US): %.m3u8: $$($$*_EPLS) mkm3u |
| 169 | $(call v-tag,MKM3U)./mkm3u $($*_MKM3UFLAGS) "$<" >"$@.new" && mv "$@.new" "$@" |
| 170 | |
| 171 | CHECKS = $(foreach p,$(PLAYLISTS), check/$p) |
| 172 | check: $(CHECKS) |
| 173 | $(CHECKS): check/%: %.m3u8 |
| 174 | $(V_AT)diff -u $< ref/$*.m3u8 |
| 175 | .PHONY: check $(CHECKS) |
| 176 | |
| 177 | LINKS = $(foreach p,$(PLAYLISTS), link/$p) |
| 178 | link: $(LINKS) |
| 179 | $(LINKS): link/%: |
| 180 | $(V_AT) \ |
| 181 | ok=nil t="$(ARCHIVEROOT)/$($*_FULLNAME).m3u8"; \ |
| 182 | if [ -L "$$t" ]; then \ |
| 183 | case $$(realpath "$$t") in \ |
| 184 | "$(abspath $*.m3u8)") ok=t ;; \ |
| 185 | esac; \ |
| 186 | fi; \ |
| 187 | case $$ok in \ |
| 188 | t) ;; \ |
| 189 | *) $(call v-print,LINK,$*); \ |
| 190 | ln -frs $*.m3u8 "$$t.new" && mv "$$t.new" "$$t" ;; \ |
| 191 | esac |
| 192 | .PHONY: link $(LINKS) |
| 193 | |
| 194 | SAVE = $(foreach p,$(PLAYLISTS), save/$p) |
| 195 | FORCE_SAVE = $(foreach p,$(PLAYLISTS), force-save/$p) |
| 196 | save: $(SAVE) |
| 197 | force-save: $(FORCE_SAVE) |
| 198 | $(SAVE): save/%: %.m3u8 |
| 199 | $(V_AT) \ |
| 200 | ok=nil; \ |
| 201 | if ! [ -f "ref/$*.m3u8" ]; then \ |
| 202 | $(call v-print,SAVE,$*); \ |
| 203 | cp $< ref/$*.m3u8.new && mv ref/$*.m3u8.new ref/$*.m3u8; \ |
| 204 | fi |
| 205 | .PHONY: save $(SAVE) |
| 206 | $(FORCE_SAVE): force-save/%: %.m3u8 |
| 207 | $(V_AT) \ |
| 208 | ok=nil; \ |
| 209 | if ! [ -f "ref/$*.m3u8" ] || ! cmp -s $< ref/$*.m3u8; then \ |
| 210 | $(call v-print,SAVE,$*); \ |
| 211 | cp $< ref/$*.m3u8.new && mv ref/$*.m3u8.new ref/$*.m3u8; \ |
| 212 | fi |
| 213 | .PHONY: save $(SAVE) |
| 214 | |
| 215 | all: $(TARGETS) |
| 216 | |
| 217 | p:; : $p |