Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
74a8139ac9
|
@ -1,40 +1,42 @@
|
||||||
NewPipe contribution guidelines
|
NewPipe contribution guidelines
|
||||||
===============================
|
===============================
|
||||||
|
|
||||||
READ THIS GUIDELINES CAREFULLY BEFORE CONTRIBUTING.
|
PLEASE READ THESE GUIDELINES CAREFULLY BEFORE ANY CONTRIBUTION!
|
||||||
|
|
||||||
## Crash reporting
|
## Crash reporting
|
||||||
|
|
||||||
Do not report crashes in the GitHub issue tracker. NewPipe has an automated crash report system that will ask you to send a report if a crash occurs.
|
Do not report crashes in the GitHub issue tracker. NewPipe has an automated crash report system that will ask you to send a report via e-mail when a crash occurs. This contains all the data we need for debugging, and allows you to even add a comment to it. You'll see exactly what is sent, the system is 100% transparent.
|
||||||
|
|
||||||
## Issue reporting/feature request
|
## Issue reporting/feature requests
|
||||||
|
|
||||||
* Search the [existing issues](https://github.com/theScrabi/NewPipe/issues) first to make sure your issue/feature hasn't been reported/requested before
|
* Search the [existing issues](https://github.com/TeamNewPipe/NewPipe/issues) first to make sure your issue/feature hasn't been reported/requested before
|
||||||
* Check if this issue/feature is already fixed/implemented in the repository
|
* Check whether your issue/feature is already fixed/implemented
|
||||||
* If you are an android/java developer you are always welcome to fix/implement an issue/a feature yourself
|
* If you are an Android/Java developer, you are always welcome to fix/implement an issue/a feature yourself. PRs welcome!
|
||||||
* Use english
|
* We use English for development. Issues in other languages will be closed and ignored.
|
||||||
|
|
||||||
## Bugfixing
|
## Bug Fixing
|
||||||
* If you want to help NewPipe getting bug free, you can send me a mail to tnp@newpipe.schabi.org to let me know that you intent to help, and than register at our [sentry](https://support.schabi.org) setup.
|
* If you want to help NewPipe to become free of bugs (this is our utopic goal for NewPipe), you can send us an email to tnp@newpipe.schabi.org to let me know that you intend to help. We'll send you further instructions. You may, on request, register at our [Sentry](https://sentry.schabi.org) instance (see section "Crash reporting" for more information.
|
||||||
|
|
||||||
## Translation
|
## Translation
|
||||||
|
|
||||||
* NewPipe can be translated on [weblate](https://hosted.weblate.org/projects/newpipe/strings/)
|
* NewPipe can be translated via [Weblate](https://hosted.weblate.org/projects/newpipe/strings/). You can log in there with your GitHub account.
|
||||||
|
|
||||||
## Code contribution
|
## Code contribution
|
||||||
|
|
||||||
* Stick to NewPipe style guidelines (just look the other code and than do it the same way :) )
|
* Stick to NewPipe's style conventions (well, just look the other code and then do it the same way :))
|
||||||
* Do not bring nonfree software/binary blobs into the project (keep it google free)
|
* Do not bring non-free software (e.g., binary blobs) into the project. Also, make sure you do not introduce Google libraries.
|
||||||
* Stick to [f-droid contribution guidelines](https://f-droid.org/wiki/page/Inclusion_Policy)
|
* Stick to [F-Droid contribution guidelines](https://f-droid.org/wiki/page/Inclusion_Policy)
|
||||||
* Make changes on a separate branch, not on the master branch (Feature-branching)
|
* Make changes on a separate branch, not on the master branch. This is commonly known as *feature branch workflow*. You may then send your
|
||||||
* When submitting changes, you agree that your code will be licensed under GPLv3
|
* When submitting changes, you confirm that your code is licensed under the terms of the [GNU General Public License v3](https://www.gnu.org/licenses/gpl-3.0.html).
|
||||||
* Please test (compile and run) your code before you submit changes!!!
|
* Please test (compile and run) your code before you submit changes! Ideally, provide test feedback in the PR description. Untested code will **not** be merged!
|
||||||
* Try to figure out you selves why CI fails, or why a merge request collides
|
* Try to figure out yourself why builds on our CI fail.
|
||||||
* Please maintain your code after you contributed it.
|
* Make sure your PR is up-to-date with the rest of the code. Often, a simple click on "Update branch" will do the job, but if not, you are asked to merge the master branch manually and resolve the problems on your own. That will make the maintainers' jobs way easier.
|
||||||
* Respond yourselves if someone request changes or notifies issues
|
* Please show intention to maintain your features and code after you contributed it. Unmaintained code is a hassle for the core developers, and just adds work. If you do not intend to maintain features you contributed, please think again about sumission, or clearly state that in the description of your PR.
|
||||||
|
* Respond yourselves if someone requests changes or otherwise raises issues about your PRs.
|
||||||
|
|
||||||
## Communication
|
## Communication
|
||||||
|
|
||||||
* WE DO NOW HAVE A MAILING LIST: [newpipe@list.schabi.org](https://list.schabi.org/cgi-bin/mailman/listinfo/newpipe).
|
* WE DO NOW HAVE A MAILING LIST: [newpipe@list.schabi.org](https://list.schabi.org/cgi-bin/mailman/listinfo/newpipe).
|
||||||
* If you want to get in contact with me or one of our other contributors you can send me an email at tnp(at)schabi.org
|
* There is an IRC channel on Freenode which is regularly visited by the core team and other developers: [#newpipe](irc:irc.freenode.net/newpipe). [Click here for Webchat](https://webchat.freenode.net/?channels=newpipe)!
|
||||||
* Feel free to post suggestions, changes, ideas etc!
|
* If you want to get in touch with the core team or one of our other contributors you can send an email to tnp(at)schabi.org. Please do not send issue reports, they will be ignored and remain unanswered! Use the GitHub issue tracker described above!
|
||||||
|
* Feel free to post suggestions, changes, ideas etc. on GitHub, IRC or the mailing list!
|
||||||
|
|
|
@ -5,10 +5,10 @@ android:
|
||||||
components:
|
components:
|
||||||
# The BuildTools version used by NewPipe
|
# The BuildTools version used by NewPipe
|
||||||
- tools
|
- tools
|
||||||
- build-tools-25.0.2
|
- build-tools-26.0.1
|
||||||
|
|
||||||
# The SDK version used to compile NewPipe
|
# The SDK version used to compile NewPipe
|
||||||
- android-25
|
- android-26
|
||||||
|
|
||||||
# Additional components
|
# Additional components
|
||||||
- extra-android-m2repository
|
- extra-android-m2repository
|
||||||
|
@ -17,4 +17,3 @@ script: ./gradlew -Dorg.gradle.jvmargs=-Xmx1536m assembleDebug lintDebug testDeb
|
||||||
|
|
||||||
licenses:
|
licenses:
|
||||||
- '.+'
|
- '.+'
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
apply plugin: 'com.android.application'
|
apply plugin: 'com.android.application'
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 25
|
compileSdkVersion 26
|
||||||
buildToolsVersion '25.0.2'
|
buildToolsVersion '26.0.1'
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "org.schabi.newpipe"
|
applicationId "org.schabi.newpipe"
|
||||||
minSdkVersion 15
|
minSdkVersion 15
|
||||||
targetSdkVersion 25
|
targetSdkVersion 26
|
||||||
versionCode 37
|
versionCode 37
|
||||||
versionName "0.9.10"
|
versionName "0.9.10"
|
||||||
|
|
||||||
|
@ -42,10 +42,10 @@ dependencies {
|
||||||
testCompile 'org.mockito:mockito-core:1.10.19'
|
testCompile 'org.mockito:mockito-core:1.10.19'
|
||||||
testCompile 'org.json:json:20160810'
|
testCompile 'org.json:json:20160810'
|
||||||
|
|
||||||
compile 'com.android.support:appcompat-v7:25.3.1'
|
compile 'com.android.support:appcompat-v7:26.0.0'
|
||||||
compile 'com.android.support:support-v4:25.3.1'
|
compile 'com.android.support:support-v4:26.0.0'
|
||||||
compile 'com.android.support:design:25.3.1'
|
compile 'com.android.support:design:26.0.0'
|
||||||
compile 'com.android.support:recyclerview-v7:25.3.1'
|
compile 'com.android.support:recyclerview-v7:26.0.0'
|
||||||
|
|
||||||
compile 'com.google.code.gson:gson:2.7'
|
compile 'com.google.code.gson:gson:2.7'
|
||||||
compile 'org.jsoup:jsoup:1.8.3'
|
compile 'org.jsoup:jsoup:1.8.3'
|
||||||
|
|
|
@ -27,6 +27,7 @@ import org.schabi.newpipe.extractor.stream_info.StreamInfo;
|
||||||
import org.schabi.newpipe.extractor.stream_info.VideoStream;
|
import org.schabi.newpipe.extractor.stream_info.VideoStream;
|
||||||
import org.schabi.newpipe.fragments.detail.SpinnerToolbarAdapter;
|
import org.schabi.newpipe.fragments.detail.SpinnerToolbarAdapter;
|
||||||
import org.schabi.newpipe.settings.NewPipeSettings;
|
import org.schabi.newpipe.settings.NewPipeSettings;
|
||||||
|
import org.schabi.newpipe.util.FilenameUtils;
|
||||||
import org.schabi.newpipe.util.PermissionHelper;
|
import org.schabi.newpipe.util.PermissionHelper;
|
||||||
import org.schabi.newpipe.util.ThemeHelper;
|
import org.schabi.newpipe.util.ThemeHelper;
|
||||||
import org.schabi.newpipe.util.Utils;
|
import org.schabi.newpipe.util.Utils;
|
||||||
|
@ -107,7 +108,7 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck
|
||||||
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
|
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
|
||||||
super.onViewCreated(view, savedInstanceState);
|
super.onViewCreated(view, savedInstanceState);
|
||||||
nameEditText = ((EditText) view.findViewById(R.id.file_name));
|
nameEditText = ((EditText) view.findViewById(R.id.file_name));
|
||||||
nameEditText.setText(createFileName(currentInfo.title));
|
nameEditText.setText(FilenameUtils.createFilename(getContext(), currentInfo.title));
|
||||||
selectedAudioIndex = Utils.getPreferredAudioFormat(getContext(), currentInfo.audio_streams);
|
selectedAudioIndex = Utils.getPreferredAudioFormat(getContext(), currentInfo.audio_streams);
|
||||||
|
|
||||||
streamsSpinner = (Spinner) view.findViewById(R.id.quality_spinner);
|
streamsSpinner = (Spinner) view.findViewById(R.id.quality_spinner);
|
||||||
|
@ -252,30 +253,12 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* #143 #44 #42 #22: make sure that the filename does not contain illegal chars.
|
|
||||||
* This should fix some of the "cannot download" problems.
|
|
||||||
*/
|
|
||||||
private String createFileName(String fileName) {
|
|
||||||
// from http://eng-przemelek.blogspot.de/2009/07/how-to-create-valid-file-name.html
|
|
||||||
|
|
||||||
List<String> forbiddenCharsPatterns = new ArrayList<>();
|
|
||||||
forbiddenCharsPatterns.add("[:]+"); // Mac OS, but it looks that also Windows XP
|
|
||||||
forbiddenCharsPatterns.add("[\\*\"/\\\\\\[\\]\\:\\;\\|\\=\\,]+"); // Windows
|
|
||||||
forbiddenCharsPatterns.add("[^\\w\\d\\.]+"); // last chance... only latin letters and digits
|
|
||||||
String nameToTest = fileName;
|
|
||||||
for (String pattern : forbiddenCharsPatterns) {
|
|
||||||
nameToTest = nameToTest.replaceAll(pattern, "_");
|
|
||||||
}
|
|
||||||
return nameToTest;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void downloadSelected() {
|
private void downloadSelected() {
|
||||||
String url, location;
|
String url, location;
|
||||||
|
|
||||||
String fileName = nameEditText.getText().toString().trim();
|
String fileName = nameEditText.getText().toString().trim();
|
||||||
if (fileName.isEmpty()) fileName = createFileName(currentInfo.title);
|
if (fileName.isEmpty()) fileName = FilenameUtils.createFilename(getContext(), currentInfo.title);
|
||||||
|
|
||||||
boolean isAudio = radioVideoAudioGroup.getCheckedRadioButtonId() == R.id.audio_button;
|
boolean isAudio = radioVideoAudioGroup.getCheckedRadioButtonId() == R.id.audio_button;
|
||||||
url = isAudio ? currentInfo.audio_streams.get(selectedAudioIndex).url : sortedStreamVideosList.get(selectedVideoIndex).url;
|
url = isAudio ? currentInfo.audio_streams.get(selectedAudioIndex).url : sortedStreamVideosList.get(selectedVideoIndex).url;
|
||||||
|
|
|
@ -519,7 +519,7 @@ public abstract class BasePlayer implements ExoPlayer.EventListener, AudioManage
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isPlaying()) audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
|
if (!isPlaying()) audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
|
||||||
else audioManager.abandonAudioFocus(null);
|
else audioManager.abandonAudioFocus(this);
|
||||||
|
|
||||||
simpleExoPlayer.setPlayWhenReady(!isPlaying());
|
simpleExoPlayer.setPlayWhenReady(!isPlaying());
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
package org.schabi.newpipe.util;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
|
|
||||||
|
import org.schabi.newpipe.R;
|
||||||
|
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
public class FilenameUtils {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* #143 #44 #42 #22: make sure that the filename does not contain illegal chars.
|
||||||
|
* @param context the context to retrieve strings and preferences from
|
||||||
|
* @param title the title to create a filename from
|
||||||
|
* @return the filename
|
||||||
|
*/
|
||||||
|
public static String createFilename(Context context, String title) {
|
||||||
|
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
final String key = context.getString(R.string.settings_file_charset_key);
|
||||||
|
final String value = sharedPreferences.getString(key, context.getString(R.string.default_file_charset_value));
|
||||||
|
Pattern pattern = Pattern.compile(value);
|
||||||
|
|
||||||
|
final String replacementChar = sharedPreferences.getString(context.getString(R.string.settings_file_replacement_character_key), "_");
|
||||||
|
return createFilename(title, pattern, replacementChar);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a valid filename
|
||||||
|
* @param title the title to create a filename from
|
||||||
|
* @param invalidCharacters patter matching invalid characters
|
||||||
|
* @param replacementChar the replacement
|
||||||
|
* @return the filename
|
||||||
|
*/
|
||||||
|
private static String createFilename(String title, Pattern invalidCharacters, String replacementChar) {
|
||||||
|
return title.replaceAll(invalidCharacters.pattern(), replacementChar);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,12 +1,12 @@
|
||||||
package us.shandian.giga.ui.common;
|
package us.shandian.giga.ui.common;
|
||||||
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v7.app.ActionBarActivity;
|
import android.support.v7.app.AppCompatActivity;
|
||||||
import android.support.v7.widget.Toolbar;
|
import android.support.v7.widget.Toolbar;
|
||||||
|
|
||||||
import org.schabi.newpipe.R;
|
import org.schabi.newpipe.R;
|
||||||
|
|
||||||
public abstract class ToolbarActivity extends ActionBarActivity {
|
public abstract class ToolbarActivity extends AppCompatActivity {
|
||||||
protected Toolbar mToolbar;
|
protected Toolbar mToolbar;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -232,4 +232,22 @@
|
||||||
</string-array>
|
</string-array>
|
||||||
<string name="show_age_restricted_content" translatable="false">show_age_restricted_content</string>
|
<string name="show_age_restricted_content" translatable="false">show_age_restricted_content</string>
|
||||||
<string name="use_tor_key" translatable="false">use_tor</string>
|
<string name="use_tor_key" translatable="false">use_tor</string>
|
||||||
|
|
||||||
|
<string name="settings_file_charset_key" translatable="false">file_rename</string>
|
||||||
|
<string name="settings_file_replacement_character_key" translatable="false">file_replacement_character</string>
|
||||||
|
<string name="settings_file_replacement_character_default_value" translatable="false">_</string>
|
||||||
|
|
||||||
|
<string-array
|
||||||
|
translatable="false"
|
||||||
|
name="settings_filename_charset">
|
||||||
|
<item>@string/charset_letters_and_digits_value</item>
|
||||||
|
<item>@string/charset_most_special_characters_value</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="settings_filename_charset_name">
|
||||||
|
<item>@string/charset_letters_and_digits</item>
|
||||||
|
<item>@string/charset_most_special_characters</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
|
<string name="default_file_charset_value" translatable="false">@string/charset_most_special_characters_value</string>
|
||||||
</resources>
|
</resources>
|
|
@ -190,6 +190,18 @@
|
||||||
|
|
||||||
<!-- End of GigaGet's Strings -->
|
<!-- End of GigaGet's Strings -->
|
||||||
|
|
||||||
|
<!-- Downloads -->
|
||||||
|
<string name="settings_category_downloads" translatable="false">settings_category_downloads</string>
|
||||||
|
<string name="settings_category_downloads_title">Download</string>
|
||||||
|
<string name="settings_file_charset_title">Allowed characters in filenames</string>
|
||||||
|
<string name="settings_file_replacement_character_summary">Invalid characters are replaced with this value</string>
|
||||||
|
<string name="settings_file_replacement_character_title">Replacement character</string>
|
||||||
|
|
||||||
|
<string name="charset_letters_and_digits_value" translatable="false">[^\\w\\d]+</string>
|
||||||
|
<string name="charset_most_special_characters_value" translatable="false">[\\n\\r|\\?*<":>/']+</string>
|
||||||
|
<string name="charset_letters_and_digits">Letters and digits</string>
|
||||||
|
<string name="charset_most_special_characters">Most special characters</string>
|
||||||
|
|
||||||
<!-- About -->
|
<!-- About -->
|
||||||
<string name="title_activity_about">About NewPipe</string>
|
<string name="title_activity_about">About NewPipe</string>
|
||||||
<string name="action_settings">Settings</string>
|
<string name="action_settings">Settings</string>
|
||||||
|
|
|
@ -133,10 +133,10 @@
|
||||||
|
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
|
|
||||||
|
|
||||||
<PreferenceCategory
|
<PreferenceCategory
|
||||||
android:key="@string/settings_category_other"
|
android:key="@string/settings_category_downloads"
|
||||||
android:textAllCaps="true"
|
android:title="@string/settings_category_downloads_title">
|
||||||
android:title="@string/settings_category_other_title">
|
|
||||||
|
|
||||||
<Preference
|
<Preference
|
||||||
android:dialogTitle="@string/download_path_dialog_title"
|
android:dialogTitle="@string/download_path_dialog_title"
|
||||||
|
@ -150,6 +150,26 @@
|
||||||
android:summary="@string/download_path_audio_summary"
|
android:summary="@string/download_path_audio_summary"
|
||||||
android:title="@string/download_path_audio_title"/>
|
android:title="@string/download_path_audio_title"/>
|
||||||
|
|
||||||
|
<ListPreference
|
||||||
|
android:key="@string/settings_file_charset_key"
|
||||||
|
android:summary="%s"
|
||||||
|
android:defaultValue="@string/default_file_charset_value"
|
||||||
|
android:title="@string/settings_file_charset_title"
|
||||||
|
android:entryValues="@array/settings_filename_charset"
|
||||||
|
android:entries="@array/settings_filename_charset_name" />
|
||||||
|
|
||||||
|
<EditTextPreference
|
||||||
|
android:key="@string/settings_file_replacement_character_key"
|
||||||
|
android:summary="@string/settings_file_replacement_character_summary"
|
||||||
|
android:defaultValue="@string/settings_file_replacement_character_default_value"
|
||||||
|
android:title="@string/settings_file_replacement_character_title" />
|
||||||
|
</PreferenceCategory>
|
||||||
|
|
||||||
|
<PreferenceCategory
|
||||||
|
android:key="@string/settings_category_other"
|
||||||
|
android:textAllCaps="true"
|
||||||
|
android:title="@string/settings_category_other_title">
|
||||||
|
|
||||||
<CheckBoxPreference
|
<CheckBoxPreference
|
||||||
android:defaultValue="false"
|
android:defaultValue="false"
|
||||||
android:key="@string/autoplay_through_intent_key"
|
android:key="@string/autoplay_through_intent_key"
|
||||||
|
|
|
@ -15,5 +15,6 @@ buildscript {
|
||||||
allprojects {
|
allprojects {
|
||||||
repositories {
|
repositories {
|
||||||
jcenter()
|
jcenter()
|
||||||
|
maven { url 'https://maven.google.com' }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue