Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
4baa23af5f
|
@ -8,8 +8,8 @@ android {
|
||||||
applicationId "org.schabi.newpipe"
|
applicationId "org.schabi.newpipe"
|
||||||
minSdkVersion 15
|
minSdkVersion 15
|
||||||
targetSdkVersion 25
|
targetSdkVersion 25
|
||||||
versionCode 22
|
versionCode 23
|
||||||
versionName "0.8.8"
|
versionName "0.8.9"
|
||||||
}
|
}
|
||||||
buildTypes {
|
buildTypes {
|
||||||
release {
|
release {
|
||||||
|
@ -32,10 +32,10 @@ android {
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
testCompile 'junit:junit:4.12'
|
testCompile 'junit:junit:4.12'
|
||||||
compile 'com.android.support:appcompat-v7:25.1.0'
|
compile 'com.android.support:appcompat-v7:25.1.1'
|
||||||
compile 'com.android.support:support-v4:25.1.0'
|
compile 'com.android.support:support-v4:25.1.1'
|
||||||
compile 'com.android.support:design:25.1.0'
|
compile 'com.android.support:design:25.1.1'
|
||||||
compile 'com.android.support:recyclerview-v7:25.1.0'
|
compile 'com.android.support:recyclerview-v7:25.1.1'
|
||||||
compile 'org.jsoup:jsoup:1.8.3'
|
compile 'org.jsoup:jsoup:1.8.3'
|
||||||
compile 'org.mozilla:rhino:1.7.7'
|
compile 'org.mozilla:rhino:1.7.7'
|
||||||
compile 'info.guardianproject.netcipher:netcipher:1.2'
|
compile 'info.guardianproject.netcipher:netcipher:1.2'
|
||||||
|
|
|
@ -73,8 +73,9 @@ public class ChannelActivity extends AppCompatActivity {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
if (Objects.equals(PreferenceManager.getDefaultSharedPreferences(this)
|
if (PreferenceManager.getDefaultSharedPreferences(this)
|
||||||
.getString("theme", getResources().getString(R.string.light_theme_title)), getResources().getString(R.string.dark_theme_title))) {
|
.getString("theme", getResources().getString(R.string.light_theme_title)).
|
||||||
|
equals(getResources().getString(R.string.dark_theme_title))) {
|
||||||
setTheme(R.style.DarkTheme_NoActionBar);
|
setTheme(R.style.DarkTheme_NoActionBar);
|
||||||
}
|
}
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
|
@ -1,21 +1,19 @@
|
||||||
package org.schabi.newpipe;
|
package org.schabi.newpipe;
|
||||||
|
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
import android.support.v7.app.AppCompatActivity;
|
import android.support.v7.app.AppCompatActivity;
|
||||||
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import static org.schabi.newpipe.R.attr.theme;
|
|
||||||
|
|
||||||
public class ThemableActivity extends AppCompatActivity {
|
public class ThemableActivity extends AppCompatActivity {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
if (Objects.equals(PreferenceManager.getDefaultSharedPreferences(this)
|
if (PreferenceManager.getDefaultSharedPreferences(this)
|
||||||
.getString("theme", getResources().getString(R.string.light_theme_title)), getResources().getString(R.string.dark_theme_title))) {
|
.getString("theme", getResources().getString(R.string.light_theme_title)).
|
||||||
setTheme(R.style.DarkTheme);
|
equals(getResources().getString(R.string.dark_theme_title))) {
|
||||||
|
setTheme(R.style.DarkTheme);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -125,10 +125,13 @@ public class StreamInfoWorker {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (YoutubeStreamExtractor.DecryptException de) {
|
} catch (YoutubeStreamExtractor.DecryptException de) {
|
||||||
// custom service related exceptions
|
// custom service related exceptions
|
||||||
|
ErrorActivity.reportError(h, a, de, VideoItemDetailFragment.class, null,
|
||||||
|
ErrorActivity.ErrorInfo.make(ErrorActivity.REQUESTED_STREAM,
|
||||||
|
service.getServiceInfo().name, videoUrl, R.string.youtube_signature_decryption_error));
|
||||||
h.post(new Runnable() {
|
h.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
onStreamInfoReceivedListener.onError(R.string.youtube_signature_decryption_error);
|
a.finish();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
de.printStackTrace();
|
de.printStackTrace();
|
||||||
|
|
|
@ -144,6 +144,7 @@ public class VideoItemDetailFragment extends Fragment {
|
||||||
TextView similarTitle = (TextView) activity.findViewById(R.id.detail_similar_title);
|
TextView similarTitle = (TextView) activity.findViewById(R.id.detail_similar_title);
|
||||||
Button backgroundButton = (Button)
|
Button backgroundButton = (Button)
|
||||||
activity.findViewById(R.id.detail_stream_thumbnail_window_background_button);
|
activity.findViewById(R.id.detail_stream_thumbnail_window_background_button);
|
||||||
|
View thumbnailView = activity.findViewById(R.id.detail_thumbnail_view);
|
||||||
View topView = activity.findViewById(R.id.detailTopView);
|
View topView = activity.findViewById(R.id.detailTopView);
|
||||||
Button channelButton = (Button) activity.findViewById(R.id.channel_button);
|
Button channelButton = (Button) activity.findViewById(R.id.channel_button);
|
||||||
|
|
||||||
|
@ -275,6 +276,14 @@ public class VideoItemDetailFragment extends Fragment {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
//todo: make backgroundButton handle this
|
||||||
|
thumbnailView.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
playVideo(info);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
if (info.channel_url != null && info.channel_url != "") {
|
if (info.channel_url != null && info.channel_url != "") {
|
||||||
channelButton.setOnClickListener(new View.OnClickListener() {
|
channelButton.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -42,15 +42,23 @@ public class Parser {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String matchGroup1(String pattern, String input) throws RegexException {
|
public static String matchGroup1(String pattern, String input) throws RegexException {
|
||||||
|
return matchGroup(pattern, input, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String matchGroup(String pattern, String input, int group) throws RegexException {
|
||||||
Pattern pat = Pattern.compile(pattern);
|
Pattern pat = Pattern.compile(pattern);
|
||||||
Matcher mat = pat.matcher(input);
|
Matcher mat = pat.matcher(input);
|
||||||
boolean foundMatch = mat.find();
|
boolean foundMatch = mat.find();
|
||||||
if (foundMatch) {
|
if (foundMatch) {
|
||||||
return mat.group(1);
|
return mat.group(group);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
//Log.e(TAG, "failed to find pattern \""+pattern+"\" inside of \""+input+"\"");
|
//Log.e(TAG, "failed to find pattern \""+pattern+"\" inside of \""+input+"\"");
|
||||||
throw new RegexException("failed to find pattern \""+pattern+" inside of "+input+"\"");
|
if(input.length() > 1024) {
|
||||||
|
throw new RegexException("failed to find pattern \""+pattern);
|
||||||
|
} else {
|
||||||
|
throw new RegexException("failed to find pattern \"" + pattern + " inside of " + input + "\"");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -791,10 +791,15 @@ public class YoutubeStreamExtractor extends StreamExtractor {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Downloader downloader = NewPipe.getDownloader();
|
Downloader downloader = NewPipe.getDownloader();
|
||||||
|
if(!playerUrl.contains("https://youtube.com")) {
|
||||||
|
//sometimes the https://youtube.com part does not get send with
|
||||||
|
//than we have to add it by hand
|
||||||
|
playerUrl = "https://youtube.com" + playerUrl;
|
||||||
|
}
|
||||||
String playerCode = downloader.download(playerUrl);
|
String playerCode = downloader.download(playerUrl);
|
||||||
|
|
||||||
decryptionFuncName =
|
decryptionFuncName =
|
||||||
Parser.matchGroup1("\\.sig\\|\\|([a-zA-Z0-9$]+)\\(", playerCode);
|
Parser.matchGroup("([\"\\'])signature\\1\\s*,\\s*([a-zA-Z0-9$]+)\\(", playerCode, 2);
|
||||||
|
|
||||||
String functionPattern = "("
|
String functionPattern = "("
|
||||||
+ decryptionFuncName.replace("$", "\\$")
|
+ decryptionFuncName.replace("$", "\\$")
|
||||||
|
|
|
@ -46,9 +46,10 @@ public class SettingsActivity extends PreferenceActivity {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceBundle) {
|
protected void onCreate(Bundle savedInstanceBundle) {
|
||||||
if (Objects.equals(PreferenceManager.getDefaultSharedPreferences(this)
|
if (PreferenceManager.getDefaultSharedPreferences(this)
|
||||||
.getString("theme", getResources().getString(R.string.light_theme_title)), getResources().getString(R.string.dark_theme_title))) {
|
.getString("theme", getResources().getString(R.string.light_theme_title)).
|
||||||
setTheme(R.style.DarkTheme);
|
equals(getResources().getString(R.string.dark_theme_title))) {
|
||||||
|
setTheme(R.style.DarkTheme);
|
||||||
}
|
}
|
||||||
getDelegate().installViewFactory();
|
getDelegate().installViewFactory();
|
||||||
getDelegate().onCreate(savedInstanceBundle);
|
getDelegate().onCreate(savedInstanceBundle);
|
||||||
|
|
|
@ -42,7 +42,7 @@
|
||||||
android:id="@+id/errorMessageView"
|
android:id="@+id/errorMessageView"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:textColor="?android:attr/colorAccent"
|
android:textColor="?attr/colorAccent"
|
||||||
android:text="@string/info_labels"/>
|
android:text="@string/info_labels"/>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
|
@ -63,7 +63,7 @@
|
||||||
android:id="@+id/errorInfoLabelsView"
|
android:id="@+id/errorInfoLabelsView"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:textColor="?android:attr/colorAccent"
|
android:textColor="?attr/colorAccent"
|
||||||
android:text="@string/info_labels"/>
|
android:text="@string/info_labels"/>
|
||||||
|
|
||||||
<HorizontalScrollView
|
<HorizontalScrollView
|
||||||
|
|
Loading…
Reference in New Issue