From 8825ff2117a8269d4cc7de0c067be90c1497ee9c Mon Sep 17 00:00:00 2001 From: Pierre Rudloff Date: Sat, 5 Jul 2014 12:45:24 +0200 Subject: [PATCH 1/2] Config in a separate file (fixes #2 and fixes #3) --- api.php | 1 - config.php | 17 +++++++++++++++++ download.php | 25 +++++++++++-------------- json.php | 14 ++++++++++++-- 4 files changed, 40 insertions(+), 17 deletions(-) create mode 100644 config.php diff --git a/api.php b/api.php index 3b233b1..2a36a27 100644 --- a/api.php +++ b/api.php @@ -10,7 +10,6 @@ * @license GNU General Public License http://www.gnu.org/licenses/gpl.html * @link http://rudloff.pro * */ -$python="/usr/bin/python"; require_once 'download.php'; if (isset($_GET["url"])) { if (isset($_GET["format"]) || isset($_GET['audio'])) { diff --git a/config.php b/config.php new file mode 100644 index 0000000..0249c03 --- /dev/null +++ b/config.php @@ -0,0 +1,17 @@ + + * @license GNU General Public License http://www.gnu.org/licenses/gpl.html + * @link http://rudloff.pro + * */ +define('YOUTUBE_DL', './youtube-dl'); +define('PYTHON', '/usr/bin/python'); +define('PARAMS', '--no-playlist --no-warnings'); +?> diff --git a/download.php b/download.php index ab2f177..746c229 100644 --- a/download.php +++ b/download.php @@ -11,7 +11,7 @@ * @license GNU General Public License http://www.gnu.org/licenses/gpl.html * @link http://rudloff.pro * */ - +require_once 'config.php'; /** * PHP web interface for youtube-dl (http://rg3.github.com/youtube-dl/) * Main class @@ -26,9 +26,6 @@ * */ Class VideoDownload { - static private $_python="/usr/bin/python"; - static private $_params="--no-playlist"; - /** * Get version of youtube-dl * @@ -37,7 +34,7 @@ Class VideoDownload function getVersion () { exec( - VideoDownload::$_python.' youtube-dl --version', + PYTHON.' '.YOUTUBE_DL.' --version', $version, $code ); return $version[0]; @@ -50,7 +47,7 @@ Class VideoDownload function getUA () { exec( - VideoDownload::$_python.' youtube-dl --dump-user-agent', + PYTHON.' '.YOUTUBE_DL.' --dump-user-agent', $version, $code ); return $version[0]; @@ -64,7 +61,7 @@ Class VideoDownload function listExtractors () { exec( - VideoDownload::$_python.' youtube-dl --list-extractors', + PYTHON.' '.YOUTUBE_DL.' --list-extractors', $extractors, $code ); return $extractors; @@ -80,7 +77,7 @@ Class VideoDownload * */ function getFilename ($url, $format=null) { - $cmd=VideoDownload::$_python.' youtube-dl'; + $cmd=PYTHON.' youtube-dl'; if (isset($format)) { $cmd .= ' -f '.escapeshellarg($format); } @@ -102,7 +99,7 @@ Class VideoDownload function getTitle ($url) { exec( - VideoDownload::$_python.' youtube-dl --get-title '. + PYTHON.' '.YOUTUBE_DL.' --get-title '. escapeshellarg($url), $title ); @@ -120,11 +117,11 @@ Class VideoDownload * */ function getJSON ($url, $format=null) { - $cmd=VideoDownload::$_python.' youtube-dl '.VideoDownload::$_params; + $cmd=PYTHON.' '.YOUTUBE_DL.' '.PARAMS; if (isset($format)) { $cmd .= ' -f '.escapeshellarg($format); } - $cmd .=' --no-warnings --dump-json '.escapeshellarg($url)." 2>&1"; + $cmd .=' --dump-json '.escapeshellarg($url)." 2>&1"; exec( $cmd, $json, $code @@ -146,7 +143,7 @@ Class VideoDownload function getThumbnail ($url) { exec( - VideoDownload::$_python.' youtube-dl --get-thumbnail '. + PYTHON.' '.YOUTUBE_DL.' --get-thumbnail '. escapeshellarg($url), $thumb ); @@ -165,7 +162,7 @@ Class VideoDownload function getAvailableFormats ($url) { exec( - VideoDownload::$_python.' youtube-dl -F '. + PYTHON.' '.YOUTUBE_DL.' -F '. escapeshellarg($url), $formats ); @@ -195,7 +192,7 @@ Class VideoDownload * */ function getURL ($url, $format=null) { - $cmd=VideoDownload::$_python.' youtube-dl'; + $cmd=PYTHON.' '.YOUTUBE_DL; if (isset($format)) { $cmd .= ' -f '.escapeshellarg($format); } diff --git a/json.php b/json.php index 36e1617..fd81816 100644 --- a/json.php +++ b/json.php @@ -1,6 +1,16 @@ + * @license GNU General Public License http://www.gnu.org/licenses/gpl.html + * @link http://rudloff.pro + * */ require_once 'download.php'; if (isset($_GET["url"])) { header('Content-Type: application/json'); From f3adad05400fc9767c35a5cfd3037461eda8e13b Mon Sep 17 00:00:00 2001 From: Pierre Rudloff Date: Sat, 30 Aug 2014 22:28:09 +0200 Subject: [PATCH 2/2] Bigger logo --- img/logo_250.png | Bin 0 -> 12717 bytes manifest.webapp | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 img/logo_250.png diff --git a/img/logo_250.png b/img/logo_250.png new file mode 100644 index 0000000000000000000000000000000000000000..c509c569380f14372762b2213fd192e764a6d87d GIT binary patch literal 12717 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 gm*a=`?j4>O%`=O7alc;Rj}@S|iW;vg6+Q<24