first commit

This commit is contained in:
2020-11-08 00:33:12 +01:00
commit d9f16ec5c3
10 changed files with 794 additions and 0 deletions

152
.gitignore vendored Normal file
View File

@@ -0,0 +1,152 @@
# Created by https://www.toptal.com/developers/gitignore/api/gradle,java,intellij
# Edit at https://www.toptal.com/developers/gitignore?templates=gradle,java,intellij
### Intellij ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
### Intellij Patch ###
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
# *.iml
# modules.xml
# .idea/misc.xml
# *.ipr
# Sonarlint plugin
# https://plugins.jetbrains.com/plugin/7973-sonarlint
.idea/**/sonarlint/
# SonarQube Plugin
# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin
.idea/**/sonarIssues.xml
# Markdown Navigator plugin
# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced
.idea/**/markdown-navigator.xml
.idea/**/markdown-navigator-enh.xml
.idea/**/markdown-navigator/
# Cache file creation bug
# See https://youtrack.jetbrains.com/issue/JBR-2257
.idea/$CACHE_FILE$
# CodeStream plugin
# https://plugins.jetbrains.com/plugin/12206-codestream
.idea/codestream.xml
### Java ###
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
### Gradle ###
.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
### Gradle Patch ###
**/build/
# End of https://www.toptal.com/developers/gitignore/api/gradle,java,intellij

38
build.gradle Normal file
View File

@@ -0,0 +1,38 @@
plugins {
id 'java'
}
group 'de.epsilon02'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
maven { url 'https://jitpack.io' }
}
jar {
manifest {
attributes(
'Main-Class': 'de.epsilon02.SimpleCLIMusicPlayer'
)
}
}
task fatJar(type: Jar) {
manifest {
attributes 'Implementation-Title': 'Simple CLI Music Player',
'Implementation-Version': getArchiveVersion(),
'Main-Class': 'de.epsilon02.SimpleCLIMusicPlayer'
}
setArchivesBaseName(project.name + '-all')
from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
with jar
}
dependencies {
compile group: 'javax.annotation', name: 'javax.annotation-api', version: '1.3.2'
compile group: 'com.squareup.okhttp3', name: 'okhttp', version: '4.9.0'
compile group: 'com.beust', name: 'jcommander', version: '1.78'
implementation 'com.github.TeamNewPipe:NewPipeExtractor:v0.20.2'
testCompile group: 'junit', name: 'junit', version: '4.12'
}

4
gradle.properties.bak Normal file
View File

@@ -0,0 +1,4 @@
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.configureondemand=true
org.gradle.jvmargs=-Xmx3g -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

183
gradlew vendored Executable file
View File

@@ -0,0 +1,183 @@
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
## 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='"-Xmx64m" "-Xms64m"'
# 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 or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; 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=`expr $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"
exec "$JAVACMD" "$@"

100
gradlew.bat vendored Normal file
View File

@@ -0,0 +1,100 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@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="-Xmx64m" "-Xms64m"
@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

3
settings.gradle Normal file
View File

@@ -0,0 +1,3 @@
rootProject.name = 'NewPipeTest'

View File

@@ -0,0 +1,36 @@
package de.epsilon02;
import com.beust.jcommander.Parameter;
import java.util.ArrayList;
import java.util.List;
public class DefinedArgs {
@Parameter
private List<String> parameter = new ArrayList<>();
@Parameter(names = {"s", "search"}, description = "Searches for YouTube-Videos and return a list of results")
private String query;
@Parameter(names = {"c", "convert"}, description = "Converts a YouTube-URL, to a sound only stream link")
private String url;
@Parameter(names = {"cv", "convert-video"}, description = "Converts Youtube-URL, to a Video stream link")
private String videoUrl;
public List<String> getParameter() {
return parameter;
}
public String getQuery() {
return query;
}
public String getUrl() {
return url;
}
public String getVideoUrl() {
return videoUrl;
}
}

View File

@@ -0,0 +1,111 @@
package de.epsilon02;
import org.schabi.newpipe.extractor.InfoItem;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.StreamingService;
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
import org.schabi.newpipe.extractor.linkhandler.LinkHandler;
import org.schabi.newpipe.extractor.linkhandler.LinkHandlerFactory;
import org.schabi.newpipe.extractor.services.youtube.YoutubeService;
import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeSearchExtractor;
import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor;
import org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeStreamLinkHandlerFactory;
import org.schabi.newpipe.extractor.stream.AudioStream;
import org.schabi.newpipe.extractor.stream.StreamExtractor;
import org.schabi.newpipe.extractor.stream.VideoStream;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Foo {
private final StreamingService streamingService;
public Foo() {
this.streamingService = new YoutubeService(0);
NewPipe.init(MyDownloader.init(null));
}
public void search(String query) {
try {
YoutubeSearchExtractor youtubeSearchExtractor = (YoutubeSearchExtractor) streamingService
.getSearchExtractor(streamingService.getSearchQHFactory().fromQuery(query));
youtubeSearchExtractor.fetchPage();
List<InfoItem> infoItems = youtubeSearchExtractor.getInitialPage().getItems();
for (int i = 0; i < infoItems.size(); i++) {
System.out.println(i + " " + infoItems.get(i).getName());
}
System.out.print("Select Track: ");
Scanner scanner = new Scanner(System.in);
int userSelection = scanner.nextInt();
// String output = handleLinks(infoItems.get(userSelection).getUrl())
// .stream()
// .map(AudioStream::getUrl)
// .findFirst()
// .orElse("This is a Channel or Playlist");
// System.out.println(output);
handleLinks(infoItems.get(userSelection).getUrl())
.forEach(audioStream -> {
System.out.println(
"MediaFormat: " +
audioStream.
getFormat()
.getName() +
" | Bitrate: " +
audioStream.getAverageBitrate() +
" - " +
audioStream.getUrl());
});
} catch (IOException | ExtractionException e) {
e.printStackTrace();
}
}
public void convertUrl(String url) {
try {
handleLinks(url)
.forEach(audioStream -> {
System.out.println(
"MediaFormat: " +
audioStream.
getFormat()
.getName() +
" | Bitrate: " +
audioStream.getAverageBitrate() +
" - " +
audioStream.getUrl());
});
} catch (IOException | ExtractionException e) {
e.printStackTrace();
}
}
private List<AudioStream> handleLinks(String url) throws IOException, ExtractionException {
if (!(url.contains("playlist") || url.contains("channel"))) {
LinkHandlerFactory factory = YoutubeStreamLinkHandlerFactory.getInstance();
LinkHandler linkHandler = factory.fromUrl(url);
StreamExtractor streamExtractor = new YoutubeStreamExtractor(streamingService, linkHandler);
streamExtractor.fetchPage();
return streamExtractor.getAudioStreams();
}
return Collections.emptyList();
}
public List<VideoStream> getVideoStream(String url) {
if (!(url.contains("playlist") || url.contains("channel"))) {
try {
LinkHandlerFactory factory = YoutubeStreamLinkHandlerFactory.getInstance();
LinkHandler linkHandler = factory.fromUrl(url);
StreamExtractor streamExtractor = new YoutubeStreamExtractor(streamingService, linkHandler);
streamExtractor.fetchPage();
return streamExtractor.getVideoStreams();
} catch (IOException | ExtractionException e) {
e.printStackTrace();
}
}
return Collections.emptyList();
}
}

View File

@@ -0,0 +1,132 @@
package de.epsilon02;
import okhttp3.OkHttpClient;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.schabi.newpipe.extractor.downloader.Downloader;
import org.schabi.newpipe.extractor.downloader.Request;
import org.schabi.newpipe.extractor.downloader.Response;
import org.schabi.newpipe.extractor.exceptions.ReCaptchaException;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
public final class MyDownloader extends Downloader {
public static final String USER_AGENT
= "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0";
// public static final String YOUTUBE_RESTRICTED_MODE_COOKIE_KEY
// = "youtube_restricted_mode_key";
// public static final String YOUTUBE_RESTRICTED_MODE_COOKIE = "PREF=f2=8000000";
// public static final String YOUTUBE_DOMAIN = "youtube.com";
private static MyDownloader instance;
// private Map<String, String> mCookies;
private final OkHttpClient client;
private MyDownloader(final OkHttpClient.Builder builder) {
this.client = builder
.readTimeout(30, TimeUnit.SECONDS)
// .cache(new Cache(new File(context.getExternalCacheDir(), "okhttp"),
// 16 * 1024 * 1024))
.build();
// this.mCookies = new HashMap<>();
}
public static MyDownloader init(@Nullable final OkHttpClient.Builder builder) {
instance = new MyDownloader(
builder != null ? builder : new OkHttpClient.Builder());
return instance;
}
public static MyDownloader getInstance() {
return instance;
}
// public String getCookies(final String url) {
// final List<String> resultCookies = new ArrayList<>();
// if (url.contains(YOUTUBE_DOMAIN)) {
// final String youtubeCookie = getCookie(YOUTUBE_RESTRICTED_MODE_COOKIE_KEY);
// if (youtubeCookie != null) {
// resultCookies.add(youtubeCookie);
// }
// }
// // Recaptcha cookie is always added TODO: not sure if this is necessary
// final String recaptchaCookie = getCookie(ReCaptchaActivity.RECAPTCHA_COOKIES_KEY);
// if (recaptchaCookie != null) {
// resultCookies.add(recaptchaCookie);
// }
// return CookieUtils.concatCookies(resultCookies);
// }
// public String getCookie(final String key) {
// return mCookies.get(key);
// }
//
// public void setCookie(final String key, final String cookie) {
// mCookies.put(key, cookie);
// }
//
// public void removeCookie(final String key) {
// mCookies.remove(key);
// }
@Override
public Response execute(@NotNull Request request) throws IOException, ReCaptchaException {
final String httpMethod = request.httpMethod();
final String url = request.url();
final Map<String, List<String>> headers = request.headers();
final byte[] dataToSend = request.dataToSend();
RequestBody requestBody = null;
if (dataToSend != null) {
requestBody = RequestBody.create(dataToSend);
}
final okhttp3.Request.Builder requestBuilder = new okhttp3.Request.Builder()
.method(httpMethod, requestBody).url(url)
.addHeader("User-Agent", USER_AGENT);
// final String cookies = getCookies(url);
// if (!cookies.isEmpty()) {
// requestBuilder.addHeader("Cookie", cookies);
// }
for (final Map.Entry<String, List<String>> pair : headers.entrySet()) {
final String headerName = pair.getKey();
final List<String> headerValueList = pair.getValue();
if (headerValueList.size() > 1) {
requestBuilder.removeHeader(headerName);
for (final String headerValue : headerValueList) {
requestBuilder.addHeader(headerName, headerValue);
}
} else if (headerValueList.size() == 1) {
requestBuilder.header(headerName, headerValueList.get(0));
}
}
final okhttp3.Response response = client.newCall(requestBuilder.build()).execute();
if (response.code() == 429) {
response.close();
throw new ReCaptchaException("reCaptcha Challenge requested", url);
}
final ResponseBody body = response.body();
String responseBodyToReturn = null;
if (body != null) {
responseBodyToReturn = body.string();
}
final String latestUrl = response.request().url().toString();
return new Response(response.code(), response.message(), response.headers().toMultimap(),
responseBodyToReturn, latestUrl);
}
}

View File

@@ -0,0 +1,35 @@
package de.epsilon02;
import com.beust.jcommander.JCommander;
import org.schabi.newpipe.extractor.stream.VideoStream;
public class SimpleCLIMusicPlayer {
public static void main(String[] args) {
// Pandomium pandomium = new Pandomium(PandomiumSettings.getDefaultSettings());
// pandomium.initialize();
//
// PandomiumClient client = pandomium.createClient();
// PandomiumBrowser browser = client.loadURL("https://panda-lang.org");
DefinedArgs definedArgs = new DefinedArgs();
JCommander jCommander = JCommander.newBuilder()
.addObject(definedArgs)
.build();
jCommander.parse(args);
Foo foo = new Foo();
if (definedArgs.getQuery() != null) {
foo.search(definedArgs.getQuery());
} else if (definedArgs.getUrl() != null) {
foo.convertUrl(definedArgs.getUrl());
} else if (definedArgs.getVideoUrl() != null) {
foo.getVideoStream(definedArgs.getVideoUrl()).forEach(videoStream -> {
System.out.println(videoStream.getResolution() + " - " + videoStream.getUrl());
});
} else {
jCommander.usage();
}
}
}