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

459 lines
22 KiB
PHP

<?php
/**
* XLS Export functions
*
* Allows exporting movies to an Excel list
* Requires Spreadsheet_Excel_Writer libaray (http://pear.php.net)
*
* @package Core
* @link http://pear.php.net/package/Spreadsheet_Excel_Writer
* @author Chinamann <chinamann@users.sourceforge.net>
* @author Andreas Götz <cpuidle@gmx.de>
* @version $Id: xls.php,v 1.8 2008/01/05 13:50:29 andig2 Exp $
*/
require_once './core/functions.php';
require_once './core/export.core.php';
require_once './engines/engines.php';
#error_reporting(E_ALL^E_NOTICE);
require_once 'vendor/autoload.php';
/**
* Export PDF document
*
* @param string $where WHERE clause for SQL statement
*/
function xlsexport($WHERE)
{
global $config, $lang;
$text_length = 256-3;
// videodb context dir
$context_dir = preg_replace('/^(.*)\/.*?$/','\\1',$_SERVER["SCRIPT_FILENAME"]);
// array of temp files wich have to be deleted if workbook is closed
$del_list = array();
// make shure we have list with extra fields, even if empty
$extra_fields = array_map('trim', explode(",", $config['xls_extra_fields']));
// Creating a workbook
$workbook = new Spreadsheet_Excel_Writer();
$workbook->setCustomColor(12, 192,192,192); // Headline
$workbook->setCustomColor(13, 255,255,200); // Seen
$workbook->setCustomColor(14, 255,220,220); // Lent
//$workbook->setCustomColor(15, 0,0,0); // Test
// sending HTTP headers
$outputFilename = ($config['xls_output_filename']) ? $config['xls_output_filename'] : 'VideoDB';
$workbook->send($outputFilename.'.xls');
// Creating a worksheet
$sheetTitle = ($config['xls_sheet_title']) ? $config['xls_sheet_title'] : 'VideoDB';
$worksheet =& $workbook->addWorksheet($sheetTitle);
// format templates
$alignLeftFormatNormal =& $workbook->addFormat();
$alignLeftFormatLent =& $workbook->addFormat(array('Pattern' => 1));
$alignLeftFormatLent -> setFGColor(14);
$alignRightFormatNormal =& $workbook->addFormat(array('Align' => 'right'));
$alignRightFormatLent =& $workbook->addFormat(array('Align' => 'right', 'Pattern' => 1));
$alignRightFormatLent -> setFgColor(14);
$alignCenterFormatNormal =& $workbook->addFormat(array('Align' => 'center'));
$alignCenterFormatLent =& $workbook->addFormat(array('Align' => 'center', 'Pattern' => 1));
$alignCenterFormatLent -> setFgColor(14);
$titleFormatNormal =& $workbook->addFormat(array('Bold' => 1));
$titleFormatUnseen =& $workbook->addFormat(array('Bold' => 1, 'Pattern' => 1));
$titleFormatUnseen -> setFgColor(13);
$titleFormatLent =& $workbook->addFormat(array('Bold' => 1, 'Pattern' => 1));
$titleFormatLent -> setFgColor(14);
$plotFormatNormal =& $workbook->addFormat(array('Align' => 'top'));
$plotFormatNormal -> setTextWrap();
$plotFormatLent =& $workbook->addFormat(array('Align' => 'top','Pattern' => 1));
$plotFormatLent -> setTextWrap();
$plotFormatLent -> setFgColor(14);
$headlineFormat =& $workbook->addFormat(array('Bold' => 1, 'Align' => 'center', 'Pattern' => 1));
$headlineFormat ->setFgColor(12);
$rowindex = 0;
$columnindex = 0;
if ($config['xls_show_headline'])
{
$worksheet->setRow(0, 30);
$rowindex++;
}
// get data (see http://pear.php.net/bugs/bug.php?id=1572)
$result = iconv_array('utf-8', 'iso-8859-1', exportData($WHERE));
foreach ($result as $row)
{
$columnindex = 0;
set_time_limit(300); // rise per movie execution timeout limit if safe_mode is not set in php.ini
if (!empty($row['lentto']) && $config['xls_mark_lent']) {
$alignLeftFormat = $alignLeftFormatLent;
$alignCenterFormat = $alignLeftFormatLent;
$alignRightFormat = $alignLeftFormatLent;
}
else
{
$alignLeftFormat = $alignLeftFormatNormal;
$alignCenterFormat = $alignLeftFormatNormal;
$alignRightFormat = $alignLeftFormatNormal;
}
$worksheet->setRow($rowindex, 15, $alignLeftFormat);
foreach ($extra_fields as $field)
{
$isNote = false;
$walks = 1;
if (preg_match('/(.+)\((.+)\)/',$field,$matches))
{
$field = trim($matches[1]);
$note = trim($matches[2]);
$walks = 2;
}
for ($walk = 0;$walk < $walks; $walk++)
{
if ($walk == 1)
{
$isNote = true;
$field = $note;
$columnindex--;
}
// title
if ($field == "title")
{
// headline
if ($config['xls_show_headline'] && $rowindex == 1 && !$isNote)
$worksheet->writeString( 0, $columnindex, $lang['title'], $headlineFormat);
$title = $row['title'];
if ($row['subtitle']) $title .= ' - '.$row['subtitle'];
if ($isNote) $worksheet->writeNote($rowindex, $columnindex++, $lang['title'].":\n".html_entity_decode($title));
else {
if ($row['seen'] == '0' && $config['xls_mark_unseen']) $format = $titleFormatUnseen;
elseif (!empty($row['lentto']) && $config['xls_mark_lent']) $format = $titleFormatLent;
else $format = $titleFormatNormal;
if ($rowindex == 1) $worksheet->setColumn($columnindex, $columnindex, 50);
$imdb = $row['imdbID'];
$link = ($imdb) ? engineGetContentUrl($imdb, engineGetEngine($imdb)) : '';
if($link <> '') $worksheet->writeUrl($rowindex, $columnindex, $link, html_entity_decode($title), $format);
else $worksheet->writeString($rowindex, $columnindex, leftString(html_entity_decode($row['title']),$text_length), $format);
}
$columnindex++;
}
// plot
elseif ($field == "plot")
{
// headline
if ($config['xls_show_headline'] && $rowindex == 1 && !$isNote)
$worksheet->writeString( 0, $columnindex, $lang['plot'], $headlineFormat);
if ($isNote) $worksheet->writeNote($rowindex, $columnindex++, leftString(html_entity_decode($row['plot']),$text_length));
else
{
if (!empty($row['lentto']) && $config['xls_mark_lent']) $format = $plotFormatLent;
else $format = $plotFormatNormal;
if ($rowindex == 1) $worksheet->setColumn($columnindex, $columnindex, 50);
$worksheet->writeString($rowindex, $columnindex++, leftString(html_entity_decode($row['plot']),$text_length), $format);
}
}
// DiskId
elseif ($field == "diskid")
{
// headline
if ($config['xls_show_headline'] && $rowindex == 1 && !$isNote)
$worksheet->writeString( 0, $columnindex, $lang['diskid'], $headlineFormat);
if ($isNote) $worksheet->writeNote($rowindex, $columnindex++, $lang['diskid'].":\n".html_entity_decode($row['diskid']));
else
{
if ($rowindex == 1) $worksheet->setColumn($columnindex, $columnindex, 7);
$worksheet->writeString($rowindex, $columnindex++, html_entity_decode($row['diskid']), $alignCenterFormat);
}
}
// add language
elseif ($field == "language")
{
// headline
if ($config['xls_show_headline'] && $rowindex == 1 && !$isNote)
$worksheet->writeString( 0, $columnindex, $lang['language'], $headlineFormat);
if ($isNote) $worksheet->writeNote($rowindex, $columnindex++, $lang['language'].":\n".html_entity_decode($row['language']));
else
{
if ($rowindex == 1) $worksheet->setColumn($columnindex, $columnindex, 30);
$worksheet->writeString($rowindex, $columnindex++, html_entity_decode($row['language']), $alignLeftFormat);
}
}
// add mediatype
elseif ($field == "mediatype")
{
// headline
if ($config['xls_show_headline'] && $rowindex == 1 && !$isNote)
$worksheet->writeString( 0, $columnindex, $lang['mediatype'], $headlineFormat);
if ($isNote) $worksheet->writeNote($rowindex, $columnindex++, $lang['mediatype'].":\n".html_entity_decode($row['mediatype']));
else
{
if ($rowindex == 1) $worksheet->setColumn($columnindex, $columnindex, 7);
$worksheet->writeString($rowindex, $columnindex++, html_entity_decode($row['mediatype']), $alignLeftFormat);
}
}
// genres
elseif ($field == "genres")
{
// headline
if ($config['xls_show_headline'] && $rowindex == 1 && !$isNote)
$worksheet->writeString( 0, $columnindex, $lang['genres'], $headlineFormat);
if (count($row['genres']))
{
$output_genres = array();
foreach ($row['genres'] as $genre)
{
$output_genres[]= html_entity_decode($genre['name']);
}
if ($isNote) $worksheet->writeNote($rowindex, $columnindex++, $lang['genres'].":\n".join(", ", $output_genres));
else
{
if ($rowindex == 1) $worksheet->setColumn($columnindex, $columnindex, 20);
$worksheet->writeString($rowindex, $columnindex, join(", ", $output_genres), $alignCenterFormat);
}
}
$columnindex++;
}
// runtime
elseif ($field == "runtime")
{
// headline
if ($config['xls_show_headline'] && $rowindex == 1 && !$isNote)
$worksheet->writeString( 0, $columnindex, $lang['runtime'], $headlineFormat);
if ($row['runtime'])
{
if ($isNote) $worksheet->writeNote($rowindex, $columnindex++, $lang['runtime'].":\n".html_entity_decode($row['runtime']).' min');
else
{
if ($rowindex == 1) $worksheet->setColumn($columnindex, $columnindex, 7);
$worksheet->writeString($rowindex, $columnindex, html_entity_decode($row['runtime']).' min', $alignRightFormat);
}
}
$columnindex++;
}
// year
elseif ($field == "year")
{
// headline
if ($config['xls_show_headline'] && $rowindex == 1 && !$isNote)
$worksheet->writeString( 0, $columnindex, $lang['year'], $headlineFormat);
if ($row['year'] != '0000')
{
if ($isNote) $worksheet->writeNote($rowindex, $columnindex++, $lang['year'].":\n".html_entity_decode($row['year']));
else
{
if ($rowindex == 1) $worksheet->setColumn($columnindex, $columnindex, 7);
$worksheet->writeNumber($rowindex, $columnindex, html_entity_decode($row['year']), $alignCenterFormat);
}
}
$columnindex++;
}
// owner
elseif ($field == "owner")
{
// headline
if ($config['xls_show_headline'] && $rowindex == 1 && !$isNote)
$worksheet->writeString( 0, $columnindex, $lang['owner'], $headlineFormat);
if ($isNote) $worksheet->writeNote($rowindex, $columnindex++, $lang['owner'].":\n".html_entity_decode($row['owner']));
else
{
if ($rowindex == 1) $worksheet->setColumn($columnindex, $columnindex, 15);
$worksheet->writeString($rowindex, $columnindex++, html_entity_decode($row['owner']), $alignCenterFormat);
}
}
// lent
elseif ($field == "lent")
{
// headline
if ($config['xls_show_headline'] && $rowindex == 1 && !$isNote)
$worksheet->writeString( 0, $columnindex, $lang['lentto'], $headlineFormat);
if ($isNote) $worksheet->writeNote($rowindex, $columnindex++, $lang['lentto'].":\n".html_entity_decode($row['lentto']));
else
{
if ($rowindex == 1) $worksheet->setColumn($columnindex, $columnindex, 15);
$worksheet->writeString($rowindex, $columnindex++, html_entity_decode($row['lentto']), $alignCenterFormat);
}
}
// seen
elseif ($field == "seen")
{
// headline
if ($config['xls_show_headline'] && $rowindex == 1 && !$isNote)
$worksheet->writeString( 0, $columnindex, $lang['seen'], $headlineFormat);
if ($isNote) {
if ($row['seen'] == 1) $worksheet->writeNote($rowindex, $columnindex++, html_entity_decode($lang['seen']));
else $columnindex++;
}
else
{
if ($rowindex == 1) $worksheet->setColumn($columnindex, $columnindex, 2);
if ($row['seen'] == 1) $worksheet->writeString($rowindex, $columnindex++, "X", $alignCenterFormat); else $columnindex++;
}
}
// insertdate
elseif ($field == "insertdate")
{
// headline
if ($config['xls_show_headline'] && $rowindex == 1 && !$isNote)
$worksheet->writeString( 0, $columnindex, $lang['date'], $headlineFormat);
if ($isNote) $worksheet->writeNote($rowindex, $columnindex++, $lang['date'].":\n".html_entity_decode(preg_replace('/^([0-9]{4}\-[0-9]{2}\-[0-9]{2}).*/','$1',$row['created'])));
else
{
if ($rowindex == 1) $worksheet->setColumn($columnindex, $columnindex, 10);
$worksheet->write($rowindex, $columnindex++, html_entity_decode(preg_replace('/^([0-9]{4}\-[0-9]{2}\-[0-9]{2}).*/','$1',$row['created'])), $alignCenterFormat);
}
}
// custom fields
elseif(preg_match("/^custom[0-4]$/",$field))
{
// headline
if ($config['xls_show_headline'] && $rowindex == 1 && !$isNote)
$worksheet->writeString( 0, $columnindex, $config[$field], $headlineFormat);
//$row[$field] = html_entity_decode($row[$field]);
switch ($config[$field.'type'])
{
case 'ed2k':
if ($isNote) $worksheet->writeNote($rowindex, $columnindex++, $config[$field].":\n".html_entity_decode($row[$field]));
else
{
if ($rowindex == 1) $worksheet->setColumn($columnindex, $columnindex, 12);
$worksheet->writeUrl($rowindex, $columnindex++, html_entity_decode($row[$field]), 'ED2K-Link', $alignCenterFormat);
}
break;
case 'language':
if ($isNote) $worksheet->writeNote($rowindex, $columnindex++, $config[$field].":\n".html_entity_decode($row[$field]));
else
{
if ($rowindex == 1) $worksheet->setColumn($columnindex, $columnindex, 30);
$worksheet->writeString($rowindex, $columnindex++, html_entity_decode($row[$field]), $alignLeftFormat);
}
break;
case 'rating':
if ($row[$field]) $rating = html_entity_decode($row[$field]).'/10'; else $rating = "";
if ($isNote)
{
if ($row[$field]) $worksheet->writeNote($rowindex, $columnindex, $config[$field].":\n".$rating);
$columnindex++;
}
else
{
if ($rowindex == 1) $worksheet->setColumn($columnindex, $columnindex, 7);
if ($row[$field]) $worksheet->writeString($rowindex, $columnindex, $rating,$alignCenterFormat);
$columnindex++;
}
break;
case 'fsk':
if (preg_match("/[0-9]+/",$row[$field]) && !preg_match("/[^0-9]+/",$row[$field]))
{
$fskstr = 'FSK'.html_entity_decode($row[$field]);
}
else $fskstr = html_entity_decode($row[$field]);
if ($isNote) $worksheet->writeNote($rowindex, $columnindex++, $config[$field].":\n".$fskstr);
else
{
if ($rowindex == 1) $worksheet->setColumn($columnindex, $columnindex, 7);
$worksheet->writeString($rowindex, $columnindex++, $fskstr, $alignCenterFormat);
}
break;
case 'barcode':
if ($isNote) $worksheet->writeNote($rowindex, $columnindex++, $config[$field].":\n".html_entity_decode($row[$field]));
else
{
if ($rowindex == 1) $worksheet->setColumn($columnindex, $columnindex, 15);
$worksheet->writeString($rowindex, $columnindex++, html_entity_decode($row[$field]), $alignCenterFormat);
}
break;
case 'orgtitle':
if ($isNote)
{
if (!empty($row[$field])) $worksheet->writeNote($rowindex, $columnindex, $config[$field]. ":\n".html_entity_decode($row[$field]));
$columnindex++;
}
else
{
if ($rowindex == 1) $worksheet->setColumn($columnindex, $columnindex, 50);
$worksheet->writeString($rowindex, $columnindex++, html_entity_decode($row[$field]), $alignLeftFormat);
}
break;
case 'movix':
if ($isNote) $worksheet->writeNote($rowindex, $columnindex++, $config[$field].":\n ".html_entity_decode($row[$field]));
else
{
if ($rowindex == 1) $worksheet->setColumn($columnindex, $columnindex, 7);
$worksheet->writeString($rowindex, $columnindex++, html_entity_decode($row[$field]), $alignCenterFormat);
}
break;
case 'mpaa':
if ($isNote) $worksheet->writeNote($rowindex, $columnindex++, $config[$field].":\n".html_entity_decode($row[$field]), $alignCenterFormat);
else
{
if ($rowindex == 1) $worksheet->setColumn($columnindex, $columnindex, 12);
$worksheet->writeString($rowindex, $columnindex++, html_entity_decode($row[$field]), $alignCenterFormat);
}
break;
case 'bbfc':
if ($isNote) $worksheet->writeNote($rowindex, $columnindex++, $config[$field].":\n".html_entity_decode($row[$field]));
else
{
if ($rowindex == 1) $worksheet->setColumn($columnindex, $columnindex, 7);
$worksheet->writeString($rowindex, $columnindex++, html_entity_decode($row[$field]), $alignCenterFormat);
}
break;
default: // unknown
if ($isNote) $worksheet->writeNote($rowindex, $columnindex++, $config[$field].":\n".html_entity_decode($row[$field]));
else
{
$worksheet->writeString($rowindex, $columnindex++, html_entity_decode($row[$field]), $alignLeftFormat);
}
break;
}
}
} //End of walk
}
$rowindex++;
}
// Let's send the file
$workbook->close();
}
?>