diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml old mode 100755 new mode 100644 index db6eae446..45de27445 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -18,20 +18,20 @@ jobs: steps: - name: Login to DockerHub - uses: docker/login-action@v1 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Extract metadata (tags, labels) for Docker id: meta - uses: docker/metadata-action@v3.6.2 + uses: docker/metadata-action@v5 with: images: ${{ secrets.DOCKERHUB_IMAGE }} - name: Build and push id: docker_build - uses: docker/build-push-action@v2 + uses: docker/build-push-action@v6 with: push: true tags: ${{ steps.meta.outputs.tags }} diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml new file mode 100644 index 000000000..4dacc19b6 --- /dev/null +++ b/.github/workflows/validate.yml @@ -0,0 +1,45 @@ +name: Validate/Lint + +on: [push, pull_request] + +permissions: + contents: read + +jobs: + build: + runs-on: ${{ matrix.operating-system }} + + strategy: + matrix: + operating-system: [ubuntu-latest] + php-versions: ['8.0', '8.1', '8.2', '8.3', '8.4'] + name: PHP ${{ matrix.php-versions }} on ${{ matrix.operating-system }} + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-versions }} + extensions: pcre + + - name: Lint + run: | + lintPaths=() + lintPaths+=("${GITHUB_WORKSPACE}") + for lintPath in "${lintPaths[@]}" + do + for file in `find "$lintPath"` + do + EXTENSION="${file##*.}" + if [ "$EXTENSION" == "php" ] || [ "$EXTENSION" == "phtml" ] + then + RESULTS=`php -l "$file"` + if [ "$RESULTS" != "No syntax errors detected in $file" ] + then + echo $RESULTS + fi + fi + done + done diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 index 41cf12626..f717db120 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ /videos/ /.project /node_modules/ +install/importVimeo.php +test.php diff --git a/.htaccess b/.htaccess old mode 100755 new mode 100644 index 4a5375fb8..19cb66d31 --- a/.htaccess +++ b/.htaccess @@ -34,7 +34,7 @@ Options -Indexes RewriteRule ^logoff$ objects/logoff.json.php [NC,L] RewriteRule ^getImage/([A-Za-z0-9=/]+)/([A-Za-z0-9]{3})$ objects/getImage.php?base64Url=$1&format=$2 [NC,L] RewriteRule ^getImageMP4/([A-Za-z0-9=/]+)/([A-Za-z0-9]{3,4})/([0-9.]+)$ objects/getImageMP4.php?base64Url=$1&format=$2&time=$3 [NC,L] - RewriteRule ^getSpiritsFromVideo/([A-Za-z0-9%=/]+)/([0-9]+)/([0-9]+)/([0-9:]+)? objects/getSpiritsFromVideo.php?base64Url=$1&tileWidth=$2&totalClips=$3&duration=$4 [NC,L] + RewriteRule ^getSpiritsFromVideo/([A-Za-z0-9%=/]+)/([0-9]+)/([0-9]+)/([0-9:]+)? objects/getSpiritsFromVideo.php?base64Url=$1&tileWidth=$2&totalClips=$3&duration=$4 [QSA] RewriteRule ^getLinkInfo/([A-Za-z0-9=/]+)$ objects/getLinkInfo.json.php?base64Url=$1 [NC,L] diff --git a/API/API.php b/API/API.php new file mode 100644 index 000000000..dbebeed8a --- /dev/null +++ b/API/API.php @@ -0,0 +1,95 @@ +error = true; + $object->msg = ''; + $object->login = new stdClass(); + $object->login->user = @$_REQUEST['user']; + $object->login->siteURL = @$_REQUEST['siteURL']; + if (empty($object->login->user) || empty($_REQUEST['pass'])) { + $object->msg = 'User and Password can not be blank'; + die(json_encode($object)); + } + if (!Streamer::isURLAllowed($object->login->siteURL)) { + $object->msg = 'This streamer site is not allowed'; + die(json_encode($object)); + } + error_log('login.json: Login::run'); + Login::run($object->login->user, $_REQUEST['pass'], $object->login->siteURL, @$_REQUEST['encodedPass']); + if (!empty($_SESSION['login'])) { + $object->login->streamers_id = intval($_SESSION['login']->streamers_id); + } else { + $object->msg = 'Your site is banned'; + die(json_encode($object)); + } + return $object; + } + + static function canChangeQueue($queue_id) + { + if (empty($_SESSION['login'])) { + return false; + } + $streamer = new Streamer($_SESSION['login']->streamers_id); + if (self::isAdmin()) { + return true; + } + $encoder = new Encoder($queue_id); + return $encoder->getStreamers_id() == $_SESSION['login']->streamers_id; + } + + static function isAdmin() + { + if (empty($_SESSION['login'])) { + return false; + } + $streamer = new Streamer($_SESSION['login']->streamers_id); + return !empty($streamer->getIsAdmin()); + } + + static function cleanQueueArray($queue) + { + // Convert object to array if necessary + if (is_object($queue)) { + $queue = (array)$queue; + } + + // Set videos_id + if (isset($queue['return_vars']->videos_id)) { + $queue['videos_id'] = $queue['return_vars']->videos_id; + } + + $keep = array( + 'id', + 'created', + 'modified', + 'videos_id', + 'priority', + 'videoDownloadedLink', + 'downloadedFileName', + 'streamers_id', + 'conversion', + 'download', + 'title', + ); + + // Clean the queue + foreach ($queue as $key => $value) { + if (!in_array($key, $keep)) { + unset($queue[$key]); + } + } + + return $queue; + } +} diff --git a/API/delete_queue.php b/API/delete_queue.php new file mode 100644 index 000000000..4e944869a --- /dev/null +++ b/API/delete_queue.php @@ -0,0 +1,28 @@ +msg = 'queue_id is empty'; + die(json_encode($object)); +} + +if(!API::canChangeQueue($_REQUEST['queue_id'])){ + $object->msg = 'You cannot change the queue'; + die(json_encode($object)); +} + +$object->queue_id = intval($_REQUEST['queue_id']); +$encoder = new Encoder($object->queue_id); + +$object->error = !$encoder->delete(); + +die(json_encode($object)); \ No newline at end of file diff --git a/API/edit_queue.php b/API/edit_queue.php new file mode 100644 index 000000000..4f8f6d5de --- /dev/null +++ b/API/edit_queue.php @@ -0,0 +1,29 @@ +msg = 'queue_id is empty'; + die(json_encode($object)); +} + +if(!isset($_REQUEST['priority'])){ + $object->msg = 'priority is not set'; + die(json_encode($object)); +} + +if(!API::isAdmin()){ + $object->msg = 'Only encoder admin can change priority'; + die(json_encode($object)); +} + +$object->queue_id = intval($_REQUEST['queue_id']); +$encoder = new Encoder($object->queue_id); +$encoder->setPriority($_REQUEST['priority']); +$object->error = !$encoder->save(); + +die(json_encode($object)); \ No newline at end of file diff --git a/API/get_queue_status.php b/API/get_queue_status.php new file mode 100644 index 000000000..69bf6a9b6 --- /dev/null +++ b/API/get_queue_status.php @@ -0,0 +1,51 @@ +queue = Encoder::getQueue($status, $object->login->streamers_id); +$object->error = false; + +if(!empty($_REQUEST['videos_id'])){ + $object->videos_id = intval($_REQUEST['videos_id']); + foreach ($object->queue as $key => $value) { + if($value['return_vars']->videos_id !== $object->videos_id){ + unset($object->queue[$key]); + } + } +} + +foreach ($object->queue as $key => $value) { + $object->queue[$key]['conversion'] = Encoder::getVideoConversionStatus($value['id']); + $object->queue[$key]['download'] = Encoder::getYoutubeDlProgress($value['id']); + + if(empty($object->queue[$key]['conversion'])){ + $object->queue[$key]['conversion'] = null; + } + + if(empty($object->queue[$key]['download'])){ + $object->queue[$key]['download'] = null; + } + + $object->queue[$key] = API::cleanQueueArray($object->queue[$key]); +} + +die(json_encode($object)); \ No newline at end of file diff --git a/API/index.php b/API/index.php new file mode 100644 index 000000000..e69de29bb diff --git a/API/restart_queue.php b/API/restart_queue.php new file mode 100644 index 000000000..e13fd4d17 --- /dev/null +++ b/API/restart_queue.php @@ -0,0 +1,26 @@ +msg = 'queue_id is empty'; + die(json_encode($object)); +} + +if(!API::canChangeQueue($_REQUEST['queue_id'])){ + $object->msg = 'You cannot change the queue'; + die(json_encode($object)); +} + +$object->queue_id = intval($_REQUEST['queue_id']); +$encoder = new Encoder($object->queue_id); + +$encoder->setStatus(Encoder::STATUS_QUEUE); + +$object->error = !$encoder->save(); + +die(json_encode($object)); \ No newline at end of file diff --git a/API/submit_video.php b/API/submit_video.php new file mode 100644 index 000000000..b715ab8a7 --- /dev/null +++ b/API/submit_video.php @@ -0,0 +1,26 @@ +msg = 'videoURL is required'; + die(json_encode($object)); +} + +$object = API::checkCredentials(); +if (!Login::canUpload()) { + $object->msg = "This user can not upload files"; + die(json_encode($object)); +} + +$object->videoURL = $_REQUEST['videoURL']; +$object->videoTitle = @$_REQUEST['videoTitle']; + +$object->addVideo = addVideo($object->videoURL, $object->login->streamers_id, $object->videoTitle); + +$object->error = !empty($object->addVideo->error); + +die(json_encode($object)); \ No newline at end of file diff --git a/CNAME b/CNAME old mode 100755 new mode 100644 diff --git a/Dockerfile b/Dockerfile old mode 100755 new mode 100644 index ee4d51ec1..5716c46f1 --- a/Dockerfile +++ b/Dockerfile @@ -71,6 +71,7 @@ RUN apt-get install -y --no-install-recommends \ mysqli \ opcache \ pdo_mysql \ + imagemagick \ zip && \ rm -rf \ /tmp/* \ @@ -108,4 +109,4 @@ EXPOSE 80 EXPOSE 443 ENTRYPOINT ["/usr/local/bin/docker-entrypoint"] -HEALTHCHECK --interval=60s --timeout=55s --start-period=1s CMD curl --fail https://localhost/ || exit 1 +HEALTHCHECK --interval=60s --timeout=55s --start-period=1s CMD curl --fail https://localhost/ || exit 1 diff --git a/LICENSE b/LICENSE old mode 100755 new mode 100644 diff --git a/README.md b/README.md old mode 100755 new mode 100644 index a1d9418a1..99165ebf6 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # AVideo - Encoder ### This is the Encoder for AVideo. -AVideo is a video-sharing Platform software, the open source solution that is freely available to everyone. When you download AVideo Platform instance, you can create your own video sharing site, AVideo will help you import and encode videos from other sites like Youtube, Vimeo, etc. and you can share directly on your website. In addition, you can use Facebook or Google login to register users on your site. +AVideo is a video-sharing Platform software, the open source solution that is freely available to everyone. When you download AVideo Platform instance, you can create your own video sharing site, AVideo will help you import and encode videos from other sites like Youtube, Vimeo, etc. and you can share directly on your website. In addition, you can use Facebook or Google login to register users on your site. #### Want to manage multiple encoders? AVideo Encoder Network (Optional) @@ -12,7 +12,7 @@ AVideo is a video-sharing Platform software, the open source solution that is fr * AVideo Platform Flix Style Demo - We provide you a Flix site sample. On this site you can subscribe (with real money on PayPal). this subscription will allow you to watch our private videos. There is an user that you can use to see how it works. user: test and pass: test. * AVideo Platform Tutorials Gallery - - We've provided a sample Video Gallery site, which is also our tutorials site. On this sample you can login, subscribe, like, dislike and comment. but you can not upload videos. + - We've provided a sample Video Gallery site, which is also our tutorials site. On this sample you can login, subscribe, like, dislike and comment. but you can not upload videos. * AVideo Platform Full-Access Demo - We provide you a Demo site sample with full access to the admin account. You will need an admin password to upload and manage videos, it is by default. user: admin and pass: 123. Also there is a non admin user and password (Only for comments). user: test and pass: test. @@ -36,7 +36,7 @@ Ok, check this out! https://tutorials.avideo.com/video/streamer-and-encoder ### Are you having a hard time to configure or install AVideo or any of its resources? fell free to ask us for help: -https://www.youphptube.com/services +https://streamphp.com/services @@ -72,7 +72,7 @@ Go get it here In order for you to be able to run AVideo, there are certain tools that need to be installed on your server. Don't worry, they are all FREE. To have a look at complete list of required tools, click the link below. - Linux (Kernel 2.6.32+) -- PHP 5.6+ +- PHP 8+ - MySQL 5.0+ - Apache web server 2.x (with mod_rewrite enabled) - FFMPEG @@ -81,7 +81,7 @@ In order for you to be able to run AVideo, there are certain tools that need to # What is new on this version? Since version 4.x+ we separate the streamer website from the encoder website, so that we can distribute the application on different servers. - The Streamer site, is the main front end and has as main function to attend the visitors of the site, through a layout based on the youtube experience, you can host the streamer site in any common internet host can host it (Windows or Linux). -- The Encoder site, will be better than the original encoder, the new encoder will be in charge of managing a media encoding queue. You can Donwload the encoder here: https://github.com/WWBN/AVideo-Encoder. but to install it you will need ssh access to your server, usually only VPS servers give you that kind of access, that code uses commands that use the Linux shell and consume more CPU. +- The Encoder site, will be better than the original encoder, the new encoder will be in charge of managing a media encoding queue. You can download the encoder here: https://github.com/WWBN/AVideo-Encoder. but to install it you will need ssh access to your server, usually only VPS servers give you that kind of access, that code uses commands that use the Linux shell and consume more CPU. - I will have to install the encoder and the streamer? No. We will be providing a public encoder, we will build the encoder in such a way that several streamers can use the same encoder. We are also providing source code for this, so you can install it internally and manage your own encoding priority. @@ -95,7 +95,7 @@ If you want the old version with Streamer and Encoder together (Version 3.4.1) d # Docker -We've created a Docker environment for the AVideo platform together with the +We've created a Docker environment for the AVideo platform together with the AVideo Encoder. You can either run docker build on this git repository or you can pull the latest image from Docker hub. It will be updated on any commit here. Also there are tags for official releases. diff --git a/_config.yml b/_config.yml old mode 100755 new mode 100644 diff --git a/deploy/apache/000-default.conf b/deploy/apache/000-default.conf old mode 100755 new mode 100644 diff --git a/deploy/docker-entrypoint b/deploy/docker-entrypoint old mode 100755 new mode 100644 diff --git a/deploy/wait-for-db.php b/deploy/wait-for-db.php old mode 100755 new mode 100644 index 3c94fc897..fbbc28616 --- a/deploy/wait-for-db.php +++ b/deploy/wait-for-db.php @@ -4,28 +4,28 @@ $sleep = 5; $timeout = 60; $connected = false; -$db_host = getenv("DB_MYSQL_HOST"); -$db_port = getenv("DB_MYSQL_PORT"); -$db_name = getenv("DB_MYSQL_NAME"); -$db_user = getenv("DB_MYSQL_USER"); -$db_pass = getenv("DB_MYSQL_PASSWORD"); +$db_host = getenv('DB_MYSQL_HOST'); +$db_port = getenv('DB_MYSQL_PORT'); +$db_name = getenv('DB_MYSQL_NAME'); +$db_user = getenv('DB_MYSQL_USER'); +$db_pass = getenv('DB_MYSQL_PASSWORD'); while (!$connected) { - echo "Checking database connection...."; - $mysqli = @new mysqli($db_host, $db_user, $db_pass, $db_name, $db_port); - if ($mysqli !== false && $mysqli->connect_error === null) { - echo "OK\n"; - $connected = true; - } else { - $counter ++; - echo "Failed (attempt ".$counter.")\n"; - if ($counter*$sleep > $timeout) { - echo "Giving up... (".$mysqli->connect_errno.") ".$mysqli->connect_error; - exit(1); + echo "Checking database connection...."; + $mysqli = @new mysqli($db_host, $db_user, $db_pass, $db_name, $db_port); + if ($mysqli !== false && $mysqli->connect_error === null) { + echo "OK\n"; + $connected = true; + } else { + $counter ++; + echo 'Failed (attempt ' . $counter . ")\n"; + if ($counter * $sleep > $timeout) { + echo 'Giving up... (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error; + exit(1); + } + + sleep($sleep); } - - sleep($sleep); - } } exit(0); diff --git a/index.php b/index.php old mode 100755 new mode 100644 index 350fa33e9..94fddb311 --- a/index.php +++ b/index.php @@ -73,7 +73,7 @@
- It appears that either something went wrong or the mod rewrite configration is not correct.
+ It appears that either something went wrong or the mod rewrite configuration is not correct.
We need to allow Apache to read .htaccess files located under the directory. diff --git a/install/checkConfiguration.php b/install/checkConfiguration.php old mode 100755 new mode 100644 index ce1d161b1..b9c1cb806 --- a/install/checkConfiguration.php +++ b/install/checkConfiguration.php @@ -7,14 +7,14 @@ $_POST['databaseName'] = str_replace('-', '_', $_POST['databaseName']); require_once '../objects/functions.php'; -$installationVersion = "4.0"; +$installationVersion = '6.0'; header('Content-Type: application/json'); $obj = new stdClass(); $obj->post = $_POST; -if(empty($_POST['systemRootPath'])){ +if (empty($_POST['systemRootPath'])) { $obj->error = "Your system path to application can not be empty"; echo json_encode($obj); exit; @@ -35,7 +35,7 @@ if ($_POST['createTables'] == 2) { $sql = "CREATE DATABASE IF NOT EXISTS `{$_POST['databaseName']}`"; - + try { $mysqli->query($sql); } catch (Exception $exc) { @@ -47,30 +47,31 @@ $mysqli->select_db($_POST['databaseName']); $tablesPrefix = ''; -if(!empty($_REQUEST['tablesPrefix'])){ +if (!empty($_REQUEST['tablesPrefix'])) { $tablesPrefix = preg_replace('/[^0-9a-z_]/i', '', $_REQUEST['tablesPrefix']); } if ($_POST['createTables'] > 0) { -// Temporary variable, used to store current query + // Temporary variable, used to store current query $templine = ''; -// Read in entire file + // Read in entire file $lines = file("{$_POST['systemRootPath']}install/database.sql"); -// Loop through each line + // Loop through each line $obj->error = ""; foreach ($lines as $line) { -// Skip it if it's a comment - if (substr($line, 0, 2) == '--' || $line == '') + // Skip it if it's a comment + if (substr($line, 0, 2) == '--' || $line == '') { continue; -// Add this line to the current segment + } + // Add this line to the current segment $templine .= $line; -// If it has a semicolon at the end, it's the end of the query + // If it has a semicolon at the end, it's the end of the query if (substr(trim($line), -1, 1) == ';') { - if(!empty($tablesPrefix)){ + if (!empty($tablesPrefix)) { $templine = addPrefixIntoQuery($templine, $tablesPrefix); } //echo $templine.PHP_EOL; // Perform the query - + try { $mysqli->query($templine); } catch (Exception $exc) { @@ -127,17 +128,17 @@ \$mysqlPass = '{$_POST['databasePass']}'; \$mysqlDatabase = '{$_POST['databaseName']}'; -\$global['allowed'] = array('mp4', 'avi', 'mov', 'flv', 'mp3', 'wav', 'm4v', 'webm', 'wmv', 'mpg', 'mpeg', 'f4v', 'm4v', 'm4a', 'm2p', 'rm', 'vob', 'mkv', '3gp'); +\$global['allowed'] = array('mp4', 'avi', 'mov', 'flv', 'mp3', 'wav', 'm4v', 'webm', 'wmv', 'mpg', 'mpeg', 'f4v', 'm4v', 'm4a', 'm2p', 'rm', 'vob', 'mkv', '3gp', 'mts', 'm2ts'); /** * Do NOT change from here */ -if(empty(\$global['webSiteRootPath'])){ +if (empty(\$global['webSiteRootPath'])){ preg_match('/https?:\/\/[^\/]+(.*)/i', \$global['webSiteRootURL'], \$matches); - if(!empty(\$matches[1])){ + if (!empty(\$matches[1])){ \$global['webSiteRootPath'] = \$matches[1]; } } -if(empty(\$global['webSiteRootPath'])){ +if (empty(\$global['webSiteRootPath'])){ die('Please configure your webSiteRootPath'); } @@ -148,7 +149,7 @@ $videosDir = $_POST['systemRootPath'].'videos/'; -if(!is_dir($videosDir)){ +if (!is_dir($videosDir)) { mkdir($videosDir, 0777, true); } diff --git a/install/cli.php b/install/cli.php old mode 100755 new mode 100644 index 0f8843797..5cba0a7b1 --- a/install/cli.php +++ b/install/cli.php @@ -1,6 +1,6 @@ delete(); } -echo "end".PHP_EOL; +echo "end" . PHP_EOL; echo "\n"; die(); - - - - diff --git a/install/deleteAllQueueWithError.php b/install/deleteAllQueueWithError.php old mode 100755 new mode 100644 index f17f35247..d2f17991e --- a/install/deleteAllQueueWithError.php +++ b/install/deleteAllQueueWithError.php @@ -6,25 +6,21 @@ if (!isCommandLineInterface()) { return die('Command Line only'); } -require_once $global['systemRootPath'].'objects/Encoder.php'; +require_once $global['systemRootPath'] . 'objects/Encoder.php'; ini_set('display_errors', 1); ini_set('display_startup_errors', 1); -error_reporting(E_ALL); +error_reporting(E_ALL & ~E_DEPRECATED); //$rows = Encoder::getAllQueue(); $rows = Encoder::getAll(false, true); -echo "Start {$global['webSiteRootURL']}".PHP_EOL; +echo "Start {$global['webSiteRootURL']}" . PHP_EOL; foreach ($rows as $value) { - echo "Deleting [{$value['id']}]{$value['title']}, {$value['videoDownloadedLink']}".PHP_EOL; + echo "Deleting [{$value['id']}]{$value['title']}, {$value['videoDownloadedLink']}" . PHP_EOL; $e = new Encoder($value['id']); $e->delete(); } -echo "end".PHP_EOL; +echo "end" . PHP_EOL; echo "\n"; die(); - - - - diff --git a/install/deleteSystemdPrivate.php b/install/deleteSystemdPrivate.php old mode 100755 new mode 100644 index b550443f5..0bb868405 --- a/install/deleteSystemdPrivate.php +++ b/install/deleteSystemdPrivate.php @@ -3,20 +3,21 @@ die('Command Line only'); } -function humanFileSize($size, $unit = ""){ - if ((!$unit && $size >= 1 << 30) || $unit == "GB") { - return number_format($size / (1 << 30), 2) . "GB"; +function humanFileSize($size, $unit = '') { + + if ((!$unit && $size >= 1 << 30) || $unit === 'GB') { + return number_format($size / (1 << 30), 2) . 'GB'; } - if ((!$unit && $size >= 1 << 20) || $unit == "MB") { - return number_format($size / (1 << 20), 2) . "MB"; + if ((!$unit && $size >= 1 << 20) || $unit === 'MB') { + return number_format($size / (1 << 20), 2) . 'MB'; } - if ((!$unit && $size >= 1 << 10) || $unit == "KB") { - return number_format($size / (1 << 10), 2) . "KB"; + if ((!$unit && $size >= 1 << 10) || $unit === 'KB') { + return number_format($size / (1 << 10), 2) . 'KB'; } - return number_format($size) . " bytes"; + return number_format($size) . ' bytes'; } set_time_limit(300); @@ -39,5 +40,5 @@ function humanFileSize($size, $unit = ""){ } $humanFSize = humanFileSize($totalFilesize); -echo " ----- " . PHP_EOL; +echo ' ----- ' . PHP_EOL; echo "Total deleted {$humanFSize}" . PHP_EOL; diff --git a/install/fix_dirs_permissions.php b/install/fix_dirs_permissions.php new file mode 100644 index 000000000..17204acde --- /dev/null +++ b/install/fix_dirs_permissions.php @@ -0,0 +1,42 @@ + diff --git a/install/index.php b/install/index.php old mode 100755 new mode 100644 index 68fdc26f6..30b67f1b3 --- a/install/index.php +++ b/install/index.php @@ -19,7 +19,7 @@ ?>
install directory to continue
sudo apt install libimage-exiftool-perl
- sudo add-apt-repository ppa:mc3man/trusty-media
sudo apt-get install ffmpeg
0 1 * * * sudo pip install --upgrade youtube-dl
- sudo mkdir
+ }
+ ?>
sudo chown www-data:www-data && sudo chmod 755
php.ini file
+ Edit the php.ini file
sudo nano
php.ini file
+ Edit the php.ini file
sudo nano
php.ini file
+ Edit the php.ini file
sudo nano
php.ini file
+ Edit the php.ini file
sudo nano