device_detector
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: creadone/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 |
Benchmarks
Recent benchmarking of parsing 1000 user-agent strings on a MacBook Air with Intel Core i5 dual core (0.8 Ghz per core):
Crystal 0.30.1 (2019-08-13) LLVM: 8.0.1 Default target: x86_64-apple-macosx
bench/raw_response.cr --release
user system total real
full: 5.880000 0.060000 5.940000 ( 5.940340)
lite: 3.880000 0.040000 3.920000 ( 3.953958)
It's mean that device_detector
can work with 1000 / 5.9 ~ 169 QPS.
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/creadone/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