zamiana kanału YouTube na feed RSS

kiedyś dało się to zrobić przez link typu:


http://gdata.youtube.com/feeds/api/users/xxxx/uploads

Niestety od kwietnia 2015 jest to przez YT systematycznie wycofywane i kanały przestają działać w ten sposób.

Pomocnym może okazać się ten skrypt PHP. Znaleźliśmy to na tej stronie i poprawiliśmy w nim błędy. Został także dostosowany do polskich realiów (m.in. pod kątem kodowania polskich znaków).

Enjoy.


<?php

libxml_use_internal_errors(true);

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 = array();

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

$title= iconv("UTF-8","ISO-8859-1",$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;

echo '<?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

$skip = array('Alle wiedergeben','Wiedergeben');

foreach ($entries as $entryUrl => $title) {
$entryUrl = htmlspecialchars("$host$entryUrl");
$title = htmlspecialchars($title);
$updated -= 60;

if (!in_array(trim($title),$skip)) {

?>
<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>

 

 

Jedna myśl nt. „zamiana kanału YouTube na feed RSS

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *