diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 447d01ddc..5ce399d91 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -153,6 +153,9 @@
android:label="@string/title_activity_channel"
android:theme="@style/AppTheme.NoActionBar" />
+
\ No newline at end of file
diff --git a/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java b/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java
new file mode 100644
index 000000000..f503bfcff
--- /dev/null
+++ b/app/src/main/java/org/schabi/newpipe/ReCaptchaActivity.java
@@ -0,0 +1,138 @@
+package org.schabi.newpipe;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.v4.app.NavUtils;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.AppCompatActivity;
+import android.view.MenuItem;
+import android.webkit.CookieManager;
+import android.webkit.ValueCallback;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+
+/**
+ * Created by beneth on 06.12.16.
+ *
+ * Copyright (C) Christian Schabesberger 2015
+ * ReCaptchaActivity.java is part of NewPipe.
+ *
+ * NewPipe is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * NewPipe is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with NewPipe. If not, see .
+ */
+public class ReCaptchaActivity extends AppCompatActivity {
+ public static final String TAG = ReCaptchaActivity.class.toString();
+ public static final String YT_URL = "https://www.youtube.com";
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_recaptcha);
+
+ ActionBar actionBar = getSupportActionBar();
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ actionBar.setTitle(R.string.reCaptcha_title);
+ actionBar.setDisplayShowTitleEnabled(true);
+
+ WebView myWebView = (WebView) findViewById(R.id.reCaptchaWebView);
+
+ // Enable Javascript
+ WebSettings webSettings = myWebView.getSettings();
+ webSettings.setJavaScriptEnabled(true);
+
+ ReCaptchaWebViewClient webClient = new ReCaptchaWebViewClient(this);
+ myWebView.setWebViewClient(webClient);
+
+ // Cleaning cache, history and cookies from webView
+ myWebView.clearCache(true);
+ myWebView.clearHistory();
+ android.webkit.CookieManager cookieManager = CookieManager.getInstance();
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+ cookieManager.removeAllCookies(new ValueCallback() {
+ @Override
+ public void onReceiveValue(Boolean aBoolean) {}
+ });
+ } else {
+ cookieManager.removeAllCookie();
+ }
+
+ myWebView.loadUrl(YT_URL);
+ }
+
+ private class ReCaptchaWebViewClient extends WebViewClient {
+ private Activity context;
+ private String mCookies;
+
+ ReCaptchaWebViewClient(Activity ctx) {
+ context = ctx;
+ }
+
+ @Override
+ public void onPageFinished(WebView view, String url) {
+ String cookies = CookieManager.getInstance().getCookie(url);
+
+ // find cookies : s_gl & goojf and Add cookies to Downloader
+ if (find_access_cookies(cookies)) {
+ // Give cookies to Downloader class
+ Downloader.setCookies(mCookies);
+
+ // Closing activity and return to parent.
+ Intent intent = new Intent(context, org.schabi.newpipe.MainActivity.class);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ NavUtils.navigateUpTo(context, intent);
+ }
+ }
+
+ private boolean find_access_cookies(String cookies) {
+ boolean ret = false;
+ String c_s_gl = "";
+ String c_goojf = "";
+
+ String[] parts = cookies.split("; ");
+ for (String part : parts) {
+ if (part.trim().startsWith("s_gl")) {
+ c_s_gl = part.trim();
+ }
+ if (part.trim().startsWith("goojf")) {
+ c_goojf = part.trim();
+ }
+ }
+ if (c_s_gl.length() > 0 && c_goojf.length() > 0) {
+ ret = true;
+ //mCookies = c_s_gl + "; " + c_goojf;
+ // Youtube seems to also need the other cookies:
+ mCookies = cookies;
+ }
+
+ return ret;
+ }
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ int id = item.getItemId();
+ switch (id) {
+ case android.R.id.home: {
+ Intent intent = new Intent(this, org.schabi.newpipe.MainActivity.class);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ NavUtils.navigateUpTo(this, intent);
+ return true;
+ }
+ default:
+ return false;
+ }
+ }
+}
diff --git a/app/src/main/res/layout/activity_recaptcha.xml b/app/src/main/res/layout/activity_recaptcha.xml
new file mode 100644
index 000000000..0a3b03010
--- /dev/null
+++ b/app/src/main/res/layout/activity_recaptcha.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index dfd247dd7..208cac70d 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -269,6 +269,8 @@
"when a user tries to pick up one of cards.\n\n"
Settings
+ reCaptcha
+ reCaptcha Challenge