220 lines
7.6 KiB
PHP
220 lines
7.6 KiB
PHP
<?php
|
|
namespace ktk\MediaServe;
|
|
|
|
/*
|
|
In FileBrowser, we store our lists of files(files), directories(dirs), and everything(dir_list) within MediaServe's storage. This is to improve performance and reduce disk access if we are only doing simple operations such as sorting.
|
|
|
|
*/
|
|
class FileBrowser {
|
|
const ROOT = "media/";
|
|
|
|
const T_DIR = 1;
|
|
const T_FILE = 2;
|
|
|
|
const F_TYPE = 0;
|
|
const F_NAME = 1;
|
|
const F_EXT = 2;
|
|
|
|
static function onInit() {
|
|
// set default options if need be
|
|
if (!MediaServe::getData('cwd')) {
|
|
MediaServe::storeData('cwd', FileBrowser::ROOT);
|
|
MediaServe::storeData('sort_order', SORT_ASC);
|
|
MediaServe::storeData('sort_by', "name");
|
|
MediaServe::storeData('filter', '');
|
|
self::getFiles();
|
|
self::sortFiles();
|
|
}
|
|
}
|
|
|
|
static function onRender() {
|
|
echo ' <div id="ktk_MediaServe_FileBrowser">'.PHP_EOL;
|
|
echo ' <h1>',MediaServe::getData('cwd'),'</h1>'.PHP_EOL;
|
|
if (MediaServe::checkModule("Playlist")) {
|
|
echo ' <form action="" method="POST">';
|
|
echo ' <input type="hidden" name="m" value="FileBrowser" />';
|
|
echo ' <input type="hidden" name="c" value="openFiles" />';
|
|
echo ' <input type="submit" name="" value="add all to playlist" />';
|
|
echo ' </form>';
|
|
}
|
|
echo ' <form action="" method="POST" autocomplete="off">';
|
|
echo ' <input type="hidden" name="m" value="FileBrowser" />';
|
|
echo ' <input id="ktk_MediaServe_FileBrowser_FilterInput" type="text" name="p[]" value="'.MediaServe::getData('filter').'" autocomplete="off" />';
|
|
//echo ' <input type="hidden" name="c" value="changeFilter" />';
|
|
//echo ' <input id="ktk_MediaServe_FileBrowser_FilterSubmit" type="submit" value="Filter" />';
|
|
// Using button may break IE6 and below...
|
|
echo ' <button type="submit" name="c" value="changeFilter">Filter</button>';
|
|
echo ' <button type="submit" name="c" value="resetFilter">Reset</button>';
|
|
echo ' </form>';
|
|
echo ' <table>'.PHP_EOL;
|
|
echo ' <form action="" method="POST">';
|
|
echo ' <input type="hidden" name="m" value="FileBrowser" />';
|
|
echo ' <input type="hidden" name="c" value="changeSort" />';
|
|
echo ' <tr><th><input type="submit" name="p[]" value="name" /></th><th><input type="submit" name="p[]" value="ext" /></th></tr>'.PHP_EOL;
|
|
echo ' </form>'.PHP_EOL;
|
|
echo ' <form action="" method="POST">';
|
|
echo ' <input type="hidden" name="m" value="FileBrowser" />';
|
|
echo ' <input type="hidden" name="c" value="changeCwd" />';
|
|
echo ' <tr><td><input type="submit" name="p[]" value="../"></td><td></td></tr>'.PHP_EOL;
|
|
foreach(MediaServe::getData('dirs') as $dir) {
|
|
echo ' <tr><td><input type="submit" name="p[]" value="'.$dir[FileBrowser::F_NAME].'/"></td><td></td></tr>'.PHP_EOL;
|
|
}
|
|
echo ' </form>'.PHP_EOL;
|
|
|
|
echo ' <form action="" method="POST">';
|
|
echo ' <input type="hidden" name="m" value="FileBrowser" />';
|
|
echo ' <input type="hidden" name="c" value="openFile" />';
|
|
foreach(MediaServe::getData('files') as $file) {
|
|
echo ' <tr><td><input type="submit" name="p[]" value="'.$file[FileBrowser::F_NAME].'"/></td><td>'.$file[FileBrowser::F_EXT].'</td></tr>'.PHP_EOL;
|
|
}
|
|
echo ' </form>'.PHP_EOL;
|
|
echo ' </table>'.PHP_EOL;
|
|
echo ' </div>'.PHP_EOL;
|
|
}
|
|
|
|
/* COMMAND FUNCTIONS */
|
|
static function changeCwd($directory) {
|
|
// NOTE: temporarily resolving any ".." to one dir up, rather than all
|
|
if (substr_count($directory, "..")) {
|
|
if (MediaServe::getData('cwd') == FileBrowser::ROOT) {
|
|
return NULL;
|
|
}
|
|
$directory = dirname(MediaServe::getData('cwd')).'/';
|
|
} else {
|
|
$directory = MediaServe::getData('cwd').$directory;
|
|
}
|
|
if (!file_exists($directory)) {
|
|
MediaServe::reportError(__CLASS__, __FUNCTION__,
|
|
"Cannot change working directory to \"".$directory."\", as it does not exist!\n"
|
|
);
|
|
return NULL;
|
|
}
|
|
MediaServe::storeData('cwd', $directory);
|
|
self::getFiles();
|
|
self::sortFiles();
|
|
self::filterFiles();
|
|
}
|
|
|
|
static function changeSort($type) {
|
|
MediaServe::storeData('sort_by', $type);
|
|
if (($sort_order = MediaServe::getData('sort_order')) != SORT_ASC) {
|
|
MediaServe::storeData('sort_order', SORT_ASC);
|
|
} else {
|
|
MediaServe::storeData('sort_order', SORT_DESC);
|
|
}
|
|
self::sortFiles();
|
|
self::filterFiles();
|
|
}
|
|
|
|
static function changeFilter($filter) {
|
|
MediaServe::storeData('filter', $filter);
|
|
self::filterFiles();
|
|
}
|
|
|
|
static function resetFilter() {
|
|
self::sortFiles();
|
|
self::changeFilter("");
|
|
}
|
|
|
|
static function openFile($file) {
|
|
if (MediaServe::checkModule("Playlist")) {
|
|
Playlist::addFile(MediaServe::getData('cwd').$file);
|
|
}
|
|
}
|
|
|
|
static function openFiles() {
|
|
if (MediaServe::checkModule("Playlist")) {
|
|
foreach(MediaServe::getData('files') as $file) {
|
|
Playlist::addFile(MediaServe::getData('cwd').$file[FileBrowser::F_NAME]);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* GENERAL FUNCTIONS */
|
|
static function getFiles() {
|
|
$directory = MediaServe::getData('cwd');
|
|
if (!is_dir($directory)) {
|
|
MediaServe::reportError(__CLASS__, __FUNCTION__,
|
|
"Directory \"".$directory."\" does not exist!\n"
|
|
);
|
|
return NULL;
|
|
}
|
|
if (!is_readable($directory)) {
|
|
MediaServe::reportError(__CLASS__, __FUNCTION__,
|
|
"Cannot open \"".$directory."\" for reading!\n"
|
|
);
|
|
return NULL;
|
|
}
|
|
if (!$directory_handle = opendir($directory)) {
|
|
return NULL;
|
|
}
|
|
$i = 0;
|
|
$files = array();
|
|
while (false !== ($filename = readdir($directory_handle))) {
|
|
if ($filename[0] != '.' && $filename != "..") {
|
|
$files[$i] = array();
|
|
if (is_dir($directory.$filename)) {
|
|
$files[$i][FileBrowser::F_TYPE] = FileBrowser::T_DIR;
|
|
} else {
|
|
$files[$i][FileBrowser::F_TYPE] = FileBrowser::T_FILE;
|
|
}
|
|
$files[$i][FileBrowser::F_NAME] = $filename;
|
|
$files[$i][FileBrowser::F_EXT] = pathinfo($filename, PATHINFO_EXTENSION);
|
|
$i++;
|
|
}
|
|
}
|
|
return(MediaServe::storeData('dir_list', $files));
|
|
}
|
|
|
|
/* INTERNAL FUNCTIONS */
|
|
static function sortFiles() {
|
|
$sort = array();
|
|
$sort_by = MediaServe::getData('sort_by');
|
|
$sort_order = MediaServe::getData('sort_order');
|
|
$i = 0;
|
|
if ($sort_by == "ext") {
|
|
foreach (MediaServe::getData('dir_list') as $file) {
|
|
$sort[$i++] = $file[FileBrowser::F_EXT];
|
|
}
|
|
} else {
|
|
foreach (MediaServe::getData('dir_list') as $file) {
|
|
$sort[$i++] = $file[FileBrowser::F_NAME];
|
|
}
|
|
}
|
|
array_multisort($sort, $sort_order, MediaServe::getData('dir_list'));
|
|
// Wasteful, but we want directories always on top
|
|
$dirs = array();
|
|
$files = array();
|
|
foreach (MediaServe::getData('dir_list') as $file) {
|
|
if ($file[FileBrowser::F_TYPE] == FileBrowser::T_DIR) {
|
|
$dirs[] = $file;
|
|
} else {
|
|
$files[] = $file;
|
|
}
|
|
}
|
|
MediaServe::storeData('files', $files);
|
|
MediaServe::storeData('dirs', $dirs);
|
|
}
|
|
|
|
static function filterFiles() {
|
|
// TODO: recreating an array seems inefficient, should change
|
|
if (($filter = MediaServe::getData('filter')) == "")
|
|
return NULL;
|
|
$files = array();
|
|
$dirs = array();
|
|
foreach(MediaServe::getData('files') as $file) {
|
|
if (strpos($file[FileBrowser::F_NAME], $filter) !== FALSE) {
|
|
$files[] = $file;
|
|
}
|
|
}
|
|
foreach(MediaServe::getData('dirs') as $dir) {
|
|
if (strpos($dir[FileBrowser::F_NAME], $filter) !== FALSE) {
|
|
$dirs[] = $dir;
|
|
}
|
|
}
|
|
MediaServe::storeData('files', $files);
|
|
MediaServe::storeData('dirs', $dirs);
|
|
}
|
|
}
|
|
?>
|