]> git.wh0rd.org Git - tt-rss.git/blob - plugins/af_comics/init.php
af_comics: add happyjar
[tt-rss.git] / plugins / af_comics / init.php
1 <?php
2 class Af_Comics extends Plugin {
3
4         private $host;
5
6         function about() {
7                 return array(1.0,
8                         "Fixes RSS feeds of assorted comic strips",
9                         "fox");
10         }
11
12         function init($host) {
13                 $this->host = $host;
14
15                 $host->add_hook($host::HOOK_ARTICLE_FILTER, $this);
16                 $host->add_hook($host::HOOK_PREFS_TAB, $this);
17         }
18
19         function hook_prefs_tab($args) {
20                 if ($args != "prefPrefs") return;
21
22                 print "<div dojoType=\"dijit.layout.AccordionPane\" title=\"".__('Feeds supported by af_comics')."\">";
23
24                 print_notice("This plugin supports the following comics:");
25
26                 print "<ul class=\"browseFeedList\" style=\"border-width : 1px\">";
27                 print "<li>Buni</li>
28                 <li>Buttersafe</li>
29                 <li>CSection</li>
30                 <li>Dilbert</li>
31                 <li>Explosm</li>
32                 <li>GoComics</li>
33                 <li>Happy Jar</li>
34                 <li>Penny Arcade</li>
35                 <li>Three word phrase</li>
36                 <li>Whomp</li>";
37                 print "</ul>";
38
39                 print "</div>";
40         }
41
42         function hook_article_filter($article) {
43                 $owner_uid = $article["owner_uid"];
44
45                 $found = false;
46
47                 # div#comic - comicpress?
48
49                 if (strpos($article["guid"], "bunicomic.com") !== FALSE ||
50                                 strpos($article["guid"], "buttersafe.com") !== FALSE ||
51                                 strpos($article["guid"], "whompcomic.com") !== FALSE ||
52                                 strpos($article["guid"], "happyjar.com") !== FALSE ||
53                                 strpos($article["guid"], "csectioncomics.com") !== FALSE) {
54
55                          if (strpos($article["plugin_data"], "af_comics,$owner_uid:") === FALSE) {
56
57
58                                 // lol at people who block clients by user agent
59                                 // oh noes my ad revenue Q_Q
60
61                                 $res = fetch_file_contents($article["link"], false, false, false,
62                                          false, false, 0,
63                                          "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)");
64
65                                 $doc = new DOMDocument();
66                                 @$doc->loadHTML($res);
67
68                                 $basenode = false;
69
70                                 if ($doc) {
71                                         $xpath = new DOMXPath($doc);
72                                         $basenode = $xpath->query('//div[@id="comic"]')->item(0);
73
74                                         if ($basenode) {
75                                                 $article["content"] = $doc->saveXML($basenode);
76                                                 $article["plugin_data"] = "af_comics,$owner_uid:" . $article["plugin_data"];
77                                         }
78                                 }
79                         } else if (isset($article["stored"]["content"])) {
80                                 $article["content"] = $article["stored"]["content"];
81                         }
82                 }
83
84                 if (strpos($article["guid"], "dilbert.com") !== FALSE) {
85                         if (strpos($article["plugin_data"], "af_comics,$owner_uid:") === FALSE) {
86                                 $doc = new DOMDocument();
87                                 @$doc->loadHTML(fetch_file_contents($article["link"]));
88
89                                 $basenode = false;
90
91                                 if ($doc) {
92                                         $xpath = new DOMXPath($doc);
93                                         $entries = $xpath->query('(//img[@src])'); // we might also check for img[@class='strip'] I guess...
94
95                                         $matches = array();
96
97                                         foreach ($entries as $entry) {
98
99                                                 if (preg_match("/dyn\/str_strip\/.*zoom\.gif$/", $entry->getAttribute("src"), $matches)) {
100
101                                                         $entry->setAttribute("src",
102                                                                 rewrite_relative_url("http://dilbert.com/",
103                                                                 $matches[0]));
104
105                                                         $basenode = $entry;
106                                                         break;
107                                                 }
108                                         }
109
110                                         if ($basenode) {
111                                                 $article["content"] = $doc->saveXML($basenode);
112                                                 $article["plugin_data"] = "af_comics,$owner_uid:" . $article["plugin_data"];
113                                         }
114                                 }
115                         } else if (isset($article["stored"]["content"])) {
116                                 $article["content"] = $article["stored"]["content"];
117                         }
118                 }
119
120                 if (strpos($article["link"], "explosm.net/comics") !== FALSE) {
121                         if (strpos($article["plugin_data"], "af_comics,$owner_uid:") === FALSE) {
122
123                                 $doc = new DOMDocument();
124                                 @$doc->loadHTML(fetch_file_contents($article["link"]));
125
126                                 $basenode = false;
127
128                                 if ($doc) {
129                                         $xpath = new DOMXPath($doc);
130                                         $entries = $xpath->query('(//img[@src])'); // we might also check for img[@class='strip'] I guess...
131
132                                         $matches = array();
133
134                                         foreach ($entries as $entry) {
135
136                                                 if (preg_match("/(http:\/\/.*\/db\/files\/Comics\/.*)/i", $entry->getAttribute("src"), $matches)) {
137
138                                                         $basenode = $entry;
139                                                         break;
140                                                 }
141                                         }
142
143                                         if ($basenode) {
144                                                 $article["content"] = $doc->saveXML($basenode);
145                                                 $article["plugin_data"] = "af_comics,$owner_uid:" . $article["plugin_data"];
146                                         }
147                                 }
148                         } else if (isset($article["stored"]["content"])) {
149                                 $article["content"] = $article["stored"]["content"];
150                         }
151                 }
152
153                 if (strpos($article["guid"], "gocomics.com") !== FALSE) {
154                         if (strpos($article["plugin_data"], "af_comics,$owner_uid:") === FALSE) {
155                                 $doc = new DOMDocument();
156                                 @$doc->loadHTML(fetch_file_contents($article["link"]));
157
158                                 $basenode = false;
159
160                                 if ($doc) {
161                                         $xpath = new DOMXPath($doc);
162                                         $entries = $xpath->query('(//img[@src])'); // we might also check for img[@class='strip'] I guess...
163
164                                         $matches = array();
165
166                                         foreach ($entries as $entry) {
167
168                                                 if (preg_match("/(http:\/\/assets.amuniversal.com\/.*width.*)/i", $entry->getAttribute("src"), $matches)) {
169
170                                                         $entry->setAttribute("src", $matches[0]);
171                                                         $basenode = $entry;
172                                                         break;
173                                                 }
174                                         }
175
176                     if (!$basenode) {
177                         // fallback on the smaller version
178                         foreach ($entries as $entry) {
179
180                             if (preg_match("/(http:\/\/assets.amuniversal.com\/.*)/i", $entry->getAttribute("src"), $matches)) {
181
182                                 $entry->setAttribute("src", $matches[0]);
183                                 $basenode = $entry;
184                                 break;
185                             }
186                         }
187                     }
188
189                                         if ($basenode) {
190                                                 $article["content"] = $doc->saveXML($basenode);
191                                                 $article["plugin_data"] = "af_comics,$owner_uid:" . $article["plugin_data"];
192                                         }
193                                 }
194                         } else if (isset($article["stored"]["content"])) {
195                                 $article["content"] = $article["stored"]["content"];
196                         }
197                 }
198
199                 if (strpos($article["link"], "penny-arcade.com") !== FALSE && strpos($article["title"], "Comic:") !== FALSE) {
200                         if (strpos($article["plugin_data"], "af_comics,$owner_uid:") === FALSE) {
201
202                                 if ($debug_enabled) {
203                                         _debug("af_pennyarcade: Processing comic");
204                                 }
205
206                                 $doc = new DOMDocument();
207                                 $doc->loadHTML(fetch_file_contents($article["link"]));
208
209                                 $basenode = false;
210
211                                 if ($doc) {
212                                         $xpath = new DOMXPath($doc);
213                                         $entries = $xpath->query('(//div[@class="post comic"])');
214
215                                         foreach ($entries as $entry) {
216                                                 $basenode = $entry;
217                                         }
218
219                                         if ($basenode) {
220                                                 $article["content"] = $doc->saveXML($basenode);
221                                                 $article["plugin_data"] = "af_comics,$owner_uid:" . $article["plugin_data"];
222                                         }
223                                 }
224                         } else if (isset($article["stored"]["content"])) {
225                                 $article["content"] = $article["stored"]["content"];
226                         }
227                 }
228
229                 if (strpos($article["link"], "penny-arcade.com") !== FALSE && strpos($article["title"], "News Post:") !== FALSE) {
230                         if (strpos($article["plugin_data"], "af_comics,$owner_uid:") === FALSE) {
231                                 if ($debug_enabled) {
232                                         _debug("af_pennyarcade: Processing news post");
233                                 }
234                                 $doc = new DOMDocument();
235                                 $doc->loadHTML(fetch_file_contents($article["link"]));
236
237                                 if ($doc) {
238                                         $xpath = new DOMXPath($doc);
239                                         $entries = $xpath->query('(//div[@class="post"])');
240
241                                         $basenode = false;
242
243                                         foreach ($entries as $entry) {
244                                                 $basenode = $entry;
245                                         }
246
247                                         $uninteresting = $xpath->query('(//div[@class="heading"])');
248                                         foreach ($uninteresting as $i) {
249                                                 $i->parentNode->removeChild($i);
250                                         }
251
252                                         if ($basenode){
253                                                 $article["content"] = $doc->saveXML($basenode);
254                                                 $article["plugin_data"] = "af_comics,$owner_uid:" . $article["plugin_data"];
255                                         }
256                                 }
257                         } else if (isset($article["stored"]["content"])) {
258                                 $article["content"] = $article["stored"]["content"];
259                         }
260                 }
261
262                 if (strpos($article["link"], "threewordphrase.com") !== FALSE) {
263                         if (strpos($article["plugin_data"], "af_comics,$owner_uid:") === FALSE) {
264
265                                 $doc = new DOMDocument();
266                                 @$doc->loadHTML(fetch_file_contents($article["link"]));
267
268                                 $basenode = false;
269
270                                 if ($doc) {
271                                         $xpath = new DOMXpath($doc);
272
273                                         $basenode = $xpath->query("//td/center/img")->item(0);
274
275                                         if ($basenode) {
276                                                 $article["content"] = $doc->saveXML($basenode);
277                                                 $article["plugin_data"] = "af_comics,$owner_uid:" . $article["plugin_data"];
278                                         }
279                                 }
280                         } else if (isset($article["stored"]["content"])) {
281                                 $article["content"] = $article["stored"]["content"];
282                         }
283                 }
284
285                 return $article;
286         }
287
288         function api_version() {
289                 return 2;
290         }
291
292 }
293 ?>