Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -401,14 +401,25 @@ String buildRelativeDir(ResponseSongFileChunk chunk) {
}

private static void appendDir(StringBuilder sb, String name) {
String dir = Utilities.removeInvalidFileCharacters(name).trim();
String dir = safeName(name).trim();
if (!dir.isEmpty()) {
sb.append(dir).append('/');
}
}

/** The song's file name, or its title if that leaves nothing. */
static String buildFileName(ResponseSongFileChunk chunk) {
return Utilities.removeInvalidFileCharacters(chunk.getSongMetadata().getFilename());
String name = safeName(chunk.getSongMetadata().getFilename());
return name.isEmpty() ? safeName(chunk.getSongMetadata().getTitle()) : name;
}

/**
* [name] without the characters file names can't have. A name of only dots, such as "..", is
* dropped too, so no song is saved outside the download location.
*/
private static String safeName(String name) {
String safe = Utilities.removeInvalidFileCharacters(name);
return safe.trim().matches("\\.*") ? "" : safe;
}

public DownloadItem getItem() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,21 @@ public void emptyTagsDoNotMakeEmptyFolders() {
assertEquals("", downloader.buildRelativeDir(chunk("", "", "")));
}

@Test
public void savesNothingOutsideTheDownloadLocation() {
ClementineSongDownloader downloader = new ClementineSongDownloader();
downloader.setCreateArtistDir(true);
downloader.setCreateAlbumDir(true);
downloader.setIsPlaylist(true, "...");
downloader.setCreatePlaylistDir(true);
assertEquals("", downloader.buildRelativeDir(chunk("..", "", " .. ")));

ResponseSongFileChunk chunk = ResponseSongFileChunk.newBuilder()
.setSongMetadata(SongMetadata.newBuilder().setFilename("..").setTitle("Aria"))
.build();
assertEquals("Aria", ClementineSongDownloader.buildFileName(chunk));
}

@Test
public void unknownFileTypesAreSavedAsAudio() {
assertEquals("audio/mpeg", MediaStoreDownloadStorage.mimeType("song"));
Expand Down
Loading