mirror of
https://github.com/zoriya/Opus.git
synced 2025-12-06 06:26:15 +00:00
youtube add to playlist created
This commit is contained in:
@@ -166,50 +166,6 @@ namespace MusicApp
|
||||
HttpClientInitializer = credential,
|
||||
ApplicationName = "MusicApp"
|
||||
});
|
||||
|
||||
//OAuth2Request request = new OAuth2Request("POST"; new Uri())
|
||||
//var refreshRequest = new OAuth2Request("POST", new Uri(OAuthSettings.TokenURL), postDictionary, googleAccount);
|
||||
//refreshRequest.GetResponseAsync().ContinueWith(task => {
|
||||
// if (task.IsFaulted)
|
||||
// Console.WriteLine("Error: " + task.Exception.InnerException.Message);
|
||||
// else
|
||||
// {
|
||||
// string json = task.Result.GetResponseText();
|
||||
// Console.WriteLine(json);
|
||||
// try
|
||||
// {
|
||||
// << just deserialize the json response, eg. with Newtonsoft>>
|
||||
// }
|
||||
// catch (Exception exception)
|
||||
// {
|
||||
// Console.WriteLine("!!!!!Exception: {0}", exception.ToString());
|
||||
// Logout();
|
||||
// }
|
||||
// }
|
||||
//});
|
||||
|
||||
//await auth.RequestAccessTokenAsync(queryValues).ContinueWith(result =>
|
||||
//{
|
||||
// Console.WriteLine("Requesting new token from auth api");
|
||||
// string accessToken = result.Result["access_token"];
|
||||
// string expiresIN = result.Result["expires_in"];
|
||||
|
||||
// Console.WriteLine("new acces token: " + accessToken);
|
||||
// Console.WriteLine("new expire date: " + expiresIN);
|
||||
|
||||
// DateTime expireDate = DateTime.UtcNow.AddSeconds(double.Parse(expiresIN));
|
||||
// ISharedPreferences pref = PreferenceManager.GetDefaultSharedPreferences(this);
|
||||
// ISharedPreferencesEditor editor = pref.Edit();
|
||||
// editor.PutString("expireDate", expireDate.ToString());
|
||||
// editor.Apply();
|
||||
|
||||
// GoogleCredential credential = GoogleCredential.FromAccessToken(accessToken);
|
||||
// YoutubeEngine.youtubeService = new YouTubeService(new BaseClientService.Initializer()
|
||||
// {
|
||||
// HttpClientInitializer = credential,
|
||||
// ApplicationName = "MusicApp"
|
||||
// });
|
||||
//});
|
||||
}
|
||||
|
||||
|
||||
@@ -249,16 +205,6 @@ namespace MusicApp
|
||||
ToolBar = (Android.Support.V7.Widget.Toolbar) FindViewById(Resource.Id.toolbar);
|
||||
SetSupportActionBar(ToolBar);
|
||||
SupportActionBar.Title = "MusicApp";
|
||||
|
||||
Play();
|
||||
}
|
||||
|
||||
async void Play()
|
||||
{
|
||||
YoutubeClient client = new YoutubeClient();
|
||||
var videoInfo = await client.GetVideoAsync("ziaf3RrG80U");
|
||||
AudioStreamInfo streamInfo = videoInfo.AudioStreamInfos.OrderBy(s => s.Bitrate).Last();
|
||||
Console.WriteLine(streamInfo.Url);
|
||||
}
|
||||
|
||||
public override bool OnCreateOptionsMenu(IMenu menu)
|
||||
|
||||
@@ -397,6 +397,9 @@
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\YtList.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\ic_query_builder_black_24dp.png" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
|
||||
<Import Project="..\packages\NETStandard.Library.2.0.1\build\netstandard2.0\NETStandard.Library.targets" Condition="Exists('..\packages\NETStandard.Library.2.0.1\build\netstandard2.0\NETStandard.Library.targets')" />
|
||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||
|
||||
@@ -24,6 +24,9 @@ namespace MusicApp.Resources.Portable_Class
|
||||
|
||||
public override View GetView(int position, View convertView, ViewGroup parent)
|
||||
{
|
||||
if (position > songList.Count || position < 0)
|
||||
return convertView;
|
||||
|
||||
if (inflater == null)
|
||||
{
|
||||
inflater = (LayoutInflater)context.GetSystemService(Context.LayoutInflaterService);
|
||||
@@ -49,6 +52,12 @@ namespace MusicApp.Resources.Portable_Class
|
||||
|
||||
Picasso.With(Application.Context).Load(songAlbumArtUri).Placeholder(Resource.Drawable.MusicIcon).Resize(400, 400).CenterCrop().Into(holder.AlbumArt);
|
||||
}
|
||||
|
||||
if (!songList[position].isParsed)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
return convertView;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,11 +36,12 @@ namespace MusicApp.Resources.Portable_Class
|
||||
public NotificationManager notificationManager;
|
||||
public static bool isRunning = false;
|
||||
public static string title;
|
||||
private static bool parsing = false;
|
||||
public static int currendID = -1;
|
||||
|
||||
private Notification notification;
|
||||
private const int notificationID = 1000;
|
||||
|
||||
|
||||
public override IBinder OnBind(Intent intent)
|
||||
{
|
||||
return null;
|
||||
@@ -310,7 +311,6 @@ namespace MusicApp.Resources.Portable_Class
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Yt song: " + song.GetAlbum());
|
||||
Picasso.With(Application.Context).Load(song.GetAlbum()).Placeholder(Resource.Drawable.MusicIcon).Resize(400, 400).CenterCrop().Into(art);
|
||||
}
|
||||
}
|
||||
@@ -333,11 +333,36 @@ namespace MusicApp.Resources.Portable_Class
|
||||
bar.Progress = (int) player.CurrentPosition;
|
||||
bar.ProgressChanged += (sender, e) =>
|
||||
{
|
||||
Console.WriteLine(player.Duration - e.Progress);
|
||||
if (player != null && e.FromUser)
|
||||
player.SeekTo(e.Progress);
|
||||
|
||||
if (player != null && player.Duration - e.Progress <= 1500 && player.Duration - e.Progress > 0)
|
||||
ParseNextSong();
|
||||
};
|
||||
}
|
||||
|
||||
public static async void ParseNextSong()
|
||||
{
|
||||
if (CurrentID() + 1 > queue.Count)
|
||||
return;
|
||||
|
||||
Song song = queue[CurrentID() + 1];
|
||||
if (song.isParsed)
|
||||
return;
|
||||
|
||||
if (!song.isParsed && !parsing)
|
||||
{
|
||||
parsing = true;
|
||||
YoutubeClient client = new YoutubeClient();
|
||||
var videoInfo = await client.GetVideoAsync(song.GetPath());
|
||||
AudioStreamInfo streamInfo = videoInfo.AudioStreamInfos.OrderBy(s => s.Bitrate).Last();
|
||||
song.SetPath(streamInfo.Url);
|
||||
song.isParsed = true;
|
||||
parsing = false;
|
||||
}
|
||||
}
|
||||
|
||||
public static int Duration
|
||||
{
|
||||
get
|
||||
|
||||
@@ -232,6 +232,7 @@ namespace MusicApp.Resources.Portable_Class
|
||||
private void Fab_Click(object sender, EventArgs e)
|
||||
{
|
||||
Activity.SupportFragmentManager.BeginTransaction()./*SetCustomAnimations(Resource.Animation.SlideInUp, Resource.Animation.SlideOutUp).*/Replace(Resource.Id.contentView, Queue.NewInstance()).Commit();
|
||||
MainActivity.instance.FindViewById<BottomNavigationView>(Resource.Id.bottomView).SelectedItemId = Resource.Id.musicLayout;
|
||||
}
|
||||
|
||||
private void Last_Click(object sender, EventArgs e)
|
||||
|
||||
@@ -95,7 +95,8 @@ namespace MusicApp.Resources.Portable_Class
|
||||
if (adapter == null || adapter.Count == 0)
|
||||
{
|
||||
isEmpty = true;
|
||||
Activity.AddContentView(emptyView, View.LayoutParameters);
|
||||
if(emptyView != null)
|
||||
Activity.AddContentView(emptyView, View.LayoutParameters);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ using Android.Views;
|
||||
using Android.Widget;
|
||||
using MusicApp.Resources.values;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace MusicApp.Resources.Portable_Class
|
||||
{
|
||||
@@ -23,7 +24,9 @@ namespace MusicApp.Resources.Portable_Class
|
||||
public bool isEmpty = false;
|
||||
|
||||
private List<Song> tracks = new List<Song>();
|
||||
private string[] actions = new string[] { "Play", "Play Next", "Play Last", "Remove Track from playlist" };
|
||||
private List<string> ytTracksIDs = new List<string>();
|
||||
private List<string> ytTracksIdsResult;
|
||||
private string[] actions = new string[] { "Play", "Play Next", "Play Last", "Remove Track from playlist", "Add To Playlist" };
|
||||
|
||||
|
||||
public override void OnActivityCreated(Bundle savedInstanceState)
|
||||
@@ -118,6 +121,7 @@ namespace MusicApp.Resources.Portable_Class
|
||||
|
||||
adapter = new Adapter(Android.App.Application.Context, Resource.Layout.SongList, tracks);
|
||||
ListAdapter = adapter;
|
||||
ListView.Adapter = adapter;
|
||||
ListView.TextFilterEnabled = true;
|
||||
ListView.ItemClick += ListView_ItemClick;
|
||||
ListView.ItemLongClick += ListView_ItemLongClick;
|
||||
@@ -133,7 +137,7 @@ namespace MusicApp.Resources.Portable_Class
|
||||
string nextPageToken = "";
|
||||
while(nextPageToken != null)
|
||||
{
|
||||
var ytPlaylistRequest = YoutubeEngine.youtubeService.PlaylistItems.List("snippet");
|
||||
var ytPlaylistRequest = YoutubeEngine.youtubeService.PlaylistItems.List("snippet, contentDetails");
|
||||
ytPlaylistRequest.PlaylistId = ytID;
|
||||
ytPlaylistRequest.MaxResults = 50;
|
||||
ytPlaylistRequest.PageToken = nextPageToken;
|
||||
@@ -142,9 +146,9 @@ namespace MusicApp.Resources.Portable_Class
|
||||
|
||||
foreach (var item in ytPlaylist.Items)
|
||||
{
|
||||
Song song = new Song(item.Snippet.Title, item.Snippet.ChannelTitle, item.Snippet.Thumbnails.Default__.Url, -1, -1, item.Id, true);
|
||||
System.Console.WriteLine(song.GetName());
|
||||
Song song = new Song(item.Snippet.Title, item.Snippet.ChannelTitle, item.Snippet.Thumbnails.Default__.Url, -1, -1, item.ContentDetails.VideoId, true);
|
||||
tracks.Add(song);
|
||||
ytTracksIDs.Add(item.Id);
|
||||
}
|
||||
|
||||
nextPageToken = ytPlaylist.NextPageToken;
|
||||
@@ -152,6 +156,7 @@ namespace MusicApp.Resources.Portable_Class
|
||||
|
||||
adapter = new Adapter(Android.App.Application.Context, Resource.Layout.SongList, tracks);
|
||||
ListAdapter = adapter;
|
||||
ListView.Adapter = adapter;
|
||||
ListView.TextFilterEnabled = true;
|
||||
ListView.ItemClick += ListView_ItemClick;
|
||||
ListView.ItemLongClick += ListView_ItemLongClick;
|
||||
@@ -167,11 +172,15 @@ namespace MusicApp.Resources.Portable_Class
|
||||
public void Search(string search)
|
||||
{
|
||||
result = new List<Song>();
|
||||
foreach (Song item in tracks)
|
||||
ytTracksIdsResult = new List<string>();
|
||||
for(int i = 0; i < tracks.Count; i++)
|
||||
{
|
||||
Song item = tracks[i];
|
||||
if (item.GetName().ToLower().Contains(search.ToLower()) || item.GetArtist().ToLower().Contains(search.ToLower()))
|
||||
{
|
||||
result.Add(item);
|
||||
if (ytID != null)
|
||||
ytTracksIdsResult.Add(ytTracksIDs[i]);
|
||||
}
|
||||
}
|
||||
ListAdapter = new Adapter(Android.App.Application.Context, Resource.Layout.SongList, result);
|
||||
@@ -194,6 +203,8 @@ namespace MusicApp.Resources.Portable_Class
|
||||
|
||||
private void ListView_ItemLongClick(object sender, AdapterView.ItemLongClickEventArgs e)
|
||||
{
|
||||
List<string> action = actions.ToList();
|
||||
|
||||
Song item = tracks[e.Position];
|
||||
if (result != null)
|
||||
item = result[e.Position];
|
||||
@@ -203,10 +214,14 @@ namespace MusicApp.Resources.Portable_Class
|
||||
Browse.act = Activity;
|
||||
Browse.inflater = LayoutInflater;
|
||||
}
|
||||
else
|
||||
{
|
||||
action.Add("Download");
|
||||
}
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(Activity, Resource.Style.AppCompatAlertDialogStyle);
|
||||
builder.SetTitle("Pick an action");
|
||||
builder.SetItems(actions, (senderAlert, args) =>
|
||||
builder.SetItems(action.ToArray(), (senderAlert, args) =>
|
||||
{
|
||||
switch (args.Which)
|
||||
{
|
||||
@@ -216,24 +231,43 @@ namespace MusicApp.Resources.Portable_Class
|
||||
else
|
||||
YoutubeEngine.Play(item.GetPath());
|
||||
break;
|
||||
|
||||
case 1:
|
||||
if (!item.IsYt)
|
||||
Browse.PlayNext(item);
|
||||
else
|
||||
YoutubeEngine.PlayNext(item.GetPath());
|
||||
break;
|
||||
|
||||
case 2:
|
||||
if (!item.IsYt)
|
||||
Browse.PlayLast(item);
|
||||
else
|
||||
YoutubeEngine.PlayLast(item.GetPath());
|
||||
break;
|
||||
|
||||
case 3:
|
||||
if (!item.IsYt)
|
||||
RemoveFromPlaylist(item);
|
||||
else
|
||||
YoutubeEngine.RemoveFromPlaylist(item.GetPath(), ytID);
|
||||
{
|
||||
string ytTrackID = ytTracksIDs[e.Position];
|
||||
if (ytTracksIdsResult != null)
|
||||
ytTrackID = ytTracksIdsResult[e.Position];
|
||||
|
||||
YoutubeEngine.RemoveFromPlaylist(ytTrackID);
|
||||
RemoveFromYtPlaylist(item, ytTrackID);
|
||||
}
|
||||
break;
|
||||
|
||||
case 4:
|
||||
YoutubeEngine.GetPlaylists(item.GetPath(), Activity);
|
||||
break;
|
||||
|
||||
case 5:
|
||||
YoutubeEngine.Download(item.GetName(), item.GetPath());
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -241,6 +275,16 @@ namespace MusicApp.Resources.Portable_Class
|
||||
builder.Show();
|
||||
}
|
||||
|
||||
private void RemoveFromYtPlaylist(Song item, string ytTrackID)
|
||||
{
|
||||
tracks.Remove(item);
|
||||
adapter = new Adapter(Android.App.Application.Context, Resource.Layout.SongList, tracks);
|
||||
ListAdapter = adapter;
|
||||
ListView.Adapter = adapter;
|
||||
ytTracksIDs.Remove(ytTrackID);
|
||||
ytTracksIdsResult?.Remove(ytTrackID);
|
||||
}
|
||||
|
||||
void RemoveFromPlaylist(Song item)
|
||||
{
|
||||
ContentResolver resolver = Activity.ContentResolver;
|
||||
|
||||
@@ -7,14 +7,14 @@ using Android.Support.V7.App;
|
||||
using Android.Views;
|
||||
using Android.Widget;
|
||||
using Google.Apis.YouTube.v3;
|
||||
using Google.Apis.YouTube.v3.Data;
|
||||
using Java.Util;
|
||||
using MusicApp.Resources.values;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using YoutubeExplode;
|
||||
using YoutubeExplode.Models.MediaStreams;
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MusicApp.Resources.Portable_Class
|
||||
{
|
||||
@@ -133,7 +133,7 @@ namespace MusicApp.Resources.Portable_Class
|
||||
PlayLast(item.GetPath());
|
||||
break;
|
||||
case 3:
|
||||
GetPlaylists(item.GetPath());
|
||||
GetPlaylists(item.GetPath(), Activity);
|
||||
break;
|
||||
case 4:
|
||||
Download(item.GetName(), item.GetPath());
|
||||
@@ -174,11 +174,11 @@ namespace MusicApp.Resources.Portable_Class
|
||||
if (files.Length < 2)
|
||||
return;
|
||||
|
||||
await Task.Delay(10000);
|
||||
await Task.Delay(5000);
|
||||
|
||||
for(int i = 1; i < files.Length; i++)
|
||||
{
|
||||
MusicPlayer.queue.Add(files[i]);
|
||||
MusicPlayer.queue.Insert(MusicPlayer.CurrentID() + i, files[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -236,23 +236,12 @@ namespace MusicApp.Resources.Portable_Class
|
||||
}
|
||||
}
|
||||
|
||||
public static void RemoveFromPlaylist(string videoID, string playlistID)
|
||||
public static void RemoveFromPlaylist(string videoID)
|
||||
{
|
||||
HashMap parameters = new HashMap();
|
||||
parameters.Put("id", videoID);
|
||||
parameters.Put("onBehalfOfContentOwner", "");
|
||||
|
||||
PlaylistItemsResource.DeleteRequest deleteRequest = youtubeService.PlaylistItems.Delete(playlistID);
|
||||
if (parameters.ContainsKey("onBehalfOfContentOwner") && parameters.Get("onBehalfOfContentOwner").ToString() != "")
|
||||
{
|
||||
deleteRequest.OnBehalfOfContentOwner = parameters.Get("onBehalfOfContentOwner").ToString();
|
||||
}
|
||||
|
||||
deleteRequest.Execute();
|
||||
youtubeService.PlaylistItems.Delete(videoID).Execute();
|
||||
}
|
||||
|
||||
|
||||
public static async void GetPlaylists(string videoID)
|
||||
public static async void GetPlaylists(string videoID, Context context)
|
||||
{
|
||||
if (MainActivity.instance.TokenHasExpire())
|
||||
{
|
||||
@@ -264,19 +253,144 @@ namespace MusicApp.Resources.Portable_Class
|
||||
}
|
||||
|
||||
List<string> playList = new List<string>();
|
||||
List<long> playListId = new List<long>();
|
||||
List<string> playListId = new List<string>();
|
||||
playList.Add("Create a playlist");
|
||||
playListId.Add(0);
|
||||
playListId.Add("newPlaylist");
|
||||
|
||||
|
||||
|
||||
//AlertDialog.Builder builder = new AlertDialog.Builder(act, Resource.Style.AppCompatAlertDialogStyle);
|
||||
//builder.SetTitle("Add to a playlist");
|
||||
//builder.SetItems(playList.ToArray(), (senderAlert, args) =>
|
||||
//{
|
||||
// AddToPlaylist(item, playList[args.Which], playListId[args.Which]);
|
||||
//});
|
||||
//builder.Show();
|
||||
HashMap parameters = new HashMap();
|
||||
parameters.Put("part", "snippet,contentDetails");
|
||||
parameters.Put("mine", "true");
|
||||
parameters.Put("maxResults", "25");
|
||||
parameters.Put("onBehalfOfContentOwner", "");
|
||||
parameters.Put("onBehalfOfContentOwnerChannel", "");
|
||||
|
||||
PlaylistsResource.ListRequest ytPlaylists = youtubeService.Playlists.List(parameters.Get("part").ToString());
|
||||
|
||||
if (parameters.ContainsKey("mine") && parameters.Get("mine").ToString() != "")
|
||||
{
|
||||
bool mine = (parameters.Get("mine").ToString() == "true") ? true : false;
|
||||
ytPlaylists.Mine = mine;
|
||||
}
|
||||
|
||||
if (parameters.ContainsKey("maxResults"))
|
||||
{
|
||||
ytPlaylists.MaxResults = long.Parse(parameters.Get("maxResults").ToString());
|
||||
}
|
||||
|
||||
if (parameters.ContainsKey("onBehalfOfContentOwner") && parameters.Get("onBehalfOfContentOwner").ToString() != "")
|
||||
{
|
||||
ytPlaylists.OnBehalfOfContentOwner = parameters.Get("onBehalfOfContentOwner").ToString();
|
||||
}
|
||||
|
||||
if (parameters.ContainsKey("onBehalfOfContentOwnerChannel") && parameters.Get("onBehalfOfContentOwnerChannel").ToString() != "")
|
||||
{
|
||||
ytPlaylists.OnBehalfOfContentOwnerChannel = parameters.Get("onBehalfOfContentOwnerChannel").ToString();
|
||||
}
|
||||
|
||||
PlaylistListResponse response = await ytPlaylists.ExecuteAsync();
|
||||
|
||||
for (int i = 0; i < response.Items.Count; i++)
|
||||
{
|
||||
Google.Apis.YouTube.v3.Data.Playlist playlist = response.Items[i];
|
||||
playList.Add(playlist.Snippet.Title);
|
||||
playListId.Add(playlist.Id);
|
||||
}
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(context, Resource.Style.AppCompatAlertDialogStyle);
|
||||
builder.SetTitle("Add to a playlist");
|
||||
builder.SetItems(playList.ToArray(), (senderAlert, args) =>
|
||||
{
|
||||
AddToPlaylist(videoID, playListId[args.Which], context);
|
||||
});
|
||||
builder.Show();
|
||||
}
|
||||
|
||||
public static void AddToPlaylist(string videoID, string playlistID, Context context)
|
||||
{
|
||||
if(playlistID == "newPlaylist")
|
||||
{
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(context, Resource.Style.AppCompatAlertDialogStyle);
|
||||
builder.SetTitle("Playlist name");
|
||||
View view = MainActivity.instance.LayoutInflater.Inflate(Resource.Layout.CreatePlaylistDialog, null);
|
||||
builder.SetView(view);
|
||||
builder.SetNegativeButton("Cancel", (senderAlert, args) => { });
|
||||
builder.SetPositiveButton("Create", (senderAlert, args) =>
|
||||
{
|
||||
NewPlaylist(view.FindViewById<EditText>(Resource.Id.playlistName).Text, videoID);
|
||||
});
|
||||
builder.Show();
|
||||
}
|
||||
else
|
||||
{
|
||||
HashMap parameters = new HashMap();
|
||||
parameters.Put("part", "snippet");
|
||||
parameters.Put("onBehalfOfContentOwner", "");
|
||||
|
||||
PlaylistItem playlistItem = new PlaylistItem();
|
||||
PlaylistItemSnippet snippet = new PlaylistItemSnippet();
|
||||
snippet.PlaylistId = playlistID;
|
||||
ResourceId resourceId = new ResourceId();
|
||||
resourceId.Kind = "youtube#video";
|
||||
resourceId.VideoId = videoID;
|
||||
snippet.ResourceId = resourceId;
|
||||
playlistItem.Snippet = snippet;
|
||||
|
||||
var insertRequest = youtubeService.PlaylistItems.Insert(playlistItem, parameters.Get("part").ToString());
|
||||
|
||||
if (parameters.ContainsKey("onBehalfOfContentOwner") && parameters.Get("onBehalfOfContentOwner").ToString() != "")
|
||||
{
|
||||
insertRequest.OnBehalfOfContentOwner = parameters.Get("onBehalfOfContentOwner").ToString();
|
||||
}
|
||||
|
||||
insertRequest.Execute();
|
||||
}
|
||||
}
|
||||
|
||||
public static void NewPlaylist(string playlistName, string videoID)
|
||||
{
|
||||
HashMap parameters = new HashMap();
|
||||
parameters.Put("part", "snippet,status");
|
||||
parameters.Put("onBehalfOfContentOwner", "");
|
||||
|
||||
|
||||
Google.Apis.YouTube.v3.Data.Playlist playlist = new Google.Apis.YouTube.v3.Data.Playlist();
|
||||
PlaylistSnippet snippet = new PlaylistSnippet();
|
||||
PlaylistStatus status = new PlaylistStatus();
|
||||
snippet.Title = playlistName;
|
||||
playlist.Snippet = snippet;
|
||||
playlist.Status = status;
|
||||
|
||||
var createRequest = youtubeService.Playlists.Insert(playlist, parameters.Get("part").ToString());
|
||||
|
||||
if (parameters.ContainsKey("onBehalfOfContentOwner") && parameters.Get("onBehalfOfContentOwner").ToString() != "")
|
||||
{
|
||||
createRequest.OnBehalfOfContentOwner = parameters.Get("onBehalfOfContentOwner").ToString();
|
||||
}
|
||||
|
||||
Google.Apis.YouTube.v3.Data.Playlist response = createRequest.Execute();
|
||||
|
||||
parameters = new HashMap();
|
||||
parameters.Put("part", "snippet");
|
||||
parameters.Put("onBehalfOfContentOwner", "");
|
||||
|
||||
PlaylistItem playlistItem = new PlaylistItem();
|
||||
PlaylistItemSnippet snippetItem = new PlaylistItemSnippet();
|
||||
snippetItem.PlaylistId = response.Id;
|
||||
ResourceId resourceId = new ResourceId();
|
||||
resourceId.Kind = "youtube#video";
|
||||
resourceId.VideoId = videoID;
|
||||
snippetItem.ResourceId = resourceId;
|
||||
playlistItem.Snippet = snippetItem;
|
||||
|
||||
var insertRequest = youtubeService.PlaylistItems.Insert(playlistItem, parameters.Get("part").ToString());
|
||||
|
||||
if (parameters.ContainsKey("onBehalfOfContentOwner") && parameters.Get("onBehalfOfContentOwner").ToString() != "")
|
||||
{
|
||||
insertRequest.OnBehalfOfContentOwner = parameters.Get("onBehalfOfContentOwner").ToString();
|
||||
}
|
||||
|
||||
insertRequest.Execute();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -120,8 +120,9 @@ namespace MusicApp.Resources.Portable_Class
|
||||
playlists.Add(song);
|
||||
}
|
||||
|
||||
Adapter ytAdapter = new Adapter(Android.App.Application.Context, Resource.Layout.SongList, playlists);
|
||||
ListAdapter = ytAdapter;
|
||||
adapter = new Adapter(Android.App.Application.Context, Resource.Layout.SongList, playlists);
|
||||
ListAdapter = adapter;
|
||||
ListView.Adapter = adapter;
|
||||
ListView.ItemClick += ListView_ItemClick;
|
||||
ListView.ItemLongClick += ListView_ItemLongClick;
|
||||
}
|
||||
@@ -170,7 +171,7 @@ namespace MusicApp.Resources.Portable_Class
|
||||
string nextPageToken = "";
|
||||
while (nextPageToken != null)
|
||||
{
|
||||
var ytPlaylistRequest = YoutubeEngine.youtubeService.PlaylistItems.List("snippet");
|
||||
var ytPlaylistRequest = YoutubeEngine.youtubeService.PlaylistItems.List("snippet, contentDetails");
|
||||
ytPlaylistRequest.PlaylistId = playlistID;
|
||||
ytPlaylistRequest.MaxResults = 50;
|
||||
ytPlaylistRequest.PageToken = nextPageToken;
|
||||
@@ -179,13 +180,14 @@ namespace MusicApp.Resources.Portable_Class
|
||||
|
||||
foreach (var item in ytPlaylist.Items)
|
||||
{
|
||||
Song song = new Song(item.Snippet.Title, item.Snippet.ChannelTitle, item.Snippet.Thumbnails.Default__.Url, -1, -1, item.Id, true, false);
|
||||
System.Console.WriteLine(item.Snippet.Title);
|
||||
Song song = new Song(item.Snippet.Title, "", item.Snippet.Thumbnails.Default__.Url, -1, -1, item.ContentDetails.VideoId, true, false);
|
||||
tracks.Add(song);
|
||||
}
|
||||
|
||||
nextPageToken = ytPlaylist.NextPageToken;
|
||||
}
|
||||
|
||||
System.Console.WriteLine("All tracks are retrived");
|
||||
YoutubeEngine.PlayFiles(tracks.ToArray());
|
||||
}
|
||||
|
||||
@@ -205,11 +207,16 @@ namespace MusicApp.Resources.Portable_Class
|
||||
|
||||
void RenamePlaylist(int position, string name, string playlistID)
|
||||
{
|
||||
Google.Apis.YouTube.v3.Data.Playlist playlist = new Google.Apis.YouTube.v3.Data.Playlist();
|
||||
playlist.Snippet = YtPlaylists[position].Snippet;
|
||||
playlist.Snippet.Title = name;
|
||||
playlist.Id = playlistID;
|
||||
|
||||
YtPlaylists[position].Snippet.Title = name;
|
||||
YoutubeEngine.youtubeService.Playlists.Update(YtPlaylists[position], "snippet/title").Execute();
|
||||
YoutubeEngine.youtubeService.Playlists.Update(playlist, "snippet").Execute();
|
||||
|
||||
playlists[position].SetName(name);
|
||||
ListAdapter = new ArrayAdapter(Android.App.Application.Context, Resource.Layout.PlaylistList, playlists);
|
||||
adapter.NotifyDataSetChanged();
|
||||
if (ListAdapter.Count == 0)
|
||||
{
|
||||
isEmpty = true;
|
||||
@@ -232,7 +239,10 @@ namespace MusicApp.Resources.Portable_Class
|
||||
deleteRequest.Execute();
|
||||
|
||||
playlists.RemoveAt(position);
|
||||
ListAdapter = new ArrayAdapter(Android.App.Application.Context, Resource.Layout.PlaylistList, playlists);
|
||||
YtPlaylists.RemoveAt(position);
|
||||
adapter = new Adapter(Android.App.Application.Context, Resource.Layout.SongList, playlists);
|
||||
ListAdapter = adapter;
|
||||
ListView.Adapter = adapter;
|
||||
if (ListAdapter.Count == 0)
|
||||
{
|
||||
isEmpty = true;
|
||||
|
||||
75
MusicApp/Resources/Resource.Designer.cs
generated
75
MusicApp/Resources/Resource.Designer.cs
generated
@@ -2360,26 +2360,26 @@ namespace MusicApp
|
||||
// aapt resource value: 0x7f020053
|
||||
public const int avd_hide_password = 2130837587;
|
||||
|
||||
// aapt resource value: 0x7f020083
|
||||
public const int avd_hide_password_1 = 2130837635;
|
||||
|
||||
// aapt resource value: 0x7f020084
|
||||
public const int avd_hide_password_2 = 2130837636;
|
||||
public const int avd_hide_password_1 = 2130837636;
|
||||
|
||||
// aapt resource value: 0x7f020085
|
||||
public const int avd_hide_password_3 = 2130837637;
|
||||
public const int avd_hide_password_2 = 2130837637;
|
||||
|
||||
// aapt resource value: 0x7f020086
|
||||
public const int avd_hide_password_3 = 2130837638;
|
||||
|
||||
// aapt resource value: 0x7f020054
|
||||
public const int avd_show_password = 2130837588;
|
||||
|
||||
// aapt resource value: 0x7f020086
|
||||
public const int avd_show_password_1 = 2130837638;
|
||||
|
||||
// aapt resource value: 0x7f020087
|
||||
public const int avd_show_password_2 = 2130837639;
|
||||
public const int avd_show_password_1 = 2130837639;
|
||||
|
||||
// aapt resource value: 0x7f020088
|
||||
public const int avd_show_password_3 = 2130837640;
|
||||
public const int avd_show_password_2 = 2130837640;
|
||||
|
||||
// aapt resource value: 0x7f020089
|
||||
public const int avd_show_password_3 = 2130837641;
|
||||
|
||||
// aapt resource value: 0x7f020055
|
||||
public const int design_bottom_navigation_item_background = 2130837589;
|
||||
@@ -2454,70 +2454,73 @@ namespace MusicApp
|
||||
public const int ic_playlist_add_white_24dp = 2130837612;
|
||||
|
||||
// aapt resource value: 0x7f02006d
|
||||
public const int ic_skip_next_black_24dp = 2130837613;
|
||||
public const int ic_query_builder_black_24dp = 2130837613;
|
||||
|
||||
// aapt resource value: 0x7f02006e
|
||||
public const int ic_skip_previous_black_24dp = 2130837614;
|
||||
public const int ic_skip_next_black_24dp = 2130837614;
|
||||
|
||||
// aapt resource value: 0x7f02006f
|
||||
public const int ic_timer_white_24dp = 2130837615;
|
||||
public const int ic_skip_previous_black_24dp = 2130837615;
|
||||
|
||||
// aapt resource value: 0x7f020070
|
||||
public const int MusicIcon = 2130837616;
|
||||
public const int ic_timer_white_24dp = 2130837616;
|
||||
|
||||
// aapt resource value: 0x7f020071
|
||||
public const int navigation_empty_icon = 2130837617;
|
||||
public const int MusicIcon = 2130837617;
|
||||
|
||||
// aapt resource value: 0x7f020072
|
||||
public const int noAlbum = 2130837618;
|
||||
public const int navigation_empty_icon = 2130837618;
|
||||
|
||||
// aapt resource value: 0x7f020073
|
||||
public const int notification_action_background = 2130837619;
|
||||
public const int noAlbum = 2130837619;
|
||||
|
||||
// aapt resource value: 0x7f020074
|
||||
public const int notification_bg = 2130837620;
|
||||
public const int notification_action_background = 2130837620;
|
||||
|
||||
// aapt resource value: 0x7f020075
|
||||
public const int notification_bg_low = 2130837621;
|
||||
public const int notification_bg = 2130837621;
|
||||
|
||||
// aapt resource value: 0x7f020076
|
||||
public const int notification_bg_low_normal = 2130837622;
|
||||
public const int notification_bg_low = 2130837622;
|
||||
|
||||
// aapt resource value: 0x7f020077
|
||||
public const int notification_bg_low_pressed = 2130837623;
|
||||
public const int notification_bg_low_normal = 2130837623;
|
||||
|
||||
// aapt resource value: 0x7f020078
|
||||
public const int notification_bg_normal = 2130837624;
|
||||
public const int notification_bg_low_pressed = 2130837624;
|
||||
|
||||
// aapt resource value: 0x7f020079
|
||||
public const int notification_bg_normal_pressed = 2130837625;
|
||||
public const int notification_bg_normal = 2130837625;
|
||||
|
||||
// aapt resource value: 0x7f02007a
|
||||
public const int notification_icon_background = 2130837626;
|
||||
|
||||
// aapt resource value: 0x7f020081
|
||||
public const int notification_template_icon_bg = 2130837633;
|
||||
|
||||
// aapt resource value: 0x7f020082
|
||||
public const int notification_template_icon_low_bg = 2130837634;
|
||||
public const int notification_bg_normal_pressed = 2130837626;
|
||||
|
||||
// aapt resource value: 0x7f02007b
|
||||
public const int notification_tile_bg = 2130837627;
|
||||
public const int notification_icon_background = 2130837627;
|
||||
|
||||
// aapt resource value: 0x7f020082
|
||||
public const int notification_template_icon_bg = 2130837634;
|
||||
|
||||
// aapt resource value: 0x7f020083
|
||||
public const int notification_template_icon_low_bg = 2130837635;
|
||||
|
||||
// aapt resource value: 0x7f02007c
|
||||
public const int notify_panel_notification_icon_bg = 2130837628;
|
||||
public const int notification_tile_bg = 2130837628;
|
||||
|
||||
// aapt resource value: 0x7f02007d
|
||||
public const int PlaylistPlay = 2130837629;
|
||||
public const int notify_panel_notification_icon_bg = 2130837629;
|
||||
|
||||
// aapt resource value: 0x7f02007e
|
||||
public const int PlaylistPlayIcon = 2130837630;
|
||||
public const int PlaylistPlay = 2130837630;
|
||||
|
||||
// aapt resource value: 0x7f02007f
|
||||
public const int search = 2130837631;
|
||||
public const int PlaylistPlayIcon = 2130837631;
|
||||
|
||||
// aapt resource value: 0x7f020080
|
||||
public const int settings = 2130837632;
|
||||
public const int search = 2130837632;
|
||||
|
||||
// aapt resource value: 0x7f020081
|
||||
public const int settings = 2130837633;
|
||||
|
||||
static Drawable()
|
||||
{
|
||||
|
||||
BIN
MusicApp/Resources/drawable/ic_query_builder_black_24dp.png
Normal file
BIN
MusicApp/Resources/drawable/ic_query_builder_black_24dp.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 546 B |
Reference in New Issue
Block a user