From 320a4e2351674fa6b19aaa9b8322c0df4469b9c3 Mon Sep 17 00:00:00 2001 From: Adam Howard Date: Mon, 16 Nov 2015 23:32:00 +0000 Subject: [PATCH] Refactoring: * renamed VideoInfoItem to VideoPreviewInfo * moved streaming service-related classes into their own, new package services * added javadoc to some classes and methods (where functionality is known well enough to explain) * De-duplicated common fields between VideoInfo and VideoPreviewInfo by moving them into a common superclass: AbstractVideoInfo * Removed 2 methods which only call super(), and therefore are unnecessary: PlayVideoActivity.onResume() and PlayVideoActivity.onPostCreate(Bundle) --- .../org/schabi/newpipe/AbstractVideoInfo.java | 15 +++++ .../java/org/schabi/newpipe/Downloader.java | 12 +++- .../java/org/schabi/newpipe/MediaFormat.java | 14 +++++ .../org/schabi/newpipe/PlayVideoActivity.java | 12 +--- .../java/org/schabi/newpipe/VideoInfo.java | 21 ++----- .../newpipe/VideoInfoItemViewCreator.java | 4 +- .../newpipe/VideoItemDetailActivity.java | 7 ++- .../newpipe/VideoItemDetailFragment.java | 8 ++- .../schabi/newpipe/VideoItemListActivity.java | 9 +-- .../schabi/newpipe/VideoItemListFragment.java | 12 ++-- .../org/schabi/newpipe/VideoListAdapter.java | 6 +- ...deoInfoItem.java => VideoPreviewInfo.java} | 31 ++++------ .../newpipe/{ => services}/Extractor.java | 4 +- .../newpipe/{ => services}/SearchEngine.java | 6 +- .../newpipe/{ => services}/ServiceList.java | 6 +- .../{ => services}/StreamingService.java | 2 +- .../youtube/YoutubeExtractor.java | 59 ++++++++++--------- .../youtube/YoutubeSearchEngine.java | 8 +-- .../youtube/YoutubeService.java | 8 +-- 19 files changed, 136 insertions(+), 108 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/AbstractVideoInfo.java rename app/src/main/java/org/schabi/newpipe/{VideoInfoItem.java => VideoPreviewInfo.java} (69%) rename app/src/main/java/org/schabi/newpipe/{ => services}/Extractor.java (86%) rename app/src/main/java/org/schabi/newpipe/{ => services}/SearchEngine.java (88%) rename app/src/main/java/org/schabi/newpipe/{ => services}/ServiceList.java (87%) rename app/src/main/java/org/schabi/newpipe/{ => services}/StreamingService.java (97%) rename app/src/main/java/org/schabi/newpipe/{ => services}/youtube/YoutubeExtractor.java (95%) rename app/src/main/java/org/schabi/newpipe/{ => services}/youtube/YoutubeSearchEngine.java (97%) rename app/src/main/java/org/schabi/newpipe/{ => services}/youtube/YoutubeService.java (88%) 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; /**