From 460fe68f64f9e17ad9c95eeecc2c8dc50cced8d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= Date: Sat, 10 Aug 2024 17:17:57 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=AE=E9=A2=98=E5=AE=A1=E6=89=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app_common/__init__.py | 7 + app_common/__manifest__.py | 99 + app_common/controllers/__init__.py | 3 + app_common/controllers/main.py | 60 + app_common/hooks.py | 32 + app_common/i18n/zh_CN.po | 29 + app_common/lib/ua_parser/__init__.py | 1 + app_common/lib/ua_parser/_regexes.py | 7406 +++++++++++++++++ app_common/lib/ua_parser/user_agent_parser.py | 544 ++ .../lib/ua_parser/user_agent_parser_test.py | 290 + app_common/lib/user_agents/__init__.py | 3 + app_common/lib/user_agents/compat.py | 14 + app_common/lib/user_agents/parsers.py | 268 + app_common/lib/user_agents/tests.py | 268 + app_common/models/__init__.py | 37 + app_common/models/app_import.py | 54 + app_common/models/base.py | 242 + app_common/models/ir_cron.py | 15 + app_common/models/ir_http.py | 17 + app_common/models/ir_mail_server.py | 30 + app_common/models/ir_ui_view.py | 42 + app_common/models/mail_mail.py | 24 + app_common/models/res_partner.py | 16 + app_common/models/res_users.py | 10 + app_common/report/__init__.py | 2 + app_common/rng/common.rng | 428 + app_common/rng/search_view.rng | 45 + app_common/rng/tree_view.rng | 113 + app_common/static/description/banner.png | Bin 0 -> 34527 bytes app_common/static/description/banner1.png | Bin 0 -> 205199 bytes app_common/static/description/icon.png | Bin 0 -> 71282 bytes app_common/static/description/index.html | 121 + app_common/static/img/icon_sunpop.png | Bin 0 -> 28105 bytes app_common/static/img/logo_sunpop.png | Bin 0 -> 30835 bytes app_common/static/src/js/sunpop.cn | 0 app_common/static/src/xml/sunpop.cn | 0 app_common/views/ir_cron_views.xml | 13 + app_common/wizard/sunpop.cn | 0 38 files changed, 10233 insertions(+) create mode 100644 app_common/__init__.py create mode 100644 app_common/__manifest__.py create mode 100644 app_common/controllers/__init__.py create mode 100644 app_common/controllers/main.py create mode 100644 app_common/hooks.py create mode 100644 app_common/i18n/zh_CN.po create mode 100644 app_common/lib/ua_parser/__init__.py create mode 100644 app_common/lib/ua_parser/_regexes.py create mode 100644 app_common/lib/ua_parser/user_agent_parser.py create mode 100644 app_common/lib/ua_parser/user_agent_parser_test.py create mode 100644 app_common/lib/user_agents/__init__.py create mode 100644 app_common/lib/user_agents/compat.py create mode 100644 app_common/lib/user_agents/parsers.py create mode 100644 app_common/lib/user_agents/tests.py create mode 100644 app_common/models/__init__.py create mode 100644 app_common/models/app_import.py create mode 100644 app_common/models/base.py create mode 100644 app_common/models/ir_cron.py create mode 100644 app_common/models/ir_http.py create mode 100644 app_common/models/ir_mail_server.py create mode 100644 app_common/models/ir_ui_view.py create mode 100644 app_common/models/mail_mail.py create mode 100644 app_common/models/res_partner.py create mode 100644 app_common/models/res_users.py create mode 100644 app_common/report/__init__.py create mode 100644 app_common/rng/common.rng create mode 100644 app_common/rng/search_view.rng create mode 100644 app_common/rng/tree_view.rng create mode 100644 app_common/static/description/banner.png create mode 100644 app_common/static/description/banner1.png create mode 100644 app_common/static/description/icon.png create mode 100644 app_common/static/description/index.html create mode 100644 app_common/static/img/icon_sunpop.png create mode 100644 app_common/static/img/logo_sunpop.png create mode 100644 app_common/static/src/js/sunpop.cn create mode 100644 app_common/static/src/xml/sunpop.cn create mode 100644 app_common/views/ir_cron_views.xml create mode 100644 app_common/wizard/sunpop.cn diff --git a/app_common/__init__.py b/app_common/__init__.py new file mode 100644 index 000000000..7f49029b1 --- /dev/null +++ b/app_common/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- + +from . import controllers +from . import models +from .hooks import pre_init_hook +from .hooks import post_init_hook +from .hooks import uninstall_hook diff --git a/app_common/__manifest__.py b/app_common/__manifest__.py new file mode 100644 index 000000000..632ff4a7a --- /dev/null +++ b/app_common/__manifest__.py @@ -0,0 +1,99 @@ +# -*- coding: utf-8 -*- + +# Created on 2023-02-02 +# author: 欧度智能,https://www.odooai.cn +# email: 300883@qq.com +# resource of odooai +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +# Odoo16在线用户手册(长期更新) +# https://www.odooai.cn/documentation/16.0/zh_CN/index.html + +# Odoo16在线开发者手册(长期更新) +# https://www.odooai.cn/documentation/16.0/zh_CN/developer.html + +# Odoo13在线用户手册(长期更新) +# https://www.odooai.cn/documentation/user/13.0/zh_CN/index.html + +# Odoo13在线开发者手册(长期更新) +# https://www.odooai.cn/documentation/13.0/index.html + +# Odoo10在线中文用户手册(长期更新) +# https://www.odooai.cn/documentation/user/10.0/zh_CN/index.html + +# Odoo10离线中文用户手册下载 +# https://www.odooai.cn/odoo10_user_manual_document_offline/ +# Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) +# https://www.odooai.cn/odoo10_developer_document_offline/ + +############################################################################## +# Copyright (C) 2009-TODAY odooai.cn Ltd. https://www.odooai.cn +# Author: Ivan Deng,300883@qq.com +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# See . +# +# It is forbidden to publish, distribute, sublicense, or sell copies +# of the Software or modified copies of the Software. +############################################################################## + +{ + 'name': "odooAi Common Util and Tools", + 'version': '24.04.29', + 'author': 'odooai.cn', + 'category': 'Base', + 'website': 'https://www.odooai.cn', + 'live_test_url': 'https://demo.odooapp.cn', + 'license': 'LGPL-3', + 'sequence': 2, + 'price': 0.00, + 'currency': 'EUR', + 'images': ['static/description/banner.png'], + 'summary': ''' + Core for common use for odooai.cn apps. + 基础核心,必须没有要被依赖字段及视图等,实现auto_install + ''', + 'description': ''' + need to setup odoo.conf, add follow: + server_wide_modules = web,app_common + 1. Quick import data from excel with .py code + 2. Quick m2o default value + 3. Filter for useless field + 4. UTC local timezone convert + 5. Get browser ua, user-agent + 6. Image to local, image url to local, media to local attachment + 7. Log cron job + 8. Boost for less no use mail + 9. Customize .rng file + 10. Misc like get distance between two points + 11. Multi-language Support. Multi-Company Support. + 12. Support Odoo 17,16,15,14,13,12, Enterprise and Community and odoo.sh Edition. + 13. Full Open Source. + ========== + 1. + 2. + 3. 多语言支持 + 4. 多公司支持 + 5. Odoo 16, 企业版,社区版,多版本支持 + ''', + 'depends': [ + 'mail', + 'web', + ], + 'data': [ + 'views/ir_cron_views.xml', + # 'report/.xml', + ], + 'qweb': [ + 'static/src/xml/*.xml', + ], + 'demo': [], + # 'pre_init_hook': 'pre_init_hook', + # 'post_init_hook': 'post_init_hook', + # 'uninstall_hook': 'uninstall_hook', + # 可以不需要,因为直接放 common中了 + # 'external_dependencies': {'python': ['pyyaml', 'ua-parser', 'user-agents']}, + 'installable': True, + 'application': True, + 'auto_install': True, +} diff --git a/app_common/controllers/__init__.py b/app_common/controllers/__init__.py new file mode 100644 index 000000000..6920e2020 --- /dev/null +++ b/app_common/controllers/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import main \ No newline at end of file diff --git a/app_common/controllers/main.py b/app_common/controllers/main.py new file mode 100644 index 000000000..2e7e21f4e --- /dev/null +++ b/app_common/controllers/main.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- + +import base64 +from io import BytesIO +import requests +from math import radians, cos, sin, asin, sqrt + +from ..lib.user_agents import parse +from ..models.base import get_ua_type + + +from odoo import api, http, SUPERUSER_ID, _ +from odoo import http, exceptions +from odoo.http import request + +import logging +_logger = logging.getLogger(__name__) + +class AppController(http.Controller): + + def get_image_from_url(self, url): + if not url: + return None + try: + response = requests.get(url) # 将这个图片保存在内存 + except Exception as e: + return None + # 返回这个图片的base64编码 + return base64.b64encode(BytesIO(response.content).read()) + + @http.route(['/my/ua', '/wxa/ua', '/web/ua', '/web/ua/show'], auth='public', methods=['GET']) + def app_ua_show(self): + # https://github.com/selwin/python-user-agents + ua_string = request.httprequest.headers.get('User-Agent') + user_agent = parse(ua_string) + ua_type = get_ua_type() + ustr = "Request UA:
%s
Parse UA:
%s
UA Type:
%s
" % (ua_string, str(user_agent), ua_type) + return request.make_response(ustr, [('Content-Type', 'text/html')]) + + def get_ua_type(self): + return get_ua_type() + +def haversine(lon1, lat1, lon2, lat2): + # 计算地图上两点的距离 + # in:经度1,纬度1,经度2,纬度2 (十进制度数) + # out: 距离(米) + """ + Calculate the great circle distance between two points + on the earth (specified in decimal degrees) + """ + # 将十进制度数转化为弧度 + lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2]) + + # haversine公式 + dlon = lon2 - lon1 + dlat = lat2 - lat1 + a = sin(dlat / 2) ** 2 + cos(lat1) * cos(lat2) * sin(dlon / 2) ** 2 + c = 2 * asin(sqrt(a)) + r = 6371 # 地球平均半径,单位为公里 + return c * r * 1000 diff --git a/app_common/hooks.py b/app_common/hooks.py new file mode 100644 index 000000000..bd41b59eb --- /dev/null +++ b/app_common/hooks.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- + +# Created on 2018-10-12 +# author: 欧度智能,https://www.odooai.cn +# email: 300883@qq.com +# resource of odooai +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +# Odoo在线中文用户手册(长期更新) +# https://www.odooai.cn/documentation/user/10.0/zh_CN/index.html + +# Odoo10离线中文用户手册下载 +# https://www.odooai.cn/odoo10_user_manual_document_offline/ +# Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) +# https://www.odooai.cn/odoo10_developer_document_offline/ +# description: + +from odoo import api, SUPERUSER_ID, _ + + +def pre_init_hook(env): + pass + # cr.execute("") + +def post_init_hook(env): + pass + # cr.execute("") + +def uninstall_hook(env): + pass + # cr.execute("") + diff --git a/app_common/i18n/zh_CN.po b/app_common/i18n/zh_CN.po new file mode 100644 index 000000000..9552e39ea --- /dev/null +++ b/app_common/i18n/zh_CN.po @@ -0,0 +1,29 @@ +# Translation of Odoo Server. +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-01-08 14:28+0000\n" +"PO-Revision-Date: 2018-01-08 14:28+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: app_common +#: model:ir.model.fields,field_description:app_common.field_ir_cron__trigger_user_id +msgid "Last Trigger User" +msgstr "手动运行用户" + +#. module: app_common +#: model:ir.model,name:app_common.model_ir_cron +msgid "Scheduled Actions" +msgstr "安排的动作" + +#. module: app_common +#: model:ir.model,name:app_common.model_ir_ui_view +msgid "View" +msgstr "查看" diff --git a/app_common/lib/ua_parser/__init__.py b/app_common/lib/ua_parser/__init__.py new file mode 100644 index 000000000..ca04bbe69 --- /dev/null +++ b/app_common/lib/ua_parser/__init__.py @@ -0,0 +1 @@ +VERSION = (0, 10, 0) diff --git a/app_common/lib/ua_parser/_regexes.py b/app_common/lib/ua_parser/_regexes.py new file mode 100644 index 000000000..2e626e168 --- /dev/null +++ b/app_common/lib/ua_parser/_regexes.py @@ -0,0 +1,7406 @@ +# -*- coding: utf-8 -*- +############################################ +# NOTICE: This file is autogenerated from # +# regexes.yaml. Do not edit by hand, # +# instead, re-run `setup.py build_regexes` # +############################################ + +from __future__ import absolute_import, unicode_literals +from .user_agent_parser import ( + UserAgentParser, DeviceParser, OSParser, +) + +__all__ = ( + 'USER_AGENT_PARSERS', 'DEVICE_PARSERS', 'OS_PARSERS', +) + +USER_AGENT_PARSERS = [ + UserAgentParser( + '^(Luminary)[Stage]+/(\\d+) CFNetwork', + None, + None, + None, + ), + UserAgentParser( + '(ESPN)[%20| ]+Radio/(\\d+)\\.(\\d+)\\.(\\d+) CFNetwork', + None, + None, + None, + ), + UserAgentParser( + '(Antenna)/(\\d+) CFNetwork', + 'AntennaPod', + None, + None, + ), + UserAgentParser( + '(TopPodcasts)Pro/(\\d+) CFNetwork', + None, + None, + None, + ), + UserAgentParser( + '(MusicDownloader)Lite/(\\d+)\\.(\\d+)\\.(\\d+) CFNetwork', + None, + None, + None, + ), + UserAgentParser( + '^(.*)-iPad\\/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|) CFNetwork', + None, + None, + None, + ), + UserAgentParser( + '^(.*)-iPhone/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|) CFNetwork', + None, + None, + None, + ), + UserAgentParser( + '^(.*)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|) CFNetwork', + None, + None, + None, + ), + UserAgentParser( + '^(Luminary)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(espn\\.go)', + 'ESPN', + None, + None, + ), + UserAgentParser( + '(espnradio\\.com)', + 'ESPN', + None, + None, + ), + UserAgentParser( + 'ESPN APP$', + 'ESPN', + None, + None, + ), + UserAgentParser( + '(audioboom\\.com)', + 'AudioBoom', + None, + None, + ), + UserAgentParser( + ' (Rivo) RHYTHM', + None, + None, + None, + ), + UserAgentParser( + '(CFNetwork)(?:/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)|)', + 'CFNetwork', + None, + None, + ), + UserAgentParser( + '(Pingdom\\.com_bot_version_)(\\d+)\\.(\\d+)', + 'PingdomBot', + None, + None, + ), + UserAgentParser( + '(PingdomTMS)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'PingdomBot', + None, + None, + ), + UserAgentParser( + ' (PTST)/(\\d+)(?:\\.(\\d+)|)$', + 'WebPageTest.org bot', + None, + None, + ), + UserAgentParser( + 'X11; (Datanyze); Linux', + None, + None, + None, + ), + UserAgentParser( + '(NewRelicPinger)/(\\d+)\\.(\\d+)', + 'NewRelicPingerBot', + None, + None, + ), + UserAgentParser( + '(Tableau)/(\\d+)\\.(\\d+)', + 'Tableau', + None, + None, + ), + UserAgentParser( + 'AppleWebKit/\\d+\\.\\d+.* Safari.* (CreativeCloud)/(\\d+)\\.(\\d+).(\\d+)', + 'Adobe CreativeCloud', + None, + None, + ), + UserAgentParser( + '(Salesforce)(?:.)\\/(\\d+)\\.(\\d?)', + None, + None, + None, + ), + UserAgentParser( + '(\\(StatusCake\\))', + 'StatusCakeBot', + None, + None, + ), + UserAgentParser( + '(facebookexternalhit)/(\\d+)\\.(\\d+)', + 'FacebookBot', + None, + None, + ), + UserAgentParser( + 'Google.*/\\+/web/snippet', + 'GooglePlusBot', + None, + None, + ), + UserAgentParser( + 'via ggpht\\.com GoogleImageProxy', + 'GmailImageProxy', + None, + None, + ), + UserAgentParser( + 'YahooMailProxy; https://help\\.yahoo\\.com/kb/yahoo-mail-proxy-SLN28749\\.html', + 'YahooMailProxy', + None, + None, + ), + UserAgentParser( + '(Twitterbot)/(\\d+)\\.(\\d+)', + 'Twitterbot', + None, + None, + ), + UserAgentParser( + '/((?:Ant-|)Nutch|[A-z]+[Bb]ot|[A-z]+[Ss]pider|Axtaris|fetchurl|Isara|ShopSalad|Tailsweep)[ \\-](\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '\\b(008|Altresium|Argus|BaiduMobaider|BoardReader|DNSGroup|DataparkSearch|EDI|Goodzer|Grub|INGRID|Infohelfer|LinkedInBot|LOOQ|Nutch|OgScrper|PathDefender|Peew|PostPost|Steeler|Twitterbot|VSE|WebCrunch|WebZIP|Y!J-BR[A-Z]|YahooSeeker|envolk|sproose|wminer)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(MSIE) (\\d+)\\.(\\d+)([a-z]\\d|[a-z]|);.* MSIECrawler', + 'MSIECrawler', + None, + None, + ), + UserAgentParser( + '(DAVdroid)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(Google-HTTP-Java-Client|Apache-HttpClient|Go-http-client|scalaj-http|http%20client|Python-urllib|HttpMonitor|TLSProber|WinHTTP|JNLP|okhttp|aihttp|reqwest|axios|unirest-(?:java|python|ruby|nodejs|php|net))(?:[ /](\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)', + None, + None, + None, + ), + UserAgentParser( + '(Pinterest(?:bot|))/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)[;\\s(]+\\+https://www.pinterest.com/bot.html', + 'Pinterestbot', + None, + None, + ), + UserAgentParser( + '(CSimpleSpider|Cityreview Robot|CrawlDaddy|CrawlFire|Finderbots|Index crawler|Job Roboter|KiwiStatus Spider|Lijit Crawler|QuerySeekerSpider|ScollSpider|Trends Crawler|USyd-NLP-Spider|SiteCat Webbot|BotName\\/\\$BotVersion|123metaspider-Bot|1470\\.net crawler|50\\.nu|8bo Crawler Bot|Aboundex|Accoona-[A-z]{1,30}-Agent|AdsBot-Google(?:-[a-z]{1,30}|)|altavista|AppEngine-Google|archive.{0,30}\\.org_bot|archiver|Ask Jeeves|[Bb]ai[Dd]u[Ss]pider(?:-[A-Za-z]{1,30})(?:-[A-Za-z]{1,30}|)|bingbot|BingPreview|blitzbot|BlogBridge|Bloglovin|BoardReader Blog Indexer|BoardReader Favicon Fetcher|boitho.com-dc|BotSeer|BUbiNG|\\b\\w{0,30}favicon\\w{0,30}\\b|\\bYeti(?:-[a-z]{1,30}|)|Catchpoint(?: bot|)|[Cc]harlotte|Checklinks|clumboot|Comodo HTTP\\(S\\) Crawler|Comodo-Webinspector-Crawler|ConveraCrawler|CRAWL-E|CrawlConvera|Daumoa(?:-feedfetcher|)|Feed Seeker Bot|Feedbin|findlinks|Flamingo_SearchEngine|FollowSite Bot|furlbot|Genieo|gigabot|GomezAgent|gonzo1|(?:[a-zA-Z]{1,30}-|)Googlebot(?:-[a-zA-Z]{1,30}|)|Google SketchUp|grub-client|gsa-crawler|heritrix|HiddenMarket|holmes|HooWWWer|htdig|ia_archiver|ICC-Crawler|Icarus6j|ichiro(?:/mobile|)|IconSurf|IlTrovatore(?:-Setaccio|)|InfuzApp|Innovazion Crawler|InternetArchive|IP2[a-z]{1,30}Bot|jbot\\b|KaloogaBot|Kraken|Kurzor|larbin|LEIA|LesnikBot|Linguee Bot|LinkAider|LinkedInBot|Lite Bot|Llaut|lycos|Mail\\.RU_Bot|masscan|masidani_bot|Mediapartners-Google|Microsoft .{0,30} Bot|mogimogi|mozDex|MJ12bot|msnbot(?:-media {0,2}|)|msrbot|Mtps Feed Aggregation System|netresearch|Netvibes|NewsGator[^/]{0,30}|^NING|Nutch[^/]{0,30}|Nymesis|ObjectsSearch|OgScrper|Orbiter|OOZBOT|PagePeeker|PagesInventory|PaxleFramework|Peeplo Screenshot Bot|PlantyNet_WebRobot|Pompos|Qwantify|Read%20Later|Reaper|RedCarpet|Retreiver|Riddler|Rival IQ|scooter|Scrapy|Scrubby|searchsight|seekbot|semanticdiscovery|SemrushBot|Simpy|SimplePie|SEOstats|SimpleRSS|SiteCon|Slackbot-LinkExpanding|Slack-ImgProxy|Slurp|snappy|Speedy Spider|Squrl Java|Stringer|TheUsefulbot|ThumbShotsBot|Thumbshots\\.ru|Tiny Tiny RSS|Twitterbot|WhatsApp|URL2PNG|Vagabondo|VoilaBot|^vortex|Votay bot|^voyager|WASALive.Bot|Web-sniffer|WebThumb|WeSEE:[A-z]{1,30}|WhatWeb|WIRE|WordPress|Wotbox|www\\.almaden\\.ibm\\.com|Xenu(?:.s|) Link Sleuth|Xerka [A-z]{1,30}Bot|yacy(?:bot|)|YahooSeeker|Yahoo! Slurp|Yandex\\w{1,30}|YodaoBot(?:-[A-z]{1,30}|)|YottaaMonitor|Yowedo|^Zao|^Zao-Crawler|ZeBot_www\\.ze\\.bz|ZooShot|ZyBorg)(?:[ /]v?(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)|)', + None, + None, + None, + ), + UserAgentParser( + '\\b(Boto3?|JetS3t|aws-(?:cli|sdk-(?:cpp|go|java|nodejs|ruby2?|dotnet-(?:\\d{1,2}|core)))|s3fs)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '\\[(FBAN/MessengerForiOS|FB_IAB/MESSENGER);FBAV/(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)', + 'Facebook Messenger', + None, + None, + ), + UserAgentParser( + '\\[FB.*;(FBAV)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)', + 'Facebook', + None, + None, + ), + UserAgentParser( + '\\[FB.*;', + 'Facebook', + None, + None, + ), + UserAgentParser( + '(?:\\/[A-Za-z0-9\\.]+|) {0,5}([A-Za-z0-9 \\-_\\!\\[\\]:]{0,50}(?:[Aa]rchiver|[Ii]ndexer|[Ss]craper|[Bb]ot|[Ss]pider|[Cc]rawl[a-z]{0,50}))[/ ](\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)', + None, + None, + None, + ), + UserAgentParser( + '((?:[A-Za-z][A-Za-z0-9 -]{0,50}|)[^C][^Uu][Bb]ot)\\b(?:(?:[ /]| v)(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)', + None, + None, + None, + ), + UserAgentParser( + '((?:[A-z0-9]{1,50}|[A-z\\-]{1,50} ?|)(?: the |)(?:[Ss][Pp][Ii][Dd][Ee][Rr]|[Ss]crape|[Cc][Rr][Aa][Ww][Ll])[A-z0-9]{0,50})(?:(?:[ /]| v)(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)', + None, + None, + None, + ), + UserAgentParser( + '(HbbTV)/(\\d+)\\.(\\d+)\\.(\\d+) \\(', + None, + None, + None, + ), + UserAgentParser( + '(Chimera|SeaMonkey|Camino|Waterfox)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+[a-z]*|)', + None, + None, + None, + ), + UserAgentParser( + '(SailfishBrowser)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'Sailfish Browser', + None, + None, + ), + UserAgentParser( + '\\[(Pinterest)/[^\\]]+\\]', + None, + None, + None, + ), + UserAgentParser( + '(Pinterest)(?: for Android(?: Tablet|)|)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + 'Mozilla.*Mobile.*(Instagram).(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + 'Mozilla.*Mobile.*(Flipboard).(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + 'Mozilla.*Mobile.*(Flipboard-Briefing).(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + 'Mozilla.*Mobile.*(Onefootball)\\/Android.(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Snapchat)\\/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Twitter for (?:iPhone|iPad)|TwitterAndroid)(?:\\/(\\d+)\\.(\\d+)|)', + 'Twitter', + None, + None, + ), + UserAgentParser( + '(Firefox)/(\\d+)\\.(\\d+) Basilisk/(\\d+)', + 'Basilisk', + None, + None, + ), + UserAgentParser( + '(PaleMoon)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'Pale Moon', + None, + None, + ), + UserAgentParser( + '(Fennec)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+[a-z]*)', + 'Firefox Mobile', + None, + None, + ), + UserAgentParser( + '(Fennec)/(\\d+)\\.(\\d+)(pre)', + 'Firefox Mobile', + None, + None, + ), + UserAgentParser( + '(Fennec)/(\\d+)\\.(\\d+)', + 'Firefox Mobile', + None, + None, + ), + UserAgentParser( + '(?:Mobile|Tablet);.*(Firefox)/(\\d+)\\.(\\d+)', + 'Firefox Mobile', + None, + None, + ), + UserAgentParser( + '(Namoroka|Shiretoko|Minefield)/(\\d+)\\.(\\d+)\\.(\\d+(?:pre|))', + 'Firefox ($1)', + None, + None, + ), + UserAgentParser( + '(Firefox)/(\\d+)\\.(\\d+)(a\\d+[a-z]*)', + 'Firefox Alpha', + None, + None, + ), + UserAgentParser( + '(Firefox)/(\\d+)\\.(\\d+)(b\\d+[a-z]*)', + 'Firefox Beta', + None, + None, + ), + UserAgentParser( + '(Firefox)-(?:\\d+\\.\\d+|)/(\\d+)\\.(\\d+)(a\\d+[a-z]*)', + 'Firefox Alpha', + None, + None, + ), + UserAgentParser( + '(Firefox)-(?:\\d+\\.\\d+|)/(\\d+)\\.(\\d+)(b\\d+[a-z]*)', + 'Firefox Beta', + None, + None, + ), + UserAgentParser( + '(Namoroka|Shiretoko|Minefield)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*|)', + 'Firefox ($1)', + None, + None, + ), + UserAgentParser( + '(Firefox).*Tablet browser (\\d+)\\.(\\d+)\\.(\\d+)', + 'MicroB', + None, + None, + ), + UserAgentParser( + '(MozillaDeveloperPreview)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*|)', + None, + None, + None, + ), + UserAgentParser( + '(FxiOS)/(\\d+)\\.(\\d+)(\\.(\\d+)|)(\\.(\\d+)|)', + 'Firefox iOS', + None, + None, + ), + UserAgentParser( + '(Flock)/(\\d+)\\.(\\d+)(b\\d+?)', + None, + None, + None, + ), + UserAgentParser( + '(RockMelt)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Navigator)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Netscape', + None, + None, + ), + UserAgentParser( + '(Navigator)/(\\d+)\\.(\\d+)([ab]\\d+)', + 'Netscape', + None, + None, + ), + UserAgentParser( + '(Netscape6)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+|)', + 'Netscape', + None, + None, + ), + UserAgentParser( + '(MyIBrow)/(\\d+)\\.(\\d+)', + 'My Internet Browser', + None, + None, + ), + UserAgentParser( + '(UC? ?Browser|UCWEB|U3)[ /]?(\\d+)\\.(\\d+)\\.(\\d+)', + 'UC Browser', + None, + None, + ), + UserAgentParser( + '(Opera Tablet).*Version/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(Opera Mini)(?:/att|)/?(\\d+|)(?:\\.(\\d+)|)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(Opera)/.+Opera Mobi.+Version/(\\d+)\\.(\\d+)', + 'Opera Mobile', + None, + None, + ), + UserAgentParser( + '(Opera)/(\\d+)\\.(\\d+).+Opera Mobi', + 'Opera Mobile', + None, + None, + ), + UserAgentParser( + 'Opera Mobi.+(Opera)(?:/|\\s+)(\\d+)\\.(\\d+)', + 'Opera Mobile', + None, + None, + ), + UserAgentParser( + 'Opera Mobi', + 'Opera Mobile', + None, + None, + ), + UserAgentParser( + '(Opera)/9.80.*Version/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(?:Mobile Safari).*(OPR)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Opera Mobile', + None, + None, + ), + UserAgentParser( + '(?:Chrome).*(OPR)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Opera', + None, + None, + ), + UserAgentParser( + '(Coast)/(\\d+).(\\d+).(\\d+)', + 'Opera Coast', + None, + None, + ), + UserAgentParser( + '(OPiOS)/(\\d+).(\\d+).(\\d+)', + 'Opera Mini', + None, + None, + ), + UserAgentParser( + 'Chrome/.+( MMS)/(\\d+).(\\d+).(\\d+)', + 'Opera Neon', + None, + None, + ), + UserAgentParser( + '(hpw|web)OS/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'webOS Browser', + None, + None, + ), + UserAgentParser( + '(luakit)', + 'LuaKit', + None, + None, + ), + UserAgentParser( + '(Snowshoe)/(\\d+)\\.(\\d+).(\\d+)', + None, + None, + None, + ), + UserAgentParser( + 'Gecko/\\d+ (Lightning)/(\\d+)\\.(\\d+)\\.?((?:[ab]?\\d+[a-z]*)|(?:\\d*))', + None, + None, + None, + ), + UserAgentParser( + '(Firefox)/(\\d+)\\.(\\d+)\\.(\\d+(?:pre|)) \\(Swiftfox\\)', + 'Swiftfox', + None, + None, + ), + UserAgentParser( + '(Firefox)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*|) \\(Swiftfox\\)', + 'Swiftfox', + None, + None, + ), + UserAgentParser( + '(rekonq)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|) Safari', + 'Rekonq', + None, + None, + ), + UserAgentParser( + 'rekonq', + 'Rekonq', + None, + None, + ), + UserAgentParser( + '(conkeror|Conkeror)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'Conkeror', + None, + None, + ), + UserAgentParser( + '(konqueror)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Konqueror', + None, + None, + ), + UserAgentParser( + '(WeTab)-Browser', + None, + None, + None, + ), + UserAgentParser( + '(Comodo_Dragon)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Comodo Dragon', + None, + None, + ), + UserAgentParser( + '(Symphony) (\\d+).(\\d+)', + None, + None, + None, + ), + UserAgentParser( + 'PLAYSTATION 3.+WebKit', + 'NetFront NX', + None, + None, + ), + UserAgentParser( + 'PLAYSTATION 3', + 'NetFront', + None, + None, + ), + UserAgentParser( + '(PlayStation Portable)', + 'NetFront', + None, + None, + ), + UserAgentParser( + '(PlayStation Vita)', + 'NetFront NX', + None, + None, + ), + UserAgentParser( + 'AppleWebKit.+ (NX)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'NetFront NX', + None, + None, + ), + UserAgentParser( + '(Nintendo 3DS)', + 'NetFront NX', + None, + None, + ), + UserAgentParser( + '(Silk)/(\\d+)\\.(\\d+)(?:\\.([0-9\\-]+)|)', + 'Amazon Silk', + None, + None, + ), + UserAgentParser( + '(Puffin)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + 'Windows Phone .*(Edge)/(\\d+)\\.(\\d+)', + 'Edge Mobile', + None, + None, + ), + UserAgentParser( + '(EdgA)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)', + 'Edge Mobile', + None, + None, + ), + UserAgentParser( + '(EdgiOS)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)', + 'Edge Mobile', + None, + None, + ), + UserAgentParser( + '(SamsungBrowser)/(\\d+)\\.(\\d+)', + 'Samsung Internet', + None, + None, + ), + UserAgentParser( + '(SznProhlizec)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'Seznam prohlížeč', + None, + None, + ), + UserAgentParser( + '(coc_coc_browser)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'Coc Coc', + None, + None, + ), + UserAgentParser( + '(baidubrowser)[/\\s](\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)', + 'Baidu Browser', + None, + None, + ), + UserAgentParser( + '(FlyFlow)/(\\d+)\\.(\\d+)', + 'Baidu Explorer', + None, + None, + ), + UserAgentParser( + '(MxBrowser)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'Maxthon', + None, + None, + ), + UserAgentParser( + '(Crosswalk)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Line)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'LINE', + None, + None, + ), + UserAgentParser( + '(MiuiBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'MiuiBrowser', + None, + None, + ), + UserAgentParser( + '(Mint Browser)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Mint Browser', + None, + None, + ), + UserAgentParser( + '(TopBuzz)/(\\d+).(\\d+).(\\d+)', + 'TopBuzz', + None, + None, + ), + UserAgentParser( + 'Mozilla.+Android.+(GSA)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Google', + None, + None, + ), + UserAgentParser( + '(MQQBrowser/Mini)(?:(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)', + 'QQ Browser Mini', + None, + None, + ), + UserAgentParser( + '(MQQBrowser)(?:/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)', + 'QQ Browser Mobile', + None, + None, + ), + UserAgentParser( + '(QQBrowser)(?:/(\\d+)(?:\\.(\\d+)\\.(\\d+)(?:\\.(\\d+)|)|)|)', + 'QQ Browser', + None, + None, + ), + UserAgentParser( + 'Version/.+(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)', + 'Chrome Mobile WebView', + None, + None, + ), + UserAgentParser( + '; wv\\).+(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)', + 'Chrome Mobile WebView', + None, + None, + ), + UserAgentParser( + '(CrMo)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)', + 'Chrome Mobile', + None, + None, + ), + UserAgentParser( + '(CriOS)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)', + 'Chrome Mobile iOS', + None, + None, + ), + UserAgentParser( + '(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+) Mobile(?:[ /]|$)', + 'Chrome Mobile', + None, + None, + ), + UserAgentParser( + ' Mobile .*(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)', + 'Chrome Mobile', + None, + None, + ), + UserAgentParser( + '(chromeframe)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Chrome Frame', + None, + None, + ), + UserAgentParser( + '(SLP Browser)/(\\d+)\\.(\\d+)', + 'Tizen Browser', + None, + None, + ), + UserAgentParser( + '(SE 2\\.X) MetaSr (\\d+)\\.(\\d+)', + 'Sogou Explorer', + None, + None, + ), + UserAgentParser( + '(Rackspace Monitoring)/(\\d+)\\.(\\d+)', + 'RackspaceBot', + None, + None, + ), + UserAgentParser( + '(PyAMF)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(YaBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Yandex Browser', + None, + None, + ), + UserAgentParser( + '(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+).* MRCHROME', + 'Mail.ru Chromium Browser', + None, + None, + ), + UserAgentParser( + '(AOL) (\\d+)\\.(\\d+); AOLBuild (\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(PodCruncher|Downcast)[ /]?(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + ' (BoxNotes)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Whale)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+) Mobile(?:[ /]|$)', + 'Whale', + None, + None, + ), + UserAgentParser( + '(Whale)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Whale', + None, + None, + ), + UserAgentParser( + '(1Password)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Ghost)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Slack_SSB)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Slack Desktop Client', + None, + None, + ), + UserAgentParser( + '(HipChat)/?(\\d+|)', + 'HipChat Desktop Client', + None, + None, + ), + UserAgentParser( + '\\b(MobileIron|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Epiphany|Shiira|Sunrise|Spotify|Flock|Netscape|Lunascape|WebPilot|NetFront|Netfront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|Opera Mini|iCab|NetNewsWire|ThunderBrowse|Iris|UP\\.Browser|Bunjalloo|Google Earth|Raven for Mac|Openwave|MacOutlook|Electron|OktaMobile)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + 'Microsoft Office Outlook 12\\.\\d+\\.\\d+|MSOffice 12', + 'Outlook', + '2007', + None, + ), + UserAgentParser( + 'Microsoft Outlook 14\\.\\d+\\.\\d+|MSOffice 14', + 'Outlook', + '2010', + None, + ), + UserAgentParser( + 'Microsoft Outlook 15\\.\\d+\\.\\d+', + 'Outlook', + '2013', + None, + ), + UserAgentParser( + 'Microsoft Outlook (?:Mail )?16\\.\\d+\\.\\d+|MSOffice 16', + 'Outlook', + '2016', + None, + ), + UserAgentParser( + 'Microsoft Office (Word) 2014', + None, + None, + None, + ), + UserAgentParser( + 'Outlook-Express\\/7\\.0.*', + 'Windows Live Mail', + None, + None, + ), + UserAgentParser( + '(Airmail) (\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(Thunderbird)/(\\d+)\\.(\\d+)(?:\\.(\\d+(?:pre|))|)', + 'Thunderbird', + None, + None, + ), + UserAgentParser( + '(Postbox)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Postbox', + None, + None, + ), + UserAgentParser( + '(Barca(?:Pro)?)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'Barca', + None, + None, + ), + UserAgentParser( + '(Lotus-Notes)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'Lotus Notes', + None, + None, + ), + UserAgentParser( + 'Superhuman', + 'Superhuman', + None, + None, + ), + UserAgentParser( + '(Vivaldi)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Edge?)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)(?:\\.(\\d+)|)', + 'Edge', + None, + None, + ), + UserAgentParser( + '(brave)/(\\d+)\\.(\\d+)\\.(\\d+) Chrome', + 'Brave', + None, + None, + ), + UserAgentParser( + '(Chrome)/(\\d+)\\.(\\d+)\\.(\\d+)[\\d.]* Iron[^/]', + 'Iron', + None, + None, + ), + UserAgentParser( + '\\b(Dolphin)(?: |HDCN/|/INT\\-)(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(HeadlessChrome)(?:/(\\d+)\\.(\\d+)\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(Evolution)/(\\d+)\\.(\\d+)\\.(\\d+\\.\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(RCM CardDAV plugin)/(\\d+)\\.(\\d+)\\.(\\d+(?:-dev|))', + None, + None, + None, + ), + UserAgentParser( + '(bingbot|Bolt|AdobeAIR|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|NetFront|Netfront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|iTunes|MacAppStore|NetNewsWire|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen Browser|Polaris|Abrowser|Planetweb|ICE Browser|mDolphin|qutebrowser|Otter|QupZilla|MailBar|kmail2|YahooMobileMail|ExchangeWebServices|ExchangeServicesClient|Dragon|Outlook-iOS-Android)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(Chromium|Chrome)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(IEMobile)[ /](\\d+)\\.(\\d+)', + 'IE Mobile', + None, + None, + ), + UserAgentParser( + '(BacaBerita App)\\/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '^(bPod|Pocket Casts|Player FM)$', + None, + None, + None, + ), + UserAgentParser( + '^(AlexaMediaPlayer|VLC)/(\\d+)\\.(\\d+)\\.([^.\\s]+)', + None, + None, + None, + ), + UserAgentParser( + '^(AntennaPod|WMPlayer|Zune|Podkicker|Radio|ExoPlayerDemo|Overcast|PocketTunes|NSPlayer|okhttp|DoggCatcher|QuickNews|QuickTime|Peapod|Podcasts|GoldenPod|VLC|Spotify|Miro|MediaGo|Juice|iPodder|gPodder|Banshee)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '^(Peapod|Liferea)/([^.\\s]+)\\.([^.\\s]+|)\\.?([^.\\s]+|)', + None, + None, + None, + ), + UserAgentParser( + '^(bPod|Player FM) BMID/(\\S+)', + None, + None, + None, + ), + UserAgentParser( + '^(Podcast ?Addict)/v(\\d+) ', + None, + None, + None, + ), + UserAgentParser( + '^(Podcast ?Addict) ', + 'PodcastAddict', + None, + None, + ), + UserAgentParser( + '(Replay) AV', + None, + None, + None, + ), + UserAgentParser( + '(VOX) Music Player', + None, + None, + None, + ), + UserAgentParser( + '(CITA) RSS Aggregator/(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Pocket Casts)$', + None, + None, + None, + ), + UserAgentParser( + '(Player FM)$', + None, + None, + None, + ), + UserAgentParser( + '(LG Player|Doppler|FancyMusic|MediaMonkey|Clementine) (\\d+)\\.(\\d+)\\.?([^.\\s]+|)\\.?([^.\\s]+|)', + None, + None, + None, + ), + UserAgentParser( + '(philpodder)/(\\d+)\\.(\\d+)\\.?([^.\\s]+|)\\.?([^.\\s]+|)', + None, + None, + None, + ), + UserAgentParser( + '(Player FM|Pocket Casts|DoggCatcher|Spotify|MediaMonkey|MediaGo|BashPodder)', + None, + None, + None, + ), + UserAgentParser( + '(QuickTime)\\.(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Kinoma)(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Fancy) Cloud Music (\\d+)\\.(\\d+)', + 'FancyMusic', + None, + None, + ), + UserAgentParser( + 'EspnDownloadManager', + 'ESPN', + None, + None, + ), + UserAgentParser( + '(ESPN) Radio (\\d+)\\.(\\d+)(?:\\.(\\d+)|) ?(?:rv:(\\d+)|) ', + None, + None, + None, + ), + UserAgentParser( + '(podracer|jPodder) v ?(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(ZDM)/(\\d+)\\.(\\d+)[; ]?', + None, + None, + None, + ), + UserAgentParser( + '(Zune|BeyondPod) (\\d+)(?:\\.(\\d+)|)[\\);]', + None, + None, + None, + ), + UserAgentParser( + '(WMPlayer)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '^(Lavf)', + 'WMPlayer', + None, + None, + ), + UserAgentParser( + '^(RSSRadio)[ /]?(\\d+|)', + None, + None, + None, + ), + UserAgentParser( + '(RSS_Radio) (\\d+)\\.(\\d+)', + 'RSSRadio', + None, + None, + ), + UserAgentParser( + '(Podkicker) \\S+/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Podkicker', + None, + None, + ), + UserAgentParser( + '^(HTC) Streaming Player \\S+ / \\S+ / \\S+ / (\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '^(Stitcher)/iOS', + None, + None, + None, + ), + UserAgentParser( + '^(Stitcher)/Android', + None, + None, + None, + ), + UserAgentParser( + '^(VLC) .*version (\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + ' (VLC) for', + None, + None, + None, + ), + UserAgentParser( + '(vlc)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'VLC', + None, + None, + ), + UserAgentParser( + '^(foobar)\\S+/([^.\\s]+)\\.([^.\\s]+|)\\.?([^.\\s]+|)', + None, + None, + None, + ), + UserAgentParser( + '^(Clementine)\\S+ ([^.\\s]+)\\.([^.\\s]+|)\\.?([^.\\s]+|)', + None, + None, + None, + ), + UserAgentParser( + '(amarok)/([^.\\s]+)\\.([^.\\s]+|)\\.?([^.\\s]+|)', + 'Amarok', + None, + None, + ), + UserAgentParser( + '(Custom)-Feed Reader', + None, + None, + None, + ), + UserAgentParser( + '(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(iCab|Lunascape|Opera|Android|Jasmine|Polaris|Microsoft SkyDriveSync|The Bat!) (\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(Kindle)/(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Android) Donut', + None, + '1', + '2', + ), + UserAgentParser( + '(Android) Eclair', + None, + '2', + '1', + ), + UserAgentParser( + '(Android) Froyo', + None, + '2', + '2', + ), + UserAgentParser( + '(Android) Gingerbread', + None, + '2', + '3', + ), + UserAgentParser( + '(Android) Honeycomb', + None, + '3', + None, + ), + UserAgentParser( + '(MSIE) (\\d+)\\.(\\d+).*XBLWP7', + 'IE Large Screen', + None, + None, + ), + UserAgentParser( + '(Nextcloud)', + None, + None, + None, + ), + UserAgentParser( + '(mirall)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(ownCloud-android)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Owncloud', + None, + None, + ), + UserAgentParser( + '(OC)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+) \\(Skype for Business\\)', + 'Skype', + None, + None, + ), + UserAgentParser( + '(Obigo)InternetBrowser', + None, + None, + None, + ), + UserAgentParser( + '(Obigo)\\-Browser', + None, + None, + None, + ), + UserAgentParser( + '(Obigo|OBIGO)[^\\d]*(\\d+)(?:.(\\d+)|)', + 'Obigo', + None, + None, + ), + UserAgentParser( + '(MAXTHON|Maxthon) (\\d+)\\.(\\d+)', + 'Maxthon', + None, + None, + ), + UserAgentParser( + '(Maxthon|MyIE2|Uzbl|Shiira)', + None, + '0', + None, + ), + UserAgentParser( + '(BrowseX) \\((\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(NCSA_Mosaic)/(\\d+)\\.(\\d+)', + 'NCSA Mosaic', + None, + None, + ), + UserAgentParser( + '(POLARIS)/(\\d+)\\.(\\d+)', + 'Polaris', + None, + None, + ), + UserAgentParser( + '(Embider)/(\\d+)\\.(\\d+)', + 'Polaris', + None, + None, + ), + UserAgentParser( + '(BonEcho)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+|)', + 'Bon Echo', + None, + None, + ), + UserAgentParser( + '(TopBuzz) com.alex.NewsMaster/(\\d+).(\\d+).(\\d+)', + 'TopBuzz', + None, + None, + ), + UserAgentParser( + '(TopBuzz) com.mobilesrepublic.newsrepublic/(\\d+).(\\d+).(\\d+)', + 'TopBuzz', + None, + None, + ), + UserAgentParser( + '(TopBuzz) com.topbuzz.videoen/(\\d+).(\\d+).(\\d+)', + 'TopBuzz', + None, + None, + ), + UserAgentParser( + '(iPod|iPhone|iPad).+GSA/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+)|) Mobile', + 'Google', + None, + None, + ), + UserAgentParser( + '(iPod|iPhone|iPad).+Version/(\\d+)\\.(\\d+)(?:\\.(\\d+)|).*[ +]Safari', + 'Mobile Safari', + None, + None, + ), + UserAgentParser( + '(iPod|iPod touch|iPhone|iPad);.*CPU.*OS[ +](\\d+)_(\\d+)(?:_(\\d+)|).* AppleNews\\/\\d+\\.\\d+\\.\\d+?', + 'Mobile Safari UI/WKWebView', + None, + None, + ), + UserAgentParser( + '(iPod|iPhone|iPad).+Version/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'Mobile Safari UI/WKWebView', + None, + None, + ), + UserAgentParser( + '(iPod|iPod touch|iPhone|iPad).* Safari', + 'Mobile Safari', + None, + None, + ), + UserAgentParser( + '(iPod|iPod touch|iPhone|iPad)', + 'Mobile Safari UI/WKWebView', + None, + None, + ), + UserAgentParser( + '(Watch)(\\d+),(\\d+)', + 'Apple $1 App', + None, + None, + ), + UserAgentParser( + '(Outlook-iOS)/\\d+\\.\\d+\\.prod\\.iphone \\((\\d+)\\.(\\d+)\\.(\\d+)\\)', + None, + None, + None, + ), + UserAgentParser( + '(AvantGo) (\\d+).(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(OneBrowser)/(\\d+).(\\d+)', + 'ONE Browser', + None, + None, + ), + UserAgentParser( + '(Avant)', + None, + '1', + None, + ), + UserAgentParser( + '(QtCarBrowser)', + None, + '1', + None, + ), + UserAgentParser( + '^(iBrowser/Mini)(\\d+).(\\d+)', + 'iBrowser Mini', + None, + None, + ), + UserAgentParser( + '^(iBrowser|iRAPP)/(\\d+).(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '^(Nokia)', + 'Nokia Services (WAP) Browser', + None, + None, + ), + UserAgentParser( + '(NokiaBrowser)/(\\d+)\\.(\\d+).(\\d+)\\.(\\d+)', + 'Nokia Browser', + None, + None, + ), + UserAgentParser( + '(NokiaBrowser)/(\\d+)\\.(\\d+).(\\d+)', + 'Nokia Browser', + None, + None, + ), + UserAgentParser( + '(NokiaBrowser)/(\\d+)\\.(\\d+)', + 'Nokia Browser', + None, + None, + ), + UserAgentParser( + '(BrowserNG)/(\\d+)\\.(\\d+).(\\d+)', + 'Nokia Browser', + None, + None, + ), + UserAgentParser( + '(Series60)/5\\.0', + 'Nokia Browser', + '7', + '0', + ), + UserAgentParser( + '(Series60)/(\\d+)\\.(\\d+)', + 'Nokia OSS Browser', + None, + None, + ), + UserAgentParser( + '(S40OviBrowser)/(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)', + 'Ovi Browser', + None, + None, + ), + UserAgentParser( + '(Nokia)[EN]?(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(PlayBook).+RIM Tablet OS (\\d+)\\.(\\d+)\\.(\\d+)', + 'BlackBerry WebKit', + None, + None, + ), + UserAgentParser( + '(Black[bB]erry|BB10).+Version/(\\d+)\\.(\\d+)\\.(\\d+)', + 'BlackBerry WebKit', + None, + None, + ), + UserAgentParser( + '(Black[bB]erry)\\s?(\\d+)', + 'BlackBerry', + None, + None, + ), + UserAgentParser( + '(OmniWeb)/v(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Blazer)/(\\d+)\\.(\\d+)', + 'Palm Blazer', + None, + None, + ), + UserAgentParser( + '(Pre)/(\\d+)\\.(\\d+)', + 'Palm Pre', + None, + None, + ), + UserAgentParser( + '(ELinks)/(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(ELinks) \\((\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Links) \\((\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(QtWeb) Internet Browser/(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(PhantomJS)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(AppleWebKit)/(\\d+)(?:\\.(\\d+)|)\\+ .* Safari', + 'WebKit Nightly', + None, + None, + ), + UserAgentParser( + '(Version)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|).*Safari/', + 'Safari', + None, + None, + ), + UserAgentParser( + '(Safari)/\\d+', + None, + None, + None, + ), + UserAgentParser( + '(OLPC)/Update(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(OLPC)/Update()\\.(\\d+)', + None, + '0', + None, + ), + UserAgentParser( + '(SEMC\\-Browser)/(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Teleca)', + 'Teleca Browser', + None, + None, + ), + UserAgentParser( + '(Phantom)/V(\\d+)\\.(\\d+)', + 'Phantom Browser', + None, + None, + ), + UserAgentParser( + '(Trident)/(7|8)\\.(0)', + 'IE', + '11', + None, + ), + UserAgentParser( + '(Trident)/(6)\\.(0)', + 'IE', + '10', + None, + ), + UserAgentParser( + '(Trident)/(5)\\.(0)', + 'IE', + '9', + None, + ), + UserAgentParser( + '(Trident)/(4)\\.(0)', + 'IE', + '8', + None, + ), + UserAgentParser( + '(Espial)/(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '(AppleWebKit)/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Apple Mail', + None, + None, + ), + UserAgentParser( + '(Firefox)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Firefox)/(\\d+)\\.(\\d+)(pre|[ab]\\d+[a-z]*|)', + None, + None, + None, + ), + UserAgentParser( + '([MS]?IE) (\\d+)\\.(\\d+)', + 'IE', + None, + None, + ), + UserAgentParser( + '(python-requests)/(\\d+)\\.(\\d+)', + 'Python Requests', + None, + None, + ), + UserAgentParser( + '\\b(Windows-Update-Agent|Microsoft-CryptoAPI|SophosUpdateManager|SophosAgent|Debian APT-HTTP|Ubuntu APT-HTTP|libcurl-agent|libwww-perl|urlgrabber|curl|PycURL|Wget|aria2|Axel|OpenBSD ftp|lftp|jupdate|insomnia|fetch libfetch|akka-http|got)(?:[ /](\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)|)', + None, + None, + None, + ), + UserAgentParser( + '(Python/3\\.\\d{1,3} aiohttp)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Python/3\\.\\d{1,3} aiohttp)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Java)[/ ]?\\d+\\.(\\d+)\\.(\\d+)[_-]*([a-zA-Z0-9]+|)', + None, + None, + None, + ), + UserAgentParser( + '^(Cyberduck)/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.\\d+|)', + None, + None, + None, + ), + UserAgentParser( + '^(S3 Browser) (\\d+)-(\\d+)-(\\d+)(?:\\s*http://s3browser\\.com|)', + None, + None, + None, + ), + UserAgentParser( + '(S3Gof3r)', + None, + None, + None, + ), + UserAgentParser( + '\\b(ibm-cos-sdk-(?:core|java|js|python))/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + None, + None, + None, + ), + UserAgentParser( + '^(rusoto)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '^(rclone)/v(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '^(Roku)/DVP-(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '(Kurio)\\/(\\d+)\\.(\\d+)\\.(\\d+)', + 'Kurio App', + None, + None, + ), + UserAgentParser( + '^(Box(?: Sync)?)/(\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + ), + UserAgentParser( + '^(ViaFree|Viafree)-(?:tvOS-)?[A-Z]{2}/(\\d+)\\.(\\d+)\\.(\\d+)', + 'ViaFree', + None, + None, + ), +] + +DEVICE_PARSERS = [ + DeviceParser( + '(?:(?:iPhone|Windows CE|Windows Phone|Android).*(?:(?:Bot|Yeti)-Mobile|YRSpider|BingPreview|bots?/\\d|(?:bot|spider)\\.html)|AdsBot-Google-Mobile.*iPhone)', + 'i', + 'Spider', + 'Spider', + 'Smartphone', + ), + DeviceParser( + '(?:DoCoMo|\\bMOT\\b|\\bLG\\b|Nokia|Samsung|SonyEricsson).*(?:(?:Bot|Yeti)-Mobile|bots?/\\d|(?:bot|crawler)\\.html|(?:jump|google|Wukong)bot|ichiro/mobile|/spider|YahooSeeker)', + 'i', + 'Spider', + 'Spider', + 'Feature Phone', + ), + DeviceParser( + ' PTST/\\d+(?:\\.)?\\d+$', + None, + 'Spider', + 'Spider', + None, + ), + DeviceParser( + 'X11; Datanyze; Linux', + None, + 'Spider', + 'Spider', + None, + ), + DeviceParser( + '\\bSmartWatch {0,2}\\( {0,2}([^;]+) {0,2}; {0,2}([^;]+) {0,2};', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + 'Android Application[^\\-]+ - (Sony) ?(Ericsson|) (.+) \\w+ - ', + None, + '$1 $2', + '$1$2', + '$3', + ), + DeviceParser( + 'Android Application[^\\-]+ - (?:HTC|HUAWEI|LGE|LENOVO|MEDION|TCT) (HTC|HUAWEI|LG|LENOVO|MEDION|ALCATEL)[ _\\-](.+) \\w+ - ', + 'i', + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + 'Android Application[^\\-]+ - ([^ ]+) (.+) \\w+ - ', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '; *([BLRQ]C\\d{4}[A-Z]+?)(?: Build|\\) AppleWebKit)', + None, + '3Q $1', + '3Q', + '$1', + ), + DeviceParser( + '; *(?:3Q_)([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '3Q $1', + '3Q', + '$1', + ), + DeviceParser( + 'Android [34].*; *(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700(?: Lite| 3G|)|A701|B1-A71|A1-\\d{3}|B1-\\d{3}|V360|V370|W500|W500P|W501|W501P|W510|W511|W700|Slider SL101|DA22[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Acer', + '$1', + ), + DeviceParser( + '; *Acer Iconia Tab ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Acer', + '$1', + ), + DeviceParser( + '; *(Z1[1235]0|E320[^/]*|S500|S510|Liquid[^;/]*|Iconia A\\d+)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Acer', + '$1', + ), + DeviceParser( + '; *(Acer |ACER )([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Acer', + '$2', + ), + DeviceParser( + '; *(Advent |)(Vega(?:Bean|Comb|)).*?(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Advent', + '$2', + ), + DeviceParser( + '; *(Ainol |)((?:NOVO|[Nn]ovo)[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Ainol', + '$2', + ), + DeviceParser( + '; *AIRIS[ _\\-]?([^/;\\)]+) *(?:;|\\)|Build)', + 'i', + '$1', + 'Airis', + '$1', + ), + DeviceParser( + '; *(OnePAD[^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + '$1', + 'Airis', + '$1', + ), + DeviceParser( + '; *Airpad[ \\-]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Airpad $1', + 'Airpad', + '$1', + ), + DeviceParser( + '; *(one ?touch) (EVO7|T10|T20)(?: Build|\\) AppleWebKit)', + None, + 'Alcatel One Touch $2', + 'Alcatel', + 'One Touch $2', + ), + DeviceParser( + '; *(?:alcatel[ _]|)(?:(?:one[ _]?touch[ _])|ot[ \\-])([^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + 'Alcatel One Touch $1', + 'Alcatel', + 'One Touch $1', + ), + DeviceParser( + '; *(TCL)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '; *(Vodafone Smart II|Optimus_Madrid)(?: Build|\\) AppleWebKit)', + None, + 'Alcatel $1', + 'Alcatel', + '$1', + ), + DeviceParser( + '; *BASE_Lutea_3(?: Build|\\) AppleWebKit)', + None, + 'Alcatel One Touch 998', + 'Alcatel', + 'One Touch 998', + ), + DeviceParser( + '; *BASE_Varia(?: Build|\\) AppleWebKit)', + None, + 'Alcatel One Touch 918D', + 'Alcatel', + 'One Touch 918D', + ), + DeviceParser( + '; *((?:FINE|Fine)\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Allfine', + '$1', + ), + DeviceParser( + '; *(ALLVIEW[ _]?|Allview[ _]?)((?:Speed|SPEED).*?)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Allview', + '$2', + ), + DeviceParser( + '; *(ALLVIEW[ _]?|Allview[ _]?|)(AX1_Shine|AX2_Frenzy)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Allview', + '$2', + ), + DeviceParser( + '; *(ALLVIEW[ _]?|Allview[ _]?)([^;/]*?)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Allview', + '$2', + ), + DeviceParser( + '; *(A13-MID)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Allwinner', + '$1', + ), + DeviceParser( + '; *(Allwinner)[ _\\-]?([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Allwinner', + '$1', + ), + DeviceParser( + '; *(A651|A701B?|A702|A703|A705|A706|A707|A711|A712|A713|A717|A722|A785|A801|A802|A803|A901|A902|A1002|A1003|A1006|A1007|A9701|A9703|Q710|Q80)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Amaway', + '$1', + ), + DeviceParser( + '; *(?:AMOI|Amoi)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Amoi $1', + 'Amoi', + '$1', + ), + DeviceParser( + '^(?:AMOI|Amoi)[ _]([^;/]+?) Linux', + None, + 'Amoi $1', + 'Amoi', + '$1', + ), + DeviceParser( + '; *(MW(?:0[789]|10)[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Aoc', + '$1', + ), + DeviceParser( + '; *(G7|M1013|M1015G|M11[CG]?|M-?12[B]?|M15|M19[G]?|M30[ACQ]?|M31[GQ]|M32|M33[GQ]|M36|M37|M38|M701T|M710|M712B|M713|M715G|M716G|M71(?:G|GS|T|)|M72[T]?|M73[T]?|M75[GT]?|M77G|M79T|M7L|M7LN|M81|M810|M81T|M82|M92|M92KS|M92S|M717G|M721|M722G|M723|M725G|M739|M785|M791|M92SK|M93D)(?: Build|\\) AppleWebKit)', + None, + 'Aoson $1', + 'Aoson', + '$1', + ), + DeviceParser( + '; *Aoson ([^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + 'Aoson $1', + 'Aoson', + '$1', + ), + DeviceParser( + '; *[Aa]panda[ _\\-]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Apanda $1', + 'Apanda', + '$1', + ), + DeviceParser( + '; *(?:ARCHOS|Archos) ?(GAMEPAD.*?)(?: Build|\\) AppleWebKit)', + None, + 'Archos $1', + 'Archos', + '$1', + ), + DeviceParser( + 'ARCHOS; GOGI; ([^;]+);', + None, + 'Archos $1', + 'Archos', + '$1', + ), + DeviceParser( + '(?:ARCHOS|Archos)[ _]?(.*?)(?: Build|[;/\\(\\)\\-]|$)', + None, + 'Archos $1', + 'Archos', + '$1', + ), + DeviceParser( + '; *(AN(?:7|8|9|10|13)[A-Z0-9]{1,4})(?: Build|\\) AppleWebKit)', + None, + 'Archos $1', + 'Archos', + '$1', + ), + DeviceParser( + '; *(A28|A32|A43|A70(?:BHT|CHT|HB|S|X)|A101(?:B|C|IT)|A7EB|A7EB-WK|101G9|80G9)(?: Build|\\) AppleWebKit)', + None, + 'Archos $1', + 'Archos', + '$1', + ), + DeviceParser( + '; *(PAD-FMD[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Arival', + '$1', + ), + DeviceParser( + '; *(BioniQ) ?([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Arival', + '$1 $2', + ), + DeviceParser( + '; *(AN\\d[^;/]+|ARCHM\\d+)(?: Build|\\) AppleWebKit)', + None, + 'Arnova $1', + 'Arnova', + '$1', + ), + DeviceParser( + '; *(?:ARNOVA|Arnova) ?([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Arnova $1', + 'Arnova', + '$1', + ), + DeviceParser( + '; *(?:ASSISTANT |)(AP)-?([1789]\\d{2}[A-Z]{0,2}|80104)(?: Build|\\) AppleWebKit)', + None, + 'Assistant $1-$2', + 'Assistant', + '$1-$2', + ), + DeviceParser( + '; *(ME17\\d[^;/]*|ME3\\d{2}[^;/]+|K00[A-Z]|Nexus 10|Nexus 7(?: 2013|)|PadFone[^;/]*|Transformer[^;/]*|TF\\d{3}[^;/]*|eeepc)(?: Build|\\) AppleWebKit)', + None, + 'Asus $1', + 'Asus', + '$1', + ), + DeviceParser( + '; *ASUS[ _]*([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Asus $1', + 'Asus', + '$1', + ), + DeviceParser( + '; *Garmin-Asus ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Garmin-Asus $1', + 'Garmin-Asus', + '$1', + ), + DeviceParser( + '; *(Garminfone)(?: Build|\\) AppleWebKit)', + None, + 'Garmin $1', + 'Garmin-Asus', + '$1', + ), + DeviceParser( + '; (@TAB-[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Attab', + '$1', + ), + DeviceParser( + '; *(T-(?:07|[^0]\\d)[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Audiosonic', + '$1', + ), + DeviceParser( + '; *(?:Axioo[ _\\-]([^;/]+?)|(picopad)[ _\\-]([^;/]+?))(?: Build|\\) AppleWebKit)', + 'i', + 'Axioo $1$2 $3', + 'Axioo', + '$1$2 $3', + ), + DeviceParser( + '; *(V(?:100|700|800)[^;/]*)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Azend', + '$1', + ), + DeviceParser( + '; *(IBAK\\-[^;/]*)(?: Build|\\) AppleWebKit)', + 'i', + '$1', + 'Bak', + '$1', + ), + DeviceParser( + '; *(HY5001|HY6501|X12|X21|I5)(?: Build|\\) AppleWebKit)', + None, + 'Bedove $1', + 'Bedove', + '$1', + ), + DeviceParser( + '; *(JC-[^;/]*)(?: Build|\\) AppleWebKit)', + None, + 'Benss $1', + 'Benss', + '$1', + ), + DeviceParser( + '; *(BB) ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Blackberry', + '$2', + ), + DeviceParser( + '; *(BlackBird)[ _](I8.*?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '; *(BlackBird)[ _](.*?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '; *([0-9]+BP[EM][^;/]*|Endeavour[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Blaupunkt $1', + 'Blaupunkt', + '$1', + ), + DeviceParser( + '; *((?:BLU|Blu)[ _\\-])([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Blu', + '$2', + ), + DeviceParser( + '; *(?:BMOBILE )?(Blu|BLU|DASH [^;/]+|VIVO 4\\.3|TANK 4\\.5)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Blu', + '$1', + ), + DeviceParser( + '; *(TOUCH\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Blusens', + '$1', + ), + DeviceParser( + '; *(AX5\\d+)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Bmobile', + '$1', + ), + DeviceParser( + '; *([Bb]q) ([^;/]+?);?(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'bq', + '$2', + ), + DeviceParser( + '; *(Maxwell [^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'bq', + '$1', + ), + DeviceParser( + '; *((?:B-Tab|B-TAB) ?\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Braun', + '$1', + ), + DeviceParser( + '; *(Broncho) ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '; *CAPTIVA ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Captiva $1', + 'Captiva', + '$1', + ), + DeviceParser( + '; *(C771|CAL21|IS11CA)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Casio', + '$1', + ), + DeviceParser( + '; *(?:Cat|CAT) ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Cat $1', + 'Cat', + '$1', + ), + DeviceParser( + '; *(?:Cat)(Nova.*?)(?: Build|\\) AppleWebKit)', + None, + 'Cat $1', + 'Cat', + '$1', + ), + DeviceParser( + '; *(INM8002KP|ADM8000KP_[AB])(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Cat', + 'Tablet PHOENIX 8.1J0', + ), + DeviceParser( + '; *(?:[Cc]elkon[ _\\*]|CELKON[ _\\*])([^;/\\)]+) ?(?:Build|;|\\))', + None, + '$1', + 'Celkon', + '$1', + ), + DeviceParser( + 'Build/(?:[Cc]elkon)+_?([^;/_\\)]+)', + None, + '$1', + 'Celkon', + '$1', + ), + DeviceParser( + '; *(CT)-?(\\d+)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Celkon', + '$1$2', + ), + DeviceParser( + '; *(A19|A19Q|A105|A107[^;/\\)]*) ?(?:Build|;|\\))', + None, + '$1', + 'Celkon', + '$1', + ), + DeviceParser( + '; *(TPC[0-9]{4,5})(?: Build|\\) AppleWebKit)', + None, + '$1', + 'ChangJia', + '$1', + ), + DeviceParser( + '; *(Cloudfone)[ _](Excite)([^ ][^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2 $3', + 'Cloudfone', + '$1 $2 $3', + ), + DeviceParser( + '; *(Excite|ICE)[ _](\\d+[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Cloudfone $1 $2', + 'Cloudfone', + 'Cloudfone $1 $2', + ), + DeviceParser( + '; *(Cloudfone|CloudPad)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Cloudfone', + '$1 $2', + ), + DeviceParser( + '; *((?:Aquila|Clanga|Rapax)[^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + '$1', + 'Cmx', + '$1', + ), + DeviceParser( + '; *(?:CFW-|Kyros )?(MID[0-9]{4}(?:[ABC]|SR|TV)?)(\\(3G\\)-4G| GB 8K| 3G| 8K| GB)? *(?:Build|[;\\)])', + None, + 'CobyKyros $1$2', + 'CobyKyros', + '$1$2', + ), + DeviceParser( + '; *([^;/]*)Coolpad[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Coolpad', + '$1$2', + ), + DeviceParser( + '; *(CUBE[ _])?([KU][0-9]+ ?GT.*?|A5300)(?: Build|\\) AppleWebKit)', + 'i', + '$1$2', + 'Cube', + '$2', + ), + DeviceParser( + '; *CUBOT ([^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + '$1', + 'Cubot', + '$1', + ), + DeviceParser( + '; *(BOBBY)(?: Build|\\) AppleWebKit)', + 'i', + '$1', + 'Cubot', + '$1', + ), + DeviceParser( + '; *(Dslide [^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Danew', + '$1', + ), + DeviceParser( + '; *(XCD)[ _]?(28|35)(?: Build|\\) AppleWebKit)', + None, + 'Dell $1$2', + 'Dell', + '$1$2', + ), + DeviceParser( + '; *(001DL)(?: Build|\\) AppleWebKit)', + None, + 'Dell $1', + 'Dell', + 'Streak', + ), + DeviceParser( + '; *(?:Dell|DELL) (Streak)(?: Build|\\) AppleWebKit)', + None, + 'Dell $1', + 'Dell', + 'Streak', + ), + DeviceParser( + '; *(101DL|GS01|Streak Pro[^;/]*)(?: Build|\\) AppleWebKit)', + None, + 'Dell $1', + 'Dell', + 'Streak Pro', + ), + DeviceParser( + '; *([Ss]treak ?7)(?: Build|\\) AppleWebKit)', + None, + 'Dell $1', + 'Dell', + 'Streak 7', + ), + DeviceParser( + '; *(Mini-3iX)(?: Build|\\) AppleWebKit)', + None, + 'Dell $1', + 'Dell', + '$1', + ), + DeviceParser( + '; *(?:Dell|DELL)[ _](Aero|Venue|Thunder|Mini.*?|Streak[ _]Pro)(?: Build|\\) AppleWebKit)', + None, + 'Dell $1', + 'Dell', + '$1', + ), + DeviceParser( + '; *Dell[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Dell $1', + 'Dell', + '$1', + ), + DeviceParser( + '; *Dell ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Dell $1', + 'Dell', + '$1', + ), + DeviceParser( + '; *(TA[CD]-\\d+[^;/]*)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Denver', + '$1', + ), + DeviceParser( + '; *(iP[789]\\d{2}(?:-3G)?|IP10\\d{2}(?:-8GB)?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Dex', + '$1', + ), + DeviceParser( + '; *(AirTab)[ _\\-]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'DNS', + '$1 $2', + ), + DeviceParser( + '; *(F\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Fujitsu', + '$1', + ), + DeviceParser( + '; *(HT-03A)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'HTC', + 'Magic', + ), + DeviceParser( + '; *(HT\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'HTC', + '$1', + ), + DeviceParser( + '; *(L\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'LG', + '$1', + ), + DeviceParser( + '; *(N\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Nec', + '$1', + ), + DeviceParser( + '; *(P\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Panasonic', + '$1', + ), + DeviceParser( + '; *(SC\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Samsung', + '$1', + ), + DeviceParser( + '; *(SH\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Sharp', + '$1', + ), + DeviceParser( + '; *(SO\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'SonyEricsson', + '$1', + ), + DeviceParser( + '; *(T\\-0[12][^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Toshiba', + '$1', + ), + DeviceParser( + '; *(DOOV)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'DOOV', + '$2', + ), + DeviceParser( + '; *(Enot|ENOT)[ -]?([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Enot', + '$2', + ), + DeviceParser( + '; *[^;/]+ Build/(?:CROSS|Cross)+[ _\\-]([^\\)]+)', + None, + 'CROSS $1', + 'Evercoss', + 'Cross $1', + ), + DeviceParser( + '; *(CROSS|Cross)[ _\\-]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Evercoss', + 'Cross $2', + ), + DeviceParser( + '; *Explay[_ ](.+?)(?:[\\)]| Build)', + None, + '$1', + 'Explay', + '$1', + ), + DeviceParser( + '; *(IQ.*?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Fly', + '$1', + ), + DeviceParser( + '; *(Fly|FLY)[ _](IQ[^;]+?|F[34]\\d+[^;]*?);?(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Fly', + '$2', + ), + DeviceParser( + '; *(M532|Q572|FJL21)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Fujitsu', + '$1', + ), + DeviceParser( + '; *(G1)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Galapad', + '$1', + ), + DeviceParser( + '; *(Geeksphone) ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '; *(G[^F]?FIVE) ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Gfive', + '$2', + ), + DeviceParser( + '; *(Gionee)[ _\\-]([^;/]+?)(?:/[^;/]+|)(?: Build|\\) AppleWebKit)', + 'i', + '$1 $2', + 'Gionee', + '$2', + ), + DeviceParser( + '; *(GN\\d+[A-Z]?|INFINITY_PASSION|Ctrl_V1)(?: Build|\\) AppleWebKit)', + None, + 'Gionee $1', + 'Gionee', + '$1', + ), + DeviceParser( + '; *(E3) Build/JOP40D', + None, + 'Gionee $1', + 'Gionee', + '$1', + ), + DeviceParser( + '\\sGIONEE[-\\s_](\\w*)', + 'i', + 'Gionee $1', + 'Gionee', + '$1', + ), + DeviceParser( + '; *((?:FONE|QUANTUM|INSIGNIA) \\d+[^;/]*|PLAYTAB)(?: Build|\\) AppleWebKit)', + None, + 'GoClever $1', + 'GoClever', + '$1', + ), + DeviceParser( + '; *GOCLEVER ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'GoClever $1', + 'GoClever', + '$1', + ), + DeviceParser( + '; *(Glass \\d+)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Google', + '$1', + ), + DeviceParser( + '; *(Pixel.*?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Google', + '$1', + ), + DeviceParser( + '; *(GSmart)[ -]([^/]+)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Gigabyte', + '$1 $2', + ), + DeviceParser( + '; *(imx5[13]_[^/]+)(?: Build|\\) AppleWebKit)', + None, + 'Freescale $1', + 'Freescale', + '$1', + ), + DeviceParser( + '; *Haier[ _\\-]([^/]+)(?: Build|\\) AppleWebKit)', + None, + 'Haier $1', + 'Haier', + '$1', + ), + DeviceParser( + '; *(PAD1016)(?: Build|\\) AppleWebKit)', + None, + 'Haipad $1', + 'Haipad', + '$1', + ), + DeviceParser( + '; *(M701|M7|M8|M9)(?: Build|\\) AppleWebKit)', + None, + 'Haipad $1', + 'Haipad', + '$1', + ), + DeviceParser( + '; *(SN\\d+T[^;\\)/]*)(?: Build|[;\\)])', + None, + 'Hannspree $1', + 'Hannspree', + '$1', + ), + DeviceParser( + 'Build/HCL ME Tablet ([^;\\)]+)[\\);]', + None, + 'HCLme $1', + 'HCLme', + '$1', + ), + DeviceParser( + '; *([^;\\/]+) Build/HCL', + None, + 'HCLme $1', + 'HCLme', + '$1', + ), + DeviceParser( + '; *(MID-?\\d{4}C[EM])(?: Build|\\) AppleWebKit)', + None, + 'Hena $1', + 'Hena', + '$1', + ), + DeviceParser( + '; *(EG\\d{2,}|HS-[^;/]+|MIRA[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Hisense $1', + 'Hisense', + '$1', + ), + DeviceParser( + '; *(andromax[^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + 'Hisense $1', + 'Hisense', + '$1', + ), + DeviceParser( + '; *(?:AMAZE[ _](S\\d+)|(S\\d+)[ _]AMAZE)(?: Build|\\) AppleWebKit)', + None, + 'AMAZE $1$2', + 'hitech', + 'AMAZE $1$2', + ), + DeviceParser( + '; *(PlayBook)(?: Build|\\) AppleWebKit)', + None, + 'HP $1', + 'HP', + '$1', + ), + DeviceParser( + '; *HP ([^/]+)(?: Build|\\) AppleWebKit)', + None, + 'HP $1', + 'HP', + '$1', + ), + DeviceParser( + '; *([^/]+_tenderloin)(?: Build|\\) AppleWebKit)', + None, + 'HP TouchPad', + 'HP', + 'TouchPad', + ), + DeviceParser( + '; *(HUAWEI |Huawei-|)([UY][^;/]+) Build/(?:Huawei|HUAWEI)([UY][^\\);]+)\\)', + None, + '$1$2', + 'Huawei', + '$2', + ), + DeviceParser( + '; *([^;/]+) Build[/ ]Huawei(MT1-U06|[A-Z]+\\d+[^\\);]+)\\)', + None, + '$1', + 'Huawei', + '$2', + ), + DeviceParser( + '; *(S7|M860) Build', + None, + '$1', + 'Huawei', + '$1', + ), + DeviceParser( + '; *((?:HUAWEI|Huawei)[ \\-]?)(MediaPad) Build', + None, + '$1$2', + 'Huawei', + '$2', + ), + DeviceParser( + '; *((?:HUAWEI[ _]?|Huawei[ _]|)Ascend[ _])([^;/]+) Build', + None, + '$1$2', + 'Huawei', + '$2', + ), + DeviceParser( + '; *((?:HUAWEI|Huawei)[ _\\-]?)((?:G700-|MT-)[^;/]+) Build', + None, + '$1$2', + 'Huawei', + '$2', + ), + DeviceParser( + '; *((?:HUAWEI|Huawei)[ _\\-]?)([^;/]+) Build', + None, + '$1$2', + 'Huawei', + '$2', + ), + DeviceParser( + '; *(MediaPad[^;]+|SpringBoard) Build/Huawei', + None, + '$1', + 'Huawei', + '$1', + ), + DeviceParser( + '; *([^;]+) Build/(?:Huawei|HUAWEI)', + None, + '$1', + 'Huawei', + '$1', + ), + DeviceParser( + '; *([Uu])([89]\\d{3}) Build', + None, + '$1$2', + 'Huawei', + 'U$2', + ), + DeviceParser( + '; *(?:Ideos |IDEOS )(S7) Build', + None, + 'Huawei Ideos$1', + 'Huawei', + 'Ideos$1', + ), + DeviceParser( + '; *(?:Ideos |IDEOS )([^;/]+\\s*|\\s*)Build', + None, + 'Huawei Ideos$1', + 'Huawei', + 'Ideos$1', + ), + DeviceParser( + '; *(Orange Daytona|Pulse|Pulse Mini|Vodafone 858|C8500|C8600|C8650|C8660|Nexus 6P|ATH-.+?) Build[/ ]', + None, + 'Huawei $1', + 'Huawei', + '$1', + ), + DeviceParser( + '; *((?:[A-Z]{3})\\-L[A-Za0-9]{2})[\\)]', + None, + 'Huawei $1', + 'Huawei', + '$1', + ), + DeviceParser( + '; *HTC[ _]([^;]+); Windows Phone', + None, + 'HTC $1', + 'HTC', + '$1', + ), + DeviceParser( + '; *(?:HTC[ _/])+([^ _/]+)(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: *Build|\\))', + None, + 'HTC $1', + 'HTC', + '$1', + ), + DeviceParser( + '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)|)(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: *Build|\\))', + None, + 'HTC $1 $2', + 'HTC', + '$1 $2', + ), + DeviceParser( + '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: *Build|\\))', + None, + 'HTC $1 $2 $3', + 'HTC', + '$1 $2 $3', + ), + DeviceParser( + '; *(?:HTC[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)|)|)|)(?:[/\\\\]1\\.0 | V|/| +)\\d+\\.\\d[\\d\\.]*(?: *Build|\\))', + None, + 'HTC $1 $2 $3 $4', + 'HTC', + '$1 $2 $3 $4', + ), + DeviceParser( + '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/;]+)(?: *Build|[;\\)]| - )', + None, + 'HTC $1', + 'HTC', + '$1', + ), + DeviceParser( + '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/;\\)]+)|)(?: *Build|[;\\)]| - )', + None, + 'HTC $1 $2', + 'HTC', + '$1 $2', + ), + DeviceParser( + '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/;\\)]+)|)|)(?: *Build|[;\\)]| - )', + None, + 'HTC $1 $2 $3', + 'HTC', + '$1 $2 $3', + ), + DeviceParser( + '; *(?:(?:HTC|htc)(?:_blocked|)[ _/])+([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ _/]+)(?:[ _/]([^ /;]+)|)|)|)(?: *Build|[;\\)]| - )', + None, + 'HTC $1 $2 $3 $4', + 'HTC', + '$1 $2 $3 $4', + ), + DeviceParser( + 'HTC Streaming Player [^\\/]*/[^\\/]*/ htc_([^/]+) /', + None, + 'HTC $1', + 'HTC', + '$1', + ), + DeviceParser( + '(?:[;,] *|^)(?:htccn_chs-|)HTC[ _-]?([^;]+?)(?: *Build|clay|Android|-?Mozilla| Opera| Profile| UNTRUSTED|[;/\\(\\)]|$)', + 'i', + 'HTC $1', + 'HTC', + '$1', + ), + DeviceParser( + '; *(A6277|ADR6200|ADR6300|ADR6350|ADR6400[A-Z]*|ADR6425[A-Z]*|APX515CKT|ARIA|Desire[^_ ]*|Dream|EndeavorU|Eris|Evo|Flyer|HD2|Hero|HERO200|Hero CDMA|HTL21|Incredible|Inspire[A-Z0-9]*|Legend|Liberty|Nexus ?(?:One|HD2)|One|One S C2|One[ _]?(?:S|V|X\\+?)\\w*|PC36100|PG06100|PG86100|S31HT|Sensation|Wildfire)(?: Build|[/;\\(\\)])', + 'i', + 'HTC $1', + 'HTC', + '$1', + ), + DeviceParser( + '; *(ADR6200|ADR6400L|ADR6425LVW|Amaze|DesireS?|EndeavorU|Eris|EVO|Evo\\d[A-Z]+|HD2|IncredibleS?|Inspire[A-Z0-9]*|Inspire[A-Z0-9]*|Sensation[A-Z0-9]*|Wildfire)[ _-](.+?)(?:[/;\\)]|Build|MIUI|1\\.0)', + 'i', + 'HTC $1 $2', + 'HTC', + '$1 $2', + ), + DeviceParser( + '; *HYUNDAI (T\\d[^/]*)(?: Build|\\) AppleWebKit)', + None, + 'Hyundai $1', + 'Hyundai', + '$1', + ), + DeviceParser( + '; *HYUNDAI ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Hyundai $1', + 'Hyundai', + '$1', + ), + DeviceParser( + '; *(X700|Hold X|MB-6900)(?: Build|\\) AppleWebKit)', + None, + 'Hyundai $1', + 'Hyundai', + '$1', + ), + DeviceParser( + '; *(?:iBall[ _\\-]|)(Andi)[ _]?(\\d[^;/]*)(?: Build|\\) AppleWebKit)', + 'i', + '$1 $2', + 'iBall', + '$1 $2', + ), + DeviceParser( + '; *(IBall)(?:[ _]([^;/]+?)|)(?: Build|\\) AppleWebKit)', + 'i', + '$1 $2', + 'iBall', + '$2', + ), + DeviceParser( + '; *(NT-\\d+[^ ;/]*|Net[Tt]AB [^;/]+|Mercury [A-Z]+|iconBIT)(?: S/N:[^;/]+|)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'IconBIT', + '$1', + ), + DeviceParser( + '; *(IMO)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + '$1 $2', + 'IMO', + '$2', + ), + DeviceParser( + '; *i-?mobile[ _]([^/]+)(?: Build|\\) AppleWebKit)', + 'i', + 'i-mobile $1', + 'imobile', + '$1', + ), + DeviceParser( + '; *(i-(?:style|note)[^/]*)(?: Build|\\) AppleWebKit)', + 'i', + 'i-mobile $1', + 'imobile', + '$1', + ), + DeviceParser( + '; *(ImPAD) ?(\\d+(?:.)*?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Impression', + '$1 $2', + ), + DeviceParser( + '; *(Infinix)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Infinix', + '$2', + ), + DeviceParser( + '; *(Informer)[ \\-]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Informer', + '$2', + ), + DeviceParser( + '; *(TAB) ?([78][12]4)(?: Build|\\) AppleWebKit)', + None, + 'Intenso $1', + 'Intenso', + '$1 $2', + ), + DeviceParser( + '; *(?:Intex[ _]|)(AQUA|Aqua)([ _\\.\\-])([^;/]+?) *(?:Build|;)', + None, + '$1$2$3', + 'Intex', + '$1 $3', + ), + DeviceParser( + '; *(?:INTEX|Intex)(?:[_ ]([^\\ _;/]+))(?:[_ ]([^\\ _;/]+)|) *(?:Build|;)', + None, + '$1 $2', + 'Intex', + '$1 $2', + ), + DeviceParser( + '; *([iI]Buddy)[ _]?(Connect)(?:_|\\?_| |)([^;/]*) *(?:Build|;)', + None, + '$1 $2 $3', + 'Intex', + 'iBuddy $2 $3', + ), + DeviceParser( + '; *(I-Buddy)[ _]([^;/]+?) *(?:Build|;)', + None, + '$1 $2', + 'Intex', + 'iBuddy $2', + ), + DeviceParser( + '; *(iOCEAN) ([^/]+)(?: Build|\\) AppleWebKit)', + 'i', + '$1 $2', + 'iOCEAN', + '$2', + ), + DeviceParser( + '; *(TP\\d+(?:\\.\\d+|)\\-\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'ionik $1', + 'ionik', + '$1', + ), + DeviceParser( + '; *(M702pro)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Iru', + '$1', + ), + DeviceParser( + '; *(DE88Plus|MD70)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Ivio', + '$1', + ), + DeviceParser( + '; *IVIO[_\\-]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Ivio', + '$1', + ), + DeviceParser( + '; *(TPC-\\d+|JAY-TECH)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Jaytech', + '$1', + ), + DeviceParser( + '; *(JY-[^;/]+|G[234]S?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Jiayu', + '$1', + ), + DeviceParser( + '; *(JXD)[ _\\-]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'JXD', + '$2', + ), + DeviceParser( + '; *Karbonn[ _]?([^;/]+) *(?:Build|;)', + 'i', + '$1', + 'Karbonn', + '$1', + ), + DeviceParser( + '; *([^;]+) Build/Karbonn', + None, + '$1', + 'Karbonn', + '$1', + ), + DeviceParser( + '; *(A11|A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2|Titanium S\\d) +Build', + None, + '$1', + 'Karbonn', + '$1', + ), + DeviceParser( + '; *(IS01|IS03|IS05|IS\\d{2}SH)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Sharp', + '$1', + ), + DeviceParser( + '; *(IS04)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Regza', + '$1', + ), + DeviceParser( + '; *(IS06|IS\\d{2}PT)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Pantech', + '$1', + ), + DeviceParser( + '; *(IS11S)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'SonyEricsson', + 'Xperia Acro', + ), + DeviceParser( + '; *(IS11CA)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Casio', + 'GzOne $1', + ), + DeviceParser( + '; *(IS11LG)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'LG', + 'Optimus X', + ), + DeviceParser( + '; *(IS11N)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Medias', + '$1', + ), + DeviceParser( + '; *(IS11PT)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Pantech', + 'MIRACH', + ), + DeviceParser( + '; *(IS12F)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Fujitsu', + 'Arrows ES', + ), + DeviceParser( + '; *(IS12M)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Motorola', + 'XT909', + ), + DeviceParser( + '; *(IS12S)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'SonyEricsson', + 'Xperia Acro HD', + ), + DeviceParser( + '; *(ISW11F)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Fujitsu', + 'Arrowz Z', + ), + DeviceParser( + '; *(ISW11HT)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'HTC', + 'EVO', + ), + DeviceParser( + '; *(ISW11K)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Kyocera', + 'DIGNO', + ), + DeviceParser( + '; *(ISW11M)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Motorola', + 'Photon', + ), + DeviceParser( + '; *(ISW11SC)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Samsung', + 'GALAXY S II WiMAX', + ), + DeviceParser( + '; *(ISW12HT)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'HTC', + 'EVO 3D', + ), + DeviceParser( + '; *(ISW13HT)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'HTC', + 'J', + ), + DeviceParser( + '; *(ISW?[0-9]{2}[A-Z]{0,2})(?: Build|\\) AppleWebKit)', + None, + '$1', + 'KDDI', + '$1', + ), + DeviceParser( + '; *(INFOBAR [^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'KDDI', + '$1', + ), + DeviceParser( + '; *(JOYPAD|Joypad)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Kingcom', + '$1 $2', + ), + DeviceParser( + '; *(Vox|VOX|Arc|K080)(?: Build|\\) AppleWebKit)', + 'i', + '$1', + 'Kobo', + '$1', + ), + DeviceParser( + '\\b(Kobo Touch)\\b', + None, + '$1', + 'Kobo', + '$1', + ), + DeviceParser( + '; *(K-Touch)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + '$1 $2', + 'Ktouch', + '$2', + ), + DeviceParser( + '; *((?:EV|KM)-S\\d+[A-Z]?)(?: Build|\\) AppleWebKit)', + 'i', + '$1', + 'KTtech', + '$1', + ), + DeviceParser( + '; *(Zio|Hydro|Torque|Event|EVENT|Echo|Milano|Rise|URBANO PROGRESSO|WX04K|WX06K|WX10K|KYL21|101K|C5[12]\\d{2})(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Kyocera', + '$1', + ), + DeviceParser( + '; *(?:LAVA[ _]|)IRIS[ _\\-]?([^/;\\)]+) *(?:;|\\)|Build)', + 'i', + 'Iris $1', + 'Lava', + 'Iris $1', + ), + DeviceParser( + '; *LAVA[ _]([^;/]+) Build', + None, + '$1', + 'Lava', + '$1', + ), + DeviceParser( + '; *(?:(Aspire A1)|(?:LEMON|Lemon)[ _]([^;/]+))_?(?: Build|\\) AppleWebKit)', + None, + 'Lemon $1$2', + 'Lemon', + '$1$2', + ), + DeviceParser( + '; *(TAB-1012)(?: Build|\\) AppleWebKit)', + None, + 'Lenco $1', + 'Lenco', + '$1', + ), + DeviceParser( + '; Lenco ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Lenco $1', + 'Lenco', + '$1', + ), + DeviceParser( + '; *(A1_07|A2107A-H|S2005A-H|S1-37AH0) Build', + None, + '$1', + 'Lenovo', + '$1', + ), + DeviceParser( + '; *(Idea[Tp]ab)[ _]([^;/]+);? Build', + None, + 'Lenovo $1 $2', + 'Lenovo', + '$1 $2', + ), + DeviceParser( + '; *(Idea(?:Tab|pad)) ?([^;/]+) Build', + None, + 'Lenovo $1 $2', + 'Lenovo', + '$1 $2', + ), + DeviceParser( + '; *(ThinkPad) ?(Tablet) Build/', + None, + 'Lenovo $1 $2', + 'Lenovo', + '$1 $2', + ), + DeviceParser( + '; *(?:LNV-|)(?:=?[Ll]enovo[ _\\-]?|LENOVO[ _])(.+?)(?:Build|[;/\\)])', + None, + 'Lenovo $1', + 'Lenovo', + '$1', + ), + DeviceParser( + '[;,] (?:Vodafone |)(SmartTab) ?(II) ?(\\d+) Build/', + None, + 'Lenovo $1 $2 $3', + 'Lenovo', + '$1 $2 $3', + ), + DeviceParser( + '; *(?:Ideapad |)K1 Build/', + None, + 'Lenovo Ideapad K1', + 'Lenovo', + 'Ideapad K1', + ), + DeviceParser( + '; *(3GC101|3GW10[01]|A390) Build/', + None, + '$1', + 'Lenovo', + '$1', + ), + DeviceParser( + '\\b(?:Lenovo|LENOVO)+[ _\\-]?([^,;:/ ]+)', + None, + 'Lenovo $1', + 'Lenovo', + '$1', + ), + DeviceParser( + '; *(MFC\\d+)[A-Z]{2}([^;,/]*),?(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Lexibook', + '$1$2', + ), + DeviceParser( + '; *(E[34][0-9]{2}|LS[6-8][0-9]{2}|VS[6-9][0-9]+[^;/]+|Nexus 4|Nexus 5X?|GT540f?|Optimus (?:2X|G|4X HD)|OptimusX4HD) *(?:Build|;)', + None, + '$1', + 'LG', + '$1', + ), + DeviceParser( + '[;:] *(L-\\d+[A-Z]|LGL\\d+[A-Z]?)(?:/V\\d+|) *(?:Build|[;\\)])', + None, + '$1', + 'LG', + '$1', + ), + DeviceParser( + '; *(LG-)([A-Z]{1,2}\\d{2,}[^,;/\\)\\(]*?)(?:Build| V\\d+|[,;/\\)\\(]|$)', + None, + '$1$2', + 'LG', + '$2', + ), + DeviceParser( + '; *(LG[ \\-]|LG)([^;/]+)[;/]? Build', + None, + '$1$2', + 'LG', + '$2', + ), + DeviceParser( + '^(LG)-([^;/]+)/ Mozilla/.*; Android', + None, + '$1 $2', + 'LG', + '$2', + ), + DeviceParser( + '(Web0S); Linux/(SmartTV)', + None, + 'LG $1 $2', + 'LG', + '$1 $2', + ), + DeviceParser( + '; *((?:SMB|smb)[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Malata', + '$1', + ), + DeviceParser( + '; *(?:Malata|MALATA) ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Malata', + '$1', + ), + DeviceParser( + '; *(MS[45][0-9]{3}|MID0[568][NS]?|MID[1-9]|MID[78]0[1-9]|MID970[1-9]|MID100[1-9])(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Manta', + '$1', + ), + DeviceParser( + '; *(M1052|M806|M9000|M9100|M9701|MID100|MID120|MID125|MID130|MID135|MID140|MID701|MID710|MID713|MID727|MID728|MID731|MID732|MID733|MID735|MID736|MID737|MID760|MID800|MID810|MID820|MID830|MID833|MID835|MID860|MID900|MID930|MID933|MID960|MID980)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Match', + '$1', + ), + DeviceParser( + '; *(GenxDroid7|MSD7.*?|AX\\d.*?|Tab 701|Tab 722)(?: Build|\\) AppleWebKit)', + None, + 'Maxx $1', + 'Maxx', + '$1', + ), + DeviceParser( + '; *(M-PP[^;/]+|PhonePad ?\\d{2,}[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Mediacom $1', + 'Mediacom', + '$1', + ), + DeviceParser( + '; *(M-MP[^;/]+|SmartPad ?\\d{2,}[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Mediacom $1', + 'Mediacom', + '$1', + ), + DeviceParser( + '; *(?:MD_|)LIFETAB[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + 'Medion Lifetab $1', + 'Medion', + 'Lifetab $1', + ), + DeviceParser( + '; *MEDION ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Medion $1', + 'Medion', + '$1', + ), + DeviceParser( + '; *(M030|M031|M035|M040|M065|m9)(?: Build|\\) AppleWebKit)', + None, + 'Meizu $1', + 'Meizu', + '$1', + ), + DeviceParser( + '; *(?:meizu_|MEIZU )(.+?) *(?:Build|[;\\)])', + None, + 'Meizu $1', + 'Meizu', + '$1', + ), + DeviceParser( + '; *(?:Micromax[ _](A111|A240)|(A111|A240)) Build', + 'i', + 'Micromax $1$2', + 'Micromax', + '$1$2', + ), + DeviceParser( + '; *Micromax[ _](A\\d{2,3}[^;/]*) Build', + 'i', + 'Micromax $1', + 'Micromax', + '$1', + ), + DeviceParser( + '; *(A\\d{2}|A[12]\\d{2}|A90S|A110Q) Build', + 'i', + 'Micromax $1', + 'Micromax', + '$1', + ), + DeviceParser( + '; *Micromax[ _](P\\d{3}[^;/]*) Build', + 'i', + 'Micromax $1', + 'Micromax', + '$1', + ), + DeviceParser( + '; *(P\\d{3}|P\\d{3}\\(Funbook\\)) Build', + 'i', + 'Micromax $1', + 'Micromax', + '$1', + ), + DeviceParser( + '; *(MITO)[ _\\-]?([^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + '$1 $2', + 'Mito', + '$2', + ), + DeviceParser( + '; *(Cynus)[ _](F5|T\\d|.+?) *(?:Build|[;/\\)])', + 'i', + '$1 $2', + 'Mobistel', + '$1 $2', + ), + DeviceParser( + '; *(MODECOM |)(FreeTab) ?([^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + '$1$2 $3', + 'Modecom', + '$2 $3', + ), + DeviceParser( + '; *(MODECOM )([^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + '$1 $2', + 'Modecom', + '$2', + ), + DeviceParser( + '; *(MZ\\d{3}\\+?|MZ\\d{3} 4G|Xoom|XOOM[^;/]*) Build', + None, + 'Motorola $1', + 'Motorola', + '$1', + ), + DeviceParser( + '; *(Milestone )(XT[^;/]*) Build', + None, + 'Motorola $1$2', + 'Motorola', + '$2', + ), + DeviceParser( + '; *(Motoroi ?x|Droid X|DROIDX) Build', + 'i', + 'Motorola $1', + 'Motorola', + 'DROID X', + ), + DeviceParser( + '; *(Droid[^;/]*|DROID[^;/]*|Milestone[^;/]*|Photon|Triumph|Devour|Titanium) Build', + None, + 'Motorola $1', + 'Motorola', + '$1', + ), + DeviceParser( + '; *(A555|A85[34][^;/]*|A95[356]|ME[58]\\d{2}\\+?|ME600|ME632|ME722|MB\\d{3}\\+?|MT680|MT710|MT870|MT887|MT917|WX435|WX453|WX44[25]|XT\\d{3,4}[A-Z\\+]*|CL[iI]Q|CL[iI]Q XT) Build', + None, + '$1', + 'Motorola', + '$1', + ), + DeviceParser( + '; *(Motorola MOT-|Motorola[ _\\-]|MOT\\-?)([^;/]+) Build', + None, + '$1$2', + 'Motorola', + '$2', + ), + DeviceParser( + '; *(Moto[_ ]?|MOT\\-)([^;/]+) Build', + None, + '$1$2', + 'Motorola', + '$2', + ), + DeviceParser( + '; *((?:MP[DQ]C|MPG\\d{1,4}|MP\\d{3,4}|MID(?:(?:10[234]|114|43|7[247]|8[24]|7)C|8[01]1))[^;/]*)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Mpman', + '$1', + ), + DeviceParser( + '; *(?:MSI[ _]|)(Primo\\d+|Enjoy[ _\\-][^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + '$1', + 'Msi', + '$1', + ), + DeviceParser( + '; *Multilaser[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Multilaser', + '$1', + ), + DeviceParser( + '; *(My)[_]?(Pad)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1$2 $3', + 'MyPhone', + '$1$2 $3', + ), + DeviceParser( + '; *(My)\\|?(Phone)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1$2 $3', + 'MyPhone', + '$3', + ), + DeviceParser( + '; *(A\\d+)[ _](Duo|)(?: Build|\\) AppleWebKit)', + 'i', + '$1 $2', + 'MyPhone', + '$1 $2', + ), + DeviceParser( + '; *(myTab[^;/]*)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Mytab', + '$1', + ), + DeviceParser( + '; *(NABI2?-)([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Nabi', + '$2', + ), + DeviceParser( + '; *(N-\\d+[CDE])(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Nec', + '$1', + ), + DeviceParser( + '; ?(NEC-)(.*?)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Nec', + '$2', + ), + DeviceParser( + '; *(LT-NA7)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Nec', + 'Lifetouch Note', + ), + DeviceParser( + '; *(NXM\\d+[A-Za-z0-9_]*|Next\\d[A-Za-z0-9_ \\-]*|NEXT\\d[A-Za-z0-9_ \\-]*|Nextbook [A-Za-z0-9_ ]*|DATAM803HC|M805)(?: Build|[\\);])', + None, + '$1', + 'Nextbook', + '$1', + ), + DeviceParser( + '; *(Nokia)([ _\\-]*)([^;/]*) Build', + 'i', + '$1$2$3', + 'Nokia', + '$3', + ), + DeviceParser( + '; *(Nook ?|Barnes & Noble Nook |BN )([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Nook', + '$2', + ), + DeviceParser( + '; *(NOOK |)(BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Nook', + '$2', + ), + DeviceParser( + '; Build/(Nook)', + None, + '$1', + 'Nook', + 'Tablet', + ), + DeviceParser( + '; *(OP110|OliPad[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Olivetti $1', + 'Olivetti', + '$1', + ), + DeviceParser( + '; *OMEGA[ _\\-](MID[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Omega $1', + 'Omega', + '$1', + ), + DeviceParser( + '^(MID7500|MID\\d+) Mozilla/5\\.0 \\(iPad;', + None, + 'Omega $1', + 'Omega', + '$1', + ), + DeviceParser( + '; *((?:CIUS|cius)[^;/]*)(?: Build|\\) AppleWebKit)', + None, + 'Openpeak $1', + 'Openpeak', + '$1', + ), + DeviceParser( + '; *(Find ?(?:5|7a)|R8[012]\\d{1,2}|T703\\d?|U70\\d{1,2}T?|X90\\d{1,2})(?: Build|\\) AppleWebKit)', + None, + 'Oppo $1', + 'Oppo', + '$1', + ), + DeviceParser( + '; *OPPO ?([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Oppo $1', + 'Oppo', + '$1', + ), + DeviceParser( + '; *(?:Odys\\-|ODYS\\-|ODYS )([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Odys $1', + 'Odys', + '$1', + ), + DeviceParser( + '; *(SELECT) ?(7)(?: Build|\\) AppleWebKit)', + None, + 'Odys $1 $2', + 'Odys', + '$1 $2', + ), + DeviceParser( + '; *(PEDI)_(PLUS)_(W)(?: Build|\\) AppleWebKit)', + None, + 'Odys $1 $2 $3', + 'Odys', + '$1 $2 $3', + ), + DeviceParser( + '; *(AEON|BRAVIO|FUSION|FUSION2IN1|Genio|EOS10|IEOS[^;/]*|IRON|Loox|LOOX|LOOX Plus|Motion|NOON|NOON_PRO|NEXT|OPOS|PEDI[^;/]*|PRIME[^;/]*|STUDYTAB|TABLO|Tablet-PC-4|UNO_X8|XELIO[^;/]*|Xelio ?\\d+ ?[Pp]ro|XENO10|XPRESS PRO)(?: Build|\\) AppleWebKit)', + None, + 'Odys $1', + 'Odys', + '$1', + ), + DeviceParser( + '; (ONE [a-zA-Z]\\d+)(?: Build|\\) AppleWebKit)', + None, + 'OnePlus $1', + 'OnePlus', + '$1', + ), + DeviceParser( + '; (ONEPLUS [a-zA-Z]\\d+)(?: Build|\\) AppleWebKit)', + None, + 'OnePlus $1', + 'OnePlus', + '$1', + ), + DeviceParser( + '; *(TP-\\d+)(?: Build|\\) AppleWebKit)', + None, + 'Orion $1', + 'Orion', + '$1', + ), + DeviceParser( + '; *(G100W?)(?: Build|\\) AppleWebKit)', + None, + 'PackardBell $1', + 'PackardBell', + '$1', + ), + DeviceParser( + '; *(Panasonic)[_ ]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '; *(FZ-A1B|JT-B1)(?: Build|\\) AppleWebKit)', + None, + 'Panasonic $1', + 'Panasonic', + '$1', + ), + DeviceParser( + '; *(dL1|DL1)(?: Build|\\) AppleWebKit)', + None, + 'Panasonic $1', + 'Panasonic', + '$1', + ), + DeviceParser( + '; *(SKY[ _]|)(IM\\-[AT]\\d{3}[^;/]+).* Build/', + None, + 'Pantech $1$2', + 'Pantech', + '$1$2', + ), + DeviceParser( + '; *((?:ADR8995|ADR910L|ADR930L|ADR930VW|PTL21|P8000)(?: 4G|)) Build/', + None, + '$1', + 'Pantech', + '$1', + ), + DeviceParser( + '; *Pantech([^;/]+).* Build/', + None, + 'Pantech $1', + 'Pantech', + '$1', + ), + DeviceParser( + '; *(papyre)[ _\\-]([^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + '$1 $2', + 'Papyre', + '$2', + ), + DeviceParser( + '; *(?:Touchlet )?(X10\\.[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Pearl $1', + 'Pearl', + '$1', + ), + DeviceParser( + '; PHICOMM (i800)(?: Build|\\) AppleWebKit)', + None, + 'Phicomm $1', + 'Phicomm', + '$1', + ), + DeviceParser( + '; PHICOMM ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Phicomm $1', + 'Phicomm', + '$1', + ), + DeviceParser( + '; *(FWS\\d{3}[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Phicomm $1', + 'Phicomm', + '$1', + ), + DeviceParser( + '; *(D633|D822|D833|T539|T939|V726|W335|W336|W337|W3568|W536|W5510|W626|W632|W6350|W6360|W6500|W732|W736|W737|W7376|W820|W832|W8355|W8500|W8510|W930)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Philips', + '$1', + ), + DeviceParser( + '; *(?:Philips|PHILIPS)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Philips $1', + 'Philips', + '$1', + ), + DeviceParser( + 'Android 4\\..*; *(M[12356789]|U[12368]|S[123])\\ ?(pro)?(?: Build|\\) AppleWebKit)', + None, + 'Pipo $1$2', + 'Pipo', + '$1$2', + ), + DeviceParser( + '; *(MOMO[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Ployer', + '$1', + ), + DeviceParser( + '; *(?:Polaroid[ _]|)((?:MIDC\\d{3,}|PMID\\d{2,}|PTAB\\d{3,})[^;/]*?)(\\/[^;/]*|)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Polaroid', + '$1', + ), + DeviceParser( + '; *(?:Polaroid )(Tablet)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Polaroid', + '$1', + ), + DeviceParser( + '; *(POMP)[ _\\-](.+?) *(?:Build|[;/\\)])', + None, + '$1 $2', + 'Pomp', + '$2', + ), + DeviceParser( + '; *(TB07STA|TB10STA|TB07FTA|TB10FTA)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Positivo', + '$1', + ), + DeviceParser( + '; *(?:Positivo |)((?:YPY|Ypy)[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Positivo', + '$1', + ), + DeviceParser( + '; *(MOB-[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'POV', + '$1', + ), + DeviceParser( + '; *POV[ _\\-]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'POV $1', + 'POV', + '$1', + ), + DeviceParser( + '; *((?:TAB-PLAYTAB|TAB-PROTAB|PROTAB|PlayTabPro|Mobii[ _\\-]|TAB-P)[^;/]*)(?: Build|\\) AppleWebKit)', + None, + 'POV $1', + 'POV', + '$1', + ), + DeviceParser( + '; *(?:Prestigio |)((?:PAP|PMP)\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Prestigio $1', + 'Prestigio', + '$1', + ), + DeviceParser( + '; *(PLT[0-9]{4}.*?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Proscan', + '$1', + ), + DeviceParser( + '; *(A2|A5|A8|A900)_?(Classic|)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Qmobile', + '$1 $2', + ), + DeviceParser( + '; *(Q[Mm]obile)_([^_]+)_([^_]+?)(?: Build|\\) AppleWebKit)', + None, + 'Qmobile $2 $3', + 'Qmobile', + '$2 $3', + ), + DeviceParser( + '; *(Q\\-?[Mm]obile)[_ ](A[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Qmobile $2', + 'Qmobile', + '$2', + ), + DeviceParser( + '; *(Q\\-Smart)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Qmobilevn', + '$2', + ), + DeviceParser( + '; *(Q\\-?[Mm]obile)[ _\\-](S[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Qmobilevn', + '$2', + ), + DeviceParser( + '; *(TA1013)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Quanta', + '$1', + ), + DeviceParser( + '; (RCT\\w+)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'RCA', + '$1', + ), + DeviceParser( + '; RCA (\\w+)(?: Build|\\) AppleWebKit)', + None, + 'RCA $1', + 'RCA', + '$1', + ), + DeviceParser( + '; *(RK\\d+),?(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Rockchip', + '$1', + ), + DeviceParser( + ' Build/(RK\\d+)', + None, + '$1', + 'Rockchip', + '$1', + ), + DeviceParser( + '; *(SAMSUNG |Samsung |)((?:Galaxy (?:Note II|S\\d)|GT-I9082|GT-I9205|GT-N7\\d{3}|SM-N9005)[^;/]*)\\/?[^;/]* Build/', + None, + 'Samsung $1$2', + 'Samsung', + '$2', + ), + DeviceParser( + '; *(Google |)(Nexus [Ss](?: 4G|)) Build/', + None, + 'Samsung $1$2', + 'Samsung', + '$2', + ), + DeviceParser( + '; *(SAMSUNG |Samsung )([^\\/]*)\\/[^ ]* Build/', + None, + 'Samsung $2', + 'Samsung', + '$2', + ), + DeviceParser( + '; *(Galaxy(?: Ace| Nexus| S ?II+|Nexus S| with MCR 1.2| Mini Plus 4G|)) Build/', + None, + 'Samsung $1', + 'Samsung', + '$1', + ), + DeviceParser( + '; *(SAMSUNG[ _\\-]|)(?:SAMSUNG[ _\\-])([^;/]+) Build', + None, + 'Samsung $2', + 'Samsung', + '$2', + ), + DeviceParser( + '; *(SAMSUNG-|)(GT\\-[BINPS]\\d{4}[^\\/]*)(\\/[^ ]*) Build', + None, + 'Samsung $1$2$3', + 'Samsung', + '$2', + ), + DeviceParser( + '(?:; *|^)((?:GT\\-[BIiNPS]\\d{4}|I9\\d{2}0[A-Za-z\\+]?\\b)[^;/\\)]*?)(?:Build|Linux|MIUI|[;/\\)])', + None, + 'Samsung $1', + 'Samsung', + '$1', + ), + DeviceParser( + '; (SAMSUNG-)([A-Za-z0-9\\-]+).* Build/', + None, + 'Samsung $1$2', + 'Samsung', + '$2', + ), + DeviceParser( + '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build', + None, + 'Samsung $1', + 'Samsung', + '$1', + ), + DeviceParser( + '; *((?:SC)\\-[A-Za-z0-9 ]+)(/?[^ ]*|)\\)', + None, + 'Samsung $1', + 'Samsung', + '$1', + ), + DeviceParser( + ' ((?:SCH)\\-[A-Za-z0-9 ]+)(/?[^ ]*|) Build', + None, + 'Samsung $1', + 'Samsung', + '$1', + ), + DeviceParser( + '; *(Behold ?(?:2|II)|YP\\-G[^;/]+|EK-GC100|SCL21|I9300) Build', + None, + 'Samsung $1', + 'Samsung', + '$1', + ), + DeviceParser( + '; *((?:SCH|SGH|SHV|SHW|SPH|SC|SM)\\-[A-Za-z0-9]{5,6})[\\)]', + None, + 'Samsung $1', + 'Samsung', + '$1', + ), + DeviceParser( + '; *(SH\\-?\\d\\d[^;/]+|SBM\\d[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Sharp', + '$1', + ), + DeviceParser( + '; *(SHARP[ -])([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Sharp', + '$2', + ), + DeviceParser( + '; *(SPX[_\\-]\\d[^;/]*)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Simvalley', + '$1', + ), + DeviceParser( + '; *(SX7\\-PEARL\\.GmbH)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Simvalley', + '$1', + ), + DeviceParser( + '; *(SP[T]?\\-\\d{2}[^;/]*)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Simvalley', + '$1', + ), + DeviceParser( + '; *(SK\\-.*?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'SKtelesys', + '$1', + ), + DeviceParser( + '; *(?:SKYTEX|SX)-([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Skytex', + '$1', + ), + DeviceParser( + '; *(IMAGINE [^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Skytex', + '$1', + ), + DeviceParser( + '; *(SmartQ) ?([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '; *(WF7C|WF10C|SBT[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Smartbitt', + '$1', + ), + DeviceParser( + '; *(SBM(?:003SH|005SH|006SH|007SH|102SH)) Build', + None, + '$1', + 'Sharp', + '$1', + ), + DeviceParser( + '; *(003P|101P|101P11C|102P) Build', + None, + '$1', + 'Panasonic', + '$1', + ), + DeviceParser( + '; *(00\\dZ) Build/', + None, + '$1', + 'ZTE', + '$1', + ), + DeviceParser( + '; HTC(X06HT) Build', + None, + '$1', + 'HTC', + '$1', + ), + DeviceParser( + '; *(001HT|X06HT) Build', + None, + '$1', + 'HTC', + '$1', + ), + DeviceParser( + '; *(201M) Build', + None, + '$1', + 'Motorola', + 'XT902', + ), + DeviceParser( + '; *(ST\\d{4}.*)Build/ST', + None, + 'Trekstor $1', + 'Trekstor', + '$1', + ), + DeviceParser( + '; *(ST\\d{4}.*?)(?: Build|\\) AppleWebKit)', + None, + 'Trekstor $1', + 'Trekstor', + '$1', + ), + DeviceParser( + '; *(Sony ?Ericsson ?)([^;/]+) Build', + None, + '$1$2', + 'SonyEricsson', + '$2', + ), + DeviceParser( + '; *((?:SK|ST|E|X|LT|MK|MT|WT)\\d{2}[a-z0-9]*(?:-o|)|R800i|U20i) Build', + None, + '$1', + 'SonyEricsson', + '$1', + ), + DeviceParser( + '; *(Xperia (?:A8|Arc|Acro|Active|Live with Walkman|Mini|Neo|Play|Pro|Ray|X\\d+)[^;/]*) Build', + 'i', + '$1', + 'SonyEricsson', + '$1', + ), + DeviceParser( + '; Sony (Tablet[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Sony $1', + 'Sony', + '$1', + ), + DeviceParser( + '; Sony ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Sony $1', + 'Sony', + '$1', + ), + DeviceParser( + '; *(Sony)([A-Za-z0-9\\-]+)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '; *(Xperia [^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Sony', + '$1', + ), + DeviceParser( + '; *(C(?:1[0-9]|2[0-9]|53|55|6[0-9])[0-9]{2}|D[25]\\d{3}|D6[56]\\d{2})(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Sony', + '$1', + ), + DeviceParser( + '; *(SGP\\d{3}|SGPT\\d{2})(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Sony', + '$1', + ), + DeviceParser( + '; *(NW-Z1000Series)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Sony', + '$1', + ), + DeviceParser( + 'PLAYSTATION 3', + None, + 'PlayStation 3', + 'Sony', + 'PlayStation 3', + ), + DeviceParser( + '(PlayStation (?:Portable|Vita|\\d+))', + None, + '$1', + 'Sony', + '$1', + ), + DeviceParser( + '; *((?:CSL_Spice|Spice|SPICE|CSL)[ _\\-]?|)([Mm][Ii])([ _\\-]|)(\\d{3}[^;/]*)(?: Build|\\) AppleWebKit)', + None, + '$1$2$3$4', + 'Spice', + 'Mi$4', + ), + DeviceParser( + '; *(Sprint )(.+?) *(?:Build|[;/])', + None, + '$1$2', + 'Sprint', + '$2', + ), + DeviceParser( + '\\b(Sprint)[: ]([^;,/ ]+)', + None, + '$1$2', + 'Sprint', + '$2', + ), + DeviceParser( + '; *(TAGI[ ]?)(MID) ?([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1$2$3', + 'Tagi', + '$2$3', + ), + DeviceParser( + '; *(Oyster500|Opal 800)(?: Build|\\) AppleWebKit)', + None, + 'Tecmobile $1', + 'Tecmobile', + '$1', + ), + DeviceParser( + '; *(TECNO[ _])([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Tecno', + '$2', + ), + DeviceParser( + '; *Android for (Telechips|Techvision) ([^ ]+) ', + 'i', + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '; *(T-Hub2)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Telstra', + '$1', + ), + DeviceParser( + '; *(PAD) ?(100[12])(?: Build|\\) AppleWebKit)', + None, + 'Terra $1$2', + 'Terra', + '$1$2', + ), + DeviceParser( + '; *(T[BM]-\\d{3}[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Texet', + '$1', + ), + DeviceParser( + '; *(tolino [^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Thalia', + '$1', + ), + DeviceParser( + '; *Build/.* (TOLINO_BROWSER)', + None, + '$1', + 'Thalia', + 'Tolino Shine', + ), + DeviceParser( + '; *(?:CJ[ -])?(ThL|THL)[ -]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Thl', + '$2', + ), + DeviceParser( + '; *(T100|T200|T5|W100|W200|W8s)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Thl', + '$1', + ), + DeviceParser( + '; *(T-Mobile[ _]G2[ _]Touch) Build', + None, + '$1', + 'HTC', + 'Hero', + ), + DeviceParser( + '; *(T-Mobile[ _]G2) Build', + None, + '$1', + 'HTC', + 'Desire Z', + ), + DeviceParser( + '; *(T-Mobile myTouch Q) Build', + None, + '$1', + 'Huawei', + 'U8730', + ), + DeviceParser( + '; *(T-Mobile myTouch) Build', + None, + '$1', + 'Huawei', + 'U8680', + ), + DeviceParser( + '; *(T-Mobile_Espresso) Build', + None, + '$1', + 'HTC', + 'Espresso', + ), + DeviceParser( + '; *(T-Mobile G1) Build', + None, + '$1', + 'HTC', + 'Dream', + ), + DeviceParser( + '\\b(T-Mobile ?|)(myTouch)[ _]?([34]G)[ _]?([^\\/]*) (?:Mozilla|Build)', + None, + '$1$2 $3 $4', + 'HTC', + '$2 $3 $4', + ), + DeviceParser( + '\\b(T-Mobile)_([^_]+)_(.*) Build', + None, + '$1 $2 $3', + 'Tmobile', + '$2 $3', + ), + DeviceParser( + '\\b(T-Mobile)[_ ]?(.*?)Build', + None, + '$1 $2', + 'Tmobile', + '$2', + ), + DeviceParser( + ' (ATP[0-9]{4})(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Tomtec', + '$1', + ), + DeviceParser( + ' *(TOOKY)[ _\\-]([^;/]+?) ?(?:Build|;)', + 'i', + '$1 $2', + 'Tooky', + '$2', + ), + DeviceParser( + '\\b(TOSHIBA_AC_AND_AZ|TOSHIBA_FOLIO_AND_A|FOLIO_AND_A)', + None, + '$1', + 'Toshiba', + 'Folio 100', + ), + DeviceParser( + '; *([Ff]olio ?100)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Toshiba', + 'Folio 100', + ), + DeviceParser( + '; *(AT[0-9]{2,3}(?:\\-A|LE\\-A|PE\\-A|SE|a|)|AT7-A|AT1S0|Hikari-iFrame/WDPF-[^;/]+|THRiVE|Thrive)(?: Build|\\) AppleWebKit)', + None, + 'Toshiba $1', + 'Toshiba', + '$1', + ), + DeviceParser( + '; *(TM-MID\\d+[^;/]+|TOUCHMATE|MID-750)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Touchmate', + '$1', + ), + DeviceParser( + '; *(TM-SM\\d+[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Touchmate', + '$1', + ), + DeviceParser( + '; *(A10 [Bb]asic2?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Treq', + '$1', + ), + DeviceParser( + '; *(TREQ[ _\\-])([^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + '$1$2', + 'Treq', + '$2', + ), + DeviceParser( + '; *(X-?5|X-?3)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Umeox', + '$1', + ), + DeviceParser( + '; *(A502\\+?|A936|A603|X1|X2)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Umeox', + '$1', + ), + DeviceParser( + '(TOUCH(?:TAB|PAD).+?)(?: Build|\\) AppleWebKit)', + 'i', + 'Versus $1', + 'Versus', + '$1', + ), + DeviceParser( + '(VERTU) ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'Vertu', + '$2', + ), + DeviceParser( + '; *(Videocon)[ _\\-]([^;/]+?) *(?:Build|;)', + None, + '$1 $2', + 'Videocon', + '$2', + ), + DeviceParser( + ' (VT\\d{2}[A-Za-z]*)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Videocon', + '$1', + ), + DeviceParser( + '; *((?:ViewPad|ViewPhone|VSD)[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Viewsonic', + '$1', + ), + DeviceParser( + '; *(ViewSonic-)([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'Viewsonic', + '$2', + ), + DeviceParser( + '; *(GTablet.*?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Viewsonic', + '$1', + ), + DeviceParser( + '; *([Vv]ivo)[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'vivo', + '$2', + ), + DeviceParser( + '(Vodafone) (.*?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '; *(?:Walton[ _\\-]|)(Primo[ _\\-][^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + 'Walton $1', + 'Walton', + '$1', + ), + DeviceParser( + '; *(?:WIKO[ \\-]|)(CINK\\+?|BARRY|BLOOM|DARKFULL|DARKMOON|DARKNIGHT|DARKSIDE|FIZZ|HIGHWAY|IGGY|OZZY|RAINBOW|STAIRWAY|SUBLIM|WAX|CINK [^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + 'Wiko $1', + 'Wiko', + '$1', + ), + DeviceParser( + '; *WellcoM-([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Wellcom $1', + 'Wellcom', + '$1', + ), + DeviceParser( + '(?:(WeTab)-Browser|; (wetab) Build)', + None, + '$1', + 'WeTab', + 'WeTab', + ), + DeviceParser( + '; *(AT-AS[^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Wolfgang $1', + 'Wolfgang', + '$1', + ), + DeviceParser( + '; *(?:Woxter|Wxt) ([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'Woxter $1', + 'Woxter', + '$1', + ), + DeviceParser( + '; *(?:Xenta |Luna |)(TAB[234][0-9]{2}|TAB0[78]-\\d{3}|TAB0?9-\\d{3}|TAB1[03]-\\d{3}|SMP\\d{2}-\\d{3})(?: Build|\\) AppleWebKit)', + None, + 'Yarvik $1', + 'Yarvik', + '$1', + ), + DeviceParser( + '; *([A-Z]{2,4})(M\\d{3,}[A-Z]{2})([^;\\)\\/]*)(?: Build|[;\\)])', + None, + 'Yifang $1$2$3', + 'Yifang', + '$2', + ), + DeviceParser( + '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/]*) (Build|MIUI)/', + None, + 'XiaoMi $1', + 'XiaoMi', + '$1', + ), + DeviceParser( + '; *((Mi|MI|HM|MI-ONE|Redmi)[ -](NOTE |Note |)[^;/\\)]*)', + None, + 'XiaoMi $1', + 'XiaoMi', + '$1', + ), + DeviceParser( + '; *(MIX) (Build|MIUI)/', + None, + 'XiaoMi $1', + 'XiaoMi', + '$1', + ), + DeviceParser( + '; *((MIX) ([^;/]*)) (Build|MIUI)/', + None, + 'XiaoMi $1', + 'XiaoMi', + '$1', + ), + DeviceParser( + '; *XOLO[ _]([^;/]*tab.*)(?: Build|\\) AppleWebKit)', + 'i', + 'Xolo $1', + 'Xolo', + '$1', + ), + DeviceParser( + '; *XOLO[ _]([^;/]+?)(?: Build|\\) AppleWebKit)', + 'i', + 'Xolo $1', + 'Xolo', + '$1', + ), + DeviceParser( + '; *(q\\d0{2,3}[a-z]?)(?: Build|\\) AppleWebKit)', + 'i', + 'Xolo $1', + 'Xolo', + '$1', + ), + DeviceParser( + '; *(PAD ?[79]\\d+[^;/]*|TelePAD\\d+[^;/])(?: Build|\\) AppleWebKit)', + None, + 'Xoro $1', + 'Xoro', + '$1', + ), + DeviceParser( + '; *(?:(?:ZOPO|Zopo)[ _]([^;/]+?)|(ZP ?(?:\\d{2}[^;/]+|C2))|(C[2379]))(?: Build|\\) AppleWebKit)', + None, + '$1$2$3', + 'Zopo', + '$1$2$3', + ), + DeviceParser( + '; *(ZiiLABS) (Zii[^;/]*)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'ZiiLabs', + '$2', + ), + DeviceParser( + '; *(Zii)_([^;/]*)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'ZiiLabs', + '$2', + ), + DeviceParser( + '; *(ARIZONA|(?:ATLAS|Atlas) W|D930|Grand (?:[SX][^;]*?|Era|Memo[^;]*?)|JOE|(?:Kis|KIS)\\b[^;]*?|Libra|Light [^;]*?|N8[056][01]|N850L|N8000|N9[15]\\d{2}|N9810|NX501|Optik|(?:Vip )Racer[^;]*?|RacerII|RACERII|San Francisco[^;]*?|V9[AC]|V55|V881|Z[679][0-9]{2}[A-z]?)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'ZTE', + '$1', + ), + DeviceParser( + '; *([A-Z]\\d+)_USA_[^;]*(?: Build|\\) AppleWebKit)', + None, + '$1', + 'ZTE', + '$1', + ), + DeviceParser( + '; *(SmartTab\\d+)[^;]*(?: Build|\\) AppleWebKit)', + None, + '$1', + 'ZTE', + '$1', + ), + DeviceParser( + '; *(?:Blade|BLADE|ZTE-BLADE)([^;/]*)(?: Build|\\) AppleWebKit)', + None, + 'ZTE Blade$1', + 'ZTE', + 'Blade$1', + ), + DeviceParser( + '; *(?:Skate|SKATE|ZTE-SKATE)([^;/]*)(?: Build|\\) AppleWebKit)', + None, + 'ZTE Skate$1', + 'ZTE', + 'Skate$1', + ), + DeviceParser( + '; *(Orange |Optimus )(Monte Carlo|San Francisco)(?: Build|\\) AppleWebKit)', + None, + '$1$2', + 'ZTE', + '$1$2', + ), + DeviceParser( + '; *(?:ZXY-ZTE_|ZTE\\-U |ZTE[\\- _]|ZTE-C[_ ])([^;/]+?)(?: Build|\\) AppleWebKit)', + None, + 'ZTE $1', + 'ZTE', + '$1', + ), + DeviceParser( + '; (BASE) (lutea|Lutea 2|Tab[^;]*?)(?: Build|\\) AppleWebKit)', + None, + '$1 $2', + 'ZTE', + '$1 $2', + ), + DeviceParser( + '; (Avea inTouch 2|soft stone|tmn smart a7|Movistar[ _]Link)(?: Build|\\) AppleWebKit)', + 'i', + '$1', + 'ZTE', + '$1', + ), + DeviceParser( + '; *(vp9plus)\\)', + None, + '$1', + 'ZTE', + '$1', + ), + DeviceParser( + '; ?(Cloud[ _]Z5|z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900)(?: Build|\\) AppleWebKit)', + None, + '$1', + 'Zync', + '$1', + ), + DeviceParser( + '; ?(KFOT|Kindle Fire) Build\\b', + None, + 'Kindle Fire', + 'Amazon', + 'Kindle Fire', + ), + DeviceParser( + '; ?(KFOTE|Amazon Kindle Fire2) Build\\b', + None, + 'Kindle Fire 2', + 'Amazon', + 'Kindle Fire 2', + ), + DeviceParser( + '; ?(KFTT) Build\\b', + None, + 'Kindle Fire HD', + 'Amazon', + 'Kindle Fire HD 7"', + ), + DeviceParser( + '; ?(KFJWI) Build\\b', + None, + 'Kindle Fire HD 8.9" WiFi', + 'Amazon', + 'Kindle Fire HD 8.9" WiFi', + ), + DeviceParser( + '; ?(KFJWA) Build\\b', + None, + 'Kindle Fire HD 8.9" 4G', + 'Amazon', + 'Kindle Fire HD 8.9" 4G', + ), + DeviceParser( + '; ?(KFSOWI) Build\\b', + None, + 'Kindle Fire HD 7" WiFi', + 'Amazon', + 'Kindle Fire HD 7" WiFi', + ), + DeviceParser( + '; ?(KFTHWI) Build\\b', + None, + 'Kindle Fire HDX 7" WiFi', + 'Amazon', + 'Kindle Fire HDX 7" WiFi', + ), + DeviceParser( + '; ?(KFTHWA) Build\\b', + None, + 'Kindle Fire HDX 7" 4G', + 'Amazon', + 'Kindle Fire HDX 7" 4G', + ), + DeviceParser( + '; ?(KFAPWI) Build\\b', + None, + 'Kindle Fire HDX 8.9" WiFi', + 'Amazon', + 'Kindle Fire HDX 8.9" WiFi', + ), + DeviceParser( + '; ?(KFAPWA) Build\\b', + None, + 'Kindle Fire HDX 8.9" 4G', + 'Amazon', + 'Kindle Fire HDX 8.9" 4G', + ), + DeviceParser( + '; ?Amazon ([^;/]+) Build\\b', + None, + '$1', + 'Amazon', + '$1', + ), + DeviceParser( + '; ?(Kindle) Build\\b', + None, + 'Kindle', + 'Amazon', + 'Kindle', + ), + DeviceParser( + '; ?(Silk)/(\\d+)\\.(\\d+)(?:\\.([0-9\\-]+)|) Build\\b', + None, + 'Kindle Fire', + 'Amazon', + 'Kindle Fire$2', + ), + DeviceParser( + ' (Kindle)/(\\d+\\.\\d+)', + None, + 'Kindle', + 'Amazon', + '$1 $2', + ), + DeviceParser( + ' (Silk|Kindle)/(\\d+)\\.', + None, + 'Kindle', + 'Amazon', + 'Kindle', + ), + DeviceParser( + '(sprd)\\-([^/]+)/', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '; *(H\\d{2}00\\+?) Build', + None, + '$1', + 'Hero', + '$1', + ), + DeviceParser( + '; *(iphone|iPhone5) Build/', + None, + 'Xianghe $1', + 'Xianghe', + '$1', + ), + DeviceParser( + '; *(e\\d{4}[a-z]?_?v\\d+|v89_[^;/]+)[^;/]+ Build/', + None, + 'Xianghe $1', + 'Xianghe', + '$1', + ), + DeviceParser( + '\\bUSCC[_\\-]?([^ ;/\\)]+)', + None, + '$1', + 'Cellular', + '$1', + ), + DeviceParser( + 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:ALCATEL)[^;]*; *([^;,\\)]+)', + None, + 'Alcatel $1', + 'Alcatel', + '$1', + ), + DeviceParser( + 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:ASUS|Asus)[^;]*; *([^;,\\)]+)', + None, + 'Asus $1', + 'Asus', + '$1', + ), + DeviceParser( + 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:DELL|Dell)[^;]*; *([^;,\\)]+)', + None, + 'Dell $1', + 'Dell', + '$1', + ), + DeviceParser( + 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:HTC|Htc|HTC_blocked[^;]*)[^;]*; *(?:HTC|)([^;,\\)]+)', + None, + 'HTC $1', + 'HTC', + '$1', + ), + DeviceParser( + 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:HUAWEI)[^;]*; *(?:HUAWEI |)([^;,\\)]+)', + None, + 'Huawei $1', + 'Huawei', + '$1', + ), + DeviceParser( + 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:LG|Lg)[^;]*; *(?:LG[ \\-]|)([^;,\\)]+)', + None, + 'LG $1', + 'LG', + '$1', + ), + DeviceParser( + 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:rv:11; |)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)(\\d{3,10}[^;\\)]*)', + None, + 'Lumia $1', + 'Nokia', + 'Lumia $1', + ), + DeviceParser( + 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(RM-\\d{3,})', + None, + 'Nokia $1', + 'Nokia', + '$1', + ), + DeviceParser( + '(?:Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)]|WPDesktop;) ?(?:ARM; ?Touch; ?|Touch; ?|)(?:NOKIA|Nokia)[^;]*; *(?:NOKIA ?|Nokia ?|LUMIA ?|[Ll]umia ?|)([^;\\)]+)', + None, + 'Nokia $1', + 'Nokia', + '$1', + ), + DeviceParser( + 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|)(?:Microsoft(?: Corporation|))[^;]*; *([^;,\\)]+)', + None, + 'Microsoft $1', + 'Microsoft', + '$1', + ), + DeviceParser( + 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:SAMSUNG)[^;]*; *(?:SAMSUNG |)([^;,\\.\\)]+)', + None, + 'Samsung $1', + 'Samsung', + '$1', + ), + DeviceParser( + 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)(?:TOSHIBA|FujitsuToshibaMobileCommun)[^;]*; *([^;,\\)]+)', + None, + 'Toshiba $1', + 'Toshiba', + '$1', + ), + DeviceParser( + 'Windows Phone [^;]+; .*?IEMobile/[^;\\)]+[;\\)] ?(?:ARM; ?Touch; ?|Touch; ?|WpsLondonTest; ?|)([^;]+); *([^;,\\)]+)', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '(?:^|; )SAMSUNG\\-([A-Za-z0-9\\-]+).* Bada/', + None, + 'Samsung $1', + 'Samsung', + '$1', + ), + DeviceParser( + '\\(Mobile; ALCATEL ?(One|ONE) ?(Touch|TOUCH) ?([^;/]+?)(?:/[^;]+|); rv:[^\\)]+\\) Gecko/[^\\/]+ Firefox/', + None, + 'Alcatel $1 $2 $3', + 'Alcatel', + 'One Touch $3', + ), + DeviceParser( + '\\(Mobile; (?:ZTE([^;]+)|(OpenC)); rv:[^\\)]+\\) Gecko/[^\\/]+ Firefox/', + None, + 'ZTE $1$2', + 'ZTE', + '$1$2', + ), + DeviceParser( + '\\(Mobile; ALCATEL([A-Za-z0-9\\-]+); rv:[^\\)]+\\) Gecko/[^\\/]+ Firefox/[^\\/]+ KaiOS/', + None, + 'Alcatel $1', + 'Alcatel', + '$1', + ), + DeviceParser( + '\\(Mobile; LYF\\/([A-Za-z0-9\\-]+)\\/.+;.+rv:[^\\)]+\\) Gecko/[^\\/]+ Firefox/[^\\/]+ KAIOS/', + None, + 'LYF $1', + 'LYF', + '$1', + ), + DeviceParser( + '\\(Mobile; Nokia_([A-Za-z0-9\\-]+)_.+; rv:[^\\)]+\\) Gecko/[^\\/]+ Firefox/[^\\/]+ KAIOS/', + None, + 'Nokia $1', + 'Nokia', + '$1', + ), + DeviceParser( + 'Nokia(N[0-9]+)([A-Za-z_\\-][A-Za-z0-9_\\-]*)', + None, + 'Nokia $1', + 'Nokia', + '$1$2', + ), + DeviceParser( + '(?:NOKIA|Nokia)(?:\\-| *)(?:([A-Za-z0-9]+)\\-[0-9a-f]{32}|([A-Za-z0-9\\-]+)(?:UCBrowser)|([A-Za-z0-9\\-]+))', + None, + 'Nokia $1$2$3', + 'Nokia', + '$1$2$3', + ), + DeviceParser( + 'Lumia ([A-Za-z0-9\\-]+)', + None, + 'Lumia $1', + 'Nokia', + 'Lumia $1', + ), + DeviceParser( + '\\(Symbian; U; S60 V5; [A-z]{2}\\-[A-z]{2}; (SonyEricsson|Samsung|Nokia|LG)([^;/]+?)\\)', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '\\(Symbian(?:/3|); U; ([^;]+);', + None, + 'Nokia $1', + 'Nokia', + '$1', + ), + DeviceParser( + 'BB10; ([A-Za-z0-9\\- ]+)\\)', + None, + 'BlackBerry $1', + 'BlackBerry', + '$1', + ), + DeviceParser( + 'Play[Bb]ook.+RIM Tablet OS', + None, + 'BlackBerry Playbook', + 'BlackBerry', + 'Playbook', + ), + DeviceParser( + 'Black[Bb]erry ([0-9]+);', + None, + 'BlackBerry $1', + 'BlackBerry', + '$1', + ), + DeviceParser( + 'Black[Bb]erry([0-9]+)', + None, + 'BlackBerry $1', + 'BlackBerry', + '$1', + ), + DeviceParser( + 'Black[Bb]erry;', + None, + 'BlackBerry', + 'BlackBerry', + None, + ), + DeviceParser( + '(Pre|Pixi)/\\d+\\.\\d+', + None, + 'Palm $1', + 'Palm', + '$1', + ), + DeviceParser( + 'Palm([0-9]+)', + None, + 'Palm $1', + 'Palm', + '$1', + ), + DeviceParser( + 'Treo([A-Za-z0-9]+)', + None, + 'Palm Treo $1', + 'Palm', + 'Treo $1', + ), + DeviceParser( + 'webOS.*(P160U(?:NA|))/(\\d+).(\\d+)', + None, + 'HP Veer', + 'HP', + 'Veer', + ), + DeviceParser( + '(Touch[Pp]ad)/\\d+\\.\\d+', + None, + 'HP TouchPad', + 'HP', + 'TouchPad', + ), + DeviceParser( + 'HPiPAQ([A-Za-z0-9]+)/\\d+.\\d+', + None, + 'HP iPAQ $1', + 'HP', + 'iPAQ $1', + ), + DeviceParser( + 'PDA; (PalmOS)/sony/model ([a-z]+)/Revision', + None, + '$1', + 'Sony', + '$1 $2', + ), + DeviceParser( + '(Apple\\s?TV)', + None, + 'AppleTV', + 'Apple', + 'AppleTV', + ), + DeviceParser( + '(QtCarBrowser)', + None, + 'Tesla Model S', + 'Tesla', + 'Model S', + ), + DeviceParser( + '(iPhone|iPad|iPod)(\\d+,\\d+)', + None, + '$1', + 'Apple', + '$1$2', + ), + DeviceParser( + '(iPad)(?:;| Simulator;)', + None, + '$1', + 'Apple', + '$1', + ), + DeviceParser( + '(iPod)(?:;| touch;| Simulator;)', + None, + '$1', + 'Apple', + '$1', + ), + DeviceParser( + '(iPhone)(?:;| Simulator;)', + None, + '$1', + 'Apple', + '$1', + ), + DeviceParser( + '(Watch)(\\d+,\\d+)', + None, + 'Apple $1', + 'Apple', + '$1$2', + ), + DeviceParser( + '(Apple Watch)(?:;| Simulator;)', + None, + '$1', + 'Apple', + '$1', + ), + DeviceParser( + '(HomePod)(?:;| Simulator;)', + None, + '$1', + 'Apple', + '$1', + ), + DeviceParser( + 'iPhone', + None, + 'iPhone', + 'Apple', + 'iPhone', + ), + DeviceParser( + 'CFNetwork/.* Darwin/\\d.*\\(((?:Mac|iMac|PowerMac|PowerBook)[^\\d]*)(\\d+)(?:,|%2C)(\\d+)', + None, + '$1$2,$3', + 'Apple', + '$1$2,$3', + ), + DeviceParser( + 'CFNetwork/.* Darwin/\\d+\\.\\d+\\.\\d+ \\(x86_64\\)', + None, + 'Mac', + 'Apple', + 'Mac', + ), + DeviceParser( + 'CFNetwork/.* Darwin/\\d', + None, + 'iOS-Device', + 'Apple', + 'iOS-Device', + ), + DeviceParser( + 'Outlook-(iOS)/\\d+\\.\\d+\\.prod\\.iphone', + None, + 'iPhone', + 'Apple', + 'iPhone', + ), + DeviceParser( + 'acer_([A-Za-z0-9]+)_', + None, + 'Acer $1', + 'Acer', + '$1', + ), + DeviceParser( + '(?:ALCATEL|Alcatel)-([A-Za-z0-9\\-]+)', + None, + 'Alcatel $1', + 'Alcatel', + '$1', + ), + DeviceParser( + '(?:Amoi|AMOI)\\-([A-Za-z0-9]+)', + None, + 'Amoi $1', + 'Amoi', + '$1', + ), + DeviceParser( + '(?:; |\\/|^)((?:Transformer (?:Pad|Prime) |Transformer |PadFone[ _]?)[A-Za-z0-9]*)', + None, + 'Asus $1', + 'Asus', + '$1', + ), + DeviceParser( + '(?:asus.*?ASUS|Asus|ASUS|asus)[\\- ;]*((?:Transformer (?:Pad|Prime) |Transformer |Padfone |Nexus[ _]|)[A-Za-z0-9]+)', + None, + 'Asus $1', + 'Asus', + '$1', + ), + DeviceParser( + '(?:ASUS)_([A-Za-z0-9\\-]+)', + None, + 'Asus $1', + 'Asus', + '$1', + ), + DeviceParser( + '\\bBIRD[ \\-\\.]([A-Za-z0-9]+)', + None, + 'Bird $1', + 'Bird', + '$1', + ), + DeviceParser( + '\\bDell ([A-Za-z0-9]+)', + None, + 'Dell $1', + 'Dell', + '$1', + ), + DeviceParser( + 'DoCoMo/2\\.0 ([A-Za-z0-9]+)', + None, + 'DoCoMo $1', + 'DoCoMo', + '$1', + ), + DeviceParser( + '([A-Za-z0-9]+)_W;FOMA', + None, + 'DoCoMo $1', + 'DoCoMo', + '$1', + ), + DeviceParser( + '([A-Za-z0-9]+);FOMA', + None, + 'DoCoMo $1', + 'DoCoMo', + '$1', + ), + DeviceParser( + '\\b(?:HTC/|HTC/[a-z0-9]+/|)HTC[ _\\-;]? *(.*?)(?:-?Mozilla|fingerPrint|[;/\\(\\)]|$)', + None, + 'HTC $1', + 'HTC', + '$1', + ), + DeviceParser( + 'Huawei([A-Za-z0-9]+)', + None, + 'Huawei $1', + 'Huawei', + '$1', + ), + DeviceParser( + 'HUAWEI-([A-Za-z0-9]+)', + None, + 'Huawei $1', + 'Huawei', + '$1', + ), + DeviceParser( + 'HUAWEI ([A-Za-z0-9\\-]+)', + None, + 'Huawei $1', + 'Huawei', + '$1', + ), + DeviceParser( + 'vodafone([A-Za-z0-9]+)', + None, + 'Huawei Vodafone $1', + 'Huawei', + 'Vodafone $1', + ), + DeviceParser( + 'i\\-mate ([A-Za-z0-9]+)', + None, + 'i-mate $1', + 'i-mate', + '$1', + ), + DeviceParser( + 'Kyocera\\-([A-Za-z0-9]+)', + None, + 'Kyocera $1', + 'Kyocera', + '$1', + ), + DeviceParser( + 'KWC\\-([A-Za-z0-9]+)', + None, + 'Kyocera $1', + 'Kyocera', + '$1', + ), + DeviceParser( + 'Lenovo[_\\-]([A-Za-z0-9]+)', + None, + 'Lenovo $1', + 'Lenovo', + '$1', + ), + DeviceParser( + '(HbbTV)/[0-9]+\\.[0-9]+\\.[0-9]+ \\( ?;(LG)E ?;([^;]{0,30})', + None, + '$1', + '$2', + '$3', + ), + DeviceParser( + '(HbbTV)/1\\.1\\.1.*CE-HTML/1\\.\\d;(Vendor/|)(THOM[^;]*?)[;\\s].{0,30}(LF[^;]+);?', + None, + '$1', + 'Thomson', + '$4', + ), + DeviceParser( + '(HbbTV)(?:/1\\.1\\.1|) ?(?: \\(;;;;;\\)|); *CE-HTML(?:/1\\.\\d|); *([^ ]+) ([^;]+);', + None, + '$1', + '$2', + '$3', + ), + DeviceParser( + '(HbbTV)/1\\.1\\.1 \\(;;;;;\\) Maple_2011', + None, + '$1', + 'Samsung', + None, + ), + DeviceParser( + '(HbbTV)/[0-9]+\\.[0-9]+\\.[0-9]+ \\([^;]{0,30}; ?(?:CUS:([^;]*)|([^;]+)) ?; ?([^;]{0,30})', + None, + '$1', + '$2$3', + '$4', + ), + DeviceParser( + '(HbbTV)/[0-9]+\\.[0-9]+\\.[0-9]+', + None, + '$1', + None, + None, + ), + DeviceParser( + 'LGE; (?:Media\\/|)([^;]*);[^;]*;[^;]*;?\\); "?LG NetCast(\\.TV|\\.Media|)-\\d+', + None, + 'NetCast$2', + 'LG', + '$1', + ), + DeviceParser( + 'InettvBrowser/[0-9]+\\.[0-9A-Z]+ \\([^;]*;(Sony)([^;]*);[^;]*;[^\\)]*\\)', + None, + 'Inettv', + '$1', + '$2', + ), + DeviceParser( + 'InettvBrowser/[0-9]+\\.[0-9A-Z]+ \\([^;]*;([^;]*);[^;]*;[^\\)]*\\)', + None, + 'Inettv', + 'Generic_Inettv', + '$1', + ), + DeviceParser( + '(?:InettvBrowser|TSBNetTV|NETTV|HBBTV)', + None, + 'Inettv', + 'Generic_Inettv', + None, + ), + DeviceParser( + 'Series60/\\d\\.\\d (LG)[\\-]?([A-Za-z0-9 \\-]+)', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + '\\b(?:LGE[ \\-]LG\\-(?:AX|)|LGE |LGE?-LG|LGE?[ \\-]|LG[ /\\-]|lg[\\-])([A-Za-z0-9]+)\\b', + None, + 'LG $1', + 'LG', + '$1', + ), + DeviceParser( + '(?:^LG[\\-]?|^LGE[\\-/]?)([A-Za-z]+[0-9]+[A-Za-z]*)', + None, + 'LG $1', + 'LG', + '$1', + ), + DeviceParser( + '^LG([0-9]+[A-Za-z]*)', + None, + 'LG $1', + 'LG', + '$1', + ), + DeviceParser( + '(KIN\\.[^ ]+) (\\d+)\\.(\\d+)', + None, + 'Microsoft $1', + 'Microsoft', + '$1', + ), + DeviceParser( + '(?:MSIE|XBMC).*\\b(Xbox)\\b', + None, + '$1', + 'Microsoft', + '$1', + ), + DeviceParser( + '; ARM; Trident/6\\.0; Touch[\\);]', + None, + 'Microsoft Surface RT', + 'Microsoft', + 'Surface RT', + ), + DeviceParser( + 'Motorola\\-([A-Za-z0-9]+)', + None, + 'Motorola $1', + 'Motorola', + '$1', + ), + DeviceParser( + 'MOTO\\-([A-Za-z0-9]+)', + None, + 'Motorola $1', + 'Motorola', + '$1', + ), + DeviceParser( + 'MOT\\-([A-z0-9][A-z0-9\\-]*)', + None, + 'Motorola $1', + 'Motorola', + '$1', + ), + DeviceParser( + 'Nintendo WiiU', + None, + 'Nintendo Wii U', + 'Nintendo', + 'Wii U', + ), + DeviceParser( + 'Nintendo (DS|3DS|DSi|Wii);', + None, + 'Nintendo $1', + 'Nintendo', + '$1', + ), + DeviceParser( + '(?:Pantech|PANTECH)[ _-]?([A-Za-z0-9\\-]+)', + None, + 'Pantech $1', + 'Pantech', + '$1', + ), + DeviceParser( + 'Philips([A-Za-z0-9]+)', + None, + 'Philips $1', + 'Philips', + '$1', + ), + DeviceParser( + 'Philips ([A-Za-z0-9]+)', + None, + 'Philips $1', + 'Philips', + '$1', + ), + DeviceParser( + '(SMART-TV); .* Tizen ', + None, + 'Samsung $1', + 'Samsung', + '$1', + ), + DeviceParser( + 'SymbianOS/9\\.\\d.* Samsung[/\\-]([A-Za-z0-9 \\-]+)', + None, + 'Samsung $1', + 'Samsung', + '$1', + ), + DeviceParser( + '(Samsung)(SGH)(i[0-9]+)', + None, + '$1 $2$3', + '$1', + '$2-$3', + ), + DeviceParser( + 'SAMSUNG-ANDROID-MMS/([^;/]+)', + None, + '$1', + 'Samsung', + '$1', + ), + DeviceParser( + 'SAMSUNG(?:; |[ -/])([A-Za-z0-9\\-]+)', + 'i', + 'Samsung $1', + 'Samsung', + '$1', + ), + DeviceParser( + '(Dreamcast)', + None, + 'Sega $1', + 'Sega', + '$1', + ), + DeviceParser( + '^SIE-([A-Za-z0-9]+)', + None, + 'Siemens $1', + 'Siemens', + '$1', + ), + DeviceParser( + 'Softbank/[12]\\.0/([A-Za-z0-9]+)', + None, + 'Softbank $1', + 'Softbank', + '$1', + ), + DeviceParser( + 'SonyEricsson ?([A-Za-z0-9\\-]+)', + None, + 'Ericsson $1', + 'SonyEricsson', + '$1', + ), + DeviceParser( + 'Android [^;]+; ([^ ]+) (Sony)/', + None, + '$2 $1', + '$2', + '$1', + ), + DeviceParser( + '(Sony)(?:BDP\\/|\\/|)([^ /;\\)]+)[ /;\\)]', + None, + '$1 $2', + '$1', + '$2', + ), + DeviceParser( + 'Puffin/[\\d\\.]+IT', + None, + 'iPad', + 'Apple', + 'iPad', + ), + DeviceParser( + 'Puffin/[\\d\\.]+IP', + None, + 'iPhone', + 'Apple', + 'iPhone', + ), + DeviceParser( + 'Puffin/[\\d\\.]+AT', + None, + 'Generic Tablet', + 'Generic', + 'Tablet', + ), + DeviceParser( + 'Puffin/[\\d\\.]+AP', + None, + 'Generic Smartphone', + 'Generic', + 'Smartphone', + ), + DeviceParser( + 'Android[\\- ][\\d]+\\.[\\d]+; [A-Za-z]{2}\\-[A-Za-z]{0,2}; WOWMobile (.+)( Build[/ ]|\\))', + None, + None, + 'Generic_Android', + '$1', + ), + DeviceParser( + 'Android[\\- ][\\d]+\\.[\\d]+\\-update1; [A-Za-z]{2}\\-[A-Za-z]{0,2} *; *(.+?)( Build[/ ]|\\))', + None, + None, + 'Generic_Android', + '$1', + ), + DeviceParser( + 'Android[\\- ][\\d]+(?:\\.[\\d]+)(?:\\.[\\d]+|); *[A-Za-z]{2}[_\\-][A-Za-z]{0,2}\\-? *; *(.+?)( Build[/ ]|\\))', + None, + None, + 'Generic_Android', + '$1', + ), + DeviceParser( + 'Android[\\- ][\\d]+(?:\\.[\\d]+)(?:\\.[\\d]+|); *[A-Za-z]{0,2}\\- *; *(.+?)( Build[/ ]|\\))', + None, + None, + 'Generic_Android', + '$1', + ), + DeviceParser( + 'Android[\\- ][\\d]+(?:\\.[\\d]+)(?:\\.[\\d]+|); *[a-z]{0,2}[_\\-]?[A-Za-z]{0,2};?( Build[/ ]|\\))', + None, + 'Generic Smartphone', + 'Generic', + 'Smartphone', + ), + DeviceParser( + 'Android[\\- ][\\d]+(?:\\.[\\d]+)(?:\\.[\\d]+|); *\\-?[A-Za-z]{2}; *(.+?)( Build[/ ]|\\))', + None, + None, + 'Generic_Android', + '$1', + ), + DeviceParser( + 'Android \\d+?(?:\\.\\d+|)(?:\\.\\d+|); ([^;]+?)(?: Build|\\) AppleWebKit).+? Mobile Safari', + None, + None, + 'Generic_Android', + '$1', + ), + DeviceParser( + 'Android \\d+?(?:\\.\\d+|)(?:\\.\\d+|); ([^;]+?)(?: Build|\\) AppleWebKit).+? Safari', + None, + None, + 'Generic_Android_Tablet', + '$1', + ), + DeviceParser( + 'Android \\d+?(?:\\.\\d+|)(?:\\.\\d+|); ([^;]+?)(?: Build|\\))', + None, + None, + 'Generic_Android', + '$1', + ), + DeviceParser( + '(GoogleTV)', + None, + None, + 'Generic_Inettv', + '$1', + ), + DeviceParser( + '(WebTV)/\\d+.\\d+', + None, + None, + 'Generic_Inettv', + '$1', + ), + DeviceParser( + '^(Roku)/DVP-\\d+\\.\\d+', + None, + None, + 'Generic_Inettv', + '$1', + ), + DeviceParser( + '(Android 3\\.\\d|Opera Tablet|Tablet; .+Firefox/|Android.*(?:Tab|Pad))', + 'i', + 'Generic Tablet', + 'Generic', + 'Tablet', + ), + DeviceParser( + '(Symbian|\\bS60(Version|V\\d)|\\bS60\\b|\\((Series 60|Windows Mobile|Palm OS|Bada); Opera Mini|Windows CE|Opera Mobi|BREW|Brew|Mobile; .+Firefox/|iPhone OS|Android|MobileSafari|Windows *Phone|\\(webOS/|PalmOS)', + None, + 'Generic Smartphone', + 'Generic', + 'Smartphone', + ), + DeviceParser( + '(hiptop|avantgo|plucker|xiino|blazer|elaine)', + 'i', + 'Generic Smartphone', + 'Generic', + 'Smartphone', + ), + DeviceParser( + '(bot|BUbiNG|zao|borg|DBot|oegp|silk|Xenu|zeal|^NING|CCBot|crawl|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|^Java/|^JNLP/|Daumoa|Daum|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|spider|msnbot|msrbot|vortex|^vortex|crawler|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|bingbot|BingPreview|openbot|gigabot|furlbot|polybot|seekbot|^voyager|archiver|Icarus6j|mogimogi|Netvibes|blitzbot|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|SeznamBot|ProoXiBot|wsr\\-agent|Squrl Java|EtaoSpider|PaperLiBot|SputnikBot|A6\\-Indexer|netresearch|searchsight|baiduspider|YisouSpider|ICC\\-Crawler|http%20client|Python-urllib|dataparksearch|converacrawler|Screaming Frog|AppEngine-Google|YahooCacheSystem|fast\\-webcrawler|Sogou Pic Spider|semanticdiscovery|Innovazion Crawler|facebookexternalhit|Google.*/\\+/web/snippet|Google-HTTP-Java-Client|BlogBridge|IlTrovatore-Setaccio|InternetArchive|GomezAgent|WebThumbnail|heritrix|NewsGator|PagePeeker|Reaper|ZooShot|holmes|NL-Crawler|Pingdom|StatusCake|WhatsApp|masscan|Google Web Preview|Qwantify|Yeti|OgScrper)', + 'i', + 'Spider', + 'Spider', + 'Desktop', + ), + DeviceParser( + '^(1207|3gso|4thp|501i|502i|503i|504i|505i|506i|6310|6590|770s|802s|a wa|acer|acs\\-|airn|alav|asus|attw|au\\-m|aur |aus |abac|acoo|aiko|alco|alca|amoi|anex|anny|anyw|aptu|arch|argo|bmobile|bell|bird|bw\\-n|bw\\-u|beck|benq|bilb|blac|c55/|cdm\\-|chtm|capi|comp|cond|dall|dbte|dc\\-s|dica|ds\\-d|ds12|dait|devi|dmob|doco|dopo|dorado|el(?:38|39|48|49|50|55|58|68)|el[3456]\\d{2}dual|erk0|esl8|ex300|ez40|ez60|ez70|ezos|ezze|elai|emul|eric|ezwa|fake|fly\\-|fly_|g\\-mo|g1 u|g560|gf\\-5|grun|gene|go.w|good|grad|hcit|hd\\-m|hd\\-p|hd\\-t|hei\\-|hp i|hpip|hs\\-c|htc |htc\\-|htca|htcg)', + 'i', + 'Generic Feature Phone', + 'Generic', + 'Feature Phone', + ), + DeviceParser( + '^(htcp|htcs|htct|htc_|haie|hita|huaw|hutc|i\\-20|i\\-go|i\\-ma|i\\-mobile|i230|iac|iac\\-|iac/|ig01|im1k|inno|iris|jata|kddi|kgt|kgt/|kpt |kwc\\-|klon|lexi|lg g|lg\\-a|lg\\-b|lg\\-c|lg\\-d|lg\\-f|lg\\-g|lg\\-k|lg\\-l|lg\\-m|lg\\-o|lg\\-p|lg\\-s|lg\\-t|lg\\-u|lg\\-w|lg/k|lg/l|lg/u|lg50|lg54|lge\\-|lge/|leno|m1\\-w|m3ga|m50/|maui|mc01|mc21|mcca|medi|meri|mio8|mioa|mo01|mo02|mode|modo|mot |mot\\-|mt50|mtp1|mtv |mate|maxo|merc|mits|mobi|motv|mozz|n100|n101|n102|n202|n203|n300|n302|n500|n502|n505|n700|n701|n710|nec\\-|nem\\-|newg|neon)', + 'i', + 'Generic Feature Phone', + 'Generic', + 'Feature Phone', + ), + DeviceParser( + '^(netf|noki|nzph|o2 x|o2\\-x|opwv|owg1|opti|oran|ot\\-s|p800|pand|pg\\-1|pg\\-2|pg\\-3|pg\\-6|pg\\-8|pg\\-c|pg13|phil|pn\\-2|pt\\-g|palm|pana|pire|pock|pose|psio|qa\\-a|qc\\-2|qc\\-3|qc\\-5|qc\\-7|qc07|qc12|qc21|qc32|qc60|qci\\-|qwap|qtek|r380|r600|raks|rim9|rove|s55/|sage|sams|sc01|sch\\-|scp\\-|sdk/|se47|sec\\-|sec0|sec1|semc|sgh\\-|shar|sie\\-|sk\\-0|sl45|slid|smb3|smt5|sp01|sph\\-|spv |spv\\-|sy01|samm|sany|sava|scoo|send|siem|smar|smit|soft|sony|t\\-mo|t218|t250|t600|t610|t618|tcl\\-|tdg\\-|telm|tim\\-|ts70|tsm\\-|tsm3|tsm5|tx\\-9|tagt)', + 'i', + 'Generic Feature Phone', + 'Generic', + 'Feature Phone', + ), + DeviceParser( + '^(talk|teli|topl|tosh|up.b|upg1|utst|v400|v750|veri|vk\\-v|vk40|vk50|vk52|vk53|vm40|vx98|virg|vertu|vite|voda|vulc|w3c |w3c\\-|wapj|wapp|wapu|wapm|wig |wapi|wapr|wapv|wapy|wapa|waps|wapt|winc|winw|wonu|x700|xda2|xdag|yas\\-|your|zte\\-|zeto|aste|audi|avan|blaz|brew|brvw|bumb|ccwa|cell|cldc|cmd\\-|dang|eml2|fetc|hipt|http|ibro|idea|ikom|ipaq|jbro|jemu|jigs|keji|kyoc|kyok|libw|m\\-cr|midp|mmef|moto|mwbp|mywa|newt|nok6|o2im|pant|pdxg|play|pluc|port|prox|rozo|sama|seri|smal|symb|treo|upsi|vx52|vx53|vx60|vx61|vx70|vx80|vx81|vx83|vx85|wap\\-|webc|whit|wmlb|xda\\-|xda_)', + 'i', + 'Generic Feature Phone', + 'Generic', + 'Feature Phone', + ), + DeviceParser( + '^(Ice)$', + None, + 'Generic Feature Phone', + 'Generic', + 'Feature Phone', + ), + DeviceParser( + '(wap[\\-\\ ]browser|maui|netfront|obigo|teleca|up\\.browser|midp|Opera Mini)', + 'i', + 'Generic Feature Phone', + 'Generic', + 'Feature Phone', + ), + DeviceParser( + 'Mac OS', + None, + 'Mac', + 'Apple', + 'Mac', + ), +] + +OS_PARSERS = [ + OSParser( + 'HbbTV/\\d+\\.\\d+\\.\\d+ \\( ;(LG)E ;NetCast 4.0', + None, + '2013', + None, + None, + None, + ), + OSParser( + 'HbbTV/\\d+\\.\\d+\\.\\d+ \\( ;(LG)E ;NetCast 3.0', + None, + '2012', + None, + None, + None, + ), + OSParser( + 'HbbTV/1.1.1 \\(;;;;;\\) Maple_2011', + 'Samsung', + '2011', + None, + None, + None, + ), + OSParser( + 'HbbTV/\\d+\\.\\d+\\.\\d+ \\(;(Samsung);SmartTV([0-9]{4});.*FXPDEUC', + None, + None, + 'UE40F7000', + None, + None, + ), + OSParser( + 'HbbTV/\\d+\\.\\d+\\.\\d+ \\(;(Samsung);SmartTV([0-9]{4});.*MST12DEUC', + None, + None, + 'UE32F4500', + None, + None, + ), + OSParser( + 'HbbTV/1\\.1\\.1 \\(; (Philips);.*NETTV/4', + None, + '2013', + None, + None, + None, + ), + OSParser( + 'HbbTV/1\\.1\\.1 \\(; (Philips);.*NETTV/3', + None, + '2012', + None, + None, + None, + ), + OSParser( + 'HbbTV/1\\.1\\.1 \\(; (Philips);.*NETTV/2', + None, + '2011', + None, + None, + None, + ), + OSParser( + 'HbbTV/\\d+\\.\\d+\\.\\d+.*(firetv)-firefox-plugin (\\d+).(\\d+).(\\d+)', + 'FireHbbTV', + None, + None, + None, + None, + ), + OSParser( + 'HbbTV/\\d+\\.\\d+\\.\\d+ \\(.*; ?([a-zA-Z]+) ?;.*(201[1-9]).*\\)', + None, + None, + None, + None, + None, + ), + OSParser( + '(Windows Phone) (?:OS[ /])?(\\d+)\\.(\\d+)', + None, + None, + None, + None, + None, + ), + OSParser( + '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone)[ +]+(\\d+)[_\\.](\\d+)(?:[_\\.](\\d+)|).*Outlook-iOS-Android', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(Android)[ \\-/](\\d+)(?:\\.(\\d+)|)(?:[.\\-]([a-z0-9]+)|)', + None, + None, + None, + None, + None, + ), + OSParser( + '(Android) Donut', + None, + '1', + '2', + None, + None, + ), + OSParser( + '(Android) Eclair', + None, + '2', + '1', + None, + None, + ), + OSParser( + '(Android) Froyo', + None, + '2', + '2', + None, + None, + ), + OSParser( + '(Android) Gingerbread', + None, + '2', + '3', + None, + None, + ), + OSParser( + '(Android) Honeycomb', + None, + '3', + None, + None, + None, + ), + OSParser( + '(Android) (\\d+);', + None, + None, + None, + None, + None, + ), + OSParser( + '^UCWEB.*; (Adr) (\\d+)\\.(\\d+)(?:[.\\-]([a-z0-9]+)|);', + 'Android', + None, + None, + None, + None, + ), + OSParser( + '^UCWEB.*; (iPad|iPh|iPd) OS (\\d+)_(\\d+)(?:_(\\d+)|);', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '^UCWEB.*; (wds) (\\d+)\\.(\\d+)(?:\\.(\\d+)|);', + 'Windows Phone', + None, + None, + None, + None, + ), + OSParser( + '^(JUC).*; ?U; ?(?:Android|)(\\d+)\\.(\\d+)(?:[\\.\\-]([a-z0-9]+)|)', + 'Android', + None, + None, + None, + None, + ), + OSParser( + '(android)\\s(?:mobile\\/)(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)|)|)', + 'Android', + None, + None, + None, + None, + ), + OSParser( + '(Silk-Accelerated=[a-z]{4,5})', + 'Android', + None, + None, + None, + None, + ), + OSParser( + '(x86_64|aarch64)\\ (\\d+)\\.(\\d+)\\.(\\d+).*Chrome.*(?:CitrixChromeApp)$', + 'Chrome OS', + None, + None, + None, + None, + ), + OSParser( + '(XBLWP7)', + 'Windows Phone', + None, + None, + None, + None, + ), + OSParser( + '(Windows ?Mobile)', + 'Windows Mobile', + None, + None, + None, + None, + ), + OSParser( + '(Windows 10)', + 'Windows', + '10', + None, + None, + None, + ), + OSParser( + '(Windows (?:NT 5\\.2|NT 5\\.1))', + 'Windows', + 'XP', + None, + None, + None, + ), + OSParser( + '(Windows NT 6\\.1)', + 'Windows', + '7', + None, + None, + None, + ), + OSParser( + '(Windows NT 6\\.0)', + 'Windows', + 'Vista', + None, + None, + None, + ), + OSParser( + '(Win 9x 4\\.90)', + 'Windows', + 'ME', + None, + None, + None, + ), + OSParser( + '(Windows NT 6\\.2; ARM;)', + 'Windows', + 'RT', + None, + None, + None, + ), + OSParser( + '(Windows NT 6\\.2)', + 'Windows', + '8', + None, + None, + None, + ), + OSParser( + '(Windows NT 6\\.3; ARM;)', + 'Windows', + 'RT 8', + '1', + None, + None, + ), + OSParser( + '(Windows NT 6\\.3)', + 'Windows', + '8', + '1', + None, + None, + ), + OSParser( + '(Windows NT 6\\.4)', + 'Windows', + '10', + None, + None, + None, + ), + OSParser( + '(Windows NT 10\\.0)', + 'Windows', + '10', + None, + None, + None, + ), + OSParser( + '(Windows NT 5\\.0)', + 'Windows', + '2000', + None, + None, + None, + ), + OSParser( + '(WinNT4.0)', + 'Windows', + 'NT 4.0', + None, + None, + None, + ), + OSParser( + '(Windows ?CE)', + 'Windows', + 'CE', + None, + None, + None, + ), + OSParser( + 'Win(?:dows)? ?(95|98|3.1|NT|ME|2000|XP|Vista|7|CE)', + 'Windows', + '$1', + None, + None, + None, + ), + OSParser( + 'Win16', + 'Windows', + '3.1', + None, + None, + None, + ), + OSParser( + 'Win32', + 'Windows', + '95', + None, + None, + None, + ), + OSParser( + '^Box.*Windows/([\\d.]+);', + 'Windows', + '$1', + None, + None, + None, + ), + OSParser( + '(Tizen)[/ ](\\d+)\\.(\\d+)', + None, + None, + None, + None, + None, + ), + OSParser( + '((?:Mac[ +]?|; )OS[ +]X)[\\s+/](?:(\\d+)[_.](\\d+)(?:[_.](\\d+)|)|Mach-O)', + 'Mac OS X', + None, + None, + None, + None, + ), + OSParser( + '\\w+\\s+Mac OS X\\s+\\w+\\s+(\\d+).(\\d+).(\\d+).*', + 'Mac OS X', + '$1', + '$2', + '$3', + None, + ), + OSParser( + ' (Dar)(win)/(9).(\\d+).*\\((?:i386|x86_64|Power Macintosh)\\)', + 'Mac OS X', + '10', + '5', + None, + None, + ), + OSParser( + ' (Dar)(win)/(10).(\\d+).*\\((?:i386|x86_64)\\)', + 'Mac OS X', + '10', + '6', + None, + None, + ), + OSParser( + ' (Dar)(win)/(11).(\\d+).*\\((?:i386|x86_64)\\)', + 'Mac OS X', + '10', + '7', + None, + None, + ), + OSParser( + ' (Dar)(win)/(12).(\\d+).*\\((?:i386|x86_64)\\)', + 'Mac OS X', + '10', + '8', + None, + None, + ), + OSParser( + ' (Dar)(win)/(13).(\\d+).*\\((?:i386|x86_64)\\)', + 'Mac OS X', + '10', + '9', + None, + None, + ), + OSParser( + 'Mac_PowerPC', + 'Mac OS', + None, + None, + None, + None, + ), + OSParser( + '(?:PPC|Intel) (Mac OS X)', + None, + None, + None, + None, + None, + ), + OSParser( + '^Box.*;(Darwin)/(10)\\.(1\\d)(?:\\.(\\d+)|)', + 'Mac OS X', + None, + None, + None, + None, + ), + OSParser( + '(Apple\\s?TV)(?:/(\\d+)\\.(\\d+)|)', + 'ATV OS X', + None, + None, + None, + None, + ), + OSParser( + '(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS)[ +]+(\\d+)[_\\.](\\d+)(?:[_\\.](\\d+)|)', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(iPhone|iPad|iPod); Opera', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(iPhone|iPad|iPod).*Mac OS X.*Version/(\\d+)\\.(\\d+)', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(CFNetwork)/(5)48\\.0\\.3.* Darwin/11\\.0\\.0', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(CFNetwork)/(5)48\\.(0)\\.4.* Darwin/(1)1\\.0\\.0', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(CFNetwork)/(5)48\\.(1)\\.4', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(CFNetwork)/(4)85\\.1(3)\\.9', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(CFNetwork)/(6)09\\.(1)\\.4', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(CFNetwork)/(6)(0)9', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(CFNetwork)/6(7)2\\.(1)\\.13', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(CFNetwork)/6(7)2\\.(1)\\.(1)4', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(CF)(Network)/6(7)(2)\\.1\\.15', + 'iOS', + '7', + '1', + None, + None, + ), + OSParser( + '(CFNetwork)/6(7)2\\.(0)\\.(?:2|8)', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(CFNetwork)/709\\.1', + 'iOS', + '8', + '0.b5', + None, + None, + ), + OSParser( + '(CF)(Network)/711\\.(\\d)', + 'iOS', + '8', + None, + None, + None, + ), + OSParser( + '(CF)(Network)/(720)\\.(\\d)', + 'Mac OS X', + '10', + '10', + None, + None, + ), + OSParser( + '(CF)(Network)/(760)\\.(\\d)', + 'Mac OS X', + '10', + '11', + None, + None, + ), + OSParser( + 'CFNetwork/7.* Darwin/15\\.4\\.\\d+', + 'iOS', + '9', + '3', + '1', + None, + ), + OSParser( + 'CFNetwork/7.* Darwin/15\\.5\\.\\d+', + 'iOS', + '9', + '3', + '2', + None, + ), + OSParser( + 'CFNetwork/7.* Darwin/15\\.6\\.\\d+', + 'iOS', + '9', + '3', + '5', + None, + ), + OSParser( + '(CF)(Network)/758\\.(\\d)', + 'iOS', + '9', + None, + None, + None, + ), + OSParser( + 'CFNetwork/808\\.3 Darwin/16\\.3\\.\\d+', + 'iOS', + '10', + '2', + '1', + None, + ), + OSParser( + '(CF)(Network)/808\\.(\\d)', + 'iOS', + '10', + None, + None, + None, + ), + OSParser( + 'CFNetwork/.* Darwin/17\\.\\d+.*\\(x86_64\\)', + 'Mac OS X', + '10', + '13', + None, + None, + ), + OSParser( + 'CFNetwork/.* Darwin/16\\.\\d+.*\\(x86_64\\)', + 'Mac OS X', + '10', + '12', + None, + None, + ), + OSParser( + 'CFNetwork/8.* Darwin/15\\.\\d+.*\\(x86_64\\)', + 'Mac OS X', + '10', + '11', + None, + None, + ), + OSParser( + 'CFNetwork/.* Darwin/(9)\\.\\d+', + 'iOS', + '1', + None, + None, + None, + ), + OSParser( + 'CFNetwork/.* Darwin/(10)\\.\\d+', + 'iOS', + '4', + None, + None, + None, + ), + OSParser( + 'CFNetwork/.* Darwin/(11)\\.\\d+', + 'iOS', + '5', + None, + None, + None, + ), + OSParser( + 'CFNetwork/.* Darwin/(13)\\.\\d+', + 'iOS', + '6', + None, + None, + None, + ), + OSParser( + 'CFNetwork/6.* Darwin/(14)\\.\\d+', + 'iOS', + '7', + None, + None, + None, + ), + OSParser( + 'CFNetwork/7.* Darwin/(14)\\.\\d+', + 'iOS', + '8', + '0', + None, + None, + ), + OSParser( + 'CFNetwork/7.* Darwin/(15)\\.\\d+', + 'iOS', + '9', + '0', + None, + None, + ), + OSParser( + 'CFNetwork/8.* Darwin/16\\.5\\.\\d+', + 'iOS', + '10', + '3', + None, + None, + ), + OSParser( + 'CFNetwork/8.* Darwin/16\\.6\\.\\d+', + 'iOS', + '10', + '3', + '2', + None, + ), + OSParser( + 'CFNetwork/8.* Darwin/16\\.7\\.\\d+', + 'iOS', + '10', + '3', + '3', + None, + ), + OSParser( + 'CFNetwork/8.* Darwin/(16)\\.\\d+', + 'iOS', + '10', + None, + None, + None, + ), + OSParser( + 'CFNetwork/8.* Darwin/17\\.0\\.\\d+', + 'iOS', + '11', + '0', + None, + None, + ), + OSParser( + 'CFNetwork/8.* Darwin/17\\.2\\.\\d+', + 'iOS', + '11', + '1', + None, + None, + ), + OSParser( + 'CFNetwork/8.* Darwin/17\\.3\\.\\d+', + 'iOS', + '11', + '2', + None, + None, + ), + OSParser( + 'CFNetwork/8.* Darwin/17\\.4\\.\\d+', + 'iOS', + '11', + '2', + '6', + None, + ), + OSParser( + 'CFNetwork/8.* Darwin/17\\.5\\.\\d+', + 'iOS', + '11', + '3', + None, + None, + ), + OSParser( + 'CFNetwork/9.* Darwin/17\\.6\\.\\d+', + 'iOS', + '11', + '4', + None, + None, + ), + OSParser( + 'CFNetwork/9.* Darwin/17\\.7\\.\\d+', + 'iOS', + '11', + '4', + '1', + None, + ), + OSParser( + 'CFNetwork/8.* Darwin/(17)\\.\\d+', + 'iOS', + '11', + None, + None, + None, + ), + OSParser( + 'CFNetwork/9.* Darwin/18\\.0\\.\\d+', + 'iOS', + '12', + '0', + None, + None, + ), + OSParser( + 'CFNetwork/9.* Darwin/(18)\\.\\d+', + 'iOS', + '12', + None, + None, + None, + ), + OSParser( + 'CFNetwork/.* Darwin/', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '\\b(iOS[ /]|iOS; |iPhone(?:/| v|[ _]OS[/,]|; | OS : |\\d,\\d/|\\d,\\d; )|iPad/)(\\d{1,2})[_\\.](\\d{1,2})(?:[_\\.](\\d+)|)', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '\\((iOS);', + None, + None, + None, + None, + None, + ), + OSParser( + '(watchOS)/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'WatchOS', + None, + None, + None, + None, + ), + OSParser( + 'Outlook-(iOS)/\\d+\\.\\d+\\.prod\\.iphone', + None, + None, + None, + None, + None, + ), + OSParser( + '(iPod|iPhone|iPad)', + 'iOS', + None, + None, + None, + None, + ), + OSParser( + '(tvOS)[/ ](\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'tvOS', + None, + None, + None, + None, + ), + OSParser( + '(CrOS) [a-z0-9_]+ (\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'Chrome OS', + None, + None, + None, + None, + ), + OSParser( + '([Dd]ebian)', + 'Debian', + None, + None, + None, + None, + ), + OSParser( + '(Linux Mint)(?:/(\\d+)|)', + None, + None, + None, + None, + None, + ), + OSParser( + '(Mandriva)(?: Linux|)/(?:[\\d.-]+m[a-z]{2}(\\d+).(\\d)|)', + None, + None, + None, + None, + None, + ), + OSParser( + '(Symbian[Oo][Ss])[/ ](\\d+)\\.(\\d+)', + 'Symbian OS', + None, + None, + None, + None, + ), + OSParser( + '(Symbian/3).+NokiaBrowser/7\\.3', + 'Symbian^3 Anna', + None, + None, + None, + None, + ), + OSParser( + '(Symbian/3).+NokiaBrowser/7\\.4', + 'Symbian^3 Belle', + None, + None, + None, + None, + ), + OSParser( + '(Symbian/3)', + 'Symbian^3', + None, + None, + None, + None, + ), + OSParser( + '\\b(Series 60|SymbOS|S60Version|S60V\\d|S60\\b)', + 'Symbian OS', + None, + None, + None, + None, + ), + OSParser( + '(MeeGo)', + None, + None, + None, + None, + None, + ), + OSParser( + 'Symbian [Oo][Ss]', + 'Symbian OS', + None, + None, + None, + None, + ), + OSParser( + 'Series40;', + 'Nokia Series 40', + None, + None, + None, + None, + ), + OSParser( + 'Series30Plus;', + 'Nokia Series 30 Plus', + None, + None, + None, + None, + ), + OSParser( + '(BB10);.+Version/(\\d+)\\.(\\d+)\\.(\\d+)', + 'BlackBerry OS', + None, + None, + None, + None, + ), + OSParser( + '(Black[Bb]erry)[0-9a-z]+/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'BlackBerry OS', + None, + None, + None, + None, + ), + OSParser( + '(Black[Bb]erry).+Version/(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'BlackBerry OS', + None, + None, + None, + None, + ), + OSParser( + '(RIM Tablet OS) (\\d+)\\.(\\d+)\\.(\\d+)', + 'BlackBerry Tablet OS', + None, + None, + None, + None, + ), + OSParser( + '(Play[Bb]ook)', + 'BlackBerry Tablet OS', + None, + None, + None, + None, + ), + OSParser( + '(Black[Bb]erry)', + 'BlackBerry OS', + None, + None, + None, + None, + ), + OSParser( + '(K[Aa][Ii]OS)\\/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'KaiOS', + None, + None, + None, + None, + ), + OSParser( + '\\((?:Mobile|Tablet);.+Gecko/18.0 Firefox/\\d+\\.\\d+', + 'Firefox OS', + '1', + '0', + '1', + None, + ), + OSParser( + '\\((?:Mobile|Tablet);.+Gecko/18.1 Firefox/\\d+\\.\\d+', + 'Firefox OS', + '1', + '1', + None, + None, + ), + OSParser( + '\\((?:Mobile|Tablet);.+Gecko/26.0 Firefox/\\d+\\.\\d+', + 'Firefox OS', + '1', + '2', + None, + None, + ), + OSParser( + '\\((?:Mobile|Tablet);.+Gecko/28.0 Firefox/\\d+\\.\\d+', + 'Firefox OS', + '1', + '3', + None, + None, + ), + OSParser( + '\\((?:Mobile|Tablet);.+Gecko/30.0 Firefox/\\d+\\.\\d+', + 'Firefox OS', + '1', + '4', + None, + None, + ), + OSParser( + '\\((?:Mobile|Tablet);.+Gecko/32.0 Firefox/\\d+\\.\\d+', + 'Firefox OS', + '2', + '0', + None, + None, + ), + OSParser( + '\\((?:Mobile|Tablet);.+Gecko/34.0 Firefox/\\d+\\.\\d+', + 'Firefox OS', + '2', + '1', + None, + None, + ), + OSParser( + '\\((?:Mobile|Tablet);.+Firefox/\\d+\\.\\d+', + 'Firefox OS', + None, + None, + None, + None, + ), + OSParser( + '(BREW)[ /](\\d+)\\.(\\d+)\\.(\\d+)', + None, + None, + None, + None, + None, + ), + OSParser( + '(BREW);', + None, + None, + None, + None, + None, + ), + OSParser( + '(Brew MP|BMP)[ /](\\d+)\\.(\\d+)\\.(\\d+)', + 'Brew MP', + None, + None, + None, + None, + ), + OSParser( + 'BMP;', + 'Brew MP', + None, + None, + None, + None, + ), + OSParser( + '(GoogleTV)(?: (\\d+)\\.(\\d+)(?:\\.(\\d+)|)|/[\\da-z]+)', + None, + None, + None, + None, + None, + ), + OSParser( + '(WebTV)/(\\d+).(\\d+)', + None, + None, + None, + None, + None, + ), + OSParser( + '(CrKey)(?:[/](\\d+)\\.(\\d+)(?:\\.(\\d+)|)|)', + 'Chromecast', + None, + None, + None, + None, + ), + OSParser( + '(hpw|web)OS/(\\d+)\\.(\\d+)(?:\\.(\\d+)|)', + 'webOS', + None, + None, + None, + None, + ), + OSParser( + '(VRE);', + None, + None, + None, + None, + None, + ), + OSParser( + '(Fedora|Red Hat|PCLinuxOS|Puppy|Ubuntu|Kindle|Bada|Sailfish|Lubuntu|BackTrack|Slackware|(?:Free|Open|Net|\\b)BSD)[/ ](\\d+)\\.(\\d+)(?:\\.(\\d+)|)(?:\\.(\\d+)|)', + None, + None, + None, + None, + None, + ), + OSParser( + '(Linux)[ /](\\d+)\\.(\\d+)(?:\\.(\\d+)|).*gentoo', + 'Gentoo', + None, + None, + None, + None, + ), + OSParser( + '\\((Bada);', + None, + None, + None, + None, + None, + ), + OSParser( + '(Windows|Android|WeTab|Maemo|Web0S)', + None, + None, + None, + None, + None, + ), + OSParser( + '(Ubuntu|Kubuntu|Arch Linux|CentOS|Slackware|Gentoo|openSUSE|SUSE|Red Hat|Fedora|PCLinuxOS|Mageia|(?:Free|Open|Net|\\b)BSD)', + None, + None, + None, + None, + None, + ), + OSParser( + '(Linux)(?:[ /](\\d+)\\.(\\d+)(?:\\.(\\d+)|)|)', + None, + None, + None, + None, + None, + ), + OSParser( + 'SunOS', + 'Solaris', + None, + None, + None, + None, + ), + OSParser( + '\\(linux-gnu\\)', + 'Linux', + None, + None, + None, + None, + ), + OSParser( + '\\(x86_64-redhat-linux-gnu\\)', + 'Red Hat', + None, + None, + None, + None, + ), + OSParser( + '\\((freebsd)(\\d+)\\.(\\d+)\\)', + 'FreeBSD', + None, + None, + None, + None, + ), + OSParser( + 'linux', + 'Linux', + None, + None, + None, + None, + ), + OSParser( + '^(Roku)/DVP-(\\d+)\\.(\\d+)', + None, + None, + None, + None, + None, + ), +] diff --git a/app_common/lib/ua_parser/user_agent_parser.py b/app_common/lib/ua_parser/user_agent_parser.py new file mode 100644 index 000000000..45f5a0639 --- /dev/null +++ b/app_common/lib/ua_parser/user_agent_parser.py @@ -0,0 +1,544 @@ +# Copyright 2009 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the 'License') +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an 'AS IS' BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Python implementation of the UA parser.""" + +from __future__ import absolute_import + +import os +import re + +__author__ = "Lindsey Simon " + + +class UserAgentParser(object): + def __init__( + self, pattern, family_replacement=None, v1_replacement=None, v2_replacement=None + ): + """Initialize UserAgentParser. + + Args: + pattern: a regular expression string + family_replacement: a string to override the matched family (optional) + v1_replacement: a string to override the matched v1 (optional) + v2_replacement: a string to override the matched v2 (optional) + """ + self.pattern = pattern + self.user_agent_re = re.compile(self.pattern) + self.family_replacement = family_replacement + self.v1_replacement = v1_replacement + self.v2_replacement = v2_replacement + + def MatchSpans(self, user_agent_string): + match_spans = [] + match = self.user_agent_re.search(user_agent_string) + if match: + match_spans = [ + match.span(group_index) for group_index in range(1, match.lastindex + 1) + ] + return match_spans + + def Parse(self, user_agent_string): + family, v1, v2, v3 = None, None, None, None + match = self.user_agent_re.search(user_agent_string) + if match: + if self.family_replacement: + if re.search(r"\$1", self.family_replacement): + family = re.sub(r"\$1", match.group(1), self.family_replacement) + else: + family = self.family_replacement + else: + family = match.group(1) + + if self.v1_replacement: + v1 = self.v1_replacement + elif match.lastindex and match.lastindex >= 2: + v1 = match.group(2) or None + + if self.v2_replacement: + v2 = self.v2_replacement + elif match.lastindex and match.lastindex >= 3: + v2 = match.group(3) or None + + if match.lastindex and match.lastindex >= 4: + v3 = match.group(4) or None + + return family, v1, v2, v3 + + +class OSParser(object): + def __init__( + self, + pattern, + os_replacement=None, + os_v1_replacement=None, + os_v2_replacement=None, + os_v3_replacement=None, + os_v4_replacement=None, + ): + """Initialize UserAgentParser. + + Args: + pattern: a regular expression string + os_replacement: a string to override the matched os (optional) + os_v1_replacement: a string to override the matched v1 (optional) + os_v2_replacement: a string to override the matched v2 (optional) + os_v3_replacement: a string to override the matched v3 (optional) + os_v4_replacement: a string to override the matched v4 (optional) + """ + self.pattern = pattern + self.user_agent_re = re.compile(self.pattern) + self.os_replacement = os_replacement + self.os_v1_replacement = os_v1_replacement + self.os_v2_replacement = os_v2_replacement + self.os_v3_replacement = os_v3_replacement + self.os_v4_replacement = os_v4_replacement + + def MatchSpans(self, user_agent_string): + match_spans = [] + match = self.user_agent_re.search(user_agent_string) + if match: + match_spans = [ + match.span(group_index) for group_index in range(1, match.lastindex + 1) + ] + return match_spans + + def Parse(self, user_agent_string): + os, os_v1, os_v2, os_v3, os_v4 = None, None, None, None, None + match = self.user_agent_re.search(user_agent_string) + if match: + if self.os_replacement: + os = MultiReplace(self.os_replacement, match) + elif match.lastindex: + os = match.group(1) + + if self.os_v1_replacement: + os_v1 = MultiReplace(self.os_v1_replacement, match) + elif match.lastindex and match.lastindex >= 2: + os_v1 = match.group(2) + + if self.os_v2_replacement: + os_v2 = MultiReplace(self.os_v2_replacement, match) + elif match.lastindex and match.lastindex >= 3: + os_v2 = match.group(3) + + if self.os_v3_replacement: + os_v3 = MultiReplace(self.os_v3_replacement, match) + elif match.lastindex and match.lastindex >= 4: + os_v3 = match.group(4) + + if self.os_v4_replacement: + os_v4 = MultiReplace(self.os_v4_replacement, match) + elif match.lastindex and match.lastindex >= 5: + os_v4 = match.group(5) + + return os, os_v1, os_v2, os_v3, os_v4 + + +def MultiReplace(string, match): + def _repl(m): + index = int(m.group(1)) - 1 + group = match.groups() + if index < len(group): + return group[index] + return "" + + _string = re.sub(r"\$(\d)", _repl, string) + _string = re.sub(r"^\s+|\s+$", "", _string) + if _string == "": + return None + return _string + + +class DeviceParser(object): + def __init__( + self, + pattern, + regex_flag=None, + device_replacement=None, + brand_replacement=None, + model_replacement=None, + ): + """Initialize UserAgentParser. + + Args: + pattern: a regular expression string + device_replacement: a string to override the matched device (optional) + """ + self.pattern = pattern + if regex_flag == "i": + self.user_agent_re = re.compile(self.pattern, re.IGNORECASE) + else: + self.user_agent_re = re.compile(self.pattern) + self.device_replacement = device_replacement + self.brand_replacement = brand_replacement + self.model_replacement = model_replacement + + def MatchSpans(self, user_agent_string): + match_spans = [] + match = self.user_agent_re.search(user_agent_string) + if match: + match_spans = [ + match.span(group_index) for group_index in range(1, match.lastindex + 1) + ] + return match_spans + + def Parse(self, user_agent_string): + device, brand, model = None, None, None + match = self.user_agent_re.search(user_agent_string) + if match: + if self.device_replacement: + device = MultiReplace(self.device_replacement, match) + else: + device = match.group(1) + + if self.brand_replacement: + brand = MultiReplace(self.brand_replacement, match) + + if self.model_replacement: + model = MultiReplace(self.model_replacement, match) + elif len(match.groups()) > 0: + model = match.group(1) + + return device, brand, model + + +MAX_CACHE_SIZE = 20 +_parse_cache = {} + + +def Parse(user_agent_string, **jsParseBits): + """ Parse all the things + Args: + user_agent_string: the full user agent string + jsParseBits: javascript override bits + Returns: + A dictionary containing all parsed bits + """ + jsParseBits = jsParseBits or {} + key = (user_agent_string, repr(jsParseBits)) + cached = _parse_cache.get(key) + if cached is not None: + return cached + if len(_parse_cache) > MAX_CACHE_SIZE: + _parse_cache.clear() + v = { + "user_agent": ParseUserAgent(user_agent_string, **jsParseBits), + "os": ParseOS(user_agent_string, **jsParseBits), + "device": ParseDevice(user_agent_string, **jsParseBits), + "string": user_agent_string, + } + _parse_cache[key] = v + return v + + +def ParseUserAgent(user_agent_string, **jsParseBits): + """ Parses the user-agent string for user agent (browser) info. + Args: + user_agent_string: The full user-agent string. + jsParseBits: javascript override bits. + Returns: + A dictionary containing parsed bits. + """ + if ( + "js_user_agent_family" in jsParseBits + and jsParseBits["js_user_agent_family"] != "" + ): + family = jsParseBits["js_user_agent_family"] + v1 = jsParseBits.get("js_user_agent_v1") or None + v2 = jsParseBits.get("js_user_agent_v2") or None + v3 = jsParseBits.get("js_user_agent_v3") or None + else: + for uaParser in USER_AGENT_PARSERS: + family, v1, v2, v3 = uaParser.Parse(user_agent_string) + if family: + break + + # Override for Chrome Frame IFF Chrome is enabled. + if "js_user_agent_string" in jsParseBits: + js_user_agent_string = jsParseBits["js_user_agent_string"] + if ( + js_user_agent_string + and js_user_agent_string.find("Chrome/") > -1 + and user_agent_string.find("chromeframe") > -1 + ): + jsOverride = {} + jsOverride = ParseUserAgent(js_user_agent_string) + family = "Chrome Frame (%s %s)" % (family, v1) + v1 = jsOverride["major"] + v2 = jsOverride["minor"] + v3 = jsOverride["patch"] + + family = family or "Other" + return { + "family": family, + "major": v1 or None, + "minor": v2 or None, + "patch": v3 or None, + } + + +def ParseOS(user_agent_string, **jsParseBits): + """ Parses the user-agent string for operating system info + Args: + user_agent_string: The full user-agent string. + jsParseBits: javascript override bits. + Returns: + A dictionary containing parsed bits. + """ + for osParser in OS_PARSERS: + os, os_v1, os_v2, os_v3, os_v4 = osParser.Parse(user_agent_string) + if os: + break + os = os or "Other" + return { + "family": os, + "major": os_v1, + "minor": os_v2, + "patch": os_v3, + "patch_minor": os_v4, + } + + +def ParseDevice(user_agent_string): + """ Parses the user-agent string for device info. + Args: + user_agent_string: The full user-agent string. + ua_family: The parsed user agent family name. + Returns: + A dictionary containing parsed bits. + """ + for deviceParser in DEVICE_PARSERS: + device, brand, model = deviceParser.Parse(user_agent_string) + if device: + break + + if device is None: + device = "Other" + + return {"family": device, "brand": brand, "model": model} + + +def PrettyUserAgent(family, v1=None, v2=None, v3=None): + """Pretty user agent string.""" + if v3: + if v3[0].isdigit(): + return "%s %s.%s.%s" % (family, v1, v2, v3) + else: + return "%s %s.%s%s" % (family, v1, v2, v3) + elif v2: + return "%s %s.%s" % (family, v1, v2) + elif v1: + return "%s %s" % (family, v1) + return family + + +def PrettyOS(os, os_v1=None, os_v2=None, os_v3=None, os_v4=None): + """Pretty os string.""" + if os_v4: + return "%s %s.%s.%s.%s" % (os, os_v1, os_v2, os_v3, os_v4) + if os_v3: + if os_v3[0].isdigit(): + return "%s %s.%s.%s" % (os, os_v1, os_v2, os_v3) + else: + return "%s %s.%s%s" % (os, os_v1, os_v2, os_v3) + elif os_v2: + return "%s %s.%s" % (os, os_v1, os_v2) + elif os_v1: + return "%s %s" % (os, os_v1) + return os + + +def ParseWithJSOverrides( + user_agent_string, + js_user_agent_string=None, + js_user_agent_family=None, + js_user_agent_v1=None, + js_user_agent_v2=None, + js_user_agent_v3=None, +): + """ backwards compatible. use one of the other Parse methods instead! """ + + # Override via JS properties. + if js_user_agent_family is not None and js_user_agent_family != "": + family = js_user_agent_family + v1 = None + v2 = None + v3 = None + if js_user_agent_v1 is not None: + v1 = js_user_agent_v1 + if js_user_agent_v2 is not None: + v2 = js_user_agent_v2 + if js_user_agent_v3 is not None: + v3 = js_user_agent_v3 + else: + for parser in USER_AGENT_PARSERS: + family, v1, v2, v3 = parser.Parse(user_agent_string) + if family: + break + + # Override for Chrome Frame IFF Chrome is enabled. + if ( + js_user_agent_string + and js_user_agent_string.find("Chrome/") > -1 + and user_agent_string.find("chromeframe") > -1 + ): + family = "Chrome Frame (%s %s)" % (family, v1) + ua_dict = ParseUserAgent(js_user_agent_string) + v1 = ua_dict["major"] + v2 = ua_dict["minor"] + v3 = ua_dict["patch"] + + return family or "Other", v1, v2, v3 + + +def Pretty(family, v1=None, v2=None, v3=None): + """ backwards compatible. use PrettyUserAgent instead! """ + if v3: + if v3[0].isdigit(): + return "%s %s.%s.%s" % (family, v1, v2, v3) + else: + return "%s %s.%s%s" % (family, v1, v2, v3) + elif v2: + return "%s %s.%s" % (family, v1, v2) + elif v1: + return "%s %s" % (family, v1) + return family + + +def GetFilters( + user_agent_string, + js_user_agent_string=None, + js_user_agent_family=None, + js_user_agent_v1=None, + js_user_agent_v2=None, + js_user_agent_v3=None, +): + """Return the optional arguments that should be saved and used to query. + + js_user_agent_string is always returned if it is present. We really only need + it for Chrome Frame. However, I added it in the generally case to find other + cases when it is different. When the recording of js_user_agent_string was + added, we created new records for all new user agents. + + Since we only added js_document_mode for the IE 9 preview case, it did not + cause new user agent records the way js_user_agent_string did. + + js_document_mode has since been removed in favor of individual property + overrides. + + Args: + user_agent_string: The full user-agent string. + js_user_agent_string: JavaScript ua string from client-side + js_user_agent_family: This is an override for the family name to deal + with the fact that IE platform preview (for instance) cannot be + distinguished by user_agent_string, but only in javascript. + js_user_agent_v1: v1 override - see above. + js_user_agent_v2: v1 override - see above. + js_user_agent_v3: v1 override - see above. + Returns: + {js_user_agent_string: '[...]', js_family_name: '[...]', etc...} + """ + filters = {} + filterdict = { + "js_user_agent_string": js_user_agent_string, + "js_user_agent_family": js_user_agent_family, + "js_user_agent_v1": js_user_agent_v1, + "js_user_agent_v2": js_user_agent_v2, + "js_user_agent_v3": js_user_agent_v3, + } + for key, value in filterdict.items(): + if value is not None and value != "": + filters[key] = value + return filters + + +# Build the list of user agent parsers from YAML +UA_PARSER_YAML = os.environ.get("UA_PARSER_YAML") +if UA_PARSER_YAML: + # This will raise an ImportError if missing, obviously since it's no + # longer a requirement + import yaml + + try: + # Try and use libyaml bindings if available since faster + from yaml import CSafeLoader as SafeLoader + except ImportError: + from yaml import SafeLoader + + with open(UA_PARSER_YAML) as fp: + regexes = yaml.load(fp, Loader=SafeLoader) + + USER_AGENT_PARSERS = [] + for _ua_parser in regexes["user_agent_parsers"]: + _regex = _ua_parser["regex"] + + _family_replacement = _ua_parser.get("family_replacement") + _v1_replacement = _ua_parser.get("v1_replacement") + _v2_replacement = _ua_parser.get("v2_replacement") + + USER_AGENT_PARSERS.append( + UserAgentParser( + _regex, _family_replacement, _v1_replacement, _v2_replacement + ) + ) + + OS_PARSERS = [] + for _os_parser in regexes["os_parsers"]: + _regex = _os_parser["regex"] + + _os_replacement = _os_parser.get("os_replacement") + _os_v1_replacement = _os_parser.get("os_v1_replacement") + _os_v2_replacement = _os_parser.get("os_v2_replacement") + _os_v3_replacement = _os_parser.get("os_v3_replacement") + _os_v4_replacement = _os_parser.get("os_v4_replacement") + + OS_PARSERS.append( + OSParser( + _regex, + _os_replacement, + _os_v1_replacement, + _os_v2_replacement, + _os_v3_replacement, + _os_v4_replacement, + ) + ) + + DEVICE_PARSERS = [] + for _device_parser in regexes["device_parsers"]: + _regex = _device_parser["regex"] + + _regex_flag = _device_parser.get("regex_flag") + _device_replacement = _device_parser.get("device_replacement") + _brand_replacement = _device_parser.get("brand_replacement") + _model_replacement = _device_parser.get("model_replacement") + + DEVICE_PARSERS.append( + DeviceParser( + _regex, + _regex_flag, + _device_replacement, + _brand_replacement, + _model_replacement, + ) + ) + + # Clean our our temporary vars explicitly + # so they can't be reused or imported + del regexes + del yaml + del SafeLoader +else: + # Just load our pre-compiled versions + from ._regexes import USER_AGENT_PARSERS, DEVICE_PARSERS, OS_PARSERS diff --git a/app_common/lib/ua_parser/user_agent_parser_test.py b/app_common/lib/ua_parser/user_agent_parser_test.py new file mode 100644 index 000000000..c73d742ba --- /dev/null +++ b/app_common/lib/ua_parser/user_agent_parser_test.py @@ -0,0 +1,290 @@ +#!/usr/bin/python2.5 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the 'License') +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an 'AS IS' BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +"""User Agent Parser Unit Tests. +Run: +# python -m user_agent_parser_test (runs all the tests, takes awhile) +or like: +# python -m user_agent_parser_test ParseTest.testBrowserscopeStrings +""" + + +from __future__ import unicode_literals, absolute_import + +__author__ = "slamm@google.com (Stephen Lamm)" + +import os +import re +import unittest +import yaml + +try: + # Try and use libyaml bindings if available since faster + from yaml import CSafeLoader as SafeLoader +except ImportError: + from yaml import SafeLoader + +from ua_parser import user_agent_parser + +TEST_RESOURCES_DIR = os.path.join( + os.path.abspath(os.path.dirname(__file__)), "../uap-core" +) + + +class ParseTest(unittest.TestCase): + def testBrowserscopeStrings(self): + self.runUserAgentTestsFromYAML( + os.path.join(TEST_RESOURCES_DIR, "tests/test_ua.yaml") + ) + + def testBrowserscopeStringsOS(self): + self.runOSTestsFromYAML(os.path.join(TEST_RESOURCES_DIR, "tests/test_os.yaml")) + + def testStringsOS(self): + self.runOSTestsFromYAML( + os.path.join(TEST_RESOURCES_DIR, "test_resources/additional_os_tests.yaml") + ) + + def testStringsDevice(self): + self.runDeviceTestsFromYAML( + os.path.join(TEST_RESOURCES_DIR, "tests/test_device.yaml") + ) + + def testMozillaStrings(self): + self.runUserAgentTestsFromYAML( + os.path.join( + TEST_RESOURCES_DIR, "test_resources/firefox_user_agent_strings.yaml" + ) + ) + + # NOTE: The YAML file used here is one output by makePGTSComparisonYAML() + # below, as opposed to the pgts_browser_list-orig.yaml file. The -orig + # file is by no means perfect, but identifies many browsers that we + # classify as "Other". This test itself is mostly useful to know when + # somthing in UA parsing changes. An effort should be made to try and + # reconcile the differences between the two YAML files. + def testPGTSStrings(self): + self.runUserAgentTestsFromYAML( + os.path.join(TEST_RESOURCES_DIR, "test_resources/pgts_browser_list.yaml") + ) + + def testParseAll(self): + user_agent_string = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; fr; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5,gzip(gfe),gzip(gfe)" + expected = { + "device": {"family": "Mac", "brand": "Apple", "model": "Mac"}, + "os": { + "family": "Mac OS X", + "major": "10", + "minor": "4", + "patch": None, + "patch_minor": None, + }, + "user_agent": { + "family": "Firefox", + "major": "3", + "minor": "5", + "patch": "5", + }, + "string": user_agent_string, + } + + result = user_agent_parser.Parse(user_agent_string) + self.assertEqual( + result, + expected, + "UA: {0}\n expected<{1}> != actual<{2}>".format( + user_agent_string, expected, result + ), + ) + + # Make a YAML file for manual comparsion with pgts_browser_list-orig.yaml + def makePGTSComparisonYAML(self): + import codecs + + outfile = codecs.open("outfile.yaml", "w", "utf-8") + print >> outfile, "test_cases:" + + yamlFile = open(os.path.join(TEST_RESOURCES_DIR, "pgts_browser_list.yaml")) + yamlContents = yaml.load(yamlFile, Loader=SafeLoader) + yamlFile.close() + + for test_case in yamlContents["test_cases"]: + user_agent_string = test_case["user_agent_string"] + kwds = {} + if "js_ua" in test_case: + kwds = eval(test_case["js_ua"]) + + (family, major, minor, patch) = user_agent_parser.ParseUserAgent( + user_agent_string, **kwds + ) + + # Escape any double-quotes in the UA string + user_agent_string = re.sub(r'"', '\\"', user_agent_string) + print >> outfile, ' - user_agent_string: "' + user_agent_string + '"' + "\n" + ' family: "' + family + '"\n' + " major: " + ( + "" if (major is None) else "'" + major + "'" + ) + "\n" + " minor: " + ( + "" if (minor is None) else "'" + minor + "'" + ) + "\n" + " patch: " + ( + "" if (patch is None) else "'" + patch + "'" + ) + outfile.close() + + # Run a set of test cases from a YAML file + def runUserAgentTestsFromYAML(self, file_name): + yamlFile = open(os.path.join(TEST_RESOURCES_DIR, file_name)) + yamlContents = yaml.load(yamlFile, Loader=SafeLoader) + yamlFile.close() + + for test_case in yamlContents["test_cases"]: + # Inputs to Parse() + user_agent_string = test_case["user_agent_string"] + kwds = {} + if "js_ua" in test_case: + kwds = eval(test_case["js_ua"]) + + # The expected results + expected = { + "family": test_case["family"], + "major": test_case["major"], + "minor": test_case["minor"], + "patch": test_case["patch"], + } + + result = {} + result = user_agent_parser.ParseUserAgent(user_agent_string, **kwds) + self.assertEqual( + result, + expected, + "UA: {0}\n expected<{1}, {2}, {3}, {4}> != actual<{5}, {6}, {7}, {8}>".format( + user_agent_string, + expected["family"], + expected["major"], + expected["minor"], + expected["patch"], + result["family"], + result["major"], + result["minor"], + result["patch"], + ), + ) + + def runOSTestsFromYAML(self, file_name): + yamlFile = open(os.path.join(TEST_RESOURCES_DIR, file_name)) + yamlContents = yaml.load(yamlFile, Loader=SafeLoader) + yamlFile.close() + + for test_case in yamlContents["test_cases"]: + # Inputs to Parse() + user_agent_string = test_case["user_agent_string"] + kwds = {} + if "js_ua" in test_case: + kwds = eval(test_case["js_ua"]) + + # The expected results + expected = { + "family": test_case["family"], + "major": test_case["major"], + "minor": test_case["minor"], + "patch": test_case["patch"], + "patch_minor": test_case["patch_minor"], + } + + result = user_agent_parser.ParseOS(user_agent_string, **kwds) + self.assertEqual( + result, + expected, + "UA: {0}\n expected<{1} {2} {3} {4} {5}> != actual<{6} {7} {8} {9} {10}>".format( + user_agent_string, + expected["family"], + expected["major"], + expected["minor"], + expected["patch"], + expected["patch_minor"], + result["family"], + result["major"], + result["minor"], + result["patch"], + result["patch_minor"], + ), + ) + + def runDeviceTestsFromYAML(self, file_name): + yamlFile = open(os.path.join(TEST_RESOURCES_DIR, file_name)) + yamlContents = yaml.load(yamlFile, Loader=SafeLoader) + yamlFile.close() + + for test_case in yamlContents["test_cases"]: + # Inputs to Parse() + user_agent_string = test_case["user_agent_string"] + kwds = {} + if "js_ua" in test_case: + kwds = eval(test_case["js_ua"]) + + # The expected results + expected = { + "family": test_case["family"], + "brand": test_case["brand"], + "model": test_case["model"], + } + + result = user_agent_parser.ParseDevice(user_agent_string, **kwds) + self.assertEqual( + result, + expected, + "UA: {0}\n expected<{1} {2} {3}> != actual<{4} {5} {6}>".format( + user_agent_string, + expected["family"], + expected["brand"], + expected["model"], + result["family"], + result["brand"], + result["model"], + ), + ) + + +class GetFiltersTest(unittest.TestCase): + def testGetFiltersNoMatchesGiveEmptyDict(self): + user_agent_string = "foo" + filters = user_agent_parser.GetFilters( + user_agent_string, js_user_agent_string=None + ) + self.assertEqual({}, filters) + + def testGetFiltersJsUaPassedThrough(self): + user_agent_string = "foo" + filters = user_agent_parser.GetFilters( + user_agent_string, js_user_agent_string="bar" + ) + self.assertEqual({"js_user_agent_string": "bar"}, filters) + + def testGetFiltersJsUserAgentFamilyAndVersions(self): + user_agent_string = ( + "Mozilla/4.0 (compatible; MSIE 8.0; " + "Windows NT 5.1; Trident/4.0; GTB6; .NET CLR 2.0.50727; " + ".NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)" + ) + filters = user_agent_parser.GetFilters( + user_agent_string, js_user_agent_string="bar", js_user_agent_family="foo" + ) + self.assertEqual( + {"js_user_agent_string": "bar", "js_user_agent_family": "foo"}, filters + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/app_common/lib/user_agents/__init__.py b/app_common/lib/user_agents/__init__.py new file mode 100644 index 000000000..e47740f24 --- /dev/null +++ b/app_common/lib/user_agents/__init__.py @@ -0,0 +1,3 @@ +VERSION = (2, 2, 0) + +from .parsers import parse diff --git a/app_common/lib/user_agents/compat.py b/app_common/lib/user_agents/compat.py new file mode 100644 index 000000000..c4d1a247b --- /dev/null +++ b/app_common/lib/user_agents/compat.py @@ -0,0 +1,14 @@ +import sys + +PY3 = sys.version_info[0] == 3 + +if PY3: + string_types = str + + def iteritems(d, **kw): + return iter(d.items(**kw)) +else: + string_types = basestring + + def iteritems(d, **kw): + return iter(d.iteritems(**kw)) diff --git a/app_common/lib/user_agents/parsers.py b/app_common/lib/user_agents/parsers.py new file mode 100644 index 000000000..7c309697f --- /dev/null +++ b/app_common/lib/user_agents/parsers.py @@ -0,0 +1,268 @@ +from collections import namedtuple + +from ..ua_parser import user_agent_parser +from .compat import string_types + + +MOBILE_DEVICE_FAMILIES = ( + 'iPhone', + 'iPod', + 'Generic Smartphone', + 'Generic Feature Phone', + 'PlayStation Vita', + 'iOS-Device' +) + +PC_OS_FAMILIES = ( + 'Windows 95', + 'Windows 98', + 'Solaris', +) + +MOBILE_OS_FAMILIES = ( + 'Windows Phone', + 'Windows Phone OS', # Earlier versions of ua-parser returns Windows Phone OS + 'Symbian OS', + 'Bada', + 'Windows CE', + 'Windows Mobile', + 'Maemo', +) + +MOBILE_BROWSER_FAMILIES = ( + 'IE Mobile', + 'Opera Mobile', + 'Opera Mini', + 'Chrome Mobile', + 'Chrome Mobile WebView', + 'Chrome Mobile iOS', +) + +TABLET_DEVICE_FAMILIES = ( + 'iPad', + 'BlackBerry Playbook', + 'Blackberry Playbook', # Earlier versions of ua-parser returns "Blackberry" instead of "BlackBerry" + 'Kindle', + 'Kindle Fire', + 'Kindle Fire HD', + 'Galaxy Tab', + 'Xoom', + 'Dell Streak', +) + +TOUCH_CAPABLE_OS_FAMILIES = ( + 'iOS', + 'Android', + 'Windows Phone', + 'Windows CE', + 'Windows Mobile', + 'Firefox OS', + 'MeeGo', +) + +TOUCH_CAPABLE_DEVICE_FAMILIES = ( + 'BlackBerry Playbook', + 'Blackberry Playbook', + 'Kindle Fire', +) + +EMAIL_PROGRAM_FAMILIES = set(( + 'Outlook', + 'Windows Live Mail', + 'AirMail', + 'Apple Mail', + 'Outlook', + 'Thunderbird', + 'Lightning', + 'ThunderBrowse', + 'Windows Live Mail', + 'The Bat!', + 'Lotus Notes', + 'IBM Notes', + 'Barca', + 'MailBar', + 'kmail2', + 'YahooMobileMail' +)) + +def verify_attribute(attribute): + if isinstance(attribute, string_types) and attribute.isdigit(): + return int(attribute) + + return attribute + + +def parse_version(major=None, minor=None, patch=None, patch_minor=None): + # Returns version number tuple, attributes will be integer if they're numbers + major = verify_attribute(major) + minor = verify_attribute(minor) + patch = verify_attribute(patch) + patch_minor = verify_attribute(patch_minor) + + return tuple( + filter(lambda x: x is not None, (major, minor, patch, patch_minor)) + ) + + +Browser = namedtuple('Browser', ['family', 'version', 'version_string']) + + +def parse_browser(family, major=None, minor=None, patch=None, patch_minor=None): + # Returns a browser object + version = parse_version(major, minor, patch) + version_string = '.'.join([str(v) for v in version]) + return Browser(family, version, version_string) + + +OperatingSystem = namedtuple('OperatingSystem', ['family', 'version', 'version_string']) + + +def parse_operating_system(family, major=None, minor=None, patch=None, patch_minor=None): + version = parse_version(major, minor, patch) + version_string = '.'.join([str(v) for v in version]) + return OperatingSystem(family, version, version_string) + + +Device = namedtuple('Device', ['family', 'brand', 'model']) + + +def parse_device(family, brand, model): + return Device(family, brand, model) + + +class UserAgent(object): + + def __init__(self, user_agent_string): + ua_dict = user_agent_parser.Parse(user_agent_string) + self.ua_string = user_agent_string + self.os = parse_operating_system(**ua_dict['os']) + self.browser = parse_browser(**ua_dict['user_agent']) + self.device = parse_device(**ua_dict['device']) + + def __str__(self): + return "{device} / {os} / {browser}".format( + device=self.get_device(), + os=self.get_os(), + browser=self.get_browser() + ) + + def __unicode__(self): + return unicode(str(self)) + + def _is_android_tablet(self): + # Newer Android tablets don't have "Mobile" in their user agent string, + # older ones like Galaxy Tab still have "Mobile" though they're not + if ('Mobile Safari' not in self.ua_string and + self.browser.family != "Firefox Mobile"): + return True + return False + + def _is_blackberry_touch_capable_device(self): + # A helper to determine whether a BB phone has touch capabilities + # Blackberry Bold Touch series begins with 99XX + if 'Blackberry 99' in self.device.family: + return True + if 'Blackberry 95' in self.device.family: # BB Storm devices + return True + return False + + def get_device(self): + return self.is_pc and "PC" or self.device.family + + def get_os(self): + return ("%s %s" % (self.os.family, self.os.version_string)).strip() + + def get_browser(self): + return ("%s %s" % (self.browser.family, self.browser.version_string)).strip() + + @property + def is_tablet(self): + if self.device.family in TABLET_DEVICE_FAMILIES: + return True + if (self.os.family == 'Android' and self._is_android_tablet()): + return True + if self.os.family == 'Windows' and self.os.version_string.startswith('RT'): + return True + if self.os.family == 'Firefox OS' and 'Mobile' not in self.browser.family: + return True + return False + + @property + def is_mobile(self): + # First check for mobile device and mobile browser families + if self.device.family in MOBILE_DEVICE_FAMILIES: + return True + if self.browser.family in MOBILE_BROWSER_FAMILIES: + return True + # Device is considered Mobile OS is Android and not tablet + # This is not fool proof but would have to suffice for now + if ((self.os.family == 'Android' or self.os.family == 'Firefox OS') + and not self.is_tablet): + return True + if self.os.family == 'BlackBerry OS' and self.device.family != 'Blackberry Playbook': + return True + if self.os.family in MOBILE_OS_FAMILIES: + return True + # TODO: remove after https://github.com/tobie/ua-parser/issues/126 is closed + if 'J2ME' in self.ua_string or 'MIDP' in self.ua_string: + return True + # This is here mainly to detect Google's Mobile Spider + if 'iPhone;' in self.ua_string: + return True + if 'Googlebot-Mobile' in self.ua_string: + return True + # Mobile Spiders should be identified as mobile + if self.device.family == 'Spider' and 'Mobile' in self.browser.family: + return True + # Nokia mobile + if 'NokiaBrowser' in self.ua_string and 'Mobile' in self.ua_string: + return True + return False + + @property + def is_touch_capable(self): + # TODO: detect touch capable Nokia devices + if self.os.family in TOUCH_CAPABLE_OS_FAMILIES: + return True + if self.device.family in TOUCH_CAPABLE_DEVICE_FAMILIES: + return True + if self.os.family == 'Windows': + if self.os.version_string.startswith(('RT', 'CE')): + return True + if self.os.version_string.startswith('8') and 'Touch' in self.ua_string: + return True + if 'BlackBerry' in self.os.family and self._is_blackberry_touch_capable_device(): + return True + return False + + @property + def is_pc(self): + # Returns True for "PC" devices (Windows, Mac and Linux) + if 'Windows NT' in self.ua_string or self.os.family in PC_OS_FAMILIES or \ + self.os.family == 'Windows' and self.os.version_string == 'ME': + return True + # TODO: remove after https://github.com/tobie/ua-parser/issues/127 is closed + if self.os.family == 'Mac OS X' and 'Silk' not in self.ua_string: + return True + # Maemo has 'Linux' and 'X11' in UA, but it is not for PC + if 'Maemo' in self.ua_string: + return False + if 'Chrome OS' in self.os.family: + return True + if 'Linux' in self.ua_string and 'X11' in self.ua_string: + return True + return False + + @property + def is_bot(self): + return True if self.device.family == 'Spider' else False + + @property + def is_email_client(self): + if self.browser.family in EMAIL_PROGRAM_FAMILIES: + return True + return False + + +def parse(user_agent_string): + return UserAgent(user_agent_string) diff --git a/app_common/lib/user_agents/tests.py b/app_common/lib/user_agents/tests.py new file mode 100644 index 000000000..345cf8278 --- /dev/null +++ b/app_common/lib/user_agents/tests.py @@ -0,0 +1,268 @@ +import json +import os +import unittest + +from ua_parser import user_agent_parser +from . import compat +from .parsers import parse + + +iphone_ua_string = 'Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B179 Safari/7534.48.3' +ipad_ua_string = 'Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10' +galaxy_tab_ua_string = 'Mozilla/5.0 (Linux; U; Android 2.2; en-us; SCH-I800 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1' +galaxy_s3_ua_string = 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30' +kindle_fire_ua_string = 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us; Silk/1.1.0-80) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Silk-Accelerated=true' +playbook_ua_string = 'Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.0.1; en-US) AppleWebKit/535.8+ (KHTML, like Gecko) Version/7.2.0.1 Safari/535.8+' +nexus_7_ua_string = 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19' +windows_phone_ua_string = 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; SGH-i917)' +blackberry_torch_ua_string = 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; zh-TW) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.448 Mobile Safari/534.8+' +blackberry_bold_ua_string = 'BlackBerry9700/5.0.0.862 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/331 UNTRUSTED/1.0 3gpp-gba' +blackberry_bold_touch_ua_string = 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9930; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.0.0.241 Mobile Safari/534.11+' +windows_rt_ua_string = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; ARM; Trident/6.0)' +j2me_opera_ua_string = 'Opera/9.80 (J2ME/MIDP; Opera Mini/9.80 (J2ME/22.478; U; en) Presto/2.5.25 Version/10.54' +ie_ua_string = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)' +ie_touch_ua_string = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0; Touch)' +mac_safari_ua_string = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.13+ (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2' +windows_ie_ua_string = 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)' +ubuntu_firefox_ua_string = 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0.1' +google_bot_ua_string = 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)' +nokia_n97_ua_string = 'Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/12.0.024; Profile/MIDP-2.1 Configuration/CLDC-1.1; en-us) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.12344' +android_firefox_aurora_ua_string = 'Mozilla/5.0 (Android; Mobile; rv:27.0) Gecko/27.0 Firefox/27.0' +thunderbird_ua_string = 'Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.2.0 Lightning/4.0.2' +outlook_usa_string = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/6.0; Microsoft Outlook 15.0.4420)' +chromebook_ua_string = 'Mozilla/5.0 (X11; CrOS i686 0.12.433) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.77 Safari/534.30' + +iphone_ua = parse(iphone_ua_string) +ipad_ua = parse(ipad_ua_string) +galaxy_tab = parse(galaxy_tab_ua_string) +galaxy_s3_ua = parse(galaxy_s3_ua_string) +kindle_fire_ua = parse(kindle_fire_ua_string) +playbook_ua = parse(playbook_ua_string) +nexus_7_ua = parse(nexus_7_ua_string) +windows_phone_ua = parse(windows_phone_ua_string) +windows_rt_ua = parse(windows_rt_ua_string) +blackberry_torch_ua = parse(blackberry_torch_ua_string) +blackberry_bold_ua = parse(blackberry_bold_ua_string) +blackberry_bold_touch_ua = parse(blackberry_bold_touch_ua_string) +j2me_opera_ua = parse(j2me_opera_ua_string) +ie_ua = parse(ie_ua_string) +ie_touch_ua = parse(ie_touch_ua_string) +mac_safari_ua = parse(mac_safari_ua_string) +windows_ie_ua = parse(windows_ie_ua_string) +ubuntu_firefox_ua = parse(ubuntu_firefox_ua_string) +google_bot_ua = parse(google_bot_ua_string) +nokia_n97_ua = parse(nokia_n97_ua_string) +android_firefox_aurora_ua = parse(android_firefox_aurora_ua_string) +thunderbird_ua = parse(thunderbird_ua_string) +outlook_ua = parse(outlook_usa_string) +chromebook_ua = parse(chromebook_ua_string) + + +class UserAgentsTest(unittest.TestCase): + + def test_user_agent_object_assignments(self): + ua_dict = user_agent_parser.Parse(devices['iphone']['ua_string']) + iphone_ua = devices['iphone']['user_agent'] + + # Ensure browser attributes are assigned correctly + self.assertEqual(iphone_ua.browser.family, + ua_dict['user_agent']['family']) + self.assertEqual( + iphone_ua.browser.version, + (int(ua_dict['user_agent']['major']), + int(ua_dict['user_agent']['minor'])) + ) + + # Ensure os attributes are assigned correctly + self.assertEqual(iphone_ua.os.family, ua_dict['os']['family']) + self.assertEqual( + iphone_ua.os.version, + (int(ua_dict['os']['major']), int(ua_dict['os']['minor'])) + ) + + # Ensure device attributes are assigned correctly + self.assertEqual(iphone_ua.device.family, + ua_dict['device']['family']) + + def test_is_tablet_property(self): + self.assertFalse(iphone_ua.is_tablet) + self.assertFalse(galaxy_s3_ua.is_tablet) + self.assertFalse(blackberry_torch_ua.is_tablet) + self.assertFalse(blackberry_bold_ua.is_tablet) + self.assertFalse(windows_phone_ua.is_tablet) + self.assertFalse(ie_ua.is_tablet) + self.assertFalse(ie_touch_ua.is_tablet) + self.assertFalse(mac_safari_ua.is_tablet) + self.assertFalse(windows_ie_ua.is_tablet) + self.assertFalse(ubuntu_firefox_ua.is_tablet) + self.assertFalse(j2me_opera_ua.is_tablet) + self.assertFalse(google_bot_ua.is_tablet) + self.assertFalse(nokia_n97_ua.is_tablet) + self.assertTrue(windows_rt_ua.is_tablet) + self.assertTrue(ipad_ua.is_tablet) + self.assertTrue(playbook_ua.is_tablet) + self.assertTrue(kindle_fire_ua.is_tablet) + self.assertTrue(nexus_7_ua.is_tablet) + self.assertFalse(android_firefox_aurora_ua.is_tablet) + + def test_is_mobile_property(self): + self.assertTrue(iphone_ua.is_mobile) + self.assertTrue(galaxy_s3_ua.is_mobile) + self.assertTrue(blackberry_torch_ua.is_mobile) + self.assertTrue(blackberry_bold_ua.is_mobile) + self.assertTrue(windows_phone_ua.is_mobile) + self.assertTrue(j2me_opera_ua.is_mobile) + self.assertTrue(nokia_n97_ua.is_mobile) + self.assertFalse(windows_rt_ua.is_mobile) + self.assertFalse(ipad_ua.is_mobile) + self.assertFalse(playbook_ua.is_mobile) + self.assertFalse(kindle_fire_ua.is_mobile) + self.assertFalse(nexus_7_ua.is_mobile) + self.assertFalse(ie_ua.is_mobile) + self.assertFalse(ie_touch_ua.is_mobile) + self.assertFalse(mac_safari_ua.is_mobile) + self.assertFalse(windows_ie_ua.is_mobile) + self.assertFalse(ubuntu_firefox_ua.is_mobile) + self.assertFalse(google_bot_ua.is_mobile) + self.assertTrue(android_firefox_aurora_ua.is_mobile) + + def test_is_touch_property(self): + self.assertTrue(iphone_ua.is_touch_capable) + self.assertTrue(galaxy_s3_ua.is_touch_capable) + self.assertTrue(ipad_ua.is_touch_capable) + self.assertTrue(playbook_ua.is_touch_capable) + self.assertTrue(kindle_fire_ua.is_touch_capable) + self.assertTrue(nexus_7_ua.is_touch_capable) + self.assertTrue(windows_phone_ua.is_touch_capable) + self.assertTrue(ie_touch_ua.is_touch_capable) + self.assertTrue(blackberry_bold_touch_ua.is_mobile) + self.assertTrue(blackberry_torch_ua.is_mobile) + self.assertFalse(j2me_opera_ua.is_touch_capable) + self.assertFalse(ie_ua.is_touch_capable) + self.assertFalse(blackberry_bold_ua.is_touch_capable) + self.assertFalse(mac_safari_ua.is_touch_capable) + self.assertFalse(windows_ie_ua.is_touch_capable) + self.assertFalse(ubuntu_firefox_ua.is_touch_capable) + self.assertFalse(google_bot_ua.is_touch_capable) + self.assertFalse(nokia_n97_ua.is_touch_capable) + self.assertTrue(android_firefox_aurora_ua.is_touch_capable) + + def test_is_pc(self): + self.assertFalse(iphone_ua.is_pc) + self.assertFalse(galaxy_s3_ua.is_pc) + self.assertFalse(ipad_ua.is_pc) + self.assertFalse(playbook_ua.is_pc) + self.assertFalse(kindle_fire_ua.is_pc) + self.assertFalse(nexus_7_ua.is_pc) + self.assertFalse(windows_phone_ua.is_pc) + self.assertFalse(blackberry_bold_touch_ua.is_pc) + self.assertFalse(blackberry_torch_ua.is_pc) + self.assertFalse(blackberry_bold_ua.is_pc) + self.assertFalse(j2me_opera_ua.is_pc) + self.assertFalse(google_bot_ua.is_pc) + self.assertFalse(nokia_n97_ua.is_pc) + self.assertTrue(mac_safari_ua.is_pc) + self.assertTrue(windows_ie_ua.is_pc) + self.assertTrue(ubuntu_firefox_ua.is_pc) + self.assertTrue(ie_touch_ua.is_pc) + self.assertTrue(ie_ua.is_pc) + self.assertFalse(android_firefox_aurora_ua.is_pc) + self.assertTrue(chromebook_ua.is_pc) + + def test_is_bot(self): + self.assertTrue(google_bot_ua.is_bot) + self.assertFalse(iphone_ua.is_bot) + self.assertFalse(galaxy_s3_ua.is_bot) + self.assertFalse(ipad_ua.is_bot) + self.assertFalse(playbook_ua.is_bot) + self.assertFalse(kindle_fire_ua.is_bot) + self.assertFalse(nexus_7_ua.is_bot) + self.assertFalse(windows_phone_ua.is_bot) + self.assertFalse(blackberry_bold_touch_ua.is_bot) + self.assertFalse(blackberry_torch_ua.is_bot) + self.assertFalse(blackberry_bold_ua.is_bot) + self.assertFalse(j2me_opera_ua.is_bot) + self.assertFalse(mac_safari_ua.is_bot) + self.assertFalse(windows_ie_ua.is_bot) + self.assertFalse(ubuntu_firefox_ua.is_bot) + self.assertFalse(ie_touch_ua.is_bot) + self.assertFalse(ie_ua.is_bot) + self.assertFalse(nokia_n97_ua.is_bot) + self.assertFalse(android_firefox_aurora_ua.is_bot) + + def test_is_email_client(self): + self.assertTrue(thunderbird_ua.is_email_client) + self.assertTrue(outlook_ua.is_email_client) + self.assertFalse(playbook_ua.is_email_client) + self.assertFalse(kindle_fire_ua.is_email_client) + self.assertFalse(nexus_7_ua.is_email_client) + self.assertFalse(windows_phone_ua.is_email_client) + self.assertFalse(blackberry_bold_touch_ua.is_email_client) + self.assertFalse(blackberry_torch_ua.is_email_client) + self.assertFalse(blackberry_bold_ua.is_email_client) + self.assertFalse(j2me_opera_ua.is_email_client) + self.assertFalse(mac_safari_ua.is_email_client) + self.assertFalse(windows_ie_ua.is_email_client) + self.assertFalse(ubuntu_firefox_ua.is_email_client) + self.assertFalse(ie_touch_ua.is_email_client) + self.assertFalse(ie_ua.is_email_client) + self.assertFalse(nokia_n97_ua.is_email_client) + self.assertFalse(android_firefox_aurora_ua.is_email_client) + + + def test_strings(self): + self.assertEqual(str(iphone_ua), "iPhone / iOS 5.1 / Mobile Safari 5.1") + self.assertEqual(str(ipad_ua), "iPad / iOS 3.2 / Mobile Safari 4.0.4") + self.assertEqual(str(galaxy_tab), "Samsung SCH-I800 / Android 2.2 / Android 2.2") + self.assertEqual(str(galaxy_s3_ua), "Samsung GT-I9300 / Android 4.0.4 / Android 4.0.4") + self.assertEqual(str(kindle_fire_ua), "Kindle / Android / Amazon Silk 1.1.0-80") + self.assertEqual(str(playbook_ua), "BlackBerry Playbook / BlackBerry Tablet OS 2.0.1 / BlackBerry WebKit 2.0.1") + self.assertEqual(str(nexus_7_ua), "Asus Nexus 7 / Android 4.1.1 / Chrome 18.0.1025") + self.assertEqual(str(windows_phone_ua), "Samsung SGH-i917 / Windows Phone 7.5 / IE Mobile 9.0") + self.assertEqual(str(windows_rt_ua), "PC / Windows RT / IE 10.0") + self.assertEqual(str(blackberry_torch_ua), "BlackBerry 9800 / BlackBerry OS 6.0.0 / BlackBerry WebKit 6.0.0") + self.assertEqual(str(blackberry_bold_ua), "BlackBerry 9700 / BlackBerry OS 5.0.0 / BlackBerry 9700") + self.assertEqual(str(blackberry_bold_touch_ua), "BlackBerry 9930 / BlackBerry OS 7.0.0 / BlackBerry WebKit 7.0.0") + self.assertEqual(str(j2me_opera_ua), "Generic Feature Phone / Other / Opera Mini 9.80") + self.assertEqual(str(ie_ua), "PC / Windows 8 / IE 10.0") + self.assertEqual(str(ie_touch_ua), "PC / Windows 8 / IE 10.0") + self.assertEqual(str(mac_safari_ua), "PC / Mac OS X 10.6.8 / WebKit Nightly 537.13") + self.assertEqual(str(windows_ie_ua), "PC / Windows 7 / IE 9.0") + self.assertEqual(str(ubuntu_firefox_ua), "PC / Ubuntu / Firefox 15.0.1") + self.assertEqual(str(google_bot_ua), "Spider / Other / Googlebot 2.1") + self.assertEqual(str(nokia_n97_ua), "Nokia N97 / Symbian OS 9.4 / Nokia Browser 7.1.12344") + self.assertEqual(str(android_firefox_aurora_ua), "Generic Smartphone / Android / Firefox Mobile 27.0") + + def test_unicode_strings(self): + try: + # Python 2 + unicode_ua_str = unicode(devices['iphone']['user_agent']) + self.assertEqual(unicode_ua_str, + u"iPhone / iOS 5.1 / Mobile Safari 5.1") + self.assertTrue(isinstance(unicode_ua_str, unicode)) + except NameError: + # Python 3 + unicode_ua_str = str(devices['iphone']['user_agent']) + self.assertEqual(unicode_ua_str, + "iPhone / iOS 5.1 / Mobile Safari 5.1") + + +with open(os.path.join(os.path.dirname(__file__), 'devices.json')) as f: + devices = json.load(f) + + +def test_wrapper(items): + def test_func(self): + attrs = ('is_bot', 'is_mobile', + 'is_pc', 'is_tablet', 'is_touch_capable') + for attr in attrs: + self.assertEqual( + getattr(items['user_agent'], attr), items[attr], msg=attr) + # Temporarily commenting this out since UserAgent.device + # may return different string depending ua-parser version + # self.assertEqual(str(items['user_agent']), items['str']) + return test_func + +for device, items in compat.iteritems(devices): + items['user_agent'] = parse(items['ua_string']) + setattr(UserAgentsTest, 'test_' + device, test_wrapper(items)) diff --git a/app_common/models/__init__.py b/app_common/models/__init__.py new file mode 100644 index 000000000..534ba2b75 --- /dev/null +++ b/app_common/models/__init__.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# Part of odooai.cn. See LICENSE file for full copyright and licensing details. + +# Created on 2023-02-02 +# author: 欧度智能,http://www.odooai.cn +# email: 300883@qq.com +# resource of odooai +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +# Odoo12在线用户手册(长期更新) +# http://www.odooai.cn/documentation/user/12.0/en/index.html + +# Odoo12在线开发者手册(长期更新) +# http://www.odooai.cn/documentation/12.0/index.html + +# Odoo10在线中文用户手册(长期更新) +# http://www.odooai.cn/documentation/user/10.0/zh_CN/index.html + +# Odoo10离线中文用户手册下载 +# http://www.odooai.cn/odoo10_user_manual_document_offline/ +# Odoo10离线开发手册下载-含python教程,jquery参考,Jinja2模板,PostgresSQL参考(odoo开发必备) +# http://www.odooai.cn/odoo10_developer_document_offline/ +# description: + +from . import base +from . import ir_ui_view +from . import ir_cron +from . import res_users +from . import ir_mail_server +from . import mail_mail +from . import ir_http +from . import app_import +from . import res_partner + + + + diff --git a/app_common/models/app_import.py b/app_common/models/app_import.py new file mode 100644 index 000000000..04cd79fad --- /dev/null +++ b/app_common/models/app_import.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- + +import base64 +import io +import csv +import os.path + +from odoo import api, fields, models, modules, tools, SUPERUSER_ID, _ +from odoo.tools import pycompat +from odoo.tests import common +ADMIN_USER_ID = common.ADMIN_USER_ID + +def app_quick_import(cr, content_path, sep=None): + if not sep: + sep = '/' + dir_split = content_path.split(sep) + module_name = dir_split[0] + file_name = dir_split[2] + file_path, file_type = os.path.splitext(content_path) + model_name = file_name.replace(file_type, '') + file_path = modules.get_module_resource(module_name, dir_split[1], file_name) + content = open(file_path, 'rb').read() + uid = SUPERUSER_ID + if model_name == 'discuss.channel': + # todo: 创建discuss.channel时,如果用root用户会报错 + uid = 2 + env = api.Environment(cr, uid, {}) + if file_type == '.csv': + file_type = 'text/csv' + elif file_type in ['.xls', '.xlsx']: + file_type = 'application/vnd.ms-excel' + import_wizard = env['base_import.import'].create({ + 'res_model': model_name, + 'file_name': file_name, + 'file_type': file_type, + 'file': content, + }) + if file_type == 'text/csv': + preview = import_wizard.parse_preview({ + 'separator': ',', + 'has_headers': True, + 'quoting': '"', + }) + elif file_type == 'application/vnd.ms-excel': + preview = import_wizard.parse_preview({ + 'has_headers': True, + }) + result = import_wizard.execute_import( + preview["headers"], + preview["headers"], + preview["options"] + ) + + diff --git a/app_common/models/base.py b/app_common/models/base.py new file mode 100644 index 000000000..f9aa597c1 --- /dev/null +++ b/app_common/models/base.py @@ -0,0 +1,242 @@ +# -*- coding: utf-8 -*- +from odoo import models, fields, api, _ +from odoo.tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FORMAT +from odoo.http import request + +import requests +import base64 +from io import BytesIO +import uuid + +from datetime import date, datetime, time +import pytz + +import logging + +_logger = logging.getLogger(__name__) + +# 常规的排除的fields +EXCLU_FIELDS = [ + '__last_update', + 'access_token', + 'access_url', + 'access_warning', + 'activity_date_deadline', + 'activity_exception_decoration', + 'activity_exception_icon', + 'activity_ids', + 'activity_state', + 'activity_summary', + 'activity_type_id', + 'activity_user_id', + 'display_name', + 'message_attachment_count', + 'message_channel_ids', + 'message_follower_ids', + 'message_has_error', + 'message_has_error_counter', + 'message_has_sms_error', + 'message_ids', + 'message_is_follower', + 'message_main_attachment_id', + 'message_needaction', + 'message_needaction_counter', + 'message_partner_ids', + 'message_unread', + 'message_unread_counter', + 'website_message_ids', + 'write_date', + 'write_uid', +] + + +class Base(models.AbstractModel): + _inherit = 'base' + + @api.model + def _app_check_sys_op(self): + if self.env.user.has_group('base.group_erp_manager'): + return True + return False + + @api.model + def _get_normal_fields(self): + f_list = [] + for k, v in self._fields.items(): + if k not in EXCLU_FIELDS: + f_list.append(k) + return f_list + + @api.model + def _app_get_m2o_default(self, fieldname, domain=[]): + if hasattr(self, fieldname) and self._fields[fieldname].type == 'many2one': + if self._context.get(fieldname) or self._context.get('default_%s' % fieldname): + return self._context.get(fieldname) or self._context.get('default_%s' % fieldname) + else: + if not domain: + domain = self._fields[fieldname].domain or [] + rec = self.env[self._fields[fieldname].comodel_name].sudo().search(domain, limit=1) + return rec.id if rec else False + return False + + def _app_dt2local(self, value, return_format=DEFAULT_SERVER_DATETIME_FORMAT): + """ + 将value中时间,按格式转为用户本地时间.注意只处理in str为字符串类型,如果是时间类型直接用 datetime.now(tz) + """ + if not value: + return value + if isinstance(value, datetime): + value = value.strftime(return_format) + dt = datetime.strptime(value, return_format) + user_tz = pytz.timezone(self.env.user.tz or 'Etc/GMT-8') + _logger.warning('============= user2 tz: %s' % user_tz) + dt = dt.replace(tzinfo=pytz.timezone('UTC')) + return dt.astimezone(user_tz).strftime(return_format) + + def _app_dt2utc(self, value, return_format=DEFAULT_SERVER_DATETIME_FORMAT): + """ + 将value中用户本地时间,按格式转为UTC时间,输出 str + """ + if not value: + return value + if isinstance(value, datetime): + value = value.strftime(return_format) + dt = datetime.strptime(value, return_format) + pytz_timezone = pytz.timezone('Etc/GMT+8') + dt = dt.replace(tzinfo=pytz.timezone('UTC')) + return dt.astimezone(pytz_timezone).strftime(return_format) + + @api.model + def _get_image_from_url(self, url): + # 返回这个图片的base64编码 + if not self._app_check_sys_op(): + return False + return get_image_from_url(url) + + @api.model + def _get_image_url2attachment(self, url, mimetype_list=None): + # Todo: mimetype filter + if not self._app_check_sys_op(): + return False + image, file_name = get_image_url2attachment(url) + if image and file_name: + try: + attachment = self.env['ir.attachment'].create({ + 'datas': image, + 'name': file_name, + 'website_id': False, + 'res_model': self._name, + 'res_id': self.id, + }) + attachment.generate_access_token() + return attachment + except Exception as e: + _logger.error('get_image_url2attachment error: %s' % str(e)) + return False + else: + return False + + @api.model + def _get_image_base642attachment(self, data): + if not self._app_check_sys_op(): + return False + image, file_name = get_image_base642attachment(data) + if image and file_name: + try: + attachment = self.env['ir.attachment'].create({ + 'datas': image, + 'name': file_name, + 'website_id': False, + 'res_model': self._name, + 'res_id': self.id, + }) + attachment.generate_access_token() + return attachment + except Exception as e: + _logger.error('get_image_base642attachment error: %s' % str(e)) + return False + else: + return False + + def get_ua_type(self): + return get_ua_type() + + +def get_image_from_url(url): + if not url: + return None + try: + response = requests.get(url, timeout=5) + except Exception as e: + return None + # 返回这个图片的base64编码 + return base64.b64encode(BytesIO(response.content).read()) + + +def get_image_url2attachment(url): + if not url: + return None + try: + if url.startswith('//'): + url = 'https:%s' % url + response = requests.get(url, timeout=30) + except Exception as e: + return None, None + # 返回这个图片的base64编码 + image = base64.b64encode(BytesIO(response.content).read()) + file_name = url.split('/')[-1] + return image, file_name + + +def get_image_base642attachment(data): + if not data: + return None + try: + image_data = data.split(',')[1] + file_name = str(uuid.uuid4()) + '.png' + return image_data, file_name + except Exception as e: + return None, None + + +def get_ua_type(): + ua = request.httprequest.headers.get('User-Agent') + # 临时用 agent 处理,后续要前端中正确处理或者都从后台来 + # 微信浏览器 + # MicroMessenger: Mozilla/5.0 (Linux; Android 10; ELE-AL00 Build/HUAWEIELE-AL00; wv) + # AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 + # MQQBrowser/6.2 TBS/045525 Mobile Safari/537.36 MMWEBID/3135 MicroMessenger/8.0.2.1860(0x2800023B) Process/tools WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 + # 微信浏览器,开发工具,网页 iphone + # ,Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1 + # wechatdevtools/1.03.2011120 MicroMessenger/7.0.4 Language/zh_CN webview/16178807094901773 + # webdebugger port/27772 token/b91f4a234b918f4e2a5d1a835a09c31e + + # 微信小程序 + # MicroMessenger: Mozilla/5.0 (Linux; Android 10; ELE-AL00 Build/HUAWEIELE-AL00; wv) + # AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.62 XWEB/2767 MMWEBSDK/20210302 Mobile Safari/537.36 MMWEBID/6689 MicroMessenger/8.0.2.1860(0x2800023B) Process/appbrand2 WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 + # MiniProgramEnv/android + # 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_7_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.37(0x18002529) NetType/WIFI Language/zh_CN' + # 微信浏览器,开发工具,小程序,iphone + # Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1 + # wechatdevtools/1.03.2011120 MicroMessenger/7.0.4 Language/zh_CN webview/ + # 微信内,iphone web + # Mozilla/5.0 (iPhone; CPU iPhone OS 14_4_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 + # MicroMessenger/8.0.3(0x1800032a) NetType/WIFI Language/zh_CN + # 安卓app,h5 + # ELE-AL00(Android/10) (cn.erpapp.o20sticks.App/13.20.12.09) Weex/0.26.0 1080x2265 + + # web 表示普通浏览器,后续更深入处理 + utype = 'web' + # todo: 引入现成 py lib,处理企业微信 + if 'MicroMessenger' in ua and 'webdebugger' not in ua \ + and ('miniProgram' in ua or 'MiniProgram' in ua or 'MiniProgramEnv' in ua or 'wechatdevtools' in ua): + # 微信小程序及开发者工具 + utype = 'wxapp' + elif 'MicroMessenger' in ua: + # 微信浏览器 + utype = 'wxweb' + elif 'cn.erpapp.o20sticks.App' in ua: + # 安卓app + utype = 'native_android' + # _logger.warning('=========get ua %s,%s' % (utype, ua)) + return utype diff --git a/app_common/models/ir_cron.py b/app_common/models/ir_cron.py new file mode 100644 index 000000000..0d5955ad8 --- /dev/null +++ b/app_common/models/ir_cron.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +import logging +from odoo import api, fields, models, modules, tools, _ + +_logger = logging.getLogger(__name__) + +class IrCron(models.Model): + _inherit = "ir.cron" + + trigger_user_id = fields.Many2one('res.users', string='Last Trigger User') + + def method_direct_trigger(self): + self.write({'trigger_user_id': self.env.user.id}) + return super(IrCron, self).method_direct_trigger() diff --git a/app_common/models/ir_http.py b/app_common/models/ir_http.py new file mode 100644 index 000000000..565d83ed2 --- /dev/null +++ b/app_common/models/ir_http.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + + +from odoo import models +from odoo.http import request + + +class IrHttp(models.AbstractModel): + _inherit = 'ir.http' + + def session_info(self): + result = super(IrHttp, self).session_info() + result['ua_type'] = self.get_ua_type() + return result + + diff --git a/app_common/models/ir_mail_server.py b/app_common/models/ir_mail_server.py new file mode 100644 index 000000000..2321f0d0a --- /dev/null +++ b/app_common/models/ir_mail_server.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- + +from odoo import api, fields, models, _ + +import logging +_logger = logging.getLogger(__name__) + +class IrMailServer(models.Model): + _inherit = "ir.mail_server" + _order = "sequence" + + # 改默认发邮件逻辑 + @api.model + def send_email(self, message, mail_server_id=None, smtp_server=None, smtp_port=None, + smtp_user=None, smtp_password=None, smtp_encryption=None, + smtp_ssl_certificate=None, smtp_ssl_private_key=None, + smtp_debug=False, smtp_session=None): + email_to = message['To'] + + # 忽略掉无效email,避免被ban + if email_to: + if email_to.find('no-reply@odooai.cn') != -1 or email_to.find('postmaster-odoo@odooai.cn') != -1: + pass + elif email_to.find('example.com') != -1 or email_to.find('@sunpop.cn') != -1 or email_to.find('@odooapp.cn') != -1: + _logger.error(_("=================Email to ignore: %s") % email_to) + raise AssertionError(_("Email to ignore: %s") % email_to) + + return super(IrMailServer, self).send_email(message, mail_server_id, smtp_server, smtp_port, + smtp_user, smtp_password, smtp_encryption, smtp_ssl_certificate, smtp_ssl_private_key, + smtp_debug, smtp_session) diff --git a/app_common/models/ir_ui_view.py b/app_common/models/ir_ui_view.py new file mode 100644 index 000000000..a25941ad2 --- /dev/null +++ b/app_common/models/ir_ui_view.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +from odoo import api, models, tools, SUPERUSER_ID +from odoo.modules.module import get_resource_path +from odoo.tools import view_validation +from odoo.tools.view_validation import _relaxng_cache, validate, _validators +from odoo.tools.safe_eval import safe_eval + +from lxml import etree +import logging +_logger = logging.getLogger(__name__) + +def app_relaxng(view_type): + """ Return a validator for the given view type, or None. """ + if view_type not in _relaxng_cache: + # tree, search 特殊 + if view_type in ['tree', 'search']: + _file = get_resource_path('app_common', 'rng', '%s_view.rng' % view_type) + else: + _file = get_resource_path('base', 'rng', '%s_view.rng' % view_type) + with tools.file_open(_file) as frng: + try: + relaxng_doc = etree.parse(frng) + _relaxng_cache[view_type] = etree.RelaxNG(relaxng_doc) + except Exception: + _logger.error('You can Ignore this. Failed to load RelaxNG XML schema for views validation') + _relaxng_cache[view_type] = None + return _relaxng_cache[view_type] + +# view_validation.relaxng = app_relaxng +# +# class View(models.Model): +# _inherit = 'ir.ui.view' +# +# def __init__(self, env, ids, prefetch_ids): +# # 这里应该是无必要,但为了更安全 +# super(View, self).__init__(env, ids, prefetch_ids) +# view_validation.relaxng = app_relaxng +# +# # todo: 有可能需要处理增加的 header等标签 +# # 直接重写原生方法 +# # def transfer_node_to_modifiers(node, modifiers, context=None, in_tree_view=False): diff --git a/app_common/models/mail_mail.py b/app_common/models/mail_mail.py new file mode 100644 index 000000000..1783926c2 --- /dev/null +++ b/app_common/models/mail_mail.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- + +from odoo import api, fields, models, _ + +import logging +_logger = logging.getLogger(__name__) + +class MailMail(models.Model): + _inherit = "mail.mail" + + # 猴子补丁模式,改默认发邮件逻辑 + def _send(self, auto_commit=False, raise_exception=False, smtp_session=None, alias_domain_id=False): + for m in self: + email_to = m.email_to + # 忽略掉无效email,避免被ban + if email_to: + if email_to.find('no-reply@odooai.cn') != -1 or email_to.find('postmaster-odoo@odooai.cn') != -1: + pass + elif email_to.find('example.com') != -1 or email_to.find('@sunpop.cn') != -1 or email_to.find('@odooapp.cn') != -1: + _logger.error(_("=================Email to ignore: %s") % email_to) + self = self - m + if not self: + return True + return super(MailMail, self)._send(auto_commit, raise_exception, smtp_session, alias_domain_id) diff --git a/app_common/models/res_partner.py b/app_common/models/res_partner.py new file mode 100644 index 000000000..43e5eed64 --- /dev/null +++ b/app_common/models/res_partner.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models, tools, _ + + +class ResPartner(models.Model): + _inherit = 'res.partner' + + def get_related_user_id(self): + self.ensure_one() + user = self.env['res.users'].sudo().with_context(active_test=False).search([('partner_id', '=', self.id)], limit=1) + if not user and self.commercial_partner_id: + user = self.env['res.users'].sudo().with_context(active_test=False).search([('partner_id', '=', self.commercial_partner_id.id)], + limit=1) + return user diff --git a/app_common/models/res_users.py b/app_common/models/res_users.py new file mode 100644 index 000000000..1c18b7ad2 --- /dev/null +++ b/app_common/models/res_users.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models, tools, _ + + +class ResUsers(models.Model): + _inherit = 'res.users' + + login = fields.Char(index=True) diff --git a/app_common/report/__init__.py b/app_common/report/__init__.py new file mode 100644 index 000000000..633f86615 --- /dev/null +++ b/app_common/report/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- + diff --git a/app_common/rng/common.rng b/app_common/rng/common.rng new file mode 100644 index 000000000..0acd4c8ef --- /dev/null +++ b/app_common/rng/common.rng @@ -0,0 +1,428 @@ + + + + + + + + + + + + before + + after + + inside + + replace + + + + + + attributes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app_common/rng/search_view.rng b/app_common/rng/search_view.rng new file mode 100644 index 000000000..3f3c711fb --- /dev/null +++ b/app_common/rng/search_view.rng @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app_common/rng/tree_view.rng b/app_common/rng/tree_view.rng new file mode 100644 index 000000000..770c808cb --- /dev/null +++ b/app_common/rng/tree_view.rng @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + top + bottom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app_common/static/description/banner.png b/app_common/static/description/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..fe6f68186b8708529263bd5dab6120ac01aabcc0 GIT binary patch literal 34527 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

~KI;sGxT_Lqrq?3i#Zw)fV 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 FV1i9U6pa7? literal 0 HcmV?d00001 diff --git a/app_common/static/description/banner1.png b/app_common/static/description/banner1.png new file mode 100644 index 0000000000000000000000000000000000000000..91d450c8e8bad9011e2bce5d35dca44bc51eba4f GIT binary patch literal 205199 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

;N2W9fw7A$n|Mau9r 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%0DdV$PvlmQP)~$8!R1Da{ncSP&##yN~ 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�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૲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 literal 0 HcmV?d00001 diff --git a/app_common/static/description/icon.png b/app_common/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2565562f7cc3eab7fa74aa27602987a89d21009e GIT binary patch literal 71282 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 M z6!_t>R%7;c}cZ;U%Xmw-^_=UAqBN-_=dm7u_=Q=6{b%0>!^Y zT>2(t%h-Babg{;1Q;C8>UF8ELD?a?xiHFS`Z-d~C4rQ=$<7UDpwI;>u6+K z-0ox>EG&lWmhpz}JDNK#laa|j_eH(W52Hclz!$;Z>>dLCzzpy8`@jGGwUD6AWe{jF z64BFHIjr4{Ru+s{?CmO87nKx4N|3XX{i$B}x;;_fwe&VBFU_lRXb^m3{9J8|F6SF8 zs@HNcov-i;~Vi)UifK~kvy3=5>DkO;rqP$3J9Q}nW5tr6%H zfs~fc4|#leeYU9)c)S=}iyvz?Kgi^h>JMoh{fmn&VV@s4cD5yD*W#ZtR?z=`OI#e<$ z0Ng%kGnab0cI8+E@nNxh9`~nxn7)NKr&KH$@i8@J>U8wUS!mR_-}0GO1c`Om=RAPx zW#J^#p}AbuVEuz+B;N1%c+9wO>K@QAFziNsq26&PBata5O$o&PZ9gu*Le>{2{I=;= z_Ks%ur9qz(&pG^)Y4IaC&e{{-ux@)Y2QON4kb`aDdo!Wcyx>BW1l))^i* zJKRTn^Q0>fBW`8UHJC5X&BMY`Tb9&uB+&51NRjP zLbJ*zbh84ro%!M|y_tUZkLKm!TfI3yc5SjJ2q;#&>@oYez(=y;?DzmO@vnu!SgovOlq zbG;V4aC>Nb8&&Zm6bLi73!kQPqI3|xWnd_`k&d#Eebcu?B3;2lZB@&eA?<|&zCPtT zIU4yUg&myrsZ$x2-;{UkE_&oKGSbi#Y9%J(b3CHrQ?-;HAwT~Lte;7ujvlAOq*h5M zDJ1*HrWd8%6Rm$W5+iZG1c%$o7I};%5q-?-TeiqbzvqszcBYKLH?QE!xaTBUf2npc z>_;reaPU?iP_JBgS#)^FK6BJ=f`a&9^A(n+0%s31D=iAj0vU$HdQYy$o5O=CkJS0` zV#`SphZ;)PH!b#R14$2bVtH`3Iov$PxsWL+meqwrMDWS1FU-+46CR)7igzgoqF9{B zFT2NkiGKQxBD}kNwWHPHS`oZ3fs#?qnd(5E+hCki#oPe8?~bq_pWy+Z-s!#Q@LO5 z`DwWLJVZDxMuCB{;TZYY|zOKXQ%o}dS%kW zDw@6+{+t?lVb$CD613to6CP*Po+)J{d$h0qzPm6r^|QtOQjh%A9tgxUG&FQi=La9$ z)ows>UTrCn1wvcY>ktO>!C5YN^$|{f6y=5|Q;_9G;G>X?stAi@ArblEEUKf|yXqWM z$p+-EiDiHK?_Lkfe#k!zBN^h@2&^ejPmT4Ae14%2qD;p#L%8}h$%K~2a(7-kw@#t* z3WoMQri$PClUvz~m_~`kso-Vhj+RS^qlk#u;D5_gQ|jkJY^hnXOS9`#NU)C6G3oO} z$SXl3B09;+4KXmAJO(~WPmJbYwrM8djRJ-DB)a;heef}3_&MrbA<&hTc6Jw{cobXz zm=i=Okn@h=iNE}d_4%mmCmN2}>*+7Ns#TdCqlqzNW-3kSAD{CM;_`cYqGw`|l9EzU zRV|etVfB4+DNxFa29)}u>2ltR$R9sb(zd-R0}ClR^8b{dkGr?HFBc+i=Up>}SDNh@ zdk0N)Z?sL1{r*#z*ap7wikotmunu!`Ud)YH8ayLII|81(PQ9vX=r%EF}O)RiL_hY;q9$-IVlRIy< zTw^*KHANRstx&?A;twb_eZJY}VebtL4qkZqw`Ewbtxk+8>qkyb-k1@5?iXKu_M@y7 zwRfcxI&NEOf<|cKmelfTo6;PKWSTKT#o4nOwHJn{zkJZhCQsw({RTntNX{Z4_VW(t zU#PH4u==;&9ago`PFyEu!eNv<9~3za?qj1eKubROLHpB|yAkr1XRoe#Q0R|mbk*!n$0j2@#3G9jJ0 zd>oH^F|;O5)OFs~R)%w_V;|(~wkvg~pfCiMC`so<*TKHN&|klP(VupHAi%+)v9Ymn zEjXUK7bv7r2cl7Ma@MWz+ZVJ57pc+5#>cBxu9TzRe6=dO6*a~X!?X8d2^2NiBM9WC zQv5dNA!@VHDEn4@%);ht$l%0M6bEL1&he6V5Wb&q_^$pJ7==6|) z)!(Hr+sXgl)okhKLS44edtAD9zwSbjMlyW9ZxH&s>tVimk44=w7RqDzCQV>lPh=LU zRd!oo`LOB{Ib)Y-KF=4e4tvXyQl|exQl4yy;ZQgch%MVCAd6^)*v{6`%B! z3tW9w6~ChKl>myjfQvCExo9GJr}Q$F()twPE>!ak%9VwI>ZU{_Ja%ikhX;freu5D= zOeObiOG`k1e}5oYm$o|?Q>nV1l9IwzkRB5i)jvEOwzjrLFgbhd;^FBz@2T}lw%VQr zelcgH-+%r@BZw-{+p}m(O1c~H{<(DkC$Jj}w$ zc~|j)dO>4KMHnOs5(_QM-7)acW&4>2-hRBPf>u%DNN4$EU|Al?K`7&M`3s0 $H}byG-Ay23WLG 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 Qy8r+H07*qoM6N<$f}9N?cK`qY literal 0 HcmV?d00001 diff --git a/app_common/static/description/index.html b/app_common/static/description/index.html new file mode 100644 index 000000000..ff947c179 --- /dev/null +++ b/app_common/static/description/index.html @@ -0,0 +1,121 @@ +

+
+
+

odooAi Common Util and Tools

+

Network and media and base tools

+
+

Lastest update: v17.24.04.29

+
+ +
+
+
+ Key features: +
    +
  • + + 1. Quick import data from excel with .py code +
  • +
  • + + 2. Quick m2o default value +
  • +
  • + + 3. Filter for useless field +
  • +
  • + + 4. UTC local timezone convert +
  • +
  • + + 5. Get browser ua, user-agent +
  • +
  • + + 6. Image to local, image url to local, media to local attachment +
  • +
  • + + 7. Log cron job +
  • +
  • + + 8. Boost for less no use mail +
  • +
  • + + 9. Customize .rng file +
  • +
  • + + 10. Misc like get distance between two points +
  • +
  • + + 11. Multi-language Support. Multi-Company Support +
  • +
  • + + 12. Support Odoo 17,16,15,14,13,12, Enterprise and Community and odoo.sh Edition. +
  • +
  • + + 11. Multi-language Support. Multi-Company Support +
  • +
  • + + 13. Full Open Source. +
  • +
+
+
+
+
+
+
+ +
+
+

Setup, please run the follow command to install the lib.

+

pip install pyyaml ua-parser user-agents

+

After that, install the app_common

+
+
+ + +
+
+
+

Technical Help & Support

+
+
+
+

+ For any type of technical help & support requests, Feel free to contact us

+
+ odoo@china.com +

+ Via QQ: 300883 (App user would not get QQ or any other IM support. Only for odoo project customize.)

+ + 300883@qq.com +
+
+

+ Visit our website for more support.

+

https://www.odooai.cn

+
+
+
+
+

More Powerful addons, Make your odoo very easy to use, easy customize: + odooai.cn Odoo Addons +

+
+
+ diff --git a/app_common/static/img/icon_sunpop.png b/app_common/static/img/icon_sunpop.png new file mode 100644 index 0000000000000000000000000000000000000000..aa4909543851be8a86cf0ca0c66b97176ff75d7b GIT binary patch literal 28105 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≻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 literal 0 HcmV?d00001 diff --git a/app_common/static/src/js/sunpop.cn b/app_common/static/src/js/sunpop.cn new file mode 100644 index 000000000..e69de29bb diff --git a/app_common/static/src/xml/sunpop.cn b/app_common/static/src/xml/sunpop.cn new file mode 100644 index 000000000..e69de29bb diff --git a/app_common/views/ir_cron_views.xml b/app_common/views/ir_cron_views.xml new file mode 100644 index 000000000..597e6e4fc --- /dev/null +++ b/app_common/views/ir_cron_views.xml @@ -0,0 +1,13 @@ + + + + app.ir.cron.tree + ir.cron + + + + + + + + \ No newline at end of file diff --git a/app_common/wizard/sunpop.cn b/app_common/wizard/sunpop.cn new file mode 100644 index 000000000..e69de29bb