presets: # Preset for categorizing URls like so # # subscription_name: # category_1: # - https://...1 # - https://...2 # category_2: # - url: https://...1 # metadata_field_1: 2011 # metadata_field_2: 'abc" # ... # # Metadata field of `url` must exist, other ones can be anything. # Only supports a single level of nesting. _url_categorized: preset: - "_multi_url_bilateral" overrides: # Parameters: # $0: url string or map containing url + metadata fields # $1: category key # # Output: # Map containing { url: ..., category: ..., metadata_field_1: ... } "%flat_array__url_to_map_format": >- { %elif( %is_map($0), %map_extend( $0, { "category": $1 } ), %is_string($0), { "url": $0, "category": $1 }, %throw("If using album categories, each URL must be either a string or map with metadata fields") ) } # Parameters: # $0: category key # $1: array of URLs in either string or map form # # Output: # Array containing [{ url: ..., category: ... }, ... ] "%flat_array__category_to_map_format": >- { %array_apply_fixed( %assert_then( %is_array( $1 ), $1, "If using album categories, each category must map to an array" ), $0, %flat_array__url_to_map_format ) } # Parameters: # $0: map containing fields { url: , category: ... } # # Output: # Nested map containing { : { url: , category: ... } } "%flat_array__url_keyed_map_format": >- { { %map_get($0, "url"): $0 } } # Creates an array in the form of [ { url: ..., category: ..., metadata_field_1: ... }, ... ] category_url_array: >- { %array_flatten( %map_apply( subscription_map, %flat_array__category_to_map_format ) ) } # Creates a map in the form of { : { category: ..., metadata_field_1: ... }, ... } category_url_map: >- { %array_reduce( %array_apply( category_url_array, %flat_array__url_keyed_map_format ), %map_extend ) } # Parameters: # $0: metadata field to fetch for the current url # $1: default value # # Output: # Metadata field value if it exists. Otherwise, return default value "%get_url_field": >- { %map_get( %map( %map_get( category_url_map, ytdl_sub_input_url, {} ) ), $0, $1 ) } # Parameters: # $0: metadata field to fetch for the current url # # Output: # True if field is specified. False otherwise. "%contains_url_field": >- { %not( %is_null( %get_url_field( $0, null ) ) ) } # Parameters: # $0: integer to fetch the i'th url using 1-based indexing # # Output: # i'th url in the category map "%get_url_i": >- { %map_get( %map( %array_at( category_url_array, %int( %sub($0, 1) ), {} ) ), "url", %array_at(subscription_array, %int( %sub($0, 1) ), null) ) } subscription_map: "{ {} }" url: "{ %get_url_i(1) }" url2: "{ %get_url_i(2) }" url3: "{ %get_url_i(3) }" url4: "{ %get_url_i(4) }" url5: "{ %get_url_i(5) }" url6: "{ %get_url_i(6) }" url7: "{ %get_url_i(7) }" url8: "{ %get_url_i(8) }" url9: "{ %get_url_i(9) }" url10: "{ %get_url_i(10) }" url11: "{ %get_url_i(11) }" url12: "{ %get_url_i(12) }" url13: "{ %get_url_i(13) }" url14: "{ %get_url_i(14) }" url15: "{ %get_url_i(15) }" url16: "{ %get_url_i(16) }" url17: "{ %get_url_i(17) }" url18: "{ %get_url_i(18) }" url19: "{ %get_url_i(19) }" url20: "{ %get_url_i(20) }" url21: "{ %get_url_i(21) }" url22: "{ %get_url_i(22) }" url23: "{ %get_url_i(23) }" url24: "{ %get_url_i(24) }" url25: "{ %get_url_i(25) }" url26: "{ %get_url_i(26) }" url27: "{ %get_url_i(27) }" url28: "{ %get_url_i(28) }" url29: "{ %get_url_i(29) }" url30: "{ %get_url_i(30) }" url31: "{ %get_url_i(31) }" url32: "{ %get_url_i(32) }" url33: "{ %get_url_i(33) }" url34: "{ %get_url_i(34) }" url35: "{ %get_url_i(35) }" url36: "{ %get_url_i(36) }" url37: "{ %get_url_i(37) }" url38: "{ %get_url_i(38) }" url39: "{ %get_url_i(39) }" url40: "{ %get_url_i(40) }" url41: "{ %get_url_i(41) }" url42: "{ %get_url_i(42) }" url43: "{ %get_url_i(43) }" url44: "{ %get_url_i(44) }" url45: "{ %get_url_i(45) }" url46: "{ %get_url_i(46) }" url47: "{ %get_url_i(47) }" url48: "{ %get_url_i(48) }" url49: "{ %get_url_i(49) }" url50: "{ %get_url_i(50) }" url51: "{ %get_url_i(51) }" url52: "{ %get_url_i(52) }" url53: "{ %get_url_i(53) }" url54: "{ %get_url_i(54) }" url55: "{ %get_url_i(55) }" url56: "{ %get_url_i(56) }" url57: "{ %get_url_i(57) }" url58: "{ %get_url_i(58) }" url59: "{ %get_url_i(59) }" url60: "{ %get_url_i(60) }" url61: "{ %get_url_i(61) }" url62: "{ %get_url_i(62) }" url63: "{ %get_url_i(63) }" url64: "{ %get_url_i(64) }" url65: "{ %get_url_i(65) }" url66: "{ %get_url_i(66) }" url67: "{ %get_url_i(67) }" url68: "{ %get_url_i(68) }" url69: "{ %get_url_i(69) }" url70: "{ %get_url_i(70) }" url71: "{ %get_url_i(71) }" url72: "{ %get_url_i(72) }" url73: "{ %get_url_i(73) }" url74: "{ %get_url_i(74) }" url75: "{ %get_url_i(75) }" url76: "{ %get_url_i(76) }" url77: "{ %get_url_i(77) }" url78: "{ %get_url_i(78) }" url79: "{ %get_url_i(79) }" url80: "{ %get_url_i(80) }" url81: "{ %get_url_i(81) }" url82: "{ %get_url_i(82) }" url83: "{ %get_url_i(83) }" url84: "{ %get_url_i(84) }" url85: "{ %get_url_i(85) }" url86: "{ %get_url_i(86) }" url87: "{ %get_url_i(87) }" url88: "{ %get_url_i(88) }" url89: "{ %get_url_i(89) }" url90: "{ %get_url_i(90) }" url91: "{ %get_url_i(91) }" url92: "{ %get_url_i(92) }" url93: "{ %get_url_i(93) }" url94: "{ %get_url_i(94) }" url95: "{ %get_url_i(95) }" url96: "{ %get_url_i(96) }" url97: "{ %get_url_i(97) }" url98: "{ %get_url_i(98) }" url99: "{ %get_url_i(99) }" url100: "{ %get_url_i(100) }"