streaming-website/command/download.php
Florian Larysch 12f16414b7 downloader: handle conferences without end date
Some conferences might not have an end date, but might be disabled in
their config nonetheless. This leads to a situation which causes a null
dereference in the downloader code.

Fix this by not downloading data for conferences in such a state, as it
stands to reason that we don't care about them anymore if we explicitly
disabled them.
2017-10-06 13:33:36 +02:00

201 lines
4.2 KiB
PHP

<?php
$conf = $GLOBALS['CONFIG']['DOWNLOAD'];
if(isset($conf['REQUIRE_USER']))
{
if(get_current_user() != $conf['require-user'])
{
stderr(
'Not downloading files for user %s, run this script as user %s',
get_current_user(),
$conf['require-user']
);
exit(2);
}
}
$conferences = Conferences::getConferences();
if(isset($conf['MAX_CONFERENCE_AGE']))
{
$months = intval($conf['MAX_CONFERENCE_AGE']);
$conferencesAfter = new DateTime();
$conferencesAfter->sub(new DateInterval('P'.$months.'D'));
stdout('Skipping Conferences before %s', $conferencesAfter->format('Y-m-d'));
$conferences = array_filter($conferences, function($conference) use ($conferencesAfter) {
if($conference->isOpen())
{
stdout(
' %s: %s',
'---open---',
$conference->getSlug()
);
return true;
}
if($conference->endsAt() == null)
return false;
$isBefore = $conference->endsAt() < $conferencesAfter;
if($isBefore) {
stdout(
' %s: %s',
$conference->endsAt()->format('Y-m-d'),
$conference->getSlug()
);
}
return !$isBefore;
});
}
stdout('');
foreach ($conferences as $conference)
{
stdout('== %s ==', $conference->getSlug());
$relive = $conference->getRelive();
if($relive->isEnabled())
{
download_for_conference(
'relive-json',
$conference,
$relive->getJsonUrl(),
$relive->getJsonCache()
);
}
$schedule = $conference->getSchedule();
if($schedule->isEnabled())
{
download_for_conference(
'schedule-xml',
$conference,
$schedule->getScheduleUrl(),
$schedule->getScheduleCache()
);
}
foreach($conference->getExtraFiles() as $filename => $url)
{
download_for_conference(
'extra-file',
$conference,
$url,
get_file_cache($conference, $filename)
);
}
}
stdout('');
stdout('== eventkalender ==');
download(
'eventkalender',
'https://c3voc.de/eventkalender/events.json?filter=upcoming&streaming=yes',
joinpath([$GLOBALS['BASEDIR'], 'configs/upcoming.json'])
);
function get_file_cache($conference, $filename)
{
return joinpath([$GLOBALS['BASEDIR'], 'configs/conferences', $conference->getSlug(), $filename]);
}
function download_for_conference($what, $conference, $url, $cache)
{
$info = parse_url($url);
if(!isset($info['scheme']) || !isset($info['host']))
{
stderr(
' !! %s url for conference %s does look like an old-style path: "%s". please update to a full http/https url',
$what,
$conference->getSlug(),
$url
);
return false;
}
stdout(
' downloading %s from %s to %s',
$what,
$url,
$cache
);
$resp = do_download($url, $cache);
if($resp !== true)
{
stderr(
' !! download %s for conference %s from %s to %s failed miserably: %s !!',
$what,
$conference->getSlug(),
$url,
$cache,
$resp
);
}
return true;
}
function download($what, $url, $cache)
{
stdout(
' downloading %s from %s to %s',
$what,
$url,
$cache
);
$resp = do_download($url, $cache);
if($resp !== true)
{
stderr(
' !! download %s from %s to %s failed miserably: %s !!',
$what,
$url,
$cache,
$resp
);
}
return true;
}
function do_download($url, $cache)
{
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_MAXREDIRS => 10,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false, /* accept all certificates, even self-signed */
CURLOPT_SSL_VERIFYHOST => 2, /* verify hostname is in cert */
CURLOPT_CONNECTTIMEOUT => 3, /* connect-timeout in seconds */
CURLOPT_TIMEOUT => 5, /* transfer timeout im seconds */
CURLOPT_REDIR_PROTOCOLS => CURLPROTO_HTTP | CURLPROTO_HTTPS,
CURLOPT_USERAGENT => '@c3voc Streaming-Website Downloader-Cronjob, Contact voc AT c3voc DOT de in case of problems. Might the Winkekatze be with you',
]);
$return = curl_exec($handle);
$info = curl_getinfo($handle);
curl_close($handle);
if($info['http_code'] != 200)
return 'http-code = '.$info['http_code'];
$tempfile = tempnam(dirname($cache), 'dl-');
if(!$tempfile)
return 'could not create tempfile in '.dirname($cache);
if(false === file_put_contents($tempfile, $return))
return 'could write data into tempfile '.$tempfile;
chmod($tempfile, 0644);
rename($tempfile, $cache);
return true;
}