Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- /*
- http://danbooru.donmai.us/post/atom?tags=
- http://chan.sankakucomplex.com/post/atom?tags=
- http://gelbooru.com/index.php?page=atom&tags=
- */
- $id =(int)($_GET['id']);
- $sad_hide=true;
- $q2_c=mysql_fetch_assoc(mysql_query('select * from `'.$sad_prefix.'booru_feed` where `id`='.$id));
- if ((int)$q2_c['id']<1){
- header('http/1.0 404 not found');
- echo 'not found';
- return;
- }
- if ((int)($q2_c['ttl'])==0){$q2_c['ttl']=3*3600;}
- if (($q2_c['time']+$q2_c['ttl']>=time() and strlen($q2_c['rss'])>0) or
- (!iam() and ($_SERVER['REMOTE_ADDR']!==my_ip())) ){
- $sad_contype='text/xml';
- echo '<'.'?xml version="1.0" encoding="utf-8"?'.'>';
- echo $q2_c['rss'];
- echo '<!-- cached: '.date('Y-m-d H:i:sO',$q2_c['time']).' -->';
- return;
- }
- if (!iam() and ($_SERVER['REMOTE_ADDR']!==my_ip()) and (int)sad_option('dis_booru')==1){header('http/1.0 503');return;}
- function numnum($img){
- if (!preg_match('|https?://([0-9a-z.-]+)|',$img,$a)){return 0;}
- if ($a[1]=='danbooru.donmai.us'){return 11;}
- if ($a[1]=='kanaria.ru'){return 10;}
- if ($a[1]=='gelbooru.com'){return 9;}
- if ($a[1]=='chan.sankakucomplex.com'){return 8;}
- return 1;
- }
- $feed=array();set_time_limit(20*60);$debug=true;
- if ($debug){$fo=fopen($sad_prefix.'/debug','a');
- fwrite($fo,date('Y-m-d H:i:s').': start = '.$id."\r\n");fclose($fo);}
- // Перебираем все дочерные фиды
- $q =mysql_query('select * from `'.$sad_prefix.'booru_rss` where `parent`='.$id);
- while ($q_c=mysql_fetch_assoc($q)){
- if ($debug){
- $fo=fopen($sad_prefix.'/debug','a');
- fwrite($fo, date('Y-m-d H:i:s').': q_c id = '.$q_c['id'].'; url = "'.
- $q_c['url'].'"; time = '.date('Y-m-d H:iO',$q_c['time'])."\r\n");
- fclose($fo);
- }
- //pull a feed
- if ($q_c['time']+6*3600<time() or strlen($q_c['rss'])<1){
- $ch=curl_init($q_c['url']);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
- curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
- $q_c['rss']=curl_exec($ch);
- curl_close($ch);
- mysql_query('update `'.$sad_prefix.'booru_rss` set `time`=UNIX_TIMESTAMP(), `rss`="'.
- sad_safe_mysql($q_c['rss']).'" where `id`='.$q_c['id']);
- }
- //danbooru pool
- if (preg_match('|^https?://'.$sad_domain.'/booru/danpool\\.php\\?id=([0-9]+)|',$q_c['url'],$a)){
- // Делаем финт ушами и читаем не из rss, а из своей же базы данных
- $q3=mysql_query('select * from `'.$sad_prefix.'booru_pool_e` where `parent`='.$a[1]);
- if ($debug){$fo=fopen($sad_prefix.'/debug','a');
- fwrite($fo,date('Y-m-d H:i:s').': q_c id = '.$q_c['id'].'; danbooru pool = '.(int)$a[1].'; count = '.mysql_num_rows($q2)."\r\n");fclose($fo);}
- while ($q3_c=mysql_fetch_assoc($q3)){
- $feed[$q3_c['md5']]=array(
- 'title'=>$q3_c['title'],
- 'links'=>array('http://danbooru.donmai.us/posts/'.$q3_c['dan_id'].'/'),
- 'href' =>'http://danbooru.donmai.us/posts/'.$q3_c['dan_id'].'/',
- 'img' =>'http://danbooru.donmai.us'.$q3_c['src'],
- 'time' =>0
- );
- }
- continue;
- }
- //other places
- if ($q_c['time']+6*3600<time() or strlen($q_c['rss'])<1){
- $ch=curl_init($q_c['url']);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
- curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
- $q_c['rss']=curl_exec($ch);
- curl_close($ch);
- mysql_query('update `'.$sad_prefix.'booru_rss` set `time`=UNIX_TIMESTAMP(), `rss`="'.sad_safe_mysql($q_c['rss']).
- '" where `id`='.$q_c['id']);
- }
- preg_match('|^https?://([a-z0-9.-]+)|',$q_c['url'],$a);$domain=$a[1];
- $xml=sad_xml_rawtext($q_c['rss']);
- for ($i=1;true;$i++){
- $ent=sad_xml_getnode($xml,'entry|'.$i);
- if (gettype($ent)!=='object'){break;}
- $tmp = new DOMDocument('1.0');
- $tmp->appendChild($tmp->importNode(sad_xml_getnode($ent,'content'),true));
- $buf = $tmp->saveHTML();
- preg_match('|([a-f0-9]{32,32})|',$buf,$a); $md5=$a[1];
- if (!isset($feed[$md5])){$feed[$md5]=array('time'=>0,'links'=>array());}
- preg_match('|src="(.+?)"|i',$buf,$a);$img=$a[1];
- if (preg_match('|^/|',$img)){$img='http://'.$domain.$img;}
- if (numnum($feed[$md5]['img'])<numnum($img)){$feed[$md5]['img']=$img;}
- preg_match('|([0-9]{4,4})\-([0-9]{1,2})\-([0-9]{1,2})T([0-9]{1,2})\:([0-9]{1,2})\:([0-9]{1,2})Z|',sad_xml_getnode($ent,'updated#'),$a);//updated>2011-09-13T04:12:12Z
- $time=gmmktime($a[4],$a[5],$a[6], $a[2],$a[3],$a[1]);
- if ($feed[$md5]['time']>$time or $feed[$md5]['time']<1){$feed[$md5]['time']=$time;}
- if (strlen($feed[$md5]['title'])<1){$feed[$md5]['title']=sad_xml_getnode($ent,'title#'); }
- preg_match('|href="(.+?)"|i',$buf,$a);$href=$a[1];
- if (numnum($feed[$md5]['href'])<numnum($href)){$feed[$md5]['href']=$href;}
- $xml=sad_xml_rawtext($q_c['rss']);
- for ($j=1;true;$j++){
- $link=sad_xml_getnode($ent,'link|'.$j);
- if (gettype($link)!=='object'){break;}
- array_push($feed[$md5]['links'],sad_xml_attribute($link,'href'));
- }
- }
- if ($debug){$fo=fopen($sad_prefix.'/debug','a');
- fwrite($fo,date('Y-m-d H:i:s').': q_c id = '.$q_c['id'].'; i = '.$i."\r\n");fclose($fo);}
- } // while $q_c
- if ($debug){$fo=fopen($sad_prefix.'/debug','a');
- fwrite($fo,date('Y-m-d H:i:s').': count of feed = '.count($feed)."\r\n");fclose($fo);}
- // echo '<pre>';print_r($feed);
- $buf='';unset($md5);$time=0;
- foreach ($feed as $md5 => $e){
- if ($md5==''){continue;}
- $descr='<a href="'.$e['href'].'" target="_blank"><img src="'.$e['img'].'"></a><br>';
- foreach (array_unique($e['links']) as $link){
- if (strlen($link)>0){$descr.='<br><a href="'.$link.'" target="_blank">'.$link.'</a>';}
- }
- $buf.='<item>
- <title>'.sad_safe_xml($e['title']).'</title>
- <link>'.sad_safe_xml($e['href']).'</link>
- <description>'.sad_safe_xml($descr).'</description>
- <pubDate>'.gmdate("D, d M Y H:i:s \G\M\T",$e['time']).'</pubDate>
- <guid>booru-'.$md5.'</guid>
- </item>';
- $time=max($time,$e['time']);
- }
- if ($debug){$fo=fopen($sad_prefix.'/debug','a');
- fwrite($fo,date('Y-m-d H:i:s').': strlen($buf) = '.strlen($buf)."\r\n");fclose($fo);}
- $buf='<rss version="2.0"><channel><title>'.sad_safe_xml($q2_c['title'].' / Meta Booru').'</title><pubDate>'.
- gmdate("D, d M Y H:i:s \G\M\T",$time).'</pubDate><ttl>'.round($q2_c['ttl']/60).'</ttl>'.$buf.'</channel></rss>';
- $sad_contype='text/xml';
- echo '<'.'?xml version="1.0" encoding="utf-8"?'.'>';
- echo $buf;
- echo '<!-- generated now: '.date('Y-m-d H:i:sO').' -->';
- mysql_query('update `'.$sad_prefix.'booru_feed` set `rss`="'.sad_safe_mysql($buf).'", `time`=UNIX_TIMESTAMP() where `id`='.$id);
- ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement