mirror of
				https://github.com/TeamNewPipe/NewPipe
				synced 2025-10-31 07:13:00 +00:00 
			
		
		
		
	Merge remote-tracking branch 'origin/master'
This commit is contained in:
		| @@ -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 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Weblate
					Weblate