$ fq -i -d mp3 . test.mp3 mp3> .headers | ., tovalue, toactual, tosym, type, length? |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.headers[0:1]: |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef| 0x00|49 44 33 04 00 00 00 00 00 23 54 53 53 45 00 00|ID3......#TSSE..| [0]{}: header (id3v2) * |until 0x2c.7 (45) | | [ { "flags": { "experimental_indicator": false, "extended_header": false, "unsynchronisation": false, "unused": 0 }, "frames": [ { "flags": { "compression": false, "data_length_indicator": false, "encryption": false, "file_alter_preservation": false, "grouping_identity": false, "read_only": false, "tag_alter_preservation": false, "unsync": false, "unused0": 0, "unused1": 0, "unused2": 0 }, "id": "TSSE", "size": 15, "text": "Lavf58.45.100", "text_encoding": "utf8" } ], "magic": "ID3", "padding": "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", "revision": 0, "size": 35, "version": 4 } ] null null "array" 1 mp3> .headers[0] | ., type, length? |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef|.headers[0]{}: header (id3v2) 0x00|49 44 33 |ID3 | magic: "ID3" (valid) 0x00| 04 | . | version: 4 0x00| 00 | . | revision: 0 0x00| 00 | . | flags{}: 0x00| 00 00 00 23 | ...# | size: 35 0x00| 54 53 53 45 00 00| TSSE..| frames[0:1]: 0x10|00 0f 00 00 03 4c 61 76 66 35 38 2e 34 35 2e 31|.....Lavf58.45.1| 0x20|30 30 00 |00. | 0x20| 00 00 00 00 00 00 00 00 00 00 | .......... | padding: raw bits (all zero) "object" 7 mp3> .headers[-1000] | ., type, length? null "null" 0 mp3> .headers[1000] | ., type, length? null "null" 0 mp3> .headers[1:3] | ., type, length? [] "array" 0 mp3> .headers[0:-1] | ., type, length? [] "array" 0 mp3> .headers[-1000:2000] | ., type, length? [ { "flags": { "experimental_indicator": false, "extended_header": false, "unsynchronisation": false, "unused": 0 }, "frames": [ { "flags": { "compression": false, "data_length_indicator": false, "encryption": false, "file_alter_preservation": false, "grouping_identity": false, "read_only": false, "tag_alter_preservation": false, "unsync": false, "unused0": 0, "unused1": 0, "unused2": 0 }, "id": "TSSE", "size": 15, "text": "Lavf58.45.100", "text_encoding": "utf8" } ], "magic": "ID3", "padding": "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000", "revision": 0, "size": 35, "version": 4 } ] "array" 1 mp3> .headers["test"] | ., type, length? error: expected an object with key "test" but got: array mp3> [.headers[]] | type, length? "array" 1 mp3> .headers | keys [ 0 ] mp3> .headers | has("a") error: cannot check whether array has a key: a mp3> .headers | has(0) true mp3> .headers | type "array" mp3> .headers | tonumber error: tonumber cannot be applied to: array mp3> .headers | tostring "[{\"flags\":{\"experimental_indicator\":false,\"extended_header\":false,\"unsynchronisation\":false,\"unused\":0},\"frames\":[{\"flags\":{\"compression\":false,\"data_length_indicator\":false,\"encryption\":false,\"file_alter_preservation\":false,\"grouping_identity\":false,\"read_only\":false,\"tag_alter_preservation\":false,\"unsync\":false,\"unused0\":0,\"unused1\":0,\"unused2\":0},\"id\":\"TSSE\",\"size\":15,\"text\":\"Lavf58.45.100\",\"text_encoding\":\"utf8\"}],\"magic\":\"ID3\",\"padding\":\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\",\"revision\":0,\"size\":35,\"version\":4}]" mp3> .headers + "" error: cannot add: array ([{"flags":{"experimental_ ...]) and string ("") mp3> .headers + 1 error: cannot add: array ([{"flags":{"experimental_ ...]) and number (1) mp3> .headers._start | ., type, length? 0 "number" 0 mp3> .headers._stop | ., type, length? 360 "number" 360 mp3> .headers._len | ., type, length? 360 "number" 360 mp3> .headers._name | ., type, length? "headers" "string" 7 mp3> .headers._actual | ., type, length? null "null" 0 mp3> .headers._sym | ., type, length? null "null" 0 mp3> .headers._description | ., type, length? null "null" 0 mp3> .headers._path | ., type, length? [ "headers" ] "array" 1 mp3> .headers._bits | ., type, length? |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef| 0x00|49 44 33 04 00 00 00 00 00 23 54 53 53 45 00 00|ID3......#TSSE..|.: raw bits 0x0-0x2c.7 (45) * |until 0x2c.7 (45) | | "string" 360 mp3> .headers._bytes | ., type, length? |00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f|0123456789abcdef| 0x00|49 44 33 04 00 00 00 00 00 23 54 53 53 45 00 00|ID3......#TSSE..|.: raw bits 0x0-0x2c.7 (45) * |until 0x2c.7 (45) | | "string" 45 mp3> .headers._error | ., type, length? null "null" 0 mp3> .headers._gap | ., type, length? false "boolean" mp3> .headers.a = 1 error: expected an object but got: array ([{"flags":{"experimental_ ...]) mp3> .headers[0] = 1 { "footers": [], "frames": [ { "audio_data": "\u0000\u0000\u0000\u0000\u0000", "crc_calculated": "827a", "header": { "bitrate": 56000, "channel_mode": "none", "channels": "mono", "copyright": 0, "emphasis": "none", "layer": 3, "mpeg_version": "1", "original": 0, "padding": "not_padded", "private": 0, "protection_absent": true, "sample_count": 1152, "sample_rate": 44100, "sync": 2047 }, "side_info": { "granules": [ [ { "big_values": 0, "blocksplit_flag": 0, "count1table_select": 0, "global_gain": 0, "part2_3_length": 0, "preflag": 0, "region_address1": 0, "region_address2": 0, "scalefac_compress": 0, "scalefac_scale": 0, "table_select0": 0, "table_select1": 0, "table_select2": 0 } ], [ { "big_values": 0, "blocksplit_flag": 0, "count1table_select": 0, "global_gain": 0, "part2_3_length": 0, "preflag": 0, "region_address1": 0, "region_address2": 0, "scalefac_compress": 0, "scalefac_scale": 0, "table_select0": 0, "table_select1": 0, "table_select2": 0 } ] ], "main_data_begin": 0, "scfsi0": 0, "share": 0 }, "tags": { "abr_vbr": 0, "audiophile_replay_gain": 0, "bytes": 599, "encoder": "Lavc58.91", "encoder_delay": 576, "encoder_padding": 1287, "frames": 2, "header": "Info", "lame_ath_type": 0, "lame_flags": 0, "length": 599, "lowpass_filter": 0, "misc": 0, "mp3_gain": 0, "music_crc": 25328, "present_flags": { "bytes": true, "frames": true, "quality": true, "toc": true, "unused": 0 }, "preset": 0, "quality": 0, "radio_replay_gain": 0, "replay_gain_peak": 0, "tag_crc": 23093, "tag_revision": 0, "toc": [ 0, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ], "vbr_method": 0 } }, { "audio_data": "\u0007\ufffdÎ3\ufffd\ufffdd\ufffd\ufffd\ufffd\b\u001cX\u001f^\u001f\u0018\u001cF\u0004\u001e\ufffd\ufffd\ufffd.Z\u000f\ufffd;\u0013k\ufffd\ufffd`P\u0014\u0004\u0003\u0002\ufffdD\fNhѣl\u001fx\ufffd\u0010\u000418?\ufffd\u0007Nt\ufffd\ufffd_\ufffdr\ufffd\ufffd\ufffdw.\u000f\ufffd\ufffd\ufffd|\u0010\fJ\u0000\ufffd\ufffd \u0001\ufffd\ufffd\ufffdy\ufffd\ufffdxO\ufffd\u000f)\u0007\\\ufffd7Q`\ufffd\"\ufffdj\ufffd\u001a~\ufffdU3n/\ufffd&\ufffd\ufffd\n$&\u001b=\u0004pT{J\ufffd\u00196\u001e\ufffd&\ufffd\u007f\ufffd\u0014\ufffd\u000b\rb\u007f\ufffd\ufffd\ufffd!F9G\ufffd\t\ufffd*\u001a\n\u0005}\u001e\u0005\u0004H\ufffdg~\ufffd\ufffd\ufffd!\u0013BA/\ufffd\ufffd\ufffdI\ufffdֵ\t\u0004@\ufffd\ufffdJ\ufffd\ufffd\u0011", "crc_calculated": "e5b0", "header": { "bitrate": 64000, "channel_mode": "none", "channels": "mono", "copyright": 0, "emphasis": "none", "layer": 3, "mpeg_version": "1", "original": 1, "padding": "not_padded", "private": 0, "protection_absent": true, "sample_count": 1152, "sample_rate": 44100, "sync": 2047 }, "side_info": { "granules": [ [ { "big_values": 33, "block_type": "start block", "blocksplit_flag": 1, "count1table_select": 0, "global_gain": 151, "part2_3_length": 651, "preflag": 0, "scalefac_compress": 2, "scalefac_scale": 0, "subblock_gain0": 0, "subblock_gain1": 0, "subblock_gain2": 0, "switch_point": 0, "table_select0": 25, "table_select1": 9 } ], [ { "big_values": 77, "block_type": "3 short windows", "blocksplit_flag": 1, "count1table_select": 0, "global_gain": 172, "part2_3_length": 769, "preflag": 0, "scalefac_compress": 9, "scalefac_scale": 0, "subblock_gain0": 0, "subblock_gain1": 0, "subblock_gain2": 0, "switch_point": 0, "table_select0": 24, "table_select1": 8 } ] ], "main_data_begin": 0, "scfsi0": 0, "share": 0 } }, { "audio_data": "\u0011K6J\b\ufffdX\ufffd \ufffd)R\ufffd\ufffd\ufffd\ufffd\u0013\ufffd@$\ufffd\ufffd#BPV\r\u0018\u0011\u0003AްU`\ufffdDx\ufffdv\n\ufffd?\ufffdN\ufffdr\ufffd\ufffd5*ugb/\ufffdW\ufffd=Ŀ\ufffd\ufffd\u0012LAME3.100\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd", "crc_calculated": "61fd", "header": { "bitrate": 64000, "channel_mode": "none", "channels": "mono", "copyright": 0, "emphasis": "none", "layer": 3, "mpeg_version": "1", "original": 1, "padding": "padded", "private": 0, "protection_absent": true, "sample_count": 1152, "sample_rate": 44100, "sync": 2047 }, "side_info": { "granules": [ [ { "big_values": 28, "block_type": "end", "blocksplit_flag": 1, "count1table_select": 0, "global_gain": 148, "part2_3_length": 581, "preflag": 0, "scalefac_compress": 9, "scalefac_scale": 0, "subblock_gain0": 0, "subblock_gain1": 0, "subblock_gain2": 0, "switch_point": 0, "table_select0": 12, "table_select1": 6 } ], [ { "big_values": 0, "blocksplit_flag": 0, "count1table_select": 0, "global_gain": 210, "part2_3_length": 0, "preflag": 1, "region_address1": 0, "region_address2": 0, "scalefac_compress": 0, "scalefac_scale": 0, "table_select0": 0, "table_select1": 0, "table_select2": 0 } ] ], "main_data_begin": 9, "scfsi0": 15, "share": 0 } } ], "headers": [ 1 ] } mp3> .headers.a |= empty error: expected an object with key "a" but got: array mp3> .headers[0] |= empty { "footers": [], "frames": [ { "audio_data": "\u0000\u0000\u0000\u0000\u0000", "crc_calculated": "827a", "header": { "bitrate": 56000, "channel_mode": "none", "channels": "mono", "copyright": 0, "emphasis": "none", "layer": 3, "mpeg_version": "1", "original": 0, "padding": "not_padded", "private": 0, "protection_absent": true, "sample_count": 1152, "sample_rate": 44100, "sync": 2047 }, "side_info": { "granules": [ [ { "big_values": 0, "blocksplit_flag": 0, "count1table_select": 0, "global_gain": 0, "part2_3_length": 0, "preflag": 0, "region_address1": 0, "region_address2": 0, "scalefac_compress": 0, "scalefac_scale": 0, "table_select0": 0, "table_select1": 0, "table_select2": 0 } ], [ { "big_values": 0, "blocksplit_flag": 0, "count1table_select": 0, "global_gain": 0, "part2_3_length": 0, "preflag": 0, "region_address1": 0, "region_address2": 0, "scalefac_compress": 0, "scalefac_scale": 0, "table_select0": 0, "table_select1": 0, "table_select2": 0 } ] ], "main_data_begin": 0, "scfsi0": 0, "share": 0 }, "tags": { "abr_vbr": 0, "audiophile_replay_gain": 0, "bytes": 599, "encoder": "Lavc58.91", "encoder_delay": 576, "encoder_padding": 1287, "frames": 2, "header": "Info", "lame_ath_type": 0, "lame_flags": 0, "length": 599, "lowpass_filter": 0, "misc": 0, "mp3_gain": 0, "music_crc": 25328, "present_flags": { "bytes": true, "frames": true, "quality": true, "toc": true, "unused": 0 }, "preset": 0, "quality": 0, "radio_replay_gain": 0, "replay_gain_peak": 0, "tag_crc": 23093, "tag_revision": 0, "toc": [ 0, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 ], "vbr_method": 0 } }, { "audio_data": "\u0007\ufffdÎ3\ufffd\ufffdd\ufffd\ufffd\ufffd\b\u001cX\u001f^\u001f\u0018\u001cF\u0004\u001e\ufffd\ufffd\ufffd.Z\u000f\ufffd;\u0013k\ufffd\ufffd`P\u0014\u0004\u0003\u0002\ufffdD\fNhѣl\u001fx\ufffd\u0010\u000418?\ufffd\u0007Nt\ufffd\ufffd_\ufffdr\ufffd\ufffd\ufffdw.\u000f\ufffd\ufffd\ufffd|\u0010\fJ\u0000\ufffd\ufffd \u0001\ufffd\ufffd\ufffdy\ufffd\ufffdxO\ufffd\u000f)\u0007\\\ufffd7Q`\ufffd\"\ufffdj\ufffd\u001a~\ufffdU3n/\ufffd&\ufffd\ufffd\n$&\u001b=\u0004pT{J\ufffd\u00196\u001e\ufffd&\ufffd\u007f\ufffd\u0014\ufffd\u000b\rb\u007f\ufffd\ufffd\ufffd!F9G\ufffd\t\ufffd*\u001a\n\u0005}\u001e\u0005\u0004H\ufffdg~\ufffd\ufffd\ufffd!\u0013BA/\ufffd\ufffd\ufffdI\ufffdֵ\t\u0004@\ufffd\ufffdJ\ufffd\ufffd\u0011", "crc_calculated": "e5b0", "header": { "bitrate": 64000, "channel_mode": "none", "channels": "mono", "copyright": 0, "emphasis": "none", "layer": 3, "mpeg_version": "1", "original": 1, "padding": "not_padded", "private": 0, "protection_absent": true, "sample_count": 1152, "sample_rate": 44100, "sync": 2047 }, "side_info": { "granules": [ [ { "big_values": 33, "block_type": "start block", "blocksplit_flag": 1, "count1table_select": 0, "global_gain": 151, "part2_3_length": 651, "preflag": 0, "scalefac_compress": 2, "scalefac_scale": 0, "subblock_gain0": 0, "subblock_gain1": 0, "subblock_gain2": 0, "switch_point": 0, "table_select0": 25, "table_select1": 9 } ], [ { "big_values": 77, "block_type": "3 short windows", "blocksplit_flag": 1, "count1table_select": 0, "global_gain": 172, "part2_3_length": 769, "preflag": 0, "scalefac_compress": 9, "scalefac_scale": 0, "subblock_gain0": 0, "subblock_gain1": 0, "subblock_gain2": 0, "switch_point": 0, "table_select0": 24, "table_select1": 8 } ] ], "main_data_begin": 0, "scfsi0": 0, "share": 0 } }, { "audio_data": "\u0011K6J\b\ufffdX\ufffd \ufffd)R\ufffd\ufffd\ufffd\ufffd\u0013\ufffd@$\ufffd\ufffd#BPV\r\u0018\u0011\u0003AްU`\ufffdDx\ufffdv\n\ufffd?\ufffdN\ufffdr\ufffd\ufffd5*ugb/\ufffdW\ufffd=Ŀ\ufffd\ufffd\u0012LAME3.100\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd", "crc_calculated": "61fd", "header": { "bitrate": 64000, "channel_mode": "none", "channels": "mono", "copyright": 0, "emphasis": "none", "layer": 3, "mpeg_version": "1", "original": 1, "padding": "padded", "private": 0, "protection_absent": true, "sample_count": 1152, "sample_rate": 44100, "sync": 2047 }, "side_info": { "granules": [ [ { "big_values": 28, "block_type": "end", "blocksplit_flag": 1, "count1table_select": 0, "global_gain": 148, "part2_3_length": 581, "preflag": 0, "scalefac_compress": 9, "scalefac_scale": 0, "subblock_gain0": 0, "subblock_gain1": 0, "subblock_gain2": 0, "switch_point": 0, "table_select0": 12, "table_select1": 6 } ], [ { "big_values": 0, "blocksplit_flag": 0, "count1table_select": 0, "global_gain": 210, "part2_3_length": 0, "preflag": 1, "region_address1": 0, "region_address2": 0, "scalefac_compress": 0, "scalefac_scale": 0, "table_select0": 0, "table_select1": 0, "table_select2": 0 } ] ], "main_data_begin": 9, "scfsi0": 15, "share": 0 } } ], "headers": [] } mp3> .headers | setpath(["a"]; 1) error: expected an object but got: array ([{"flags":{"experimental_ ...]) mp3> .headers | setpath([0]; 1) [ 1 ] mp3> .headers | delpaths([["a"]]) error: expected an object but got: array ([{"flags":{"experimental_ ...]) mp3> .headers | delpaths([[0]]) [] mp3> ^D