Files
MeDBia/videodb/core/setup.core.php
Malin f55c91276e 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>
2026-05-11 09:49:52 +02:00

357 lines
12 KiB
PHP

<?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;
}