PHPIndex

This page lists files in the current directory. You can view content, get download/execute commands for Wget, Curl, or PowerShell, or filter the list using wildcards (e.g., `*.sh`).

about.phtml
wget 'https://lists2.roe3.org/FreshRSS/app/views/index/about.phtml'
View Content
<?php
	declare(strict_types=1);
	/** @var FreshRSS_View $this */
	if (FreshRSS_Auth::hasAccess()) {
		$this->partial('aside_configure');
	}
?>
<main class="post content<?= !FreshRSS_Auth::hasAccess() ? ' centered' : ''?>">
	<?php if (FreshRSS_Auth::hasAccess()) {?>
	<div class="link-back-wrapper">
		<a class="link-back" href="<?= _url('index', 'index') ?>"><?= _t('gen.action.back_to_rss_feeds') ?></a>
	</div>
	<?php } ?>

	<h1><?= _t('index.about') ?></h1>
	<p><?= _t('index.about.freshrss_description') ?></p>

	<h2><?= _t('index.about.project_website') ?></h2>
	<a href="<?= FRESHRSS_WEBSITE ?>" target="_blank"><?= FRESHRSS_WEBSITE ?></a>

	<h2><?= _t('index.about.documentation') ?></h2>
	<a href="<?= FRESHRSS_WIKI ?>" target="_blank"><?= FRESHRSS_WIKI ?></a>

	<h2><?= _t('index.about.bugs_reports') ?></h2>
	<?= _t('index.about.github') ?>

	<h2><?= _t('index.about.license') ?></h2>
	<?= _t('index.about.agpl3') ?>

	<?php
	if (FreshRSS_Auth::hasAccess()) { ?>
		<h2><?= _t('index.about.version') ?></h2>
		<?= FRESHRSS_VERSION ?>

		<?php
		$env = FreshRSS_Context::systemConf()->environment;
		if ($env !== 'production' && FreshRSS_Context::userConf()->is_admin) { ?>
			<h2>data/config.php</h2>
			<code>'environment' => '<?= $env; ?>'</code><br />
			<?php
		}
	}
	?>

	<h2><?= _t('index.about.credits') ?></h2>
	<p><?= _t('index.about.credits_content') ?></p>
</main>

<?php if (!FreshRSS_Auth::hasAccess()) { ?>
<footer class="main-footer">
	<?php if (file_exists(TOS_FILENAME)) { ?>
		<a href="<?= _url('index', 'tos') ?>"><?= _t('index.tos.title')?></a>
	<?php } ?>
</footer>
<?php } ?>
global.phtml
wget 'https://lists2.roe3.org/FreshRSS/app/views/index/global.phtml'
View Content
<?php
	declare(strict_types=1);
	/** @var FreshRSS_View $this */
	$this->partial('nav_menu');

	$class = '';
	$state_unread = false;

	if (FreshRSS_Context::userConf()->hide_read_feeds &&
			FreshRSS_Context::isStateEnabled(FreshRSS_Entry::STATE_NOT_READ) &&
			!FreshRSS_Context::isStateEnabled(FreshRSS_Entry::STATE_READ)) {
		$class = ' state_unread';
		$state_unread = true;
	}
?>
<main id="stream" class="global<?= $class ?>">
	<h1 class="title_hidden"><?= _t('conf.reading.view.global') ?></h1>
<?php
	$params = $_GET;
	unset($params['c']);
	unset($params['a']);
	$url_base = array(
		'c' => 'index',
		'a' => 'normal',
		'params' => $params,
	);

	$unreadArticles = 0;

	foreach ($this->categories as $cat) {
		$feeds = $cat->feeds();
		$url_base['params']['get'] = 'c_' . $cat->id();

		if (!empty($feeds)) {
			$unreadArticles += $cat->nbNotRead();
?>
	<div class="box category" data-unread="<?= $cat->nbNotRead() ?>">
		<div class="box-title"><a class="title" data-unread="<?= format_number($cat->nbNotRead()) ?>"
			href="<?= Minz_Url::display($url_base) ?>"><h2><?= $cat->name() ?></h2></a></div>

		<ul class="box-content scrollbar-thin">
			<?php
				foreach ($feeds as $feed) {
					$nb_not_read = $feed->nbNotRead();

					$error_class = '';
					$error_title = '';
					if ($feed->inError() && !$feed->mute()) {
						$error_class = ' error';
						$error_title = _t('sub.feed.error');
					}

					$empty_class = '';
					$empty_title = '';
					if ($feed->nbEntries() == 0) {
						$empty_class = ' empty';
						$empty_title = _t('sub.feed.empty');
					}
					$mute_class = $feed->mute() ? ' mute' : '';

					$url_base['params']['get'] = 'f_' . $feed->id();
			?>
			<li id="f_<?= $feed->id() ?>" class="item feed<?= $error_class, $empty_class, $mute_class ?>" title="<?= $error_title, $empty_title ?>"
				data-unread="<?= $feed->nbNotRead() ?>" data-priority="<?= $feed->priority() ?>">
				<?php if (FreshRSS_Context::userConf()->show_favicons): ?><img class="favicon" src="<?= $feed->favicon() ?>" alt="✇" loading="lazy" /><?php endif; ?>
				<a class="item-title" data-unread="<?= format_number($feed->nbNotRead()) ?>" href="<?= Minz_Url::display($url_base) ?>"><?= $feed->name() ?></a>
			</li>
			<?php } ?>
		</ul>
	</div>
<?php
		}
	}

	if ($unreadArticles < 1 && $state_unread) {
		?>
	<div id="noArticlesToShow" class="prompt alert alert-warn">
		<h2 class="alert-head"><?= _t('index.feed.empty') ?></h2>
	</div>
	<?php } ?>
</main>

<div id="overlay">
	<a class="close" href="#"><?= _i('close') ?></a>
	<div id="panel"<?= FreshRSS_Context::userConf()->display_posts ? '' : ' class="hide_posts"' ?>>
</div>
</div>
html.phtml
wget 'https://lists2.roe3.org/FreshRSS/app/views/index/html.phtml'
View Content
<?php
	declare(strict_types=1);
	/** @var FreshRSS_View $this */
	// Override some layout preferences for the public API output
	FreshRSS_Context::userConf()->content_width = 'large';
	FreshRSS_Context::userConf()->show_author_date = FreshRSS_UserConfiguration::default()->show_author_date;
	FreshRSS_Context::userConf()->show_favicons = FreshRSS_UserConfiguration::default()->show_favicons;
	FreshRSS_Context::userConf()->show_feed_name = FreshRSS_UserConfiguration::default()->show_feed_name;
	FreshRSS_Context::userConf()->show_tags = FreshRSS_UserConfiguration::default()->show_tags;
	FreshRSS_Context::userConf()->show_tags_max = FreshRSS_UserConfiguration::default()->show_tags_max;
?>
<?php $this->renderHelper('htmlPagination'); ?>
<main id="stream" class="reader api">
	<h2>
		<a href="<?= $this->html_url ?>"><?= FreshRSS_View::title() ?></a> ·
		<a class="view-rss" href="<?= $this->rss_url ?>" title="<?= _t('index.menu.rss_view') ?>">
			<?= _i('rss') ?>
		</a>
	</h2>
	<?php
		foreach ($this->entries as $entry):
			$this->entry = $entry;
			$this->feed = $this->feeds[$entry->feedId()] ??
				FreshRSS_Category::findFeed($this->categories, $entry->feedId()) ??
				FreshRSS_Feed::default();
	?>
		<div class="flux">
			<?php $this->renderHelper('index/article'); ?>
		</div>
	<?php endforeach; ?>
</main>
<?php $this->renderHelper('htmlPagination'); ?>
index.phtml
wget 'https://lists2.roe3.org/FreshRSS/app/views/index/index.phtml'
View Content
logs.phtml
wget 'https://lists2.roe3.org/FreshRSS/app/views/index/logs.phtml'
View Content
<?php
	declare(strict_types=1);
	/** @var FreshRSS_View $this */
	$this->partial('aside_configure');
?>
<main class="post">
	<div class="link-back-wrapper">
		<a class="link-back" href="<?= _url('index', 'index') ?>"><?= _t('gen.action.back_to_rss_feeds') ?></a>
	</div>

	<h1><?= _t('index.log') ?></h1>

	<?php
		/** @var array<FreshRSS_Log> $items */
		$items = $this->logsPaginator->items();
	?>

	<?php if (!empty($items)) { ?>
		<form method="post" action="<?= _url('index', 'logs') ?>">
			<?php $this->logsPaginator->render('logs_pagination.phtml', 'page'); ?>
			
			<div id="loglist-wrapper" class="table-wrapper scrollbar-thin">
				<table id="loglist">
					<thead>
						<th><?= _t('conf.logs.loglist.level') ?></th>
						<th><?= _t('conf.logs.loglist.timestamp') ?></th>
						<th><?= _t('conf.logs.loglist.message') ?></th>
					</thead>
					<tbody>
				<?php foreach ($items as $log) { ?>
				<tr class="log-item log-<?= $log->level() ?>">
					<td class="log-level">
						<?= _i($log->level()) ?>
					</td>
					<td class="log-date">
						<time datetime="<?= date('Y-m-d H:i:s', @strtotime($log->date()) ?: 0) ?>">
							<?= date('Y-m-d H:i:s', @strtotime($log->date()) ?: 0) ?>
						</time>
					</td>
					<td class="log-message">
						<?= htmlspecialchars($log->info(), ENT_NOQUOTES, 'UTF-8') ?>
					</td>
					</tr>
				<?php } ?>
				</tbody>
				</table>
			</div>
			<?php $this->logsPaginator->render('logs_pagination.phtml', 'page'); ?>
			
			<div class="form-group form-actions">
			<input type="hidden" name="_csrf" value="<?= FreshRSS_Auth::csrfToken() ?>" />
				<input type="hidden" name="clearLogs" />
				<div class="group-controls">
				<button type="submit" class="btn btn-attention"><?= _t('index.log.clear') ?></button>
				</div>
			</div>
		</form>

	<?php
	} else { ?>
		<p class="alert alert-warn"><?= _t('index.log.empty') ?></p>
	<?php } ?>
</main>
normal.phtml
wget 'https://lists2.roe3.org/FreshRSS/app/views/index/normal.phtml'
View Content
<?php
declare(strict_types=1);
/** @var FreshRSS_View $this */
if (!Minz_Request::paramBoolean('ajax')) {
	$this->partial('aside_feed');
	$this->partial('nav_menu');
}

call_user_func($this->callbackBeforeEntries, $this);

$display_today = true;
$display_yesterday = true;
$display_others = true;
$useKeepUnreadImportant = !FreshRSS_Context::isImportant() && !FreshRSS_Context::isFeed();

$today = @strtotime('today');
?>

<main id="stream" class="normal<?= FreshRSS_Context::userConf()->display_posts ? '' : ' hide_posts' ?>">
	<h1 class="title_hidden"><?= _t('conf.reading.view.normal') ?></h1>
	<div id="new-article">
		<a href="<?= Minz_Url::display(Minz_Request::currentRequest()) ?>"><?= _t('gen.js.new_article'); /* TODO: move string in JS*/ ?></a>
	</div><?php
	$lastEntry = null;
	$nbEntries = 0;
	foreach ($this->entries as $item):
		$lastEntry = $item;
		$nbEntries++;
		ob_flush();
		/** @var FreshRSS_Entry */
		$item = Minz_ExtensionManager::callHook('entry_before_display', $item);
		if ($item == null) {
			continue;
		}
		$this->entry = $item;

		// We most likely already have the feed object in cache, otherwise make a request
		$this->feed = FreshRSS_Category::findFeed($this->categories, $this->entry->feedId()) ??
			$this->entry->feed() ?? FreshRSS_Feed::default();

		if ($display_today && $this->entry->isDay(FreshRSS_Days::TODAY, $today)) {
			?><div class="day" id="day_today"><?php
				echo _t('gen.date.today');
				?><span class="date"> — <?= timestamptodate(time(), false) ?></span><?php
				?><span class="name"><?= FreshRSS_Context::$name ?></span><?php
			?></div><?php
			$display_today = false;
		}
		if ($display_yesterday && $this->entry->isDay(FreshRSS_Days::YESTERDAY, $today)) {
			?><div class="day" id="day_yesterday"><?php
				echo _t('gen.date.yesterday');
				?><span class="date"> — <?= timestamptodate(time() - 86400, false) ?></span><?php
				?><span class="name"><?= FreshRSS_Context::$name ?></span><?php
			?></div><?php
			$display_yesterday = false;
		}
		if ($display_others && $this->entry->isDay(FreshRSS_Days::BEFORE_YESTERDAY, $today)) {
			?><div class="day" id="day_before_yesterday"><?php
				echo _t('gen.date.before_yesterday');
				?><span class="name"><?= FreshRSS_Context::$name ?></span><?php
			?></div><?php
			$display_others = false;
		}
	?><div class="flux<?= !$this->entry->isRead() ? ' not_read' : ''
		?><?= $this->entry->isFavorite() ? ' favorite' : ''
		?><?= $useKeepUnreadImportant && ($this->feed->priority() >= FreshRSS_Feed::PRIORITY_IMPORTANT) ? ' keep_unread ' : ''
		?>" id="flux_<?= $this->entry->id()
		?>" data-feed="<?= $this->feed->id()
		?>" data-priority="<?= $this->feed->priority()
		?>"><?php
			$this->renderHelper('index/normal/entry_header');
		?><article class="flux_content" dir="auto">
			<div class="content <?= FreshRSS_Context::userConf()->content_width ?>">
				<header>
					<?php if (FreshRSS_Context::userConf()->show_feed_name === 't') { ?>
						<div class="website"><a href="<?= _url('index', 'index', 'get', 'f_' . $this->feed->id()) ?>" title="<?= _t('gen.action.filter') ?>">
							<?php if (FreshRSS_Context::userConf()->show_favicons): ?>
								<img class="favicon" src="<?= $this->feed->favicon() ?>" alt="✇" loading="lazy" /><?php
							endif; ?><span><?= $this->feed->name() ?></span></a>
						</div>
					<?php } ?>
					<?php if (FreshRSS_Context::userConf()->show_tags === 'h' || FreshRSS_Context::userConf()->show_tags === 'b') {
						$this->renderHelper('index/tags');
					} ?>
					<h1 class="title"><a target="_blank" rel="noreferrer" class="go_website" href="<?= $this->entry->link() ?>" title="<?= _t('conf.shortcut.see_on_website')?>"><?= $this->entry->title() ?></a></h1>
					<?php if (FreshRSS_Context::userConf()->show_author_date === 'h' || FreshRSS_Context::userConf()->show_author_date === 'b') { ?>
					<div class="subtitle">
						<?php if (FreshRSS_Context::userConf()->show_feed_name === 'a') { ?>
							<div class="website"><a href="<?= _url('index', 'index', 'get', 'f_' . $this->feed->id()) ?>" title="<?= _t('gen.action.filter') ?>">
								<?php if (FreshRSS_Context::userConf()->show_favicons): ?>
									<img class="favicon" src="<?= $this->feed->favicon() ?>" alt="✇" loading="lazy" /><?php
								endif; ?><span><?= $this->feed->name() ?></span></a>
							</div>
							<?php
						}

						$authors = $this->entry->authors();
						if (!empty($authors) && is_array($authors)) {
						?>
						<div class="author">
							<?= _t('gen.short.by_author') ?>
							<?php
							foreach ($authors as $author) {
								$href = Minz_Url::display(Minz_Request::modifiedCurrentRequest(['search' => 'author:"' . htmlspecialchars_decode($author, ENT_QUOTES) . '"']));
							?>
							<a href="<?= $href ?>" title="<?= _t('gen.action.filter') ?>"><?= $author ?></a>
							<?php } ?>
						</div>
						<?php } ?>
						<div class="date"><?= $this->entry->date() ?></div>
					</div>
					<?php } ?>
				</header>
				<div class="text"><?=
					FreshRSS_Context::userConf()->lazyload && !FreshRSS_Context::userConf()->display_posts ? lazyimg($this->entry->content(true)) : $this->entry->content(true)
				?></div>
				<?php
				$display_authors_date = FreshRSS_Context::userConf()->show_author_date === 'f' || FreshRSS_Context::userConf()->show_author_date === 'b';
				$display_tags = FreshRSS_Context::userConf()->show_tags === 'f' || FreshRSS_Context::userConf()->show_tags === 'b';

				if ($display_authors_date || $display_tags) {
					?>
					<footer>
						<?php
						if ($display_authors_date) { ?>
							<div class="subtitle">
								<?php if (FreshRSS_Context::userConf()->show_feed_name === 'a') { ?>
									<div class="website"><a href="<?= _url('index', 'index', 'get', 'f_' . $this->feed->id()) ?>" title="<?= _t('gen.action.filter') ?>">
										<?php if (FreshRSS_Context::userConf()->show_favicons): ?>
											<img class="favicon" src="<?= $this->feed->favicon() ?>" alt="✇" loading="lazy" /><?php
										endif; ?><span><?= $this->feed->name() ?></span></a>
									</div>
									<?php
								}
								$authors = $this->entry->authors();
								if (!empty($authors) && is_array($authors)) {
								?>
								<div class="author">
									<?= _t('gen.short.by_author') ?>
									<?php
									foreach ($authors as $author) {
										$href = Minz_Url::display(Minz_Request::modifiedCurrentRequest(['search' => 'author:"' . htmlspecialchars_decode($author, ENT_QUOTES) . '"']));
									?>
									<a href="<?= $href ?>" title="<?= _t('gen.action.filter') ?>"><?= $author ?></a>
									<?php } ?>
								</div>
								<?php } ?>
								<div class="date"><?= $this->entry->date() ?></div>
							</div>
						<?php
						}
						if ($display_tags) {
							$this->renderHelper('index/tags');
						}
						?>
					</footer>
					<?php
				} ?>
			</div><footer><?php
				$this->renderHelper('index/normal/entry_bottom');
			?>
		</footer></article>
	</div><?php
	endforeach;

	if ($nbEntries > 0):
		call_user_func($this->callbackBeforePagination, $this, $nbEntries, $lastEntry);
		$this->renderHelper('stream-footer');
?>
</main><?php
	else:
		ob_end_clean();	//Discard the articles headers, as we have no articles
?>
<main id="stream" class="normal">
	<div id="new-article">
		<a href="<?= Minz_Url::display(Minz_Request::currentRequest()) ?>"><?= _t('gen.js.new_article'); /* TODO: move string in JS*/ ?></a>
	</div>
	<div class="prompt alert alert-warn">
		<h2 class="alert-head"><?= _t('index.feed.empty') ?></h2>
	</div>
</main>
<?php endif; ?>

<?php $class = $this->displaySlider ? ' active' : ''; ?>
<aside id="slider" class="<?= $class ?>">
	<a class="toggle_aside" href="#close"><img class="icon" src="../themes/icons/close.svg" loading="lazy" alt="❌"></a>
		<div id="slider-content">
		</div>
</aside>
<a href="#" id="close-slider" class="<?= $class ?>">
	<?= _i('close') ?>
</a>

<?php if ($nbEntries > 0 && FreshRSS_Context::userConf()->show_nav_buttons) $this->partial('nav_entries'); ?>
opml.phtml
wget 'https://lists2.roe3.org/FreshRSS/app/views/index/opml.phtml'
View Content
<?php
declare(strict_types=1);
/** @var FreshRSS_View $this */
$this->renderHelper('export/opml');
reader.phtml
wget 'https://lists2.roe3.org/FreshRSS/app/views/index/reader.phtml'
View Content
<?php
declare(strict_types=1);
/** @var FreshRSS_View $this */
if (!Minz_Request::paramBoolean('ajax')) {
	$this->partial('aside_feed');
	$this->partial('nav_menu');
}

call_user_func($this->callbackBeforeEntries, $this);

$lazyload = FreshRSS_Context::userConf()->lazyload;
?>
<main id="stream" class="reader">
	<h1 class="title_hidden"><?= _t('conf.reading.view.reader') ?></h1>
	<div id="new-article">
		<a href="<?= Minz_Url::display(Minz_Request::currentRequest()) ?>"><?= _t('gen.js.new_article'); /* TODO: move string in JS*/ ?></a>
	</div><?php
	$lastEntry = null;
	$nbEntries = 0;
	foreach ($this->entries as $entry):
		$lastEntry = $entry;
		$nbEntries++;
		ob_flush();
		/** @var FreshRSS_Entry */
		$entry = Minz_ExtensionManager::callHook('entry_before_display', $entry);
		if ($entry == null) {
			continue;
		}
		$this->entry = $entry;

		//We most likely already have the feed object in cache, otherwise make a request
		$this->feed = FreshRSS_Category::findFeed($this->categories, $entry->feedId()) ?? $entry->feed() ?? FreshRSS_Feed::default();
	?><div class="flux<?= !$entry->isRead() ? ' not_read' : '' ?><?= $entry->isFavorite() ? ' favorite' : '' ?>" id="flux_<?= $entry->id() ?>" data-priority="<?= $this->feed->priority() ?>">
		<?php $this->renderHelper('index/article'); ?>
	</div><?php
	endforeach;

	if ($nbEntries > 0):
		call_user_func($this->callbackBeforePagination, $this, $nbEntries, $lastEntry);
		$this->renderHelper('stream-footer');
?></main><?php
	else:
		ob_end_clean();	//Discard the articles headers, as we have no articles
?>
<main id="stream" class="reader">
	<div id="new-article">
		<a href="<?= Minz_Url::display(Minz_Request::currentRequest()) ?>"><?= _t('gen.js.new_article'); /* TODO: move string in JS*/ ?></a>
	</div>
	<div class="prompt alert alert-warn">
		<h2 class="alert-head"><?= _t('index.feed.empty') ?></h2>
	</div>
</main>
<?php endif; ?>
rss.phtml
wget 'https://lists2.roe3.org/FreshRSS/app/views/index/rss.phtml'
View Content
<?php
	declare(strict_types=1);
	/** @var FreshRSS_View $this */
?>
<?= '<?xml version="1.0" encoding="UTF-8" ?>'; ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/"
	<?= $this->rss_base == '' ? '' : ' xml:base="' . $this->rss_base . '"' ?>
>
	<channel>
		<title><?= $this->rss_title ?></title>
		<link><?= $this->html_url ?></link>
		<description><?= $this->description ?: _t('index.feed.rss_of', $this->rss_title) ?></description>
		<pubDate><?= date('D, d M Y H:i:s O') ?></pubDate>
		<lastBuildDate><?= gmdate('D, d M Y H:i:s') ?> GMT</lastBuildDate>
		<atom:link href="<?= $this->rss_url ?>" rel="self" type="application/rss+xml" />
		<?php if ($this->image_url !== ''): ?>
		<image>
			<url><?= $this->image_url ?></url>
			<title><?= $this->rss_title ?></title>
			<link><?= $this->html_url ?></link>
		</image>
		<?php endif; ?>
<?php
foreach ($this->entries as $item) {
	if (!$this->internal_rendering) {
		/** @var FreshRSS_Entry */
		$item = Minz_ExtensionManager::callHook('entry_before_display', $item);
		if ($item == null) {
			continue;
		}
	}
?>
		<item>
			<title><?= $item->title() ?></title>
			<link><?= $item->link() ?></link>
			<?php
				$authors = $item->authors();
				if (is_array($authors)) {
					foreach ($authors as $author) {
						echo "\t\t\t", '<dc:creator>', $author, '</dc:creator>', "\n";
					}
				}
				$categories = $item->tags();
				if (is_array($categories)) {
					foreach ($categories as $category) {
						echo "\t\t\t", '<category>', $category, '</category>', "\n";
					}
				}

				$enclosures = iterator_to_array($item->enclosures(false));
				$thumbnail = $item->thumbnail(false);
				if (!empty($thumbnail['url'])) {
					// https://www.rssboard.org/media-rss#media-thumbnails
					echo "\t\t\t", '<media:thumbnail url="' . $thumbnail['url']
						. (empty($thumbnail['width']) ? '' : '" width="' . $thumbnail['width'])
						. (empty($thumbnail['height']) ? '' : '" height="' . $thumbnail['height'])
						. (empty($thumbnail['time']) ? '' : '" time="' . $thumbnail['time'])
						. '" />', "\n";
					// Mostly for MailChimp + Feedbro which do not support <media:thumbnail> https://mailchimp.com/help/rss-merge-tags/
					$thumbnail['medium'] ??= 'image';
					array_unshift($enclosures, $thumbnail);
				}

				$urls = [];
				foreach ($enclosures as $enclosure) {
					if (empty($enclosure['url']) || isset($urls[$enclosure['url']])) {
						continue;
					}
					$urls[$enclosure['url']] = true;

					$credits = $enclosure['credit'] ?? [];
					if (!is_array($credits)) {	// For entries < FreshRSS 1.24
						$credits = [$credits];
					}
					$mediaCredits = '';
					foreach ($credits as $credit) {
						$mediaCredits = '<media:credit>' . $credit . '</media:credit>';
					}

					// https://www.rssboard.org/media-rss
					echo "\t\t\t", '<media:content url="' . $enclosure['url']
						. (empty($enclosure['medium']) ? '' : '" medium="' . $enclosure['medium'])
						. (empty($enclosure['type']) ? '' : '" type="' . $enclosure['type'])
						. (empty($enclosure['length']) ? '' : '" length="' . $enclosure['length'])
						. (empty($enclosure['height']) ? '' : '" height="' . $enclosure['height'])
						. (empty($enclosure['width']) ? '' : '" width="' . $enclosure['width'])
						. '">'
						. (empty($enclosure['title']) ? '' : '<media:title type="html">' . $enclosure['title'] . '</media:title>')
						. $mediaCredits
						. '</media:content>', "\n";
				}
			?>
			<description><![CDATA[<?php
	echo $item->content(false);
?>]]></description>
			<pubDate><?= date('D, d M Y H:i:s O', $item->date(true)) ?></pubDate>
			<guid isPermaLink="false"><?= $item->id() > 0 ? $item->id() : $item->guid() ?></guid>
		</item>
<?php } ?>

	</channel>
</rss>
tos.phtml
wget 'https://lists2.roe3.org/FreshRSS/app/views/index/tos.phtml'
View Content
<?php
	declare(strict_types=1);
	/** @var FreshRSS_View $this */
	if (FreshRSS_Auth::hasAccess()) {
		$this->partial('aside_configure');
	}
?>
<main class="post content<?= !FreshRSS_Auth::hasAccess() ? ' centered' : ''?>">
	<?php if (FreshRSS_Auth::hasAccess()) {?>
		<div class="link-back-wrapper">
			<a class="link-back" href="<?= _url('index', 'index') ?>"><?= _t('gen.action.back_to_rss_feeds') ?></a>
		</div>
	<?php } elseif ($this->can_register) { ?>
		<div class="link-back-wrapper">
			<a href="<?= _url('auth', 'register') ?>">
				<?= _t('gen.action.back') ?>
			</a>
		</div>
	<?php } else { ?>
		<div class="link-back-wrapper">
			<a href="<?= _url('index', 'index') ?>">
				<?= _t('gen.action.back') ?>
			</a>
		</div>
	<?php } ?>

	<h1><?= _t('index.tos.title')?></h1>
	<?= $this->terms_of_service ?>
</main>

<?php if (!FreshRSS_Auth::hasAccess()) { ?>
<footer class="main-footer">
	<a href="<?= _url('index', 'about') ?>"><?= _t('gen.freshrss.about') ?></a>
</footer>
<?php } ?>