device_detector~crystal-garage
Device Detector
The library for parsing User Agent and browser, operating system, device used (desktop, tablet, mobile, tv, cars, console, etc.), vendor and model detection.
- Support latest Crystal version and update script for private use or immediately updates.
- Currently it is production version and works fine more that 2 years.
- The Library uses regexes from matomo-org/device-detector.
Installation
Add this to your application's shard.yml
:
dependencies:
device_detector:
github: crystal-garage/device_detector
Then run shards install
Usage
require "device_detector"
user_agent = "Mozilla/5.0 (Windows NT 6.4; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36 Edge/12.0"
response = DeviceDetector::Detector.new(user_agent).call # All parsers
response = DeviceDetector::Detector.new(user_agent).lite # Only for bot and mobile
# Check if browser detected
response.browser? #=> true
# browser name
response.browser_name #=> Microsoft Edge
# browser version
response.browser_version #=> 12.0
# get raw response with
pp response.raw
[{
"bot" => {
"name" => ""
}
},
{
"browser" => {
"name" => "", "version" => ""
}
},
{...},
{
"vendorfragment" => {
"vendor" => ""
}
}
]
Available methods:
bot? bot_name |
browser_engine? browser_engine_name |
browser? browser_name browser_version |
camera? camera_vendor camera_model |
car_browser? car_browser_vendor car_browser_model |
console? console_vendor console_model |
feed_reader? feed_reader_name feed_reader_version |
library? library_name library_version |
mediaplayer? mediaplayer_name mediaplayer_version |
mobile_app? mobile_app_name mobile_app_version |
mobile_device? mobile_device_vendor mobile_device_type mobile_device_model |
os? os_name os_version |
pim? pim_name pim_version |
portable_media_player? portable_media_player_vendor portable_media_player_model |
tv? tv_vendor tv_model |
vendorfragment? vendorfragment_vendor |
Benchmark
crystal run ./bench/raw_response.cr --release
Results:
user system total real
full: 1.645194 0.025706 1.670900 ( 1.677467)
lite: 0.766103 0.007790 0.773893 ( 0.777249)
It's mean that device_detector
can work with 1000 / 1.68 ~ 595 QPS (full) and 1000 / 0.78 ~ 1282 QPS (lite).
Note: This benchmark uses 20 diverse user agents including browsers, mobile devices, and bots for realistic performance measurement.
Testing
crystal spec
Update regexes
crystal scripts/update_regexes.cr
ToDo
- Support overloading of base rules
- CLI & HTTP version
- More lighter and faster the
lite
version - Reload regexes on the fly (may be)
Contributing
- Fork it ( https://github.com/crystal-garage/device_detector/fork )
- Create your feature branch (git checkout -b my-new-feature)
- Commit your changes (git commit -am 'Add some feature')
- Push to the branch (git push origin my-new-feature)
- Create a new Pull Request
Contributors
- @creadone Sergey Fedorov - creator, maintainer
- @delef Ivan Palamarchuk - new api, code optimization
- @zaycker Yuriy Zaitsev - fix check order
- @mamantoha Anton Maminov - maintainer