Completed
Push — master ( b78c73...7083d7 )
by Yannick
20s queued 11s
created

Image::fromAirportData()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
nc 2
nop 4
dl 0
loc 16
rs 9.7333
c 0
b 0
f 0
1
<?php
2
/**
3
 * This class is part of FlightAirmap. It's used to get Image
4
 *
5
 * Copyright (c) Ycarus (Yannick Chabanois) at Zugaina <[email protected]>
6
 * Licensed under AGPL license.
7
 * For more information see: https://www.flightairmap.com/
8
*/
9
require_once(dirname(__FILE__).'/class.Spotter.php');
10
require_once(dirname(__FILE__).'/class.Common.php');
11
require_once(dirname(__FILE__).'/settings.php');
12
13
class Image {
14
	public $db;
15
16
	/*
17
	 * Initialize connection to DB
18
	*/
19
	public function __construct($dbc = null) {
20
		$Connection = new Connection($dbc);
21
		$this->db = $Connection->db();
22
		if ($this->db === null) die('Error: No DB connection. (Image)');
23
	}
24
25
    /**
26
     * Gets the images based on the aircraft registration
27
     *
28
     * @param $registration
29
     * @param string $aircraft_icao
30
     * @param string $airline_icao
31
     * @return array the images list
32
     */
33
	public function getSpotterImage($registration,$aircraft_icao = '', $airline_icao = '')
34
	{
35
		$registration = filter_var($registration,FILTER_SANITIZE_STRING);
36
		$aircraft_icao = filter_var($aircraft_icao,FILTER_SANITIZE_STRING);
37
		$airline_icao = filter_var($airline_icao,FILTER_SANITIZE_STRING);
38
		$reg = $registration;
39
		if (($reg == '' || $reg == 'NA') && $aircraft_icao != '') $reg = $aircraft_icao.$airline_icao;
40
		$reg = trim($reg);
41
		$query  = "SELECT spotter_image.image, spotter_image.image_thumbnail, spotter_image.image_source, spotter_image.image_source_website,spotter_image.image_copyright, spotter_image.registration 
42
			FROM spotter_image 
43
			WHERE spotter_image.registration = :registration LIMIT 1";
44
		$sth = $this->db->prepare($query);
45
		$sth->execute(array(':registration' => $reg));
46
		$result = $sth->fetchAll(PDO::FETCH_ASSOC);
47
		if (!empty($result)) return $result;
48
		elseif ($registration != '' && ($aircraft_icao != '' || $airline_icao != '')) return $this->getSpotterImage('',$aircraft_icao,$airline_icao);
49
		else return array();
50
	}
51
52
    /**
53
     * Gets the images based on the ship name
54
     *
55
     * @param $mmsi
56
     * @param string $imo
57
     * @param string $name
58
     * @param string $type_name
59
     * @return array the images list
60
     */
61
	public function getMarineImage($mmsi,$imo = '',$name = '',$type_name = '')
62
	{
63
		global $globalMarineImagePics;
64
		$mmsi = filter_var($mmsi,FILTER_SANITIZE_STRING);
65
		$imo = filter_var($imo,FILTER_SANITIZE_STRING);
66
		$name = filter_var($name,FILTER_SANITIZE_STRING);
67
		$type_name = str_replace('&#39;',"'",filter_var($type_name,FILTER_SANITIZE_STRING));
68
		if (isset($globalMarineImagePics) && !empty($globalMarineImagePics)) {
69
			if ($type_name != '' && isset($globalMarineImagePics['type'][$type_name])) {
70
				if (!isset($globalMarineImagePics['type'][$type_name]['image_thumbnail'])) {
71
					$globalMarineImagePics['type'][$type_name]['image_thumbnail'] = $globalMarineImagePics['type'][$type_name]['image'];
72
				}
73
				return array($globalMarineImagePics['type'][$type_name]+array('image_thumbnail' => '','image' => '', 'image_copyright' => '','image_source' => '','image_source_website' => ''));
74
			}
75
		}
76
		$name = trim($name);
77
		if ($mmsi == '' && $imo == '' && $name == '') return array();
78
		$query  = "SELECT marine_image.image, marine_image.image_thumbnail, marine_image.image_source, marine_image.image_source_website,marine_image.image_copyright, marine_image.mmsi, marine_image.imo, marine_image.name 
79
			FROM marine_image 
80
			WHERE marine_image.mmsi = :mmsi";
81
		$query_data = array(':mmsi' => $mmsi);
82
		if ($imo != '') {
83
			$query .= " AND marine_image.imo = :imo";
84
			$query_data = array_merge($query_data,array(':imo' => $imo));
85
		}
86
		if ($name != '') {
87
			$query .= " AND marine_image.name = :name";
88
			$query_data = array_merge($query_data,array(':name' => $name));
89
		}
90
		$query .= " LIMIT 1";
91
		$sth = $this->db->prepare($query);
92
		$sth->execute($query_data);
93
		$result = $sth->fetchAll(PDO::FETCH_ASSOC);
94
		return $result;
95
	}
96
97
    /**
98
     * Gets the image copyright based on the Exif data
99
     *
100
     * @param $url
101
     * @return String image copyright
102
     */
103
	public function getExifCopyright($url) {
104
		$exif = exif_read_data($url);
105
		$copyright = '';
106
		if (isset($exif['COMPUTED']['copyright'])) $copyright = $exif['COMPUTED']['copyright'];
107
		elseif (isset($exif['copyright'])) $copyright = $exif['copyright'];
108
		if ($copyright != '') {
109
			$copyright = str_replace('Copyright ','',$copyright);
110
			$copyright = str_replace('© ','',$copyright);
111
			$copyright = str_replace('(c) ','',$copyright);
112
		}
113
		return $copyright;
114
	}
115
116
    /**
117
     * Adds the images based on the aircraft registration
118
     *
119
     * @param $registration
120
     * @param string $aircraft_icao
121
     * @param string $airline_icao
122
     * @return String either success or error
123
     */
124
	public function addSpotterImage($registration,$aircraft_icao = '', $airline_icao = '')
125
	{
126
		global $globalDebug,$globalAircraftImageFetch, $globalOffline;
127
		if ((isset($globalAircraftImageFetch) && $globalAircraftImageFetch === FALSE) || (isset($globalOffline) && $globalOffline === TRUE)) return '';
128
		$registration = filter_var($registration,FILTER_SANITIZE_STRING);
129
		$registration = trim($registration);
130
		//getting the aircraft image
131
		if ($globalDebug && $registration != '') echo 'Try to find an aircraft image for '.$registration.'...';
132
		elseif ($globalDebug && $aircraft_icao != '') echo 'Try to find an aircraft image for '.$aircraft_icao.'...';
133
		elseif ($globalDebug && $airline_icao != '') echo 'Try to find an aircraft image for '.$airline_icao.'...';
134
		$image_url = $this->findAircraftImage($registration,$aircraft_icao,$airline_icao);
135
		if ($registration == '' && $aircraft_icao != '') $registration = $aircraft_icao.$airline_icao;
136
		if ($image_url['original'] != '') {
137
			if ($globalDebug) echo 'Found !'."\n";
138
			$query  = "INSERT INTO spotter_image (registration, image, image_thumbnail, image_copyright, image_source,image_source_website) VALUES (:registration,:image,:image_thumbnail,:copyright,:source,:source_website)";
139
			try {
140
				$sth = $this->db->prepare($query);
141
				$sth->execute(array(':registration' => $registration,':image' => $image_url['original'],':image_thumbnail' => $image_url['thumbnail'], ':copyright' => $image_url['copyright'],':source' => $image_url['source'],':source_website' => $image_url['source_website']));
142
			} catch(PDOException $e) {
143
				echo $e->getMessage()."\n";
144
				return "error";
145
			}
146
		} elseif ($globalDebug) echo "Not found :'(\n";
147
		return "success";
148
	}
149
150
    /**
151
     * Adds the images based on the marine name
152
     *
153
     * @param $mmsi
154
     * @param string $imo
155
     * @param string $name
156
     * @return String either success or error
157
     */
158
	public function addMarineImage($mmsi,$imo = '',$name = '')
159
	{
160
		global $globalDebug,$globalMarineImageFetch, $globalOffline;
161
		if ((isset($globalMarineImageFetch) && !$globalMarineImageFetch) || (isset($globalOffline) && $globalOffline === TRUE)) return '';
162
		$mmsi = filter_var($mmsi,FILTER_SANITIZE_STRING);
163
		$imo = filter_var($imo,FILTER_SANITIZE_STRING);
164
		$name = filter_var($name,FILTER_SANITIZE_STRING);
165
		$name = trim($name);
166
		$Marine = new Marine($this->db);
167
		if ($imo == '' || $name == '') {
168
			$identity = $Marine->getIdentity($mmsi);
169
			if (isset($identity[0]['mmsi'])) {
170
				$imo = $identity[0]['imo'];
171
				if ($identity[0]['ship_name'] != '') $name = $identity[0]['ship_name'];
172
			}
173
		}
174
		unset($Marine);
175
176
		//getting the aircraft image
177
		if ($globalDebug && $name != '') echo 'Try to find an vessel image for '.$name.'...';
178
		$image_url = $this->findMarineImage($mmsi,$imo,$name);
179
		if ($image_url['original'] != '') {
180
			if ($globalDebug) echo 'Found !'."\n";
181
			$query  = "INSERT INTO marine_image (mmsi,imo,name, image, image_thumbnail, image_copyright, image_source,image_source_website) VALUES (:mmsi,:imo,:name,:image,:image_thumbnail,:copyright,:source,:source_website)";
182
			try {
183
				$sth = $this->db->prepare($query);
184
				$sth->execute(array(':mmsi' => $mmsi,':imo' => $imo,':name' => $name,':image' => $image_url['original'],':image_thumbnail' => $image_url['thumbnail'], ':copyright' => $image_url['copyright'],':source' => $image_url['source'],':source_website' => $image_url['source_website']));
185
			} catch(PDOException $e) {
186
				echo $e->getMessage()."\n";
187
				return "error";
188
			}
189
		} elseif ($globalDebug) echo "Not found :'(\n";
190
		return "success";
191
	}
192
193
    /**
194
     * Gets the aircraft image
195
     *
196
     * @param String $aircraft_registration the registration of the aircraft
197
     * @param string $aircraft_icao
198
     * @param string $airline_icao
199
     * @return array the aircraft thumbnail, orignal url and copyright
200
     */
201
	public function findAircraftImage($aircraft_registration, $aircraft_icao = '', $airline_icao = '')
202
	{
203
		global $globalAircraftImageSources, $globalIVAO, $globalAircraftImageCheckICAO, $globalVA;
204
		$Spotter = new Spotter($this->db);
205
		if (!isset($globalIVAO)) $globalIVAO = FALSE;
206
		$aircraft_registration = filter_var($aircraft_registration,FILTER_SANITIZE_STRING);
207
		if ($aircraft_registration != '' && $aircraft_registration != 'NA' && (!isset($globalVA) || $globalVA !== TRUE)) {
208
			if (strpos($aircraft_registration,'/') !== false) return array('thumbnail' => '','original' => '', 'copyright' => '','source' => '','source_website' => '');
209
			$aircraft_registration = urlencode(trim($aircraft_registration));
210
			$aircraft_info = $Spotter->getAircraftInfoByRegistration($aircraft_registration);
211
			if (isset($aircraft_info[0]['aircraft_name'])) $aircraft_name = $aircraft_info[0]['aircraft_name'];
212
			else $aircraft_name = '';
213
			if (isset($aircraft_info[0]['aircraft_icao'])) $aircraft_name = $aircraft_info[0]['aircraft_icao'];
214
			else $aircraft_icao = '';
215
			if (isset($aircraft_info[0]['airline_icao'])) $airline_icao = $aircraft_info[0]['airline_icao'];
216
			else $airline_icao = '';
217
		} elseif ($aircraft_icao != '') {
218
			$aircraft_info = $Spotter->getAllAircraftInfo($aircraft_icao);
219
			if (isset($aircraft_info[0]['type'])) $aircraft_name = $aircraft_info[0]['type'];
220
			else $aircraft_name = '';
221
			$aircraft_registration = $aircraft_icao;
222
		} else return array('thumbnail' => '','original' => '', 'copyright' => '', 'source' => '','source_website' => '');
223
		unset($Spotter);
224
		if (!isset($globalAircraftImageSources)) $globalAircraftImageSources = array('ivaomtl','wikimedia','airportdata','deviantart','flickr','bing','jetphotos','planepictures','planespotters');
225
		foreach ($globalAircraftImageSources as $source) {
226
			$source = strtolower($source);
227
			if ($source == 'ivaomtl' && $globalIVAO && $aircraft_icao != '' && $airline_icao != '') $images_array = $this->fromIvaoMtl('aircraft',$aircraft_icao,$airline_icao);
228
			if ($source == 'planespotters' && !$globalIVAO && extension_loaded('simplexml')) $images_array = $this->fromPlanespotters('aircraft',$aircraft_registration,$aircraft_name);
229
			if ($source == 'flickr' && extension_loaded('simplexml')) $images_array = $this->fromFlickr('aircraft',$aircraft_registration,$aircraft_name);
230
			if ($source == 'bing') $images_array = $this->fromBing('aircraft',$aircraft_registration,$aircraft_name);
231
			if ($source == 'deviantart' && extension_loaded('simplexml')) $images_array = $this->fromDeviantart('aircraft',$aircraft_registration,$aircraft_name);
232
			if ($source == 'wikimedia') $images_array = $this->fromWikimedia('aircraft',$aircraft_registration,$aircraft_name);
233
			if ($source == 'jetphotos' && !$globalIVAO && class_exists("DomDocument")) $images_array = $this->fromJetPhotos('aircraft',$aircraft_registration,$aircraft_name);
234
			if ($source == 'planepictures' && !$globalIVAO && class_exists("DomDocument")) $images_array = $this->fromPlanePictures('aircraft',$aircraft_registration,$aircraft_name);
235
			if ($source == 'airportdata' && !$globalIVAO) $images_array = $this->fromAirportData('aircraft',$aircraft_registration,$aircraft_icao,$aircraft_name);
236
			if ($source == 'customsources') $images_array = $this->fromCustomSource('aircraft',$aircraft_registration,$aircraft_name);
237
			if (isset($images_array) && $images_array['original'] != '') return $images_array;
238
		}
239
		if ((!isset($globalAircraftImageCheckICAO) || $globalAircraftImageCheckICAO === TRUE) && isset($aircraft_icao)) return $this->findAircraftImage($aircraft_icao);
240
		return array('thumbnail' => '','original' => '', 'copyright' => '','source' => '','source_website' => '');
241
	}
242
243
	/**
244
	* Gets the vessel image
245
	*
246
	* @param String $mmsi the vessel mmsi
247
	* @param String $imo the vessel imo
248
	* @param String $name the vessel name
249
	* @return array the aircraft thumbnail, orignal url and copyright
250
	*
251
	*/
252
	public function findMarineImage($mmsi,$imo = '',$name = '')
0 ignored issues
show
Unused Code introduced by
The parameter $imo is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
253
	{
254
		global $globalMarineImageSources;
255
		$mmsi = filter_var($mmsi,FILTER_SANITIZE_STRING);
256
		//$imo = filter_var($imo,FILTER_SANITIZE_STRING);
257
		$name = filter_var($name,FILTER_SANITIZE_STRING);
258
		$name = trim($name);
259
		if (strlen($name) < 4) return array('thumbnail' => '','original' => '', 'copyright' => '', 'source' => '','source_website' => '');
260
		/*
261
		$Marine = new Marine($this->db);
262
		if ($imo == '' || $name == '') {
263
			$identity = $Marine->getIdentity($mmsi);
264
			if (isset($identity[0]['mmsi'])) {
265
				$imo = $identity[0]['imo'];
266
				$name = $identity[0]['ship_name'];
267
			}
268
		}
269
		unset($Marine);
270
		*/
271
		if (!isset($globalMarineImageSources)) $globalMarineImageSources = array('wikimedia','deviantart','flickr','bing');
272
		foreach ($globalMarineImageSources as $source) {
273
			$source = strtolower($source);
274
			if ($source == 'flickr') $images_array = $this->fromFlickr('marine',$mmsi,$name);
275
			if ($source == 'bing') $images_array = $this->fromBing('marine',$mmsi,$name);
276
			if ($source == 'deviantart') $images_array = $this->fromDeviantart('marine',$mmsi,$name);
277
			if ($source == 'wikimedia') $images_array = $this->fromWikimedia('marine',$mmsi,$name);
278
			if ($source == 'customsources') $images_array = $this->fromCustomSource('marine',$mmsi,$name);
279
			if (isset($images_array) && $images_array['original'] != '') return $images_array;
280
		}
281
		return array('thumbnail' => '','original' => '', 'copyright' => '','source' => '','source_website' => '');
282
	}
283
284
	/**
285
	* Gets the aircraft image from Planespotters
286
	*
287
	* @param String $aircraft_registration the registration of the aircraft
288
	* @param String $aircraft_name type of the aircraft
289
	* @return array the aircraft thumbnail, orignal url and copyright
290
	*
291
	*/
292
	public function fromPlanespotters($type,$aircraft_registration, $aircraft_name='') {
0 ignored issues
show
Unused Code introduced by
The parameter $type is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
293
		$Common = new Common();
294
		// If aircraft registration is only number, also check with aircraft model
295
		if (preg_match('/^[[:digit]]+$/',$aircraft_registration) && $aircraft_name != '') {
296
			$url= 'http://www.planespotters.net/Aviation_Photos/search.php?tag='.$aircraft_registration.'&actype=s_'.urlencode($aircraft_name).'&output=rss';
297
		} else {
298
			//$url= 'http://www.planespotters.net/Aviation_Photos/search.php?tag='.$airline_aircraft_type.'&output=rss';
299
			$url= 'http://www.planespotters.net/Aviation_Photos/search.php?reg='.$aircraft_registration.'&output=rss';
300
		}
301
		$data = $Common->getData($url);
302
		if (substr($data, 0, 5) != "<?xml") return array('thumbnail' => '','original' => '', 'copyright' => '','source' => '','source_website' => '');
303
		if ($xml = simplexml_load_string($data)) {
304
			if (isset($xml->channel->item)) {
305
				$image_url = array();
306
				$thumbnail_url = trim((string)$xml->channel->item->children('http://search.yahoo.com/mrss/')->thumbnail->attributes()->url);
307
				$image_url['thumbnail'] = $thumbnail_url;
308
				$image_url['original'] = str_replace('thumbnail','original',$thumbnail_url);
309
				$image_url['copyright'] = trim((string)$xml->channel->item->children('http://search.yahoo.com/mrss/')->copyright);
310
				$image_url['source_website'] = trim((string)$xml->channel->item->link);
311
				$image_url['source'] = 'planespotters';
312
				return $image_url;
313
			}
314
		} 
315
		return array('thumbnail' => '','original' => '', 'copyright' => '','source' => '','source_website' => '');
316
	}
317
318
    /**
319
     * Gets the aircraft image from Deviantart
320
     *
321
     * @param $type
322
     * @param String $registration the registration of the aircraft
323
     * @param String $name type of the aircraft
324
     * @return array the aircraft thumbnail, orignal url and copyright
325
     */
326
	public function fromDeviantart($type,$registration, $name='') {
327
		$Common = new Common();
328
		if ($type == 'aircraft') {
329
			// If aircraft registration is only number, also check with aircraft model
330
			if (preg_match('/^[[:digit]]+$/',$registration) && $name != '') {
331
				$url= 'http://backend.deviantart.com/rss.xml?type=deviation&q='.$registration.'%20'.urlencode($name);
332
			} else {
333
				$url= 'http://backend.deviantart.com/rss.xml?type=deviation&q=aircraft%20'.$registration;
334
			}
335
		} elseif ($type == 'marine') {
336
			$url= 'http://backend.deviantart.com/rss.xml?type=deviation&q=ship%20"'.urlencode($name).'"';
337
		} else {
338
			$url= 'http://backend.deviantart.com/rss.xml?type=deviation&q="'.urlencode($name).'"';
339
		}
340
		$data = $Common->getData($url);
341
		if (substr($data, 0, 5) != "<?xml") return array('thumbnail' => '','original' => '', 'copyright' => '','source' => '','source_website' => '');
342
		if ($xml = simplexml_load_string($data)) {
343
			if (isset($xml->channel->item->link)) {
344
				$image_url = array();
345
				$thumbnail_url = trim((string)$xml->channel->item->children('http://search.yahoo.com/mrss/')->thumbnail->attributes()->url);
346
				$image_url['thumbnail'] = $thumbnail_url;
347
				$original_url = trim((string)$xml->channel->item->children('http://search.yahoo.com/mrss/')->content->attributes()->url);
348
				$image_url['original'] = $original_url;
349
				$image_url['copyright'] = str_replace('Copyright ','',trim((string)$xml->channel->item->children('http://search.yahoo.com/mrss/')->copyright));
350
				$image_url['source_website'] = trim((string)$xml->channel->item->link);
351
				$image_url['source'] = 'deviantart';
352
				return $image_url;
353
			}
354
		} 
355
		return array('thumbnail' => '','original' => '', 'copyright' => '','source' => '','source_website' => '');
356
	}
357
358
	/**
359
	* Gets the aircraft image from JetPhotos
360
	*
361
	* @param String $aircraft_registration the registration of the aircraft
362
	* @param String $aircraft_name type of the aircraft
363
	* @return array the aircraft thumbnail, orignal url and copyright
364
	*
365
	*/
366
	public function fromJetPhotos($type,$aircraft_registration, $aircraft_name='') {
0 ignored issues
show
Unused Code introduced by
The parameter $type is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $aircraft_name is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
367
		$Common = new Common();
368
		$url= 'https://www.jetphotos.com/photo/keyword/'.$aircraft_registration;
369
		$data = $Common->getData($url);
370
		$dom = new DOMDocument();
371
		@$dom->loadHTML($data);
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
372
		$all_pics = array();
373
                foreach($dom->getElementsByTagName('img') as $image) {
374
                 $all_pics[] = $image->getAttribute('src');
375
                }
376
		$all_authors = array();
377
                foreach($dom->getElementsByTagName('span') as $author) {
378
                 if (strpos($author->nodeValue, "By: ") !== false) {
379
                  $all_authors[] = $author->nodeValue;
380
                 }
381
                }
382
		$all_ref = array();
383
                foreach($dom->getElementsByTagName('a') as $link) {
384
                 if (strpos($link->getAttribute('href'), "/photo/") !== false) {
385
                  $all_ref[] = $link->getAttribute('href');
386
                 }
387
                }
388
		if (isset($all_pics[8])) {
389
			$image_url = array();
390
			$image_url['thumbnail'] = 'http:'.$all_pics[3];
391
			$image_url['original'] = 'http:'.str_replace('/400/','/full/',$all_pics[3]);
392
			$image_url['copyright'] = str_replace('By: ','',$all_authors[0]);
393
			$image_url['source_website'] = 'https://jetphotos.net'.$all_ref[0];
394
			$image_url['source'] = 'JetPhotos';
395
			return $image_url;
396
		}
397
		return array('thumbnail' => '','original' => '', 'copyright' => '','source' => '','source_website' => '');
398
	}
399
400
	/**
401
	* Gets the aircraft image from PlanePictures
402
	*
403
	* @param String $aircraft_registration the registration of the aircraft
404
	* @param String $aircraft_name type of the aircraft
405
	* @return array the aircraft thumbnail, orignal url and copyright
406
	*
407
	*/
408
	public function fromPlanePictures($type,$aircraft_registration, $aircraft_name='') {
0 ignored issues
show
Unused Code introduced by
The parameter $type is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $aircraft_name is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
409
		$Common = new Common();
410
		$url= 'https://www.planepictures.net/v3/search_en.php?srch='.$aircraft_registration.'&stype=reg&srng=2';
411
		$data = $Common->getData($url);
412
		$dom = new DOMDocument();
413
		@$dom->loadHTML($data);
0 ignored issues
show
Security Best Practice introduced by
It seems like you do not handle an error condition here. This can introduce security issues, and is generally not recommended.

If you suppress an error, we recommend checking for the error condition explicitly:

// For example instead of
@mkdir($dir);

// Better use
if (@mkdir($dir) === false) {
    throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
Loading history...
414
		$all_pics = array();
415
		foreach($dom->getElementsByTagName('img') as $image) {
416
			$all_pics[] = $image->getAttribute('src');
417
		}
418
		$all_links = array();
419
		foreach($dom->getElementsByTagName('a') as $link) {
420
			$all_links[] = array('text' => $link->textContent,'href' => $link->getAttribute('href'));
421
		}
422
		if (isset($all_pics[4])) {
423
			$image_url = array();
424
			$image_url['thumbnail'] = 'http://www.planepictures.net'.$all_pics[4];
425
			$image_url['original'] = 'http://www.planepictures.net'.str_replace('_TN','',$all_pics[4]);
426
			$image_url['copyright'] = $all_links[28]['text'];
427
			$image_url['source_website'] = 'https://www.planepictures.net'.str_replace('./','/',$all_links[23]['href']);
428
			$image_url['source'] = 'PlanePictures';
429
			return $image_url;
430
		}
431
		return array('thumbnail' => '','original' => '', 'copyright' => '','source' => '','source_website' => '');
432
	}
433
434
	/**
435
	* Gets the aircraft image from Flickr
436
	*
437
	* @param String $registration the registration of the aircraft
438
	* @param String $name type of the aircraft
439
	* @return array the aircraft thumbnail, orignal url and copyright
440
	*
441
	*/
442
	public function fromFlickr($type,$registration,$name='') {
443
		$Common = new Common();
444
		if ($type == 'aircraft') {
445
			if ($name != '') $url = 'https://api.flickr.com/services/feeds/photos_public.gne?format=rss2&license=1,2,3,4,5,6,7&per_page=1&tags='.$registration.','.urlencode($name);
446
			else $url = 'https://api.flickr.com/services/feeds/photos_public.gne?format=rss2&license=1,2,3,4,5,6,7&per_page=1&tags='.$registration.',aircraft';
447
		} elseif ($type == 'marine') {
448
			if ($name != '') $url = 'https://api.flickr.com/services/feeds/photos_public.gne?format=rss2&license=1,2,3,4,5,6,7&per_page=1&tags=ship,'.urlencode($name);
449
			else $url = 'https://api.flickr.com/services/feeds/photos_public.gne?format=rss2&license=1,2,3,4,5,6,7&per_page=1&tags='.$registration.',ship';
450
		}
451
		$data = $Common->getData($url);
0 ignored issues
show
Bug introduced by
The variable $url does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
452
		if (substr($data, 0, 5) != "<?xml") return array('thumbnail' => '','original' => '', 'copyright' => '','source' => '','source_website' => '');
453
		if ($xml = simplexml_load_string($data)) {
454
			if (isset($xml->channel->item)) {
455
				$original_url = trim((string)$xml->channel->item->enclosure->attributes()->url);
456
				$image_url = array();
457
				$image_url['thumbnail'] = $original_url;
458
				$image_url['original'] = $original_url;
459
				$image_url['copyright'] = trim((string)$xml->channel->item->children('http://search.yahoo.com/mrss/')->credit);
460
				$image_url['source_website'] = trim((string)$xml->channel->item->link);
461
				$image_url['source'] = 'flickr';
462
				return $image_url;
463
			}
464
		} 
465
		return array('thumbnail' => '','original' => '', 'copyright' => '','source' => '','source_website' => '');
466
	}
467
468
    /**
469
     * @param $type
470
     * @param $aircraft_icao
471
     * @param $airline_icao
472
     * @return array
473
     */
474
    public function fromIvaoMtl($type, $aircraft_icao, $airline_icao) {
0 ignored issues
show
Unused Code introduced by
The parameter $type is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
475
		$Common = new Common();
476
		//echo "\n".'SEARCH IMAGE : http://mtlcatalog.ivao.aero/images/aircraft/'.$aircraft_icao.$airline_icao.'.jpg';
477
		if ($Common->urlexist('http://mtlcatalog.ivao.aero/images/aircraft/'.$aircraft_icao.$airline_icao.'.jpg')) {
478
			$image_url = array();
479
			$image_url['thumbnail'] = 'http://mtlcatalog.ivao.aero/images/aircraft/'.$aircraft_icao.$airline_icao.'.jpg';
480
			$image_url['original'] = 'http://mtlcatalog.ivao.aero/images/aircraft/'.$aircraft_icao.$airline_icao.'.jpg';
481
			$image_url['copyright'] = 'IVAO';
482
			$image_url['source_website'] = 'http://mtlcatalog.ivao.aero/';
483
			$image_url['source'] = 'ivao.aero';
484
			return $image_url;
485
		} else {
486
			return array('thumbnail' => '','original' => '', 'copyright' => '','source' => '','source_website' => '');
487
		}
488
	}
489
490
    /**
491
     * Gets the aircraft image from Bing
492
     *
493
     * @param $type
494
     * @param String $aircraft_registration the registration of the aircraft
495
     * @param String $aircraft_name type of the aircraft
496
     * @return array the aircraft thumbnail, orignal url and copyright
497
     */
498
	public function fromBing($type,$aircraft_registration,$aircraft_name='') {
499
		global $globalImageBingKey;
500
		$Common = new Common();
501
		if (!isset($globalImageBingKey) || $globalImageBingKey == '') return array('thumbnail' => '','original' => '', 'copyright' => '','source' => '','source_website' => '');
502
		if ($type == 'aircraft') {
503
			if ($aircraft_name != '') $url = 'https://api.datamarket.azure.com/Bing/Search/v1/Image?$format=json&$top=1&Query=%27'.$aircraft_registration.'%20'.urlencode($aircraft_name).'%20-site:planespotters.com%20-site:flickr.com%27';
504
			else $url = 'https://api.datamarket.azure.com/Bing/Search/v1/Image?$format=json&$top=1&Query=%27%2B'.$aircraft_registration.'%20%2Baircraft%20-site:planespotters.com%20-site:flickr.com%27';
505
		} elseif ($type == 'marine') {
506
			if ($aircraft_name != '') $url = 'https://api.datamarket.azure.com/Bing/Search/v1/Image?$format=json&$top=1&Query=%27'.urlencode($aircraft_name).'%20%2Bship%20-site:flickr.com%27';
507
			else $url = 'https://api.datamarket.azure.com/Bing/Search/v1/Image?$format=json&$top=1&Query=%27%2B'.$aircraft_registration.'%20%2Bship%20-site:flickr.com%27';
508
		}
509
		$headers = array("Authorization: Basic " . base64_encode("ignored:".$globalImageBingKey));
510
		$data = $Common->getData($url,'get','',$headers);
0 ignored issues
show
Bug introduced by
The variable $url does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
511
		$result = json_decode($data);
512
		if (isset($result->d->results[0]->MediaUrl)) {
513
			$image_url = array();
514
			$image_url['original'] = $result->d->results[0]->MediaUrl;
515
			$image_url['source_website'] = $result->d->results[0]->SourceUrl;
516
			// Thumbnail can't be used this way...
517
			// $image_url['thumbnail'] = $result->d->results[0]->Thumbnail->MediaUrl;
518
			$image_url['thumbnail'] = $result->d->results[0]->MediaUrl;
519
			$url = parse_url($image_url['source_website']);
520
			$image_url['copyright'] = $url['host'];
521
			$image_url['source'] = 'bing';
522
			return $image_url;
523
		}
524
		return array('thumbnail' => '','original' => '', 'copyright' => '','source' => '','source_website' => '');
525
	}
526
527
	/**
528
	* Gets the aircraft image from airport-data
529
	*
530
	* @param String $aircraft_registration the registration of the aircraft
531
	* @param String $aircraft_icao the icao code of the aircraft
532
	* @param String $aircraft_name type of the aircraft
533
	* @return array the aircraft thumbnail, orignal url and copyright
534
	*
535
	*/
536
	public function fromAirportData($type,$aircraft_registration,$aircraft_icao,$aircraft_name='') {
0 ignored issues
show
Unused Code introduced by
The parameter $type is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $aircraft_name is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
537
		$Common = new Common();
538
		$url = 'http://www.airport-data.com/api/ac_thumb.json?&n=1&r='.$aircraft_registration.'&m='.$aircraft_icao;
539
		$data = $Common->getData($url);
540
		$result = json_decode($data);
541
		if (isset($result->count) && $result->count > 0) {
542
			$image_url = array();
543
			$image_url['original'] = str_replace('thumbnails','large',$result->data[0]->image);
544
			$image_url['source_website'] = $result->data[0]->link;
545
			$image_url['thumbnail'] = $result->data[0]->image;
546
			$image_url['copyright'] = $result->data[0]->photographer;
547
			$image_url['source'] = 'AirportData';
548
			return $image_url;
549
		}
550
		return array('thumbnail' => '','original' => '', 'copyright' => '','source' => '','source_website' => '');
551
	}
552
553
	/**
554
	* Gets image from WikiMedia
555
	*
556
	* @param String $registration the registration of the aircraft/mmsi
557
	* @param String $name name
558
	* @return array the aircraft thumbnail, orignal url and copyright
559
	*
560
	*/
561
	public function fromWikimedia($type,$registration,$name='') {
562
		$Common = new Common();
563
		if ($type == 'aircraft') {
564
			if ($name != '') $url = 'https://commons.wikimedia.org/w/api.php?action=query&list=search&format=json&srlimit=1&srnamespace=6&continue&srsearch="'.$registration.'"%20'.urlencode($name);
565
			else $url = 'https://commons.wikimedia.org/w/api.php?action=query&list=search&format=json&srlimit=1&srnamespace=6&continue&srsearch="'.$registration.'"%20aircraft';
566
		} elseif ($type == 'marine') {
567
			if ($name != '') $url = 'https://commons.wikimedia.org/w/api.php?action=query&list=search&format=json&srlimit=1&srnamespace=6&continue&srsearch="'.urlencode($name).'%20ship"';
568
			else return array('thumbnail' => '','original' => '', 'copyright' => '','source' => '','source_website' => '');
569
		}
570
		$data = $Common->getData($url);
0 ignored issues
show
Bug introduced by
The variable $url does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
571
		$result = json_decode($data);
572
		if (isset($result->query->search[0]->title)) {
573
			$fileo = $result->query->search[0]->title;
574
			if (substr($fileo,-3) == 'pdf') return array('thumbnail' => '','original' => '', 'copyright' => '','source' => '','source_website' => '');
575
			$file = urlencode($fileo);
576
			$url2 = 'https://commons.wikimedia.org/w/api.php?action=query&format=json&continue&iilimit=500&prop=imageinfo&iiprop=user|url|size|mime|sha1|timestamp&iiurlwidth=200%27&titles='.$file;
577
			$data2 = $Common->getData($url2);
578
			$result2 = json_decode($data2);
579
			if (isset($result2->query->pages)) {
580
				foreach ($result2->query->pages as $page) {
581
					if (isset($page->imageinfo[0]->user)) {
582
						$image_url = array();
583
						$image_url['copyright'] = 'Wikimedia, '.$page->imageinfo[0]->user;
584
						$image_url['original'] = $page->imageinfo[0]->url;
585
						$image_url['thumbnail'] = $page->imageinfo[0]->thumburl;
586
						$image_url['source'] = 'wikimedia';
587
						$image_url['source_website'] = 'http://commons.wikimedia.org/wiki/'.$fileo;
588
						//return $image_url;
589
					}
590
				}
591
			}
592
			if (isset($image_url['original'])) {
593
				$url2 = 'https://commons.wikimedia.org/w/api.php?action=query&prop=imageinfo&iiprop=extmetadata&format=json&continue&titles='.$file;
594
				$data2 = $Common->getData($url2);
595
				$result2 = json_decode($data2);
596
				if (isset($result2->query->pages)) {
597
					foreach ($result2->query->pages as $page) {
598
						if (isset($page->imageinfo[0]->extmetadata->Artist)) {
599
							$image_url['copyright'] = preg_replace('/ from(.*)/','',strip_tags($page->imageinfo[0]->extmetadata->Artist->value));
600
							if (isset($page->imageinfo[0]->extmetadata->License->value)) {
601
								$image_url['copyright'] = $image_url['copyright'].' (under '.$page->imageinfo[0]->extmetadata->License->value.')';
602
							}
603
							$image_url['copyright'] = trim(str_replace('\n','',$image_url['copyright']));
604
							return $image_url;
605
						}
606
					}
607
				}
608
				return $image_url;
609
			}
610
		}
611
		return array('thumbnail' => '','original' => '', 'copyright' => '','source' => '','source_website' => '');
612
	}
613
614
	/**
615
	* Gets the aircraft image from custom url
616
	*
617
	* @param String $registration the registration of the aircraft
618
	* @param String $name type of the aircraft
619
	* @return array the aircraft thumbnail, orignal url and copyright
620
	*
621
	*/
622
	public function fromCustomSource($type,$registration,$name='') {
0 ignored issues
show
Unused Code introduced by
The parameter $name is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
623
		global $globalAircraftImageCustomSources, $globalMarineImageCustomSources, $globalDebug;
624
		//$globalAircraftImageCustomSource[] = array('thumbnail' => '','original' => '', 'copyright' => '', 'source_website' => '', 'source' => '','exif' => true);
625
		if (!empty($globalAircraftImageCustomSources) && $type == 'aircraft') {
626
			$customsources = array();
627
			if (!isset($globalAircraftImageCustomSources[0])) {
628
				$customsources[] = $globalAircraftImageCustomSources;
629
			} else {
630
				$customsources = $globalAircraftImageCustomSources;
631
			}
632
			foreach ($customsources as $source) {
633
				$Common = new Common();
634
				if (!isset($source['original']) && $globalDebug) {
635
					echo 'original entry not found for $globalAircraftImageCustomSources.';
636
					print_r($source);
637
					print_r($customsources);
638
				}
639
				$url = str_replace('{registration}',$registration,$source['original']);
640
				$url_thumbnail = str_replace('{registration}',$registration,$source['thumbnail']);
641
				if ($Common->urlexist($url)) {
642
					$image_url = array();
643
					$image_url['thumbnail'] = $url_thumbnail;
644
					$image_url['original'] = $url;
645
					if ($source['exif'] && exif_imagetype($url) == IMAGETYPE_JPEG) $exifCopyright = $this->getExifCopyright($url);
646
					else $exifCopyright = '';
647
					if ($exifCopyright  != '') $image_url['copyright'] = $exifCopyright;
648
					elseif (isset($source['copyright'])) $image_url['copyright'] = $source['copyright'];
649
					else $image_url['copyright'] = $source['source_website'];
650
					$image_url['source_website'] = $source['source_website'];
651
					$image_url['source'] = $source['source'];
652
					return $image_url;
653
				}
654
			}
655
			return array('thumbnail' => '','original' => '', 'copyright' => '','source' => '','source_website' => '');
656
		} else return array('thumbnail' => '','original' => '', 'copyright' => '','source' => '','source_website' => '');
657
658
		if (!empty($globalMarineImageCustomSources) && $type == 'marine') {
0 ignored issues
show
Unused Code introduced by
if (!empty($globalMarine...e { return false; } does not seem to be reachable.

This check looks for unreachable code. It uses sophisticated control flow analysis techniques to find statements which will never be executed.

Unreachable code is most often the result of return, die or exit statements that have been added for debug purposes.

function fx() {
    try {
        doSomething();
        return true;
    }
    catch (\Exception $e) {
        return false;
    }

    return false;
}

In the above example, the last return false will never be executed, because a return statement has already been met in every possible execution path.

Loading history...
659
			$customsources = array();
660
			if (!isset($globalMarineImageCustomSources[0])) {
661
				$customsources[] = $globalMarineImageCustomSources;
662
			} else {
663
				$customsources = $globalMarineImageCustomSources;
664
			}
665
			foreach ($customsources as $source) {
666
				$Common = new Common();
667
				if (!isset($source['original']) && $globalDebug) {
668
					echo 'original entry not found for $globalMarineImageCustomSources.';
669
					print_r($source);
670
					print_r($customsources);
671
				}
672
				$url = str_replace('{registration}',$registration,$source['original']);
673
				$url = str_replace('{mmsi}',$registration,$url);
674
				$url = str_replace('{name}',$name,$url);
675
				$url_thumbnail = str_replace('{registration}',$registration,$source['thumbnail']);
676
				$url_thumbnail = str_replace('{mmsi}',$registration,$url_thumbnail);
677
				$url_thumbnail = str_replace('{name}',$name,$url_thumbnail);
678
				if ($Common->urlexist($url)) {
679
					$image_url = array();
680
					$image_url['thumbnail'] = $url_thumbnail;
681
					$image_url['original'] = $url;
682
					if ($source['exif'] && exif_imagetype($url) == IMAGETYPE_JPEG) $exifCopyright = $this->getExifCopyright($url);
683
					else $exifCopyright = '';
684
					if ($exifCopyright  != '') $image_url['copyright'] = $exifCopyright;
685
					elseif (isset($source['copyright'])) $image_url['copyright'] = $source['copyright'];
686
					else $image_url['copyright'] = $source['source_website'];
687
					$image_url['source_website'] = $source['source_website'];
688
					$image_url['source'] = $source['source'];
689
					return $image_url;
690
				}
691
			}
692
			return false;
0 ignored issues
show
Bug Best Practice introduced by
The return type of return false; (false) is incompatible with the return type documented by Image::fromCustomSource of type array.

If you return a value from a function or method, it should be a sub-type of the type that is given by the parent type f.e. an interface, or abstract method. This is more formally defined by the Lizkov substitution principle, and guarantees that classes that depend on the parent type can use any instance of a child type interchangably. This principle also belongs to the SOLID principles for object oriented design.

Let’s take a look at an example:

class Author {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

abstract class Post {
    public function getAuthor() {
        return 'Johannes';
    }
}

class BlogPost extends Post {
    public function getAuthor() {
        return new Author('Johannes');
    }
}

class ForumPost extends Post { /* ... */ }

function my_function(Post $post) {
    echo strtoupper($post->getAuthor());
}

Our function my_function expects a Post object, and outputs the author of the post. The base class Post returns a simple string and outputting a simple string will work just fine. However, the child class BlogPost which is a sub-type of Post instead decided to return an object, and is therefore violating the SOLID principles. If a BlogPost were passed to my_function, PHP would not complain, but ultimately fail when executing the strtoupper call in its body.

Loading history...
693
		} else return false;
694
	}
695
}
696
697
//$Image = new Image();
698
//print_r($Image->fromAirportData('F-GZHM'));
699
700
?>
701