From e99e944ac36b1a8a73fd6b899217c5914bd8bd75 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Sun, 25 Dec 2016 19:28:40 +0100 Subject: [PATCH] make share with newpipe part of newpipe --- app/src/main/AndroidManifest.xml | 5 + .../detail/VideoItemDetailActivity.java | 112 ++++++++++++++---- 2 files changed, 95 insertions(+), 22 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5ce399d91..9c5ea2381 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -76,6 +76,11 @@ + + + + + @@ -38,6 +41,13 @@ import org.schabi.newpipe.extractor.StreamingService; public class VideoItemDetailActivity extends AppCompatActivity { + /** + * Removes invisible separators (\p{Z}) and punctuation characters including + * brackets (\p{P}). See http://www.regular-expressions.info/unicode.html for + * more details. + */ + private final static String REGEX_REMOVE_FROM_URL = "[\\p{Z}\\p{P}]"; + private static final String TAG = VideoItemDetailActivity.class.toString(); private VideoItemDetailFragment fragment; @@ -86,39 +96,31 @@ public class VideoItemDetailActivity extends AppCompatActivity { private void handleIntent(Intent intent) { Bundle arguments = new Bundle(); - // this means the video was called though another app + boolean autoplay = false; if (intent.getData() != null) { + // this means the video was called though another app videoUrl = intent.getData().toString(); - StreamingService[] serviceList = NewPipe.getServices(); - //StreamExtractor videoExtractor = null; - for (int i = 0; i < serviceList.length; i++) { - if (serviceList[i].getUrlIdHandlerInstance().acceptUrl(videoUrl)) { - arguments.putInt(VideoItemDetailFragment.STREAMING_SERVICE, i); - currentStreamingService = i; - //videoExtractor = ServiceList.getService(i).getExtractorInstance(); - break; - } - } + currentStreamingService = getServiceIdByUrl(videoUrl); if(currentStreamingService == -1) { Toast.makeText(this, R.string.url_not_supported_toast, Toast.LENGTH_LONG) .show(); } - //arguments.putString(VideoItemDetailFragment.VIDEO_URL, - // videoExtractor.getUrl(videoExtractor.getId(videoUrl)));//cleans URL - arguments.putString(VideoItemDetailFragment.VIDEO_URL, videoUrl); - - arguments.putBoolean(VideoItemDetailFragment.AUTO_PLAY, - PreferenceManager.getDefaultSharedPreferences(this) - .getBoolean(getString(R.string.autoplay_through_intent_key), false)); + autoplay = PreferenceManager.getDefaultSharedPreferences(this) + .getBoolean(getString(R.string.autoplay_through_intent_key), false); + } else if(intent.getStringExtra(Intent.EXTRA_TEXT) != null) { + //this means that vidoe was called through share menu + String extraText = intent.getStringExtra(Intent.EXTRA_TEXT); + videoUrl = getUris(extraText)[0]; + currentStreamingService = getServiceIdByUrl(videoUrl); } else { + //this is if the video was called through another NewPipe activity videoUrl = intent.getStringExtra(VideoItemDetailFragment.VIDEO_URL); currentStreamingService = intent.getIntExtra(VideoItemDetailFragment.STREAMING_SERVICE, -1); - arguments.putString(VideoItemDetailFragment.VIDEO_URL, videoUrl); - arguments.putInt(VideoItemDetailFragment.STREAMING_SERVICE, currentStreamingService); - arguments.putBoolean(VideoItemDetailFragment.AUTO_PLAY, false); } + arguments.putBoolean(VideoItemDetailFragment.AUTO_PLAY, autoplay); + arguments.putString(VideoItemDetailFragment.VIDEO_URL, videoUrl); + arguments.putInt(VideoItemDetailFragment.STREAMING_SERVICE, currentStreamingService); addFragment(arguments); - } private void addFragment(final Bundle arguments) { @@ -171,4 +173,70 @@ public class VideoItemDetailActivity extends AppCompatActivity { fragment.onCreateOptionsMenu(menu, getMenuInflater()); return true; } + + + /** + * Retrieves all Strings which look remotely like URLs from a text. + * Used if NewPipe was called through share menu. + * + * @param sharedText text to scan for URLs. + * @return potential URLs + */ + private String[] getUris(final String sharedText) { + final Collection result = new HashSet<>(); + if (sharedText != null) { + final String[] array = sharedText.split("\\p{Space}"); + for (String s : array) { + s = trim(s); + if (s.length() != 0) { + if (s.matches(".+://.+")) { + result.add(removeHeadingGibberish(s)); + } else if (s.matches(".+\\..+")) { + result.add("http://" + s); + } + } + } + } + return result.toArray(new String[result.size()]); + } + + private static String removeHeadingGibberish(final String input) { + int start = 0; + for (int i = input.indexOf("://") - 1; i >= 0; i--) { + if (!input.substring(i, i + 1).matches("\\p{L}")) { + start = i + 1; + break; + } + } + return input.substring(start, input.length()); + } + + private static String trim(final String input) { + if (input == null || input.length() < 1) { + return input; + } else { + String output = input; + while (output.length() > 0 && output.substring(0, 1).matches(REGEX_REMOVE_FROM_URL)) { + output = output.substring(1); + } + while (output.length() > 0 + && output.substring(output.length() - 1, output.length()).matches(REGEX_REMOVE_FROM_URL)) { + output = output.substring(0, output.length() - 1); + } + return output; + } + } + + private int getServiceIdByUrl(String url) { + StreamingService[] serviceList = NewPipe.getServices(); + int service = -1; + for (int i = 0; i < serviceList.length; i++) { + if (serviceList[i].getUrlIdHandlerInstance().acceptUrl(videoUrl)) { + service = i; + //videoExtractor = ServiceList.getService(i).getExtractorInstance(); + break; + } + } + return service; + } }