From 4f9d5366540ecf15e433cf9463deb2d3fbd7d8c1 Mon Sep 17 00:00:00 2001
From: Anonymus Raccoon <32224410+AnonymusRaccoon@users.noreply.github.com>
Date: Thu, 13 Jun 2019 02:33:28 +0200
Subject: [PATCH] Making downloader follow playlist sort order. Reworking
playlist track header's more menu.
---
Opus/Code/Api/LocalManager.cs | 15 +-
Opus/Code/Api/PlaylistManager.cs | 5 +-
Opus/Code/Api/Services/Downloader.cs | 63 +++--
Opus/Code/DataStructure/DownloadFile.cs | 17 +-
Opus/Code/DataStructure/Song.cs | 5 +-
Opus/Code/UI/Adapter/DownloadQueueAdapter.cs | 13 +-
Opus/Code/UI/Adapter/PlaylistAdapter.cs | 2 +-
Opus/Code/UI/Fragments/DownloadQueue.cs | 6 +-
Opus/Code/UI/Fragments/Playlist.cs | 2 +-
Opus/Code/UI/Fragments/PlaylistTracks.cs | 32 ++-
Opus/Opus.csproj | 12 -
Opus/Resources/Resource.Designer.cs | 225 +++++++++---------
Opus/Resources/menu/playlist_header_more.xml | 6 -
.../Resources/menu/ytplaylist_header_more.xml | 15 --
.../ytplaylistnowrite_forked_header_more.xml | 15 --
.../menu/ytplaylistnowrite_header_more.xml | 15 --
Opus/Resources/values-fr/strings.xml | 1 +
Opus/Resources/values/strings.xml | 1 +
18 files changed, 223 insertions(+), 227 deletions(-)
delete mode 100644 Opus/Resources/menu/ytplaylist_header_more.xml
delete mode 100644 Opus/Resources/menu/ytplaylistnowrite_forked_header_more.xml
delete mode 100644 Opus/Resources/menu/ytplaylistnowrite_header_more.xml
diff --git a/Opus/Code/Api/LocalManager.cs b/Opus/Code/Api/LocalManager.cs
index 303d873..ab91568 100644
--- a/Opus/Code/Api/LocalManager.cs
+++ b/Opus/Code/Api/LocalManager.cs
@@ -355,15 +355,16 @@ namespace Opus.Api
/// The name of the playlist
/// The id of the local playlist or -1 if you want to add this song to a playlist that will be created after.
/// Used only if you want to create a playlist with this method. True if the newly created playlist should be synced on youtube.
- public async static void AddToPlaylist(Song[] items, string playList, long LocalID, bool saveAsSynced = false)
+ /// If you want to add the first song to a specific position (should only be used if you know the exact position that you want). Experimental Feature.
+ public async static void AddToPlaylist(Song[] items, string playList, long LocalID, bool saveAsSynced = false, int position = -1)
{
if (LocalID == -1)
{
LocalID = await PlaylistManager.GetPlaylistID(playList);
if (LocalID == -1)
- PlaylistManager.CreateLocalPlaylist(playList, items, saveAsSynced);
+ PlaylistManager.CreateLocalPlaylist(playList, items, saveAsSynced, position);
else
- AddToPlaylist(items, playList, LocalID);
+ AddToPlaylist(items, playList, LocalID, saveAsSynced, position);
}
else
{
@@ -381,7 +382,13 @@ namespace Opus.Api
{
ContentValues value = new ContentValues();
value.Put(MediaStore.Audio.Playlists.Members.AudioId, item.LocalID);
- value.Put(MediaStore.Audio.Playlists.Members.PlayOrder, playlistCount + i + 1);
+ if(position != -1)
+ {
+ value.Put(MediaStore.Audio.Playlists.Members.PlayOrder, position);
+ position = -1;
+ }
+ else
+ value.Put(MediaStore.Audio.Playlists.Members.PlayOrder, playlistCount + i + 1);
values.Add(value);
}
}
diff --git a/Opus/Code/Api/PlaylistManager.cs b/Opus/Code/Api/PlaylistManager.cs
index c664f66..127e956 100644
--- a/Opus/Code/Api/PlaylistManager.cs
+++ b/Opus/Code/Api/PlaylistManager.cs
@@ -880,7 +880,8 @@ namespace Opus.Api
/// The name of the playlist
/// The array of songs you want to add. Can be local one or youtube one, it will download them and add them after.
/// True if you want the playlist to be created and synced on youtube too
- public async static void CreateLocalPlaylist(string name, Song[] items, bool syncedPlaylist = false)
+ /// Property used only for the downloader, see the LocalManager's AddToPlaylist method to see what it does.
+ public async static void CreateLocalPlaylist(string name, Song[] items, bool syncedPlaylist = false, int position = -1)
{
if (!await MainActivity.instance.GetWritePermission())
return;
@@ -894,7 +895,7 @@ namespace Opus.Api
if (items != null && items.Length > 0)
{
- LocalManager.AddToPlaylist(items, name, playlistID); //Will only add files already downloaded
+ LocalManager.AddToPlaylist(items, name, playlistID, false, position); //Will only add files already downloaded
#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
YoutubeManager.DownloadFiles(items.ToList().ConvertAll(x => DownloadFile.From(x, name))); //Will download missing files and add them (if there was youtube songs in the items array.
#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
diff --git a/Opus/Code/Api/Services/Downloader.cs b/Opus/Code/Api/Services/Downloader.cs
index 0a8c23b..b2dba9e 100644
--- a/Opus/Code/Api/Services/Downloader.cs
+++ b/Opus/Code/Api/Services/Downloader.cs
@@ -151,13 +151,13 @@ namespace Opus.Api.Services
downloadCount++;
currentStrike++;
- CreateNotification(queue[position].name);
+ CreateNotification(queue[position].Name);
try
{
YoutubeClient client = new YoutubeClient();
- Video video = await client.GetVideoAsync(queue[position].videoID);
- MediaStreamInfoSet mediaStreamInfo = await client.GetVideoMediaStreamInfosAsync(queue[position].videoID);
+ Video video = await client.GetVideoAsync(queue[position].YoutubeID);
+ MediaStreamInfoSet mediaStreamInfo = await client.GetVideoMediaStreamInfosAsync(queue[position].YoutubeID);
MediaStreamInfo streamInfo;
if (mediaStreamInfo.Audio.Count > 0)
@@ -187,9 +187,9 @@ namespace Opus.Api.Services
string outpath = path;
- if (queue[position].playlist != null)
+ if (queue[position].PlaylistName != null)
{
- outpath = Path.Combine(path, queue[position].playlist);
+ outpath = Path.Combine(path, queue[position].PlaylistName);
Directory.CreateDirectory(outpath);
}
@@ -209,7 +209,7 @@ namespace Opus.Api.Services
MediaStream input = await client.GetMediaStreamAsync(streamInfo);
- queue[position].path = filePath;
+ queue[position].Path = filePath;
files.Add(filePath);
FileStream output = File.Create(filePath);
@@ -229,7 +229,7 @@ namespace Opus.Api.Services
if (queue.Count == 1)
SetNotificationProgress(100, true);
- SetMetaData(position, filePath, video.Title, video.Author, new string[] { video.Thumbnails.MaxResUrl, video.Thumbnails.StandardResUrl, video.Thumbnails.HighResUrl }, queue[position].videoID, queue[position].playlist);
+ SetMetaData(position, video.Title, video.Author, new string[] { video.Thumbnails.MaxResUrl, video.Thumbnails.StandardResUrl, video.Thumbnails.HighResUrl });
files.Remove(filePath);
downloadCount--;
@@ -256,8 +256,10 @@ namespace Opus.Api.Services
}
}
- private async void SetMetaData(int position, string filePath, string title, string artist, string[] thumbnails, string youtubeID, string playlist)
+ private async void SetMetaData(int position, string title, string artist, string[] thumbnails)
{
+ string filePath = queue[position].Path;
+
await Task.Run(async () =>
{
Stream stream = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite);
@@ -266,7 +268,7 @@ namespace Opus.Api.Services
meta.Tag.Title = title;
meta.Tag.Performers = new string[] { artist };
meta.Tag.Album = title + " - " + artist;
- meta.Tag.Comment = youtubeID;
+ meta.Tag.Comment = queue[position].YoutubeID;
IPicture[] pictures = new IPicture[1];
Bitmap bitmap = Picasso.With(Application.Context).Load(await YoutubeManager.GetBestThumb(thumbnails)).Transform(new RemoveBlackBorder(true)).Get();
byte[] data;
@@ -285,9 +287,12 @@ namespace Opus.Api.Services
MediaScannerConnection.ScanFile(this, new string[] { filePath }, null, this);
- queue[position].State = DownloadState.Completed;
+ if (queue[position].PlaylistName == null)
+ queue[position].State = DownloadState.Completed;
+ else
+ queue[position].State = DownloadState.Playlist;
- if (!queue.Exists(x => x.State == DownloadState.None || x.State == DownloadState.Downloading || x.State == DownloadState.Initialization || x.State == DownloadState.MetaData))
+ if (!queue.Exists(x => x.State == DownloadState.None || x.State == DownloadState.Downloading || x.State == DownloadState.Initialization || x.State == DownloadState.MetaData || x.State == DownloadState.Playlist))
{
StopForeground(true);
DownloadQueue.instance?.Finish();
@@ -297,20 +302,36 @@ namespace Opus.Api.Services
UpdateList(position);
}
- public void OnScanCompleted(string path, Uri uri)
+ public async void OnScanCompleted(string path, Uri uri)
{
- Android.Util.Log.Debug("MusisApp", "Scan Completed with path = " + path + " and uri = " + uri.ToString());
- string playlist = path.Substring(downloadPath.Length + 1);
+ System.Console.WriteLine("&Scan Completed with path = " + path + " and uri = " + uri.ToString());
- if (playlist.IndexOf('/') != -1)
+ int position = queue.FindIndex(x => x.Path == path && x.State == DownloadState.Playlist);
+ if (position != -1)
{
- playlist = playlist.Substring(0, playlist.IndexOf('/'));
- Handler handler = new Handler(MainActivity.instance.MainLooper);
- handler.Post(async () =>
+ LocalManager.AddToPlaylist(new[] { await LocalManager.GetSong(path) }, queue[position].PlaylistName, -1, true, position);
+ queue[position].State = DownloadState.Completed;
+
+ if (!queue.Exists(x => x.State == DownloadState.None || x.State == DownloadState.Downloading || x.State == DownloadState.Initialization || x.State == DownloadState.MetaData || x.State == DownloadState.Playlist))
{
- LocalManager.AddToPlaylist(new[] { await LocalManager.GetSong(path) }, playlist, -1, true);
- });
+ StopForeground(true);
+ DownloadQueue.instance?.Finish();
+ queue.Clear();
+ }
+ else
+ UpdateList(position);
}
+
+
+ //if (playlist.IndexOf('/') != -1)
+ //{
+ // playlist = playlist.Substring(0, playlist.IndexOf('/'));
+ // Handler handler = new Handler(MainActivity.instance.MainLooper);
+ // handler.Post(async () =>
+ // {
+
+ // });
+ //}
}
#endregion
@@ -329,7 +350,7 @@ namespace Opus.Api.Services
for (int i = 0; i < files.Count; i++)
{
- Song song = songs.Find(x => x.YoutubeID == files[i].videoID);
+ Song song = songs.Find(x => x.YoutubeID == files[i].YoutubeID);
if (song != null)
{
//Video is already downloaded:
diff --git a/Opus/Code/DataStructure/DownloadFile.cs b/Opus/Code/DataStructure/DownloadFile.cs
index 04f9d98..76480c3 100644
--- a/Opus/Code/DataStructure/DownloadFile.cs
+++ b/Opus/Code/DataStructure/DownloadFile.cs
@@ -3,19 +3,19 @@
[System.Serializable]
public class DownloadFile
{
- public string name;
- public string videoID;
- public string playlist;
+ public string Name;
+ public string YoutubeID;
+ public string PlaylistName;
public DownloadState State = DownloadState.None;
public int progress = 0;
- public string path;
+ public string Path;
public bool skipCheck = false;
public DownloadFile(string name, string videoID, string playlist)
{
- this.name = name;
- this.videoID = videoID;
- this.playlist = playlist;
+ this.Name = name;
+ this.YoutubeID = videoID;
+ this.PlaylistName = playlist;
}
public static DownloadFile From(Song song, string playlistName)
@@ -33,6 +33,7 @@
Canceled,
UpToDate,
None,
- Error
+ Error,
+ Playlist
}
}
\ No newline at end of file
diff --git a/Opus/Code/DataStructure/Song.cs b/Opus/Code/DataStructure/Song.cs
index 41b19ba..85e3c07 100644
--- a/Opus/Code/DataStructure/Song.cs
+++ b/Opus/Code/DataStructure/Song.cs
@@ -5,6 +5,7 @@ using Android.Support.V7.Widget;
using Android.Views;
using Android.Widget;
using Newtonsoft.Json;
+using Opus.Fragments;
using SQLite;
using System;
@@ -57,7 +58,9 @@ namespace Opus.DataStructure
int albumID = cursor.GetColumnIndex(MediaStore.Audio.Media.InterfaceConsts.Album);
int thisID = cursor.GetColumnIndex(MediaStore.Audio.Media.InterfaceConsts.Id);
int pathID = cursor.GetColumnIndex(MediaStore.Audio.Media.InterfaceConsts.Data);
+ int playOrderID = cursor.GetColumnIndex(MediaStore.Audio.Playlists.Members.PlayOrder);
+ string playOrder = PlaylistTracks.instance != null ? cursor.GetString(playOrderID) : "";
string Artist = cursor.GetString(artistID);
string Title = cursor.GetString(titleID);
string Album = cursor.GetString(albumID);
@@ -72,7 +75,7 @@ namespace Opus.DataStructure
if (Album == null)
Album = "Unknow Album";
- return new Song(Title, Artist, Album, null, AlbumArt, id, path);
+ return new Song(Title, playOrder, Album, null, AlbumArt, id, path);
}
diff --git a/Opus/Code/UI/Adapter/DownloadQueueAdapter.cs b/Opus/Code/UI/Adapter/DownloadQueueAdapter.cs
index 5985228..7314b2e 100644
--- a/Opus/Code/UI/Adapter/DownloadQueueAdapter.cs
+++ b/Opus/Code/UI/Adapter/DownloadQueueAdapter.cs
@@ -17,7 +17,7 @@ namespace Opus.Adapter
public override void OnBindViewHolder(RecyclerView.ViewHolder viewHolder, int position)
{
DownloadHolder holder = (DownloadHolder)viewHolder;
- holder.Title.Text = Downloader.queue[position].name;
+ holder.Title.Text = Downloader.queue[position].Name;
switch (Downloader.queue[position].State)
{
@@ -43,6 +43,17 @@ namespace Opus.Adapter
else
holder.Title.SetTextColor(Color.Black);
break;
+ case DownloadState.Playlist:
+ holder.Status.Text = Downloader.instance.GetString(Resource.String.downloader_playlist);
+ holder.Status.Visibility = ViewStates.Visible;
+ holder.Progress.Visibility = ViewStates.Visible;
+ holder.Progress.Indeterminate = true;
+ holder.Title.Alpha = 1f;
+ if (MainActivity.Theme == 1)
+ holder.Title.SetTextColor(Color.White);
+ else
+ holder.Title.SetTextColor(Color.Black);
+ break;
case DownloadState.Downloading:
holder.Status.Text = Downloader.instance.GetString(Resource.String.downloading_status);
holder.Status.Visibility = ViewStates.Visible;
diff --git a/Opus/Code/UI/Adapter/PlaylistAdapter.cs b/Opus/Code/UI/Adapter/PlaylistAdapter.cs
index 1c56667..365db36 100644
--- a/Opus/Code/UI/Adapter/PlaylistAdapter.cs
+++ b/Opus/Code/UI/Adapter/PlaylistAdapter.cs
@@ -176,7 +176,7 @@ namespace Opus.Adapter
else
holder.edit.Visibility = ViewStates.Gone;
- if (playlist.SyncState == SyncState.Loading || Downloader.queue.Find(x => x.playlist == playlist.Name && (x.State == DownloadState.Downloading || x.State == DownloadState.Initialization || x.State == DownloadState.MetaData || x.State == DownloadState.None)) != null)
+ if (playlist.SyncState == SyncState.Loading || Downloader.queue.Find(x => x.PlaylistName == playlist.Name && (x.State == DownloadState.Downloading || x.State == DownloadState.Initialization || x.State == DownloadState.MetaData || x.State == DownloadState.None)) != null)
{
holder.sync.Visibility = ViewStates.Gone;
holder.SyncLoading.Visibility = ViewStates.Visible;
diff --git a/Opus/Code/UI/Fragments/DownloadQueue.cs b/Opus/Code/UI/Fragments/DownloadQueue.cs
index cb58950..10666d5 100644
--- a/Opus/Code/UI/Fragments/DownloadQueue.cs
+++ b/Opus/Code/UI/Fragments/DownloadQueue.cs
@@ -76,13 +76,13 @@ namespace Opus.Fragments
case Resource.Id.delete:
if(Downloader.queue[morePosition].State == DownloadState.Completed)
{
- System.IO.File.Delete(Downloader.queue[morePosition].path);
- Downloader.queue[morePosition].name = GetString(Resource.String.deleted_file);
+ System.IO.File.Delete(Downloader.queue[morePosition].Path);
+ Downloader.queue[morePosition].Name = GetString(Resource.String.deleted_file);
Downloader.queue[morePosition].State = DownloadState.Canceled;
}
else if(Downloader.queue[morePosition].State == DownloadState.None)
{
- Downloader.queue[morePosition].name = GetString(Resource.String.deleted_file);
+ Downloader.queue[morePosition].Name = GetString(Resource.String.deleted_file);
Downloader.queue[morePosition].State = DownloadState.Canceled;
}
else
diff --git a/Opus/Code/UI/Fragments/Playlist.cs b/Opus/Code/UI/Fragments/Playlist.cs
index 1cb3a89..d67177e 100644
--- a/Opus/Code/UI/Fragments/Playlist.cs
+++ b/Opus/Code/UI/Fragments/Playlist.cs
@@ -508,7 +508,7 @@ namespace Opus.Fragments
{
for (int i = 1; i < YoutubePlaylists.Count; i++)
{
- if (YoutubePlaylists[i].SyncState != SyncState.False && YoutubePlaylists[i].SyncState != SyncState.Error && Downloader.queue.Find(x => x.playlist == YoutubePlaylists[i].Name && (x.State == DownloadState.Downloading || x.State == DownloadState.Initialization || x.State == DownloadState.MetaData || x.State == DownloadState.None)) == null)
+ if (YoutubePlaylists[i].SyncState != SyncState.False && YoutubePlaylists[i].SyncState != SyncState.Error && Downloader.queue.Find(x => x.PlaylistName == YoutubePlaylists[i].Name && (x.State == DownloadState.Downloading || x.State == DownloadState.Initialization || x.State == DownloadState.MetaData || x.State == DownloadState.None)) == null)
{
YoutubePlaylists[i].SyncState = SyncState.True;
PlaylistHolder holder = (PlaylistHolder)ListView.GetChildViewHolder(ListView.GetChildAt(LocalPlaylists.Count + i));
diff --git a/Opus/Code/UI/Fragments/PlaylistTracks.cs b/Opus/Code/UI/Fragments/PlaylistTracks.cs
index 2d671d0..bf2e150 100644
--- a/Opus/Code/UI/Fragments/PlaylistTracks.cs
+++ b/Opus/Code/UI/Fragments/PlaylistTracks.cs
@@ -192,7 +192,7 @@ namespace Opus.Fragments
SongManager.AddToQueue(adapter.tracks);
break;
- case Resource.Id.rename:
+ case Resource.Id.name:
PlaylistManager.Rename(item, () =>
{
MainActivity.instance.FindViewById(Resource.Id.headerTitle).Text = item.Name;
@@ -219,20 +219,30 @@ namespace Opus.Fragments
void PlaylistMore(object sender, System.EventArgs eventArgs)
{
PopupMenu menu = new PopupMenu(MainActivity.instance, MainActivity.instance.FindViewById(Resource.Id.headerMore));
- if (item.LocalID == -1 && item.HasWritePermission)
- menu.Inflate(Resource.Menu.ytplaylist_header_more);
- else if (item.LocalID == -1 && isForked)
- menu.Inflate(Resource.Menu.ytplaylistnowrite_forked_header_more);
- else if (item.LocalID == -1)
- menu.Inflate(Resource.Menu.ytplaylistnowrite_header_more);
- else
- menu.Inflate(Resource.Menu.playlist_header_more);
+ menu.Inflate(Resource.Menu.playlist_header_more); //Contains "add to queue"
if (item.SyncState == SyncState.True)
{
- menu.Menu.GetItem(0).SetTitle("Sync Now");
- menu.Menu.Add(Menu.None, Resource.Id.sync, menu.Menu.Size() - 3, "Stop Syncing");
+ menu.Menu.Add(Menu.None, Resource.Id.download, 1, MainActivity.instance.GetString(Resource.String.sync_now));
+ menu.Menu.Add(Menu.None, Resource.Id.sync, 5, MainActivity.instance.GetString(Resource.String.stop_sync));
}
+ else if(item.YoutubeID != null)
+ {
+ menu.Menu.Add(Menu.None, Resource.Id.download, 1, MainActivity.instance.GetString(Resource.String.sync));
+ }
+
+ if(item.YoutubeID != null)
+ {
+ if(isForked)
+ menu.Menu.Add(Menu.None, Resource.Id.fork, 2, MainActivity.instance.GetString(Resource.String.unfork));
+ else
+ menu.Menu.Add(Menu.None, Resource.Id.fork, 2, MainActivity.instance.GetString(Resource.String.add_to_library));
+ }
+
+ if(item.HasWritePermission)
+ menu.Menu.Add(Menu.None, Resource.Id.name, 3, MainActivity.instance.GetString(Resource.String.rename));
+
+ menu.Menu.Add(Menu.None, Resource.Id.delete, 4, MainActivity.instance.GetString(Resource.String.delete));
menu.SetOnMenuItemClickListener(this);
menu.Show();
}
diff --git a/Opus/Opus.csproj b/Opus/Opus.csproj
index 2fa8f1e..102e10c 100644
--- a/Opus/Opus.csproj
+++ b/Opus/Opus.csproj
@@ -586,12 +586,6 @@
-
-
-
-
-
-
@@ -892,12 +886,6 @@
Designer
-
-
- MSBuild:UpdateGeneratedFiles
- Designer
-
-
diff --git a/Opus/Resources/Resource.Designer.cs b/Opus/Resources/Resource.Designer.cs
index 8780895..6c4c4d6 100644
--- a/Opus/Resources/Resource.Designer.cs
+++ b/Opus/Resources/Resource.Designer.cs
@@ -5357,8 +5357,8 @@ namespace Opus
// aapt resource value: 0x7f0b0192
public const int downButton = 2131427730;
- // aapt resource value: 0x7f0b01d8
- public const int download = 2131427800;
+ // aapt resource value: 0x7f0b01d7
+ public const int download = 2131427799;
// aapt resource value: 0x7f0b01d0
public const int downloadMDfromYT = 2131427792;
@@ -5489,8 +5489,8 @@ namespace Opus
// aapt resource value: 0x7f0b0087
public const int filled = 2131427463;
- // aapt resource value: 0x7f0b01d5
- public const int filter = 2131427797;
+ // aapt resource value: 0x7f0b01d4
+ public const int filter = 2131427796;
// aapt resource value: 0x7f0b0092
public const int fit = 2131427474;
@@ -5657,8 +5657,8 @@ namespace Opus
// aapt resource value: 0x7f0b017f
public const int media_actions = 2131427711;
- // aapt resource value: 0x7f0b01d6
- public const int media_route_menu_item = 2131427798;
+ // aapt resource value: 0x7f0b01d5
+ public const int media_route_menu_item = 2131427797;
// aapt resource value: 0x7f0b00cb
public const int message = 2131427531;
@@ -5996,8 +5996,8 @@ namespace Opus
// aapt resource value: 0x7f0b01c7
public const int refine = 2131427783;
- // aapt resource value: 0x7f0b01d3
- public const int rename = 2131427795;
+ // aapt resource value: 0x7f0b01d8
+ public const int rename = 2131427800;
// aapt resource value: 0x7f0b01c5
public const int reorder = 2131427781;
@@ -6020,8 +6020,8 @@ namespace Opus
// aapt resource value: 0x7f0b0183
public const int right_side = 2131427715;
- // aapt resource value: 0x7f0b01d4
- public const int saveAsPlaylist = 2131427796;
+ // aapt resource value: 0x7f0b01d3
+ public const int saveAsPlaylist = 2131427795;
// aapt resource value: 0x7f0b0019
public const int save_image_matrix = 2131427353;
@@ -6104,8 +6104,8 @@ namespace Opus
// aapt resource value: 0x7f0b0077
public const int selected = 2131427447;
- // aapt resource value: 0x7f0b01d7
- public const int settings = 2131427799;
+ // aapt resource value: 0x7f0b01d6
+ public const int settings = 2131427798;
// aapt resource value: 0x7f0b00b2
public const int shortcut = 2131427506;
@@ -7186,8 +7186,8 @@ namespace Opus
// aapt resource value: 0x7f0d0072
public const int abc_toolbar_collapse_description = 2131558514;
- // aapt resource value: 0x7f0d0133
- public const int add = 2131558707;
+ // aapt resource value: 0x7f0d0134
+ public const int add = 2131558708;
// aapt resource value: 0x7f0d00fa
public const int add_playlist = 2131558650;
@@ -7213,11 +7213,11 @@ namespace Opus
// aapt resource value: 0x7f0d0080
public const int appbar_scrolling_view_behavior = 2131558528;
- // aapt resource value: 0x7f0d013d
- public const int appearances = 2131558717;
+ // aapt resource value: 0x7f0d013e
+ public const int appearances = 2131558718;
- // aapt resource value: 0x7f0d0130
- public const int apply = 2131558704;
+ // aapt resource value: 0x7f0d0131
+ public const int apply = 2131558705;
// aapt resource value: 0x7f0d011a
public const int artist = 2131558682;
@@ -7231,11 +7231,11 @@ namespace Opus
// aapt resource value: 0x7f0d0110
public const int badplaylisturl = 2131558672;
- // aapt resource value: 0x7f0d0137
- public const int behavior = 2131558711;
+ // aapt resource value: 0x7f0d0138
+ public const int behavior = 2131558712;
- // aapt resource value: 0x7f0d0156
- public const int beta_available = 2131558742;
+ // aapt resource value: 0x7f0d0157
+ public const int beta_available = 2131558743;
// aapt resource value: 0x7f0d0081
public const int bottom_sheet_behavior = 2131558529;
@@ -7243,17 +7243,17 @@ namespace Opus
// aapt resource value: 0x7f0d00b2
public const int browse = 2131558578;
- // aapt resource value: 0x7f0d0131
- public const int cancel = 2131558705;
+ // aapt resource value: 0x7f0d0132
+ public const int cancel = 2131558706;
- // aapt resource value: 0x7f0d015c
- public const int cancelling = 2131558748;
+ // aapt resource value: 0x7f0d015d
+ public const int cancelling = 2131558749;
// aapt resource value: 0x7f0d00f0
public const int cant_delete = 2131558640;
- // aapt resource value: 0x7f0d0159
- public const int cant_play_non_youtube = 2131558745;
+ // aapt resource value: 0x7f0d015a
+ public const int cant_play_non_youtube = 2131558746;
// aapt resource value: 0x7f0d00b7
public const int cast = 2131558583;
@@ -7336,11 +7336,11 @@ namespace Opus
// aapt resource value: 0x7f0d0015
public const int cast_play = 2131558421;
- // aapt resource value: 0x7f0d012e
- public const int cast_queue_push = 2131558702;
-
// aapt resource value: 0x7f0d012f
- public const int cast_queue_pushed = 2131558703;
+ public const int cast_queue_push = 2131558703;
+
+ // aapt resource value: 0x7f0d0130
+ public const int cast_queue_pushed = 2131558704;
// aapt resource value: 0x7f0d0016
public const int cast_rewind = 2131558422;
@@ -7405,8 +7405,8 @@ namespace Opus
// aapt resource value: 0x7f0d0083
public const int character_counter_pattern = 2131558531;
- // aapt resource value: 0x7f0d0143
- public const int check_updates = 2131558723;
+ // aapt resource value: 0x7f0d0144
+ public const int check_updates = 2131558724;
// aapt resource value: 0x7f0d002b
public const int common_google_play_services_enable_button = 2131558443;
@@ -7462,11 +7462,11 @@ namespace Opus
// aapt resource value: 0x7f0d003b
public const int common_signin_button_text_long = 2131558459;
- // aapt resource value: 0x7f0d012d
- public const int completed = 2131558701;
+ // aapt resource value: 0x7f0d012e
+ public const int completed = 2131558702;
- // aapt resource value: 0x7f0d0150
- public const int country_blocked = 2131558736;
+ // aapt resource value: 0x7f0d0151
+ public const int country_blocked = 2131558737;
// aapt resource value: 0x7f0d0116
public const int create_local = 2131558678;
@@ -7486,8 +7486,8 @@ namespace Opus
// aapt resource value: 0x7f0d0117
public const int create_youtube = 2131558679;
- // aapt resource value: 0x7f0d0141
- public const int dark_theme = 2131558721;
+ // aapt resource value: 0x7f0d0142
+ public const int dark_theme = 2131558722;
// aapt resource value: 0x7f0d00da
public const int delete = 2131558618;
@@ -7504,8 +7504,8 @@ namespace Opus
// aapt resource value: 0x7f0d011f
public const int download_albumart = 2131558687;
- // aapt resource value: 0x7f0d0139
- public const int download_directory = 2131558713;
+ // aapt resource value: 0x7f0d013a
+ public const int download_directory = 2131558714;
// aapt resource value: 0x7f0d0120
public const int download_meta = 2131558688;
@@ -7519,17 +7519,20 @@ namespace Opus
// aapt resource value: 0x7f0d0127
public const int download_queue = 2131558695;
+ // aapt resource value: 0x7f0d012b
+ public const int downloader_playlist = 2131558699;
+
// aapt resource value: 0x7f0d00ee
public const int downloading = 2131558638;
- // aapt resource value: 0x7f0d015a
- public const int downloading_notification = 2131558746;
+ // aapt resource value: 0x7f0d015b
+ public const int downloading_notification = 2131558747;
- // aapt resource value: 0x7f0d012b
- public const int downloading_status = 2131558699;
+ // aapt resource value: 0x7f0d012c
+ public const int downloading_status = 2131558700;
- // aapt resource value: 0x7f0d0157
- public const int downloading_update = 2131558743;
+ // aapt resource value: 0x7f0d0158
+ public const int downloading_update = 2131558744;
// aapt resource value: 0x7f0d00d1
public const int edit_metadata = 2131558609;
@@ -7672,8 +7675,8 @@ namespace Opus
// aapt resource value: 0x7f0d0129
public const int initialization = 2131558697;
- // aapt resource value: 0x7f0d0134
- public const int later = 2131558708;
+ // aapt resource value: 0x7f0d0135
+ public const int later = 2131558709;
// aapt resource value: 0x7f0d00d5
public const int list_songs = 2131558613;
@@ -7690,23 +7693,23 @@ namespace Opus
// aapt resource value: 0x7f0d00ff
public const int localpl_noperm = 2131558655;
- // aapt resource value: 0x7f0d0147
- public const int log_in = 2131558727;
-
// aapt resource value: 0x7f0d0148
- public const int log_out = 2131558728;
-
- // aapt resource value: 0x7f0d0146
- public const int logged_in = 2131558726;
+ public const int log_in = 2131558728;
// aapt resource value: 0x7f0d0149
- public const int login_disabled = 2131558729;
+ public const int log_out = 2131558729;
- // aapt resource value: 0x7f0d013a
- public const int max_download = 2131558714;
+ // aapt resource value: 0x7f0d0147
+ public const int logged_in = 2131558727;
+
+ // aapt resource value: 0x7f0d014a
+ public const int login_disabled = 2131558730;
// aapt resource value: 0x7f0d013b
- public const int max_download_dialog = 2131558715;
+ public const int max_download = 2131558715;
+
+ // aapt resource value: 0x7f0d013c
+ public const int max_download_dialog = 2131558716;
// aapt resource value: 0x7f0d012a
public const int metadata = 2131558698;
@@ -7810,8 +7813,8 @@ namespace Opus
// aapt resource value: 0x7f0d00bc
public const int next_loading = 2131558588;
- // aapt resource value: 0x7f0d0136
- public const int no = 2131558710;
+ // aapt resource value: 0x7f0d0137
+ public const int no = 2131558711;
// aapt resource value: 0x7f0d00f5
public const int no_channel = 2131558645;
@@ -7819,8 +7822,8 @@ namespace Opus
// aapt resource value: 0x7f0d00f4
public const int no_lives = 2131558644;
- // aapt resource value: 0x7f0d014b
- public const int no_permission = 2131558731;
+ // aapt resource value: 0x7f0d014c
+ public const int no_permission = 2131558732;
// aapt resource value: 0x7f0d00f3
public const int no_playlist = 2131558643;
@@ -7831,17 +7834,17 @@ namespace Opus
// aapt resource value: 0x7f0d00e7
public const int no_song = 2131558631;
- // aapt resource value: 0x7f0d014c
- public const int no_song_mix = 2131558732;
+ // aapt resource value: 0x7f0d014d
+ public const int no_song_mix = 2131558733;
// aapt resource value: 0x7f0d00f2
public const int no_track = 2131558642;
- // aapt resource value: 0x7f0d0145
- public const int not_log = 2131558725;
+ // aapt resource value: 0x7f0d0146
+ public const int not_log = 2131558726;
- // aapt resource value: 0x7f0d0151
- public const int not_streamable = 2131558737;
+ // aapt resource value: 0x7f0d0152
+ public const int not_streamable = 2131558738;
// aapt resource value: 0x7f0d00bb
public const int nothing = 2131558587;
@@ -7849,14 +7852,14 @@ namespace Opus
// aapt resource value: 0x7f0d00be
public const int off = 2131558590;
- // aapt resource value: 0x7f0d0132
- public const int ok = 2131558706;
+ // aapt resource value: 0x7f0d0133
+ public const int ok = 2131558707;
// aapt resource value: 0x7f0d00c4
public const int open_youtube = 2131558596;
- // aapt resource value: 0x7f0d0142
- public const int others = 2131558722;
+ // aapt resource value: 0x7f0d0143
+ public const int others = 2131558723;
// aapt resource value: 0x7f0d0088
public const int password_toggle_content_description = 2131558536;
@@ -8008,32 +8011,32 @@ namespace Opus
// aapt resource value: 0x7f0d00dc
public const int sync_now = 2131558620;
- // aapt resource value: 0x7f0d013c
- public const int sync_remove = 2131558716;
+ // aapt resource value: 0x7f0d013d
+ public const int sync_remove = 2131558717;
// aapt resource value: 0x7f0d00ef
public const int syncing = 2131558639;
- // aapt resource value: 0x7f0d015b
- public const int tap_details = 2131558747;
-
- // aapt resource value: 0x7f0d013e
- public const int theme = 2131558718;
+ // aapt resource value: 0x7f0d015c
+ public const int tap_details = 2131558748;
// aapt resource value: 0x7f0d013f
- public const int theme_dialog = 2131558719;
+ public const int theme = 2131558719;
+
+ // aapt resource value: 0x7f0d0140
+ public const int theme_dialog = 2131558720;
// aapt resource value: 0x7f0d00c3
public const int timer = 2131558595;
- // aapt resource value: 0x7f0d014e
- public const int timout = 2131558734;
+ // aapt resource value: 0x7f0d014f
+ public const int timout = 2131558735;
// aapt resource value: 0x7f0d0119
public const int title = 2131558681;
- // aapt resource value: 0x7f0d014a
- public const int undo = 2131558730;
+ // aapt resource value: 0x7f0d014b
+ public const int undo = 2131558731;
// aapt resource value: 0x7f0d0121
public const int undo_change = 2131558689;
@@ -8044,29 +8047,29 @@ namespace Opus
// aapt resource value: 0x7f0d010d
public const int unfork_playlist = 2131558669;
- // aapt resource value: 0x7f0d014f
- public const int unknow = 2131558735;
+ // aapt resource value: 0x7f0d0150
+ public const int unknow = 2131558736;
// aapt resource value: 0x7f0d00ba
public const int up_next = 2131558586;
- // aapt resource value: 0x7f0d0155
- public const int up_to_date = 2131558741;
+ // aapt resource value: 0x7f0d0156
+ public const int up_to_date = 2131558742;
- // aapt resource value: 0x7f0d012c
- public const int up_to_date_status = 2131558700;
-
- // aapt resource value: 0x7f0d0153
- public const int update = 2131558739;
+ // aapt resource value: 0x7f0d012d
+ public const int up_to_date_status = 2131558701;
// aapt resource value: 0x7f0d0154
- public const int update_message = 2131558740;
+ public const int update = 2131558740;
- // aapt resource value: 0x7f0d0152
- public const int update_no_internet = 2131558738;
+ // aapt resource value: 0x7f0d0155
+ public const int update_message = 2131558741;
- // aapt resource value: 0x7f0d0158
- public const int updating = 2131558744;
+ // aapt resource value: 0x7f0d0153
+ public const int update_no_internet = 2131558739;
+
+ // aapt resource value: 0x7f0d0159
+ public const int updating = 2131558745;
// aapt resource value: 0x7f0d003e
public const int v7_preference_off = 2131558462;
@@ -8074,20 +8077,20 @@ namespace Opus
// aapt resource value: 0x7f0d003f
public const int v7_preference_on = 2131558463;
- // aapt resource value: 0x7f0d0144
- public const int version = 2131558724;
+ // aapt resource value: 0x7f0d0145
+ public const int version = 2131558725;
- // aapt resource value: 0x7f0d0138
- public const int volume = 2131558712;
+ // aapt resource value: 0x7f0d0139
+ public const int volume = 2131558713;
- // aapt resource value: 0x7f0d0140
- public const int white_theme = 2131558720;
+ // aapt resource value: 0x7f0d0141
+ public const int white_theme = 2131558721;
- // aapt resource value: 0x7f0d0135
- public const int yes = 2131558709;
+ // aapt resource value: 0x7f0d0136
+ public const int yes = 2131558710;
- // aapt resource value: 0x7f0d014d
- public const int youtube_endpoint = 2131558733;
+ // aapt resource value: 0x7f0d014e
+ public const int youtube_endpoint = 2131558734;
// aapt resource value: 0x7f0d00fb
public const int youtube_loading_error = 2131558651;
diff --git a/Opus/Resources/menu/playlist_header_more.xml b/Opus/Resources/menu/playlist_header_more.xml
index 5533154..2b3c2ac 100644
--- a/Opus/Resources/menu/playlist_header_more.xml
+++ b/Opus/Resources/menu/playlist_header_more.xml
@@ -3,10 +3,4 @@
-
-
\ No newline at end of file
diff --git a/Opus/Resources/menu/ytplaylist_header_more.xml b/Opus/Resources/menu/ytplaylist_header_more.xml
deleted file mode 100644
index ae5e8f0..0000000
--- a/Opus/Resources/menu/ytplaylist_header_more.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
\ No newline at end of file
diff --git a/Opus/Resources/menu/ytplaylistnowrite_forked_header_more.xml b/Opus/Resources/menu/ytplaylistnowrite_forked_header_more.xml
deleted file mode 100644
index 0baef21..0000000
--- a/Opus/Resources/menu/ytplaylistnowrite_forked_header_more.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
\ No newline at end of file
diff --git a/Opus/Resources/menu/ytplaylistnowrite_header_more.xml b/Opus/Resources/menu/ytplaylistnowrite_header_more.xml
deleted file mode 100644
index 9b966e1..0000000
--- a/Opus/Resources/menu/ytplaylistnowrite_header_more.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
\ No newline at end of file
diff --git a/Opus/Resources/values-fr/strings.xml b/Opus/Resources/values-fr/strings.xml
index 95a23ba..3008026 100644
--- a/Opus/Resources/values-fr/strings.xml
+++ b/Opus/Resources/values-fr/strings.xml
@@ -149,6 +149,7 @@
Fichier supprimé
Initialisation
Metadata
+ Playlist
Téléchargement
Déjà à jour
Completé
diff --git a/Opus/Resources/values/strings.xml b/Opus/Resources/values/strings.xml
index bb1bac5..c7d85d3 100644
--- a/Opus/Resources/values/strings.xml
+++ b/Opus/Resources/values/strings.xml
@@ -149,6 +149,7 @@
Deleted file
Initialization
Metadata
+ Playlist
Downloading
Up to date
Completed