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