Initial commit
Working directory listing. Hardcoded sidebar template.
This commit is contained in:
7
private/.gitignore
vendored
Normal file
7
private/.gitignore
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
config.php
|
||||
dbconfig.conf
|
||||
settings.txt
|
||||
tmp/cache/*
|
||||
tmp/config/*
|
||||
tmp/templates/*
|
||||
|
||||
1
public/.gitignore
vendored
Normal file
1
public/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
.htaccess
|
||||
37
public/index.php
Normal file
37
public/index.php
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
require_once('../private/config.php');
|
||||
require_once(SihnonFramework_Lib . 'SihnonFramework/Main.class.php');
|
||||
|
||||
require 'smarty/Smarty.class.php';
|
||||
|
||||
try {
|
||||
Sihnon_Main::registerAutoloadClasses('SihnonFramework', SihnonFramework_Lib, 'MediaListing', Sihnon_Main::makeAbsolutePath('../source/lib/'));
|
||||
$main = MediaListing_Main::instance();
|
||||
|
||||
$smarty = new Smarty();
|
||||
$smarty->template_dir = '../source/templates';
|
||||
$smarty->compile_dir = '../private/tmp/templates';
|
||||
$smarty->cache_dir = '../private/tmp/cache';
|
||||
$smarty->config_dir = '../private/config';
|
||||
$smarty->register_modifier('formatDuration', array('MediaListing_Main', 'formatDuration'));
|
||||
$smarty->register_modifier('formatFilesize', array('MediaListing_Main', 'formatFilesize'));
|
||||
$smarty->assign('version', '0.1');
|
||||
$smarty->assign('base_uri', $main->baseUri());
|
||||
|
||||
$request = new MediaListing_RequestParser(isset($_GET['l']) ? $_GET['l'] : '');
|
||||
$page = new MediaListing_Page($smarty, $request);
|
||||
if ($page->evaluate(
|
||||
array(
|
||||
'smarty' => $smarty,
|
||||
'request' => $request,
|
||||
)
|
||||
)) {
|
||||
$smarty->display('index.tpl');
|
||||
}
|
||||
|
||||
} catch (Sihnon_Exception $e) {
|
||||
die("Uncaught " . get_class($e) . ": " . $e->getMessage());
|
||||
}
|
||||
|
||||
?>
|
||||
118
public/styles/normal.css
Normal file
118
public/styles/normal.css
Normal file
@@ -0,0 +1,118 @@
|
||||
body {
|
||||
margin: 0em;
|
||||
padding: 0em;
|
||||
background: #a7a09a;
|
||||
font-family: verdana, helvetica, sans-serif;
|
||||
}
|
||||
|
||||
a {
|
||||
color: gray;
|
||||
}
|
||||
|
||||
label {
|
||||
margin-left: 1em;
|
||||
margin-right: 1em;
|
||||
}
|
||||
|
||||
#container {
|
||||
width: 75%;
|
||||
min-width: 75em;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
#banner {
|
||||
margin: 0em;
|
||||
padding: 0em;
|
||||
background: #eeeeee;
|
||||
}
|
||||
|
||||
#banner h1 {
|
||||
padding: 0.5em;
|
||||
}
|
||||
|
||||
#navigation {
|
||||
background: #eeeeee;
|
||||
margin-top: 0em;
|
||||
margin-bottom: 1em;
|
||||
padding: 0.2em;
|
||||
}
|
||||
|
||||
#navigation ul {
|
||||
margin: 0em;
|
||||
padding: 0em 5em;;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
#navigation li {
|
||||
margin: 1em;
|
||||
padding: 0em;
|
||||
display: inline;
|
||||
}
|
||||
|
||||
#page-container {
|
||||
margin: 0em;
|
||||
padding: 0em;
|
||||
}
|
||||
|
||||
#sidebar {
|
||||
float: left;
|
||||
width: 20em;
|
||||
margin-bottom: 1em;
|
||||
|
||||
background: #eeeeee;
|
||||
}
|
||||
|
||||
#page {
|
||||
margin-left: 21em;
|
||||
margin-bottom: 1em;
|
||||
padding: 0.5em;
|
||||
|
||||
background: #eeeeee;
|
||||
}
|
||||
|
||||
#footer {
|
||||
clear: both;
|
||||
padding: 2em;
|
||||
font-size: smaller;
|
||||
font-style: italic;
|
||||
|
||||
background: #eeeeee;
|
||||
color: #333333;
|
||||
|
||||
}
|
||||
|
||||
#errors {
|
||||
background: peachpuff;
|
||||
color: darkred;
|
||||
margin: 1em;
|
||||
}
|
||||
|
||||
#messages {
|
||||
background: lightcyan;
|
||||
color: darkblue;
|
||||
margin: 1em;
|
||||
}
|
||||
|
||||
.default {
|
||||
background: beige;
|
||||
color: darkgray;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.icon {
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
}
|
||||
|
||||
form#setup-rips input[type="text"] {
|
||||
width: 30em;
|
||||
}
|
||||
|
||||
#quantizer-slider {
|
||||
width: 20em;
|
||||
}
|
||||
|
||||
select.rip-streams {
|
||||
width: 20em;
|
||||
}
|
||||
|
||||
60
source/lib/MediaListing/Directory.class.php
Normal file
60
source/lib/MediaListing/Directory.class.php
Normal file
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
class MediaListing_Directory extends MediaListing_FileObject {
|
||||
|
||||
protected $files;
|
||||
protected $parent;
|
||||
|
||||
public function __construct($path, $parent, $scan) {
|
||||
if ( ! is_dir($path)) {
|
||||
throw new MediaListing_Exception_NotADirectory($path);
|
||||
}
|
||||
|
||||
parent::__construct(parent::TYPE_Directory, $path);
|
||||
$this->parent = $parent;
|
||||
|
||||
if ($scan) {
|
||||
$this->scan();
|
||||
}
|
||||
}
|
||||
|
||||
protected function scan() {
|
||||
try {
|
||||
$iterator = new MediaListing_Utility_VisibleFilesIterator(new DirectoryIterator($this->path));
|
||||
foreach ($iterator as /** @var SplFileInfo */ $source) {
|
||||
$filename = $source->getPathname();
|
||||
$basename = basename($filename);
|
||||
$this->files["{$basename}"] = MediaListing_FileObject::create($filename, $this, false);
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
echo $e->getMessage();
|
||||
}
|
||||
|
||||
uasort($this->files, function($a, $b) {
|
||||
return ($a->type() == $b->type()) ? strcasecmp($a->basename(), $b->basename()) : ($a->type() < $b->type());
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
public function parent() {
|
||||
return $this->parent;
|
||||
}
|
||||
|
||||
public function files() {
|
||||
return $this->files;
|
||||
}
|
||||
|
||||
public function file($basename) {
|
||||
if ( ! key_exists($basename, $this->files)) {
|
||||
throw new MediaListing_Exception_FileNotFound($basename);
|
||||
}
|
||||
|
||||
$subdir = $this->files["{$basename}"];
|
||||
$subdir->scan();
|
||||
|
||||
return $subdir;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
6
source/lib/MediaListing/Exceptions.class.php
Normal file
6
source/lib/MediaListing/Exceptions.class.php
Normal file
@@ -0,0 +1,6 @@
|
||||
<?php
|
||||
|
||||
class MediaListing_Exception_NotADirectory extends MediaListing_Exception {};
|
||||
class MediaListing_Exception_NotAFile extends MediaListing_Exception {};
|
||||
|
||||
?>
|
||||
23
source/lib/MediaListing/File.class.php
Normal file
23
source/lib/MediaListing/File.class.php
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
class MediaListing_File extends MediaListing_FileObject {
|
||||
|
||||
protected $size;
|
||||
|
||||
public function __construct($path) {
|
||||
if ( ! is_file($path)) {
|
||||
throw new MediaListing_Exception_NotAFile($path);
|
||||
}
|
||||
|
||||
parent::__construct(parent::TYPE_File, $path);
|
||||
|
||||
$this->size = filesize($this->path);
|
||||
}
|
||||
|
||||
public function size() {
|
||||
return $this->size;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
56
source/lib/MediaListing/FileObject.class.php
Normal file
56
source/lib/MediaListing/FileObject.class.php
Normal file
@@ -0,0 +1,56 @@
|
||||
<?php
|
||||
|
||||
abstract class MediaListing_FileObject {
|
||||
|
||||
const TYPE_File = 1;
|
||||
const TYPE_Directory = 2;
|
||||
|
||||
protected $type;
|
||||
protected $basename;
|
||||
protected $path;
|
||||
|
||||
public static function create($path, $parent = null, $scan = true) {
|
||||
if ( ! file_exists($path)) {
|
||||
throw new MediaListing_Exception_FileNotFound($path);
|
||||
}
|
||||
|
||||
switch (filetype($path)) {
|
||||
case "file": {
|
||||
return new MediaListing_File($path);
|
||||
} break;
|
||||
|
||||
case "dir": {
|
||||
return new MediaListing_Directory($path, $parent, $scan);
|
||||
} break;
|
||||
}
|
||||
}
|
||||
|
||||
protected function __construct($type, $path) {
|
||||
$this->type = $type;
|
||||
$this->path = $path;
|
||||
$this->basename = basename($path);
|
||||
}
|
||||
|
||||
public function isFile() {
|
||||
return $this->type == self::TYPE_File;
|
||||
}
|
||||
|
||||
public function isDirectory() {
|
||||
return $this->type == self::TYPE_Directory;
|
||||
}
|
||||
|
||||
public function type() {
|
||||
return $this->type;
|
||||
}
|
||||
|
||||
public function path() {
|
||||
return $this->path;
|
||||
}
|
||||
|
||||
public function basename() {
|
||||
return $this->basename;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
36
source/lib/MediaListing/Source.class.php
Normal file
36
source/lib/MediaListing/Source.class.php
Normal file
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
class MediaListing_Source {
|
||||
|
||||
protected $name;
|
||||
protected $path;
|
||||
protected $root;
|
||||
|
||||
public function __construct($name, $path, $scan = true) {
|
||||
$this->name = $name;
|
||||
$this->path = $path;
|
||||
|
||||
if ($scan) {
|
||||
$this->scan();
|
||||
}
|
||||
}
|
||||
|
||||
protected function scan() {
|
||||
$this->root = MediaListing_FileObject::create($this->path);
|
||||
}
|
||||
|
||||
public function name() {
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
public function path() {
|
||||
return $this->path();
|
||||
}
|
||||
|
||||
public function root() {
|
||||
return $this->root;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
|
||||
class MediaListing_Utility_VideoFilesIterator extends FilterIterator {
|
||||
public function accept() {
|
||||
return preg_match('/\.(?:avi|ogm|m4v|mkv|mov|mp4|mpg|srt)$/i', $this->current()->getFilename());
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
3
source/pages/errors/404.php
Normal file
3
source/pages/errors/404.php
Normal file
@@ -0,0 +1,3 @@
|
||||
<?php
|
||||
|
||||
?>
|
||||
10
source/pages/errors/unhandled-exception.php
Normal file
10
source/pages/errors/unhandled-exception.php
Normal file
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
$main = MediaListing_Main::instance();
|
||||
$config = $main->config();
|
||||
|
||||
$this->smarty->assign('display_exceptions', $config->get('debug.display_exceptions'));
|
||||
$this->smarty->assign('exception', $exception);
|
||||
$this->smarty->assign('exception_type', get_class($exception));
|
||||
|
||||
?>
|
||||
15
source/pages/home.php
Normal file
15
source/pages/home.php
Normal file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
$config = MediaListing_Main::instance()->config();
|
||||
$source_paths = $config->get('sources');
|
||||
$sources = array();
|
||||
|
||||
foreach ($source_paths as $source_path) {
|
||||
list($name, $path) = explode(':', $source_path);
|
||||
|
||||
$sources[] = new MediaListing_Source($name, $path, false);
|
||||
}
|
||||
|
||||
$smarty->assign('sources', $sources);
|
||||
|
||||
?>
|
||||
40
source/pages/list.php
Normal file
40
source/pages/list.php
Normal file
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
$config = MediaListing_Main::instance()->config();
|
||||
$source_paths = $config->get('sources');
|
||||
$sources = array();
|
||||
|
||||
foreach ($source_paths as $source_path) {
|
||||
list($name, $path) = explode(':', $source_path);
|
||||
|
||||
$sources[$name] = new MediaListing_Source($name, $path);
|
||||
}
|
||||
|
||||
$source_name = $request->get('source');
|
||||
$source = $sources[$source_name];
|
||||
$source_path = $request->getRemainder('source', true);
|
||||
$directory = $sources[$source_name]->root();
|
||||
foreach ($source_path as $subdir) {
|
||||
$directory = $directory->file($subdir);
|
||||
}
|
||||
|
||||
$path = implode('/', $source_path);
|
||||
if ($path) {
|
||||
$path .= '/';
|
||||
}
|
||||
|
||||
$parent_source_path = $source_path;
|
||||
array_pop($parent_source_path);
|
||||
$parent_path = implode('/', $parent_source_path);
|
||||
if ($parent_path) {
|
||||
$parent_path .= '/';
|
||||
}
|
||||
|
||||
$smarty->assign('parent', $directory->parent());
|
||||
$smarty->assign('parent_path', $parent_path);
|
||||
$smarty->assign('source', $source);
|
||||
$smarty->assign('path', $path);
|
||||
$smarty->assign('root', $directory);
|
||||
$smarty->assign('files', $directory->files());
|
||||
|
||||
?>
|
||||
1
source/templates/errors/404.tpl
Normal file
1
source/templates/errors/404.tpl
Normal file
@@ -0,0 +1 @@
|
||||
Error 404
|
||||
46
source/templates/errors/unhandled-exception.tpl
Normal file
46
source/templates/errors/unhandled-exception.tpl
Normal file
@@ -0,0 +1,46 @@
|
||||
<h2>An unhandled error has occurred</h2>
|
||||
<p>
|
||||
There was a problem trying to complete the requested action. Please try again and if the problem persists, let us know.
|
||||
</p>
|
||||
|
||||
{if $display_exceptions}
|
||||
<p>
|
||||
An unhandled exception was caught during the page template processing. The full details are shown below:
|
||||
</p>
|
||||
<table class="exception-details">
|
||||
<colgroup id="header">
|
||||
<col />
|
||||
</colgroup>
|
||||
<colgroup>
|
||||
<col />
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>Exception</th>
|
||||
<td>{$exception_type}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>File</th>
|
||||
<td>{$exception->getFile()}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Line</th>
|
||||
<td>{$exception->getLine()}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Message</th>
|
||||
<td>{$exception->getMessage()}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Stack Trace</th>
|
||||
<td><pre>{$exception->getTrace()|print_r}</pre></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<p>
|
||||
<em>Note:</em> Exception details should not be displayed on production systems.
|
||||
Disable the <a href="{$base_uri}admin/settings/key/debug.show_exceptions/"><code>debug.show_exceptions</code></a>
|
||||
setting to omit the exception details from this page.
|
||||
</p>
|
||||
{/if}
|
||||
5
source/templates/home.tpl
Normal file
5
source/templates/home.tpl
Normal file
@@ -0,0 +1,5 @@
|
||||
<ul>
|
||||
{foreach from=$sources item=source}
|
||||
<li><a href="{$base_uri}list/source/{$source->name()}" title="{$source->name()}">{$source->name()}</a></li>
|
||||
{/foreach}
|
||||
</ul>
|
||||
49
source/templates/index.tpl
Normal file
49
source/templates/index.tpl
Normal file
@@ -0,0 +1,49 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<title>Media Listing</title>
|
||||
<script language="javascript"></script>
|
||||
<link rel="stylesheet" type="text/css" href="{$base_uri}styles/normal.css" />
|
||||
|
||||
<link type="text/css" href="{$base_uri}styles/3rdparty/jquery-ui/smoothness/jquery-ui-1.8.custom.css" rel="Stylesheet" />
|
||||
<script type="text/javascript" src="{$base_uri}scripts/3rdparty/jquery-1.4.2.js"></script>
|
||||
<script type="text/javascript" src="{$base_uri}scripts/3rdparty/jquery-ui-1.8.custom.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="container">
|
||||
|
||||
<div id="banner">
|
||||
<h1>Media Listing</h1>
|
||||
</div>
|
||||
|
||||
<div id="page-container">
|
||||
|
||||
<div id="sidebar">
|
||||
{include file=sidebar.tpl}
|
||||
</div>
|
||||
|
||||
<div id="page">
|
||||
|
||||
{if $messages}
|
||||
<div id="messages">
|
||||
{foreach from=$messages item=message}
|
||||
{$message}
|
||||
{/foreach}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{$page_content}
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="footer">
|
||||
Powered by Media Listing {$version}. Written by Ben Roberts.
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
31
source/templates/list.tpl
Normal file
31
source/templates/list.tpl
Normal file
@@ -0,0 +1,31 @@
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Filename</th>
|
||||
<th>Size</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{if $parent}
|
||||
<tr>
|
||||
<td><a href="{$base_uri}list/source/{$source->name()}/{$parent_path}" title="Parent Directory">../ <em>Parent Directory</em></a></td>
|
||||
<td>-</td>
|
||||
</tr>
|
||||
{/if}
|
||||
{foreach from=$files item=file}
|
||||
<tr>
|
||||
{if $file->isFile()}
|
||||
<td>{$file->basename()}</td>
|
||||
{else}
|
||||
<td><a href="{$base_uri}list/source/{$source->name()}/{$path}{$file->basename()}" title="{$file->basename()}">{$file->basename()}</a></td>
|
||||
{/if}
|
||||
<td>{if $file->isFile()}
|
||||
{$file->size()|formatFilesize}
|
||||
{else}
|
||||
-
|
||||
{/if}
|
||||
</td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
</tbody>
|
||||
</table>
|
||||
5
source/templates/sidebar.tpl
Normal file
5
source/templates/sidebar.tpl
Normal file
@@ -0,0 +1,5 @@
|
||||
<ul>
|
||||
<li><a href="{$base_uri}list/source/TV" title="TV">TV</a>
|
||||
<li><a href="{$base_uri}list/source/Movies" title="Movies">Movies</a>
|
||||
<li><a href="{$base_uri}list/source/Music" title="Music">Music</a>
|
||||
</ul>
|
||||
Reference in New Issue
Block a user