fevangelou
4/20/2015 - 11:48 PM

Dynamic RSS feeds from Youtube links

Dynamic RSS feeds from Youtube links

<?php

if (!isset($_GET['url'])) {
?>
<!DOCTYPE html>
<meta charset="utf-8">
<title>Youtube RSS creator</title>
<form>
	<p>Create an RSS feed for the videos on the following page:
	<p><input name="url" placeholder="E.g. https://www.youtube.com/user/scishow/videos" style="width: 30em">
	<p><input type="submit" value="Create">
</form>
<?php
	exit;
}

$url = $_GET['url'];

$host = preg_replace('#^(https?://[^/]+).*#', '$1', $url);
$author = preg_replace('#^(https?://[^/])/user/([^/]+).*#', '$1', $url);

$html = file_get_contents($url);
$doc = new DOMDocument();
$doc->loadHTML($html);

$xpath = new DOMXpath($doc);

$mainTitle = $xpath->query('//title')->item(0)->nodeValue;
$links = $xpath->query('//a[starts-with(@href, "/watch")]');

$entries = [];

if (!is_null($links)) {
	foreach ($links as $link) {
		$href = $link->getAttribute('href');
		$title = $link->getAttribute('title');
		if ($title === '')
			$title = trim($link->nodeValue);

		if (!isset($entries[$href]) || strlen($entries[$href]) < strlen($title))
			$entries[$href] = $title;
	}
}

header('Content-Type: application/atom+xml; charset=utf-8');

$mainTitle = htmlspecialchars($mainTitle);

$protocol = $_SERVER['HTTPS'] === 'on' ? 'https' : 'http';
$port = ":$_SERVER[SERVER_PORT]";
if (($protocol === 'http' && $port === ":80") || ($protocol === 'https' && $port === ":443"))
	$port = '';
$self = htmlspecialchars("$protocol://$_SERVER[SERVER_NAME]$port$_SERVER[REQUEST_URI]");

$url = htmlspecialchars($url);

$author = htmlspecialchars($author);

$updated = time();
$updated -= $updated % 60;

?>
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="text"><?= $mainTitle ?></title>
	<link rel="self" href="<?= $self ?>" type="application/atom+xml" />
	<link rel="alternate" href="<?= $url ?>" type="text/html" />
	<updated><?= date('c', $updated) ?></updated>
	<id><?= $url ?></id>
<?php
	foreach ($entries as $entryUrl => $title) {
		$entryUrl = htmlspecialchars("$host$entryUrl");
		$title = htmlspecialchars($title);
		$updated -= 60;
?>
		<entry>
			<id><?= $entryUrl ?></id>
			<title type="text"><?= $title ?></title>
			<link rel="alternate" href="<?= $entryUrl ?>" />
			<author>
				<name><?= $author ?></name>
			</author>
			<updated><?= date('c', $updated) ?></updated>
		</entry>
<?php
	}
?>
</feed>