diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..a1fc39c07 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +.gradle +/build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +# Cache of project +.gradletasknamecache + +# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898 +# gradle/wrapper/gradle-wrapper.properties diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..dff5f3a5d --- /dev/null +++ b/.travis.yml @@ -0,0 +1 @@ +language: java diff --git a/build.gradle b/build.gradle new file mode 100644 index 000000000..0bd985d15 --- /dev/null +++ b/build.gradle @@ -0,0 +1,14 @@ +apply plugin: 'java-library' + +repositories { + jcenter() +} + +dependencies { + implementation 'org.json:json:20160807' + implementation 'org.jsoup:jsoup:1.9.2' + implementation 'org.mozilla:rhino:1.7.7.1' + + testImplementation 'junit:junit:4.12' +} + diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 000000000..2bb7222bc Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..df968c7fe --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Aug 04 16:32:25 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.0.2-bin.zip diff --git a/gradlew b/gradlew new file mode 100755 index 000000000..cccdd3d51 --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 000000000..e95643d6a --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 000000000..9a1b299d4 --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'NewPipeExtractor' diff --git a/Downloader.java b/src/main/java/org/schabi/newpipe/extractor/Downloader.java similarity index 100% rename from Downloader.java rename to src/main/java/org/schabi/newpipe/extractor/Downloader.java diff --git a/Extractor.java b/src/main/java/org/schabi/newpipe/extractor/Extractor.java similarity index 100% rename from Extractor.java rename to src/main/java/org/schabi/newpipe/extractor/Extractor.java diff --git a/Info.java b/src/main/java/org/schabi/newpipe/extractor/Info.java similarity index 100% rename from Info.java rename to src/main/java/org/schabi/newpipe/extractor/Info.java diff --git a/InfoItem.java b/src/main/java/org/schabi/newpipe/extractor/InfoItem.java similarity index 100% rename from InfoItem.java rename to src/main/java/org/schabi/newpipe/extractor/InfoItem.java diff --git a/InfoItemCollector.java b/src/main/java/org/schabi/newpipe/extractor/InfoItemCollector.java similarity index 100% rename from InfoItemCollector.java rename to src/main/java/org/schabi/newpipe/extractor/InfoItemCollector.java diff --git a/ListExtractor.java b/src/main/java/org/schabi/newpipe/extractor/ListExtractor.java similarity index 100% rename from ListExtractor.java rename to src/main/java/org/schabi/newpipe/extractor/ListExtractor.java diff --git a/MediaFormat.java b/src/main/java/org/schabi/newpipe/extractor/MediaFormat.java similarity index 100% rename from MediaFormat.java rename to src/main/java/org/schabi/newpipe/extractor/MediaFormat.java diff --git a/NewPipe.java b/src/main/java/org/schabi/newpipe/extractor/NewPipe.java similarity index 100% rename from NewPipe.java rename to src/main/java/org/schabi/newpipe/extractor/NewPipe.java diff --git a/ServiceList.java b/src/main/java/org/schabi/newpipe/extractor/ServiceList.java similarity index 100% rename from ServiceList.java rename to src/main/java/org/schabi/newpipe/extractor/ServiceList.java diff --git a/StreamingService.java b/src/main/java/org/schabi/newpipe/extractor/StreamingService.java similarity index 100% rename from StreamingService.java rename to src/main/java/org/schabi/newpipe/extractor/StreamingService.java diff --git a/SuggestionExtractor.java b/src/main/java/org/schabi/newpipe/extractor/SuggestionExtractor.java similarity index 100% rename from SuggestionExtractor.java rename to src/main/java/org/schabi/newpipe/extractor/SuggestionExtractor.java diff --git a/UrlIdHandler.java b/src/main/java/org/schabi/newpipe/extractor/UrlIdHandler.java similarity index 100% rename from UrlIdHandler.java rename to src/main/java/org/schabi/newpipe/extractor/UrlIdHandler.java diff --git a/channel/ChannelExtractor.java b/src/main/java/org/schabi/newpipe/extractor/channel/ChannelExtractor.java similarity index 100% rename from channel/ChannelExtractor.java rename to src/main/java/org/schabi/newpipe/extractor/channel/ChannelExtractor.java diff --git a/channel/ChannelInfo.java b/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfo.java similarity index 100% rename from channel/ChannelInfo.java rename to src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfo.java diff --git a/channel/ChannelInfoItem.java b/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfoItem.java similarity index 100% rename from channel/ChannelInfoItem.java rename to src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfoItem.java diff --git a/channel/ChannelInfoItemCollector.java b/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfoItemCollector.java similarity index 100% rename from channel/ChannelInfoItemCollector.java rename to src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfoItemCollector.java diff --git a/channel/ChannelInfoItemExtractor.java b/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfoItemExtractor.java similarity index 100% rename from channel/ChannelInfoItemExtractor.java rename to src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfoItemExtractor.java diff --git a/exceptions/ContentNotAvailableException.java b/src/main/java/org/schabi/newpipe/extractor/exceptions/ContentNotAvailableException.java similarity index 100% rename from exceptions/ContentNotAvailableException.java rename to src/main/java/org/schabi/newpipe/extractor/exceptions/ContentNotAvailableException.java diff --git a/exceptions/ExtractionException.java b/src/main/java/org/schabi/newpipe/extractor/exceptions/ExtractionException.java similarity index 100% rename from exceptions/ExtractionException.java rename to src/main/java/org/schabi/newpipe/extractor/exceptions/ExtractionException.java diff --git a/exceptions/FoundAdException.java b/src/main/java/org/schabi/newpipe/extractor/exceptions/FoundAdException.java similarity index 100% rename from exceptions/FoundAdException.java rename to src/main/java/org/schabi/newpipe/extractor/exceptions/FoundAdException.java diff --git a/exceptions/ParsingException.java b/src/main/java/org/schabi/newpipe/extractor/exceptions/ParsingException.java similarity index 100% rename from exceptions/ParsingException.java rename to src/main/java/org/schabi/newpipe/extractor/exceptions/ParsingException.java diff --git a/exceptions/ReCaptchaException.java b/src/main/java/org/schabi/newpipe/extractor/exceptions/ReCaptchaException.java similarity index 100% rename from exceptions/ReCaptchaException.java rename to src/main/java/org/schabi/newpipe/extractor/exceptions/ReCaptchaException.java diff --git a/playlist/PlaylistExtractor.java b/src/main/java/org/schabi/newpipe/extractor/playlist/PlaylistExtractor.java similarity index 100% rename from playlist/PlaylistExtractor.java rename to src/main/java/org/schabi/newpipe/extractor/playlist/PlaylistExtractor.java diff --git a/playlist/PlaylistInfo.java b/src/main/java/org/schabi/newpipe/extractor/playlist/PlaylistInfo.java similarity index 100% rename from playlist/PlaylistInfo.java rename to src/main/java/org/schabi/newpipe/extractor/playlist/PlaylistInfo.java diff --git a/playlist/PlaylistInfoItem.java b/src/main/java/org/schabi/newpipe/extractor/playlist/PlaylistInfoItem.java similarity index 100% rename from playlist/PlaylistInfoItem.java rename to src/main/java/org/schabi/newpipe/extractor/playlist/PlaylistInfoItem.java diff --git a/playlist/PlaylistInfoItemCollector.java b/src/main/java/org/schabi/newpipe/extractor/playlist/PlaylistInfoItemCollector.java similarity index 100% rename from playlist/PlaylistInfoItemCollector.java rename to src/main/java/org/schabi/newpipe/extractor/playlist/PlaylistInfoItemCollector.java diff --git a/playlist/PlaylistInfoItemExtractor.java b/src/main/java/org/schabi/newpipe/extractor/playlist/PlaylistInfoItemExtractor.java similarity index 100% rename from playlist/PlaylistInfoItemExtractor.java rename to src/main/java/org/schabi/newpipe/extractor/playlist/PlaylistInfoItemExtractor.java diff --git a/search/InfoItemSearchCollector.java b/src/main/java/org/schabi/newpipe/extractor/search/InfoItemSearchCollector.java similarity index 100% rename from search/InfoItemSearchCollector.java rename to src/main/java/org/schabi/newpipe/extractor/search/InfoItemSearchCollector.java diff --git a/search/SearchEngine.java b/src/main/java/org/schabi/newpipe/extractor/search/SearchEngine.java similarity index 100% rename from search/SearchEngine.java rename to src/main/java/org/schabi/newpipe/extractor/search/SearchEngine.java diff --git a/search/SearchResult.java b/src/main/java/org/schabi/newpipe/extractor/search/SearchResult.java similarity index 100% rename from search/SearchResult.java rename to src/main/java/org/schabi/newpipe/extractor/search/SearchResult.java diff --git a/services/soundcloud/SoundcloudChannelExtractor.java b/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChannelExtractor.java similarity index 100% rename from services/soundcloud/SoundcloudChannelExtractor.java rename to src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChannelExtractor.java diff --git a/services/soundcloud/SoundcloudChannelInfoItemExtractor.java b/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChannelInfoItemExtractor.java similarity index 100% rename from services/soundcloud/SoundcloudChannelInfoItemExtractor.java rename to src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChannelInfoItemExtractor.java diff --git a/services/soundcloud/SoundcloudChannelUrlIdHandler.java b/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChannelUrlIdHandler.java similarity index 100% rename from services/soundcloud/SoundcloudChannelUrlIdHandler.java rename to src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChannelUrlIdHandler.java diff --git a/services/soundcloud/SoundcloudParsingHelper.java b/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudParsingHelper.java similarity index 100% rename from services/soundcloud/SoundcloudParsingHelper.java rename to src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudParsingHelper.java diff --git a/services/soundcloud/SoundcloudPlaylistExtractor.java b/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudPlaylistExtractor.java similarity index 100% rename from services/soundcloud/SoundcloudPlaylistExtractor.java rename to src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudPlaylistExtractor.java diff --git a/services/soundcloud/SoundcloudPlaylistUrlIdHandler.java b/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudPlaylistUrlIdHandler.java similarity index 100% rename from services/soundcloud/SoundcloudPlaylistUrlIdHandler.java rename to src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudPlaylistUrlIdHandler.java diff --git a/services/soundcloud/SoundcloudSearchEngine.java b/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudSearchEngine.java similarity index 100% rename from services/soundcloud/SoundcloudSearchEngine.java rename to src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudSearchEngine.java diff --git a/services/soundcloud/SoundcloudService.java b/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudService.java similarity index 100% rename from services/soundcloud/SoundcloudService.java rename to src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudService.java diff --git a/services/soundcloud/SoundcloudStreamExtractor.java b/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudStreamExtractor.java similarity index 100% rename from services/soundcloud/SoundcloudStreamExtractor.java rename to src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudStreamExtractor.java diff --git a/services/soundcloud/SoundcloudStreamInfoItemExtractor.java b/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudStreamInfoItemExtractor.java similarity index 100% rename from services/soundcloud/SoundcloudStreamInfoItemExtractor.java rename to src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudStreamInfoItemExtractor.java diff --git a/services/soundcloud/SoundcloudStreamUrlIdHandler.java b/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudStreamUrlIdHandler.java similarity index 100% rename from services/soundcloud/SoundcloudStreamUrlIdHandler.java rename to src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudStreamUrlIdHandler.java diff --git a/services/soundcloud/SoundcloudSuggestionExtractor.java b/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudSuggestionExtractor.java similarity index 100% rename from services/soundcloud/SoundcloudSuggestionExtractor.java rename to src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudSuggestionExtractor.java diff --git a/services/youtube/ItagItem.java b/src/main/java/org/schabi/newpipe/extractor/services/youtube/ItagItem.java similarity index 100% rename from services/youtube/ItagItem.java rename to src/main/java/org/schabi/newpipe/extractor/services/youtube/ItagItem.java diff --git a/services/youtube/YoutubeChannelExtractor.java b/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelExtractor.java similarity index 100% rename from services/youtube/YoutubeChannelExtractor.java rename to src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelExtractor.java diff --git a/services/youtube/YoutubeChannelInfoItemExtractor.java b/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelInfoItemExtractor.java similarity index 100% rename from services/youtube/YoutubeChannelInfoItemExtractor.java rename to src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelInfoItemExtractor.java diff --git a/services/youtube/YoutubeChannelUrlIdHandler.java b/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelUrlIdHandler.java similarity index 100% rename from services/youtube/YoutubeChannelUrlIdHandler.java rename to src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelUrlIdHandler.java diff --git a/services/youtube/YoutubeParsingHelper.java b/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeParsingHelper.java similarity index 100% rename from services/youtube/YoutubeParsingHelper.java rename to src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeParsingHelper.java diff --git a/services/youtube/YoutubePlaylistExtractor.java b/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubePlaylistExtractor.java similarity index 100% rename from services/youtube/YoutubePlaylistExtractor.java rename to src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubePlaylistExtractor.java diff --git a/services/youtube/YoutubePlaylistUrlIdHandler.java b/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubePlaylistUrlIdHandler.java similarity index 100% rename from services/youtube/YoutubePlaylistUrlIdHandler.java rename to src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubePlaylistUrlIdHandler.java diff --git a/services/youtube/YoutubeSearchEngine.java b/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEngine.java similarity index 100% rename from services/youtube/YoutubeSearchEngine.java rename to src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEngine.java diff --git a/services/youtube/YoutubeService.java b/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeService.java similarity index 100% rename from services/youtube/YoutubeService.java rename to src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeService.java diff --git a/services/youtube/YoutubeStreamExtractor.java b/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamExtractor.java similarity index 100% rename from services/youtube/YoutubeStreamExtractor.java rename to src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamExtractor.java diff --git a/services/youtube/YoutubeStreamInfoItemExtractor.java b/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamInfoItemExtractor.java similarity index 100% rename from services/youtube/YoutubeStreamInfoItemExtractor.java rename to src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamInfoItemExtractor.java diff --git a/services/youtube/YoutubeStreamUrlIdHandler.java b/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamUrlIdHandler.java similarity index 100% rename from services/youtube/YoutubeStreamUrlIdHandler.java rename to src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamUrlIdHandler.java diff --git a/services/youtube/YoutubeSuggestionExtractor.java b/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSuggestionExtractor.java similarity index 100% rename from services/youtube/YoutubeSuggestionExtractor.java rename to src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSuggestionExtractor.java diff --git a/stream/AudioStream.java b/src/main/java/org/schabi/newpipe/extractor/stream/AudioStream.java similarity index 100% rename from stream/AudioStream.java rename to src/main/java/org/schabi/newpipe/extractor/stream/AudioStream.java diff --git a/stream/Stream.java b/src/main/java/org/schabi/newpipe/extractor/stream/Stream.java similarity index 100% rename from stream/Stream.java rename to src/main/java/org/schabi/newpipe/extractor/stream/Stream.java diff --git a/stream/StreamExtractor.java b/src/main/java/org/schabi/newpipe/extractor/stream/StreamExtractor.java similarity index 100% rename from stream/StreamExtractor.java rename to src/main/java/org/schabi/newpipe/extractor/stream/StreamExtractor.java diff --git a/stream/StreamInfo.java b/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfo.java similarity index 100% rename from stream/StreamInfo.java rename to src/main/java/org/schabi/newpipe/extractor/stream/StreamInfo.java diff --git a/stream/StreamInfoItem.java b/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfoItem.java similarity index 100% rename from stream/StreamInfoItem.java rename to src/main/java/org/schabi/newpipe/extractor/stream/StreamInfoItem.java diff --git a/stream/StreamInfoItemCollector.java b/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfoItemCollector.java similarity index 100% rename from stream/StreamInfoItemCollector.java rename to src/main/java/org/schabi/newpipe/extractor/stream/StreamInfoItemCollector.java diff --git a/stream/StreamInfoItemExtractor.java b/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfoItemExtractor.java similarity index 100% rename from stream/StreamInfoItemExtractor.java rename to src/main/java/org/schabi/newpipe/extractor/stream/StreamInfoItemExtractor.java diff --git a/stream/StreamType.java b/src/main/java/org/schabi/newpipe/extractor/stream/StreamType.java similarity index 100% rename from stream/StreamType.java rename to src/main/java/org/schabi/newpipe/extractor/stream/StreamType.java diff --git a/stream/VideoStream.java b/src/main/java/org/schabi/newpipe/extractor/stream/VideoStream.java similarity index 100% rename from stream/VideoStream.java rename to src/main/java/org/schabi/newpipe/extractor/stream/VideoStream.java diff --git a/utils/DashMpdParser.java b/src/main/java/org/schabi/newpipe/extractor/utils/DashMpdParser.java similarity index 100% rename from utils/DashMpdParser.java rename to src/main/java/org/schabi/newpipe/extractor/utils/DashMpdParser.java diff --git a/utils/Parser.java b/src/main/java/org/schabi/newpipe/extractor/utils/Parser.java similarity index 100% rename from utils/Parser.java rename to src/main/java/org/schabi/newpipe/extractor/utils/Parser.java diff --git a/utils/Utils.java b/src/main/java/org/schabi/newpipe/extractor/utils/Utils.java similarity index 100% rename from utils/Utils.java rename to src/main/java/org/schabi/newpipe/extractor/utils/Utils.java diff --git a/src/test/java/org/schabi/newpipe/Downloader.java b/src/test/java/org/schabi/newpipe/Downloader.java new file mode 100644 index 000000000..870c17005 --- /dev/null +++ b/src/test/java/org/schabi/newpipe/Downloader.java @@ -0,0 +1,146 @@ +package org.schabi.newpipe; + +import org.schabi.newpipe.extractor.exceptions.ReCaptchaException; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URL; +import java.net.UnknownHostException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import javax.net.ssl.HttpsURLConnection; + + +/** + * Created by Christian Schabesberger on 28.01.16. + * + * Copyright (C) Christian Schabesberger 2016 + * Downloader.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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * NewPipe is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with NewPipe. If not, see . + */ + +public class Downloader implements org.schabi.newpipe.extractor.Downloader { + + private static final String USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0"; + private static String mCookies = ""; + + private static Downloader instance = null; + + private Downloader() {} + + public static Downloader getInstance() { + if(instance == null) { + synchronized (Downloader.class) { + if (instance == null) { + instance = new Downloader(); + } + } + } + return instance; + } + + public static synchronized void setCookies(String cookies) { + Downloader.mCookies = cookies; + } + + public static synchronized String getCookies() { + return Downloader.mCookies; + } + + /**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 String download(String siteUrl, String language) throws IOException, ReCaptchaException { + Map requestProperties = new HashMap<>(); + requestProperties.put("Accept-Language", language); + return download(siteUrl, requestProperties); + } + + + /**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 customProperties set request header properties + * @return the contents of the specified text file + * @throws IOException*/ + public String download(String siteUrl, Map customProperties) throws IOException, ReCaptchaException { + URL url = new URL(siteUrl); + HttpsURLConnection con = (HttpsURLConnection) url.openConnection(); + Iterator it = customProperties.entrySet().iterator(); + while(it.hasNext()) { + Map.Entry pair = (Map.Entry)it.next(); + con.setRequestProperty((String)pair.getKey(), (String)pair.getValue()); + } + return dl(con); + } + + /**Common functionality between download(String url) and download(String url, String language)*/ + private static String dl(HttpsURLConnection con) throws IOException, ReCaptchaException { + StringBuilder response = new StringBuilder(); + BufferedReader in = null; + + try { + con.setRequestMethod("GET"); + con.setRequestProperty("User-Agent", USER_AGENT); + + if (getCookies().length() > 0) { + con.setRequestProperty("Cookie", getCookies()); + } + + in = new BufferedReader( + new InputStreamReader(con.getInputStream())); + String inputLine; + + while((inputLine = in.readLine()) != null) { + response.append(inputLine); + } + } catch(UnknownHostException uhe) {//thrown when there's no internet connection + throw new IOException("unknown host or no network", uhe); + //Toast.makeText(getActivity(), uhe.getMessage(), Toast.LENGTH_LONG).show(); + } catch(Exception e) { + /* + * HTTP 429 == Too Many Request + * Receive from Youtube.com = ReCaptcha challenge request + * See : https://github.com/rg3/youtube-dl/issues/5138 + */ + if (con.getResponseCode() == 429) { + throw new ReCaptchaException("reCaptcha Challenge requested"); + } + throw new IOException(e); + } finally { + if(in != null) { + in.close(); + } + } + + 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 String download(String siteUrl) throws IOException, ReCaptchaException { + URL url = new URL(siteUrl); + HttpsURLConnection con = (HttpsURLConnection) url.openConnection(); + //HttpsURLConnection con = NetCipher.getHttpsURLConnection(url); + return dl(con); + } +} diff --git a/src/test/java/org/schabi/newpipe/extractor/services/youtube/youtube/YoutubeChannelExtractorTest.java b/src/test/java/org/schabi/newpipe/extractor/services/youtube/youtube/YoutubeChannelExtractorTest.java new file mode 100644 index 000000000..5af3096e1 --- /dev/null +++ b/src/test/java/org/schabi/newpipe/extractor/services/youtube/youtube/YoutubeChannelExtractorTest.java @@ -0,0 +1,107 @@ +package org.schabi.newpipe.extractor.services.youtube.youtube; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertNotNull; +import static junit.framework.Assert.assertTrue; + +import org.junit.Before; +import org.junit.Test; +import org.schabi.newpipe.Downloader; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.channel.ChannelExtractor; + +/** + * Created by Christian Schabesberger on 12.09.16. + * + * Copyright (C) Christian Schabesberger 2015 + * YoutubeSearchEngineStreamTest.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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * NewPipe is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with NewPipe. If not, see . + */ + +/** + * Test for {@link ChannelExtractor} + */ + +public class YoutubeChannelExtractorTest { + + ChannelExtractor extractor; + + @Before + public void setUp() throws Exception { + NewPipe.init(Downloader.getInstance()); + extractor = NewPipe.getService("Youtube") + .getChannelExtractorInstance("https://www.youtube.com/channel/UCYJ61XIK64sp6ZFFS8sctxw"); + } + + @Test + public void testGetDownloader() throws Exception { + assertNotNull(NewPipe.getDownloader()); + } + + @Test + public void testGetChannelName() throws Exception { + assertEquals(extractor.getChannelName(), "Gronkh"); + } + + @Test + public void testGetAvatarUrl() throws Exception { + assertTrue(extractor.getAvatarUrl(), extractor.getAvatarUrl().contains("yt3")); + } + + @Test + public void testGetBannerurl() throws Exception { + assertTrue(extractor.getBannerUrl(), extractor.getBannerUrl().contains("yt3")); + } + + @Test + public void testGetFeedUrl() throws Exception { + assertTrue(extractor.getFeedUrl(), extractor.getFeedUrl().contains("feed")); + } + + @Test + public void testGetStreams() throws Exception { + assertTrue("no streams are received", !extractor.getStreams().getItemList().isEmpty()); + } + + @Test + public void testGetStreamsErrors() throws Exception { + assertTrue("errors during stream list extraction", extractor.getStreams().getErrors().isEmpty()); + } + + @Test + public void testHasNextPage() throws Exception { + // this particular example (link) has a next page !!! + assertTrue("no next page link found", extractor.hasMoreStreams()); + } + + @Test + public void testGetSubscriberCount() throws Exception { + assertTrue("wrong subscriber count", extractor.getSubscriberCount() >= 0); + } + + @Test + public void testGetNextPage() throws Exception { + extractor = NewPipe.getService("Youtube") + .getChannelExtractorInstance("https://www.youtube.com/channel/UCYJ61XIK64sp6ZFFS8sctxw"); + assertTrue("next page didn't have content", !extractor.getStreams().getItemList().isEmpty()); + } + + @Test + public void testGetNextNextPageUrl() throws Exception { + extractor = NewPipe.getService("Youtube") + .getChannelExtractorInstance("https://www.youtube.com/channel/UCYJ61XIK64sp6ZFFS8sctxw"); + assertTrue("next page didn't have content", extractor.hasMoreStreams()); + } +} diff --git a/src/test/java/org/schabi/newpipe/extractor/services/youtube/youtube/YoutubeSearchEngineAllTest.java b/src/test/java/org/schabi/newpipe/extractor/services/youtube/youtube/YoutubeSearchEngineAllTest.java new file mode 100644 index 000000000..4c051fa1c --- /dev/null +++ b/src/test/java/org/schabi/newpipe/extractor/services/youtube/youtube/YoutubeSearchEngineAllTest.java @@ -0,0 +1,67 @@ +package org.schabi.newpipe.extractor.services.youtube.youtube; + +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertTrue; + +import java.util.EnumSet; + +import org.junit.Before; +import org.junit.Test; +import org.schabi.newpipe.Downloader; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.search.SearchEngine; +import org.schabi.newpipe.extractor.search.SearchResult; + + +/** + * Created by Christian Schabesberger on 29.12.15. + * + * Copyright (C) Christian Schabesberger 2015 + * YoutubeSearchEngineStreamTest.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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * NewPipe is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with NewPipe. If not, see . + */ + +/** + * Test for {@link SearchEngine} + */ +public class YoutubeSearchEngineAllTest { + private SearchResult result; + + @Before + public void setUp() throws Exception { + NewPipe.init(Downloader.getInstance()); + SearchEngine engine = NewPipe.getService("Youtube").getSearchEngineInstance(); + + result = engine.search("asdf", 0, "de", + EnumSet.of(SearchEngine.Filter.CHANNEL, + SearchEngine.Filter.STREAM)).getSearchResult(); + } + + @Test + public void testResultList() { + assertFalse(result.resultList.isEmpty()); + } + + @Test + public void testResultErrors() { + assertTrue(result.errors == null || result.errors.isEmpty()); + } + + @Test + public void testSuggestion() { + //todo write a real test + assertTrue(result.suggestion != null); + } +} diff --git a/src/test/java/org/schabi/newpipe/extractor/services/youtube/youtube/YoutubeSearchEngineChannelTest.java b/src/test/java/org/schabi/newpipe/extractor/services/youtube/youtube/YoutubeSearchEngineChannelTest.java new file mode 100644 index 000000000..68df60312 --- /dev/null +++ b/src/test/java/org/schabi/newpipe/extractor/services/youtube/youtube/YoutubeSearchEngineChannelTest.java @@ -0,0 +1,73 @@ +package org.schabi.newpipe.extractor.services.youtube.youtube; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertTrue; + +import java.util.EnumSet; + +import org.junit.Before; +import org.junit.Test; +import org.schabi.newpipe.Downloader; +import org.schabi.newpipe.extractor.InfoItem; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.search.SearchEngine; +import org.schabi.newpipe.extractor.search.SearchResult; + + +/** + * Created by Christian Schabesberger on 29.12.15. + * + * Copyright (C) Christian Schabesberger 2015 + * YoutubeSearchEngineStreamTest.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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * NewPipe is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with NewPipe. If not, see . + */ + +/** + * Test for {@link SearchEngine} + */ +public class YoutubeSearchEngineChannelTest { + private SearchResult result; + + @Before + public void setUp() throws Exception { + NewPipe.init(Downloader.getInstance()); + SearchEngine engine = NewPipe.getService("Youtube").getSearchEngineInstance(); + + result = engine.search("gronkh", 0, "de", + EnumSet.of(SearchEngine.Filter.CHANNEL)).getSearchResult(); + } + + @Test + public void testResultList() { + assertFalse(result.resultList.isEmpty()); + } + + @Test + public void testChannelItemType() { + assertEquals(result.resultList.get(0).info_type, InfoItem.InfoType.CHANNEL); + } + + @Test + public void testResultErrors() { + assertTrue(result.errors == null || result.errors.isEmpty()); + } + + @Test + public void testSuggestion() { + //todo write a real test + assertTrue(result.suggestion != null); + } +} diff --git a/src/test/java/org/schabi/newpipe/extractor/services/youtube/youtube/YoutubeSearchEngineStreamTest.java b/src/test/java/org/schabi/newpipe/extractor/services/youtube/youtube/YoutubeSearchEngineStreamTest.java new file mode 100644 index 000000000..f3f2732db --- /dev/null +++ b/src/test/java/org/schabi/newpipe/extractor/services/youtube/youtube/YoutubeSearchEngineStreamTest.java @@ -0,0 +1,73 @@ +package org.schabi.newpipe.extractor.services.youtube.youtube; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertTrue; + +import java.util.EnumSet; + +import org.junit.Before; +import org.junit.Test; +import org.schabi.newpipe.Downloader; +import org.schabi.newpipe.extractor.InfoItem; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.search.SearchEngine; +import org.schabi.newpipe.extractor.search.SearchResult; + + +/** + * Created by Christian Schabesberger on 29.12.15. + * + * Copyright (C) Christian Schabesberger 2015 + * YoutubeSearchEngineStreamTest.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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * NewPipe is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with NewPipe. If not, see . + */ + +/** + * Test for {@link SearchEngine} + */ +public class YoutubeSearchEngineStreamTest { + private SearchResult result; + + @Before + public void setUp() throws Exception { + NewPipe.init(Downloader.getInstance()); + SearchEngine engine = NewPipe.getService("Youtube").getSearchEngineInstance(); + + result = engine.search("this is something boring", 0, "de", + EnumSet.of(SearchEngine.Filter.STREAM)).getSearchResult(); + } + + @Test + public void testResultList() { + assertFalse(result.resultList.isEmpty()); + } + + @Test + public void testChannelItemType() { + assertEquals(result.resultList.get(0).info_type, InfoItem.InfoType.STREAM); + } + + @Test + public void testResultErrors() { + assertTrue(result.errors == null || result.errors.isEmpty()); + } + + @Test + public void testSuggestion() { + //todo write a real test + assertTrue(result.suggestion != null); + } +} diff --git a/src/test/java/org/schabi/newpipe/extractor/services/youtube/youtube/YoutubeSearchResultTest.java b/src/test/java/org/schabi/newpipe/extractor/services/youtube/youtube/YoutubeSearchResultTest.java new file mode 100644 index 000000000..1b2572917 --- /dev/null +++ b/src/test/java/org/schabi/newpipe/extractor/services/youtube/youtube/YoutubeSearchResultTest.java @@ -0,0 +1,52 @@ +package org.schabi.newpipe.extractor.services.youtube.youtube; + +import static junit.framework.Assert.assertFalse; + +import java.util.List; + +import org.junit.Before; +import org.junit.Test; +import org.schabi.newpipe.Downloader; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.SuggestionExtractor; +import org.schabi.newpipe.extractor.services.youtube.YoutubeSuggestionExtractor; + +/** + * Created by Christian Schabesberger on 18.11.16. + * + * Copyright (C) Christian Schabesberger 2016 + * YoutubeSearchResultTest.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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * NewPipe is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with NewPipe. If not, see . + */ + +/** + * Test for {@link SuggestionExtractor} + */ +public class YoutubeSearchResultTest { + List suggestionReply; + + + @Before + public void setUp() throws Exception { + NewPipe.init(Downloader.getInstance()); + SuggestionExtractor engine = new YoutubeSuggestionExtractor(0); + suggestionReply = engine.suggestionList("hello", "de"); + } + + @Test + public void testIfSuggestions() { + assertFalse(suggestionReply.isEmpty()); + } +} diff --git a/src/test/java/org/schabi/newpipe/extractor/services/youtube/youtube/YoutubeStreamExtractorDefaultTest.java b/src/test/java/org/schabi/newpipe/extractor/services/youtube/youtube/YoutubeStreamExtractorDefaultTest.java new file mode 100644 index 000000000..9b5a3204a --- /dev/null +++ b/src/test/java/org/schabi/newpipe/extractor/services/youtube/youtube/YoutubeStreamExtractorDefaultTest.java @@ -0,0 +1,141 @@ +package org.schabi.newpipe.extractor.services.youtube.youtube; + +import static junit.framework.Assert.assertTrue; + +import java.io.IOException; + +import org.junit.Before; +import org.junit.Test; +import org.schabi.newpipe.Downloader; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.exceptions.ReCaptchaException; +import org.schabi.newpipe.extractor.stream.StreamExtractor; +import org.schabi.newpipe.extractor.stream.StreamType; +import org.schabi.newpipe.extractor.stream.VideoStream; + +/** + * Created by Christian Schabesberger on 30.12.15. + * + * Copyright (C) Christian Schabesberger 2015 + * YoutubeVideoExtractorDefault.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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * NewPipe is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with NewPipe. If not, see . + */ + +/** + * Test for {@link StreamExtractor} + */ +public class YoutubeStreamExtractorDefaultTest { + public static final String HTTPS = "https://"; + private StreamExtractor extractor; + + @Before + public void setUp() throws Exception { + NewPipe.init(Downloader.getInstance()); + extractor = NewPipe.getService("Youtube") + .getStreamExtractorInstance("https://www.youtube.com/watch?v=YQHsXMglC9A"); + } + + @Test + public void testGetInvalidTimeStamp() throws ParsingException { + assertTrue(Integer.toString(extractor.getTimeStamp()), + extractor.getTimeStamp() <= 0); + } + + @Test + public void testGetValidTimeStamp() throws ExtractionException, IOException { + StreamExtractor extractor = + NewPipe.getService("Youtube") + .getStreamExtractorInstance("https://youtu.be/FmG385_uUys?t=174"); + assertTrue(Integer.toString(extractor.getTimeStamp()), + extractor.getTimeStamp() == 174); + } + + @Test + public void testGetTitle() throws ParsingException { + assertTrue(!extractor.getTitle().isEmpty()); + } + + @Test + public void testGetDescription() throws ParsingException { + assertTrue(extractor.getDescription() != null); + } + + @Test + public void testGetUploader() throws ParsingException { + assertTrue(!extractor.getUploader().isEmpty()); + } + + @Test + public void testGetLength() throws ParsingException { + assertTrue(extractor.getLength() > 0); + } + + @Test + public void testGetViewCount() throws ParsingException { + assertTrue(Long.toString(extractor.getViewCount()), + extractor.getViewCount() > /* specific to that video */ 1224000074); + } + + @Test + public void testGetUploadDate() throws ParsingException { + assertTrue(extractor.getUploadDate().length() > 0); + } + + @Test + public void testGetChannelUrl() throws ParsingException { + assertTrue(extractor.getChannelUrl().length() > 0); + } + + @Test + public void testGetThumbnailUrl() throws ParsingException { + assertTrue(extractor.getThumbnailUrl(), + extractor.getThumbnailUrl().contains(HTTPS)); + } + + @Test + public void testGetUploaderThumbnailUrl() throws ParsingException { + assertTrue(extractor.getUploaderThumbnailUrl(), + extractor.getUploaderThumbnailUrl().contains(HTTPS)); + } + + @Test + public void testGetAudioStreams() throws ParsingException, ReCaptchaException, IOException { + assertTrue(!extractor.getAudioStreams().isEmpty()); + } + + @Test + public void testGetVideoStreams() throws ParsingException { + for(VideoStream s : extractor.getVideoStreams()) { + assertTrue(s.url, + s.url.contains(HTTPS)); + assertTrue(s.resolution.length() > 0); + assertTrue(Integer.toString(s.format), + 0 <= s.format && s.format <= 4); + } + } + + @Test + public void testStreamType() throws ParsingException { + assertTrue(extractor.getStreamType() == StreamType.VIDEO_STREAM); + } + + @Test + public void testGetDashMpd() throws ParsingException { + assertTrue(extractor.getDashMpdUrl(), + extractor.getDashMpdUrl() != null || !extractor.getDashMpdUrl().isEmpty()); + } +} diff --git a/src/test/java/org/schabi/newpipe/extractor/services/youtube/youtube/YoutubeStreamExtractorGemaTest.java b/src/test/java/org/schabi/newpipe/extractor/services/youtube/youtube/YoutubeStreamExtractorGemaTest.java new file mode 100644 index 000000000..dc4bb09f9 --- /dev/null +++ b/src/test/java/org/schabi/newpipe/extractor/services/youtube/youtube/YoutubeStreamExtractorGemaTest.java @@ -0,0 +1,55 @@ +package org.schabi.newpipe.extractor.services.youtube.youtube; + +import static junit.framework.Assert.assertTrue; + +import java.io.IOException; + +import org.junit.Test; +import org.schabi.newpipe.Downloader; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.services.youtube.YoutubeStreamExtractor; + +/** + * Created by Christian Schabesberger on 30.12.15. + * + * Copyright (C) Christian Schabesberger 2015 + * YoutubeVideoExtractorGema.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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * NewPipe is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with NewPipe. If not, see . + */ + + +// This class only works in Germany. +/** + * Test for {@link YoutubeStreamExtractor} + */ +public class YoutubeStreamExtractorGemaTest { + + // Deaktivate this Test Case bevore uploading it githup, otherwise CI will fail. + private static final boolean testActive = false; + + @Test + public void testGemaError() throws IOException, ExtractionException { + if(testActive) { + try { + NewPipe.init(Downloader.getInstance()); + NewPipe.getService("Youtube") + .getStreamExtractorInstance("https://www.youtube.com/watch?v=3O1_3zBUKM8"); + } catch(YoutubeStreamExtractor.GemaException ge) { + assertTrue(true); + } + } + } +} diff --git a/src/test/java/org/schabi/newpipe/extractor/services/youtube/youtube/YoutubeStreamExtractorRestrictedTest.java b/src/test/java/org/schabi/newpipe/extractor/services/youtube/youtube/YoutubeStreamExtractorRestrictedTest.java new file mode 100644 index 000000000..d1874609e --- /dev/null +++ b/src/test/java/org/schabi/newpipe/extractor/services/youtube/youtube/YoutubeStreamExtractorRestrictedTest.java @@ -0,0 +1,108 @@ +package org.schabi.newpipe.extractor.services.youtube.youtube; + +import static junit.framework.Assert.assertTrue; + +import java.io.IOException; + +import org.junit.Before; +import org.junit.Test; +import org.schabi.newpipe.Downloader; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.services.youtube.YoutubeStreamUrlIdHandler; +import org.schabi.newpipe.extractor.stream.StreamExtractor; +import org.schabi.newpipe.extractor.stream.VideoStream; + +/** + * Test for {@link YoutubeStreamUrlIdHandler} + */ +public class YoutubeStreamExtractorRestrictedTest { + public static final String HTTPS = "https://"; + private StreamExtractor extractor; + + @Before + public void setUp() throws Exception { + NewPipe.init(Downloader.getInstance()); + extractor = NewPipe.getService("Youtube") + .getStreamExtractorInstance("https://www.youtube.com/watch?v=i6JTvzrpBy0"); + } + + @Test + public void testGetInvalidTimeStamp() throws ParsingException { + assertTrue(Integer.toString(extractor.getTimeStamp()), + extractor.getTimeStamp() <= 0); + } + + @Test + public void testGetValidTimeStamp() throws ExtractionException, IOException { + StreamExtractor extractor= NewPipe.getService("Youtube") + .getStreamExtractorInstance("https://youtu.be/FmG385_uUys?t=174"); + assertTrue(Integer.toString(extractor.getTimeStamp()), + extractor.getTimeStamp() == 174); + } + + @Test + public void testGetAgeLimit() throws ParsingException { + assertTrue(extractor.getAgeLimit() == 18); + } + + @Test + public void testGetTitle() throws ParsingException { + assertTrue(!extractor.getTitle().isEmpty()); + } + + @Test + public void testGetDescription() throws ParsingException { + assertTrue(extractor.getDescription() != null); + } + + @Test + public void testGetUploader() throws ParsingException { + assertTrue(!extractor.getUploader().isEmpty()); + } + + @Test + public void testGetLength() throws ParsingException { + assertTrue(extractor.getLength() > 0); + } + + @Test + public void testGetViews() throws ParsingException { + assertTrue(extractor.getLength() > 0); + } + + @Test + public void testGetUploadDate() throws ParsingException { + assertTrue(extractor.getUploadDate().length() > 0); + } + + @Test + public void testGetThumbnailUrl() throws ParsingException { + assertTrue(extractor.getThumbnailUrl(), + extractor.getThumbnailUrl().contains(HTTPS)); + } + + @Test + public void testGetUploaderThumbnailUrl() throws ParsingException { + assertTrue(extractor.getUploaderThumbnailUrl(), + extractor.getUploaderThumbnailUrl().contains(HTTPS)); + } + + @Test + public void testGetAudioStreams() throws ParsingException { + // audiostream not always necessary + //assertTrue(!extractor.getAudioStreams().isEmpty()); + } + + @Test + public void testGetVideoStreams() throws ParsingException { + for(VideoStream s : extractor.getVideoStreams()) { + assertTrue(s.url, + s.url.contains(HTTPS)); + assertTrue(s.resolution.length() > 0); + assertTrue(Integer.toString(s.format), + 0 <= s.format && s.format <= 4); + } + } +} diff --git a/src/test/java/org/schabi/newpipe/extractor/services/youtube/youtube/YoutubeStreamUrlIdHandlerTest.java b/src/test/java/org/schabi/newpipe/extractor/services/youtube/youtube/YoutubeStreamUrlIdHandlerTest.java new file mode 100644 index 000000000..e441af91f --- /dev/null +++ b/src/test/java/org/schabi/newpipe/extractor/services/youtube/youtube/YoutubeStreamUrlIdHandlerTest.java @@ -0,0 +1,119 @@ +package org.schabi.newpipe.extractor.services.youtube.youtube; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.fail; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; +import org.schabi.newpipe.Downloader; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.exceptions.FoundAdException; +import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.services.youtube.YoutubeStreamUrlIdHandler; + +/** + * Test for {@link YoutubeStreamUrlIdHandler} + */ +public class YoutubeStreamUrlIdHandlerTest { + private static String AD_URL = "https://googleads.g.doubleclick.net/aclk?sa=l&ai=C-2IPgeVTWPf4GcOStgfOnIOADf78n61GvKmmobYDrgIQASDj-5MDKAJg9ZXOgeAEoAGgy_T-A8gBAakC2gkpmquIsT6oAwGqBJMBT9BgD5kVgbN0dX602bFFaDw9vsxq-We-S8VkrXVBi6W_e7brZ36GCz1WO3EPEeklYuJjXLUowwCOKsd-8xr1UlS_tusuFJv9iX35xoBHKTRvs8-0aDbfEIm6in37QDfFuZjqgEMB8-tg0Jn_Pf1RU5OzbuU40B4Gy25NUTnOxhDKthOhKBUSZEksCEerUV8GMu10iAXCxquwApIFBggDEAEYAaAGGsgGlIjthrUDgAfItIsBqAemvhvYBwHSCAUIgGEQAbgT6AE&num=1&sig=AOD64_1DybDd4qAm5O7o9UAbTNRdqXXHFQ&ctype=21&video_id=dMO_IXYPZew&client=ca-pub-6219811747049371&adurl=http://www.youtube.com/watch%3Fv%3DdMO_IXYPZew"; + private YoutubeStreamUrlIdHandler urlIdHandler; + + @Before + public void setUp() throws Exception { + urlIdHandler = YoutubeStreamUrlIdHandler.getInstance(); + NewPipe.init(Downloader.getInstance()); + } + + @Test(expected = NullPointerException.class) + public void getIdWithNullAsUrl() throws ParsingException { + urlIdHandler.getId(null); + } + + @Test(expected = FoundAdException.class) + public void getIdForAd() throws ParsingException { + urlIdHandler.getId(AD_URL); + } + + @Test + public void getIdForInvalidUrls() throws ParsingException { + List invalidUrls = new ArrayList<>(50); + invalidUrls.add("https://www.youtube.com/watch?v=jZViOEv90d"); + invalidUrls.add("https://www.youtube.com/watchjZViOEv90d"); + invalidUrls.add("https://www.youtube.com/"); + for(String invalidUrl: invalidUrls) { + Throwable exception = null; + try { + urlIdHandler.getId(invalidUrl); + } catch (ParsingException e) { + exception = e; + } + if(exception == null) { + fail("Expected ParsingException for url: " + invalidUrl); + } + } + } + @Test + public void getId() throws Exception { + assertEquals("jZViOEv90dI", urlIdHandler.getId("https://www.youtube.com/watch?v=jZViOEv90dI")); + assertEquals("W-fFHeTX70Q", urlIdHandler.getId("https://www.youtube.com/watch?v=W-fFHeTX70Q")); + assertEquals("jZViOEv90dI", urlIdHandler.getId("https://www.youtube.com/watch?v=jZViOEv90dI?t=100")); + assertEquals("jZViOEv90dI", urlIdHandler.getId("https://WWW.YouTube.com/watch?v=jZViOEv90dI?t=100")); + assertEquals("jZViOEv90dI", urlIdHandler.getId("HTTPS://www.youtube.com/watch?v=jZViOEv90dI?t=100")); + assertEquals("jZViOEv90dI", urlIdHandler.getId("https://youtu.be/jZViOEv90dI?t=9s")); + assertEquals("jZViOEv90dI", urlIdHandler.getId("HTTPS://Youtu.be/jZViOEv90dI?t=9s")); + assertEquals("uEJuoEs1UxY", urlIdHandler.getId("http://www.youtube.com/watch_popup?v=uEJuoEs1UxY")); + assertEquals("uEJuoEs1UxY", urlIdHandler.getId("http://www.Youtube.com/watch_popup?v=uEJuoEs1UxY")); + assertEquals("jZViOEv90dI", urlIdHandler.getId("https://www.youtube.com/embed/jZViOEv90dI")); + assertEquals("jZViOEv90dI", urlIdHandler.getId("https://www.youtube-nocookie.com/embed/jZViOEv90dI")); + assertEquals("jZViOEv90dI", urlIdHandler.getId("http://www.youtube.com/watch?v=jZViOEv90dI")); + assertEquals("jZViOEv90dI", urlIdHandler.getId("http://youtube.com/watch?v=jZViOEv90dI")); + assertEquals("jZViOEv90dI", urlIdHandler.getId("http://youtu.be/jZViOEv90dI?t=9s")); + assertEquals("7_WWz2DSnT8", urlIdHandler.getId("https://youtu.be/7_WWz2DSnT8")); + assertEquals("oy6NvWeVruY", urlIdHandler.getId("https://m.youtube.com/watch?v=oy6NvWeVruY")); + assertEquals("jZViOEv90dI", urlIdHandler.getId("http://www.youtube.com/embed/jZViOEv90dI")); + assertEquals("jZViOEv90dI", urlIdHandler.getId("http://www.Youtube.com/embed/jZViOEv90dI")); + assertEquals("jZViOEv90dI", urlIdHandler.getId("http://www.youtube-nocookie.com/embed/jZViOEv90dI")); + assertEquals("EhxJLojIE_o", urlIdHandler.getId("http://www.youtube.com/attribution_link?a=JdfC0C9V6ZI&u=%2Fwatch%3Fv%3DEhxJLojIE_o%26feature%3Dshare")); + assertEquals("jZViOEv90dI", urlIdHandler.getId("vnd.youtube://www.youtube.com/watch?v=jZViOEv90dI")); + assertEquals("jZViOEv90dI", urlIdHandler.getId("vnd.youtube:jZViOEv90dI")); + + // Shared links + String sharedId = "7JIArTByb3E"; + String realId = "Q7JsK50NGaA"; + assertEquals(realId, urlIdHandler.getId("vnd.youtube://www.YouTube.com/shared?ci=" + sharedId + "&feature=twitter-deep-link")); + assertEquals(realId, urlIdHandler.getId("vnd.youtube://www.youtube.com/shared?ci=" + sharedId )); + assertEquals(realId, urlIdHandler.getId("https://www.youtube.com/shared?ci=7JIArTByb3E")); + + } + + + @Test + public void testAcceptUrl() { + assertTrue(urlIdHandler.acceptUrl("https://www.youtube.com/watch?v=jZViOEv90dI")); + assertTrue(urlIdHandler.acceptUrl("https://www.youtube.com/watch?v=jZViOEv90dI?t=100")); + assertTrue(urlIdHandler.acceptUrl("https://WWW.YouTube.com/watch?v=jZViOEv90dI?t=100")); + assertTrue(urlIdHandler.acceptUrl("HTTPS://www.youtube.com/watch?v=jZViOEv90dI?t=100")); + assertTrue(urlIdHandler.acceptUrl("https://youtu.be/jZViOEv90dI?t=9s")); + //assertTrue(urlIdHandler.acceptUrl("https://www.youtube.com/watch/jZViOEv90dI")); + assertTrue(urlIdHandler.acceptUrl("https://www.youtube.com/embed/jZViOEv90dI")); + assertTrue(urlIdHandler.acceptUrl("https://www.youtube-nocookie.com/embed/jZViOEv90dI")); + assertTrue(urlIdHandler.acceptUrl("http://www.youtube.com/watch?v=jZViOEv90dI")); + assertTrue(urlIdHandler.acceptUrl("http://youtu.be/jZViOEv90dI?t=9s")); + assertTrue(urlIdHandler.acceptUrl("http://www.youtube.com/embed/jZViOEv90dI")); + assertTrue(urlIdHandler.acceptUrl("http://www.youtube-nocookie.com/embed/jZViOEv90dI")); + assertTrue(urlIdHandler.acceptUrl("http://www.youtube.com/attribution_link?a=JdfC0C9V6ZI&u=%2Fwatch%3Fv%3DEhxJLojIE_o%26feature%3Dshare")); + assertTrue(urlIdHandler.acceptUrl("vnd.youtube://www.youtube.com/watch?v=jZViOEv90dI")); + assertTrue(urlIdHandler.acceptUrl("vnd.youtube:jZViOEv90dI")); + + assertTrue(urlIdHandler.acceptUrl("vnd.youtube:jZViOEv90dI")); + + String sharedId = "8A940MXKFmQ"; + assertTrue(urlIdHandler.acceptUrl("vnd.youtube://www.youtube.com/shared?ci=" + sharedId + "&feature=twitter-deep-link")); + assertTrue(urlIdHandler.acceptUrl("vnd.youtube://www.youtube.com/shared?ci=" + sharedId )); + assertTrue(urlIdHandler.acceptUrl("https://www.youtube.com/shared?ci=" + sharedId)); + } +} \ No newline at end of file