ktk_mediaserve/modules/FileBrowser.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);
}
}
?>