aboutsummaryrefslogtreecommitdiff
path: root/subsonic-android/src/net/sourceforge/subsonic/androidapp/util/FileUtil.java
diff options
context:
space:
mode:
Diffstat (limited to 'subsonic-android/src/net/sourceforge/subsonic/androidapp/util/FileUtil.java')
-rw-r--r--subsonic-android/src/net/sourceforge/subsonic/androidapp/util/FileUtil.java311
1 files changed, 0 insertions, 311 deletions
diff --git a/subsonic-android/src/net/sourceforge/subsonic/androidapp/util/FileUtil.java b/subsonic-android/src/net/sourceforge/subsonic/androidapp/util/FileUtil.java
deleted file mode 100644
index 88d10d3e..00000000
--- a/subsonic-android/src/net/sourceforge/subsonic/androidapp/util/FileUtil.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- This file is part of Subsonic.
-
- Subsonic is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Subsonic is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Subsonic. If not, see <http://www.gnu.org/licenses/>.
-
- Copyright 2009 (C) Sindre Mehus
- */
-package net.sourceforge.subsonic.androidapp.util;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.util.Arrays;
-import java.util.SortedSet;
-import java.util.TreeSet;
-import java.util.Iterator;
-import java.util.List;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.os.Environment;
-import android.util.Log;
-import net.sourceforge.subsonic.androidapp.domain.MusicDirectory;
-
-/**
- * @author Sindre Mehus
- */
-public class FileUtil {
-
- private static final String TAG = FileUtil.class.getSimpleName();
- private static final String[] FILE_SYSTEM_UNSAFE = {"/", "\\", "..", ":", "\"", "?", "*", "<", ">"};
- private static final String[] FILE_SYSTEM_UNSAFE_DIR = {"\\", "..", ":", "\"", "?", "*", "<", ">"};
- private static final List<String> MUSIC_FILE_EXTENSIONS = Arrays.asList("mp3", "ogg", "aac", "flac", "m4a", "wav", "wma");
- private static final File DEFAULT_MUSIC_DIR = createDirectory("music");
-
- public static File getSongFile(Context context, MusicDirectory.Entry song) {
- File dir = getAlbumDirectory(context, song);
-
- StringBuilder fileName = new StringBuilder();
- Integer track = song.getTrack();
- if (track != null) {
- if (track < 10) {
- fileName.append("0");
- }
- fileName.append(track).append("-");
- }
-
- fileName.append(fileSystemSafe(song.getTitle())).append(".");
-
- if (song.getTranscodedSuffix() != null) {
- fileName.append(song.getTranscodedSuffix());
- } else {
- fileName.append(song.getSuffix());
- }
-
- return new File(dir, fileName.toString());
- }
-
- public static File getPlaylistFile(String id) {
- File playlistDir = getPlaylistDirectory();
- return new File(playlistDir, id);
- }
- public static File getPlaylistDirectory() {
- File playlistDir = new File(getSubsonicDirectory(), "playlists");
- ensureDirectoryExistsAndIsReadWritable(playlistDir);
- return playlistDir;
- }
-
- public static File getAlbumArtFile(Context context, MusicDirectory.Entry entry) {
- File albumDir = getAlbumDirectory(context, entry);
- return getAlbumArtFile(albumDir);
- }
-
- public static File getAlbumArtFile(File albumDir) {
- File albumArtDir = getAlbumArtDirectory();
- return new File(albumArtDir, Util.md5Hex(albumDir.getPath()) + ".jpeg");
- }
-
- public static Bitmap getAlbumArtBitmap(Context context, MusicDirectory.Entry entry, int size) {
- File albumArtFile = getAlbumArtFile(context, entry);
- if (albumArtFile.exists()) {
- Bitmap bitmap = BitmapFactory.decodeFile(albumArtFile.getPath());
- return bitmap == null ? null : Bitmap.createScaledBitmap(bitmap, size, size, true);
- }
- return null;
- }
-
- public static File getAlbumArtDirectory() {
- File albumArtDir = new File(getSubsonicDirectory(), "artwork");
- ensureDirectoryExistsAndIsReadWritable(albumArtDir);
- ensureDirectoryExistsAndIsReadWritable(new File(albumArtDir, ".nomedia"));
- return albumArtDir;
- }
-
- private static File getAlbumDirectory(Context context, MusicDirectory.Entry entry) {
- File dir;
- if (entry.getPath() != null) {
- File f = new File(fileSystemSafeDir(entry.getPath()));
- dir = new File(getMusicDirectory(context).getPath() + "/" + (entry.isDirectory() ? f.getPath() : f.getParent()));
- } else {
- String artist = fileSystemSafe(entry.getArtist());
- String album = fileSystemSafe(entry.getAlbum());
- dir = new File(getMusicDirectory(context).getPath() + "/" + artist + "/" + album);
- }
- return dir;
- }
-
- public static void createDirectoryForParent(File file) {
- File dir = file.getParentFile();
- if (!dir.exists()) {
- if (!dir.mkdirs()) {
- Log.e(TAG, "Failed to create directory " + dir);
- }
- }
- }
-
- private static File createDirectory(String name) {
- File dir = new File(getSubsonicDirectory(), name);
- if (!dir.exists() && !dir.mkdirs()) {
- Log.e(TAG, "Failed to create " + name);
- }
- return dir;
- }
-
- public static File getSubsonicDirectory() {
- return new File(Environment.getExternalStorageDirectory(), "subsonic");
- }
-
- public static File getDefaultMusicDirectory() {
- return DEFAULT_MUSIC_DIR;
- }
-
- public static File getMusicDirectory(Context context) {
- String path = Util.getPreferences(context).getString(Constants.PREFERENCES_KEY_CACHE_LOCATION, DEFAULT_MUSIC_DIR.getPath());
- File dir = new File(path);
- return ensureDirectoryExistsAndIsReadWritable(dir) ? dir : getDefaultMusicDirectory();
- }
-
- public static boolean ensureDirectoryExistsAndIsReadWritable(File dir) {
- if (dir == null) {
- return false;
- }
-
- if (dir.exists()) {
- if (!dir.isDirectory()) {
- Log.w(TAG, dir + " exists but is not a directory.");
- return false;
- }
- } else {
- if (dir.mkdirs()) {
- Log.i(TAG, "Created directory " + dir);
- } else {
- Log.w(TAG, "Failed to create directory " + dir);
- return false;
- }
- }
-
- if (!dir.canRead()) {
- Log.w(TAG, "No read permission for directory " + dir);
- return false;
- }
-
- if (!dir.canWrite()) {
- Log.w(TAG, "No write permission for directory " + dir);
- return false;
- }
- return true;
- }
-
- /**
- * Makes a given filename safe by replacing special characters like slashes ("/" and "\")
- * with dashes ("-").
- *
- * @param filename The filename in question.
- * @return The filename with special characters replaced by hyphens.
- */
- private static String fileSystemSafe(String filename) {
- if (filename == null || filename.trim().length() == 0) {
- return "unnamed";
- }
-
- for (String s : FILE_SYSTEM_UNSAFE) {
- filename = filename.replace(s, "-");
- }
- return filename;
- }
-
- /**
- * Makes a given filename safe by replacing special characters like colons (":")
- * with dashes ("-").
- *
- * @param path The path of the directory in question.
- * @return The the directory name with special characters replaced by hyphens.
- */
- private static String fileSystemSafeDir(String path) {
- if (path == null || path.trim().length() == 0) {
- return "";
- }
-
- for (String s : FILE_SYSTEM_UNSAFE_DIR) {
- path = path.replace(s, "-");
- }
- return path;
- }
-
- /**
- * Similar to {@link File#listFiles()}, but returns a sorted set.
- * Never returns {@code null}, instead a warning is logged, and an empty set is returned.
- */
- public static SortedSet<File> listFiles(File dir) {
- File[] files = dir.listFiles();
- if (files == null) {
- Log.w(TAG, "Failed to list children for " + dir.getPath());
- return new TreeSet<File>();
- }
-
- return new TreeSet<File>(Arrays.asList(files));
- }
-
- public static SortedSet<File> listMusicFiles(File dir) {
- SortedSet<File> files = listFiles(dir);
- Iterator<File> iterator = files.iterator();
- while (iterator.hasNext()) {
- File file = iterator.next();
- if (!file.isDirectory() && !isMusicFile(file)) {
- iterator.remove();
- }
- }
- return files;
- }
-
- private static boolean isMusicFile(File file) {
- String extension = getExtension(file.getName());
- return MUSIC_FILE_EXTENSIONS.contains(extension);
- }
-
- /**
- * Returns the extension (the substring after the last dot) of the given file. The dot
- * is not included in the returned extension.
- *
- * @param name The filename in question.
- * @return The extension, or an empty string if no extension is found.
- */
- public static String getExtension(String name) {
- int index = name.lastIndexOf('.');
- return index == -1 ? "" : name.substring(index + 1).toLowerCase();
- }
-
- /**
- * Returns the base name (the substring before the last dot) of the given file. The dot
- * is not included in the returned basename.
- *
- * @param name The filename in question.
- * @return The base name, or an empty string if no basename is found.
- */
- public static String getBaseName(String name) {
- int index = name.lastIndexOf('.');
- return index == -1 ? name : name.substring(0, index);
- }
-
- public static <T extends Serializable> boolean serialize(Context context, T obj, String fileName) {
- File file = new File(context.getCacheDir(), fileName);
- ObjectOutputStream out = null;
- try {
- out = new ObjectOutputStream(new FileOutputStream(file));
- out.writeObject(obj);
- Log.i(TAG, "Serialized object to " + file);
- return true;
- } catch (Throwable x) {
- Log.w(TAG, "Failed to serialize object to " + file);
- return false;
- } finally {
- Util.close(out);
- }
- }
-
- public static <T extends Serializable> T deserialize(Context context, String fileName) {
- File file = new File(context.getCacheDir(), fileName);
- if (!file.exists() || !file.isFile()) {
- return null;
- }
-
- ObjectInputStream in = null;
- try {
- in = new ObjectInputStream(new FileInputStream(file));
- T result = (T) in.readObject();
- Log.i(TAG, "Deserialized object from " + file);
- return result;
- } catch (Throwable x) {
- Log.w(TAG, "Failed to deserialize object from " + file, x);
- return null;
- } finally {
- Util.close(in);
- }
- }
-}