#!/usr/bin/php ModifiedTimestamp->format('Y-m-d\TH:i:s\Z') . ' ' . $ebook->Identifier] = $ebook; $newestEbooks[$ebook->Timestamp->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->Timestamp->format('Y-m-d\TH:i:s\Z') . ' ' . $ebook->Identifier] = $ebook; } } catch(\Exception $ex){ print('Failed to generate OPDS entry for `' . $ebookWwwFilesystemPath . '`. Exception: ' . $ex->getMessage()); continue; } } $now = new DateTime(); // Create OPDS feeds $opdsRootEntries = [ new OpdsNavigationEntry( '/opds/new-releases', 'http://opds-spec.org/sort/new', 'acquisition', $now, 'Newest ' . number_format($ebooksPerNewestEbooksFeed) . ' Standard Ebooks', 'A list of the ' . number_format($ebooksPerNewestEbooksFeed) . ' newest Standard Ebooks, most-recently-released first.'), new OpdsNavigationEntry( '/opds/subjects', 'subsection', 'navigation', $now, 'Standard Ebooks by Subject', 'Browse Standard Ebooks by subject.'), new OpdsNavigationEntry( '/opds/all', 'http://opds-spec.org/crawlable', 'acquisition', $now, 'All Standard Ebooks', 'A list of all Standard Ebooks, most-recently-updated first. This is a Complete Acquisition Feed as defined in OPDS 1.2 §2.5.') ]; $opdsRoot = new OpdsNavigationFeed('/opds', 'Standard Ebooks', WEB_ROOT . '/opds/index.xml', $opdsRootEntries, null); $opdsRoot->Save(); // Create the subjects navigation document sort($subjects); $subjectNavigationEntries = []; foreach($subjects as $subject){ $summary = number_format(sizeof($ebooksBySubject[$subject])) . ' Standard Ebook'; if(sizeof($ebooksBySubject[$subject]) != 1){ $summary .= 's'; } $summary .= ' tagged with “' . strtolower($subject) . ',” most-recently-released first.'; // We leave the updated timestamp blank, as it will be filled in when we generate the individual feeds $subjectNavigationEntries[] = new OpdsNavigationEntry('/opds/subjects/' . Formatter::MakeUrlSafe($subject), 'subsection', 'navigation', $now, $subject, $summary); } $subjectsFeed = new OpdsNavigationFeed('/opds/subjects', 'Standard Ebooks by Subject', WEB_ROOT . '/opds/subjects/index.xml', $subjectNavigationEntries, $opdsRoot); $subjectsFeed->Save(); // Now generate each individual subject feed foreach($ebooksBySubject as $subject => $ebooks){ krsort($ebooks); $subjectFeed = new OpdsAcquisitionFeed('/opds/subjects/' . Formatter::MakeUrlSafe((string)$subject), (string)$subject, WEB_ROOT . '/opds/subjects/' . Formatter::MakeUrlSafe((string)$subject) . '.xml', $ebooks, $subjectsFeed); $subjectFeed->Save(); } // Create the 'all' feed krsort($allEbooks); $allFeed = new OpdsAcquisitionFeed('/opds/all', 'All Standard Ebooks', WEB_ROOT . '/opds/all.xml', $allEbooks, $opdsRoot, true); $allFeed->Save(); // Create the 'newest' feed krsort($newestEbooks); $newestEbooks = array_slice($newestEbooks, 0, $ebooksPerNewestEbooksFeed); $newestFeed = new OpdsAcquisitionFeed('/opds/new-releases', 'Newest ' . number_format($ebooksPerNewestEbooksFeed) . ' Standard Ebooks', WEB_ROOT . '/opds/new-releases.xml', $newestEbooks, $opdsRoot); $newestFeed->Save(); // Now create RSS feeds // Create the 'newest' feed $newestFeed = new RssFeed('/rss/new-releases', 'Newest ' . number_format($ebooksPerNewestEbooksFeed) . ' Standard Ebooks', WEB_ROOT . '/rss/new-releases.xml', 'A list of the ' . number_format($ebooksPerNewestEbooksFeed) . ' latest Standard Ebooks ebook releases, most-recently-released first.', $newestEbooks); $newestFeed->Save(); ?>