mirror of
https://github.com/TeamNewPipe/NewPipe
synced 2024-12-24 09:00:31 +00:00
Merge pull request #322 from DevFactory/release/string-literals-should-not-be-duplicated-fix-1
Code quality fix - String literals should not be duplicated.
This commit is contained in:
commit
faed0958b3
@ -33,6 +33,7 @@ import java.io.IOException;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
public class YoutubeStreamExtractorDefaultTest extends AndroidTestCase {
|
public class YoutubeStreamExtractorDefaultTest extends AndroidTestCase {
|
||||||
|
public static final String HTTPS = "https://";
|
||||||
private StreamExtractor extractor;
|
private StreamExtractor extractor;
|
||||||
|
|
||||||
public void setUp() throws IOException, ExtractionException {
|
public void setUp() throws IOException, ExtractionException {
|
||||||
@ -80,12 +81,12 @@ public class YoutubeStreamExtractorDefaultTest extends AndroidTestCase {
|
|||||||
|
|
||||||
public void testGetThumbnailUrl() throws ParsingException {
|
public void testGetThumbnailUrl() throws ParsingException {
|
||||||
assertTrue(extractor.getThumbnailUrl(),
|
assertTrue(extractor.getThumbnailUrl(),
|
||||||
extractor.getThumbnailUrl().contains("https://"));
|
extractor.getThumbnailUrl().contains(HTTPS));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testGetUploaderThumbnailUrl() throws ParsingException {
|
public void testGetUploaderThumbnailUrl() throws ParsingException {
|
||||||
assertTrue(extractor.getUploaderThumbnailUrl(),
|
assertTrue(extractor.getUploaderThumbnailUrl(),
|
||||||
extractor.getUploaderThumbnailUrl().contains("https://"));
|
extractor.getUploaderThumbnailUrl().contains(HTTPS));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testGetAudioStreams() throws ParsingException {
|
public void testGetAudioStreams() throws ParsingException {
|
||||||
@ -95,7 +96,7 @@ public class YoutubeStreamExtractorDefaultTest extends AndroidTestCase {
|
|||||||
public void testGetVideoStreams() throws ParsingException {
|
public void testGetVideoStreams() throws ParsingException {
|
||||||
for(VideoStream s : extractor.getVideoStreams()) {
|
for(VideoStream s : extractor.getVideoStreams()) {
|
||||||
assertTrue(s.url,
|
assertTrue(s.url,
|
||||||
s.url.contains("https://"));
|
s.url.contains(HTTPS));
|
||||||
assertTrue(s.resolution.length() > 0);
|
assertTrue(s.resolution.length() > 0);
|
||||||
assertTrue(Integer.toString(s.format),
|
assertTrue(Integer.toString(s.format),
|
||||||
0 <= s.format && s.format <= 4);
|
0 <= s.format && s.format <= 4);
|
||||||
|
@ -12,6 +12,7 @@ import org.schabi.newpipe.extractor.VideoStream;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
public class YoutubeStreamExtractorRestrictedTest extends AndroidTestCase {
|
public class YoutubeStreamExtractorRestrictedTest extends AndroidTestCase {
|
||||||
|
public static final String HTTPS = "https://";
|
||||||
private StreamExtractor extractor;
|
private StreamExtractor extractor;
|
||||||
|
|
||||||
public void setUp() throws IOException, ExtractionException {
|
public void setUp() throws IOException, ExtractionException {
|
||||||
@ -63,12 +64,12 @@ public class YoutubeStreamExtractorRestrictedTest extends AndroidTestCase {
|
|||||||
|
|
||||||
public void testGetThumbnailUrl() throws ParsingException {
|
public void testGetThumbnailUrl() throws ParsingException {
|
||||||
assertTrue(extractor.getThumbnailUrl(),
|
assertTrue(extractor.getThumbnailUrl(),
|
||||||
extractor.getThumbnailUrl().contains("https://"));
|
extractor.getThumbnailUrl().contains(HTTPS));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testGetUploaderThumbnailUrl() throws ParsingException {
|
public void testGetUploaderThumbnailUrl() throws ParsingException {
|
||||||
assertTrue(extractor.getUploaderThumbnailUrl(),
|
assertTrue(extractor.getUploaderThumbnailUrl(),
|
||||||
extractor.getUploaderThumbnailUrl().contains("https://"));
|
extractor.getUploaderThumbnailUrl().contains(HTTPS));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testGetAudioStreams() throws ParsingException {
|
public void testGetAudioStreams() throws ParsingException {
|
||||||
@ -78,7 +79,7 @@ public class YoutubeStreamExtractorRestrictedTest extends AndroidTestCase {
|
|||||||
public void testGetVideoStreams() throws ParsingException {
|
public void testGetVideoStreams() throws ParsingException {
|
||||||
for(VideoStream s : extractor.getVideoStreams()) {
|
for(VideoStream s : extractor.getVideoStreams()) {
|
||||||
assertTrue(s.url,
|
assertTrue(s.url,
|
||||||
s.url.contains("https://"));
|
s.url.contains(HTTPS));
|
||||||
assertTrue(s.resolution.length() > 0);
|
assertTrue(s.resolution.length() > 0);
|
||||||
assertTrue(Integer.toString(s.format),
|
assertTrue(Integer.toString(s.format),
|
||||||
0 <= s.format && s.format <= 4);
|
0 <= s.format && s.format <= 4);
|
||||||
|
@ -85,6 +85,7 @@ public class VideoItemListFragment extends ListFragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private class SearchRunnable implements Runnable {
|
private class SearchRunnable implements Runnable {
|
||||||
|
public static final String YOUTUBE = "Youtube";
|
||||||
private final SearchEngine engine;
|
private final SearchEngine engine;
|
||||||
private final String query;
|
private final String query;
|
||||||
private final int page;
|
private final int page;
|
||||||
@ -129,7 +130,7 @@ public class VideoItemListFragment extends ListFragment {
|
|||||||
View rootView = a.findViewById(R.id.videoitem_list);
|
View rootView = a.findViewById(R.id.videoitem_list);
|
||||||
ErrorActivity.reportError(h, getActivity(), result.errors, null, rootView,
|
ErrorActivity.reportError(h, getActivity(), result.errors, null, rootView,
|
||||||
ErrorActivity.ErrorInfo.make(ErrorActivity.SEARCHED,
|
ErrorActivity.ErrorInfo.make(ErrorActivity.SEARCHED,
|
||||||
/* todo: this shoudl not be assigned static */ "Youtube", query, R.string.light_parsing_error));
|
/* todo: this shoudl not be assigned static */ YOUTUBE, query, R.string.light_parsing_error));
|
||||||
|
|
||||||
}
|
}
|
||||||
// hard errors:
|
// hard errors:
|
||||||
@ -142,14 +143,14 @@ public class VideoItemListFragment extends ListFragment {
|
|||||||
ErrorActivity.reportError(h, getActivity(), e, null, null,
|
ErrorActivity.reportError(h, getActivity(), e, null, null,
|
||||||
ErrorActivity.ErrorInfo.make(ErrorActivity.SEARCHED,
|
ErrorActivity.ErrorInfo.make(ErrorActivity.SEARCHED,
|
||||||
/* todo: this shoudl not be assigned static */
|
/* todo: this shoudl not be assigned static */
|
||||||
"Youtube", query, R.string.parsing_error));
|
YOUTUBE, query, R.string.parsing_error));
|
||||||
//postNewErrorToast(h, R.string.parsing_error);
|
//postNewErrorToast(h, R.string.parsing_error);
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
||||||
} catch(Exception e) {
|
} catch(Exception e) {
|
||||||
ErrorActivity.reportError(h, getActivity(), e, null, null,
|
ErrorActivity.reportError(h, getActivity(), e, null, null,
|
||||||
ErrorActivity.ErrorInfo.make(ErrorActivity.SEARCHED,
|
ErrorActivity.ErrorInfo.make(ErrorActivity.SEARCHED,
|
||||||
/* todo: this shoudl not be assigned static */ "Youtube", query, R.string.general_error));
|
/* todo: this shoudl not be assigned static */ YOUTUBE, query, R.string.general_error));
|
||||||
|
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
@ -58,6 +58,7 @@ public class MainActivity extends AppCompatActivity implements AdapterView.OnIte
|
|||||||
public static final String INTENT_LIST = "us.shandian.giga.intent.LIST";
|
public static final String INTENT_LIST = "us.shandian.giga.intent.LIST";
|
||||||
|
|
||||||
private static final String TAG = MainActivity.class.toString();
|
private static final String TAG = MainActivity.class.toString();
|
||||||
|
public static final String THREADS = "threads";
|
||||||
|
|
||||||
|
|
||||||
private MissionsFragment mFragment;
|
private MissionsFragment mFragment;
|
||||||
@ -105,7 +106,7 @@ public class MainActivity extends AppCompatActivity implements AdapterView.OnIte
|
|||||||
actionBar.setTitle(R.string.downloads_title);
|
actionBar.setTitle(R.string.downloads_title);
|
||||||
actionBar.setDisplayShowTitleEnabled(true);
|
actionBar.setDisplayShowTitleEnabled(true);
|
||||||
|
|
||||||
mPrefs = getSharedPreferences("threads", Context.MODE_WORLD_READABLE);
|
mPrefs = getSharedPreferences(THREADS, Context.MODE_WORLD_READABLE);
|
||||||
|
|
||||||
// Fragment
|
// Fragment
|
||||||
getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
|
getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
|
||||||
@ -179,7 +180,7 @@ public class MainActivity extends AppCompatActivity implements AdapterView.OnIte
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
int def = mPrefs.getInt("threads", 4);
|
int def = mPrefs.getInt(THREADS, 4);
|
||||||
threads.setProgress(def - 1);
|
threads.setProgress(def - 1);
|
||||||
tCount.setText(String.valueOf(def));
|
tCount.setText(String.valueOf(def));
|
||||||
|
|
||||||
@ -222,7 +223,7 @@ public class MainActivity extends AppCompatActivity implements AdapterView.OnIte
|
|||||||
mBinder.onMissionAdded(mManager.getMission(res));
|
mBinder.onMissionAdded(mManager.getMission(res));
|
||||||
mFragment.notifyChange();
|
mFragment.notifyChange();
|
||||||
|
|
||||||
mPrefs.edit().putInt("threads", threads.getProgress() + 1).commit();
|
mPrefs.edit().putInt(THREADS, threads.getProgress() + 1).commit();
|
||||||
mPendingUrl = null;
|
mPendingUrl = null;
|
||||||
dialog.dismiss();
|
dialog.dismiss();
|
||||||
}
|
}
|
||||||
|
@ -50,6 +50,7 @@ import javax.xml.parsers.ParserConfigurationException;
|
|||||||
public class YoutubeSearchEngine extends SearchEngine {
|
public class YoutubeSearchEngine extends SearchEngine {
|
||||||
|
|
||||||
private static final String TAG = YoutubeSearchEngine.class.toString();
|
private static final String TAG = YoutubeSearchEngine.class.toString();
|
||||||
|
public static final String CHARSET_UTF_8 = "UTF-8";
|
||||||
|
|
||||||
public YoutubeSearchEngine(StreamUrlIdHandler urlIdHandler, int serviceId) {
|
public YoutubeSearchEngine(StreamUrlIdHandler urlIdHandler, int serviceId) {
|
||||||
super(urlIdHandler, serviceId);
|
super(urlIdHandler, serviceId);
|
||||||
@ -72,7 +73,7 @@ public class YoutubeSearchEngine extends SearchEngine {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
String url = "https://www.youtube.com/results"
|
String url = "https://www.youtube.com/results"
|
||||||
+ "?search_query=" + URLEncoder.encode(query, "UTF-8")
|
+ "?search_query=" + URLEncoder.encode(query, CHARSET_UTF_8)
|
||||||
+ "&page=" + Integer.toString(page)
|
+ "&page=" + Integer.toString(page)
|
||||||
+ "&filters=" + "video";
|
+ "&filters=" + "video";
|
||||||
|
|
||||||
@ -151,8 +152,8 @@ public class YoutubeSearchEngine extends SearchEngine {
|
|||||||
+ "?client=" + ""
|
+ "?client=" + ""
|
||||||
+ "&output=" + "toolbar"
|
+ "&output=" + "toolbar"
|
||||||
+ "&ds=" + "yt"
|
+ "&ds=" + "yt"
|
||||||
+ "&hl=" + URLEncoder.encode(contentCountry, "UTF-8")
|
+ "&hl=" + URLEncoder.encode(contentCountry, CHARSET_UTF_8)
|
||||||
+ "&q=" + URLEncoder.encode(query, "UTF-8");
|
+ "&q=" + URLEncoder.encode(query, CHARSET_UTF_8);
|
||||||
|
|
||||||
|
|
||||||
String response = dl.download(url);
|
String response = dl.download(url);
|
||||||
@ -165,7 +166,7 @@ public class YoutubeSearchEngine extends SearchEngine {
|
|||||||
try {
|
try {
|
||||||
dBuilder = dbFactory.newDocumentBuilder();
|
dBuilder = dbFactory.newDocumentBuilder();
|
||||||
doc = dBuilder.parse(new InputSource(
|
doc = dBuilder.parse(new InputSource(
|
||||||
new ByteArrayInputStream(response.getBytes("utf-8"))));
|
new ByteArrayInputStream(response.getBytes(CHARSET_UTF_8))));
|
||||||
doc.getDocumentElement().normalize();
|
doc.getDocumentElement().normalize();
|
||||||
} catch (ParserConfigurationException | SAXException | IOException e) {
|
} catch (ParserConfigurationException | SAXException | IOException e) {
|
||||||
throw new ParsingException("Could not parse document.");
|
throw new ParsingException("Could not parse document.");
|
||||||
|
@ -51,6 +51,10 @@ import java.util.regex.Pattern;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
public class YoutubeStreamExtractor extends StreamExtractor {
|
public class YoutubeStreamExtractor extends StreamExtractor {
|
||||||
|
public static final String URL_ENCODED_FMT_STREAM_MAP = "url_encoded_fmt_stream_map";
|
||||||
|
public static final String HTTPS = "https:";
|
||||||
|
public static final String CONTENT = "content";
|
||||||
|
public static final String REGEX_INT = "[^\\d]";
|
||||||
|
|
||||||
// exceptions
|
// exceptions
|
||||||
|
|
||||||
@ -246,7 +250,7 @@ public class YoutubeStreamExtractor extends StreamExtractor {
|
|||||||
|
|
||||||
// check if we have a live stream. We need to filter it, since its not yet supported.
|
// check if we have a live stream. We need to filter it, since its not yet supported.
|
||||||
if((playerArgs.has("ps") && playerArgs.get("ps").toString().equals("live"))
|
if((playerArgs.has("ps") && playerArgs.get("ps").toString().equals("live"))
|
||||||
|| (playerArgs.get("url_encoded_fmt_stream_map").toString().isEmpty())) {
|
|| (playerArgs.get(URL_ENCODED_FMT_STREAM_MAP).toString().isEmpty())) {
|
||||||
isLiveStream = true;
|
isLiveStream = true;
|
||||||
}
|
}
|
||||||
} catch (JSONException e) {
|
} catch (JSONException e) {
|
||||||
@ -270,7 +274,7 @@ public class YoutubeStreamExtractor extends StreamExtractor {
|
|||||||
playerUrl = ytAssets.getString("js");
|
playerUrl = ytAssets.getString("js");
|
||||||
|
|
||||||
if (playerUrl.startsWith("//")) {
|
if (playerUrl.startsWith("//")) {
|
||||||
playerUrl = "https:" + playerUrl;
|
playerUrl = HTTPS + playerUrl;
|
||||||
}
|
}
|
||||||
return playerUrl;
|
return playerUrl;
|
||||||
} catch (JSONException e) {
|
} catch (JSONException e) {
|
||||||
@ -294,7 +298,7 @@ public class YoutubeStreamExtractor extends StreamExtractor {
|
|||||||
playerUrl = playerUrl.replace("\\", "").replace("\"", "");
|
playerUrl = playerUrl.replace("\\", "").replace("\"", "");
|
||||||
|
|
||||||
if (playerUrl.startsWith("//")) {
|
if (playerUrl.startsWith("//")) {
|
||||||
playerUrl = "https:" + playerUrl;
|
playerUrl = HTTPS + playerUrl;
|
||||||
}
|
}
|
||||||
return playerUrl;
|
return playerUrl;
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
@ -315,7 +319,7 @@ public class YoutubeStreamExtractor extends StreamExtractor {
|
|||||||
je.printStackTrace();
|
je.printStackTrace();
|
||||||
System.err.println("failed to load title from JSON args; trying to extract it from HTML");
|
System.err.println("failed to load title from JSON args; trying to extract it from HTML");
|
||||||
try { // fall through to fall-back
|
try { // fall through to fall-back
|
||||||
return doc.select("meta[name=title]").attr("content");
|
return doc.select("meta[name=title]").attr(CONTENT);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new ParsingException("failed permanently to load title.", e);
|
throw new ParsingException("failed permanently to load title.", e);
|
||||||
}
|
}
|
||||||
@ -365,7 +369,7 @@ public class YoutubeStreamExtractor extends StreamExtractor {
|
|||||||
@Override
|
@Override
|
||||||
public long getViewCount() throws ParsingException {
|
public long getViewCount() throws ParsingException {
|
||||||
try {
|
try {
|
||||||
String viewCountString = doc.select("meta[itemprop=interactionCount]").attr("content");
|
String viewCountString = doc.select("meta[itemprop=interactionCount]").attr(CONTENT);
|
||||||
return Long.parseLong(viewCountString);
|
return Long.parseLong(viewCountString);
|
||||||
} catch (Exception e) {//todo: find fallback method
|
} catch (Exception e) {//todo: find fallback method
|
||||||
throw new ParsingException("failed to get number of views", e);
|
throw new ParsingException("failed to get number of views", e);
|
||||||
@ -375,7 +379,7 @@ public class YoutubeStreamExtractor extends StreamExtractor {
|
|||||||
@Override
|
@Override
|
||||||
public String getUploadDate() throws ParsingException {
|
public String getUploadDate() throws ParsingException {
|
||||||
try {
|
try {
|
||||||
return doc.select("meta[itemprop=datePublished]").attr("content");
|
return doc.select("meta[itemprop=datePublished]").attr(CONTENT);
|
||||||
} catch (Exception e) {//todo: add fallback method
|
} catch (Exception e) {//todo: add fallback method
|
||||||
throw new ParsingException("failed to get upload date.", e);
|
throw new ParsingException("failed to get upload date.", e);
|
||||||
}
|
}
|
||||||
@ -485,9 +489,9 @@ public class YoutubeStreamExtractor extends StreamExtractor {
|
|||||||
String encodedUrlMap;
|
String encodedUrlMap;
|
||||||
// playerArgs could be null if the video is age restricted
|
// playerArgs could be null if the video is age restricted
|
||||||
if (playerArgs == null) {
|
if (playerArgs == null) {
|
||||||
encodedUrlMap = videoInfoPage.get("url_encoded_fmt_stream_map");
|
encodedUrlMap = videoInfoPage.get(URL_ENCODED_FMT_STREAM_MAP);
|
||||||
} else {
|
} else {
|
||||||
encodedUrlMap = playerArgs.getString("url_encoded_fmt_stream_map");
|
encodedUrlMap = playerArgs.getString(URL_ENCODED_FMT_STREAM_MAP);
|
||||||
}
|
}
|
||||||
for(String url_data_str : encodedUrlMap.split(",")) {
|
for(String url_data_str : encodedUrlMap.split(",")) {
|
||||||
try {
|
try {
|
||||||
@ -592,7 +596,7 @@ public class YoutubeStreamExtractor extends StreamExtractor {
|
|||||||
try {
|
try {
|
||||||
return Integer.valueOf(doc.head()
|
return Integer.valueOf(doc.head()
|
||||||
.getElementsByAttributeValue("property", "og:restrictions:age")
|
.getElementsByAttributeValue("property", "og:restrictions:age")
|
||||||
.attr("content").replace("+", ""));
|
.attr(CONTENT).replace("+", ""));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new ParsingException("Could not get age restriction");
|
throw new ParsingException("Could not get age restriction");
|
||||||
}
|
}
|
||||||
@ -622,7 +626,7 @@ public class YoutubeStreamExtractor extends StreamExtractor {
|
|||||||
//if this ckicks in our button has no content and thefore likes/dislikes are disabled
|
//if this ckicks in our button has no content and thefore likes/dislikes are disabled
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return Integer.parseInt(likesString.replaceAll("[^\\d]", ""));
|
return Integer.parseInt(likesString.replaceAll(REGEX_INT, ""));
|
||||||
} catch (NumberFormatException nfe) {
|
} catch (NumberFormatException nfe) {
|
||||||
throw new ParsingException(
|
throw new ParsingException(
|
||||||
"failed to parse likesString \"" + likesString + "\" as integers", nfe);
|
"failed to parse likesString \"" + likesString + "\" as integers", nfe);
|
||||||
@ -642,7 +646,7 @@ public class YoutubeStreamExtractor extends StreamExtractor {
|
|||||||
//if this kicks in our button has no content and therefore likes/dislikes are disabled
|
//if this kicks in our button has no content and therefore likes/dislikes are disabled
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return Integer.parseInt(dislikesString.replaceAll("[^\\d]", ""));
|
return Integer.parseInt(dislikesString.replaceAll(REGEX_INT, ""));
|
||||||
} catch(NumberFormatException nfe) {
|
} catch(NumberFormatException nfe) {
|
||||||
throw new ParsingException(
|
throw new ParsingException(
|
||||||
"failed to parse dislikesString \"" + dislikesString + "\" as integers", nfe);
|
"failed to parse dislikesString \"" + dislikesString + "\" as integers", nfe);
|
||||||
@ -737,7 +741,7 @@ public class YoutubeStreamExtractor extends StreamExtractor {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
return Long.parseLong(li.select("span.view-count")
|
return Long.parseLong(li.select("span.view-count")
|
||||||
.first().text().replaceAll("[^\\d]", ""));
|
.first().text().replaceAll(REGEX_INT, ""));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
//related videos sometimes have no view count
|
//related videos sometimes have no view count
|
||||||
return 0;
|
return 0;
|
||||||
@ -755,7 +759,7 @@ public class YoutubeStreamExtractor extends StreamExtractor {
|
|||||||
thumbnailUrl = img.attr("data-thumb");
|
thumbnailUrl = img.attr("data-thumb");
|
||||||
}
|
}
|
||||||
if (thumbnailUrl.startsWith("//")) {
|
if (thumbnailUrl.startsWith("//")) {
|
||||||
thumbnailUrl = "https:" + thumbnailUrl;
|
thumbnailUrl = HTTPS + thumbnailUrl;
|
||||||
}
|
}
|
||||||
return thumbnailUrl;
|
return thumbnailUrl;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user