device_detector v0.4.0

forked from creadone/device_detector
Crystal shard for device detection by User-Agent string

Device Detector

Crystal CI GitHub release License

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.
  • 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

response.browser? # => true
response.browser.name # => "Microsoft Edge"
response.browser.version # => "12.0"

pp response.raw

[{"bot" =>
   {"name" => "",
    "category" => "",
    "url" => "",
    "producer_name" => "",
    "producer_url" => ""}},
 {"browser" => {"name" => "Microsoft Edge", "version" => "12.0"}},
 {"browser_engine" => {"name" => "Edge"}},
 {"camera" => {"vendor" => "", "model" => "", "device" => ""}},
 {"car_browser" => {"vendor" => "", "device" => "", "model" => ""}},
 {"console" => {"vendor" => "", "model" => ""}},
 {"feed_reader" => {"name" => "", "version" => ""}},
 {"library" => {"name" => "", "version" => ""}},
 {"mediaplayer" => {"name" => "", "version" => ""}},
 {"mobile_app" => {"name" => "", "version" => ""}},
 {"mobile" => {"device" => "", "vendor" => "", "type" => ""}},
 {"os" => {"name" => "Windows", "version" => "10"}},
 {"pim" => {"name" => "", "version" => ""}},
 {"portable_media_player" => {"vendor" => "", "model" => ""}},
 {"tv" => {"model" => "", "vendor" => ""}},
 {"vendorfragment" => {"vendor" => ""}}]

Available methods:

Bot
bot?
bot.name
bot.category
bot.url
bot.producer.name
bot.producer.url
Browser Engine
browser_engine?
browser_engine.name
Browser
browser?
browser.name
browser.version
Camera
camera?
camera.device
camera.vendor
Car Browser
car_browser?
car_browser.model
car_browser.vendor
Console
console?
console.model
console.vendor
Feed Reader
feed_reader?
feed_reader.name
feed_reader.version
Library
library?
library.name
library.version
Media Player
mediaplayer?
mediaplayer.name
mediaplayer.version
Mobile App
mobile_app?
mobile_app.name
mobile_app.version
Mobile
mobile?
mobile.vendor
mobile.type
mobile.model
OS
os?
os.name
os.version
PIM
pim?
pim.name
pim.version
Portable Media Player
portable_media_player?
portable_media_player.model
portable_media_player.vendor
TV
tv?
tv.model
tv.vendor
Vendor Fragment
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

Contributing

  1. Fork it ( https://github.com/crystal-garage/device_detector/fork )
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. 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
Repository

device_detector

Owner
Statistic
  • 2
  • 0
  • 0
  • 1
  • 1
  • 10 days ago
  • August 1, 2025
License

MIT License

Links
Synced at

Fri, 15 Aug 2025 23:22:41 GMT

Languages