youtube extractor translated bu not working,

trying with the official api
This commit is contained in:
Gboy9155
2017-11-04 16:33:07 +01:00
parent a884776e22
commit 20ddc69780
8 changed files with 195 additions and 85 deletions

View File

@@ -208,7 +208,6 @@ namespace MusicApp
case Resource.Id.browseLayout:
SetTabs();
DisplaySearch();
break;
case Resource.Id.downloadLayout:

View File

@@ -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>

View File

@@ -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();
Song song = list[e.Position];
YoutubeExtractor extractor = new YoutubeExtractor();
extractor.OnExtractionComplete += DownloadList_OnExtractionComplete;
extractor.Extract(song.GetPath(), true, true, song);
}
if (video.RequiresDecryption)
private void DownloadList_OnExtractionComplete(SparseArray<YtFile> ytFiles, Song song)
{
System.Console.WriteLine("Extraction complete : " + ytFiles.Size());
if(ytFiles == null || ytFiles.Size() < 1)
{
DownloadUrlResolver.DecryptDownloadUrl(video);
Toast.MakeText(Android.App.Application.Context, "Download failed, try again", ToastLength.Short).Show();
return;
}
System.Console.WriteLine(video.DownloadUrl);
Song song = list[e.Position];
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)

View File

@@ -163,5 +163,6 @@
", isDashContainer=" + isDashContainer +
", isHlsContent=" + isHlsContent +
'}';
}
}
}

View File

@@ -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)
InitializeService();
Console.WriteLine("URL: " + url);
InitializeService();
await player.SetDataSourceAsync(Application.Context, Uri.Parse(url));
player.PrepareAsync();
//isRunning = true;
//if (player == null)
// InitializeService();
if (mediaSession != null)
{
player.Reset();
InitializePlayer();
await player.SetDataSourceAsync(Application.Context, Uri.Parse(url));
player.PrepareAsync();
CreateNotification(title, artist, 0, imageURL);
//if (mediaSession != null)
//{
// player.Reset();
// InitializePlayer();
// await player.SetDataSourceAsync(Application.Context, Uri.Parse(url));
// player.PrepareAsync();
// CreateNotification(title, artist, 0, imageURL);
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());
// 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);
}
// 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)

View File

@@ -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
{

View File

@@ -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();
}
}
}

View File

@@ -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>