diff --git a/app/src/main/java/org/schabi/newpipe/AbstractVideoInfo.java b/app/src/main/java/org/schabi/newpipe/AbstractVideoInfo.java
new file mode 100644
index 000000000..1eaa332cd
--- /dev/null
+++ b/app/src/main/java/org/schabi/newpipe/AbstractVideoInfo.java
@@ -0,0 +1,15 @@
+package org.schabi.newpipe;
+
+import android.graphics.Bitmap;
+
+/**Common properties between VideoInfo and VideoPreviewInfo.*/
+public abstract class AbstractVideoInfo {
+ public String id = "";
+ public String title = "";
+ public String uploader = "";
+ public String thumbnail_url = "";
+ public Bitmap thumbnail = null;
+ public String webpage_url = "";
+ public String upload_date = "";
+ public long view_count = 0;
+}
diff --git a/app/src/main/java/org/schabi/newpipe/Downloader.java b/app/src/main/java/org/schabi/newpipe/Downloader.java
index b6d22c44e..9c2fa2948 100644
--- a/app/src/main/java/org/schabi/newpipe/Downloader.java
+++ b/app/src/main/java/org/schabi/newpipe/Downloader.java
@@ -31,6 +31,11 @@ public class Downloader {
private static final String USER_AGENT = "Mozilla/5.0";
+ /**Download the text file at the supplied URL as in download(String),
+ * but set the HTTP header field "Accept-Language" to the supplied string.
+ * @param siteUrl the URL of the text file to return the contents of
+ * @param language the language (usually a 2-character code) to set as the preferred language
+ * @return the contents of the specified text file*/
public static String download(String siteUrl, String language) {
String ret = "";
try {
@@ -44,7 +49,7 @@ public class Downloader {
}
return ret;
}
-
+ /**Common functionality between download(String url) and download(String url, String language)*/
private static String dl(HttpURLConnection con) {
StringBuffer response = new StringBuffer();
@@ -72,7 +77,10 @@ public class Downloader {
return response.toString();
}
-
+/**Download (via HTTP) the text file located at the supplied URL, and return its contents.
+ * Primarily intended for downloading web pages.
+ * @param siteUrl the URL of the text file to download
+ * @return the contents of the specified text file*/
public static String download(String siteUrl) {
String ret = "";
diff --git a/app/src/main/java/org/schabi/newpipe/MediaFormat.java b/app/src/main/java/org/schabi/newpipe/MediaFormat.java
index 6a37c3fd7..c9af7b8b7 100644
--- a/app/src/main/java/org/schabi/newpipe/MediaFormat.java
+++ b/app/src/main/java/org/schabi/newpipe/MediaFormat.java
@@ -21,6 +21,8 @@ package org.schabi.newpipe;
* You should have received a copy of the GNU General Public License
* along with NewPipe. If not, see .
*/
+
+/**Static data about various media formats support by Newpipe, eg mime type, extension*/
public enum MediaFormat {
// id name suffix mime type
MPEG_4 (0x0, "MPEG-4", "mp4", "video/mp4"),
@@ -41,6 +43,10 @@ public enum MediaFormat {
this.mimeType = mimeType;
}
+ /**Return the friendly name of the media format with the supplied id
+ * @param ident the id of the media format. Currently an arbitrary, NewPipe-specific number.
+ * @return the friendly name of the MediaFormat associated with this ids,
+ * or an empty String if none match it.*/
public static String getNameById(int ident) {
for (MediaFormat vf : MediaFormat.values()) {
if(vf.id == ident) return vf.name;
@@ -48,6 +54,10 @@ public enum MediaFormat {
return "";
}
+ /**Return the file extension of the media format with the supplied id
+ * @param ident the id of the media format. Currently an arbitrary, NewPipe-specific number.
+ * @return the file extension of the MediaFormat associated with this ids,
+ * or an empty String if none match it.*/
public static String getSuffixById(int ident) {
for (MediaFormat vf : MediaFormat.values()) {
if(vf.id == ident) return vf.suffix;
@@ -55,6 +65,10 @@ public enum MediaFormat {
return "";
}
+ /**Return the MIME type of the media format with the supplied id
+ * @param ident the id of the media format. Currently an arbitrary, NewPipe-specific number.
+ * @return the MIME type of the MediaFormat associated with this ids,
+ * or an empty String if none match it.*/
public static String getMimeById(int ident) {
for (MediaFormat vf : MediaFormat.values()) {
if(vf.id == ident) return vf.mimeType;
diff --git a/app/src/main/java/org/schabi/newpipe/PlayVideoActivity.java b/app/src/main/java/org/schabi/newpipe/PlayVideoActivity.java
index 7a691641a..6b90161e9 100644
--- a/app/src/main/java/org/schabi/newpipe/PlayVideoActivity.java
+++ b/app/src/main/java/org/schabi/newpipe/PlayVideoActivity.java
@@ -89,6 +89,8 @@ public class PlayVideoActivity extends AppCompatActivity {
mediaController = new MediaController(this);
}
+ position = intent.getIntExtra(START_POSITION, 0)*1000;//convert from seconds to milliseconds
+
videoView = (VideoView) findViewById(R.id.video_view);
progressBar = (ProgressBar) findViewById(R.id.play_video_progress_bar);
try {
@@ -146,11 +148,6 @@ public class PlayVideoActivity extends AppCompatActivity {
}
}
- @Override
- protected void onPostCreate(Bundle savedInstanceState) {
- super.onPostCreate(savedInstanceState);
- }
-
@Override
public boolean onCreatePanelMenu(int featured, Menu menu) {
super.onCreatePanelMenu(featured, menu);
@@ -160,11 +157,6 @@ public class PlayVideoActivity extends AppCompatActivity {
return true;
}
- @Override
- public void onResume() {
- super.onResume();
- }
-
@Override
public void onPause() {
super.onPause();
diff --git a/app/src/main/java/org/schabi/newpipe/VideoInfo.java b/app/src/main/java/org/schabi/newpipe/VideoInfo.java
index 64b21fec6..50ea90e4a 100644
--- a/app/src/main/java/org/schabi/newpipe/VideoInfo.java
+++ b/app/src/main/java/org/schabi/newpipe/VideoInfo.java
@@ -1,10 +1,6 @@
package org.schabi.newpipe;
import android.graphics.Bitmap;
-import android.util.Log;
-
-import java.util.Date;
-import java.util.Vector;
/**
* Created by Christian Schabesberger on 26.08.15.
@@ -27,16 +23,7 @@ import java.util.Vector;
*/
/**Info object for opened videos, ie the video ready to play.*/
-public class VideoInfo {
- public String id = "";
- public String title = "";
- public String uploader = "";
- public String thumbnail_url = "";
- public Bitmap thumbnail = null;
- public String webpage_url = "";
- public String upload_date = "";
- public long view_count = 0;
-
+public class VideoInfo extends AbstractVideoInfo {
public String uploader_thumbnail_url = "";
public Bitmap uploader_thumbnail = null;
public String description = "";
@@ -47,10 +34,10 @@ public class VideoInfo {
public String average_rating = "";
public VideoStream[] videoStreams = null;
public AudioStream[] audioStreams = null;
- public VideoInfoItem nextVideo = null;
- public VideoInfoItem[] relatedVideos = null;
+ public VideoPreviewInfo nextVideo = null;
+ public VideoPreviewInfo[] relatedVideos = null;
public int videoAvailableStatus = VIDEO_AVAILABLE;
- public int startPosition = 0;//in seconds
+ //public int startPosition = 0;//in seconds. some metadata is not passed using a VideoInfo object!
private static final String TAG = VideoInfo.class.toString();
diff --git a/app/src/main/java/org/schabi/newpipe/VideoInfoItemViewCreator.java b/app/src/main/java/org/schabi/newpipe/VideoInfoItemViewCreator.java
index d15d6b86a..b33a66e94 100644
--- a/app/src/main/java/org/schabi/newpipe/VideoInfoItemViewCreator.java
+++ b/app/src/main/java/org/schabi/newpipe/VideoInfoItemViewCreator.java
@@ -35,7 +35,7 @@ public class VideoInfoItemViewCreator {
this.inflater = inflater;
}
- public View getViewByVideoInfoItem(View convertView, ViewGroup parent, VideoInfoItem info) {
+ public View getViewByVideoInfoItem(View convertView, ViewGroup parent, VideoPreviewInfo info) {
ViewHolder holder;
if(convertView == null) {
convertView = inflater.inflate(R.layout.video_item, parent, false);
@@ -62,7 +62,7 @@ public class VideoInfoItemViewCreator {
holder.itemUploadDateView.setText(info.upload_date);
} else {
//tweak if necessary: This is a hack to prevent having white space in the layout :P
- holder.itemUploadDateView.setText(info.view_count);
+ holder.itemUploadDateView.setText(""+info.view_count);
}
return convertView;
diff --git a/app/src/main/java/org/schabi/newpipe/VideoItemDetailActivity.java b/app/src/main/java/org/schabi/newpipe/VideoItemDetailActivity.java
index 2ba09c189..b31fe970b 100644
--- a/app/src/main/java/org/schabi/newpipe/VideoItemDetailActivity.java
+++ b/app/src/main/java/org/schabi/newpipe/VideoItemDetailActivity.java
@@ -7,10 +7,13 @@ import android.support.v4.app.NavUtils;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Menu;
-import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;
+import org.schabi.newpipe.services.Extractor;
+import org.schabi.newpipe.services.ServiceList;
+import org.schabi.newpipe.services.StreamingService;
+
/**
* Copyright (C) Christian Schabesberger 2015
@@ -81,7 +84,7 @@ public class VideoItemDetailActivity extends AppCompatActivity {
.show();
}
arguments.putString(VideoItemDetailFragment.VIDEO_URL,
- extractor.getVideoUrl(extractor.getVideoId(videoUrl)));
+ extractor.getVideoUrl(extractor.getVideoId(videoUrl)));//cleans URL
arguments.putBoolean(VideoItemDetailFragment.AUTO_PLAY,
PreferenceManager.getDefaultSharedPreferences(this)
.getBoolean(getString(R.string.autoPlayThroughIntent), false));
diff --git a/app/src/main/java/org/schabi/newpipe/VideoItemDetailFragment.java b/app/src/main/java/org/schabi/newpipe/VideoItemDetailFragment.java
index e27d02278..6383a836a 100644
--- a/app/src/main/java/org/schabi/newpipe/VideoItemDetailFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/VideoItemDetailFragment.java
@@ -37,6 +37,10 @@ import java.util.Date;
import java.util.Locale;
import java.util.Vector;
+import org.schabi.newpipe.services.Extractor;
+import org.schabi.newpipe.services.ServiceList;
+import org.schabi.newpipe.services.StreamingService;
+
/**
* Copyright (C) Christian Schabesberger 2015
@@ -394,10 +398,12 @@ public class VideoItemDetailFragment extends Fragment {
}
}
+ /**Returns the java.util.Locale object which corresponds to the locale set in NewPipe's preferences.
+ * Currently not affected by the device's locale.*/
public Locale getPreferredLocale() {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
String languageKey = getContext().getString(R.string.searchLanguage);
- String languageCode = "en";//i know the following lines defaults languageCode to "en", but java is picky about uninitialised values
+ String languageCode = "en";//i know the following line defaults languageCode to "en", but java is picky about uninitialised values
languageCode = sp.getString(languageKey, "en");
if(languageCode.length() == 2) {
diff --git a/app/src/main/java/org/schabi/newpipe/VideoItemListActivity.java b/app/src/main/java/org/schabi/newpipe/VideoItemListActivity.java
index 90892ca5e..7a89682f3 100644
--- a/app/src/main/java/org/schabi/newpipe/VideoItemListActivity.java
+++ b/app/src/main/java/org/schabi/newpipe/VideoItemListActivity.java
@@ -3,21 +3,18 @@ package org.schabi.newpipe;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
-import android.os.Parcel;
-import android.os.Parcelable;
import android.support.v4.app.NavUtils;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SearchView;
-import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
-import android.widget.ImageView;
import java.util.ArrayList;
-import java.util.Arrays;
+
+import org.schabi.newpipe.services.ServiceList;
/**
* Copyright (C) Christian Schabesberger 2015
@@ -116,7 +113,7 @@ public class VideoItemListActivity extends AppCompatActivity
if(arguments != null) {
//Parcelable[] p = arguments.getParcelableArray(VIDEO_INFO_ITEMS);
- ArrayList p = arguments.getParcelableArrayList(VIDEO_INFO_ITEMS);
+ ArrayList p = arguments.getParcelableArrayList(VIDEO_INFO_ITEMS);
if(p != null) {
mode = PRESENT_VIDEOS_MODE;
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
diff --git a/app/src/main/java/org/schabi/newpipe/VideoItemListFragment.java b/app/src/main/java/org/schabi/newpipe/VideoItemListFragment.java
index 5bab9669b..2c8cb6de9 100644
--- a/app/src/main/java/org/schabi/newpipe/VideoItemListFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/VideoItemListFragment.java
@@ -15,10 +15,12 @@ import android.widget.ListView;
import android.widget.Toast;
import java.net.URL;
-import java.util.Arrays;
import java.util.List;
import java.util.Vector;
+import org.schabi.newpipe.services.SearchEngine;
+import org.schabi.newpipe.services.StreamingService;
+
/**
* Copyright (C) Christian Schabesberger 2015
@@ -119,9 +121,9 @@ public class VideoItemListFragment extends ListFragment {
Handler h = new Handler();
private volatile boolean run = true;
private int requestId;
- public LoadThumbsRunnable(Vector videoList,
+ public LoadThumbsRunnable(Vector videoList,
Vector downloadedList, int requestId) {
- for(VideoInfoItem item : videoList) {
+ for(VideoPreviewInfo item : videoList) {
thumbnailUrlList.add(item.thumbnail_url);
}
this.downloadedList = downloadedList;
@@ -168,7 +170,7 @@ public class VideoItemListFragment extends ListFragment {
}
}
- public void present(List videoList) {
+ public void present(List videoList) {
mode = PRESENT_VIDEOS_MODE;
setListShown(true);
getListView().smoothScrollToPosition(0);
@@ -220,7 +222,7 @@ public class VideoItemListFragment extends ListFragment {
}
}
- private void updateList(List list) {
+ private void updateList(List list) {
try {
videoListAdapter.addVideoList(list);
terminateThreads();
diff --git a/app/src/main/java/org/schabi/newpipe/VideoListAdapter.java b/app/src/main/java/org/schabi/newpipe/VideoListAdapter.java
index 87bd3b8aa..6f20a92db 100644
--- a/app/src/main/java/org/schabi/newpipe/VideoListAdapter.java
+++ b/app/src/main/java/org/schabi/newpipe/VideoListAdapter.java
@@ -37,7 +37,7 @@ public class VideoListAdapter extends BaseAdapter {
private Context context;
private VideoInfoItemViewCreator viewCreator;
- private Vector videoList = new Vector<>();
+ private Vector videoList = new Vector<>();
private Vector downloadedThumbnailList = new Vector<>();
VideoItemListFragment videoListFragment;
ListView listView;
@@ -49,7 +49,7 @@ public class VideoListAdapter extends BaseAdapter {
this.context = context;
}
- public void addVideoList(List videos) {
+ public void addVideoList(List videos) {
videoList.addAll(videos);
for(int i = 0; i < videos.size(); i++) {
downloadedThumbnailList.add(false);
@@ -63,7 +63,7 @@ public class VideoListAdapter extends BaseAdapter {
notifyDataSetChanged();
}
- public Vector getVideoList() {
+ public Vector getVideoList() {
return videoList;
}
diff --git a/app/src/main/java/org/schabi/newpipe/VideoInfoItem.java b/app/src/main/java/org/schabi/newpipe/VideoPreviewInfo.java
similarity index 69%
rename from app/src/main/java/org/schabi/newpipe/VideoInfoItem.java
rename to app/src/main/java/org/schabi/newpipe/VideoPreviewInfo.java
index 7516723b6..6f644f3b1 100644
--- a/app/src/main/java/org/schabi/newpipe/VideoInfoItem.java
+++ b/app/src/main/java/org/schabi/newpipe/VideoPreviewInfo.java
@@ -8,7 +8,7 @@ import android.os.Parcelable;
* Created by Christian Schabesberger on 26.08.15.
*
* Copyright (C) Christian Schabesberger 2015
- * VideoInfoItem.java is part of NewPipe.
+ * VideoPreviewInfo.java is part of NewPipe.
*
* NewPipe is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -25,19 +25,12 @@ import android.os.Parcelable;
*/
/**Info object for previews of unopened videos, eg search results, related videos*/
-public class VideoInfoItem implements Parcelable {
- public String id = "";
- public String title = "";
- public String uploader = "";
- public String thumbnail_url = "";
- public Bitmap thumbnail = null;
- public String webpage_url = "";
- public String upload_date = "";
- public String view_count = "";
+public class VideoPreviewInfo extends AbstractVideoInfo implements Parcelable {
+
public String duration = "";
- protected VideoInfoItem(Parcel in) {
+ protected VideoPreviewInfo(Parcel in) {
id = in.readString();
title = in.readString();
uploader = in.readString();
@@ -46,10 +39,10 @@ public class VideoInfoItem implements Parcelable {
thumbnail = (Bitmap) in.readValue(Bitmap.class.getClassLoader());
webpage_url = in.readString();
upload_date = in.readString();
- view_count = in.readString();
+ view_count = in.readLong();
}
- public VideoInfoItem() {
+ public VideoPreviewInfo() {
}
@@ -68,19 +61,19 @@ public class VideoInfoItem implements Parcelable {
dest.writeValue(thumbnail);
dest.writeString(webpage_url);
dest.writeString(upload_date);
- dest.writeString(view_count);
+ dest.writeLong(view_count);
}
@SuppressWarnings("unused")
- public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
+ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
@Override
- public VideoInfoItem createFromParcel(Parcel in) {
- return new VideoInfoItem(in);
+ public VideoPreviewInfo createFromParcel(Parcel in) {
+ return new VideoPreviewInfo(in);
}
@Override
- public VideoInfoItem[] newArray(int size) {
- return new VideoInfoItem[size];
+ public VideoPreviewInfo[] newArray(int size) {
+ return new VideoPreviewInfo[size];
}
};
}
\ No newline at end of file
diff --git a/app/src/main/java/org/schabi/newpipe/Extractor.java b/app/src/main/java/org/schabi/newpipe/services/Extractor.java
similarity index 86%
rename from app/src/main/java/org/schabi/newpipe/Extractor.java
rename to app/src/main/java/org/schabi/newpipe/services/Extractor.java
index 102a39494..7f2e18f50 100644
--- a/app/src/main/java/org/schabi/newpipe/Extractor.java
+++ b/app/src/main/java/org/schabi/newpipe/services/Extractor.java
@@ -1,4 +1,4 @@
-package org.schabi.newpipe;
+package org.schabi.newpipe.services;
/**
* Created by Christian Schabesberger on 10.08.15.
@@ -20,7 +20,9 @@ package org.schabi.newpipe;
* along with NewPipe. If not, see .
*/
+import org.schabi.newpipe.VideoInfo;
+/**Scrapes information from a video streaming service (eg, YouTube). To implement*/
public interface Extractor {
VideoInfo getVideoInfo(String siteUrl);
String getVideoUrl(String videoId);
diff --git a/app/src/main/java/org/schabi/newpipe/SearchEngine.java b/app/src/main/java/org/schabi/newpipe/services/SearchEngine.java
similarity index 88%
rename from app/src/main/java/org/schabi/newpipe/SearchEngine.java
rename to app/src/main/java/org/schabi/newpipe/services/SearchEngine.java
index 6d5509df7..4feda4edc 100644
--- a/app/src/main/java/org/schabi/newpipe/SearchEngine.java
+++ b/app/src/main/java/org/schabi/newpipe/services/SearchEngine.java
@@ -1,4 +1,6 @@
-package org.schabi.newpipe;
+package org.schabi.newpipe.services;
+
+import org.schabi.newpipe.VideoPreviewInfo;
import java.util.ArrayList;
import java.util.Vector;
@@ -29,7 +31,7 @@ public interface SearchEngine {
class Result {
public String errorMessage = "";
public String suggestion = "";
- public Vector resultList = new Vector<>();
+ public Vector resultList = new Vector<>();
}
ArrayList suggestionList(String query);
diff --git a/app/src/main/java/org/schabi/newpipe/ServiceList.java b/app/src/main/java/org/schabi/newpipe/services/ServiceList.java
similarity index 87%
rename from app/src/main/java/org/schabi/newpipe/ServiceList.java
rename to app/src/main/java/org/schabi/newpipe/services/ServiceList.java
index cb79c7bcc..f0522a9cd 100644
--- a/app/src/main/java/org/schabi/newpipe/ServiceList.java
+++ b/app/src/main/java/org/schabi/newpipe/services/ServiceList.java
@@ -1,8 +1,8 @@
-package org.schabi.newpipe;
+package org.schabi.newpipe.services;
import android.util.Log;
-import org.schabi.newpipe.youtube.YoutubeService;
+import org.schabi.newpipe.services.youtube.YoutubeService;
/**
* Created by Christian Schabesberger on 23.08.15.
@@ -24,6 +24,8 @@ import org.schabi.newpipe.youtube.YoutubeService;
* along with NewPipe. If not, see .
*/
+/**Provides access to the video streaming services supported by NewPipe.
+ * Currently only Youtube until the API becomes more stable.*/
public class ServiceList {
private static final String TAG = ServiceList.class.toString();
private static final StreamingService[] services = {
diff --git a/app/src/main/java/org/schabi/newpipe/StreamingService.java b/app/src/main/java/org/schabi/newpipe/services/StreamingService.java
similarity index 97%
rename from app/src/main/java/org/schabi/newpipe/StreamingService.java
rename to app/src/main/java/org/schabi/newpipe/services/StreamingService.java
index 58185a5fe..0e9a022c2 100644
--- a/app/src/main/java/org/schabi/newpipe/StreamingService.java
+++ b/app/src/main/java/org/schabi/newpipe/services/StreamingService.java
@@ -1,4 +1,4 @@
-package org.schabi.newpipe;
+package org.schabi.newpipe.services;
/**
* Created by Christian Schabesberger on 23.08.15.
diff --git a/app/src/main/java/org/schabi/newpipe/youtube/YoutubeExtractor.java b/app/src/main/java/org/schabi/newpipe/services/youtube/YoutubeExtractor.java
similarity index 95%
rename from app/src/main/java/org/schabi/newpipe/youtube/YoutubeExtractor.java
rename to app/src/main/java/org/schabi/newpipe/services/youtube/YoutubeExtractor.java
index 0b5a20a17..fd902c320 100644
--- a/app/src/main/java/org/schabi/newpipe/youtube/YoutubeExtractor.java
+++ b/app/src/main/java/org/schabi/newpipe/services/youtube/YoutubeExtractor.java
@@ -1,4 +1,4 @@
-package org.schabi.newpipe.youtube;
+package org.schabi.newpipe.services.youtube;
import android.util.Log;
import android.util.Xml;
@@ -12,14 +12,13 @@ import org.mozilla.javascript.Context;
import org.mozilla.javascript.Function;
import org.mozilla.javascript.ScriptableObject;
import org.schabi.newpipe.Downloader;
-import org.schabi.newpipe.Extractor;
+import org.schabi.newpipe.services.Extractor;
import org.schabi.newpipe.MediaFormat;
import org.schabi.newpipe.VideoInfo;
-import org.schabi.newpipe.VideoInfoItem;
+import org.schabi.newpipe.VideoPreviewInfo;
import org.xmlpull.v1.XmlPullParser;
import java.io.StringReader;
-import java.net.URI;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Map;
@@ -161,6 +160,29 @@ public class YoutubeExtractor implements Extractor {
return "https://www.youtube.com/watch?v=" + videoId;
}
+ public int getStartPosition(String siteUrl){
+ String timeStamp = matchGroup1("((#|&)t=\\d{0,3}h?\\d{0,3}m?\\d{1,3}s?)", siteUrl);
+ Log.i(TAG, "time stamp:"+timeStamp);
+ //videoInfo.startPosition
+
+ //TODO: test this!
+ if(timeStamp.length() > 0) {
+ String secondsString = matchGroup1("(\\d{1,3})s", timeStamp);
+ if(secondsString.length() == 0)//try again with unspecified units as seconds
+ secondsString = matchGroup1("t=(\\d{1,3})", timeStamp);
+ String minutesString = matchGroup1("(\\d{1,3})m", timeStamp);
+ String hoursString = matchGroup1("(\\d{1,3})h", timeStamp);
+
+ int seconds = (secondsString.length() > 0 ? Integer.parseInt(secondsString) : 0);
+ int minutes = (minutesString.length() > 0 ? Integer.parseInt(minutesString) : 0);
+ int hours = (hoursString.length() > 0 ? Integer.parseInt(hoursString) : 0);
+
+ return seconds + (60*minutes) + (3600*hours);//don't trust BODMAS!
+ //the ordering varies internationally
+ }//else, return default 0
+ return 0;
+ }
+
@Override
public VideoInfo getVideoInfo(String siteUrl) {
String site = Downloader.download(siteUrl);
@@ -169,23 +191,6 @@ public class YoutubeExtractor implements Extractor {
Document doc = Jsoup.parse(site, siteUrl);
videoInfo.id = matchGroup1("v=([0-9a-zA-Z_-]{11})", siteUrl);
- String timeStamp = matchGroup1("((#|&)t=\\d{0,3}h?\\d{0,3}m?\\d{1,3}s)", siteUrl);
- Log.i(TAG, "time stamp:"+timeStamp);
- //videoInfo.startPosition
-
- //TODO: test this!
- if(timeStamp.length() > 0) {
- String secondsString = matchGroup1("(\\d{1,3})s", timeStamp);
- String minutesString = matchGroup1("(\\d{1,3})m", timeStamp);
- String hoursString = matchGroup1("(\\d{1,3})h", timeStamp);
-
- int seconds = (secondsString.length() > 0 ? Integer.parseInt(secondsString) : 0);
- int minutes = (minutesString.length() > 0 ? Integer.parseInt(minutesString) : 0);
- int hours = (hoursString.length() > 0 ? Integer.parseInt(hoursString) : 0);
-
- videoInfo.startPosition = seconds + (60*minutes) + (3600*hours);//don't trust BODMAS!
- //the ordering varies internationally
- }//else, leave videoInfo.startPosition as default 0
videoInfo.age_limit = 0;
videoInfo.webpage_url = siteUrl;
@@ -334,14 +339,14 @@ public class YoutubeExtractor implements Extractor {
.select("li").first());
// related videos
- Vector relatedVideos = new Vector<>();
+ Vector relatedVideos = new Vector<>();
for(Element li : doc.select("ul[id=\"watch-related\"]").first().children()) {
// first check if we have a playlist. If so leave them out
if(li.select("a[class*=\"content-link\"]").first() != null) {
relatedVideos.add(extractVideoInfoItem(li));
}
}
- videoInfo.relatedVideos = relatedVideos.toArray(new VideoInfoItem[relatedVideos.size()]);
+ videoInfo.relatedVideos = relatedVideos.toArray(new VideoPreviewInfo[relatedVideos.size()]);
return videoInfo;
}
@@ -409,8 +414,8 @@ public class YoutubeExtractor implements Extractor {
return audioStreams.toArray(new VideoInfo.AudioStream[audioStreams.size()]);
}
- private VideoInfoItem extractVideoInfoItem(Element li) {
- VideoInfoItem info = new VideoInfoItem();
+ private VideoPreviewInfo extractVideoInfoItem(Element li) {
+ VideoPreviewInfo info = new VideoPreviewInfo();
info.webpage_url = li.select("a[class*=\"content-link\"]").first()
.attr("abs:href");
try {
@@ -421,13 +426,13 @@ public class YoutubeExtractor implements Extractor {
//todo: check NullPointerException causing
info.title = li.select("span[class=\"title\"]").first().text();
- info.view_count = li.select("span[class*=\"view-count\"]").first().text();
+ info.view_count = Long.parseLong(li.select("span[class*=\"view-count\"]").first().text());
info.uploader = li.select("span[class=\"g-hovercard\"]").first().text();
info.duration = li.select("span[class=\"video-time\"]").first().text();
Element img = li.select("img").first();
info.thumbnail_url = img.attr("abs:src");
- // Sometimes youtube sends links to gif files which somehow sesm to not exist
+ // Sometimes youtube sends links to gif files which somehow seem to not exist
// anymore. Items with such gif also offer a secondary image source. So we are going
// to use that if we caught such an item.
if(info.thumbnail_url.contains(".gif")) {
diff --git a/app/src/main/java/org/schabi/newpipe/youtube/YoutubeSearchEngine.java b/app/src/main/java/org/schabi/newpipe/services/youtube/YoutubeSearchEngine.java
similarity index 97%
rename from app/src/main/java/org/schabi/newpipe/youtube/YoutubeSearchEngine.java
rename to app/src/main/java/org/schabi/newpipe/services/youtube/YoutubeSearchEngine.java
index 18bbf4337..74af8cdf7 100644
--- a/app/src/main/java/org/schabi/newpipe/youtube/YoutubeSearchEngine.java
+++ b/app/src/main/java/org/schabi/newpipe/services/youtube/YoutubeSearchEngine.java
@@ -1,4 +1,4 @@
-package org.schabi.newpipe.youtube;
+package org.schabi.newpipe.services.youtube;
import android.net.Uri;
import android.util.Log;
@@ -7,8 +7,8 @@ import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.schabi.newpipe.Downloader;
-import org.schabi.newpipe.SearchEngine;
-import org.schabi.newpipe.VideoInfoItem;
+import org.schabi.newpipe.services.SearchEngine;
+import org.schabi.newpipe.VideoPreviewInfo;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
@@ -101,7 +101,7 @@ public class YoutubeSearchEngine implements SearchEngine {
// video item type
} else if(!((el = item.select("div[class*=\"yt-lockup-video\"").first()) == null)) {
- VideoInfoItem resultItem = new VideoInfoItem();
+ VideoPreviewInfo resultItem = new VideoPreviewInfo();
Element dl = el.select("h3").first().select("a").first();
resultItem.webpage_url = dl.attr("abs:href");
try {
diff --git a/app/src/main/java/org/schabi/newpipe/youtube/YoutubeService.java b/app/src/main/java/org/schabi/newpipe/services/youtube/YoutubeService.java
similarity index 88%
rename from app/src/main/java/org/schabi/newpipe/youtube/YoutubeService.java
rename to app/src/main/java/org/schabi/newpipe/services/youtube/YoutubeService.java
index ee33fdd85..284fcbb16 100644
--- a/app/src/main/java/org/schabi/newpipe/youtube/YoutubeService.java
+++ b/app/src/main/java/org/schabi/newpipe/services/youtube/YoutubeService.java
@@ -1,8 +1,8 @@
-package org.schabi.newpipe.youtube;
+package org.schabi.newpipe.services.youtube;
-import org.schabi.newpipe.StreamingService;
-import org.schabi.newpipe.Extractor;
-import org.schabi.newpipe.SearchEngine;
+import org.schabi.newpipe.services.StreamingService;
+import org.schabi.newpipe.services.Extractor;
+import org.schabi.newpipe.services.SearchEngine;
/**