Added option to save a playlist as m3u file.
This commit is contained in:
parent
1b3d98e098
commit
1aa6aec9cb
6 changed files with 106 additions and 3 deletions
|
|
@ -0,0 +1,8 @@
|
|||
package com.kabouzeid.gramophone.helper;
|
||||
|
||||
public interface M3UConstants {
|
||||
String EXTENSION = "m3u";
|
||||
String HEADER = "#EXTM3U";
|
||||
String ENTRY = "#EXTINF:";
|
||||
String DURATION_SEPARATOR = ",";
|
||||
}
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
package com.kabouzeid.gramophone.helper;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import com.kabouzeid.gramophone.loader.PlaylistSongLoader;
|
||||
import com.kabouzeid.gramophone.model.Playlist;
|
||||
import com.kabouzeid.gramophone.model.PlaylistSong;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class M3UWriter implements M3UConstants {
|
||||
public static final String TAG = M3UWriter.class.getSimpleName();
|
||||
|
||||
public static File write(Context context, File dir, Playlist playlist) throws IOException {
|
||||
if (!dir.exists()) //noinspection ResultOfMethodCallIgnored
|
||||
dir.mkdirs();
|
||||
File file = new File(dir, playlist.name.concat("." + EXTENSION));
|
||||
|
||||
ArrayList<PlaylistSong> songs = PlaylistSongLoader.getPlaylistSongList(context, playlist.id);
|
||||
|
||||
if (songs.size() > 0) {
|
||||
BufferedWriter bw = new BufferedWriter(new FileWriter(file));
|
||||
|
||||
bw.write(HEADER);
|
||||
for (Song song : songs) {
|
||||
bw.newLine();
|
||||
bw.write(ENTRY + song.duration + DURATION_SEPARATOR + song.artistName + " - " + song.title);
|
||||
bw.newLine();
|
||||
bw.write(song.data);
|
||||
}
|
||||
|
||||
bw.close();
|
||||
}
|
||||
|
||||
return file;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,9 +1,13 @@
|
|||
package com.kabouzeid.gramophone.helper.menu;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.os.AsyncTask;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v7.app.AppCompatActivity;
|
||||
import android.view.MenuItem;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.kabouzeid.gramophone.R;
|
||||
import com.kabouzeid.gramophone.dialogs.DeletePlaylistDialog;
|
||||
|
|
@ -13,7 +17,9 @@ import com.kabouzeid.gramophone.loader.PlaylistSongLoader;
|
|||
import com.kabouzeid.gramophone.model.Playlist;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
import com.kabouzeid.gramophone.model.smartplaylist.AbsSmartPlaylist;
|
||||
import com.kabouzeid.gramophone.util.PlaylistsUtil;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
|
|
@ -22,7 +28,7 @@ import java.util.ArrayList;
|
|||
public class PlaylistMenuHelper {
|
||||
public static final int MENU_RES = R.menu.menu_item_playlist;
|
||||
|
||||
public static boolean handleMenuClick(@NonNull AppCompatActivity activity, @NonNull Playlist playlist, @NonNull MenuItem item) {
|
||||
public static boolean handleMenuClick(@NonNull AppCompatActivity activity, @NonNull final Playlist playlist, @NonNull MenuItem item) {
|
||||
switch (item.getItemId()) {
|
||||
case R.id.action_play:
|
||||
MusicPlayerRemote.openQueue(new ArrayList<>(getPlaylistSongs(activity, playlist)), 0, true);
|
||||
|
|
@ -36,6 +42,35 @@ public class PlaylistMenuHelper {
|
|||
case R.id.action_delete_playlist:
|
||||
DeletePlaylistDialog.create(playlist).show(activity.getSupportFragmentManager(), "DELETE_PLAYLIST");
|
||||
return true;
|
||||
case R.id.action_save_playlist:
|
||||
@SuppressLint("ShowToast") final Toast toast = Toast.makeText(activity, R.string.saving_to_file, Toast.LENGTH_SHORT);
|
||||
new AsyncTask<Context, Void, String>() {
|
||||
@Override
|
||||
protected void onPreExecute() {
|
||||
super.onPreExecute();
|
||||
toast.show();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String doInBackground(Context... params) {
|
||||
try {
|
||||
return String.format(params[0].getString(R.string.saved_playlist_to), PlaylistsUtil.savePlaylist(params[0], playlist));
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return String.format(params[0].getString(R.string.failed_to_save_playlist), e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(String string) {
|
||||
super.onPostExecute(string);
|
||||
if (toast != null) {
|
||||
toast.setText(string);
|
||||
toast.show();
|
||||
}
|
||||
}
|
||||
}.execute(activity.getApplicationContext());
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import android.content.ContentValues;
|
|||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
import android.net.Uri;
|
||||
import android.os.Environment;
|
||||
import android.provider.BaseColumns;
|
||||
import android.provider.MediaStore;
|
||||
import android.support.annotation.NonNull;
|
||||
|
|
@ -12,10 +13,13 @@ import android.support.annotation.Nullable;
|
|||
import android.widget.Toast;
|
||||
|
||||
import com.kabouzeid.gramophone.R;
|
||||
import com.kabouzeid.gramophone.helper.M3UWriter;
|
||||
import com.kabouzeid.gramophone.model.Playlist;
|
||||
import com.kabouzeid.gramophone.model.PlaylistSong;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
|
|
@ -224,4 +228,8 @@ public class PlaylistsUtil {
|
|||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
public static File savePlaylist(Context context, Playlist playlist) throws IOException {
|
||||
return M3UWriter.write(context, new File(Environment.getExternalStorageDirectory(), "Playlists"), playlist);
|
||||
}
|
||||
}
|
||||
|
|
@ -9,8 +9,12 @@
|
|||
android:title="@string/action_add_to_playing_queue" />
|
||||
<item
|
||||
android:id="@+id/action_rename_playlist"
|
||||
android:title="@string/rename_playlist_title" />
|
||||
android:title="@string/action_rename" />
|
||||
<item
|
||||
android:id="@+id/action_delete_playlist"
|
||||
android:title="@string/delete_playlist_title" />
|
||||
android:title="@string/action_delete" />
|
||||
<item
|
||||
android:id="@+id/action_save_playlist"
|
||||
android:title="@string/save_playlist_title" />
|
||||
|
||||
</menu>
|
||||
|
|
@ -26,6 +26,8 @@
|
|||
<string name="action_tag_editor">Tag editor</string>
|
||||
<string name="action_delete_from_device">Delete from device</string>
|
||||
<string name="action_details">Details</string>
|
||||
<string name="action_rename">Rename</string>
|
||||
<string name="action_delete">Delete</string>
|
||||
<string name="albums">Albums</string>
|
||||
<string name="artists">Artists</string>
|
||||
<string name="songs">Songs</string>
|
||||
|
|
@ -44,6 +46,7 @@
|
|||
<string name="album_or_artist_empty">The title or artist is empty.</string>
|
||||
<string name="writing_file_number">Writing file</string>
|
||||
<string name="saving_changes">Saving changes…</string>
|
||||
<string name="saving_to_file">Saving to file…</string>
|
||||
<string name="label_details">Details</string>
|
||||
<string name="label_file_name">File name</string>
|
||||
<string name="label_file_path">File path</string>
|
||||
|
|
@ -86,6 +89,7 @@
|
|||
<string name="delete_playlist_title">Delete playlist</string>
|
||||
<string name="delete_playlists_title">Delete playlists</string>
|
||||
<string name="clear_playlist_title">Clear playlist</string>
|
||||
<string name="save_playlist_title">Save as file</string>
|
||||
<string name="add_playlist_title">"Add to playlist"</string>
|
||||
<string name="action_shuffle_all">Shuffle all</string>
|
||||
<string name="action_shuffle_album">Shuffle album</string>
|
||||
|
|
@ -230,4 +234,6 @@
|
|||
<string name="storage_permission_explaination">The storage permission is required for Phonograph to read your music library.</string>
|
||||
<string name="library">Library</string>
|
||||
<string name="folders">Folders</string>
|
||||
<string name="saved_playlist_to">Saved playlist to %s.</string>
|
||||
<string name="failed_to_save_playlist">Failed to save playlist (%s).</string>
|
||||
</resources>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue