diff --git a/bridges/DealabsBridge.php b/bridges/DealabsBridge.php index 2876aab2..fb88f37a 100644 --- a/bridges/DealabsBridge.php +++ b/bridges/DealabsBridge.php @@ -1,8 +1,9 @@ array ( @@ -39,7 +40,7 @@ class DealabsBridge extends BridgeAbstract { ), 'Deals par groupe' => array( - 'groupe' => array( + 'group' => array( 'name' => 'Groupe', 'type' => 'list', 'required' => 'true', @@ -61,10 +62,10 @@ class DealabsBridge extends BridgeAbstract { 'Services divers' => 'services-divers', 'Sports & plein air' => 'sports-plein-air', 'Téléphonie' => 'telephonie', - 'Voyages & sorties' => 'voyages-sorties-restaurants' + 'Voyages & sorties' => 'voyages-sorties-restaurants', ) ), - 'ordre' => array( + 'order' => array( 'name' => 'Trier par', 'type' => 'list', 'required' => 'true', @@ -78,37 +79,99 @@ class DealabsBridge extends BridgeAbstract { ) ); + public $lang = array( + 'bridge-uri' => SELF::URI, + 'bridge-name' => SELF::NAME, + 'context-keyword' => 'Recherche par Mot(s) clé(s)', + 'context-group' => 'Deals par groupe', + 'uri-group' => '/groupe/', + 'request-error' => 'Could not request Dealabs', + 'no-results' => 'Il n'y a rien à afficher pour le moment :(', + 'relative-date-indicator' => array( + 'il y a', + ), + 'price' => 'Prix', + 'shipping' => 'Livraison', + 'origin' => 'Origine', + 'discount' => 'Réduction', + 'title-keyword' => 'Recherche', + 'title-group' => 'Groupe', + 'local-months' => array( + 'janvier', + 'février', + 'mars', + 'avril', + 'mai', + 'juin', + 'juillet', + 'août', + 'septembre', + 'octobre', + 'novembre', + 'décembre' + ), + 'local-time-relative' => array( + 'il y a ', + 'min', + 'h', + 'jour', + 'jours', + 'mois', + 'ans', + 'et ' + ), + 'date-prefixes' => array( + 'Actualisé ', + ), + 'relative-date-alt-prefixes' => array( + 'Actualisé ', + ), + 'relative-date-ignore-suffix' => array( + ), + + 'localdeal' => array( + 'Local', + 'Pays d\'expédition' + ), + ); + + + +} + +class PepperBridgeAbstract extends BridgeAbstract { + const CACHE_TIMEOUT = 3600; public function collectData(){ switch($this->queriedContext) { - case 'Recherche par Mot(s) clé(s)': - return $this->collectDataMotsCles(); + case $this->i8n('context-keyword'): + return $this->collectDataKeywords(); break; - case 'Deals par groupe': - return $this->collectDataGroupe(); + case $this->i8n('context-group'): + return $this->collectDataGroup(); break; } } /** - * Get the Deal data from the choosen groupe in the choose order + * Get the Deal data from the choosen group in the choosed order */ - public function collectDataGroupe() + public function collectDataGroup() { - $groupe = $this->getInput('groupe'); - $ordre = $this->getInput('ordre'); + $group = $this->getInput('group'); + $order = $this->getInput('order'); - $url = self::URI - . '/groupe/' . $groupe . $ordre; + $url = $this->i8n('bridge-uri') + . $this->i8n('uri-group') . $group . $order; $this->collectDeals($url); } /** * Get the Deal data from the choosen keywords and parameters */ - public function collectDataMotsCles() + public function collectDataKeywords() { $q = $this->getInput('q'); $hide_expired = $this->getInput('hide_expired'); @@ -117,7 +180,7 @@ class DealabsBridge extends BridgeAbstract { $priceTo = $this->getInput('priceFrom'); /* Even if the original website uses POST with the search page, GET works too */ - $url = self::URI + $url = $this->i8n('bridge-uri') . '/search/advanced?q=' . urlencode($q) . '&hide_expired='. $hide_expired @@ -138,8 +201,8 @@ class DealabsBridge extends BridgeAbstract { */ public function collectDeals($url){ $html = getSimpleHTMLDOM($url) - or returnServerError('Could not request Dealabs.'); - $list = $html->find('article'); + or returnServerError($this->i8n('request-error')); + $list = $html->find('article[id]'); // Deal Image Link CSS Selector $selectorImageLink = implode( @@ -197,40 +260,44 @@ class DealabsBridge extends BridgeAbstract { // If there is no results, we don't parse the content because it display some random deals $noresult = $html->find('h3[class=size--all-l size--fromW2-xl size--fromW3-xxl]', 0); - if($noresult != null && $noresult->plaintext == 'Il n'y a rien à afficher pour le moment :(') { + if ($noresult != null && strpos($noresult->plaintext, $this->i8n('no-results')) !== false) { $this->items = array(); } else { - foreach($list as $deal) { + foreach ($list as $deal) { $item = array(); $item['uri'] = $deal->find('div[class=threadGrid-title]', 0)->find('a', 0)->href; $item['title'] = $deal->find('a[class*='. $selectorLink .']', 0 - )->plaintext; + )->plaintext; $item['author'] = $deal->find('span.thread-username', 0)->plaintext; $item['content'] = '

' - . $deal->find('a[class*='. $selectorLink .']', 0)->innertext - . '

' - . $this->getPrix($deal) - . $this->getReduction($deal) - . $this->getExpedition($deal) - . $this->getLivraison($deal) - . $this->getOrigine($deal) - . $deal->find('div[class*='. $selectorDescription .']', 0)->innertext - . '
' - . $deal->find('div[class='. $selectorHot .']', 0)->children(0)->outertext - . '
'; + . '">

' + . $deal->find('a[class*='. $selectorLink .']', 0)->innertext + . '

' + . $this->getPrice($deal) + . $this->getDiscount($deal) + . $this->getShipsFrom($deal) + . $this->getShippingCost($deal) + . $this->GetSource($deal) + . $deal->find('div[class*='. $selectorDescription .']', 0)->innertext + . '' + . $deal->find('div[class='. $selectorHot .']', 0)->children(0)->outertext + . ''; $dealDateDiv = $deal->find('div[class*='. $selectorDate .']', 0) ->find('span[class=hide--toW3]'); $itemDate = end($dealDateDiv)->plaintext; - if(substr( $itemDate, 0, 6 ) === 'il y a') { + // In case of a Local deal, there is no date, but we can use + // this case for other reason (like date not in the last field) + if ($this->contains($itemDate, $this->i8n('localdeal'))) { + $item['timestamp'] = time(); + } else if ($this->contains($itemDate, $this->i8n('relative-date-indicator'))) { $item['timestamp'] = $this->relativeDateToTimestamp($itemDate); - } else { + } else { $item['timestamp'] = $this->parseDate($itemDate); } $this->items[] = $item; @@ -238,15 +305,29 @@ class DealabsBridge extends BridgeAbstract { } } + /** + * Check if the string $str contains any of the string of the array $arr + * @return boolean true if the string matched anything otherwise false + */ + private function contains($str, array $arr) + { + foreach ($arr as $a) { + if (stripos($str, $a) !== false) { + return true; + } + } + return false; + } + /** * Get the Price from a Deal if it exists * @return string String of the deal price */ - private function getPrix($deal) + private function getPrice($deal) { - if($deal->find( + if ($deal->find( 'span[class*=thread-price]', 0) != null) { - return '
Prix : ' + return '
'.$this->i8n('price') .' : ' . $deal->find( 'span[class*=thread-price]', 0 )->plaintext @@ -261,17 +342,17 @@ class DealabsBridge extends BridgeAbstract { * Get the Shipping costs from a Deal if it exists * @return string String of the deal shipping Cost */ - private function getLivraison($deal) + private function getShippingCost($deal) { - if($deal->find('span[class*=cept-shipping-price]', 0) != null) { - if($deal->find('span[class*=cept-shipping-price]', 0)->children(0) != null) { - return '
Livraison : ' - . $deal->find('span[class*=cept-shipping-price]', 0)->children(0)->innertext - . '
'; + if ($deal->find('span[class*=cept-shipping-price]', 0) != null) { + if ($deal->find('span[class*=cept-shipping-price]', 0)->children(0) != null) { + return '
'. $this->i8n('shipping') .' : ' + . $deal->find('span[class*=cept-shipping-price]', 0)->children(0)->innertext + . '
'; } else { - return '
Livraison : ' - . $deal->find('span[class*=cept-shipping-price]', 0)->innertext - . '
'; + return '
'. $this->i8n('shipping') .' : ' + . $deal->find('span[class*=cept-shipping-price]', 0)->innertext + . '
'; } } else { return ''; @@ -282,10 +363,10 @@ class DealabsBridge extends BridgeAbstract { * Get the source of a Deal if it exists * @return string String of the deal source */ - private function getOrigine($deal) + private function GetSource($deal) { - if($deal->find('a[class=text--color-greyShade]', 0) != null) { - return '
Origine : ' + if ($deal->find('a[class=text--color-greyShade]', 0) != null) { + return '
'. $this->i8n('origin') .' : ' . $deal->find('a[class=text--color-greyShade]', 0)->outertext . '
'; } else { @@ -297,19 +378,19 @@ class DealabsBridge extends BridgeAbstract { * Get the original Price and discout from a Deal if it exists * @return string String of the deal original price and discount */ - private function getReduction($deal) + private function getDiscount($deal) { - if($deal->find('span[class*=mute--text text--lineThrough]', 0) != null) { + if ($deal->find('span[class*=mute--text text--lineThrough]', 0) != null) { $discountHtml = $deal->find('span[class=space--ml-1 size--all-l size--fromW3-xl]', 0); - if($discountHtml != null) { + if ($discountHtml != null) { $discount = $discountHtml->plaintext; } else { $discount = ''; } - return '
Réduction : ' + return '
'. $this->i8n('discount') .' : ' . $deal->find( 'span[class*=mute--text text--lineThrough]', 0 - )->plaintext + )->plaintext . ' ' . $discount . '
'; @@ -324,7 +405,6 @@ class DealabsBridge extends BridgeAbstract { */ private function getImage($deal) { - $selectorLazy = implode( ' ', /* Notice this is a space! */ array( @@ -338,7 +418,7 @@ class DealabsBridge extends BridgeAbstract { ) ); - $selectorPlain = implode( + $selectorPlain = implode( ' ', /* Notice this is a space! */ array( 'thread-image', @@ -348,21 +428,21 @@ class DealabsBridge extends BridgeAbstract { 'cept-thread-img' ) ); - if($deal->find('img[class='. $selectorLazy .']', 0) != null) { + if ($deal->find('img[class='. $selectorLazy .']', 0) != null) { return json_decode( html_entity_decode( $deal->find('img[class='. $selectorLazy .']', 0) - ->getAttribute('data-lazy-img')))->{'src'}; + ->getAttribute('data-lazy-img')))->{'src'}; } else { - return $deal->find('img[class='. $selectorPlain .']', 0 )->src; + return $deal->find('img[class*='. $selectorPlain .']', 0 )->src; } } /** - * Get the originating country from a Deal if it existsa + * Get the originating country from a Deal if it exists * @return string String of the deal originating country */ - private function getExpedition($deal) + private function getShipsFrom($deal) { $selector = implode( ' ', /* Notice this is a space! */ @@ -373,7 +453,7 @@ class DealabsBridge extends BridgeAbstract { 'text--color-greyShade' ) ); - if($deal->find('span[class='. $selector .']', 0) != null) { + if ($deal->find('span[class='. $selector .']', 0) != null) { return '
' . $deal->find('span[class='. $selector .']', 0)->children(2)->plaintext . '
'; @@ -383,25 +463,12 @@ class DealabsBridge extends BridgeAbstract { } /** - * Transforms a French date into a timestam + * Transforms a local date into a timestamp * @return int timestamp of the input date */ private function parseDate($string) { - $month_fr = array( - 'janvier', - 'février', - 'mars', - 'avril', - 'mai', - 'juin', - 'juillet', - 'août', - 'septembre', - 'octobre', - 'novembre', - 'décembre' - ); + $month_local = $this->i8n('local-months'); $month_en = array( 'January', 'February', @@ -416,12 +483,18 @@ class DealabsBridge extends BridgeAbstract { 'November', 'December' ); - $string = str_replace('Actualisé ', '', $string); - $date_str = trim(str_replace($month_fr, $month_en, $string)); - if(!preg_match('/[0-9]{4}/', $string)) { + // A date can be prfixed with some words, we remove theme + $string = $this->removeDatePrefixes($string); + // We translate the local months name in the english one + $date_str = trim(str_replace($month_local, $month_en, $string)); + + // If the date does not contain any year, we add the current year + if (!preg_match('/[0-9]{4}/', $string)) { $date_str .= ' ' . date('Y'); } + + // Add the Hour and minutes $date_str .= ' 00:00'; $date = DateTime::createFromFormat('j F Y H:i', $date_str); @@ -429,21 +502,41 @@ class DealabsBridge extends BridgeAbstract { } /** - * Transforms a relate French date into a timestam + * Remove the prefix of a date if it has one + * @return the date without prefiux + */ + private function removeDatePrefixes($string) + { + $string = str_replace($this->i8n('date-prefixes'), array(), $string); + return $string; + } + + /** + * Remove the suffix of a relative date if it has one + * @return the relative date without suffixes + */ + private function removeRelativeDateSuffixes($string) + { + if (count($this->i8n('relative-date-ignore-suffix')) > 0) { + $string = preg_replace($this->i8n('relative-date-ignore-suffix'), '', $string); + } + return $string; + } + + /** + * Transforms a relative local date into a timestamp * @return int timestamp of the input date */ private function relativeDateToTimestamp($str) { $date = new DateTime(); - $search = array( - 'il y a ', - 'min', - 'h', - 'jour', - 'jours', - 'mois', - 'ans', - 'et ' - ); + + // In case of update date, replace it by the regular relative date first word + $str = str_replace($this->i8n('relative-date-alt-prefixes'), $this->i8n('local-time-relative')[0], $str); + + $str = $this->removeRelativeDateSuffixes($str); + + $search = $this->i8n('local-time-relative'); + $replace = array( '-', 'minute', @@ -458,18 +551,38 @@ class DealabsBridge extends BridgeAbstract { return $date->getTimestamp(); } + /** + * Returns the RSS Feed title according to the parameters + * @return string the RSS feed Tiyle + */ public function getName(){ switch($this->queriedContext) { - case 'Recherche par Mot(s) clé(s)': - return self::NAME . ' - Recherche : '. $this->getInput('q'); + case $this->i8n('context-keyword'): + return $this->i8n('bridge-name') . ' - '. $this->i8n('title-keyword') .' : '. $this->getInput('q'); break; - case 'Deals par groupe': - $values = self::PARAMETERS['Deals par groupe']['groupe']['values']; - $groupe = array_search($this->getInput('groupe'), $values); - return self::NAME . ' - Groupe : '. $groupe; + case $this->i8n('context-group'): + $values = $this->getParameters()[$this->i8n('context-group')]['group']['values']; + $group = array_search($this->getInput('group'), $values); + return $this->i8n('bridge-name') . ' - '. $this->i8n('title-group'). ' : '. $group; break; default: // Return default value - return self::NAME; + return static::NAME; + } + } + + + + /** + * This is some "localisation" function that returns the needed content using + * the "$lang" class variable in the local class + * @return various the local content needed + */ + public function i8n($key) + { + if (array_key_exists($key, $this->lang)) { + return $this->lang[$key]; + } else { + return null; } } diff --git a/bridges/HotUKDealsBridge.php b/bridges/HotUKDealsBridge.php new file mode 100644 index 00000000..a7eebf61 --- /dev/null +++ b/bridges/HotUKDealsBridge.php @@ -0,0 +1,1397 @@ + array ( + 'q' => array( + 'name' => 'Keyword(s)', + 'type' => 'text', + 'required' => true + ), + 'hide_expired' => array( + 'name' => 'Hide expired deals', + 'type' => 'checkbox', + 'required' => 'true' + ), + 'hide_local' => array( + 'name' => 'Hide local deals', + 'type' => 'checkbox', + 'title' => 'Hide deals in physical store', + 'required' => 'true' + ), + 'priceFrom' => array( + 'name' => 'Minimal Price', + 'type' => 'text', + 'title' => 'Minmal Price in Pounds', + 'required' => 'false', + 'defaultValue' => '' + ), + 'priceTo' => array( + 'name' => 'Maximum Price', + 'type' => 'text', + 'title' => 'Maximum Price in Pounds', + 'required' => 'false', + 'defaultValue' => '' + ), + ), + + 'Deals per group' => array( + 'group' => array( + 'name' => 'Group', + 'type' => 'list', + 'required' => 'true', + 'title' => 'Group whose deals must be displayed', + 'values' => array( + '2DS' => '2ds', + '3D Bluray' => '3d-bluray', + '3D Glasses' => '3d-glasses', + '3D Printer' => '3d-printer', + '3DS' => '3ds', + '3DS Games' => '3ds-games', + '3D TV' => '3d-tv', + '4G' => '4g', + '4k Bluray' => '4k-bluray', + '4k Monitor' => '4k-monitor', + '4K TV' => '4k-tv', + '7up' => '7up', + '144Hz Monitor' => '144hz', + 'AA Batteries' => 'aa', + 'Acer' => 'acer', + 'Actifry' => 'actifry', + 'Action Camera' => 'action-camera', + 'Add On Item' => 'add-on-item', + 'Adidas' => 'adidas', + 'Adobe' => 'adobe', + 'Aftershave' => 'aftershave', + 'Air Bed' => 'air-bed', + 'Air Conditioner' => 'air-con', + 'Air Fryer' => 'air-fryer', + 'Airport Parking' => 'airport-parking', + 'AKG' => 'akg', + 'Alarm' => 'alarm', + 'Alcatel' => 'alcatel', + 'Alcohol' => 'alcohol', + 'Alienware' => 'alienware', + 'Alton Towers' => 'alton-towers', + 'Amazon Echo' => 'amazon-echo', + 'Amazon Fire Stick' => 'amazon-fire-stick', + 'Amazon Fire Tv' => 'fire-tv', + 'Amazon Pantry' => 'amazon-pantry', + 'Amazon Prime' => 'amazon-prime', + 'Amazon Warehouse' => 'amazon-warehouse', + 'AMD' => 'amd', + 'Amex' => 'amex', + 'Amiibo' => 'amiibo', + 'Amsterdam' => 'amsterdam', + 'Android' => 'android', + 'Android Tablet' => 'android-tablet', + 'Android TV' => 'android-tv', + 'Anker' => 'anker', + 'Apple' => 'apple', + 'Apple TV' => 'apple-tv', + 'Apple Watch' => 'apple-watch', + 'Armani' => 'armani', + 'Asics' => 'asics', + 'ASUS' => 'asus', + 'Audi' => 'audi', + 'Baby' => 'baby', + 'Baby & Kids' => 'kids', + 'Baby Monitor' => 'baby-monitor', + 'Baby Swing' => 'baby-swing', + 'Backpack' => 'backpack', + 'Bag' => 'bag', + 'Bank' => 'bank', + 'Barbour' => 'barbour', + 'Barcelona' => 'barcelona', + 'Bathroom' => 'bathroom', + 'Batman' => 'batman', + 'Battery' => 'battery', + 'Battlefield' => 'battlefield', + 'Battlefield 1' => 'battlefield-1', + 'BBQ' => 'bbq', + 'Bean To Cup' => 'bean-to-cup', + 'Beard Trimmer' => 'beard-trimmer', + 'Bed' => 'bed', + 'Bedding' => 'bedding', + 'Bed Frame' => 'bed-frame', + 'Beer' => 'beer', + 'Beko' => 'beko', + 'Belfast' => 'belfast', + 'Bench' => 'bench', + 'Berghaus' => 'berghaus', + 'Bike' => 'bike', + 'Bin' => 'bin', + 'Bioshock' => 'bioshock', + 'Black Ops 3' => 'black-ops-3', + 'Blackpool' => 'blackpool', + 'Blender' => 'blender', + 'Blinds' => 'blinds', + 'Bloodborne' => 'bloodborne', + 'Blu-Ray' => 'blu-ray', + 'Bluetooth Headphones' => 'bluetooth-headphones', + 'Bluetooth Speaker' => 'bluetooth-speaker', + 'BMW' => 'bmw', + 'Board Game' => 'board-game', + 'Boiler' => 'boiler', + 'Bosch' => 'bosch', + 'Bose' => 'bose', + 'Bourbon' => 'bourbon', + 'Boxers' => 'boxers', + 'Bra' => 'bra', + 'Braun' => 'braun', + 'Breakdown' => 'breakdown', + 'Brewdog' => 'brewdog', + 'Brita' => 'brita', + 'Broadband' => 'broadband', + 'BT' => 'bt', + 'Bt Sport' => 'bt-sport', + 'Buggy' => 'buggy', + 'Call Of Duty' => 'call-of-duty', + 'Camera' => 'camera', + 'Camera Lens' => 'lens', + 'Camping' => 'camping', + 'Candle' => 'candle', + 'Canon' => 'canon', + 'Canvas' => 'canvas', + 'Car' => 'car', + 'Caravan' => 'caravan', + 'Car Battery' => 'car-battery', + 'Car Hire' => 'car-hire', + 'Car Insurance' => 'car-insurance', + 'Car Lease' => 'car-lease', + 'Car Mats' => 'car-mats', + 'Carpet' => 'carpet', + 'Carpet Cleaner' => 'carpet-cleaner', + 'Car Seat' => 'car-seat', + 'Car Stereo' => 'car-stereo', + 'Casio' => 'casio', + 'Caterpillar Boots' => 'caterpillar', + 'Cat Food' => 'cat-food', + 'CCTV' => 'cctv', + 'Chainsaw' => 'chainsaw', + 'Chair' => 'chair', + 'Champagne' => 'champagne', + 'Charger' => 'charger', + 'Chessington' => 'chessington', + 'Chest Freezer' => 'chest-freezer', + 'Chocolate' => 'chocolate', + 'Chromebook' => 'chromebook', + 'Chromecast' => 'chromecast', + 'Cider' => 'cider', + 'Cinema' => 'cinema', + 'Cineworld' => 'cineworld', + 'Circular Saw' => 'circular-saw', + 'Circulon' => 'circulon', + 'Citizen' => 'citizen', + 'Clarins' => 'clarins', + 'Clarks' => 'clarks', + 'Clinique' => 'clinique', + 'Clothes' => 'clothes', + 'Coat' => 'coat', + 'Coffee' => 'coffee', + 'Coffee Machine' => 'coffee-machine', + 'Coke' => 'coke', + 'Compost' => 'compost', + 'Computers' => 'computers', + 'Converse' => 'converse', + 'Cooker' => 'cooker', + 'Cordless Phone' => 'cordless-phone', + 'Corsair' => 'corsair', + 'Cot' => 'cot', + 'CPU' => 'cpu', + 'Crash Bandicoot' => 'crash-bandicoot', + 'Credit Card' => 'credit-card', + 'Cricket' => 'cricket', + 'Crisps' => 'crisps', + 'Crocs' => 'crocs', + 'Cruise' => 'cruise', + 'Cuprinol' => 'cuprinol', + 'Cutlery' => 'cutlery', + 'Dab Radio' => 'dab-radio', + 'Dark Souls' => 'dark-souls', + 'Dark Souls 3' => 'dark-souls-3', + 'Dash Cam' => 'dash-cam', + 'Days Out' => 'days-out', + 'DDR3' => 'ddr3', + 'DDR4' => 'ddr4', + 'Deezer' => 'deezer', + 'Dehumidifier' => 'dehumidifier', + 'Dell' => 'dell', + 'Delonghi' => 'delonghi', + 'Denon' => 'denon', + 'Desk' => 'desk', + 'Desktop' => 'desktop', + 'Destiny' => 'destiny', + 'Destiny 2' => 'destiny-2', + 'Deus Ex' => 'deus-ex', + 'Dewalt' => 'dewalt', + 'Digital Camera' => 'digital-camera', + 'Dining Table' => 'dining-table', + 'Dinner Set' => 'dinner-set', + 'Dirt 4' => 'dirt-4', + 'Dishonored 2' => 'dishonored-2', + 'Dishwasher' => 'dishwasher', + 'Disney' => 'disney', + 'Disney Infinity' => 'disney-infinity', + 'Disneyland' => 'disneyland', + 'DIY' => 'diy', + 'Doctor Who' => 'doctor-who', + 'Dog' => 'dog', + 'Dog Bed' => 'dog-bed', + 'Dolce Gusto' => 'dolce-gusto', + 'DOOM' => 'doom', + 'Dremel' => 'dremel', + 'Dress' => 'dress', + 'Drill' => 'drill', + 'Drone' => 'drone', + 'Dryer' => 'dryer', + 'DSLR Camera' => 'dslr', + 'Dubai' => 'dubai', + 'Dulux' => 'dulux', + 'Durex' => 'durex', + 'Duvet' => 'duvet', + 'DVD' => 'dvd', + 'DVD Player' => 'dvd-player', + 'Dying Light' => 'dying-light', + 'Dyson' => 'dyson', + 'Dyson V6' => 'dyson-v6', + 'Dyson V8' => 'dyson-v8', + 'E-Cig' => 'e-cig', + 'EA' => 'ea', + 'EA Access' => 'ea-access', + 'Earphones' => 'earphones', + 'Earrings' => 'earrings', + 'Eastpak' => 'eastpak', + 'eBook' => 'ebook', + 'Eco-Drive' => 'eco-drive', + 'Ecobubble' => 'ecobubble', + 'Edifice' => 'edifice', + 'Edinburgh' => 'edinburgh', + 'EE' => 'ee', + 'Egg' => 'egg', + 'Egypt' => 'egypt', + 'Elder Scrolls' => 'elder-scrolls', + 'Electric Bike' => 'electric-bike', + 'Electric Cooker' => 'electric-cooker', + 'Electric Fires' => 'electric-fire', + 'Electric Shower' => 'electric-shower', + 'Electric Toothbrush' => 'electric-toothbrush', + 'Electronics' => 'electronics', + 'Elemis' => 'elemis', + 'Elephone' => 'elephone', + 'Elgato' => 'elgato', + 'Elite Dangerous' => 'elite-dangerous', + 'Emirates' => 'emirates', + 'Eneloop' => 'eneloop', + 'Energy' => 'energy', + 'Engine Oil' => 'engine-oil', + 'Entertainment' => 'entertainment', + 'Epilator' => 'epilator', + 'Epson' => 'epson', + 'eReader' => 'ereader', + 'Espresso' => 'espresso', + 'Estee Lauder' => 'estee-lauder', + 'Ethernet' => 'ethernet', + 'Eurostar' => 'eurostar', + 'Eurotunnel' => 'eurotunnel', + 'EVGA' => 'evga', + 'Extension Lead' => 'extension-lead', + 'External Hard Drive' => 'external-hard-drive', + 'Fairy' => 'fairy', + 'Fallout' => 'fallout', + 'Fallout 4' => 'fallout-4', + 'Fan' => 'fan', + 'Fancy Dress' => 'fancy-dress', + 'Far Cry' => 'far-cry', + 'Far Cry 4' => 'far-cry-4', + 'Far Cry Primal' => 'far-cry-primal', + 'Fashion' => 'fashion', + 'Fathers Day' => 'fathers-day', + 'Felix' => 'felix', + 'Fence' => 'fence', + 'Fender Guitars' => 'fender', + 'Ferrero Rocher' => 'ferrero-rocher', + 'Ferry' => 'ferry', + 'Festival' => 'festival', + 'Fiat' => 'fiat', + 'FIFA' => 'fifa', + 'FIFA 17' => 'fifa-17', + 'FIFA 18' => 'fifa-18', + 'Figures' => 'figures', + 'Final Fantasy' => 'final-fantasy', + 'Finance & Utilities' => 'personal-finance', + 'Finish' => 'finish', + 'Finlux' => 'finlux', + 'Fire Emblem' => 'fire-emblem', + 'Fire Pit' => 'fire-pit', + 'Fireplace' => 'fireplace', + 'Fish' => 'fish', + 'Fisher Price' => 'fisher-price', + 'Fishing' => 'fishing', + 'Fiskars' => 'fiskars', + 'Fitbit' => 'fitbit', + 'Fitbit Alta' => 'fitbit-alta', + 'Fitbit Blaze' => 'fitbit-blaze', + 'Fitbit Charge 2' => 'fitbit-charge-2', + 'Fitness Tracker' => 'fitness-tracker', + 'Flamingo Land' => 'flamingo-land', + 'Flask' => 'flask', + 'Fleece' => 'fleece', + 'Flight' => 'flight', + 'Flip Flops' => 'flip-flops', + 'Floodlight' => 'floodlight', + 'Flooring' => 'flooring', + 'Florida' => 'florida', + 'Flowers' => 'flowers', + 'Flybe' => 'flybe', + 'Flymo' => 'flymo', + 'Food' => 'food', + 'Food Mixer' => 'food-mixer', + 'Food Processor' => 'food-processor', + 'Football' => 'football', + 'Football Boots' => 'football-boots', + 'Football Manager' => 'football-manager', + 'Football Shirt' => 'football-shirt', + 'Ford' => 'ford', + 'For Honor' => 'for-honor', + 'Formula 1' => 'f1', + 'Forza' => 'forza', + 'Forza Horizon' => 'forza-horizon', + 'Forza Horizon 3' => 'forza-horizon-3', + 'Fossil' => 'fossil', + 'Fosters' => 'fosters', + 'Foundation' => 'foundation', + 'France' => 'france', + 'Fred Perry' => 'fred-perry', + 'Freebies' => 'freebies', + 'Freesat' => 'freesat', + 'Freeview' => 'freeview', + 'Freezer' => 'freezer', + 'Fridge' => 'fridge', + 'Fridge Freezer' => 'fridge-freezer', + 'Frozen' => 'frozen', + 'Fruit' => 'fruit', + 'Fryer' => 'fryer', + 'Frying Pan' => 'frying-pan', + 'Fujifilm' => 'fuji', + 'Funko Pop' => 'funko-pop', + 'Furby' => 'furby', + 'Furniture' => 'furniture', + 'Fusion' => 'fusion', + 'G-Shock' => 'g-shock', + 'G-Sync Monitor' => 'g-sync', + 'Game Of Thrones' => 'game-of-thrones', + 'Gaming' => 'gaming', + 'Gaming Chair' => 'gaming-chair', + 'Gaming Controller' => 'controller', + 'Gaming Headset' => 'gaming-headset', + 'Gaming Keyboard' => 'gaming-keyboard', + 'Gaming Laptop' => 'gaming-laptop', + 'Gaming Monitor' => 'gaming-monitor', + 'Gaming PC' => 'gaming-pc', + 'Garage' => 'garage', + 'Garden' => 'garden', + 'Garden Furniture' => 'garden-furniture', + 'Garmin' => 'garmin', + 'Gas' => 'gas', + 'Gas Cooker' => 'gas-cooker', + 'Gatwick' => 'gatwick', + 'Gazebo' => 'gazebo', + 'Gazelle' => 'gazelle', + 'GBK' => 'gbk', + 'Gears Of War' => 'gears-of-war', + 'Gears Of War 4' => 'gears-of-war-4', + 'GeForce' => 'geforce', + 'George Foreman' => 'george-foreman', + 'Geox' => 'geox', + 'GHD' => 'ghd', + 'Ghostbusters' => 'ghostbusters', + 'Ghost Recon' => 'ghost-recon', + 'Gibson Guitars' => 'gibson', + 'Giffgaff' => 'giffgaff', + 'Gift Card' => 'gift-card', + 'Gifts' => 'gifts', + 'Gift Set' => 'gift-set', + 'Gilet' => 'gilet', + 'Gillette' => 'gillette', + 'Gimbal' => 'gimbal', + 'Gin' => 'gin', + 'Glasgow' => 'glasgow', + 'Glasses' => 'glasses', + 'Gloves' => 'gloves', + 'Glue Gun' => 'glue-gun', + 'Gluten Free' => 'gluten-free', + 'Goggles' => 'goggles', + 'Go Kart' => 'go-kart', + 'Golf' => 'golf', + 'Golf Balls' => 'golf-balls', + 'Golf Clubs' => 'golf-clubs', + 'Goodfellas' => 'goodfellas', + 'Google' => 'google', + 'Google Home' => 'google-home', + 'Google Pixel' => 'google-pixel', + 'Go Outdoors' => 'go-outdoors', + 'GoPro' => 'gopro', + 'Graco' => 'graco', + 'Grand National' => 'grand-national', + 'Graphics Card' => 'graphics-card', + 'Gravity Rush' => 'gravity-rush', + 'Graze' => 'graze', + 'Greece' => 'greece', + 'Greenhouse' => 'greenhouse', + 'Greggs' => 'greggs', + 'Grey Goose' => 'grey-goose', + 'Grill' => 'grill', + 'Grinder' => 'grinder', + 'Grobag' => 'grobag', + 'Groceries' => 'groceries', + 'GTA' => 'gta', + 'GTA V' => 'gta-v', + 'Gtx 970' => 'gtx-970', + 'GTX 1060' => 'gtx-1060', + 'GTX 1070' => 'gtx-1070', + 'GTX 1080' => 'gtx-1080', + 'Guardians Of The Galaxy' => 'guardians-of-the-galaxy', + 'Gucci' => 'gucci', + 'Guinness' => 'guinness', + 'Guitar' => 'guitar', + 'Guitar Hero' => 'guitar-hero', + 'Gullivers' => 'gullivers', + 'Gym' => 'gym', + 'Gym Membership' => 'gym-membership', + 'H1z1' => 'h1z1', + 'Habitat' => 'habitat', + 'Hair' => 'hair', + 'Hair Clipper' => 'hair-clipper', + 'Hair Dryer' => 'hair-dryer', + 'Hair Dye' => 'hair-dye', + 'Halifax' => 'halifax', + 'Halo' => 'halo', + 'Halo 5' => 'halo-5', + 'Hammer' => 'hammer', + 'Hammock' => 'hammock', + 'Hamper' => 'hamper', + 'Handbag' => 'handbag', + 'Hand Mixer' => 'hand-mixer', + 'Happyland' => 'happyland', + 'Hard Drive' => 'hard-drive', + 'Haribo' => 'haribo', + 'Harman Kardon' => 'harman-kardon', + 'Harmony' => 'harmony', + 'Harry Potter' => 'harry-potter', + 'Hat' => 'hat', + 'Hatchimals' => 'hatchimals', + 'Hayfever' => 'hayfever', + 'Hdr Tv' => 'hdr-tv', + 'HD TV' => 'hd-tv', + 'Headboard' => 'headboard', + 'Headphones' => 'headphones', + 'Headset' => 'headset', + 'Health & Beauty' => 'beauty', + 'Heater' => 'heater', + 'Hedge Trimmer' => 'hedge-trimmer', + 'Heineken' => 'heineken', + 'Heinz' => 'heinz', + 'Helmet' => 'helmet', + 'Hermes' => 'hermes', + 'Highchair' => 'highchair', + 'Hiking' => 'hiking', + 'Hilton' => 'hilton', + 'Hisense' => 'hisense', + 'Hitachi' => 'hitachi', + 'Hitman' => 'hitman', + 'Hive' => 'hive', + 'Hob' => 'hob', + 'Holiday Inn' => 'holiday-inn', + 'Holidays & Leisure' => 'holiday', + 'Home & Garden' => 'home', + 'Home Cinema' => 'home-cinema', + 'Homedics' => 'homedics', + 'Homefront' => 'homefront', + 'Homeplug' => 'homeplug', + 'Home Security' => 'home-security', + 'Honey' => 'honey', + 'Honeywell' => 'honeywell', + 'Hong Kong' => 'hong-kong', + 'Honor' => 'honor', + 'Honor 6x' => 'honor-6x', + 'Hoodie' => 'hoodie', + 'Hoover' => 'hoover', + 'Horizon Zero Dawn' => 'horizon-zero-dawn', + 'Hornby' => 'hornby', + 'Hose' => 'hose', + 'Hotel' => 'hotel', + 'Hotpoint' => 'hotpoint', + 'Hot Tub' => 'hot-tub', + 'Hot Wheels' => 'hot-wheels', + 'Hozelock' => 'hozelock', + 'HP' => 'hp', + 'HP Envy' => 'hp-envy', + 'HP Laptop' => 'hp-laptop', + 'H Samuel' => 'h-samuel', + 'HTC' => 'htc', + 'HTC 10' => 'htc-10', + 'HTC Vive' => 'htc-vive', + 'Huawei' => 'huawei', + 'Huawei P9' => 'huawei-p9', + 'Huggies' => 'huggies', + 'Hugo Boss' => 'hugo-boss', + 'Humax' => 'humax', + 'Humidifier' => 'humidifier', + 'Hunter' => 'hunter', + 'Hydro 5' => 'hydro-5', + 'Hyperx' => 'hyperx', + 'Hyundai' => 'hyundai', + 'Iams Pet Food' => 'iams', + 'Ibiza' => 'ibiza', + 'Icandy' => 'icandy', + 'Ice Cream' => 'ice-cream', + 'Ice Cream Maker' => 'ice-cream-maker', + 'Imaginext' => 'imaginext', + 'Impact Driver' => 'impact-driver', + 'Indesit' => 'indesit', + 'India' => 'india', + 'Inflatable' => 'inflatable', + 'Injustice' => 'injustice', + 'Ink' => 'ink', + 'Inner Tube' => 'inner-tube', + 'Instant Ink' => 'instant-ink', + 'Insulation' => 'insulation', + 'Insurance' => 'insurance', + 'Intel' => 'intel', + 'Intel Atom' => 'atom', + 'Intel i3' => 'i3', + 'Intel i5' => 'i5', + 'Intel i7' => 'i7', + 'Internal Hard Drive' => 'internal-hard-drive', + 'Internet' => 'internet', + 'In The Night Garden' => 'in-the-night-garden', + 'iOS' => 'ios', + 'iPad' => 'ipad', + 'iPad Air' => 'ipad-air', + 'iPad Case' => 'ipad-case', + 'iPad Mini' => 'ipad-mini', + 'iPad Pro' => 'ipad-pro', + 'Ip Camera' => 'ip-camera', + 'iPhone' => 'iphone', + 'iPhone 5S' => 'iphone-5s', + 'iPhone 6' => 'iphone-6', + 'iPhone 6 Plus' => 'iphone-6-plus', + 'iPhone 6s' => 'iphone-6s', + 'iPhone 6s Plus' => 'iphone-6s-plus', + 'iPhone 7' => 'iphone-7', + 'iPhone 7 Plus' => 'iphone-7-plus', + 'iPhone Case' => 'iphone-case', + 'Iphone SE' => 'iphone-se', + 'iPod' => 'ipod', + 'iPod Nano' => 'ipod-nano', + 'iPod Touch' => 'ipod-touch', + 'Ireland' => 'ireland', + 'Irn Bru' => 'irn-bru', + 'Iron' => 'iron', + 'Ironing Board' => 'ironing-board', + 'Isle Of Wight' => 'isle-of-wight', + 'Isofix' => 'isofix', + 'Issey Miyake' => 'issey-miyake', + 'Italy' => 'italy', + 'iTunes' => 'itunes', + 'ITV' => 'itv', + 'Jabra' => 'jabra', + 'Jack Daniels' => 'jack-daniels', + 'Jacket' => 'jacket', + 'Jack Wills' => 'jack-wills', + 'Jack Wolfskin' => 'jack-wolfskin', + 'Jaguar' => 'jaguar', + 'Jamaica' => 'jamaica', + 'Jameson' => 'jameson', + 'Japan' => 'japan', + 'Jawbone' => 'jawbone', + 'Jaybird' => 'jaybird', + 'JBL' => 'jbl', + 'Jeans' => 'jeans', + 'Jewellery' => 'jewellery', + 'Jigsaw' => 'jigsaw', + 'Jim Beam' => 'jim-beam', + 'Jimmy Choo' => 'jimmy-choo', + 'Joop' => 'joop', + 'Jordan' => 'jordan', + 'Joseph Joseph' => 'joseph-joseph', + 'Joules' => 'joules', + 'Juice' => 'juice', + 'Juicer' => 'juicer', + 'Jumper' => 'jumper', + 'Jumperoo' => 'jumperoo', + 'Jura' => 'jura', + 'Just Cause 3' => 'just-cause-3', + 'Just Dance' => 'just-dance', + 'JVC' => 'jvc', + 'Karcher' => 'karcher', + 'Kaspersky' => 'kaspersky', + 'Kayak' => 'kayak', + 'Keg' => 'keg', + 'Kenwood' => 'kenwood', + 'Kenwood kMix' => 'kmix', + 'Keter' => 'keter', + 'Kettle' => 'kettle', + 'Kettlebell' => 'kettlebell', + 'Keyboard' => 'keyboard', + 'Kia' => 'kia', + 'Kickers' => 'kickers', + 'Kids Bike' => 'kids-bike', + 'Kinder' => 'kinder', + 'Kindle' => 'kindle', + 'Kindle Fire' => 'kindle-fire', + 'Kindle Paperwhite' => 'kindle-paperwhite', + 'Kinect' => 'kinect', + 'Kingdom Hearts' => 'kingdom-hearts', + 'King Size' => 'king-size', + 'Kirby' => 'kirby', + 'Kitchen' => 'kitchen', + 'KitchenAid' => 'kitchenaid', + 'Kitchen Roll' => 'kitchen-roll', + 'Kitsound' => 'kitsound', + 'Knickers' => 'knickers', + 'Knife' => 'knife', + 'Kobo' => 'kobo', + 'Kodi' => 'kodi', + 'Kopparberg' => 'kopparberg', + 'Kraken' => 'kraken', + 'Krakow' => 'krakow', + 'Krispy Kreme' => 'krispy-kreme', + 'Kurt Geiger' => 'kurt-geiger', + 'Lacoste' => 'lacoste', + 'Ladder' => 'ladder', + 'Lamb' => 'lamb', + 'Laminate' => 'laminate', + 'Lamp' => 'lamp', + 'Lancome' => 'lancome', + 'Laptop' => 'laptop', + 'Laser Printer' => 'laser-printer', + 'Laura Ashley' => 'laura-ashley', + 'Lavazza' => 'lavazza', + 'Lavender' => 'lavender', + 'Lawnmower' => 'lawnmower', + 'Lay-Z-Spa' => 'lay-z-spa', + 'Le Creuset' => 'le-creuset', + 'LED Bulbs' => 'led-bulbs', + 'LED TV' => 'led-tv', + 'Leeds' => 'leeds', + 'Lego' => 'lego', + 'Lego City' => 'lego-city', + 'Lego Dimensions' => 'lego-dimensions', + 'Lego Friends' => 'lego-friends', + 'Legoland' => 'legoland', + 'Lego Star Wars' => 'lego-star-wars', + 'Lego Technic' => 'lego-technic', + 'Leicester' => 'leicester', + 'Lenovo' => 'lenovo', + 'Lenovo Tablet' => 'lenovo-tablet', + 'Lenovo Yoga' => 'lenovo-yoga', + 'Levi' => 'levi', + 'LG' => 'lg', + 'LG G5' => 'lg-g5', + 'LG G6' => 'lg-g6', + 'LG TV' => 'lg-tv', + 'Light' => 'light', + 'Lighting' => 'lighting', + 'Lightning Cable' => 'lightning-cable', + 'Lindor' => 'lindor', + 'Lindt' => 'lindt', + 'Lingerie' => 'lingerie', + 'Linx' => 'linx', + 'Little Tikes' => 'little-tikes', + 'Liverpool' => 'liverpool', + 'Logitech' => 'logitech', + 'London' => 'london', + 'London Eye' => 'london-eye', + 'London Zoo' => 'london-zoo', + 'Lottery' => 'lottery', + 'Lounger' => 'lounger', + 'Lurpak' => 'lurpak', + 'Lynx' => 'lynx', + 'MacBook' => 'macbook', + 'MacBook Air' => 'macbook-air', + 'MacBook Pro' => 'macbook-pro', + 'Mac Mini' => 'mac-mini', + 'Mad Max' => 'mad-max', + 'Mafia 3' => 'mafia-3', + 'Magazine' => 'magazine', + 'Magimix' => 'magimix', + 'Majorca' => 'majorca', + 'Make Up' => 'make-up', + 'Makita' => 'makita', + 'Maldives' => 'maldives', + 'Manchester' => 'manchester', + 'Manfrotto' => 'manfrotto', + 'Marc Jacobs' => 'marc-jacobs', + 'Mario' => 'mario', + 'Mario Kart' => 'mario-kart', + 'Mario Kart 8' => 'mario-kart-8', + 'Mario Kart 8 Deluxe' => 'mario-kart-8-deluxe', + 'Marvel' => 'marvel', + 'Mascara' => 'mascara', + 'Massage' => 'massage', + 'Mass Effect' => 'mass-effect', + 'Mass Effect Andromeda' => 'mass-effect-andromeda', + 'Maternity' => 'maternity', + 'Mattress' => 'mattress', + 'Mattress Topper' => 'mattress-topper', + 'Mavic' => 'mavic', + 'Maxi Cosi' => 'maxi-cosi', + 'Meat' => 'meat', + 'Mechanical Keyboard' => 'mechanical-keyboard', + 'Medion' => 'medion', + 'Memory Foam' => 'memory-foam', + 'Mens Boots' => 'mens-boots', + 'Mens Fashion' => 'mens-clothing', + 'Mens Shoes' => 'mens-shoes', + 'Mercedes' => 'mercedes', + 'Merlin' => 'merlin', + 'Merrell' => 'merrell', + 'Mexico' => 'mexico', + 'Michael Kors' => 'michael-kors', + 'Microphone' => 'microphone', + 'Micro SD' => 'micro-sd', + 'Microserver' => 'microserver', + 'Microsoft' => 'microsoft', + 'Microsoft Office' => 'microsoft-office', + 'Microwave' => 'microwave', + 'Miele' => 'miele', + 'Milwaukee' => 'milwaukee', + 'Minecraft' => 'minecraft', + 'Mini' => 'mini', + 'Mini Fridge' => 'mini-fridge', + 'Mini PC' => 'mini-pc', + 'Mirror' => 'mirror', + 'Mitre Saw' => 'mitre-saw', + 'Mobile Broadband' => 'mobile-broadband', + 'Mobile Contract' => 'mobile-contract', + 'Mobile Phone' => 'mobile-phone', + 'Mobiles' => 'mobiles', + 'Molton Brown' => 'molton-brown', + 'Monitor' => 'monitor', + 'Monopoly' => 'monopoly', + 'Monsoon' => 'monsoon', + 'Mop' => 'mop', + 'Morocco' => 'morocco', + 'Mortgage' => 'mortgage', + 'Moses Basket' => 'moses-basket', + 'Mot' => 'mot', + 'Motherboard' => 'motherboard', + 'Moto 360' => 'moto-360', + 'Moto G' => 'moto-g', + 'Moto G4' => 'moto-g4', + 'Moto G5' => 'moto-g5', + 'Motorcycle' => 'motorcycle', + 'Motorola' => 'motorola', + 'Moto Z' => 'moto-z', + 'Mountain Bike' => 'mountain-bike', + 'Mouse' => 'mouse', + 'Mouse Mat' => 'mouse-mat', + 'Movie' => 'movie', + 'MP3 Player' => 'mp3-player', + 'MSI' => 'msi', + 'Mug' => 'mug', + 'Multitool' => 'multitool', + 'Music' => 'music', + 'My Little Pony' => 'my-little-pony', + 'Nandos' => 'nandos', + 'NAS' => 'nas', + 'National Express' => 'national-express', + 'National Trust' => 'national-trust', + 'Necklace' => 'necklace', + 'Nectar' => 'nectar', + 'Neff' => 'neff', + 'Nerf' => 'nerf', + 'Nescafe' => 'nescafe', + 'Nespresso' => 'nespresso', + 'Nest' => 'nest', + 'Netflix' => 'netflix', + 'Netgear' => 'netgear', + 'Netgear Arlo' => 'arlo', + 'New Balance' => 'new-balance', + 'Newcastle' => 'newcastle', + 'New Look' => 'new-look', + 'New York' => 'new-york', + 'Nextbase' => 'nextbase', + 'Nexus' => 'nexus', + 'NFL' => 'nfl', + 'Nier' => 'nier', + 'Nike' => 'nike', + 'Nike Air Max' => 'nike-air-max', + 'Nikon' => 'nikon', + 'Nilfisk' => 'nilfisk', + 'Ninja' => 'ninja', + 'Nintendo' => 'nintendo', + 'Nintendo DS' => 'nintendo-ds', + 'Nintendo eShop' => 'eshop', + 'Nintendo Switch' => 'nintendo-switch', + 'Nioh' => 'nioh', + 'Nissan' => 'nissan', + 'Nivea' => 'nivea', + 'Nokia' => 'nokia', + 'North Face' => 'north-face', + 'Norton' => 'norton', + 'Note 4' => 'note-4', + 'Now TV' => 'now-tv', + 'Nursery' => 'nursery', + 'Nus' => 'nus', + 'Nutella' => 'nutella', + 'Nutribullet' => 'nutribullet', + 'Nutri Ninja' => 'nutri-ninja', + 'NVIDIA' => 'nvidia', + 'O2' => 'o2', + 'O2 Refresh' => 'o2-refresh', + 'Oak' => 'oak', + 'Oakley' => 'oakley', + 'Oculus' => 'oculus', + 'Odeon' => 'odeon', + 'Office' => 'office', + 'Office Chair' => 'office-chair', + 'OLED TV' => 'oled', + 'Olympus' => 'olympus', + 'Oneplus' => 'oneplus', + 'Onkyo' => 'onkyo', + 'Oral-B' => 'oral-b', + 'Origin' => 'origin', + 'Orlando' => 'orlando', + 'Osprey' => 'osprey', + 'Ottoman' => 'ottoman', + 'Outdoor' => 'outdoor', + 'Oven' => 'oven', + 'Overwatch' => 'overwatch', + 'Paddling Pool' => 'paddling-pool', + 'Paint' => 'paint', + 'Pampers' => 'pampers', + 'Pan' => 'pan', + 'Panasonic' => 'panasonic', + 'Panasonic Lumix' => 'lumix', + 'Pandora' => 'pandora', + 'Papa Johns' => 'papa-johns', + 'Parasol' => 'parasol', + 'Parcel' => 'parcel', + 'Paris' => 'paris', + 'Parking' => 'parking', + 'Paw Patrol' => 'paw-patrol', + 'PAYG' => 'payg', + 'Paypal' => 'paypal', + 'PC' => 'pc', + 'PC Case' => 'pc-case', + 'PC Game' => 'pc-game', + 'Pebble' => 'pebble', + 'Peppa Pig' => 'peppa-pig', + 'Pepsi' => 'pepsi', + 'Perfume' => 'perfume', + 'Persona' => 'persona', + 'Persona 5' => 'persona-5', + 'Petrol' => 'petrol', + 'Philips' => 'philips', + 'Philips Hue' => 'philips-hue', + 'Phones' => 'phone', + 'Photo' => 'photo', + 'Piano' => 'piano', + 'Pillow' => 'pillow', + 'Pizza' => 'pizza', + 'Plant' => 'plant', + 'Playhouse' => 'playhouse', + 'Playmobil' => 'playmobil', + 'Playstation' => 'playstation', + 'Playstation Plus' => 'playstation-plus', + 'Playstation VR' => 'playstation-vr', + 'Pokemon' => 'pokemon', + 'Pool' => 'pool', + 'Power Bank' => 'power-bank', + 'Powerline' => 'powerline', + 'Power Rangers' => 'power-rangers', + 'Pram' => 'pram', + 'Pressure Cooker' => 'pressure-cooker', + 'Pressure Washer' => 'pressure-washer', + 'Printer' => 'printer', + 'Projector' => 'projector', + 'Protein' => 'protein', + 'PS3' => 'ps3', + 'PS4' => 'ps4', + 'PS4 Controller' => 'ps4-controller', + 'PS4 Games' => 'ps4-games', + 'PS4 Headset' => 'ps4-headset', + 'PS4 Pro' => 'ps4-pro', + 'PS4 Slim' => 'ps4-slim', + 'PSN' => 'psn', + 'PSU' => 'psu', + 'PS Vita' => 'ps-vita', + 'Puma' => 'puma', + 'Pushchair' => 'pushchair', + 'Qnap' => 'qnap', + 'Quorn' => 'quorn', + 'Rab' => 'rab', + 'Radiator' => 'radiator', + 'Radio' => 'radio', + 'Radley' => 'radley', + 'Railcard' => 'railcard', + 'Ralph Lauren' => 'ralph-lauren', + 'RAM' => 'ram', + 'Raspberry Pi' => 'raspberry-pi', + 'Rattan Garden Furniture' => 'rattan', + 'Ray Ban' => 'ray-ban', + 'Razer' => 'razer', + 'Razor' => 'razor', + 'Reebok' => 'reebok', + 'Resident Evil' => 'resident-evil', + 'Resident Evil 7' => 'resident-evil-7', + 'Rice' => 'rice', + 'Ring' => 'ring', + 'Road Bike' => 'road-bike', + 'Rocket League' => 'rocket-league', + 'Rogue One' => 'rogue-one', + 'Roku' => 'roku', + 'Rolex' => 'rolex', + 'Roof Box' => 'roof-box', + 'Roses' => 'roses', + 'Rotary' => 'rotary', + 'Router' => 'router', + 'Rug' => 'rug', + 'Rum' => 'rum', + 'Running' => 'running', + 'RX 480' => 'rx-480', + 'Ryanair' => 'ryanair', + 'Ryobi' => 'ryobi', + 'Sale' => 'sale', + 'Salmon' => 'salmon', + 'Salomon' => 'salomon', + 'Samsonite' => 'samsonite', + 'Samsung' => 'samsung', + 'Samsung Galaxy' => 'samsung-galaxy', + 'Samsung Galaxy S7' => 'samsung-galaxy-s7', + 'Samsung Galaxy S7 Edge' => 'samsung-galaxy-s7-edge', + 'Samsung Galaxy S8' => 'samsung-galaxy-s8', + 'Samsung Galaxy S8 Plus' => 'samsung-s8-plus', + 'Samsung Gear' => 'samsung-gear', + 'Samsung TV' => 'samsung-tv', + 'Sandals' => 'sandals', + 'Sander' => 'sander', + 'SanDisk' => 'sandisk', + 'Sat Nav' => 'sat-nav', + 'Saw' => 'saw', + 'Scalextric' => 'scalextric', + 'Scooter' => 'scooter', + 'Screenwash' => 'screenwash', + 'Screwdriver' => 'screwdriver', + 'SD Card' => 'sd-card', + 'SDXC' => 'sdxc', + 'Seagate' => 'seagate', + 'Seat' => 'seat', + 'Security Camera' => 'security-camera', + 'Seeds' => 'seeds', + 'Seiko' => 'seiko', + 'Sennheiser' => 'sennheiser', + 'Server' => 'server', + 'Sewing Machine' => 'sewing-machine', + 'Shadow Of Mordor' => 'shadow-of-mordor', + 'Shark' => 'shark', + 'Sharpie' => 'sharpie', + 'Shaver' => 'shaver', + 'Shed' => 'shed', + 'Shelves' => 'shelves', + 'Shirt' => 'shirt', + 'Shoes' => 'shoe', + 'Shopkins' => 'shopkins', + 'Shorts' => 'shorts', + 'Shower' => 'shower', + 'Shredder' => 'shredder', + 'Sideboard' => 'sideboard', + 'Sim' => 'sim', + 'Sim Free' => 'sim-free', + 'Sim Only' => 'sim-only', + 'Sink' => 'sink', + 'Skechers' => 'skechers', + 'Ski' => 'ski', + 'Skoda' => 'skoda', + 'Sky' => 'sky', + 'Skylanders' => 'skylanders', + 'Skyrim' => 'skyrim', + 'Sleeping Bag' => 'sleeping-bag', + 'Slide' => 'slide', + 'Slimming World' => 'slimming-world', + 'Slippers' => 'slippers', + 'Slow Cooker' => 'slow-cooker', + 'SLR Camera' => 'slr', + 'Smart' => 'smart', + 'Smartphone' => 'smartphone', + 'Smartthings' => 'smartthings', + 'Smart TV' => 'smart-tv', + 'Smartwatch' => 'smartwatch', + 'Snapfish' => 'snapfish', + 'Socket Set' => 'socket-set', + 'Socks' => 'socks', + 'Sofa' => 'sofa', + 'Software & Apps' => 'software-apps', + 'Sonicare' => 'sonicare', + 'Sonos' => 'sonos', + 'Sony' => 'sony', + 'Sony TV' => 'sony-tv', + 'Soundbar' => 'soundbar', + 'Soup Maker' => 'soup-maker', + 'Spa' => 'spa', + 'Spain' => 'spain', + 'Speakers' => 'speakers', + 'Spinner' => 'spinner', + 'Spirits' => 'spirits', + 'Splatoon' => 'splatoon', + 'Sports & Fitness' => 'sports-fitness', + 'SSD' => 'ssd', + 'Starbucks' => 'starbucks', + 'Star Trek' => 'star-trek', + 'Star Wars' => 'star-wars', + 'Steak' => 'steak', + 'Steam' => 'steam', + 'Steamer' => 'steamer', + 'Steam Iron' => 'steam-iron', + 'Steam Link' => 'steam-link', + 'Steam Mop' => 'steam-mop', + 'Storage' => 'storage', + 'Storage Box' => 'storage-box', + 'Strimmer' => 'strimmer', + 'Student' => 'student', + 'Suit' => 'suit', + 'Suitcase' => 'suitcase', + 'Sun Cream' => 'sun-cream', + 'Sunglasses' => 'sunglasses', + 'Superdry' => 'superdry', + 'Surface' => 'surface', + 'Surface Book' => 'surface-book', + 'Sweets' => 'sweets', + 'Swing' => 'swing', + 'Synology' => 'synology', + 'T-Shirt' => 't-shirt', + 'Table' => 'table', + 'Tablet' => 'tablet', + 'Table Tennis' => 'table-tennis', + 'Tado' => 'tado', + 'Tag Heuer' => 'tag-heuer', + 'Takeaway' => 'takeaway', + 'Talkmobile' => 'talkmobile', + 'Tap' => 'tap', + 'Tassimo' => 'tassimo', + 'Tastecard' => 'tastecard', + 'Tea' => 'tea', + 'Ted Baker' => 'ted-baker', + 'Tefal' => 'tefal', + 'Tekken' => 'tekken', + 'Tekken 7' => 'tekken-7', + 'Telegraph' => 'telegraph', + 'Telescope' => 'telescope', + 'Tenerife' => 'tenerife', + 'Tennis' => 'tennis', + 'Tent' => 'tent', + 'Tesco Clothing' => 'tesco-clothing', + 'Tesla' => 'tesla', + 'Thailand' => 'thailand', + 'Theatre' => 'theatre', + 'The Body Shop' => 'body-shop', + 'The Last Guardian' => 'the-last-guardian', + 'The Last Of Us' => 'the-last-of-us', + 'Theme Park' => 'theme-park', + 'Thermometer' => 'thermometer', + 'Thermos' => 'thermos', + 'Thermostat' => 'thermostat', + 'The Sun' => 'the-sun', + 'The Witcher 3' => 'the-witcher-3', + 'Thinkpad' => 'thinkpad', + 'Thomas Sabo' => 'thomas-sabo', + 'Thorntons' => 'thorntons', + 'Thorpe Park' => 'thorpe-park', + 'Throw' => 'throw', + 'Thrustmaster' => 'thrustmaster', + 'Thule' => 'thule', + 'Tights' => 'tights', + 'Tile' => 'tile', + 'Timberland' => 'timberland', + 'Tissot' => 'tissot', + 'Titanfall' => 'titanfall', + 'Titanfall 2' => 'titanfall-2', + 'Toaster' => 'toaster', + 'Toddler Bed' => 'toddler-bed', + 'Toilet' => 'toilet', + 'Toilet Roll' => 'toilet-roll', + 'Toilet Seat' => 'toilet-seat', + 'Tomb Raider' => 'tomb-raider', + 'Tom Clancy' => 'tom-clancy', + 'Tom Ford' => 'tom-ford', + 'Tommee Tippee' => 'tommee-tippee', + 'Toms' => 'toms', + 'TomTom' => 'tomtom', + 'Tool' => 'tool', + 'Toothbrush' => 'toothbrush', + 'Toothpaste' => 'toothpaste', + 'Toot Toot' => 'toot-toot', + 'Torch' => 'torch', + 'Torque Wrench' => 'torque-wrench', + 'Toshiba' => 'toshiba', + 'Towel' => 'towel', + 'Toyota' => 'toyota', + 'Toys' => 'toy', + 'Toy Story' => 'toy-story', + 'Tp Link' => 'tp-link', + 'Tracksuit' => 'tracksuit', + 'Train' => 'train', + 'Trainers' => 'trainers', + 'Trampoline' => 'trampoline', + 'Transcend' => 'transcend', + 'Transformers' => 'transformers', + 'Travel' => 'travel', + 'Travel Insurance' => 'travel-insurance', + 'Travelodge' => 'travelodge', + 'Travel System' => 'travel-system', + 'Treadmill' => 'treadmill', + 'Trespass' => 'trespass', + 'Trike' => 'trike', + 'Tripod' => 'tripod', + 'Tripp' => 'tripp', + 'Trolley' => 'trolley', + 'Trousers' => 'trousers', + 'Trunki' => 'trunki', + 'Tumble Dryer' => 'tumble-dryer', + 'Tuna' => 'tuna', + 'Turbo Trainer' => 'turbo-trainer', + 'Turkey' => 'turkey', + 'Turntable' => 'turntable', + 'Turtle Beach' => 'turtle-beach', + 'TV' => 'tv', + 'TV Stand' => 'tv-stand', + 'Tyres' => 'tyres', + 'Ubisoft' => 'ubisoft', + 'Ue Boom' => 'ue-boom', + 'UFC' => 'ufc', + 'UGG' => 'ugg', + 'Ulefone' => 'ulefone', + 'Ultimate Ears UE Boom 2' => 'ue-boom-2', + 'Ultimate Outdoors' => 'ultimate-outdoors', + 'Ultrabook' => 'ultrabook', + 'Ultrawide Monitor' => 'ultrawide', + 'Umbrella' => 'umbrella', + 'Umi' => 'umi', + 'Uncharted' => 'uncharted', + 'Uncharted 4' => 'uncharted-4', + 'Under Armour' => 'under-armour', + 'Underwear' => 'underwear', + 'Unicorn' => 'unicorn', + 'Unidays' => 'unidays', + 'Urban Decay' => 'urban-decay', + 'Usa' => 'usa', + 'USB Hub' => 'usb-hub', + 'USB Memory Stick' => 'flash-drive', + 'Usn' => 'usn', + 'Vacuum Cleaners' => 'vacuum-cleaners', + 'Vango' => 'vango', + 'Vanish' => 'vanish', + 'Vans' => 'vans', + 'Vape' => 'vape', + 'Vauxhall' => 'vauxhall', + 'Vax' => 'vax', + 'Velvet' => 'velvet', + 'Venice' => 'venice', + 'Versace' => 'versace', + 'Vibrator' => 'vibrator', + 'Victorinox' => 'victorinox', + 'Vileda' => 'vileda', + 'Vinyl' => 'vinyl', + 'Virgin' => 'virgin', + 'Vitamix' => 'vitamix', + 'Vodafone' => 'vodafone', + 'Vodka' => 'vodka', + 'Volvo' => 'volvo', + 'VPN' => 'vpn', + 'VR' => 'vr', + 'VTech' => 'vtech', + 'Vue' => 'vue', + 'VW' => 'vw', + 'Wacom' => 'wacom', + 'Waffle Maker' => 'waffle-maker', + 'Wahl' => 'wahl', + 'Walkers' => 'walkers', + 'Walking Boots' => 'walking-boots', + 'Walking Dead' => 'walking-dead', + 'Wallet' => 'wallet', + 'Wallpaper' => 'wallpaper', + 'Walsall' => 'walsall', + 'Wardrobe' => 'wardrobe', + 'Warhammer' => 'warhammer', + 'Washer Dryer' => 'washer-dryer', + 'Washing Machine' => 'washing-machine', + 'Watch' => 'watch', + 'Watch Dogs' => 'watch-dogs', + 'Watch Dogs 2' => 'watch-dogs-2', + 'Water Bottle' => 'water-bottle', + 'Water Butt' => 'water-butt', + 'Water Filter' => 'water-filter', + 'Wayfair' => 'wayfair', + 'Webcam' => 'webcam', + 'Weber' => 'weber', + 'Wedding' => 'wedding', + 'Weed' => 'weed', + 'Weekend Break' => 'weekend-break', + 'Weetabix' => 'weetabix', + 'Weight Watchers' => 'weight-watchers', + 'Wellies' => 'wellies', + 'Wenger' => 'wenger', + 'Western Digital' => 'western-digital', + 'Wetsuit' => 'wetsuit', + 'Wheelbarrow' => 'wheelbarrow', + 'Whey' => 'whey', + 'Whiskas' => 'whiskas', + 'Whisky' => 'whisky', + 'Wifi Camera' => 'wifi-camera', + 'Wifi Extender' => 'wifi-extender', + 'Wii' => 'wii', + 'Wii U' => 'wii-u', + 'Wii U Pro Controller' => 'wii-u-pro-controller', + 'Wileyfox' => 'wileyfox', + 'Wilkinson Sword' => 'wilkinson-sword', + 'Wimbledon' => 'wimbledon', + 'Windows' => 'windows', + 'Windows 10' => 'windows-10', + 'Wine' => 'wine', + 'Wipes' => 'wipes', + 'Wireless Headphones' => 'wireless-headphones', + 'Wireless Keyboard' => 'wireless-keyboard', + 'Witcher' => 'witcher', + 'Wok' => 'wok', + 'Wolfenstein' => 'wolfenstein', + 'Women Fashion' => 'womens-clothes', + 'Workbench' => 'workbench', + 'World Of Warcraft' => 'world-of-warcraft', + 'Worx' => 'worx', + 'Wuaki' => 'wuaki', + 'WWE' => 'wwe', + 'Xbox' => 'xbox', + 'Xbox 360' => 'xbox-360', + 'Xbox 360 Game' => 'xbox-360-game', + 'Xbox Controller' => 'xbox-controller', + 'Xbox Gift Card' => 'xbox-gift-card', + 'Xbox Headset' => 'xbox-headset', + 'Xbox Live' => 'xbox-live', + 'Xbox One' => 'xbox-one', + 'Xbox One Controller' => 'xbox-one-controller', + 'Xbox One Elite Controller' => 'xbox-one-elite-controller', + 'Xbox One Games' => 'xbox-one-games', + 'Xbox One S' => 'xbox-one-s', + 'Xbox One X' => 'xbox-one-x', + 'Xbox Wireless Adapter' => 'xbox-wireless-adapter', + 'Xcom' => 'xcom', + 'XCOM 2' => 'xcom-2', + 'XFX' => 'xfx', + 'Xiaomi' => 'xiaomi', + 'Xiaomi Redmi' => 'redmi', + 'Xperia' => 'xperia', + 'Xperia Z3' => 'xperia-z3', + 'Xperia Z5' => 'xperia-z5', + 'XPS' => 'xps', + 'Yakuza' => 'yakuza', + 'Yale' => 'yale', + 'Yamaha' => 'yamaha', + 'Yankee Candle' => 'yankee-candle', + 'Yoga' => 'yoga', + 'York' => 'york', + 'Yorkshire' => 'yorkshire', + 'Yoshi' => 'yoshi', + 'Youview' => 'youview', + 'Yves Saint Laurent' => 'yves-saint-laurent', + 'Zante' => 'zante', + 'Zanussi' => 'zanussi', + 'Zelda' => 'zelda', + 'Zelda Breath Of The Wild' => 'zelda-breath-of-the-wild', + 'Zenbook' => 'zenbook', + 'Zippo' => 'zippo', + 'Zizzi' => 'zizzi', + 'Zoo' => 'zoo', + 'Zoostorm' => 'zoostorm', + 'ZOTAC' => 'zotac', + 'ZTE' => 'zte', + 'ZyXEL' => 'zyxel', + ) + ), + 'order' => array( + 'name' => 'Order by', + 'type' => 'list', + 'required' => 'true', + 'title' => 'Sort order of deals', + 'values' => array( + 'From the most to the least hot deal' => '-hot', + 'From the most recent deal to the oldest' => '', + 'From the most commented deal to the least commented deal' => '-discussed' + ) + ) + ) + ); + + public $lang = array( + 'bridge-uri' => SELF::URI, + 'bridge-name' => SELF::NAME, + 'context-keyword' => 'Search by keyword(s))', + 'context-group' => 'Deals per group', + 'uri-group' => '/tag/', + 'request-error' => 'Could not request HotUKDeals', + 'no-results' => 'Ooops, looks like we could', + 'relative-date-indicator' => array( + 'ago', + ), + 'price' => 'Price', + 'shipping' => 'Shipping', + 'origin' => 'Origin', + 'discount' => 'Discount', + 'title-keyword' => 'Search', + 'title-group' => 'Group', + 'local-months' => array( + 'Jan', + 'Feb', + 'Mar', + 'Apr', + 'May', + 'Jun', + 'Jul', + 'Aug', + 'Sep', + 'Occ', + 'Nov', + 'Dec', + 'st', + 'nd', + 'rd', + 'th' + ), + 'local-time-relative' => array( + 'Found ', + 'm', + 'h,', + 'day', + 'days', + 'month', + 'year', + 'and ' + ), + 'date-prefixes' => array( + 'Found ', + 'Refreshed ', + 'Made hot ' + ), + 'relative-date-alt-prefixes' => array( + 'Made hot ', + 'Refreshed ', + 'Last updated ' + ), + 'relative-date-ignore-suffix' => array( + '/by.*$/' + ), + 'localdeal' => array( + 'Local', + 'Expires' + ) + ); + +} diff --git a/bridges/MydealsBridge.php b/bridges/MydealsBridge.php new file mode 100644 index 00000000..163cf62e --- /dev/null +++ b/bridges/MydealsBridge.php @@ -0,0 +1,144 @@ + array ( + 'q' => array( + 'name' => 'Stichworten', + 'type' => 'text', + 'required' => true + ), + 'hide_expired' => array( + 'name' => 'Abgelaufenes ausblenden', + 'type' => 'checkbox', + 'required' => 'true' + ), + 'hide_local' => array( + 'name' => 'Lokales ausblenden', + 'type' => 'checkbox', + 'title' => 'Deals im physischen Geschäft ausblenden', + 'required' => 'true' + ), + 'priceFrom' => array( + 'name' => 'Minimaler Preis', + 'type' => 'text', + 'title' => 'Minmaler Preis in Euros', + 'required' => 'false', + 'defaultValue' => '' + ), + 'priceTo' => array( + 'name' => 'Maximaler Preis', + 'type' => 'text', + 'title' => 'maximaler Preis in Euro', + 'required' => 'false', + 'defaultValue' => '' + ), + ), + + 'Deals pro Gruppen' => array( + 'group' => array( + 'name' => 'Gruppen', + 'type' => 'list', + 'required' => 'true', + 'title' => 'Gruppe, deren Deals angezeigt werden müssen', + 'values' => array( + 'Elektronik' => 'elektronik', + 'Handy & Smartphone' => 'smartphone', + 'Gaming' => 'gaming', + 'Software' => 'apps-software', + 'Fashion Frauen' => 'fashion-frauen', + 'Fashion Männer' => 'fashion-accessoires', + 'Beauty & Gesundheit' => 'beauty', + 'Family & Kids' => 'family-kids', + 'Essen & Trinken' => 'food', + 'Freizeit & Reisen' => 'reisen', + 'Haushalt & Garten' => 'home-living', + 'Entertainment' => 'entertainment', + 'Verträge & Finanzen' => 'vertraege-finanzen', + 'Coupons' => 'coupons', + + ) + ), + 'order' => array( + 'name' => 'sortieren nach', + 'type' => 'list', + 'required' => 'true', + 'title' => 'Sortierung der deals', + 'values' => array( + 'Vom heißesten zum kältesten Deal' => '', + 'Vom jüngsten Deal zum ältesten' => '-new', + 'Vom am meisten kommentierten Deal zum am wenigsten kommentierten Deal' => '-discussed' + ) + ) + ) + ); + + public $lang = array( + 'bridge-uri' => SELF::URI, + 'bridge-name' => SELF::NAME, + 'context-keyword' => 'Suche nach Stichworten', + 'context-group' => 'Deals pro Gruppen', + 'uri-group' => '/gruppe/', + 'request-error' => 'Could not request mydeals', + 'no-results' => 'Ups, wir konnten keine Deals zu', + 'relative-date-indicator' => array( + 'vor', + 'seit' + ), + 'price' => 'Preis', + 'shipping' => 'Versand', + 'origin' => 'Ursprung', + 'discount' => 'Rabatte', + 'title-keyword' => 'Suche', + 'title-group' => 'Gruppe', + 'local-months' => array( + 'Jan', + 'Feb', + 'Mär', + 'Apr', + 'Mai', + 'Jun', + 'Jul', + 'Aug', + 'Sep', + 'Okt', + 'Nov', + 'Dez', + '.' + ), + 'local-time-relative' => array( + 'eingestellt vor ', + 'm', + 'h,', + 'day', + 'days', + 'month', + 'year', + 'and ' + ), + 'date-prefixes' => array( + 'eingestellt am ', + 'lokal ', + 'aktualisiert ', + ), + 'relative-date-alt-prefixes' => array( + 'aktualisiert vor ', + 'kommentiert vor ', + 'heiß seit ' + ), + 'relative-date-ignore-suffix' => array( + '/von.*$/' + ), + 'localdeal' => array( + 'Lokal ', + 'Läuft bis ' + ) + ); + +}