Merge pull request #636 from coffeemakr/feature-renaming-patterns
Add renaming filename preferences
This commit is contained in:
commit
a4f5c9e2a3
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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"
|
||||||
|
|
Loading…
Reference in New Issue