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

176 lines
5.3 KiB
PHP

<?php
/**
* Statistics
*
* Shows general statistics about the database
*
* @package videoDB
* @author Andreas Gohr <a.gohr@web.de>
* @version $Id: stats.php,v 2.25 2009/04/04 16:22:56 andig2 Exp $
*/
require_once './core/functions.php';
/*
* Helper function for comparing an associative array by it's 'count' values
*/
function compare_count($a, $b)
{
return strnatcasecmp($b['count'], $a['count']);
}
/*
* De-uniquify multi-language statistics
*
* Makes sure videos with mulitple languages are count once for each language
* contained instead of once for a unique combination
*
* @param array $langs array of all languages from
*/
function collapse_multiple_languages($langs)
{
$templangs = array();
foreach($langs as $key => $val)
{
$lang_ary = preg_split('/,\s*/', $val['language']);
foreach($lang_ary as $numid => $lang)
{
// take care of english vs. English
$lang = ucwords($lang);
$templangs[$lang]['language'] = $lang;
if (!array_key_exists('count', $templangs[$lang]))
{
$templangs[$lang]['count'] = 0;
}
$templangs[$lang]['count'] += $val['count'];
}
}
usort($templangs, 'compare_count');
return $templangs;
}
/**
* input
*/
$owner = req_string('owner');
$WHERES = null; // init
if ($config['multiuser'])
{
// get owner from session- or use current user
session_default_owner();
// build html select box
$all = strtoupper($lang['radio_all']);
$smarty->assign('owners', out_owners(array($lang['filter_any'] => $lang['filter_any']), PERM_READ));
$smarty->assign('owner', $owner);
// further limit to single owner
if ($owner == $lang['filter_any'])
$WHERES .= " AND owner_id IN (".get_owner_ids(PERM_READ).")";
else
$WHERES .= " AND owner_id = '".get_userid($owner)."'";
}
// Don't count movies which are on the wishlist
$WHERES .= ' AND mediatype != '.MEDIA_WISHLIST;
$result = runSQL('SELECT COUNT(*) AS count FROM '.TBL_DATA.' WHERE 1=1'.$WHERES);
$stats['count_all'] = $result[0]['count'];
$result = runSQL('SELECT COUNT(*) AS count FROM '.TBL_DATA.' WHERE istv = 1'.$WHERES);
$stats['count_tv'] = $result[0]['count'];
$result = runSQL('SELECT DISTINCT diskid FROM '.TBL_DATA.' WHERE 1=1'.$WHERES);
$stats['count_disk'] = count($result);
$result = runSQL('SELECT AVG(filesize) AS afs FROM '.TBL_DATA.' WHERE filesize > 0'.$WHERES);
$stats['avg_size'] = round(($result[0]['afs'])/(1024*1024), 2);
$result = runSQL('SELECT SUM(filesize) AS sfs,
AVG(runtime) AS art,
SUM(runtime) AS srt
FROM '.TBL_DATA.' WHERE 1=1'.$WHERES);
$stats['sum_size'] = round(($result[0]['sfs'])/(1024*1024*1024), 2);
$stats['avg_time'] = round($result[0]['art'], 2);
$stats['sum_time'] = round(($result[0]['srt'])/60, 2);
$result = runSQL('SELECT SUM(runtime) AS srt FROM '.TBL_DATA.'
LEFT JOIN '.TBL_USERSEEN.' ON '.TBL_DATA.'.id = '.TBL_USERSEEN.'.video_id AND '.TBL_USERSEEN.'.user_id = '.get_current_user_id().'
WHERE !ISNULL('.TBL_USERSEEN.'.video_id)'.$WHERES);
$stats['seen_time'] = round($result[0]['srt']/60, 2);
$result = runSQL('SELECT A.name, COUNT(*) AS count, A.id
FROM '.TBL_GENRES.' A, '.TBL_VIDEOGENRE.' B, '.TBL_DATA.' C
WHERE B.genre_id = A.id
AND B.video_id = C.id'.$WHERES.'
GROUP BY A.name, A.id
ORDER BY count DESC');
$stats['count_genre'] = $result;
$result = runSQL('SELECT A.name, COUNT(*) AS count, A.id
FROM '.TBL_MEDIATYPES.' A, '.TBL_DATA.' B
WHERE B.mediatype = A.id'.$WHERES.'
GROUP BY A.name, A.id
ORDER BY count DESC');
$stats['count_media'] = $result;
$result = runSQL('SELECT language, COUNT(*) AS count
FROM '.TBL_DATA.' WHERE 1=1'.$WHERES.'
GROUP BY language
ORDER BY count DESC');
$stats['count_lang'] = collapse_multiple_languages($result);
$result = runSQL('SELECT video_codec, COUNT(*) AS count
FROM '.TBL_DATA.' WHERE 1=1'.$WHERES.'
GROUP BY video_codec
ORDER BY count DESC');
$stats['count_vcodec'] = $result;
$result = runSQL('SELECT audio_codec, COUNT(*) AS count
FROM '.TBL_DATA.' WHERE 1=1'.$WHERES.'
GROUP BY audio_codec
ORDER BY count DESC');
$stats['count_acodec'] = $result;
// year statistics
$result = runSQL('SELECT year, COUNT(*) AS count
FROM '.TBL_DATA.'
WHERE year > 0'.$WHERES.'
GROUP BY year
ORDER BY year');
$minyear = $result[0]['year'];
$maxyear = $result[count($result)-1]['year'];
for ($i = $minyear; $i <= $maxyear; $i++)
{
$years[$i] = 0;
}
$maxcount = 0;
if (is_array($result))
{
foreach ($result AS $year)
{
$years[$year['year']] = $year['count'];
if ($year['count'] > $maxcount) $maxcount = $year['count'];
}
}
$stats['count_year'] = $years;
$stats['first_year'] = $minyear;
$stats['last_year'] = $maxyear;
$stats['max_count'] = $maxcount;
// prepare templates
tpl_page();
$smarty->assign('stats', $stats);
// display templates
tpl_display('stats.tpl');