mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-10-20 22:41:38 +02:00
Move full and incremental ingestion, source snapshots, path keys, and download exclusion to native transactions. Preserve schema 17, FTS, WAL coordination, cancellation, and Android SAF timestamp backfill.
992 lines
33 KiB
JSON
992 lines
33 KiB
JSON
{
|
|
"rows": [
|
|
{
|
|
"input": {
|
|
"id": "row",
|
|
"trackName": " CAFÉ İ 💫 ",
|
|
"artistName": "Artist",
|
|
"albumName": "Album",
|
|
"filePath": "/music/a.flac",
|
|
"scannedAt": "2026-10-06T12:00:00.000Z"
|
|
},
|
|
"expected": {
|
|
"id": "row",
|
|
"track_name": " CAFÉ İ 💫 ",
|
|
"artist_name": "Artist",
|
|
"album_name": "Album",
|
|
"album_artist": null,
|
|
"file_path": "/music/a.flac",
|
|
"cover_path": null,
|
|
"scanned_at": "2026-10-06T12:00:00.000Z",
|
|
"file_mod_time": null,
|
|
"isrc": null,
|
|
"track_number": null,
|
|
"total_tracks": null,
|
|
"disc_number": null,
|
|
"total_discs": null,
|
|
"duration": null,
|
|
"release_date": null,
|
|
"bit_depth": null,
|
|
"sample_rate": null,
|
|
"bitrate": null,
|
|
"genre": null,
|
|
"composer": null,
|
|
"label": null,
|
|
"copyright": null,
|
|
"format": null,
|
|
"source_id": "source",
|
|
"explicit": 0,
|
|
"has_lyrics": 0,
|
|
"has_replaygain": 0,
|
|
"audio_metadata_scan_version": 4,
|
|
"track_name_norm": "café i 💫",
|
|
"artist_name_norm": "artist",
|
|
"album_name_norm": "album",
|
|
"album_artist_norm": "artist",
|
|
"match_key": "café i 💫|artist",
|
|
"album_key": "album|artist",
|
|
"search_text": "café i 💫 artist album artist",
|
|
"sort_genre": "",
|
|
"sort_release": "",
|
|
"sort_added": 1791288000000
|
|
}
|
|
},
|
|
{
|
|
"input": {
|
|
"id": "row",
|
|
"trackName": " CAFÉ İ 💫 ",
|
|
"artistName": "Artist",
|
|
"albumName": "Album",
|
|
"filePath": "/music/a.flac",
|
|
"scannedAt": "2026-10-06T12:00:00.000Z",
|
|
"albumArtist": ""
|
|
},
|
|
"expected": {
|
|
"id": "row",
|
|
"track_name": " CAFÉ İ 💫 ",
|
|
"artist_name": "Artist",
|
|
"album_name": "Album",
|
|
"album_artist": "",
|
|
"file_path": "/music/a.flac",
|
|
"cover_path": null,
|
|
"scanned_at": "2026-10-06T12:00:00.000Z",
|
|
"file_mod_time": null,
|
|
"isrc": null,
|
|
"track_number": null,
|
|
"total_tracks": null,
|
|
"disc_number": null,
|
|
"total_discs": null,
|
|
"duration": null,
|
|
"release_date": null,
|
|
"bit_depth": null,
|
|
"sample_rate": null,
|
|
"bitrate": null,
|
|
"genre": null,
|
|
"composer": null,
|
|
"label": null,
|
|
"copyright": null,
|
|
"format": null,
|
|
"source_id": "source",
|
|
"explicit": 0,
|
|
"has_lyrics": 0,
|
|
"has_replaygain": 0,
|
|
"audio_metadata_scan_version": 4,
|
|
"track_name_norm": "café i 💫",
|
|
"artist_name_norm": "artist",
|
|
"album_name_norm": "album",
|
|
"album_artist_norm": "",
|
|
"match_key": "café i 💫|artist",
|
|
"album_key": "album|",
|
|
"search_text": "café i 💫 artist album artist",
|
|
"sort_genre": "",
|
|
"sort_release": "",
|
|
"sort_added": 1791288000000
|
|
}
|
|
},
|
|
{
|
|
"input": {
|
|
"id": "row",
|
|
"trackName": " CAFÉ İ 💫 ",
|
|
"artistName": "Artist",
|
|
"albumName": "Album",
|
|
"filePath": "/music/a.flac",
|
|
"scannedAt": "2026-10-06T12:00:00.000Z",
|
|
"albumArtist": " Other ",
|
|
"explicit": 1.0,
|
|
"hasLyrics": true,
|
|
"hasReplayGain": 1
|
|
},
|
|
"expected": {
|
|
"id": "row",
|
|
"track_name": " CAFÉ İ 💫 ",
|
|
"artist_name": "Artist",
|
|
"album_name": "Album",
|
|
"album_artist": " Other ",
|
|
"file_path": "/music/a.flac",
|
|
"cover_path": null,
|
|
"scanned_at": "2026-10-06T12:00:00.000Z",
|
|
"file_mod_time": null,
|
|
"isrc": null,
|
|
"track_number": null,
|
|
"total_tracks": null,
|
|
"disc_number": null,
|
|
"total_discs": null,
|
|
"duration": null,
|
|
"release_date": null,
|
|
"bit_depth": null,
|
|
"sample_rate": null,
|
|
"bitrate": null,
|
|
"genre": null,
|
|
"composer": null,
|
|
"label": null,
|
|
"copyright": null,
|
|
"format": null,
|
|
"source_id": "source",
|
|
"explicit": 1,
|
|
"has_lyrics": 1,
|
|
"has_replaygain": 1,
|
|
"audio_metadata_scan_version": 4,
|
|
"track_name_norm": "café i 💫",
|
|
"artist_name_norm": "artist",
|
|
"album_name_norm": "album",
|
|
"album_artist_norm": "other",
|
|
"match_key": "café i 💫|artist",
|
|
"album_key": "album|other",
|
|
"search_text": "café i 💫 artist album other",
|
|
"sort_genre": "",
|
|
"sort_release": "",
|
|
"sort_added": 1791288000000
|
|
}
|
|
},
|
|
{
|
|
"input": {
|
|
"id": "row",
|
|
"trackName": " CAFÉ İ 💫 ",
|
|
"artistName": "Artist",
|
|
"albumName": "Album",
|
|
"filePath": "/music/a.flac",
|
|
"scannedAt": "2026-10-06T12:00:00.000Z",
|
|
"metadataFromFilename": true,
|
|
"fileModTime": 0,
|
|
"genre": " Rock ",
|
|
"releaseDate": " 2026-10 "
|
|
},
|
|
"expected": {
|
|
"id": "row",
|
|
"track_name": " CAFÉ İ 💫 ",
|
|
"artist_name": "Artist",
|
|
"album_name": "Album",
|
|
"album_artist": null,
|
|
"file_path": "/music/a.flac",
|
|
"cover_path": null,
|
|
"scanned_at": "2026-10-06T12:00:00.000Z",
|
|
"file_mod_time": 0,
|
|
"isrc": null,
|
|
"track_number": null,
|
|
"total_tracks": null,
|
|
"disc_number": null,
|
|
"total_discs": null,
|
|
"duration": null,
|
|
"release_date": " 2026-10 ",
|
|
"bit_depth": null,
|
|
"sample_rate": null,
|
|
"bitrate": null,
|
|
"genre": " Rock ",
|
|
"composer": null,
|
|
"label": null,
|
|
"copyright": null,
|
|
"format": null,
|
|
"source_id": "source",
|
|
"explicit": 0,
|
|
"has_lyrics": 0,
|
|
"has_replaygain": 0,
|
|
"audio_metadata_scan_version": 0,
|
|
"track_name_norm": "café i 💫",
|
|
"artist_name_norm": "artist",
|
|
"album_name_norm": "album",
|
|
"album_artist_norm": "artist",
|
|
"match_key": "café i 💫|artist",
|
|
"album_key": "album|artist",
|
|
"search_text": "café i 💫 artist album artist",
|
|
"sort_genre": "rock",
|
|
"sort_release": "2026-10",
|
|
"sort_added": 0
|
|
}
|
|
},
|
|
{
|
|
"input": {
|
|
"id": "row",
|
|
"trackName": " CAFÉ İ 💫 ",
|
|
"artistName": "Artist",
|
|
"albumName": "Album",
|
|
"filePath": "/music/a.flac",
|
|
"scannedAt": "2026-10-06T12:00:00.000Z",
|
|
"audioMetadataScanVersion": 2.9,
|
|
"fileModTime": 1770000000000.9,
|
|
"replaygain_track_gain": " -4.5 DB "
|
|
},
|
|
"expected": {
|
|
"id": "row",
|
|
"track_name": " CAFÉ İ 💫 ",
|
|
"artist_name": "Artist",
|
|
"album_name": "Album",
|
|
"album_artist": null,
|
|
"file_path": "/music/a.flac",
|
|
"cover_path": null,
|
|
"scanned_at": "2026-10-06T12:00:00.000Z",
|
|
"file_mod_time": 1770000000000.9,
|
|
"isrc": null,
|
|
"track_number": null,
|
|
"total_tracks": null,
|
|
"disc_number": null,
|
|
"total_discs": null,
|
|
"duration": null,
|
|
"release_date": null,
|
|
"bit_depth": null,
|
|
"sample_rate": null,
|
|
"bitrate": null,
|
|
"genre": null,
|
|
"composer": null,
|
|
"label": null,
|
|
"copyright": null,
|
|
"format": null,
|
|
"source_id": "source",
|
|
"explicit": 0,
|
|
"has_lyrics": 0,
|
|
"has_replaygain": 1,
|
|
"audio_metadata_scan_version": 2,
|
|
"track_name_norm": "café i 💫",
|
|
"artist_name_norm": "artist",
|
|
"album_name_norm": "album",
|
|
"album_artist_norm": "artist",
|
|
"match_key": "café i 💫|artist",
|
|
"album_key": "album|artist",
|
|
"search_text": "café i 💫 artist album artist",
|
|
"sort_genre": "",
|
|
"sort_release": "",
|
|
"sort_added": 1770000000000
|
|
}
|
|
},
|
|
{
|
|
"input": {
|
|
"id": "row",
|
|
"trackName": " CAFÉ İ 💫 ",
|
|
"artistName": "Artist",
|
|
"albumName": "Album",
|
|
"filePath": "/music/a.flac",
|
|
"scannedAt": "invalid",
|
|
"replaygain_album_gain": "NaN"
|
|
},
|
|
"expected": {
|
|
"id": "row",
|
|
"track_name": " CAFÉ İ 💫 ",
|
|
"artist_name": "Artist",
|
|
"album_name": "Album",
|
|
"album_artist": null,
|
|
"file_path": "/music/a.flac",
|
|
"cover_path": null,
|
|
"scanned_at": "invalid",
|
|
"file_mod_time": null,
|
|
"isrc": null,
|
|
"track_number": null,
|
|
"total_tracks": null,
|
|
"disc_number": null,
|
|
"total_discs": null,
|
|
"duration": null,
|
|
"release_date": null,
|
|
"bit_depth": null,
|
|
"sample_rate": null,
|
|
"bitrate": null,
|
|
"genre": null,
|
|
"composer": null,
|
|
"label": null,
|
|
"copyright": null,
|
|
"format": null,
|
|
"source_id": "source",
|
|
"explicit": 0,
|
|
"has_lyrics": 0,
|
|
"has_replaygain": 0,
|
|
"audio_metadata_scan_version": 4,
|
|
"track_name_norm": "café i 💫",
|
|
"artist_name_norm": "artist",
|
|
"album_name_norm": "album",
|
|
"album_artist_norm": "artist",
|
|
"match_key": "café i 💫|artist",
|
|
"album_key": "album|artist",
|
|
"search_text": "café i 💫 artist album artist",
|
|
"sort_genre": "",
|
|
"sort_release": "",
|
|
"sort_added": 0
|
|
}
|
|
},
|
|
{
|
|
"input": {
|
|
"id": "row",
|
|
"trackName": "",
|
|
"artistName": "",
|
|
"albumName": "",
|
|
"filePath": "/music/a.flac",
|
|
"scannedAt": "2026-10-06T12:00:00.000Z",
|
|
"replaygain_album_gain": 2.5
|
|
},
|
|
"expected": {
|
|
"id": "row",
|
|
"track_name": "",
|
|
"artist_name": "",
|
|
"album_name": "",
|
|
"album_artist": null,
|
|
"file_path": "/music/a.flac",
|
|
"cover_path": null,
|
|
"scanned_at": "2026-10-06T12:00:00.000Z",
|
|
"file_mod_time": null,
|
|
"isrc": null,
|
|
"track_number": null,
|
|
"total_tracks": null,
|
|
"disc_number": null,
|
|
"total_discs": null,
|
|
"duration": null,
|
|
"release_date": null,
|
|
"bit_depth": null,
|
|
"sample_rate": null,
|
|
"bitrate": null,
|
|
"genre": null,
|
|
"composer": null,
|
|
"label": null,
|
|
"copyright": null,
|
|
"format": null,
|
|
"source_id": "source",
|
|
"explicit": 0,
|
|
"has_lyrics": 0,
|
|
"has_replaygain": 1,
|
|
"audio_metadata_scan_version": 4,
|
|
"track_name_norm": "",
|
|
"artist_name_norm": "",
|
|
"album_name_norm": "",
|
|
"album_artist_norm": "",
|
|
"match_key": "|",
|
|
"album_key": "|",
|
|
"search_text": "",
|
|
"sort_genre": "",
|
|
"sort_release": "",
|
|
"sort_added": 1791288000000
|
|
}
|
|
},
|
|
{
|
|
"input": {
|
|
"id": "row",
|
|
"trackName": " CAFÉ İ 💫 ",
|
|
"artistName": "Artist",
|
|
"albumName": "Album",
|
|
"filePath": "/music/a.flac",
|
|
"scannedAt": "2026-10-06T19:00:00.123456+07:00",
|
|
"explicit": false,
|
|
"hasLyrics": 0
|
|
},
|
|
"expected": {
|
|
"id": "row",
|
|
"track_name": " CAFÉ İ 💫 ",
|
|
"artist_name": "Artist",
|
|
"album_name": "Album",
|
|
"album_artist": null,
|
|
"file_path": "/music/a.flac",
|
|
"cover_path": null,
|
|
"scanned_at": "2026-10-06T19:00:00.123456+07:00",
|
|
"file_mod_time": null,
|
|
"isrc": null,
|
|
"track_number": null,
|
|
"total_tracks": null,
|
|
"disc_number": null,
|
|
"total_discs": null,
|
|
"duration": null,
|
|
"release_date": null,
|
|
"bit_depth": null,
|
|
"sample_rate": null,
|
|
"bitrate": null,
|
|
"genre": null,
|
|
"composer": null,
|
|
"label": null,
|
|
"copyright": null,
|
|
"format": null,
|
|
"source_id": "source",
|
|
"explicit": 0,
|
|
"has_lyrics": 0,
|
|
"has_replaygain": 0,
|
|
"audio_metadata_scan_version": 4,
|
|
"track_name_norm": "café i 💫",
|
|
"artist_name_norm": "artist",
|
|
"album_name_norm": "album",
|
|
"album_artist_norm": "artist",
|
|
"match_key": "café i 💫|artist",
|
|
"album_key": "album|artist",
|
|
"search_text": "café i 💫 artist album artist",
|
|
"sort_genre": "",
|
|
"sort_release": "",
|
|
"sort_added": 1791288000123
|
|
}
|
|
},
|
|
{
|
|
"input": {
|
|
"id": "row",
|
|
"trackName": " CAFÉ İ 💫 ",
|
|
"artistName": "Artist",
|
|
"albumName": "Album",
|
|
"filePath": "/music/a.flac",
|
|
"scannedAt": "20261006T120000.123456789z"
|
|
},
|
|
"expected": {
|
|
"id": "row",
|
|
"track_name": " CAFÉ İ 💫 ",
|
|
"artist_name": "Artist",
|
|
"album_name": "Album",
|
|
"album_artist": null,
|
|
"file_path": "/music/a.flac",
|
|
"cover_path": null,
|
|
"scanned_at": "20261006T120000.123456789z",
|
|
"file_mod_time": null,
|
|
"isrc": null,
|
|
"track_number": null,
|
|
"total_tracks": null,
|
|
"disc_number": null,
|
|
"total_discs": null,
|
|
"duration": null,
|
|
"release_date": null,
|
|
"bit_depth": null,
|
|
"sample_rate": null,
|
|
"bitrate": null,
|
|
"genre": null,
|
|
"composer": null,
|
|
"label": null,
|
|
"copyright": null,
|
|
"format": null,
|
|
"source_id": "source",
|
|
"explicit": 0,
|
|
"has_lyrics": 0,
|
|
"has_replaygain": 0,
|
|
"audio_metadata_scan_version": 4,
|
|
"track_name_norm": "café i 💫",
|
|
"artist_name_norm": "artist",
|
|
"album_name_norm": "album",
|
|
"album_artist_norm": "artist",
|
|
"match_key": "café i 💫|artist",
|
|
"album_key": "album|artist",
|
|
"search_text": "café i 💫 artist album artist",
|
|
"sort_genre": "",
|
|
"sort_release": "",
|
|
"sort_added": 1791288000123
|
|
}
|
|
},
|
|
{
|
|
"input": {
|
|
"id": "row",
|
|
"trackName": "ΑΒΣ İ",
|
|
"artistName": "Artist",
|
|
"albumName": "Album",
|
|
"filePath": "/music/a.flac",
|
|
"scannedAt": "2026-10-32T25:61:00Z"
|
|
},
|
|
"expected": {
|
|
"id": "row",
|
|
"track_name": "ΑΒΣ İ",
|
|
"artist_name": "Artist",
|
|
"album_name": "Album",
|
|
"album_artist": null,
|
|
"file_path": "/music/a.flac",
|
|
"cover_path": null,
|
|
"scanned_at": "2026-10-32T25:61:00Z",
|
|
"file_mod_time": null,
|
|
"isrc": null,
|
|
"track_number": null,
|
|
"total_tracks": null,
|
|
"disc_number": null,
|
|
"total_discs": null,
|
|
"duration": null,
|
|
"release_date": null,
|
|
"bit_depth": null,
|
|
"sample_rate": null,
|
|
"bitrate": null,
|
|
"genre": null,
|
|
"composer": null,
|
|
"label": null,
|
|
"copyright": null,
|
|
"format": null,
|
|
"source_id": "source",
|
|
"explicit": 0,
|
|
"has_lyrics": 0,
|
|
"has_replaygain": 0,
|
|
"audio_metadata_scan_version": 4,
|
|
"track_name_norm": "αβσ i",
|
|
"artist_name_norm": "artist",
|
|
"album_name_norm": "album",
|
|
"album_artist_norm": "artist",
|
|
"match_key": "αβσ i|artist",
|
|
"album_key": "album|artist",
|
|
"search_text": "αβσ i artist album artist",
|
|
"sort_genre": "",
|
|
"sort_release": "",
|
|
"sort_added": 1793584860000
|
|
}
|
|
}
|
|
],
|
|
"paths": [
|
|
{
|
|
"input": "",
|
|
"expected": []
|
|
},
|
|
{
|
|
"input": " EXISTS: /Music/Café 01.FLAC ",
|
|
"expected": [
|
|
"/Music/Café 01",
|
|
"/Music/Café 01.FLAC",
|
|
"/music/café 01",
|
|
"/music/café 01.flac",
|
|
"file:///Music/Caf%C3%A9%2001",
|
|
"file:///Music/Caf%C3%A9%2001.FLAC",
|
|
"file:///music/caf%c3%a9%2001",
|
|
"file:///music/caf%c3%a9%2001.flac"
|
|
]
|
|
},
|
|
{
|
|
"input": "/a/../b/song.flac",
|
|
"expected": [
|
|
"/a/../b/song",
|
|
"/a/../b/song.flac",
|
|
"file:///b/song",
|
|
"file:///b/song.flac"
|
|
]
|
|
},
|
|
{
|
|
"input": "/Music/100%25/song.opus",
|
|
"expected": [
|
|
"/Music/100%/song",
|
|
"/Music/100%/song.opus",
|
|
"/Music/100%25/song",
|
|
"/Music/100%25/song.opus",
|
|
"/music/100%/song",
|
|
"/music/100%/song.opus",
|
|
"/music/100%25/song",
|
|
"/music/100%25/song.opus",
|
|
"file:///Music/100%25/song",
|
|
"file:///Music/100%25/song.opus",
|
|
"file:///Music/100%2525/song",
|
|
"file:///Music/100%2525/song.opus",
|
|
"file:///music/100%25/song",
|
|
"file:///music/100%25/song.opus",
|
|
"file:///music/100%2525/song",
|
|
"file:///music/100%2525/song.opus"
|
|
]
|
|
},
|
|
{
|
|
"input": "/Music/100%zz.flac",
|
|
"expected": [
|
|
"/Music/100%zz",
|
|
"/Music/100%zz.flac",
|
|
"/music/100%zz",
|
|
"/music/100%zz.flac",
|
|
"file:///Music/100%25zz",
|
|
"file:///Music/100%25zz.flac",
|
|
"file:///music/100%25zz",
|
|
"file:///music/100%25zz.flac"
|
|
]
|
|
},
|
|
{
|
|
"input": "/Music/💫 track.wav",
|
|
"expected": [
|
|
"/Music/💫 track",
|
|
"/Music/💫 track.wav",
|
|
"/music/💫 track",
|
|
"/music/💫 track.wav",
|
|
"file:///Music/%F0%9F%92%AB%20track",
|
|
"file:///Music/%F0%9F%92%AB%20track.wav",
|
|
"file:///music/%f0%9f%92%ab%20track",
|
|
"file:///music/%f0%9f%92%ab%20track.wav"
|
|
]
|
|
},
|
|
{
|
|
"input": "/Music/a#b.flac",
|
|
"expected": [
|
|
"/Music/a#b",
|
|
"/Music/a#b.flac",
|
|
"/music/a#b",
|
|
"/music/a#b.flac",
|
|
"file:///Music/a%23b",
|
|
"file:///Music/a%23b.flac",
|
|
"file:///music/a%23b",
|
|
"file:///music/a%23b.flac"
|
|
]
|
|
},
|
|
{
|
|
"input": "/Music/a?b.mp3",
|
|
"expected": [
|
|
"/Music/a?b",
|
|
"/Music/a?b.mp3",
|
|
"/music/a?b",
|
|
"/music/a?b.mp3",
|
|
"file:///Music/a%3Fb",
|
|
"file:///Music/a%3Fb.mp3",
|
|
"file:///music/a%3fb",
|
|
"file:///music/a%3fb.mp3"
|
|
]
|
|
},
|
|
{
|
|
"input": "/Music/a\\b.flac",
|
|
"expected": [
|
|
"/Music/a/b",
|
|
"/Music/a/b.flac",
|
|
"/Music/a\\b",
|
|
"/Music/a\\b.flac",
|
|
"/music/a/b",
|
|
"/music/a/b.flac",
|
|
"/music/a\\b",
|
|
"/music/a\\b.flac",
|
|
"file:///Music/a%5Cb",
|
|
"file:///Music/a%5Cb.flac",
|
|
"file:///Music/a/b",
|
|
"file:///Music/a/b.flac",
|
|
"file:///music/a%5cb",
|
|
"file:///music/a%5cb.flac",
|
|
"file:///music/a/b",
|
|
"file:///music/a/b.flac"
|
|
]
|
|
},
|
|
{
|
|
"input": "C:\\Music\\Hello.flac",
|
|
"expected": [
|
|
"C:/Music/Hello",
|
|
"C:/Music/Hello.flac",
|
|
"C:\\Music\\Hello",
|
|
"C:\\Music\\Hello.flac",
|
|
"c:/Music/Hello",
|
|
"c:/Music/Hello.flac",
|
|
"c:/music/hello",
|
|
"c:/music/hello.flac",
|
|
"c:\\music\\hello",
|
|
"c:\\music\\hello.flac"
|
|
]
|
|
},
|
|
{
|
|
"input": "file:///music/a%20b.flac",
|
|
"expected": [
|
|
"/music/a b",
|
|
"/music/a b.flac",
|
|
"file:///music/a b",
|
|
"file:///music/a b.flac",
|
|
"file:///music/a%20b",
|
|
"file:///music/a%20b.flac"
|
|
]
|
|
},
|
|
{
|
|
"input": "file://localhost/music/a.flac",
|
|
"expected": [
|
|
"file://localhost/music/a",
|
|
"file://localhost/music/a.flac"
|
|
]
|
|
},
|
|
{
|
|
"input": "file://localhost",
|
|
"expected": [
|
|
"file://localhost",
|
|
"file://localhost/"
|
|
]
|
|
},
|
|
{
|
|
"input": "file:///music/a.flac?x=1#frag",
|
|
"expected": [
|
|
"file:///music/a.flac?x=1#frag"
|
|
]
|
|
},
|
|
{
|
|
"input": "file:///music/a.flac#frag",
|
|
"expected": [
|
|
"file:///music/a.flac#frag"
|
|
]
|
|
},
|
|
{
|
|
"input": "file:///a/../b/song.flac",
|
|
"expected": [
|
|
"/b/song",
|
|
"/b/song.flac",
|
|
"file:///a/../b/song",
|
|
"file:///a/../b/song.flac",
|
|
"file:///b/song",
|
|
"file:///b/song.flac"
|
|
]
|
|
},
|
|
{
|
|
"input": "file:///music/%7e.flac",
|
|
"expected": [
|
|
"/music/~",
|
|
"/music/~.flac",
|
|
"file:///music/%7e",
|
|
"file:///music/%7e.flac",
|
|
"file:///music/~",
|
|
"file:///music/~.flac"
|
|
]
|
|
},
|
|
{
|
|
"input": "content://nas.provider/document/Ab%252FC.flac",
|
|
"expected": [
|
|
"content://nas.provider/document/Ab%252FC",
|
|
"content://nas.provider/document/Ab%252FC.flac",
|
|
"content://nas.provider/document/Ab%2FC",
|
|
"content://nas.provider/document/Ab%2FC.flac",
|
|
"content://nas.provider/document/Ab/C",
|
|
"content://nas.provider/document/Ab/C.flac",
|
|
"content://nas.provider/document/ab%252fc",
|
|
"content://nas.provider/document/ab%252fc.flac",
|
|
"content://nas.provider/document/ab%2fc",
|
|
"content://nas.provider/document/ab%2fc.flac",
|
|
"content://nas.provider/document/ab/c",
|
|
"content://nas.provider/document/ab/c.flac",
|
|
"saf-document:bmFzLnByb3ZpZGVy:Ab%2FC",
|
|
"saf-document:bmFzLnByb3ZpZGVy:Ab%2FC.flac"
|
|
]
|
|
},
|
|
{
|
|
"input": "content://nas.provider/tree/root/document/Ab%252FC.flac",
|
|
"expected": [
|
|
"content://nas.provider/tree/root/document/Ab%252FC",
|
|
"content://nas.provider/tree/root/document/Ab%252FC.flac",
|
|
"content://nas.provider/tree/root/document/Ab%2FC",
|
|
"content://nas.provider/tree/root/document/Ab%2FC.flac",
|
|
"content://nas.provider/tree/root/document/Ab/C",
|
|
"content://nas.provider/tree/root/document/Ab/C.flac",
|
|
"content://nas.provider/tree/root/document/ab%252fc",
|
|
"content://nas.provider/tree/root/document/ab%252fc.flac",
|
|
"content://nas.provider/tree/root/document/ab%2fc",
|
|
"content://nas.provider/tree/root/document/ab%2fc.flac",
|
|
"content://nas.provider/tree/root/document/ab/c",
|
|
"content://nas.provider/tree/root/document/ab/c.flac",
|
|
"saf-document:bmFzLnByb3ZpZGVy:Ab%2FC",
|
|
"saf-document:bmFzLnByb3ZpZGVy:Ab%2FC.flac"
|
|
]
|
|
},
|
|
{
|
|
"input": "content://NAS.PROVIDER/document/Ab%2FC.flac?x=Y#frag",
|
|
"expected": [
|
|
"content://NAS.PROVIDER/document/Ab%2FC.flac?x=Y#frag",
|
|
"content://NAS.PROVIDER/document/Ab/C.flac?x=Y#frag",
|
|
"content://nas.provider/document/Ab%2FC.flac?x=Y#frag",
|
|
"content://nas.provider/document/Ab/C.flac?x=Y#frag",
|
|
"content://nas.provider/document/ab%2fc.flac?x=y#frag",
|
|
"content://nas.provider/document/ab/c.flac?x=y#frag",
|
|
"saf-document:bmFzLnByb3ZpZGVy:Ab/C",
|
|
"saf-document:bmFzLnByb3ZpZGVy:Ab/C.flac"
|
|
]
|
|
},
|
|
{
|
|
"input": "content://nas.provider/document/AB%20C.flac",
|
|
"expected": [
|
|
"content://nas.provider/document/AB C",
|
|
"content://nas.provider/document/AB C.flac",
|
|
"content://nas.provider/document/AB%20C",
|
|
"content://nas.provider/document/AB%20C.flac",
|
|
"content://nas.provider/document/ab c",
|
|
"content://nas.provider/document/ab c.flac",
|
|
"content://nas.provider/document/ab%20c",
|
|
"content://nas.provider/document/ab%20c.flac",
|
|
"saf-document:bmFzLnByb3ZpZGVy:AB C",
|
|
"saf-document:bmFzLnByb3ZpZGVy:AB C.flac"
|
|
]
|
|
},
|
|
{
|
|
"input": "content://com.android.externalstorage.documents/tree/primary%3AMusic/document/primary%3AMusic%2FCaf%C3%A9.flac",
|
|
"expected": [
|
|
"/mnt/sdcard/Music/Café",
|
|
"/mnt/sdcard/Music/Café.flac",
|
|
"/mnt/sdcard/music/café",
|
|
"/mnt/sdcard/music/café.flac",
|
|
"/sdcard/Music/Café",
|
|
"/sdcard/Music/Café.flac",
|
|
"/sdcard/music/café",
|
|
"/sdcard/music/café.flac",
|
|
"/storage/emulated/0/Music/Café",
|
|
"/storage/emulated/0/Music/Café.flac",
|
|
"/storage/emulated/0/music/café",
|
|
"/storage/emulated/0/music/café.flac",
|
|
"/storage/emulated/legacy/Music/Café",
|
|
"/storage/emulated/legacy/Music/Café.flac",
|
|
"/storage/emulated/legacy/music/café",
|
|
"/storage/emulated/legacy/music/café.flac",
|
|
"/storage/self/primary/Music/Café",
|
|
"/storage/self/primary/Music/Café.flac",
|
|
"/storage/self/primary/music/café",
|
|
"/storage/self/primary/music/café.flac",
|
|
"content://com.android.externalstorage.documents/tree/primary%3AMusic/document/primary%3AMusic%2FCaf%C3%A9",
|
|
"content://com.android.externalstorage.documents/tree/primary%3AMusic/document/primary%3AMusic%2FCaf%C3%A9.flac",
|
|
"content://com.android.externalstorage.documents/tree/primary%3amusic/document/primary%3amusic%2fcaf%c3%a9",
|
|
"content://com.android.externalstorage.documents/tree/primary%3amusic/document/primary%3amusic%2fcaf%c3%a9.flac",
|
|
"content://com.android.externalstorage.documents/tree/primary:Music/document/primary:Music/Caf%C3%A9",
|
|
"content://com.android.externalstorage.documents/tree/primary:Music/document/primary:Music/Caf%C3%A9.flac",
|
|
"content://com.android.externalstorage.documents/tree/primary:Music/document/primary:Music/Café",
|
|
"content://com.android.externalstorage.documents/tree/primary:Music/document/primary:Music/Café.flac",
|
|
"content://com.android.externalstorage.documents/tree/primary:music/document/primary:music/caf%c3%a9",
|
|
"content://com.android.externalstorage.documents/tree/primary:music/document/primary:music/caf%c3%a9.flac",
|
|
"content://com.android.externalstorage.documents/tree/primary:music/document/primary:music/café",
|
|
"content://com.android.externalstorage.documents/tree/primary:music/document/primary:music/café.flac",
|
|
"file:///mnt/sdcard/Music/Caf%C3%A9",
|
|
"file:///mnt/sdcard/Music/Caf%C3%A9.flac",
|
|
"file:///mnt/sdcard/music/caf%c3%a9",
|
|
"file:///mnt/sdcard/music/caf%c3%a9.flac",
|
|
"file:///sdcard/Music/Caf%C3%A9",
|
|
"file:///sdcard/Music/Caf%C3%A9.flac",
|
|
"file:///sdcard/music/caf%c3%a9",
|
|
"file:///sdcard/music/caf%c3%a9.flac",
|
|
"file:///storage/emulated/0/Music/Caf%C3%A9",
|
|
"file:///storage/emulated/0/Music/Caf%C3%A9.flac",
|
|
"file:///storage/emulated/0/music/caf%c3%a9",
|
|
"file:///storage/emulated/0/music/caf%c3%a9.flac",
|
|
"file:///storage/emulated/legacy/Music/Caf%C3%A9",
|
|
"file:///storage/emulated/legacy/Music/Caf%C3%A9.flac",
|
|
"file:///storage/emulated/legacy/music/caf%c3%a9",
|
|
"file:///storage/emulated/legacy/music/caf%c3%a9.flac",
|
|
"file:///storage/self/primary/Music/Caf%C3%A9",
|
|
"file:///storage/self/primary/Music/Caf%C3%A9.flac",
|
|
"file:///storage/self/primary/music/caf%c3%a9",
|
|
"file:///storage/self/primary/music/caf%c3%a9.flac",
|
|
"saf-document:Y29tLmFuZHJvaWQuZXh0ZXJuYWxzdG9yYWdlLmRvY3VtZW50cw==:primary:Music/Café",
|
|
"saf-document:Y29tLmFuZHJvaWQuZXh0ZXJuYWxzdG9yYWdlLmRvY3VtZW50cw==:primary:Music/Café.flac"
|
|
]
|
|
},
|
|
{
|
|
"input": "content://COM.ANDROID.EXTERNALSTORAGE.DOCUMENTS/document/primary%3AMusic%2Fsong.opus",
|
|
"expected": [
|
|
"/mnt/sdcard/Music/song",
|
|
"/mnt/sdcard/Music/song.opus",
|
|
"/mnt/sdcard/music/song",
|
|
"/mnt/sdcard/music/song.opus",
|
|
"/sdcard/Music/song",
|
|
"/sdcard/Music/song.opus",
|
|
"/sdcard/music/song",
|
|
"/sdcard/music/song.opus",
|
|
"/storage/emulated/0/Music/song",
|
|
"/storage/emulated/0/Music/song.opus",
|
|
"/storage/emulated/0/music/song",
|
|
"/storage/emulated/0/music/song.opus",
|
|
"/storage/emulated/legacy/Music/song",
|
|
"/storage/emulated/legacy/Music/song.opus",
|
|
"/storage/emulated/legacy/music/song",
|
|
"/storage/emulated/legacy/music/song.opus",
|
|
"/storage/self/primary/Music/song",
|
|
"/storage/self/primary/Music/song.opus",
|
|
"/storage/self/primary/music/song",
|
|
"/storage/self/primary/music/song.opus",
|
|
"content://COM.ANDROID.EXTERNALSTORAGE.DOCUMENTS/document/primary%3AMusic%2Fsong",
|
|
"content://COM.ANDROID.EXTERNALSTORAGE.DOCUMENTS/document/primary%3AMusic%2Fsong.opus",
|
|
"content://COM.ANDROID.EXTERNALSTORAGE.DOCUMENTS/document/primary:Music/song",
|
|
"content://COM.ANDROID.EXTERNALSTORAGE.DOCUMENTS/document/primary:Music/song.opus",
|
|
"content://com.android.externalstorage.documents/document/primary%3AMusic%2Fsong",
|
|
"content://com.android.externalstorage.documents/document/primary%3AMusic%2Fsong.opus",
|
|
"content://com.android.externalstorage.documents/document/primary%3amusic%2fsong",
|
|
"content://com.android.externalstorage.documents/document/primary%3amusic%2fsong.opus",
|
|
"content://com.android.externalstorage.documents/document/primary:Music/song",
|
|
"content://com.android.externalstorage.documents/document/primary:Music/song.opus",
|
|
"content://com.android.externalstorage.documents/document/primary:music/song",
|
|
"content://com.android.externalstorage.documents/document/primary:music/song.opus",
|
|
"file:///mnt/sdcard/Music/song",
|
|
"file:///mnt/sdcard/Music/song.opus",
|
|
"file:///mnt/sdcard/music/song",
|
|
"file:///mnt/sdcard/music/song.opus",
|
|
"file:///sdcard/Music/song",
|
|
"file:///sdcard/Music/song.opus",
|
|
"file:///sdcard/music/song",
|
|
"file:///sdcard/music/song.opus",
|
|
"file:///storage/emulated/0/Music/song",
|
|
"file:///storage/emulated/0/Music/song.opus",
|
|
"file:///storage/emulated/0/music/song",
|
|
"file:///storage/emulated/0/music/song.opus",
|
|
"file:///storage/emulated/legacy/Music/song",
|
|
"file:///storage/emulated/legacy/Music/song.opus",
|
|
"file:///storage/emulated/legacy/music/song",
|
|
"file:///storage/emulated/legacy/music/song.opus",
|
|
"file:///storage/self/primary/Music/song",
|
|
"file:///storage/self/primary/Music/song.opus",
|
|
"file:///storage/self/primary/music/song",
|
|
"file:///storage/self/primary/music/song.opus",
|
|
"saf-document:Y29tLmFuZHJvaWQuZXh0ZXJuYWxzdG9yYWdlLmRvY3VtZW50cw==:primary:Music/song",
|
|
"saf-document:Y29tLmFuZHJvaWQuZXh0ZXJuYWxzdG9yYWdlLmRvY3VtZW50cw==:primary:Music/song.opus"
|
|
]
|
|
},
|
|
{
|
|
"input": "network://Connection/Music/Track%2520A.flac",
|
|
"expected": [
|
|
"network://Connection/Music/Track A",
|
|
"network://Connection/Music/Track A.flac",
|
|
"network://Connection/Music/Track%20A",
|
|
"network://Connection/Music/Track%20A.flac",
|
|
"network://Connection/Music/Track%2520A",
|
|
"network://Connection/Music/Track%2520A.flac",
|
|
"network://connection/Music/Track%20A",
|
|
"network://connection/Music/Track%20A.flac",
|
|
"network://connection/Music/Track%2520A",
|
|
"network://connection/Music/Track%2520A.flac",
|
|
"network://connection/music/track a",
|
|
"network://connection/music/track a.flac",
|
|
"network://connection/music/track%20a",
|
|
"network://connection/music/track%20a.flac",
|
|
"network://connection/music/track%2520a",
|
|
"network://connection/music/track%2520a.flac"
|
|
]
|
|
},
|
|
{
|
|
"input": "https://EXAMPLE.com/Music/a%7eb.flac?q=x#Y",
|
|
"expected": [
|
|
"https://EXAMPLE.com/Music/a%7eb.flac?q=x#Y",
|
|
"https://EXAMPLE.com/Music/a~b.flac?q=x#Y",
|
|
"https://example.com/Music/a~b.flac?q=x#Y",
|
|
"https://example.com/music/a%7eb.flac?q=x#y",
|
|
"https://example.com/music/a~b.flac?q=x#y"
|
|
]
|
|
},
|
|
{
|
|
"input": "content://provider/document/💫.flac",
|
|
"expected": [
|
|
"content://provider/document/%F0%9F%92%AB",
|
|
"content://provider/document/%F0%9F%92%AB.flac",
|
|
"content://provider/document/%f0%9f%92%ab",
|
|
"content://provider/document/%f0%9f%92%ab.flac",
|
|
"content://provider/document/💫",
|
|
"content://provider/document/💫.flac",
|
|
"saf-document:cHJvdmlkZXI=:💫",
|
|
"saf-document:cHJvdmlkZXI=:💫.flac"
|
|
]
|
|
},
|
|
{
|
|
"input": "content://provider/document/a%zz.flac",
|
|
"expected": [
|
|
"content://provider/document/a%25zz",
|
|
"content://provider/document/a%25zz.flac",
|
|
"content://provider/document/a%zz",
|
|
"content://provider/document/a%zz.flac",
|
|
"saf-document:cHJvdmlkZXI=:a%zz",
|
|
"saf-document:cHJvdmlkZXI=:a%zz.flac"
|
|
]
|
|
},
|
|
{
|
|
"input": "/sdcard/Music/song.flac",
|
|
"expected": [
|
|
"/sdcard/Music/song",
|
|
"/sdcard/Music/song.flac",
|
|
"/sdcard/music/song",
|
|
"/sdcard/music/song.flac",
|
|
"file:///sdcard/Music/song",
|
|
"file:///sdcard/Music/song.flac",
|
|
"file:///sdcard/music/song",
|
|
"file:///sdcard/music/song.flac"
|
|
]
|
|
},
|
|
{
|
|
"input": "/storage/emulated/0/Music/song.opus",
|
|
"expected": [
|
|
"/storage/emulated/0/Music/song",
|
|
"/storage/emulated/0/Music/song.opus",
|
|
"/storage/emulated/0/music/song",
|
|
"/storage/emulated/0/music/song.opus",
|
|
"file:///storage/emulated/0/Music/song",
|
|
"file:///storage/emulated/0/Music/song.opus",
|
|
"file:///storage/emulated/0/music/song",
|
|
"file:///storage/emulated/0/music/song.opus"
|
|
]
|
|
}
|
|
]
|
|
}
|