mirror of
				https://github.com/TeamNewPipe/NewPipe
				synced 2025-10-31 15:23:00 +00:00 
			
		
		
		
	refactored StreamingService interface so it acts as a Factory (returning new instances of called classes, eg Extractor), rather than passing Class objects (which loses type safety) which are then instantiated. Also noticed there is a conflict between existing gradle setup and mine: misc.xml and app.iml have had their jvm version values switched from 1.8 to 1.7
This commit is contained in:
		
							
								
								
									
										2
									
								
								.idea/gradle.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								.idea/gradle.xml
									
									
									
										generated
									
									
									
								
							| @@ -6,7 +6,7 @@ | ||||
|         <option name="distributionType" value="LOCAL" /> | ||||
|         <option name="externalProjectPath" value="$PROJECT_DIR$" /> | ||||
|         <option name="gradleHome" value="$APPLICATION_HOME_DIR$/gradle/gradle-2.4" /> | ||||
|         <option name="gradleJvm" value="1.8" /> | ||||
|         <option name="gradleJvm" value="1.7" /> | ||||
|         <option name="modules"> | ||||
|           <set> | ||||
|             <option value="$PROJECT_DIR$" /> | ||||
|   | ||||
							
								
								
									
										2
									
								
								.idea/misc.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								.idea/misc.xml
									
									
									
										generated
									
									
									
								
							| @@ -37,7 +37,7 @@ | ||||
|     <ConfirmationsSetting value="0" id="Add" /> | ||||
|     <ConfirmationsSetting value="0" id="Remove" /> | ||||
|   </component> | ||||
|   <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK"> | ||||
|   <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.7" project-jdk-type="JavaSDK"> | ||||
|     <output url="file://$PROJECT_DIR$/build/classes" /> | ||||
|   </component> | ||||
|   <component name="ProjectType"> | ||||
|   | ||||
| @@ -92,12 +92,12 @@ | ||||
|     </content> | ||||
|     <orderEntry type="jdk" jdkName="Android API 23 Platform" jdkType="Android SDK" /> | ||||
|     <orderEntry type="sourceFolder" forTests="false" /> | ||||
|     <orderEntry type="library" exported="" name="rhino-1.7.7" level="project" /> | ||||
|     <orderEntry type="library" exported="" name="recyclerview-v7-23.1.0" level="project" /> | ||||
|     <orderEntry type="library" exported="" name="support-annotations-23.1.0" level="project" /> | ||||
|     <orderEntry type="library" exported="" name="appcompat-v7-23.1.0" level="project" /> | ||||
|     <orderEntry type="library" exported="" name="design-23.1.0" level="project" /> | ||||
|     <orderEntry type="library" exported="" name="jsoup-1.8.3" level="project" /> | ||||
|     <orderEntry type="library" exported="" name="support-v4-23.1.0" level="project" /> | ||||
|     <orderEntry type="library" exported="" name="rhino-1.7.7" level="project" /> | ||||
|     <orderEntry type="library" exported="" name="design-23.1.0" level="project" /> | ||||
|     <orderEntry type="library" exported="" name="appcompat-v7-23.1.0" level="project" /> | ||||
|     <orderEntry type="library" exported="" name="support-annotations-23.1.0" level="project" /> | ||||
|   </component> | ||||
| </module> | ||||
| @@ -1,9 +1,12 @@ | ||||
| package org.schabi.newpipe; | ||||
|  | ||||
| import android.widget.Toast; | ||||
|  | ||||
| import java.io.BufferedReader; | ||||
| import java.io.InputStreamReader; | ||||
| import java.net.HttpURLConnection; | ||||
| import java.net.URL; | ||||
| import java.net.UnknownHostException; | ||||
|  | ||||
| /** | ||||
|  * Created by Christian Schabesberger on 14.08.15. | ||||
| @@ -45,7 +48,13 @@ public class Downloader { | ||||
|                 response.append(inputLine); | ||||
|             } | ||||
|             in.close(); | ||||
|         } catch (Exception e) { | ||||
|  | ||||
|         } | ||||
|         catch(UnknownHostException uhe) {//thrown when there's no internet connection | ||||
|             uhe.printStackTrace(); | ||||
|             //Toast.makeText(getActivity(), uhe.getMessage(), Toast.LENGTH_LONG).show(); | ||||
|         } | ||||
|         catch (Exception e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|         return response.toString(); | ||||
|   | ||||
| @@ -24,12 +24,12 @@ public interface StreamingService { | ||||
|     class ServiceInfo { | ||||
|         public String name = ""; | ||||
|     } | ||||
|     ServiceInfo getServiceInfo(); | ||||
|     Class getExtractorClass(); | ||||
|     Class getSearchEngineClass(); | ||||
|     public ServiceInfo getServiceInfo(); | ||||
|     public Extractor getExtractorInstance(); | ||||
|     public SearchEngine getSearchEngineInstance(); | ||||
|  | ||||
|     // When a VIEW_ACTION is caught this function will test if the url delivered within the calling | ||||
|     // Intent was meant to be watched with this Service. | ||||
|     // Return false if this service shall not allow to be callean through ACTIONs. | ||||
|     /**When a VIEW_ACTION is caught this function will test if the url delivered within the calling | ||||
|     Intent was meant to be watched with this Service. | ||||
|     Return false if this service shall not allow to be callean through ACTIONs.*/ | ||||
|     boolean acceptUrl(String videoUrl); | ||||
| } | ||||
|   | ||||
| @@ -59,7 +59,7 @@ public class VideoInfo { | ||||
|  | ||||
|     public static final int VIDEO_AVAILABLE = 0x00; | ||||
|     public static final int VIDEO_UNAVAILABLE = 0x01; | ||||
|     public static final int VIDEO_UNAVAILABLE_GEMA = 0x02; | ||||
|     public static final int VIDEO_UNAVAILABLE_GEMA = 0x02;//German DRM organisation; sound pretty draconian | ||||
|  | ||||
|     public static String getNameById(int id) { | ||||
|         switch(id) { | ||||
| @@ -68,8 +68,7 @@ public class VideoInfo { | ||||
|             case I_WEBM: return F_WEBM; | ||||
|             case I_M4A: return F_M4A; | ||||
|             case I_WEBMA: return F_WEBMA; | ||||
|             default: Log.e(TAG, "format not known: " + | ||||
|                     Integer.toString(id) + "call the programmer he messed it up."); | ||||
|             default: formatNotKnown(id); | ||||
|         } | ||||
|         return ""; | ||||
|     } | ||||
| @@ -81,8 +80,7 @@ public class VideoInfo { | ||||
|             case I_WEBM: return C_WEBM; | ||||
|             case I_M4A: return C_M4A; | ||||
|             case I_WEBMA: return C_WEBMA; | ||||
|             default: Log.e(TAG, "format not known: " + | ||||
|                     Integer.toString(id) + "call the programmer he messed it up."); | ||||
|             default: formatNotKnown(id); | ||||
|         } | ||||
|         return ""; | ||||
|     } | ||||
| @@ -94,8 +92,7 @@ public class VideoInfo { | ||||
|             case I_WEBM: return M_WEBM; | ||||
|             case I_M4A: return M_M4A; | ||||
|             case I_WEBMA: return M_WEBMA; | ||||
|             default: Log.e(TAG, "format not known: " + | ||||
|                     Integer.toString(id) + "call the programmer he messed it up."); | ||||
|             default: formatNotKnown(id); | ||||
|         } | ||||
|         return ""; | ||||
|     } | ||||
| @@ -109,6 +106,12 @@ public class VideoInfo { | ||||
|         public String resolution = ""; | ||||
|     } | ||||
|  | ||||
|     protected static void formatNotKnown(int id) | ||||
|     { | ||||
|         Log.e(TAG, "format not known: \"" + | ||||
|             Integer.toString(id) + "\". Call the programmer, he messed it up!"); | ||||
|     } | ||||
|  | ||||
|     public static class AudioStream { | ||||
|         public AudioStream(String url, int format, int bandwidth, int samplingRate) { | ||||
|             this.url = url; this.format = format; | ||||
|   | ||||
| @@ -61,7 +61,7 @@ public class VideoInfoItemViewCreator { | ||||
|         if(!info.upload_date.isEmpty()) { | ||||
|             holder.itemUploadDateView.setText(info.upload_date); | ||||
|         } else { | ||||
|             //tewak if nececeary: This is a hack preventing to have a white space in the layout :P | ||||
|             //tweak if necessary: This is a hack to prevent having white space in the layout :P | ||||
|             holder.itemUploadDateView.setText(info.view_count); | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -29,6 +29,7 @@ import android.widget.Toast; | ||||
|  * along with NewPipe.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| /***/ | ||||
| public class VideoItemDetailActivity extends AppCompatActivity { | ||||
|  | ||||
|     private static final String TAG = VideoItemDetailActivity.class.toString(); | ||||
| @@ -69,7 +70,7 @@ public class VideoItemDetailActivity extends AppCompatActivity { | ||||
|                         try { | ||||
|                             currentStreamingService = i; | ||||
|                             extractor = (Extractor) ServiceList.getService(i) | ||||
|                                     .getExtractorClass().newInstance(); | ||||
|                                     .getExtractorInstance(); | ||||
|                         } catch (Exception e) { | ||||
|                             e.printStackTrace(); | ||||
|                         } | ||||
| @@ -123,9 +124,9 @@ public class VideoItemDetailActivity extends AppCompatActivity { | ||||
|             // activity, the Up button is shown. Use NavUtils to allow users | ||||
|             // to navigate up one level in the application structure. For | ||||
|             // more details, see the Navigation pattern on Android Design: | ||||
|             // | ||||
|  | ||||
|             // http://developer.android.com/design/patterns/navigation.html#up-vs-back | ||||
|             // | ||||
|  | ||||
|             Intent intent = new Intent(this, VideoItemListActivity.class); | ||||
|             intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); | ||||
|             NavUtils.navigateUpTo(this, intent); | ||||
|   | ||||
| @@ -79,16 +79,15 @@ public class VideoItemDetailFragment extends Fragment { | ||||
|  | ||||
|     private class ExtractorRunnable implements Runnable { | ||||
|         private Handler h = new Handler(); | ||||
|         private Class extractorClass; | ||||
|         private Extractor extractor; | ||||
|         private String videoUrl; | ||||
|         public ExtractorRunnable(String videoUrl, Class extractorClass, VideoItemDetailFragment f) { | ||||
|             this.extractorClass = extractorClass; | ||||
|         public ExtractorRunnable(String videoUrl, Extractor extractor, VideoItemDetailFragment f) { | ||||
|             this.extractor = extractor; | ||||
|             this.videoUrl = videoUrl; | ||||
|         } | ||||
|         @Override | ||||
|         public void run() { | ||||
|             try { | ||||
|                 Extractor extractor = (Extractor) extractorClass.newInstance(); | ||||
|                 VideoInfo videoInfo = extractor.getVideoInfo(videoUrl); | ||||
|                 h.post(new VideoResultReturnedRunnable(videoInfo)); | ||||
|                 if (videoInfo.videoAvailableStatus == VideoInfo.VIDEO_AVAILABLE) { | ||||
| @@ -170,7 +169,7 @@ public class VideoItemDetailFragment extends Fragment { | ||||
|             } | ||||
|  | ||||
|         } catch (java.lang.NullPointerException e) { | ||||
|             // No god programm design i know. :/ | ||||
|             // Not good program design, I know. :/ | ||||
|             Log.w(TAG, "updateThumbnail(): Fragment closed before thread ended work"); | ||||
|         } | ||||
|     } | ||||
| @@ -312,7 +311,7 @@ public class VideoItemDetailFragment extends Fragment { | ||||
|                 StreamingService streamingService = ServiceList.getService( | ||||
|                         getArguments().getInt(STREAMING_SERVICE)); | ||||
|                 extractorThread = new Thread(new ExtractorRunnable( | ||||
|                         getArguments().getString(VIDEO_URL), streamingService.getExtractorClass(), this)); | ||||
|                         getArguments().getString(VIDEO_URL), streamingService.getExtractorInstance(), this)); | ||||
|                 autoPlayEnabled = getArguments().getBoolean(AUTO_PLAY); | ||||
|                 extractorThread.start(); | ||||
|             } catch (Exception e) { | ||||
|   | ||||
| @@ -87,13 +87,11 @@ public class VideoItemListActivity extends AppCompatActivity | ||||
|         super.onCreate(savedInstanceState); | ||||
|         setContentView(R.layout.activity_videoitem_list); | ||||
|  | ||||
|         listFragment = (VideoItemListFragment) | ||||
|                 getSupportFragmentManager().findFragmentById(R.id.videoitem_list); | ||||
|  | ||||
|         //-------- remove this line when multiservice support is implemented ---------- | ||||
|         currentStreamingServiceId = ServiceList.getIdOfService("Youtube"); | ||||
|         //----------------------------------------------------------------------------- | ||||
|         VideoItemListFragment listFragment = (VideoItemListFragment) getSupportFragmentManager() | ||||
|  | ||||
|         listFragment = (VideoItemListFragment) getSupportFragmentManager() | ||||
|                 .findFragmentById(R.id.videoitem_list); | ||||
|         listFragment.setStreamingService(ServiceList.getService(currentStreamingServiceId)); | ||||
|  | ||||
|   | ||||
| @@ -65,14 +65,14 @@ public class VideoItemListFragment extends ListFragment { | ||||
|     } | ||||
|  | ||||
|     private class SearchRunnable implements Runnable { | ||||
|         private Class engineClass = null; | ||||
|         private SearchEngine engine; | ||||
|         private String query; | ||||
|         private int page; | ||||
|         Handler h = new Handler(); | ||||
|         private volatile boolean run = true; | ||||
|         private int requestId; | ||||
|         public SearchRunnable(Class engineClass, String query, int page, int requestId) { | ||||
|             this.engineClass = engineClass; | ||||
|         public SearchRunnable(SearchEngine engine, String query, int page, int requestId) { | ||||
|             this.engine = engine; | ||||
|             this.query = query; | ||||
|             this.page = page; | ||||
|             this.requestId = requestId; | ||||
| @@ -82,13 +82,6 @@ public class VideoItemListFragment extends ListFragment { | ||||
|         } | ||||
|         @Override | ||||
|         public void run() { | ||||
|             SearchEngine engine = null; | ||||
|             try { | ||||
|                 engine = (SearchEngine) engineClass.newInstance(); | ||||
|             } catch(Exception e) { | ||||
|                 e.printStackTrace(); | ||||
|                 return; | ||||
|             } | ||||
|             try { | ||||
|                 SearchEngine.Result result = engine.search(query, page); | ||||
|                 if(run) { | ||||
| @@ -179,7 +172,7 @@ public class VideoItemListFragment extends ListFragment { | ||||
|     private void startSearch(String query, int page) { | ||||
|         currentRequestId++; | ||||
|         terminateThreads(); | ||||
|         searchRunnable = new SearchRunnable(streamingService.getSearchEngineClass(), query, page, currentRequestId); | ||||
|         searchRunnable = new SearchRunnable(streamingService.getSearchEngineInstance(), query, page, currentRequestId); | ||||
|         searchThread = new Thread(searchRunnable); | ||||
|         searchThread.start(); | ||||
|     } | ||||
|   | ||||
| @@ -50,7 +50,7 @@ public class YoutubeExtractor implements Extractor { | ||||
|     private static final String TAG = YoutubeExtractor.class.toString(); | ||||
|  | ||||
|     // These lists only contain itag formats that are supported by the common Android Video player. | ||||
|     // How ever if you are heading for a list showing all itag formats lock at | ||||
|     // How ever if you are heading for a list showing all itag formats look at | ||||
|     // https://github.com/rg3/youtube-dl/issues/1687 | ||||
|  | ||||
|     public static int resolveFormat(int itag) { | ||||
|   | ||||
| @@ -1,6 +1,9 @@ | ||||
| package org.schabi.newpipe.youtube; | ||||
|  | ||||
| import org.schabi.newpipe.StreamingService; | ||||
| import org.schabi.newpipe.Extractor; | ||||
| import org.schabi.newpipe.SearchEngine; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Created by Christian Schabesberger on 23.08.15. | ||||
| @@ -30,12 +33,12 @@ public class YoutubeService implements StreamingService { | ||||
|         return serviceInfo; | ||||
|     } | ||||
|     @Override | ||||
|     public Class getExtractorClass() { | ||||
|         return YoutubeExtractor.class; | ||||
|     public Extractor getExtractorInstance() { | ||||
|         return (Extractor) new YoutubeExtractor(); | ||||
|     } | ||||
|     @Override | ||||
|     public Class getSearchEngineClass() { | ||||
|         return YoutubeSearchEngine.class; | ||||
|     public SearchEngine getSearchEngineInstance() { | ||||
|         return (SearchEngine) new YoutubeSearchEngine(); | ||||
|     } | ||||
|     @Override | ||||
|     public boolean acceptUrl(String videoUrl) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Adam Howard
					Adam Howard