mirror of
https://github.com/standardebooks/web.git
synced 2025-07-05 06:10:36 -04:00
154 lines
6.6 KiB
PHP
Executable file
154 lines
6.6 KiB
PHP
Executable file
#!/usr/bin/php
|
|
<?
|
|
require_once('/standardebooks.org/web/lib/Core.php');
|
|
|
|
use function Safe\krsort;
|
|
use function Safe\getopt;
|
|
use function Safe\mkdir;
|
|
use function Safe\preg_replace;
|
|
use function Safe\sort;
|
|
|
|
function SaveFeed($feed, $force, $now = null){
|
|
if($force){
|
|
if($now !== null){
|
|
$feed->Updated = $now;
|
|
}
|
|
$feed->Save();
|
|
}
|
|
else{
|
|
$feed->SaveIfChanged();
|
|
}
|
|
}
|
|
|
|
$longopts = ['webroot:', 'force'];
|
|
$options = getopt('', $longopts);
|
|
$webRoot = $options['webroot'] ?? WEB_ROOT;
|
|
$force = isset($options['force']) ? true : false; // If the arg is present, getopts sets it to false!!!
|
|
|
|
$allEbooks = [];
|
|
$newestEbooks = [];
|
|
$subjects = [];
|
|
$ebooksBySubject = [];
|
|
$ebooksPerNewestEbooksFeed = 30;
|
|
|
|
if(!is_dir($webRoot . '/feeds/opds/subjects')){
|
|
mkdir($webRoot . '/feeds/opds/subjects');
|
|
}
|
|
|
|
if(!is_dir($webRoot . '/feeds/rss/subjects')){
|
|
mkdir($webRoot . '/feeds/rss/subjects');
|
|
}
|
|
|
|
if(!is_dir($webRoot . '/feeds/atom/subjects')){
|
|
mkdir($webRoot . '/feeds/atom/subjects');
|
|
}
|
|
|
|
// Iterate over all ebooks to build the various feeds
|
|
foreach(Library::GetEbooksFromFilesystem($webRoot) as $ebook){
|
|
$allEbooks[$ebook->Updated->format('Y-m-d\TH:i:s\Z') . ' ' . $ebook->Identifier] = $ebook;
|
|
$newestEbooks[$ebook->Created->format('Y-m-d\TH:i:s\Z') . ' ' . $ebook->Identifier] = $ebook;
|
|
|
|
foreach($ebook->Tags as $tag){
|
|
// Add the book's subjects to the main subjects list
|
|
if(!in_array($tag->Name, $subjects)){
|
|
$subjects[] = $tag->Name;
|
|
}
|
|
|
|
// Sort this ebook by subject
|
|
$ebooksBySubject[$tag->Name][$ebook->Created->format('Y-m-d\TH:i:s\Z') . ' ' . $ebook->Identifier] = $ebook;
|
|
}
|
|
}
|
|
|
|
krsort($newestEbooks);
|
|
$newestEbooks = array_slice($newestEbooks, 0, $ebooksPerNewestEbooksFeed);
|
|
|
|
$now = new DateTime();
|
|
|
|
// Create OPDS feeds
|
|
$opdsRootEntries = [
|
|
new OpdsNavigationEntry(
|
|
'Newest Standard Ebooks',
|
|
'The ' . number_format($ebooksPerNewestEbooksFeed) . ' latest Standard Ebooks, most-recently-released first.',
|
|
'/feeds/opds/new-releases',
|
|
$now,
|
|
'http://opds-spec.org/sort/new',
|
|
'acquisition'
|
|
),
|
|
new OpdsNavigationEntry(
|
|
'Standard Ebooks by Subject',
|
|
'Browse Standard Ebooks by subject.',
|
|
'/feeds/opds/subjects',
|
|
$now,
|
|
'subsection',
|
|
'navigation'),
|
|
new OpdsNavigationEntry(
|
|
'All Standard Ebooks',
|
|
'All Standard Ebooks, most-recently-updated first. This is a Complete Acquisition Feed as defined in OPDS 1.2 §2.5.',
|
|
'/feeds/opds/all',
|
|
$now,
|
|
'http://opds-spec.org/crawlable',
|
|
'acquisition')
|
|
];
|
|
|
|
$opdsRoot = new OpdsNavigationFeed('Standard Ebooks', 'The Standard Ebooks catalog.', '/feeds/opds', $webRoot . '/feeds/opds/index.xml', $opdsRootEntries, null);
|
|
SaveFeed($opdsRoot, $force, $now);
|
|
|
|
// Create the subjects navigation document
|
|
sort($subjects);
|
|
$subjectNavigationEntries = [];
|
|
foreach($subjects as $subject){
|
|
$subjectNavigationEntries[] = new OpdsNavigationEntry($subject, 'Standard Ebooks tagged with “' . strtolower($subject) . ',” most-recently-released first.', '/feeds/opds/subjects/' . Formatter::MakeUrlSafe($subject), $now, 'subsection', 'navigation');
|
|
}
|
|
$subjectsFeed = new OpdsNavigationFeed('Standard Ebooks by Subject', 'Browse Standard Ebooks by subject.', '/feeds/opds/subjects', $webRoot . '/feeds/opds/subjects/index.xml', $subjectNavigationEntries, $opdsRoot);
|
|
$subjectsFeed->Subtitle = 'Browse Standard Ebooks by subject.';
|
|
SaveFeed($subjectsFeed, $force, $now);
|
|
|
|
// Now generate each individual subject feed
|
|
foreach($subjectNavigationEntries as $subjectNavigationEntry){
|
|
krsort($ebooksBySubject[$subjectNavigationEntry->Title]);
|
|
$subjectFeed = new OpdsAcquisitionFeed($subjectNavigationEntry->Title . ' Ebooks', $subjectNavigationEntry->Description, '/feeds/opds/subjects/' . Formatter::MakeUrlSafe($subjectNavigationEntry->Title), $webRoot . '/feeds/opds/subjects/' . Formatter::MakeUrlSafe($subjectNavigationEntry->Title) . '.xml', $ebooksBySubject[$subjectNavigationEntry->Title], $subjectsFeed);
|
|
SaveFeed($subjectFeed, $force, $now);
|
|
}
|
|
|
|
// Create the 'all' feed
|
|
krsort($allEbooks);
|
|
$allFeed = new OpdsAcquisitionFeed('All Standard Ebooks', 'All Standard Ebooks, most-recently-updated first. This is a Complete Acquisition Feed as defined in OPDS 1.2 §2.5.', '/feeds/opds/all', $webRoot . '/feeds/opds/all.xml', $allEbooks, $opdsRoot, true);
|
|
SaveFeed($allFeed, $force, $now);
|
|
|
|
// Create the 'newest' feed
|
|
$newestFeed = new OpdsAcquisitionFeed('Newest Standard Ebooks', 'The ' . number_format($ebooksPerNewestEbooksFeed) . ' latest Standard Ebooks, most-recently-released first.', '/feeds/opds/new-releases', $webRoot . '/feeds/opds/new-releases.xml', $newestEbooks, $opdsRoot);
|
|
SaveFeed($newestFeed, $force, $now);
|
|
|
|
// Now create RSS feeds
|
|
|
|
// Create the 'newest' feed
|
|
$newestRssFeed = new RssFeed('Standard Ebooks - Newest Ebooks', 'The ' . number_format($ebooksPerNewestEbooksFeed) . ' latest Standard Ebooks, most-recently-released first.', '/feeds/rss/new-releases', $webRoot . '/feeds/rss/new-releases.xml', $newestEbooks);
|
|
SaveFeed($newestRssFeed, $force);
|
|
|
|
// Create the 'all' feed
|
|
$allRssFeed = new RssFeed('Standard Ebooks - All Ebooks', 'All Standard Ebooks, most-recently-released first.', '/feeds/rss/all', $webRoot . '/feeds/rss/all.xml', $allEbooks);
|
|
SaveFeed($allRssFeed, $force);
|
|
|
|
// Generate each individual subject feed
|
|
foreach($ebooksBySubject as $subject => $ebooks){
|
|
krsort($ebooks);
|
|
$subjectRssFeed = new RssFeed('Standard Ebooks - ' . (string)$subject . ' Ebooks', 'Standard Ebooks tagged with “' . strtolower($subject) . ',” most-recently-released first.', '/feeds/rss/subjects/' . Formatter::MakeUrlSafe((string)$subject), $webRoot . '/feeds/rss/subjects/' . Formatter::MakeUrlSafe((string)$subject) . '.xml', $ebooks);
|
|
SaveFeed($subjectRssFeed, $force);
|
|
}
|
|
|
|
// Now create the Atom feeds
|
|
// Create the 'newest' feed
|
|
$newestAtomFeed = new AtomFeed('Standard Ebooks - Newest Ebooks', 'The ' . number_format($ebooksPerNewestEbooksFeed) . ' latest Standard Ebooks, most-recently-released first.', '/feeds/atom/new-releases', $webRoot . '/feeds/atom/new-releases.xml', $newestEbooks);
|
|
SaveFeed($newestAtomFeed, $force, $now);
|
|
|
|
// Create the 'all' feed
|
|
$allAtomFeed = new AtomFeed('Standard Ebooks - All Ebooks', 'All Standard Ebooks, most-recently-released first.', '/feeds/atom/all', $webRoot . '/feeds/atom/all.xml', $allEbooks);
|
|
SaveFeed($allAtomFeed, $force, $now);
|
|
|
|
// Generate each individual subject feed
|
|
foreach($ebooksBySubject as $subject => $ebooks){
|
|
krsort($ebooks);
|
|
$subjectAtomFeed = new AtomFeed('Standard Ebooks - ' . (string)$subject . ' Ebooks', 'Standard Ebooks tagged with “' . strtolower($subject) . ',” most-recently-released first.', '/feeds/atom/subjects/' . Formatter::MakeUrlSafe((string)$subject), $webRoot . '/feeds/atom/subjects/' . Formatter::MakeUrlSafe((string)$subject) . '.xml', $ebooks);
|
|
SaveFeed($subjectAtomFeed, $force, $now);
|
|
}
|
|
?>
|