Files
MeDBia/videodb/core/custom.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

493 lines
13 KiB
PHP

<?php
/**
* Custom handlers
*
* Defines functions for displaying custom fields.
* To add your own type define input and output functions for it here. These
* functions will be called in show.php (output) and edit.php (input). You can
* get other values from these files by global'ing them into your function. See
* ed2k as an example.
*
* @todo Check if this can be moved to Smarty plugins
*
* @package Custom
* @author Andreas Gohr <a.gohr@web.de>
* @version $Id: custom.php,v 1.16 2008/10/03 14:18:04 andig2 Exp $
*/
/*
Hint:
$cn
holds the name of the custom field (eg. 'custom2') use this as the name for
the input formfield
$cv
holds the current value of that field if any. When you want to use it as
value in a formfield quote it with the formvar() function!
When you add new types send them to me. I will include them here.
*/
///////////////////////////////////////////////////////////////////////////////
/* This array contains all available types - be sure to add your type if
you ad a new one */
$allcustomtypes=array('',
'text',
'url',
'ed2k',
'language',
'orgtitle',
'movix',
'mpaa',
'bbfc',
'fsk',
'barcode',
'kijkwijzer'
);
/**
* Assigns custom field names and values to input object
* @author Andreas Goetz <cpuidle@gmx.de>
* @param hashref $video Reference to video hash structure
* @param string $inout Either in or out, determines type of control
* returned (html input control or rendered output)
*/
function customfields(&$video, $inout)
{
global $config;
$inout_function = ($inout == 'in') ? '_input' : '_output';
for ($i=1; $i < 5; $i++)
{
if (!empty($config['custom'.$i]))
{
$video['custom'.$i.'name'] = $config['custom'.$i];
$run = 'custom_'.$config['custom'.$i.'type'].$inout_function;
$custom_value = null;
if (array_key_exists('custom'.$i, $video))
{
$custom_value = $video['custom'.$i];
}
$video['custom'.$i.$inout] = $run('custom'.$i,$custom_value);
}
}
}
/**
* Custom Type:
*
* Standardinputhandler for custom fields -> just calls text type
*/
function custom__input($cn,$cv)
{
return custom_text_input($cn,$cv);
}
/**
* Custom Type:
*
* Standardoutputhandler for custom fields -> just calls text type
*/
function custom__output($cn,$cv)
{
return custom_text_output($cn,$cv);
}
/**
* Custom Type: text
*
* Standardinputhandler for custom fields
*/
function custom_text_input($cn,$cv)
{
return '<input type="text" size="45" maxlength="255" name="'.$cn.'" id="'.$cn.'" value="'.formvar($cv).'" />';
}
/**
* Custom Type: text
*
* Standardouputhandler for custom fields
*/
function custom_text_output($cn,$cv)
{
return $cv;
}
/**
* Custom Type: url
*
* Stores an URL in a custom file and shows a clickable link.
*/
function custom_url_input($cn,$cv)
{
return '<input type="text" size="45" maxlength="255" name="'.$cn.'" id="'.$cn.'" value="'.formvar($cv).'" />';
}
/**
* Custom Type: url
*
* Stores an URL in a custom file and shows a clickable link.
*/
function custom_url_output($cn,$cv)
{
if (!empty($cv))
{
return '<a href="'.$cv.'">[ Link ]</a>';
} else {
return '';
}
}
/**
* Custom Type: ed2k
*
* Stores the MD4 sum of the File in a custom file and shows a clickable ed2k
* Link for the eDonkey2000 client tools.
*/
function custom_ed2k_input($cn,$cv)
{
return '<input type="text" size="40" maxlength="255" name="'.$cn.'" id="'.$cn.'" value="'.formvar($cv).'" /> (MD4)';
}
/**
* Custom Type: ed2k
*
* Stores the MD4 sum of the File in a custom file and shows a clickable ed2k
* Link for the eDonkey2000 client tools.
*/
function custom_ed2k_output($cn,$cv)
{
global $video;
if (!empty($video[0]['filesize']) && !empty($video[0]['filename']) && !empty($cv)) {
return '<a href="ed2k://|file|'.$video[0]['filename'].'|'.$video[0]['filesize'].'|'.$cv.'|">[ Add to eDonkey ]</a>';
} else {
return '';
}
}
/**
* Custom Type: language
*
* Language Selection with Quickselectionbuttons configured in
* $config['languages']
*/
function custom_language_input($cn,$cv)
{
global $config;
$output = '';
$output .= '<input type="text" size="15" maxlength="255" name="'.$cn.'" id="'.$cn.'" value="'.formvar($cv).'" /> ';
foreach ($config['languages'] as $flag)
{
$output .= '<a href="#" title="set to '.$flag.'" onclick="document.edi.'.$cn.'.value=\''.$flag.'\'">';
$output .= '<img src="'.img('flags/'.$flag.'.gif').'" border="0" alt="'.formvar($cv).'" /></a> ';
}
return $output;
}
/**
* Custom Type: language
*
* Language Selection with Quickselectionbuttons configured in
* $config[languages]
*/
function custom_language_output($cn,$cv)
{
return custom_text_output($cn,$cv);
}
/**
* Custom Type: FSK
*
* Allows you to set the FSK Rating of a movie.
*
* @author Chinamann <chinamann@users.sourceforge.net>
*/
function custom_fsk_input($cn,$cv)
{
return custom_text_input($cn,$cv);
}
/**
* Custom Type: FSK
*
* Allows you to display the FSK Rating.
*
* @author Chinamann <chinamann@users.sourceforge.net>
*/
function custom_fsk_output($cn,$cv)
{
$allfsktypes = array('0','6','12','16','18');
if (!in_array ($cv, $allfsktypes))
{
return custom_text_output($cn,$cv);
}
return '<a href="search.php?q='.$cv.'&fields='.$cn.'"><img border="0" src="'.img('r_'.$cv.'.gif').'" width="50" height="50" /></a>';
}
/**
* Custom Type: Barcode
*
* Allows you to input the Barcode of a movie.
*
* @author Chinamann <chinamann@users.sourceforge.net>
*/
function custom_barcode_input($cn,$cv)
{
return custom_text_input($cn,$cv);
}
/**
* Custom Type: Barcode
*
* Allows you to display Barcode.
*
* @author Chinamann <chinamann@users.sourceforge.net>
*/
function custom_barcode_output($cn,$cv)
{
return custom_text_output($cn,$cv);
}
/**
* Custom Type: Originaltitle
*
* Holds the Original title of an movie
*
* @author Stephan Zalewski <stephan-01@gmx.de>
*/
function custom_orgtitle_input($cn,$cv)
{
global $config;
global $imdbdata;
global $id;
if (empty($cv)|| $config['lookupdefault_edit'] > 0 || $config['lookupdefault_new'] > 0)
{
if (!empty($imdbdata['title'])) {$cv .= ' - '.$imdbdata['title'];}
if (!empty($imdbdata['subtitle'])) {$cv .= ' - '.$imdbdata['subtitle'];}
// we need to save our self here!
if (!empty($id) && $cv != '')
{
$qcv = escapeSQL($cv);
$UPDATE = "UPDATE ".TBL_DATA." SET $cn = '$qcv' WHERE id = $id";
runSQL($UPDATE);
}
}
return custom_text_input($cn,$cv);
}
/**
* Custom Type: Originaltitle
*
* Holds the Original title of an movie
*
* @author Stephan Zalewski <stephan-01@gmx.de>
*/
function custom_orgtitle_output($cn,$cv)
{
return custom_text_output($cn,$cv);
}
/**
* Custom Type: Movix
*
* Allows you to indicate if a movie is stored in a cd/dvd
* with movix (http://movix.sourceforge.net/)
*
* @author Antonio Giungato <antonio_giungato@libero.it>
*/
function custom_movix_input($cn,$cv)
{
$output ='<select name="'.$cn.'">
<option selected value=""></option>
<option value="eMovix">eMovix</option>
<option value="Movix">Movix</option>
<option value="Movix²">Movix²</option>
</select>';
return $output;
}
function custom_movix_output($cn,$cv)
{
return custom_text_output($cn,$cv);
}
/**
* Custom Type: MPAA
*
* Show the MPAA rating of a movie
*
* @author Tim M. Sanders <tsanders@thesanders.org>
*/
function custom_mpaa_input($cn,$cv)
{
global $config;
global $imdbdata;
global $id;
if (empty($cv)|| $config['lookupdefault_edit'] > 0 || $config['lookupdefault_new'] > 0)
{
if (!empty($imdbdata['mpaa'])) {$cv .= $imdbdata['mpaa'];}
//we need to save our self here!
if(!empty($id) && $cv != '')
{
$qcv = escapeSQL($cv);
$UPDATE = "UPDATE ".TBL_DATA." SET $cn = '$qcv' WHERE id = $id";
runSQL($UPDATE);
}
}
$output = '<input type="text" size="50" maxlength="255" name="'.$cn.'" id="'.$cn.'" value="'.formvar($cv).'" /> ';
return $output;
}
/**
* Custom Type: MPAA
*
* Show the MPAA rating of a movie
*
* @author Tim M. Sanders <tsanders@thesanders.org>
*/
function custom_mpaa_output($cn,$cv)
{
global $imdbdata;
global $id;
$ratings = array('R' => 'mpaa-R.gif',
'NC-17' => 'mpaa-NC-17.gif',
'PG-13' => 'mpaa-PG-13.gif',
'PG' => 'mpaa-PG.gif',
'G' => 'mpaa-G.gif');
$output = custom_text_output($cn,$cv);
foreach ($ratings as $rating => $image)
{
if (strstr($output, $rating))
{
$output .= '<br/><img src="'.img($image).'" alt="'.$rating.'"/>';
break;
}
}
return $output;
}
/**
* Custom Type: BBFC
*
* Show the BBFC rating of a movie
* Based on the MPAA ratings above
*
* @author Colin Ogilvie <csogilvie@users.sourceforge.net>
*/
function custom_bbfc_input($cn,$cv)
{
global $config;
global $imdbdata;
global $id;
if (empty($cv)|| $config['lookupdefault_edit'] > 0 || $config['lookupdefault_new'] > 0)
{
$cv = $imdbdata['bbfc'];
if (!empty($imdbdata['bbfc'])) $cv .= $imdbdata['bbfc'];
//we need to save our self here!
if(!empty($id) && $cv != '')
{
$qcv = escapeSQL($cv);
$UPDATE = "UPDATE ".TBL_DATA." SET $cn = '$qcv' WHERE id = $id";
runSQL($UPDATE);
}
}
$output = '<input type="text" size="10" maxlength="4" name="'.$cn.'" id="'.$cn.'" value="'.formvar($cv).'" />';
$output .= " <a href='#' onclick='document.edi.".$cn.".value=\"U\"'>U</a>";
$output .= " <a href='#' onclick='document.edi.".$cn.".value=\"12\"'>12</a>";
$output .= " <a href='#' onclick='document.edi.".$cn.".value=\"12A\"'>12A</a>";
$output .= " <a href='#' onclick='document.edi.".$cn.".value=\"15\"'>15</a>";
$output .= " <a href='#' onclick='document.edi.".$cn.".value=\"18\"'>18</a>";
$output .= " <a href='#' onclick='document.edi.".$cn.".value=\"PG\"'>PG</a>";
return $output;
}
/**
* Custom Type: BBFC
*
* Show the BBFC rating of a movie
* Based on the MPAA ratings above
*
* @author Colin Ogilvie <csogilvie@users.sourceforge.net>
*/
function custom_bbfc_output($cn,$cv)
{
global $imdbdata;
global $id;
$ratings = array('PG' => 'bbfc-PG.gif',
'12A' => 'bbfc-12A.gif',
'12' => 'bbfc-12.gif',
'15' => 'bbfc-15.gif',
'18' => 'bbfc-18.gif',
'U' => 'bbfc-U.gif');
$output = custom_text_output($cn,$cv);
foreach ($ratings as $rating => $image)
{
if (strstr($output, (string) $rating))
{
$output = '<img src="'.img($image).'" alt="'.$rating.'"/>';
break;
}
}
return $output;
}
function custom_kijkwijzer_kijkwijzerdata () {
return [
'AL' => [1, 'Alle leeftijden', 'kijkwijzer/al.png', ''],
'06' => [2, '6 jaar', 'kijkwijzer/6.png', ''],
'09' => [4, '9 jaar', 'kijkwijzer/9.png', ''],
'12' => [8, '12 jaar', 'kijkwijzer/12.png', ''],
'14' => [16, '14 jaar', 'kijkwijzer/14.png', ''],
'16' => [32, '16 jaar', 'kijkwijzer/16.png', ''],
'18' => [64, '18 jaar', 'kijkwijzer/18.png', ''],
'AN' => [128, 'Angst', 'kijkwijzer/angst.png', ''],
'DI' => [256, 'Discriminatie', 'kijkwijzer/discriminatie.png', ''],
'DA' => [512, 'Roken, alcohol en drugs', 'kijkwijzer/drugs-en-alcohol.png', ''],
'GE' => [1024, 'Geweld', 'kijkwijzer/geweld.png', ''],
'SE' => [2048, 'Seks', 'kijkwijzer/seks.png', ''],
'TA' => [4096, 'Grof taalgebruik', 'kijkwijzer/taal.png', '']
];
}
function custom_kijkwijzer_input ($cn, $cv) {
$kijkwijzer = custom_kijkwijzer_kijkwijzerdata();
$output = '<input type="text" size="10" maxlength="4" name="'.$cn.'" id="'.$cn.'" value="'.formvar($cv).'" />';
foreach ($kijkwijzer as $val => $cfg) {
$output .= " <a href='#' onclick='document.edi.".$cn.".value+=\"".$val." \"' title='".$cfg[1]."'><img src=\"".img($cfg[2])."\" alt=\"Kijkwijzer: ".$cfg[1]."\" data-desc=\"".$cfg[3]."\" width=\"32\" /></a>";
}
return $output;
}
function custom_kijkwijzer_output ($cn, $cv, $sm = false) {
$kijkwijzer = custom_kijkwijzer_kijkwijzerdata();
$rv = '';
$cv = explode(' ', trim($cv));
foreach ($cv as $i) {
if (isset($kijkwijzer[$i])) {
$rv .= '<img src="' . img($kijkwijzer[$i][2]) . '" alt="Kijkwijzer: ' . $kijkwijzer[$i][1] . '" title="' . $kijkwijzer[$i][1] . '" width="' . ($sm ? 24 : 48) . '" />';
}
}
return $rv;
}