feat: add videodb media index with Docker stack
- Add videodb PHP/MySQL media collection manager (Blu-ray, DVD, CD) - Dockerfile: PHP 8.1 + Apache with GD/mysqli/exif extensions - docker-compose.yml: app on port 6761 + MySQL 8.0 with health checks - docker-entrypoint.sh: auto-generates config.inc.php from env vars, waits for MySQL, initializes DB schema idempotently - init-db.php: CLI schema installer using app's own prefix_query() logic - Persistent volumes for DB, cache, and cover images Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
356
videodb/core/setup.core.php
Normal file
356
videodb/core/setup.core.php
Normal file
@@ -0,0 +1,356 @@
|
||||
<?php
|
||||
/**
|
||||
* Functions for config options
|
||||
*
|
||||
* @package Core
|
||||
* @author Andreas Gohr <a.gohr@web.de>
|
||||
* @author Andreas Götz <cpuidle@gmx.de>
|
||||
* @version $Id: setup.core.php,v 1.12 2013/03/16 10:10:07 andig2 Exp $
|
||||
*/
|
||||
|
||||
require_once './core/functions.php';
|
||||
require_once './core/custom.php';
|
||||
require_once './core/output.php';
|
||||
|
||||
$SETUP_GLOBAL = array('language', 'autoid', 'mediadefault', 'langdefault', 'acclangbrowser',
|
||||
'filterdefault', 'showtv', 'orderallbydisk', 'removearticles',
|
||||
'localnet', 'IMDBage', 'thumbnail',
|
||||
'castcolumns', 'template', 'languageflags', 'custom1',
|
||||
'custom2', 'custom3', 'custom4', 'custom1type',
|
||||
'custom2type', 'custom3type', 'custom4type', 'enginedefault',
|
||||
'proxy_host', 'proxy_port', 'actorpics', 'thumbAge', 'listcolumns',
|
||||
'shownew', 'imdbBrowser', 'multiuser', 'denyguest', 'adultgenres',
|
||||
'pageno', 'showtools', 'showcasttoggle', 'browse_include_title');
|
||||
|
||||
$SETUP_QUICK = array('template');
|
||||
|
||||
$SETUP_USER = array('language', 'mediadefault', 'langdefault', 'acclangbrowser', 'filterdefault',
|
||||
'showtv', 'orderallbydisk', 'template', 'languageflags',
|
||||
'listcolumns', 'castcolumns', 'shownew', 'pageno', 'removearticles',
|
||||
'showcasttoggle', 'browse_include_title');
|
||||
|
||||
/**
|
||||
* Build config options array
|
||||
*
|
||||
* @param boolean $isprofile Determines if user-specific options are to be displayed
|
||||
*
|
||||
* @return array associative array of config options
|
||||
*/
|
||||
function setup_mkOptions($isprofile = false)
|
||||
{
|
||||
global $config, $lang;
|
||||
|
||||
// built list of setup options
|
||||
$setup = array();
|
||||
|
||||
// isprofile, name, type (text|boolean|dropdown|special|link), data, set, helphl, helptxt
|
||||
$setup[] = setup_addSection('opt_general');
|
||||
$setup[] = setup_addOption($isprofile, 'language', 'dropdown', setup_getLanguages(), null, $lang['help_langn'], $lang['help_lang']);
|
||||
$option = setup_addOption($isprofile, 'template', 'dropdown', setup_getTemplates($thumbs));
|
||||
$option['thumbs'] = $thumbs;
|
||||
$setup[] = $option;
|
||||
|
||||
$setup[] = setup_addOption($isprofile, 'listcolumns', 'text');
|
||||
$setup[] = setup_addOption($isprofile, 'castcolumns', 'text');
|
||||
|
||||
$setup[] = setup_addOption($isprofile, 'autoid', 'boolean');
|
||||
$setup[] = setup_addOption($isprofile, 'orderallbydisk', 'boolean');
|
||||
|
||||
$setup[] = setup_addOption($isprofile, 'mediadefault', 'dropdown', setup_getMediatypes());
|
||||
$setup[] = setup_addOption($isprofile, 'langdefault', 'text');
|
||||
$setup[] = setup_addOption($isprofile, 'acclangbrowser', 'boolean');
|
||||
$setup[] = setup_addOption($isprofile, 'filterdefault', 'dropdown', array('all'=>$lang['radio_all'], 'unseen'=>$lang['radio_unseen'], 'new'=>$lang['radio_new'], 'wanted'=>$lang['radio_wanted']));
|
||||
$setup[] = setup_addOption($isprofile, 'showtv', 'boolean');
|
||||
$setup[] = setup_addOption($isprofile, 'shownew', 'text');
|
||||
$setup[] = setup_addOption($isprofile, 'pageno', 'text');
|
||||
$setup[] = setup_addOption($isprofile, 'languageflags', 'special', out_languageflags($config['languages']));
|
||||
$setup[] = setup_addOption($isprofile, 'removearticles', 'boolean');
|
||||
$setup[] = setup_addOption($isprofile, 'adultgenres', 'multi', setup_getGenres(), @explode('::', $config['adultgenres']));
|
||||
$setup[] = setup_addOption($isprofile, 'showtools', 'boolean');
|
||||
$setup[] = setup_addOption($isprofile, 'showcasttoggle', 'boolean');
|
||||
$setup[] = setup_addOption($isprofile, 'browse_include_title', 'dropdown', array('none' => $lang['none'], 'top' => $lang['top'], 'bottom' => $lang['bottom'], 'both' => $lang['both']));
|
||||
|
||||
if (!$isprofile) $setup[] = setup_addSection('opt_custom');
|
||||
$setup[] = setup_addOption($isprofile, 'custom', 'special', setup_mkCustoms(), 'custom', $lang['help_customn'], $lang['help_custom']);
|
||||
|
||||
if (!$isprofile) $setup[] = setup_addSection('opt_engines');
|
||||
$setup[] = setup_addOption($isprofile, 'enginedefault', 'dropdown', setup_getEngines($config['engines']), null , $lang['help_defaultenginen'], $lang['help_defaultengine']);
|
||||
|
||||
foreach ($config['engines'] as $engine => $meta)
|
||||
{
|
||||
$title = $meta['name'];
|
||||
if (array_key_exists($engine,$config['engine'])) {$enabled = $config['engine'][$engine];} else {$enabled = null;}
|
||||
$helptext = sprintf($lang['help_engine'], $title);
|
||||
if (array_key_exists('help_engine' . $engine, $lang)) {$helptext .= ' ' . $lang['help_engine' . $engine];}
|
||||
if (!array_key_exists('stable', $meta) || $meta['stable'] == 0) {$helptext .= ' ' . $lang['help_engexperimental'];}
|
||||
|
||||
$setup[] = setup_addOption($isprofile, 'engine'.$engine, 'boolean', null, $enabled, $title, $helptext);
|
||||
|
||||
// add engine-specific options
|
||||
if (array_key_exists('config', $meta) && is_array($meta['config']))
|
||||
{
|
||||
foreach ($meta['config'] as $setting)
|
||||
{
|
||||
// NOTE: check setup_additionalSettings if you change the option naming
|
||||
if (is_array($setting['values']))
|
||||
$setup[] = setup_addOption($isprofile, $engine.$setting['opt'],
|
||||
'dropdown', $setting['values'], null, $setting['name'], $setting['desc']);
|
||||
else
|
||||
$setup[] = setup_addOption($isprofile, $engine.$setting['opt'],
|
||||
'text', null, null, $setting['name'], $setting['desc']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!$isprofile) {$setup[] = setup_addSection('opt_security');}
|
||||
$setup[] = setup_addOption($isprofile, 'localnet', 'text');
|
||||
$setup[] = setup_addOption($isprofile, 'multiuser', 'boolean');
|
||||
$setup[] = setup_addOption($isprofile, 'denyguest', 'boolean');
|
||||
$setup[] = setup_addOption($isprofile, 'usermanager', 'link', 'users.php', 'usermanager');
|
||||
$setup[] = setup_addOption($isprofile, 'proxy_host', 'text');
|
||||
$setup[] = setup_addOption($isprofile, 'proxy_port', 'text');
|
||||
|
||||
if (!$isprofile) {$setup[] = setup_addSection('opt_caching');}
|
||||
$setup[] = setup_addOption($isprofile, 'thumbnail', 'boolean');
|
||||
$setup[] = setup_addOption($isprofile, 'imdbBrowser', 'boolean');
|
||||
$setup[] = setup_addOption($isprofile, 'IMDBage', 'text');
|
||||
$setup[] = setup_addOption($isprofile, 'actorpics', 'boolean');
|
||||
$setup[] = setup_addOption($isprofile, 'thumbAge', 'text');
|
||||
|
||||
// clean empty entries
|
||||
for ($i = count($setup); $i > 0; $i--)
|
||||
{
|
||||
if (empty($setup[$i]['name']) && empty($setup[$i]['group'])) unset($setup[$i]);
|
||||
}
|
||||
|
||||
return $setup;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add engine-specific config options for saving
|
||||
*/
|
||||
function setup_additionalSettings()
|
||||
{
|
||||
global $config, $SETUP_GLOBAL;
|
||||
|
||||
foreach ($config['engines'] as $engine => $meta)
|
||||
{
|
||||
// add engine-specific options
|
||||
if (array_key_exists('config', $meta) && is_array($meta['config']))
|
||||
{
|
||||
foreach ($meta['config'] as $setting)
|
||||
{
|
||||
$SETUP_GLOBAL[] = $engine.$setting['opt'];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a new section to the config options array
|
||||
*
|
||||
* @param array $setup The config array
|
||||
* @param string $section Name of the new section
|
||||
*/
|
||||
function setup_addSection($section)
|
||||
{
|
||||
$option['group'] = $section;
|
||||
return $option;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an entry for the config option array
|
||||
*
|
||||
* returns NULL on global options if $isprofile is true
|
||||
* so global options will not be added to user profile settings
|
||||
*
|
||||
* @param array $setup The config array
|
||||
* @param boolean $isprofile Do we prepare a profile array?
|
||||
* @param string $name Name of the config option
|
||||
* @param string $type Type of option (text|boolean|dropdown|special|link)
|
||||
* @param string $data Current value of this option
|
||||
* @param string $set Default value of this option
|
||||
* @param string $hl Help text headline
|
||||
* @param string $help Help text
|
||||
*/
|
||||
function setup_addOption($isprofile, $name, $type,
|
||||
$data='', $set=NULL, $hl=NULL, $help=NULL)
|
||||
{
|
||||
global $config, $lang;
|
||||
global $SETUP_USER;
|
||||
|
||||
// user-specific setting?
|
||||
$isuser = in_array($name, $SETUP_USER);
|
||||
|
||||
if ($isprofile and !$isuser) return;
|
||||
|
||||
$option['isuser'] = $isuser;
|
||||
$option['name'] = $name;
|
||||
$option['type'] = $type;
|
||||
$option['data'] = $data;
|
||||
|
||||
$option['set'] = ($set) ? $set : $config[$name];
|
||||
$option['hl'] = ($hl) ? $hl : $lang['help_'.$name.'n'];
|
||||
$option['help'] = ($help) ? $help : $lang['help_'.$name];
|
||||
|
||||
return $option;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find available languages
|
||||
*/
|
||||
function setup_getLanguages()
|
||||
{
|
||||
if ($dh = opendir('language'))
|
||||
{
|
||||
while (($file = readdir($dh)) !== false)
|
||||
{
|
||||
if (preg_match("/(.*)\.php$/", $file, $matches))
|
||||
{
|
||||
$languages[$matches[1]] = $matches[1];
|
||||
}
|
||||
}
|
||||
closedir($dh);
|
||||
}
|
||||
return $languages;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find available templates/styles
|
||||
* Extended to search for template screenshots
|
||||
*
|
||||
* @author Andreas Götz <cpuidle@gmx.de>
|
||||
*/
|
||||
function setup_getTemplates(&$screenshots)
|
||||
{
|
||||
$screenshots = array();
|
||||
|
||||
if ($dh = @opendir('templates'))
|
||||
{
|
||||
while (($file = readdir($dh)) !== false)
|
||||
{
|
||||
if (preg_match("/^\./", $file)) continue;
|
||||
if (is_dir('templates/'.$file))
|
||||
{
|
||||
$template = 'templates/'.$file;
|
||||
if ($dh2 = opendir($template))
|
||||
{
|
||||
$style_name = '';
|
||||
|
||||
while (($style = readdir($dh2)) !== false)
|
||||
{
|
||||
if (preg_match("/(.*)\.css$/", $style, $matches))
|
||||
{
|
||||
$thumb = $template.'/screenshot_'.$matches[1].'.jpg';
|
||||
if (file_exists($thumb))
|
||||
{
|
||||
$screenshots[] = array('name' => "$file::".$matches[1], 'img' => $thumb);
|
||||
}
|
||||
elseif (empty($style_name))
|
||||
{
|
||||
// remember first style found
|
||||
$style_name = $matches[1];
|
||||
}
|
||||
$templates[$file.'::'.$matches[1]] = $file.' ('.$matches[1].')';
|
||||
}
|
||||
}
|
||||
closedir($dh2);
|
||||
|
||||
if ($style_name)
|
||||
{
|
||||
$thumb = $template.'/screenshot.jpg';
|
||||
if (file_exists($thumb))
|
||||
{
|
||||
$screenshots[] = array('name' => "$file::$style_name", 'img' => $thumb);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
closedir($dh);
|
||||
}
|
||||
return $templates;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mediatypes
|
||||
*/
|
||||
function setup_getMediatypes()
|
||||
{
|
||||
$SELECT = 'SELECT id, name
|
||||
FROM '.TBL_MEDIATYPES.'
|
||||
ORDER BY name';
|
||||
$result = runSQL($SELECT);
|
||||
|
||||
return array_associate($result, 'id', 'name');
|
||||
}
|
||||
|
||||
/**
|
||||
* Genres
|
||||
*/
|
||||
function setup_getGenres()
|
||||
{
|
||||
$SELECT = 'SELECT id, name
|
||||
FROM '.TBL_GENRES.'
|
||||
ORDER BY name';
|
||||
$result = runSQL($SELECT);
|
||||
|
||||
return array_associate($result, 'id', 'name');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get list of engines for default engine selection
|
||||
*/
|
||||
function setup_getEngines($engines_ary)
|
||||
{
|
||||
$engines = array();
|
||||
|
||||
foreach ($engines_ary as $engine => $meta)
|
||||
{
|
||||
if (engine_get_capability($engine, 'movie')) $engines[$engine] = $meta['name'];
|
||||
}
|
||||
|
||||
return $engines;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepare customfields
|
||||
*/
|
||||
function setup_mkCustoms()
|
||||
{
|
||||
global $config;
|
||||
global $allcustomtypes;
|
||||
|
||||
$setup_custom = '';
|
||||
|
||||
for ($i=1; $i<5; $i++)
|
||||
{
|
||||
$setup_custom .= $i.'. <input type="text" size="20" name="custom'.$i.'" id="custom'.$i.'" value="'.formvar($config['custom'.$i]).'"/>';
|
||||
$setup_custom .= '<select name="custom'.$i.'type">';
|
||||
|
||||
foreach($allcustomtypes as $ctype)
|
||||
{
|
||||
$selected = ($ctype == $config['custom'.$i.'type']) ? ' selected="selected"' : '';
|
||||
$setup_custom .= '<option value="'.$ctype.'"'.$selected.'>'.$ctype.'</option>';
|
||||
}
|
||||
$setup_custom .= '</select>';
|
||||
$setup_custom .= "<br />\n";
|
||||
}
|
||||
|
||||
return $setup_custom;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update session variables with configuration values
|
||||
*
|
||||
* @author Andreas Goetz
|
||||
*/
|
||||
function update_session()
|
||||
{
|
||||
global $listcolumns, $showtv;
|
||||
|
||||
if ($listcolumns) $_SESSION['vdb']['listcolumns'] = $listcolumns;
|
||||
if ($showtv) $_SESSION['vdb']['showtv'] = $showtv;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user