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

131 lines
3.6 KiB
PHP

<?php
/**
* Image loader
*
* Loads an image from the net and creates a chachefile for it.
*
* @package videoDB
* @author Andreas Gohr <a.gohr@web.de>
* @version $Id: img.php,v 2.29 2013/03/10 16:24:32 andig2 Exp $
*/
require_once './core/functions.php';
require_once './core/httpclient.php';
/**
* input
*/
$name = req_string('name');
$actorid = req_string('actorid');
$url = req_url('url');
/*
* Note:
*
* We don't clear overage thumbnails. Instead,
* the table entries will be replaced when an image is finally available
*/
// since we don't need session functionality, use this as workaround
// for php bug #22526 session_start/popen hang
session_write_close();
/**
* amazon workaround for 1 pixel transparent images
*/
function checkAmazonSmallImage($url, $ext, $file)
{
global $config;
if (preg_match('/^(.+)L(Z{7,}.+)$/', $url, $m))
{
if (list($width, $height, $type, $attr) = getimagesize($file)) {
if ($width <= 1) {
$smallurl = $m[1].'M'.$m[2];
if (cache_file_exists($smallurl, $cache_file, CACHE_IMG, $ext) ||
download($smallurl, $cache_file)) {
copy($cache_file, $file);
}
}
}
}
}
// default - no url given or no image
$file = img();
// Get imgurl for the actor
if ($name)
{
require_once './engines/engines.php';
// name given
$name = html_entity_decode($name);
if ( $config['debug'] )
{
// save data to pass to functions.php - erropage
// if engineActor fails in httpclient it goes directly to errorpage which loses
// message set in httpCLient
// this is a cause of broken actor images appearing
$savedata_for_errorpage = 'Module->img.php, Name->'.$name.', Actorid->'.$actorid;
}
$result = engineActor($name, $actorid, engineGetActorEngine($actorid));
if ( $config['debug'] )
{
unset($savedata_for_errorpage);
}
if (!empty($result))
{
$url = $result[0][1];
if (preg_match('/nohs(-[f|m])?.gif$/', $url)) {
// imdb no-image picture
$url = '';
}
}
// write actor last checked record
// NOTE: this is only called if the template preparation has determined the actor record needs checking
{
// write only if HTTP lookup physically successful
$SQL = 'REPLACE '.TBL_ACTORS." (name, imgurl, actorid, checked)
VALUES ('".escapeSQL($name)."', '".escapeSQL($url)."', '".escapeSQL($actorid)."', NOW())";
runSQL($SQL);
}
}
// Get cached image for the given url
if (!is_null($url) && preg_match('/\.(jpe?g|gif|png)$/i', $url, $matches))
{
// calculate cache filename if we're not looking into the cache again- otherwise this is done by cache_file_exists
// $file is further needed for downloading the file
// This is only effective if function is enabled in getThumbnail function
# if ($cache_ignore) $file = cache_get_filename($url, CACHE_IMG, $matches[1]));
// does the cache file exist?
if (cache_file_exists($url, $targetfile, CACHE_IMG, $matches[1])) {
// amazon workaround for 1 pixel transparent images
checkAmazonSmallImage($url, $matches[1], $targetfile);
}
// try to download and make sure it's really an image
else {
download($url, $targetfile);
}
// double-check this is really an image
if (@exif_imagetype($targetfile)) {
// success- the result is an actual image
$file = $targetfile;
}
}
// fix url for redirect
$file = preg_replace('/img\.php$/', $file, $_SERVER['PHP_SELF']);
header('Location: '.$file);