comment + link extraction
[stapibas.git] / src / stapibas / Content / Extractor.php
1 <?php
2 namespace stapibas;
3
4 class Content_Extractor
5 {
6     public $db;
7     public $log;
8
9     public function __construct(Dependencies $deps)
10     {
11         $this->deps = $deps;
12         $this->db   = $deps->db;
13         $this->log  = $deps->log;
14     }
15
16     /**
17      * Extracts content from all pingbackcontent entries and puts it
18      * into rbookmarks/rcomments/rlinks.
19      */
20     public function updateAll()
21     {
22         $this->log->info('Extracting pingback content..');
23         $res = $this->db->query(
24             'SELECT * FROM pingbackcontent, pingbacks'
25             . ' WHERE p_id = pc_p_id' . $this->sqlNeedsUpdate()
26         );
27         $items = 0;
28         while ($contentRow = $res->fetch(\PDO::FETCH_OBJ)) {
29             ++$items;
30             $this->extractContent($contentRow);
31         }
32         $this->log->info('Finished extracting %d pingback contents.', $items);
33     }
34
35     protected function extractContent($contentRow)
36     {
37         $doc = new \DOMDocument();
38         $typeParts = explode(';', $contentRow->pc_mime_type);
39         $type = $typeParts[0];
40         if ($type == 'application/xhtml+xml'
41             || $type == 'application/xml'
42             || $type == 'text/xml'
43         ) {
44             $doc->loadXML($contentRow->pc_fulltext);
45         } else { 
46             $doc->loadHTML($contentRow->pc_fulltext);
47         }
48
49         //delete old content
50         $this->db->exec(
51             'DELETE FROM rboomarks WHERE'
52             . ' rb_pc_id = ' . $this->db->quote($contentRow->pc_id)
53         );
54         $this->db->exec(
55             'DELETE FROM rcomments WHERE'
56             . ' rc_pc_id = ' . $this->db->quote($contentRow->pc_id)
57         );
58         $this->db->exec(
59             'DELETE FROM rlinks WHERE'
60             . ' rl_pc_id = ' . $this->db->quote($contentRow->pc_id)
61         );
62
63         $ce = new Content_Extractor_Comment($this->deps->log);
64         $data = $ce->extract($doc, $contentRow->p_source, $contentRow->p_target);
65         if ($data !== null) {
66             $this->log->info('Comment found');
67             var_dump($data);
68             $this->db->exec(
69                 'INSERT INTO rcomments SET'
70                 . '  rc_pc_id = ' . $this->db->quote($contentRow->pc_id)
71                 . ', rc_source = ' . $this->db->quote($contentRow->p_source)
72                 . ', rc_target = ' . $this->db->quote($contentRow->p_target)
73                 . ', rc_title = ' . $this->db->quote($data['title'])
74                 . ', rc_author_name = ' . $this->db->quote($data['author_name'])
75                 . ', rc_author_url = ' . $this->db->quote($data['author_url'])
76                 . ', rc_author_image = ' . $this->db->quote($data['author_image'])
77                 . ', rc_content = ' . $this->db->quote($data['content'])
78                 . ', rc_updated = NOW()'
79             );
80             return;
81         }
82
83         //FIXME: bookmark
84
85         $ce = new Content_Extractor_Link($this->deps->log);
86         $data = $ce->extract($doc, $contentRow->p_source, $contentRow->p_target);
87         if ($data !== null) {
88             $this->log->info('Link found');
89             var_dump($data);
90             $this->db->exec(
91                 'INSERT INTO rlinks SET'
92                 . '  rl_pc_id = ' . $this->db->quote($contentRow->pc_id)
93                 . ', rl_source = ' . $this->db->quote($contentRow->p_source)
94                 . ', rl_target = ' . $this->db->quote($contentRow->p_target)
95                 . ', rl_title = ' . $this->db->quote($data['title'])
96                 . ', rl_author_name = ' . $this->db->quote($data['author_name'])
97                 . ', rl_author_url = ' . $this->db->quote($data['author_url'])
98                 . ', rl_author_image = ' . $this->db->quote($data['author_image'])
99                 . ', rc_updated = NOW()'
100             );
101             return;
102         }
103
104         $this->log->info('Nothing found');
105     }
106
107
108     protected function sqlNeedsUpdate()
109     {
110         if ($this->deps->options['force']) {
111             return '';
112         }
113         return ' AND pc_detected_type = 1';
114     }
115
116 }
117 ?>