Completed
Push — master ( 2f651b...1c7a83 )
by Blizzz
02:40
created

Bookmarks::findBookmarks()   F

Complexity

Conditions 12
Paths 576

Size

Total Lines 70
Code Lines 41

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 43
CRAP Score 12.264

Importance

Changes 2
Bugs 1 Features 1
Metric Value
c 2
b 1
f 1
dl 0
loc 70
ccs 43
cts 49
cp 0.8776
rs 3.0285
cc 12
eloc 41
nc 576
nop 10
crap 12.264

How to fix   Long Method    Complexity    Many Parameters   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
3
/**
4
 * ownCloud - bookmarks plugin
5
 *
6
 * @author Arthur Schiwon
7
 * @copyright 2011 Arthur Schiwon [email protected]
8
 *
9
 * This library is free software; you can redistribute it and/or
10
 * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
11
 * License as published by the Free Software Foundation; either
12
 * version 3 of the License, or any later version.
13
 *
14
 * This library is distributed in the hope that it will be useful,
15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
 * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
18
 *
19
 * You should have received a copy of the GNU Affero General Public
20
 * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
21
 *
22
 */
23
/**
24
 * This class manages bookmarks
25
 */
26
27
namespace OCA\Bookmarks\Controller\Lib;
28
29
use \OCP\IDb;
30
31
class Bookmarks {
32
33
	/**
34
	 * @brief Finds all tags for bookmarks
35
	 * @param string $userId UserId
36
	 * @param IDb $db Database Interface
37
	 * @param filterTags array of tag to look for if empty then every tag
38
	 * @param offset integer offset
39
	 * @param limit integer of item to return
40
	 * @return Found Tags
41
	 */
42 1
	public static function findTags($userId, IDb $db, $filterTags = array(), $offset = 0, $limit = -1) {
43 1
		$params = array_merge($filterTags, $filterTags);
44 1
		array_unshift($params, $userId);
45 1
		$not_in = '';
46 1
		if (!empty($filterTags)) {
47
			$exist_clause = " AND	exists (select 1 from `*PREFIX*bookmarks_tags`
48
				`t2` where `t2`.`bookmark_id` = `t`.`bookmark_id` and `tag` = ?) ";
49
50
			$not_in = ' AND `tag` not in (' . implode(',', array_fill(0, count($filterTags), '?')) . ')' .
51
					str_repeat($exist_clause, count($filterTags));
52
		}
53
		$sql = 'SELECT tag, count(*) as nbr from *PREFIX*bookmarks_tags t ' .
54 1
				' WHERE EXISTS( SELECT 1 from *PREFIX*bookmarks bm where  t.bookmark_id  = bm.id and user_id = ?) ' .
55 1
				$not_in .
56 1
				' GROUP BY `tag` ORDER BY `nbr` DESC ';
57
58 1
		$query = $db->prepareQuery($sql, $limit, $offset);
59 1
		$tags = $query->execute($params)->fetchAll();
60 1
		return $tags;
61
	}
62
63
	/**
64
	 * @brief Finds Bookmark with certain ID
65
	 * @param int $id BookmarkId
66
	 * @param string $userId UserId
67
	 * @param IDb $db Database Interface
68
	 * @return array Specific Bookmark
69
	 */
70 2
	public static function findUniqueBookmark($id, $userId, IDb $db) {
71 2
		$CONFIG_DBTYPE = \OCP\Config::getSystemValue('dbtype', 'sqlite');
72 2
		if ($CONFIG_DBTYPE == 'pgsql') {
73
			$group_fct = 'array_agg(`tag`)';
74
		} else {
75 2
			$group_fct = 'GROUP_CONCAT(`tag`)';
76
		}
77
		$sql = "SELECT *, (select $group_fct from `*PREFIX*bookmarks_tags` where `bookmark_id` = `b`.`id`) as `tags`
78
				FROM `*PREFIX*bookmarks` `b`
79 2
				WHERE `user_id` = ? AND `id` = ?";
80 2
		$query = $db->prepareQuery($sql);
81 2
		$result = $query->execute(array($userId, $id))->fetchRow();
82 2
		$result['tags'] = explode(',', $result['tags']);
83 2
		return $result;
84
	}
85
86
	/**
87
	 * @brief Check if an URL is bookmarked
88
	 * @param string $url Url of a possible bookmark
89
	 * @param string $userId UserId
90
	 * @param IDb $db Database Interface
91
	 * @return boolean if the url is already bookmarked
92
	 */
93 1
	public static function bookmarkExists($url, $userId, IDb $db) {
94 1
		$enc_url = htmlspecialchars_decode($url);
95 1
		$sql = "SELECT id from `*PREFIX*bookmarks` where `url` = ? and `user_id` = ?";
96 1
		$query = $db->prepareQuery($sql);
97 1
		$result = $query->execute(array($enc_url, $userId))->fetchRow();
98 1
		if ($result) {
99 1
			return $result['id'];
100
		} else {
101 1
			return false;
102
		}
103
	}
104
105
	/**
106
	 * @brief Finds all bookmarks, matching the filter
107
	 * @param string $userid UserId
108
	 * @param IDb $db Database Interface
109
	 * @param int $offset offset
110
	 * @param string $sqlSortColumn result with this column
111
	 * @param string|array $filters filters can be: empty -> no filter, a string -> filter this, a string array -> filter for all strings
112
	 * @param bool $filterTagOnly true, filter affects only tags, else filter affects url, title and tags
113
	 * @param int $limit limit of items to return (default 10) if -1 or false then all items are returned
114
	 * @param bool $public check if only public bookmarks should be returned
115
	 * @param array $requestedAttributes select all the attributes that should be returned. default is * + tags
116
	 * @param string $tagFilterConjunction select wether the filterTagOnly should filter with an AND or an OR  conjunction
117
	 * @return Collection of specified bookmarks
118
	 */
119 3
	public static function findBookmarks(
120
	$userid, IDb $db, $offset, $sqlSortColumn, $filters, $filterTagOnly, $limit = 10, $public = false, $requestedAttributes = null, $tagFilterConjunction = "and") {
121
122 3
		$CONFIG_DBTYPE = \OCP\Config::getSystemValue('dbtype', 'sqlite');
123 3
		if (is_string($filters)) {
124
			$filters = array($filters);
125
		}
126
127 3
		$toSelect = '*';
128 3
		$tableAttributes = array('id', 'url', 'title', 'user_id', 'description',
129 3
			'public', 'added', 'lastmodified', 'clickcount',);
130
131 3
		$returnTags = true;
132
133 3
		if ($requestedAttributes != null) {
134
135 1
			$key = array_search('tags', $requestedAttributes);
136 1
			if ($key == false) {
137 1
				$returnTags = false;
138 1
			} else {
139
				unset($requestedAttributes[$key]);
140
			}
141
142 1
			$toSelect = implode(",", array_intersect($tableAttributes, $requestedAttributes));
143 1
		}
144
145 3
		if ($CONFIG_DBTYPE == 'pgsql') {
146
			$sql = "SELECT " . $toSelect . " FROM (SELECT *, (select array_to_string(array_agg(`tag`),',')
147
				from `*PREFIX*bookmarks_tags` where `bookmark_id` = `b2`.`id`) as `tags`
148
				FROM `*PREFIX*bookmarks` `b2`
149
				WHERE `user_id` = ? ) as `b` WHERE true ";
150
		} else {
151 3
			$sql = "SELECT " . $toSelect . ", (SELECT GROUP_CONCAT(`tag`) from `*PREFIX*bookmarks_tags`
152
				WHERE `bookmark_id` = `b`.`id`) as `tags`
153
				FROM `*PREFIX*bookmarks` `b`
154 3
				WHERE `user_id` = ? ";
155
		}
156
157 3
		$params = array($userid);
158
159 3
		if ($public) {
160 1
			$sql .= ' AND public = 1 ';
161 1
		}
162
163 3
		if (count($filters) > 0) {
164 2
			Bookmarks::findBookmarksBuildFilter($sql, $params, $filters, $filterTagOnly, $tagFilterConjunction, $CONFIG_DBTYPE);
165 2
		}
166
167 3
		if (!in_array($sqlSortColumn, $tableAttributes)) {
168 1
			$sqlSortColumn = 'lastmodified';
169 1
		}
170 3
		$sql .= " ORDER BY " . $sqlSortColumn . " DESC ";
171 3
		if ($limit == -1 || $limit === false) {
172 3
			$limit = null;
173 3
			$offset = null;
174 3
		}
175
176 3
		$query = $db->prepareQuery($sql, $limit, $offset);
177 3
		$results = $query->execute($params)->fetchAll();
178 3
		$bookmarks = array();
179 3
		foreach ($results as $result) {
180 3
			if ($returnTags) {
181 2
				$result['tags'] = explode(',', $result['tags']);
182 2
			} else {
183 1
				unset($result['tags']);
184
			}
185 3
			$bookmarks[] = $result;
186 3
		}
187 3
		return $bookmarks;
188
	}
189
190 2
	private static function findBookmarksBuildFilter(&$sql, &$params, $filters, $filterTagOnly, $tagFilterConjunction, $CONFIG_DBTYPE) {
191 2
		$tagOrSearch = false;
192 2
		$connectWord = 'AND';
193
194 2
		if ($tagFilterConjunction == 'or') {
195 1
			$tagOrSearch = true;
196 1
			$connectWord = 'OR';
197 1
		}
198
199 2
		if ($filterTagOnly) {
200 2
			if ($tagOrSearch) {
201 1
				$sql .= 'AND (';
202 1
			} else {
203 1
				$sql .= 'AND';
204
			}
205
			$exist_clause = " exists (SELECT `id` FROM  `*PREFIX*bookmarks_tags`
206 2
				`t2` WHERE `t2`.`bookmark_id` = `b`.`id` AND `tag` = ?) ";
207 2
			$sql .= str_repeat($exist_clause . $connectWord, count($filters));
208 2
			if ($tagOrSearch) {
209 1
				$sql = rtrim($sql, 'OR');
210 1
				$sql .= ')';
211 1
			} else {
212 1
				$sql = rtrim($sql, 'AND');
213
			}
214 2
			$params = array_merge($params, $filters);
215 2
		} else {
216
			if ($CONFIG_DBTYPE == 'mysql') { //Dirty hack to allow usage of alias in where
217
				$sql .= ' HAVING true ';
218
			}
219
			foreach ($filters as $filter) {
220
				if ($CONFIG_DBTYPE == 'mysql') {
221
					$sql .= ' AND lower( concat(url,title,description,IFNULL(tags,\'\') )) like ? ';
222
				} else {
223
					$sql .= ' AND lower(url || title || description || ifnull(tags,\'\') ) like ? ';
224
				}
225
				$params[] = '%' . strtolower($filter) . '%';
226
			}
227
		}
228 2
	}
229
230
	/**
231
	 * @brief Delete bookmark with specific id
232
	 * @param string $userId UserId
233
	 * @param IDb $db Database Interface
234
	 * @param int $id Bookmark ID to delete
235
	 * @return boolean Success of operation
236
	 */
237 1
	public static function deleteUrl($userId, IDb $db, $id) {
238 1
		$user = $userId;
239
240 1
		$query = $db->prepareQuery("
241
				SELECT `id` FROM `*PREFIX*bookmarks`
242
				WHERE `id` = ?
243
				AND `user_id` = ?
244 1
				");
245
246 1
		$result = $query->execute(array($id, $user));
247 1
		$id = $result->fetchOne();
248 1
		if ($id === false) {
249
			return false;
250
		}
251
252 1
		$query = $db->prepareQuery("
253
			DELETE FROM `*PREFIX*bookmarks`
254
			WHERE `id` = ?
255 1
			");
256
257 1
		$query->execute(array($id));
258
259 1
		$query = $db->prepareQuery("
260
			DELETE FROM `*PREFIX*bookmarks_tags`
261
			WHERE `bookmark_id` = ?
262 1
			");
263
264 1
		$query->execute(array($id));
265 1
		return true;
266
	}
267
268
	/**
269
	 * @brief Rename a tag
270
	 * @param string $userId UserId
271
	 * @param IDb $db Database Interface
272
	 * @param string $old Old Tag Name
273
	 * @param string $new New Tag Name
274
	 * @return boolean Success of operation
275
	 */
276
	public static function renameTag($userId, IDb $db, $old, $new) {
277
		$user_id = $userId;
278
		$CONFIG_DBTYPE = \OCP\Config::getSystemValue('dbtype', 'sqlite');
279
280
281
		if ($CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3') {
282
			// Update tags to the new label unless it already exists a tag like this
283
			$query = $db->prepareQuery("
284
				UPDATE OR REPLACE `*PREFIX*bookmarks_tags`
285
				SET `tag` = ?
286
				WHERE `tag` = ?
287
				AND exists( select `b`.`id` from `*PREFIX*bookmarks` `b`
288
				WHERE `b`.`user_id` = ? AND `bookmark_id` = `b`.`id`)
289
			");
290
291
			$params = array(
292
				$new,
293
				$old,
294
				$user_id,
295
			);
296
297
			$query->execute($params);
298
		} else {
299
300
			// Remove potentialy duplicated tags
301
			$query = $db->prepareQuery("
302
			DELETE FROM `*PREFIX*bookmarks_tags` as `tgs` WHERE `tgs`.`tag` = ?
303
			AND exists( SELECT `id` FROM `*PREFIX*bookmarks` WHERE `user_id` = ?
304
			AND `tgs`.`bookmark_id` = `id`)
305
			AND exists( SELECT `t`.`tag` FROM `*PREFIX*bookmarks_tags` `t` where `t`.`tag` = ?
306
			AND `tgs`.`bookmark_id` = `t`.`bookmark_id`)");
307
308
			$params = array(
309
				$new,
310
				$user_id,
311
				$new
312
			);
313
314
			$query->execute($params);
315
316
317
			// Update tags to the new label unless it already exists a tag like this
318
			$query = $db->prepareQuery("
319
			UPDATE `*PREFIX*bookmarks_tags`
320
			SET `tag` = ?
321
			WHERE `tag` = ?
322
			AND exists( SELECT `b`.`id` FROM `*PREFIX*bookmarks` `b`
323
			WHERE `b`.`user_id` = ? AND `bookmark_id` = `b`.`id`)
324
			");
325
326
			$params = array(
327
				$new,
328
				$old,
329
				$user_id
330
			);
331
332
			$query->execute($params);
333
		}
334
335
336
		return true;
337
	}
338
339
	/**
340
	 * @brief Delete a tag
341
	 * @param string $userid UserId
342
	 * @param IDb $db Database Interface
343
	 * @param string $old Tag Name to delete
344
	 * @return boolean Success of operation
345
	 */
346
	public static function deleteTag($userid, IDb $db, $old) {
347
348
		// Update the record
349
		$query = $db->prepareQuery("
350
		DELETE FROM `*PREFIX*bookmarks_tags`
351
		WHERE `tag` = ?
352
		AND exists( SELECT `id` FROM `*PREFIX*bookmarks` WHERE `user_id` = ? AND `bookmark_id` = `id`)
353
		");
354
355
		$params = array(
356
			$old,
357
			$userid,
358
		);
359
360
		$result = $query->execute($params);
361
		return $result;
362
	}
363
364
	/**
365
	 * Edit a bookmark
366
	 * @param string $userid UserId
367
	 * @param IDb $db Database Interface
368
	 * @param int $id The id of the bookmark to edit
369
	 * @param string $url The url to set
370
	 * @param string $title Name of the bookmark
371
	 * @param array $tags Simple array of tags to qualify the bookmark (different tags are taken from values)
372
	 * @param string $description A longer description about the bookmark
373
	 * @param boolean $is_public True if the bookmark is publishable to not registered users
374
	 * @return null
375
	 */
376 1
	public static function editBookmark($userid, IDb $db, $id, $url, $title, $tags = array(), $description = '', $is_public = false) {
377
378 1
		$is_public = $is_public ? 1 : 0;
379 1
		$user_id = $userid;
380
381
		// Update the record
382 1
		$query = $db->prepareQuery("
383
		UPDATE `*PREFIX*bookmarks` SET
384
			`url` = ?, `title` = ?, `public` = ?, `description` = ?,
385
			`lastmodified` = UNIX_TIMESTAMP()
386
		WHERE `id` = ?
387
		AND `user_id` = ?
388 1
		");
389
390
		$params = array(
391 1
			htmlspecialchars_decode($url),
392 1
			htmlspecialchars_decode($title),
393 1
			$is_public,
394 1
			htmlspecialchars_decode($description),
395 1
			$id,
396 1
			$user_id,
397 1
		);
398
399 1
		$result = $query->execute($params);
400
401
		// Abort the operation if bookmark couldn't be set
402
		// (probably because the user is not allowed to edit this bookmark)
403 1
		if ($result == 0)
404 1
			exit();
405
406
407
		// Remove old tags
408 1
		$sql = "DELETE FROM `*PREFIX*bookmarks_tags`  WHERE `bookmark_id` = ?";
409 1
		$query = $db->prepareQuery($sql);
410 1
		$query->execute(array($id));
411
412
		// Add New Tags
413 1
		self::addTags($db, $id, $tags);
414
415 1
		return $id;
416
	}
417
418
	/**
419
	 * Add a bookmark
420
	 * @param string $userid UserId
421
	 * @param IDb $db Database Interface
422
	 * @param string $url
423
	 * @param string $title Name of the bookmark
424
	 * @param array $tags Simple array of tags to qualify the bookmark (different tags are taken from values)
425
	 * @param string $description A longer description about the bookmark
426
	 * @param boolean $public True if the bookmark is publishable to not registered users
0 ignored issues
show
Documentation introduced by
There is no parameter named $public. Did you maybe mean $is_public?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function. It has, however, found a similar but not annotated parameter which might be a good fit.

Consider the following example. The parameter $ireland is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $ireland
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was changed, but the annotation was not.

Loading history...
427
	 * @return int The id of the bookmark created
428
	 */
429 8
	public static function addBookmark($userid, IDb $db, $url, $title, $tags = array(), $description = '', $is_public = false) {
430 8
		$public = $is_public ? 1 : 0;
431 8
		$url_without_prefix = trim(substr($url, strpos($url, "://") + 3)); // Removes everything from the url before the "://" pattern (included)
432 8
		if($url_without_prefix === '') {
433
			throw new \InvalidArgumentException('Bookmark URL is missing');
434
		}
435 8
		$enc_url_noprefix = htmlspecialchars_decode($url_without_prefix);
436 8
		$enc_url = htmlspecialchars_decode($url);
437
438 8
		$title = mb_substr($title, 0, 4096);
439 8
		$description = mb_substr($description, 0, 4096);
440
441
		// Change lastmodified date if the record if already exists
442 8
		$sql = "SELECT * from  `*PREFIX*bookmarks` WHERE `url` like ? AND `user_id` = ?";
443 8
		$query = $db->prepareQuery($sql, 1);
444 8
		$result = $query->execute(array('%'.$enc_url_noprefix, $userid)); // Find url in the db independantly from its protocol
445 8
		if ($row = $result->fetchRow()) {
446
			$params = array();
447
			$title_str = '';
448
			if (trim($title) != '') { // Do we replace the old title
449
				$title_str = ' , title = ?';
450
				$params[] = $title;
451
			}
452
			$desc_str = '';
453
			if (trim($description) != '') { // Do we replace the old description
454
				$desc_str = ' , description = ?';
455
				$params[] = $description;
456
			}
457
			$sql = "UPDATE `*PREFIX*bookmarks` SET `lastmodified` = "
458
					. "UNIX_TIMESTAMP() $title_str $desc_str , `url` = ? WHERE `url` like ? and `user_id` = ?";
459
			$params[] = $enc_url;
460
			$params[] = '%'.$enc_url_noprefix;
461
			$params[] = $userid;
462
			$query = $db->prepareQuery($sql);
463
			$query->execute($params);
464
			return $row['id'];
465
		} else {
466 8
			$query = $db->prepareQuery("
467
			INSERT INTO `*PREFIX*bookmarks`
468
			(`url`, `title`, `user_id`, `public`, `added`, `lastmodified`, `description`)
469
			VALUES (?, ?, ?, ?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), ?)
470 8
			");
471
472
			$params = array(
473 8
				$enc_url,
474 8
				htmlspecialchars_decode($title),
475 8
				$userid,
476 8
				$public,
477 8
				$description,
478 8
			);
479 8
			$query->execute($params);
480
481 8
			$b_id = $db->getInsertId('*PREFIX*bookmarks');
482
483 8
			if ($b_id !== false) {
484 8
				self::addTags($db, $b_id, $tags);
485 8
				return $b_id;
486
			}
487
		}
488
	}
489
490
	/**
491
	 * @brief Add a set of tags for a bookmark
492
	 * @param IDb $db Database Interface
493
	 * @param int $bookmarkID The bookmark reference
494
	 * @param array $tags Set of tags to add to the bookmark
495
	 * @return null
496
	 * */
497 8
	private static function addTags(IDb $db, $bookmarkID, $tags) {
498 8
		$sql = 'INSERT INTO `*PREFIX*bookmarks_tags` (`bookmark_id`, `tag`) select ?, ? ';
499 8
		$dbtype = \OCP\Config::getSystemValue('dbtype', 'sqlite');
500
501 8
		if ($dbtype === 'mysql') {
502
			$sql .= 'from dual ';
503
		}
504 8
		$sql .= 'where not exists(select * from `*PREFIX*bookmarks_tags` where `bookmark_id` = ? and `tag` = ?)';
505
506 8
		$query = $db->prepareQuery($sql);
507 8
		foreach ($tags as $tag) {
508 8
			$tag = trim($tag);
509 8
			if (empty($tag)) {
510
				//avoid saving white spaces
511
				continue;
512
			}
513 8
			$params = array($bookmarkID, $tag, $bookmarkID, $tag);
514 8
			$query->execute($params);
515 8
		}
516 8
	}
517
518
	/**
519
	 * @brief Import Bookmarks from html formatted file
520
	 * @param string $user User imported Bookmarks should belong to
521
	 * @param IDb $db Database Interface
522
	 * @param string $file Content to import
523
	 * @return null
524
	 * */
525
	public static function importFile($user, IDb $db, $file) {
526
		libxml_use_internal_errors(true);
527
		$dom = new \domDocument();
528
529
		$dom->loadHTMLFile($file);
530
		$links = $dom->getElementsByTagName('a');
531
532
		$l = \OC::$server->getL10NFactory()->get('bookmarks');
533
		$errors = [];
534
535
		// Reintroduce transaction here!?
536
		foreach ($links as $link) {
537
			/* @var \DOMElement $link */
538
			$title = $link->nodeValue;
539
			$ref = $link->getAttribute("href");
540
			$tag_str = '';
541
			if ($link->hasAttribute("tags"))
542
				$tag_str = $link->getAttribute("tags");
543
			$tags = explode(',', $tag_str);
544
545
			$desc_str = '';
546
			if ($link->hasAttribute("description"))
547
				$desc_str = $link->getAttribute("description");
548
			try {
549
				self::addBookmark($user, $db, $ref, $title, $tags, $desc_str);
550
			} catch (\InvalidArgumentException $e) {
551
				\OC::$server->getLogger()->logException($e, ['app' => 'bookmarks']);
552
				$errors[] =  $l->t('Failed to import one bookmark, because: ') . $e->getMessage();
553
			}
554
		}
555
556
		return $errors;
557
	}
558
559
	/**
560
	 * @brief Load Url and receive Metadata (Title)
561
	 * @param string $url Url to load and analyze
562
	 * @return array Metadata for url;
563
	 * @throws \Exception
564
	 */
565 1
	public static function getURLMetadata($url) {
566
		
567 1
		$metadata = array();
568 1
		$metadata['url'] = $url;
569 1
		$page = "";
570
		
571
		try {
572 1
			$request = \OC::$server->getHTTPClientService()->newClient()->get($url);
573 1
			$page = $request->getBody();
574 1
			$contentType = $request->getHeader('Content-Type');
575 1
		} catch (\Exception $e) {
576
			throw $e;
577
		}
578
		
579
		//Check for encoding of site.
580
		//If not UTF-8 convert it.
581 1
		$encoding = array();
582 1
		preg_match('#.+?/.+?;\\s?charset\\s?=\\s?(.+)#i', $contentType, $encoding);
583 1
		if(empty($encoding)) {
584 1
			preg_match('/charset="?(.*?)["|;]/i', $page, $encoding);
585 1
		}
586
587 1
		if (isset($encoding[1])) {
588 1
			$decodeFrom = strtoupper($encoding[1]);
589 1
		} else {
590
			$decodeFrom = 'UTF-8';
591
		}
592
593 1
		if ($page) {
594
595 1
			if ($decodeFrom != 'UTF-8') {
596 1
				$page = iconv($decodeFrom, "UTF-8", $page);
597 1
			}
598
599 1
			preg_match("/<title>(.*)<\/title>/si", $page, $match);
600
			
601 1
			if (isset($match[1])) {
602 1
				$metadata['title'] = html_entity_decode($match[1]);
603 1
			}
604 1
		}
605
		
606 1
		return $metadata;
607
	}
608
609
	/**
610
	 * @brief Seperate Url String at comma charachter
611
	 * @param $line String of Tags
612
	 * @return array Array of Tags
613
	 * */
614
	public static function analyzeTagRequest($line) {
615
		$tags = explode(',', $line);
616
		$filterTag = array();
617
		foreach ($tags as $tag) {
618
			if (trim($tag) != '')
619
				$filterTag[] = trim($tag);
620
		}
621
		return $filterTag;
622
	}
623
624
}
625