mirror of
https://github.com/zoriya/Opus.git
synced 2025-12-06 06:26:15 +00:00
youtube extractor translated bu not working,
trying with the official api
This commit is contained in:
@@ -208,7 +208,6 @@ namespace MusicApp
|
||||
|
||||
case Resource.Id.browseLayout:
|
||||
SetTabs();
|
||||
DisplaySearch();
|
||||
break;
|
||||
|
||||
case Resource.Id.downloadLayout:
|
||||
|
||||
@@ -58,6 +58,21 @@
|
||||
<Reference Include="FFMpeg.Xamarin, Version=1.0.31.22165, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Xamarin.Android.FFmpeg.1.0.32\lib\FFMpeg.Xamarin.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Google.Apis, Version=1.30.0.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Google.Apis.1.30.0\lib\netstandard1.3\Google.Apis.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Google.Apis.Auth, Version=1.30.0.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Google.Apis.Auth.1.30.0\lib\netstandard1.3\Google.Apis.Auth.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Google.Apis.Auth.PlatformServices, Version=1.30.0.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Google.Apis.Auth.1.30.0\lib\netstandard1.3\Google.Apis.Auth.PlatformServices.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Google.Apis.Core, Version=1.30.0.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Google.Apis.Core.1.30.0\lib\netstandard1.3\Google.Apis.Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Google.Apis.YouTube.v3, Version=1.30.0.1006, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Google.Apis.YouTube.v3.1.30.0.1006\lib\netstandard1.3\Google.Apis.YouTube.v3.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Newtonsoft.Json.10.0.3\lib\netstandard1.3\Newtonsoft.Json.dll</HintPath>
|
||||
@@ -137,9 +152,6 @@
|
||||
<Reference Include="YoutubeExplode, Version=3.2.5.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\YoutubeExplode.3.2.5\lib\netstandard1.1\YoutubeExplode.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="YoutubeExtractor, Version=0.10.11.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\YoutubeExtractor.0.10.11\lib\portable-net45+win8+wpa81+wp8\YoutubeExtractor.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="YoutubeSearch, Version=0.1.1.0, Culture=neutral, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\YoutubeSearch.dll.1.1\lib\YoutubeSearch.dll</HintPath>
|
||||
</Reference>
|
||||
|
||||
@@ -8,11 +8,8 @@ using Android.Support.Design.Widget;
|
||||
using YoutubeSearch;
|
||||
using MusicApp.Resources.values;
|
||||
using Android.Support.V7.Preferences;
|
||||
using YoutubeExtractor;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Square.Picasso;
|
||||
using System;
|
||||
using static MusicApp.Resources.Portable_Class.YoutubeExtractor;
|
||||
using Android.Util;
|
||||
|
||||
namespace MusicApp.Resources.Portable_Class
|
||||
{
|
||||
@@ -87,30 +84,85 @@ namespace MusicApp.Resources.Portable_Class
|
||||
ListAdapter = new Adapter(Android.App.Application.Context, Resource.Layout.SongList, list);
|
||||
}
|
||||
|
||||
private /*async*/ void ListView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
|
||||
private void ListView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
|
||||
{
|
||||
//await Task.Run(() =>
|
||||
//{
|
||||
Toast.MakeText(Android.App.Application.Context, "Playing : " + list[e.Position].GetPath(), ToastLength.Short).Show();
|
||||
IEnumerable<VideoInfo> videoInfos = DownloadUrlResolver.GetDownloadUrls(list[e.Position].GetPath(), false);
|
||||
//VideoInfo video = videoInfos.Where(info => info.VideoType == VideoType.Mp4 && info.Resolution == 0).OrderByDescending(info => info.AudioBitrate).First();
|
||||
VideoInfo video = videoInfos.Where(info => info.AudioBitrate > 0 && info.AdaptiveType == AdaptiveType.Audio).OrderByDescending(info => info.AudioBitrate).First();
|
||||
|
||||
if (video.RequiresDecryption)
|
||||
{
|
||||
DownloadUrlResolver.DecryptDownloadUrl(video);
|
||||
Song song = list[e.Position];
|
||||
YoutubeExtractor extractor = new YoutubeExtractor();
|
||||
extractor.OnExtractionComplete += DownloadList_OnExtractionComplete;
|
||||
extractor.Extract(song.GetPath(), true, true, song);
|
||||
}
|
||||
|
||||
System.Console.WriteLine(video.DownloadUrl);
|
||||
|
||||
Song song = list[e.Position];
|
||||
private void DownloadList_OnExtractionComplete(SparseArray<YtFile> ytFiles, Song song)
|
||||
{
|
||||
System.Console.WriteLine("Extraction complete : " + ytFiles.Size());
|
||||
if(ytFiles == null || ytFiles.Size() < 1)
|
||||
{
|
||||
Toast.MakeText(Android.App.Application.Context, "Download failed, try again", ToastLength.Short).Show();
|
||||
return;
|
||||
}
|
||||
|
||||
YtFile ytFile = GetBestStream(ytFiles);
|
||||
Intent intent = new Intent(Android.App.Application.Context, typeof(MusicPlayer));
|
||||
intent.SetAction("YTPlay");
|
||||
intent.PutExtra("file", video.DownloadUrl);
|
||||
intent.PutExtra("file", ytFile.url);
|
||||
intent.PutStringArrayListExtra("song", new string[] { song.GetName(), song.GetArtist(), song.GetAlbum() });
|
||||
Activity.StartService(intent);
|
||||
//});
|
||||
}
|
||||
|
||||
private YtFile GetBestStream(SparseArray<YtFile> ytFiles)
|
||||
{
|
||||
List<int> keys = new List<int>();
|
||||
for (int i = 0; i < ytFiles.Size(); i++)
|
||||
{
|
||||
System.Console.WriteLine("Key " + i + " : " + ytFiles.KeyAt(i));
|
||||
keys.Add(ytFiles.KeyAt(i));
|
||||
}
|
||||
|
||||
// WEBM Dash Audio
|
||||
if (keys.Contains(251))
|
||||
return ytFiles.Get(251);
|
||||
if (keys.Contains(171))
|
||||
return ytFiles.Get(171);
|
||||
if (keys.Contains(250))
|
||||
return ytFiles.Get(250);
|
||||
if (keys.Contains(249))
|
||||
return ytFiles.Get(249);
|
||||
|
||||
// Dash Audio
|
||||
if (keys.Contains(141))
|
||||
return ytFiles.Get(141);
|
||||
if (keys.Contains(140))
|
||||
return ytFiles.Get(140);
|
||||
|
||||
// Video and Audio
|
||||
if (keys.Contains(22))
|
||||
return ytFiles.Get(22);
|
||||
if (keys.Contains(43))
|
||||
return ytFiles.Get(43);
|
||||
if (keys.Contains(18))
|
||||
return ytFiles.Get(18);
|
||||
if (keys.Contains(5))
|
||||
return ytFiles.Get(5);
|
||||
if (keys.Contains(36))
|
||||
return ytFiles.Get(36);
|
||||
if (keys.Contains(17))
|
||||
return ytFiles.Get(17);
|
||||
|
||||
// HLS Live Stream
|
||||
if (keys.Contains(96))
|
||||
return ytFiles.Get(96);
|
||||
if (keys.Contains(95))
|
||||
return ytFiles.Get(95);
|
||||
if (keys.Contains(94))
|
||||
return ytFiles.Get(94);
|
||||
if (keys.Contains(93))
|
||||
return ytFiles.Get(93);
|
||||
if (keys.Contains(92))
|
||||
return ytFiles.Get(92);
|
||||
if (keys.Contains(91))
|
||||
return ytFiles.Get(91);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private void ListView_ItemLongClick(object sender, AdapterView.ItemLongClickEventArgs e)
|
||||
|
||||
@@ -164,4 +164,5 @@
|
||||
", isHlsContent=" + isHlsContent +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -174,47 +174,51 @@ namespace MusicApp.Resources.Portable_Class
|
||||
|
||||
public async void PlayFromYT(string url, string title, string artist, string imageURL)
|
||||
{
|
||||
isRunning = true;
|
||||
if (player == null)
|
||||
Console.WriteLine("URL: " + url);
|
||||
InitializeService();
|
||||
|
||||
if (mediaSession != null)
|
||||
{
|
||||
player.Reset();
|
||||
InitializePlayer();
|
||||
await player.SetDataSourceAsync(Application.Context, Uri.Parse(url));
|
||||
player.PrepareAsync();
|
||||
CreateNotification(title, artist, 0, imageURL);
|
||||
//isRunning = true;
|
||||
//if (player == null)
|
||||
// InitializeService();
|
||||
|
||||
queue.Clear();
|
||||
Song item = new Song(title, artist, imageURL, -1, 1, url);
|
||||
queue.Add(item);
|
||||
return;
|
||||
}
|
||||
try
|
||||
{
|
||||
mediaSession = new MediaSessionCompat(Application.Context, "MusicApp");
|
||||
mediaSession.SetFlags(MediaSessionCompat.FlagHandlesMediaButtons | MediaSessionCompat.FlagHandlesTransportControls);
|
||||
PlaybackStateCompat.Builder builder = new PlaybackStateCompat.Builder().SetActions(PlaybackStateCompat.ActionPlay | PlaybackStateCompat.ActionPause);
|
||||
mediaSession.SetPlaybackState(builder.Build());
|
||||
//if (mediaSession != null)
|
||||
//{
|
||||
// player.Reset();
|
||||
// InitializePlayer();
|
||||
// await player.SetDataSourceAsync(Application.Context, Uri.Parse(url));
|
||||
// player.PrepareAsync();
|
||||
// CreateNotification(title, artist, 0, imageURL);
|
||||
|
||||
await player.SetDataSourceAsync(Application.Context, Uri.Parse(url));
|
||||
var audioFocus = audioManager.RequestAudioFocus(this, Stream.Music, AudioFocus.Gain);
|
||||
if (audioFocus != AudioFocusRequest.Granted)
|
||||
{
|
||||
Console.WriteLine("Can't Get Audio Focus");
|
||||
return;
|
||||
}
|
||||
player.PrepareAsync();
|
||||
CreateNotification(title, artist, 0, imageURL);
|
||||
queue.Clear();
|
||||
Song item = new Song(title, artist, imageURL, -1, 1, url);
|
||||
queue.Add(item);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("Error: " + ex);
|
||||
}
|
||||
// queue.Clear();
|
||||
// Song item = new Song(title, artist, imageURL, -1, 1, url);
|
||||
// queue.Add(item);
|
||||
// return;
|
||||
//}
|
||||
//try
|
||||
//{
|
||||
// mediaSession = new MediaSessionCompat(Application.Context, "MusicApp");
|
||||
// mediaSession.SetFlags(MediaSessionCompat.FlagHandlesMediaButtons | MediaSessionCompat.FlagHandlesTransportControls);
|
||||
// PlaybackStateCompat.Builder builder = new PlaybackStateCompat.Builder().SetActions(PlaybackStateCompat.ActionPlay | PlaybackStateCompat.ActionPause);
|
||||
// mediaSession.SetPlaybackState(builder.Build());
|
||||
|
||||
// await player.SetDataSourceAsync(Application.Context, Uri.Parse(url));
|
||||
// var audioFocus = audioManager.RequestAudioFocus(this, Stream.Music, AudioFocus.Gain);
|
||||
// if (audioFocus != AudioFocusRequest.Granted)
|
||||
// {
|
||||
// Console.WriteLine("Can't Get Audio Focus");
|
||||
// return;
|
||||
// }
|
||||
// player.PrepareAsync();
|
||||
// CreateNotification(title, artist, 0, imageURL);
|
||||
// queue.Clear();
|
||||
// Song item = new Song(title, artist, imageURL, -1, 1, url);
|
||||
// queue.Add(item);
|
||||
//}
|
||||
//catch (Exception ex)
|
||||
//{
|
||||
// Console.WriteLine("Error: " + ex);
|
||||
//}
|
||||
}
|
||||
|
||||
public async void RandomPlay(List<string> filePath)
|
||||
|
||||
@@ -11,10 +11,6 @@ using Android.Content.PM;
|
||||
using Android.Support.Design.Widget;
|
||||
using Android;
|
||||
using Android.Net;
|
||||
using MusicApp.Resources.values;
|
||||
using Square.Picasso;
|
||||
|
||||
using EventArgs = System.EventArgs;
|
||||
|
||||
namespace MusicApp.Resources.Portable_Class
|
||||
{
|
||||
|
||||
@@ -8,14 +8,16 @@ using Java.Net;
|
||||
using Java.IO;
|
||||
using Java.Util.Concurrent.Locks;
|
||||
using Android.Webkit;
|
||||
using MusicApp.Resources.values;
|
||||
|
||||
namespace MusicApp.Resources.Portable_Class
|
||||
{
|
||||
public abstract class YoutubeExtractor : Android.OS.AsyncTask<string, int, SparseArray<YtFile>>, IValueCallback
|
||||
public class YoutubeExtractor : Android.OS.AsyncTask<string, int, SparseArray<YtFile>>, IValueCallback
|
||||
{
|
||||
private const int dashRetries = 5;
|
||||
private bool parseDashManifest;
|
||||
private bool includeWebM;
|
||||
private Song song = null;
|
||||
|
||||
private string videoID;
|
||||
private bool useHttps = true;
|
||||
@@ -123,16 +125,21 @@ namespace MusicApp.Resources.Portable_Class
|
||||
#endregion
|
||||
|
||||
|
||||
public YoutubeExtractor()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public YoutubeExtractor(IntPtr doNotUse, JniHandleOwnership transfer) : base(doNotUse, transfer)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void Extract(string youtubeURL, bool parseDashManifest, bool includeWebM)
|
||||
public void Extract(string youtubeURL, bool parseDashManifest, bool includeWebM, Song song = null)
|
||||
{
|
||||
this.parseDashManifest = parseDashManifest;
|
||||
this.includeWebM = includeWebM;
|
||||
this.song = song;
|
||||
this.Execute(youtubeURL);
|
||||
}
|
||||
|
||||
@@ -141,12 +148,21 @@ namespace MusicApp.Resources.Portable_Class
|
||||
base.OnPreExecute();
|
||||
}
|
||||
|
||||
protected override void OnPostExecute(SparseArray<YtFile> ytFiles)
|
||||
protected override void OnPostExecute(Java.Lang.Object result)
|
||||
{
|
||||
OnExtractionComplete(ytFiles);
|
||||
base.OnPostExecute(result);
|
||||
OnExtractionComplete((SparseArray<YtFile>) result, song);
|
||||
}
|
||||
|
||||
protected abstract void OnExtractionComplete(SparseArray<YtFile> ytFiles);
|
||||
protected override void OnPostExecute(SparseArray<YtFile> ytFiles)
|
||||
{
|
||||
System.Console.WriteLine("Post Execute");
|
||||
base.OnPostExecute(ytFiles);
|
||||
OnExtractionComplete(ytFiles, song);
|
||||
}
|
||||
|
||||
public delegate void ExtractionComplete(SparseArray<YtFile> ytFiles, Song song);
|
||||
public event ExtractionComplete OnExtractionComplete;
|
||||
|
||||
protected override Java.Lang.Object DoInBackground(params Java.Lang.Object[] native_parms)
|
||||
{
|
||||
@@ -170,7 +186,9 @@ namespace MusicApp.Resources.Portable_Class
|
||||
{
|
||||
try
|
||||
{
|
||||
return GetStreamUrls();
|
||||
var urls = GetStreamUrls();
|
||||
System.Console.WriteLine("Finial Size: " + urls.Size());
|
||||
return urls;
|
||||
}
|
||||
catch (Java.Lang.Exception e)
|
||||
{
|
||||
@@ -207,6 +225,7 @@ namespace MusicApp.Resources.Portable_Class
|
||||
}
|
||||
|
||||
VideoMeta videoMeta = ParseVideoMeta(streamMap);
|
||||
System.Console.WriteLine(videoMeta.title);
|
||||
if (videoMeta.isLiveStream)
|
||||
{
|
||||
return GetLiveStreamUrls(streamMap);
|
||||
@@ -233,7 +252,7 @@ namespace MusicApp.Resources.Portable_Class
|
||||
string[] streams = streamMapJL.Split(",|url_encoded_fmt_stream_map|&adaptive_fmts=");
|
||||
SparseArray<YtFile> ytFiles = new SparseArray<YtFile>();
|
||||
|
||||
foreach(string foo in streams)
|
||||
foreach (string foo in streams)
|
||||
{
|
||||
string encStream = foo + ",";
|
||||
if (!encStream.Contains("itag%3D"))
|
||||
@@ -275,10 +294,13 @@ namespace MusicApp.Resources.Portable_Class
|
||||
ytFiles.Put(itag, newVideo);
|
||||
}
|
||||
}
|
||||
System.Console.WriteLine("Size: " + ytFiles.Size());
|
||||
if(encSignatures != null)
|
||||
{
|
||||
decipheredSignature = null;
|
||||
if (DecipherSignature(encSignatures))
|
||||
bool boo = DecipherSignature(encSignatures);
|
||||
System.Console.WriteLine("booleanbOO : " + boo);
|
||||
if (boo)
|
||||
{
|
||||
Ilock.Lock();
|
||||
try
|
||||
@@ -332,6 +354,9 @@ namespace MusicApp.Resources.Portable_Class
|
||||
|
||||
private bool DecipherSignature(SparseArray<string> encSignatures)
|
||||
{
|
||||
bool dfn = decipherFunctionName == null;
|
||||
bool dfs = decipherFunctions == null;
|
||||
System.Console.WriteLine("DecipherFunctionName: " + dfn + " DecipherFunctions: " + dfs);
|
||||
if(decipherFunctionName == null || decipherFunctions == null)
|
||||
{
|
||||
string decipherFunctUrl = "https://s.ytimg.com/yts/jsbin/" + decipherJsFileName;
|
||||
@@ -378,6 +403,7 @@ namespace MusicApp.Resources.Portable_Class
|
||||
mainDecipherFunct = "function " + decipherFunctionName + matcher.Group(2);
|
||||
}
|
||||
|
||||
System.Console.WriteLine("Etap 1 succed");
|
||||
int startIndex = matcher.End();
|
||||
char[] javascriptChars = javascriptFile.ToCharArray();
|
||||
for (int braces = 1, i = 0; i < javascriptFile.Length; i++)
|
||||
@@ -393,6 +419,7 @@ namespace MusicApp.Resources.Portable_Class
|
||||
braces--;
|
||||
}
|
||||
decipherFunctions = mainDecipherFunct;
|
||||
System.Console.WriteLine("Etap 2 succed");
|
||||
matcher = patVariableFunction.Matcher(mainDecipherFunct);
|
||||
while (matcher.Find())
|
||||
{
|
||||
@@ -401,21 +428,21 @@ namespace MusicApp.Resources.Portable_Class
|
||||
continue;
|
||||
|
||||
startIndex = javascriptFile.IndexOf(variableDef) + variableDef.Length;
|
||||
javascriptChars = javascriptFile.ToCharArray();
|
||||
for (int braces = 1, i = startIndex; i < javascriptFile.Length; i++)
|
||||
for (int braces = 1, i = 0; i < javascriptFile.Length - startIndex; i++)
|
||||
{
|
||||
if (braces == 0)
|
||||
{
|
||||
decipherFunctions += variableDef + javascriptFile.Substring(startIndex, i) + ";";
|
||||
break;
|
||||
}
|
||||
if (javascriptChars[i] == '{')
|
||||
if (javascriptFile[i] == '{')
|
||||
braces++;
|
||||
else if (javascriptChars[i] == '}')
|
||||
else if (javascriptFile[i] == '}')
|
||||
braces--;
|
||||
}
|
||||
}
|
||||
|
||||
System.Console.WriteLine("Etap 3 succed");
|
||||
matcher = patFunction.Matcher(mainDecipherFunct);
|
||||
while (matcher.Find())
|
||||
{
|
||||
@@ -424,22 +451,22 @@ namespace MusicApp.Resources.Portable_Class
|
||||
continue;
|
||||
|
||||
startIndex = javascriptFile.IndexOf(functionDef) + functionDef.Length;
|
||||
javascriptChars = javascriptFile.ToCharArray();
|
||||
for (int braces = 0, i = startIndex; i < javascriptFile.Length; i++)
|
||||
for (int braces = 0, i = 0; i < javascriptFile.Length - startIndex; i++)
|
||||
{
|
||||
if (braces == 0 && startIndex + 5 < i)
|
||||
{
|
||||
decipherFunctions += functionDef + javascriptFile.Substring(startIndex, i) + ";";
|
||||
break;
|
||||
}
|
||||
if (javascriptChars[i] == '{')
|
||||
if (javascriptFile[i] == '{')
|
||||
braces++;
|
||||
else if (javascriptChars[i] == '}')
|
||||
else if (javascriptFile[i] == '}')
|
||||
braces--;
|
||||
}
|
||||
}
|
||||
|
||||
System.Console.WriteLine("Work fine");
|
||||
DecipherViaWebView(encSignatures);
|
||||
System.Console.WriteLine("Deciphered via Web");
|
||||
WriteDeciperFunctToCache();
|
||||
}
|
||||
else
|
||||
@@ -464,15 +491,23 @@ namespace MusicApp.Resources.Portable_Class
|
||||
}
|
||||
stringBuilder.Append("};decipher();");
|
||||
|
||||
Android.OS.Handler handler = new Android.OS.Handler((sender) =>
|
||||
Android.OS.Handler handler = new Android.OS.Handler(MainActivity.instance.MainLooper);
|
||||
handler.Post(() =>
|
||||
{
|
||||
WebView webView = new WebView(Android.App.Application.Context);
|
||||
webView.EvaluateJavascript(stringBuilder.ToString(), this);
|
||||
});
|
||||
|
||||
//Android.OS.Handler handler = new Android.OS.Handler((sender) =>
|
||||
//{
|
||||
// WebView webView = new WebView(Android.App.Application.Context);
|
||||
// webView.EvaluateJavascript(stringBuilder.ToString(), this);
|
||||
//});
|
||||
}
|
||||
|
||||
public void OnReceiveValue(Java.Lang.Object value)
|
||||
{
|
||||
System.Console.WriteLine("Value receive");
|
||||
Ilock.Lock();
|
||||
try
|
||||
{
|
||||
@@ -720,6 +755,11 @@ namespace MusicApp.Resources.Portable_Class
|
||||
|
||||
return new VideoMeta(videoID, title, author, channelID, length, viewCount, isLiveStream);
|
||||
}
|
||||
|
||||
protected override SparseArray<YtFile> RunInBackground(params string[] @params)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Google.Apis" version="1.30.0" targetFramework="monoandroid70" />
|
||||
<package id="Google.Apis.Auth" version="1.30.0" targetFramework="monoandroid70" />
|
||||
<package id="Google.Apis.Core" version="1.30.0" targetFramework="monoandroid70" />
|
||||
<package id="Google.Apis.YouTube.v3" version="1.30.0.1006" targetFramework="monoandroid70" />
|
||||
<package id="Microsoft.CSharp" version="4.4.0" targetFramework="monoandroid70" />
|
||||
<package id="Microsoft.NETCore.Platforms" version="2.0.0" targetFramework="monoandroid70" />
|
||||
<package id="Microsoft.Win32.Primitives" version="4.3.0" targetFramework="monoandroid70" />
|
||||
@@ -17,6 +21,7 @@
|
||||
<package id="System.ComponentModel.TypeConverter" version="4.3.0" targetFramework="monoandroid70" />
|
||||
<package id="System.Console" version="4.3.0" targetFramework="monoandroid70" />
|
||||
<package id="System.Diagnostics.Debug" version="4.3.0" targetFramework="monoandroid70" />
|
||||
<package id="System.Diagnostics.Process" version="4.3.0" targetFramework="monoandroid70" />
|
||||
<package id="System.Diagnostics.Tools" version="4.3.0" targetFramework="monoandroid70" />
|
||||
<package id="System.Diagnostics.Tracing" version="4.3.0" targetFramework="monoandroid70" />
|
||||
<package id="System.Globalization" version="4.3.0" targetFramework="monoandroid70" />
|
||||
@@ -30,11 +35,13 @@
|
||||
<package id="System.Linq.Expressions" version="4.3.0" targetFramework="monoandroid70" />
|
||||
<package id="System.Net.Http" version="4.3.3" targetFramework="monoandroid70" />
|
||||
<package id="System.Net.Primitives" version="4.3.0" targetFramework="monoandroid70" />
|
||||
<package id="System.Net.Requests" version="4.3.0" targetFramework="monoandroid70" />
|
||||
<package id="System.Net.Sockets" version="4.3.0" targetFramework="monoandroid70" />
|
||||
<package id="System.ObjectModel" version="4.3.0" targetFramework="monoandroid70" />
|
||||
<package id="System.Reflection" version="4.3.0" targetFramework="monoandroid70" />
|
||||
<package id="System.Reflection.Extensions" version="4.3.0" targetFramework="monoandroid70" />
|
||||
<package id="System.Reflection.Primitives" version="4.3.0" targetFramework="monoandroid70" />
|
||||
<package id="System.Reflection.TypeExtensions" version="4.3.0" targetFramework="monoandroid70" />
|
||||
<package id="System.Resources.ResourceManager" version="4.3.0" targetFramework="monoandroid70" />
|
||||
<package id="System.Runtime" version="4.3.0" targetFramework="monoandroid70" />
|
||||
<package id="System.Runtime.Extensions" version="4.3.0" targetFramework="monoandroid70" />
|
||||
@@ -73,6 +80,5 @@
|
||||
<package id="Xamarin.Android.Support.v7.RecyclerView" version="25.4.0.2" targetFramework="monoandroid70" />
|
||||
<package id="Xamarin.Android.Support.Vector.Drawable" version="25.4.0.2" targetFramework="monoandroid70" />
|
||||
<package id="YoutubeExplode" version="3.2.5" targetFramework="monoandroid70" />
|
||||
<package id="YoutubeExtractor" version="0.10.11" targetFramework="monoandroid70" />
|
||||
<package id="YoutubeSearch.dll" version="1.1" targetFramework="monoandroid70" />
|
||||
</packages>
|
||||
Reference in New Issue
Block a user