summaryrefslogtreecommitdiff
path: root/bridges/AnimeUltimeBridge.php
blob: 5c719b92adba8f33d3c9eeb5b2ca36ad33ec63cd (plain)
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
<?php
class AnimeUltimeBridge extends BridgeAbstract {

	const MAINTAINER = 'ORelio';
	const NAME = 'Anime-Ultime';
	const URI = 'http://www.anime-ultime.net/';
	const CACHE_TIMEOUT = 10800; // 3h
	const DESCRIPTION = 'Returns the newest releases posted on Anime-Ultime.';
	const PARAMETERS = array( array(
		'type' => array(
		'name' => 'Type',
		'type' => 'list',
		'values' => array(
			'Everything' => '',
			'Anime' => 'A',
			'Drama' => 'D',
			'Tokusatsu' => 'T'
			)
		)
	));

	private $filter = 'Releases';

	public function collectData(){

		//Add type filter if provided
		$typeFilter = array_search(
			$this->getInput('type'),
			self::PARAMETERS[$this->queriedContext]['type']['values']
		);

		//Build date and filters for making requests
		$thismonth = date('mY') . $typeFilter;
		$lastmonth = date('mY', mktime(0, 0, 0, date('n') - 1, 1, date('Y'))) . $typeFilter;

		//Process each HTML page until having 10 releases
		$processedOK = 0;
		foreach (array($thismonth, $lastmonth) as $requestFilter) {

			//Retrive page contents
			$url = self::URI . 'history-0-1/' . $requestFilter;
			$html = getSimpleHTMLDOM($url)
				or returnServerError('Could not request Anime-Ultime: ' . $url);

			//Relases are sorted by day : process each day individually
			foreach($html->find('div.history', 0)->find('h3') as $daySection) {

				//Retrieve day and build date information
				$dateString = $daySection->plaintext;
				$day = intval(substr($dateString, strpos($dateString, ' ') + 1, 2));
				$item_date = strtotime(str_pad($day, 2, '0', STR_PAD_LEFT)
				. '-'
				. substr($requestFilter, 0, 2)
				. '-'
				. substr($requestFilter, 2, 4));

				//<h3>day</h3><br /><table><tr> <-- useful data in table rows
				$release = $daySection->next_sibling()->next_sibling()->first_child();

				//Process each release of that day, ignoring first table row: contains table headers
				while(!is_null($release = $release->next_sibling())) {
					if(count($release->find('td')) > 0) {

						//Retrieve metadata from table columns
						$item_link_element = $release->find('td', 0)->find('a', 0);
						$item_uri = self::URI . $item_link_element->href;
						$item_name = html_entity_decode($item_link_element->plaintext);

						$item_image = self::URI . substr(
							$item_link_element->onmouseover,
							37,
							strpos($item_link_element->onmouseover, ' ', 37) - 37
						);

						$item_episode = html_entity_decode(
							str_pad(
								$release->find('td', 1)->plaintext,
								2,
								'0',
								STR_PAD_LEFT
							)
						);

						$item_fansub = $release->find('td', 2)->plaintext;
						$item_type = $release->find('td', 4)->plaintext;

						if(!empty($item_uri)) {

							// Retrieve description from description page
							$html_item = getContents($item_uri)
								or returnServerError('Could not request Anime-Ultime: ' . $item_uri);
							$item_description = substr(
								$html_item,
								strpos($html_item, 'class="principal_contain" align="center">') + 41
							);
							$item_description = substr($item_description,
								0,
								strpos($item_description, '<div id="table">')
							);

							// Convert relative image src into absolute image src, remove line breaks
							$item_description = defaultLinkTo($item_description, self::URI);
							$item_description = str_replace("\r", '', $item_description);
							$item_description = str_replace("\n", '', $item_description);
							$item_description = utf8_encode($item_description);

							//Build and add final item
							$item = array();
							$item['uri'] = $item_uri;
							$item['title'] = $item_name . ' ' . $item_type . ' ' . $item_episode;
							$item['author'] = $item_fansub;
							$item['timestamp'] = $item_date;
							$item['enclosures'] = array($item_image);
							$item['content'] = $item_description;
							$this->items[] = $item;
							$processedOK++;

							//Stop processing once limit is reached
							if ($processedOK >= 10)
								return;
						}
					}
				}
			}
		}
	}

	public function getName() {
		if(!is_null($this->getInput('type'))) {
			$typeFilter = array_search(
				$this->getInput('type'),
				self::PARAMETERS[$this->queriedContext]['type']['values']
			);

			return 'Latest ' . $typeFilter . ' - Anime-Ultime Bridge';
		}

		return parent::getName();
	}

}