1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
<?php
require_once('/root/bin/SimplePie.compiled.php');
// iterate through feed directories
$root = "/srv/gopher/feeds";
$cache= "/srv/gopher/cache";
$fs = "feed";
$ts = "title";
$hs = "header";
$dir = glob($root . '/*' , GLOB_ONLYDIR);
if (file_exists("$root/$hs")) {
copy("$root/$hs", "$root/gophermap");
$dt = new DateTime("now", new DateTimeZone('Europe/Paris'));
file_put_contents("$root/gophermap", "last update: ".$dt->format('Y-m-d H:i:s')."\n\n", FILE_APPEND);
}
foreach ($dir as $subdir) {
# get feed settings from directory
if (!file_exists("$subdir/$fs")) continue;
if (!file_exists("$subdir/$ts")) continue;
$feeditemtitle = fgets(fopen("$subdir/$ts", 'r'));
$feeditemtitle = str_replace("\n", '', $feeditemtitle);
$feedurl = fgets(fopen("$subdir/$fs", 'r'));
$feedurl = str_replace("\n", '', $feedurl);
// feed list header
$itemlist = "RSS feed : " . $feedurl."\n\n";
// new instance of simplepie
$feed = new SimplePie();
// simplepie can't recuperate a gopher url
// so we use curl in this case
$gopher = 0;
if (str_starts_with($feedurl, "gopher")) {
exec("curl $feedurl", $rssdata, $retval);
if (!empty($rssdata)) {
$rssstring=implode($rssdata);
$feed->set_raw_data($rssstring);
$gopher=1;
}else{
$itemlist .= "Error $retval retrieving $feedurl\n";
}
}else{
$feed->set_feed_url($feedurl);
}
// initialise simplepie
$feed->set_cache_location($cache);
$feed->enable_order_by_date(true);
$feed->handle_content_type();
$feed->init();
// extract each feed item
$x=0;
foreach ($feed->get_items(0, 30) as $item) {
$itemlink = $item->get_permalink();
$itemtitle = $item->get_title();
$itemdate = $item->get_date("Y-m-d");
if (empty($itemtitle)) $itemtitle="No itemtitle found";
// build item link
if ($gopher==1) {
$host = parse_url($itemlink, PHP_URL_HOST);
$port = parse_url($itemlink, PHP_URL_PORT);
$path = parse_url($itemlink, PHP_URL_PATH);
if (pathinfo($path, PATHINFO_EXTENSION)) {
$itemlist .= "0".$itemdate." ".$itemtitle."\t".substr($path,2)."\t".$host."\t".$port."\n";
}else{
$itemlist .= "1".$itemdate." ".$itemtitle."\t".substr($path,2)."\t".$host."\t".$port."\n";
}
}else{
// convert rss youtube url to youtu.be url
$itemlink = str_replace("www.youtube.com/watch?v=", "youtu.be/", $itemlink);
$itemlist .= "h".$itemdate." ".$itemtitle."\tURL:".$itemlink."\n";
}
$x++;
}
// build list of feed items
if ($x==0) {
$itemlist .= "! Error - No items found\n\n";
$itemlist .= "DEBUG\n";
$itemlist .= "curl $feedurl\n";
$itemlist .= "result:\n";
$itemlist .= $rssstring;
$itemlist .= "\nEOF\n";
}
file_put_contents("$subdir/gophermap", $itemlist);
// build list of feeds
$feedname = "1".$feeditemtitle."\t".basename($subdir)."\n";
file_put_contents("$root/gophermap", $feedname, FILE_APPEND);
// reset
unset($rssstring);
unset($rssdata);
unset($sfeed);
unset($itemlist);
}
?>
|