Merge pull request #636 from coffeemakr/feature-renaming-patterns

Add renaming filename preferences
This commit is contained in:
Mauricio Colli 2017-08-01 22:03:19 -03:00 committed by GitHub
commit a4f5c9e2a3
5 changed files with 95 additions and 23 deletions

View File

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

View File

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

View File

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

View File

@ -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|\\?*&lt;":&gt;/']+</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>

View File

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