File: device.rb

package info (click to toggle)
ruby-device-detector 1.0.1-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, buster, forky, sid, trixie
  • size: 3,104 kB
  • sloc: ruby: 1,224; makefile: 5
file content (96 lines) | stat: -rw-r--r-- 2,524 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
class DeviceDetector
  class Device < Parser

    # order is relevant for testing with fixtures
    DEVICE_NAMES = [
        'desktop',
        'smartphone',
        'tablet',
        'feature phone',
        'console',
        'tv',
        'car browser',
        'smart display',
        'camera',
        'portable media player',
        'phablet'
    ]

    def known?
      regex_meta.any?
    end

    def name
      ModelExtractor.new(user_agent, regex_meta).call
    end

    def type
      hbbtv? ? 'tv' : regex_meta[:device]
    end

    def brand
      regex_meta[:brand]
    end

    private

    # The order of files needs to be the same as the order of device
    # parser classes used in the piwik project.
    def filenames
      [
        'device/televisions.yml',
        'device/consoles.yml',
        'device/car_browsers.yml',
        'device/cameras.yml',
        'device/portable_media_player.yml',
        'device/mobiles.yml',
      ]
    end

    def matching_regex
      from_cache([self.class.name, user_agent]) do
        regex_list = hbbtv? ? regexes_for_hbbtv : regexes_other
        regex = regex_list.find { |r| user_agent =~ r[:regex] }
        if regex && regex[:models]
          model_regex = regex[:models].find { |m| user_agent =~ m[:regex]}
          if model_regex
            regex = regex.merge(:regex_model => model_regex[:regex], :model => model_regex[:model], :brand => model_regex[:brand])
            regex[:device] = model_regex[:device] if model_regex.key?(:device)
            regex.delete(:models)
          end
        end
        regex
      end
    end

    def hbbtv?
      @regex_hbbtv ||= build_regex('HbbTV/([1-9]{1}(?:\.[0-9]{1}){1,2})')
      user_agent =~ @regex_hbbtv
    end

    def regexes_for_hbbtv
      regexes.select { |r| r[:path] == :'device/televisions.yml' }
    end

    def regexes_other
      regexes.select { |r| r[:path] != :'device/televisions.yml' }
    end

    def parse_regexes(path, raw_regexes)
      raw_regexes.map do |brand, meta|
        fail "invalid device spec: #{meta.inspect}" unless meta[:regex].is_a? String
        meta[:regex] = build_regex(meta[:regex])
        if meta.key?(:models)
          meta[:models].each do |model|
            fail "invalid model spec: #{model.inspect}" unless model[:regex].is_a? String
            model[:regex] = build_regex(model[:regex])
            model[:brand] = brand.to_s unless model[:brand]
          end
        end
        meta[:path] = path
        meta
      end
    end

  end
end