podcast_agent_parser 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: c554518b264fea34da4f2e1dc8d74223ed5f0033d675dcfe0a353a5471e0ba6f
4
+ data.tar.gz: 84dd8038b82a9fe23cf39860b71bec6368a8111b604e7709212cebe89f6e41d6
5
+ SHA512:
6
+ metadata.gz: dd5e3623f90ba2b3eb71b6e171a38b4c72197a3fc3fdd65c4d05cfa310239d5917f0a0aef0f909426bb9b8b07e7e163b5b66c40eaaf6fa81a534a57a7f7529a9
7
+ data.tar.gz: 0c832eb21c52fd37e3b7a8943debfff1e3395a04d57d18502edabb45fc229779fdd0aa6d719a5a79b9d28b421c757429770452d5a1c5333731f731f4cd578e2e
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2019 Dan Benjamin
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,24 @@
1
+ # Podcast Agent Parser
2
+
3
+ The Podcast Agent Parser is a user agent parser written in Ruby, using [regex patterns](https://github.com/opawg/user-agents "regex patterns from the Open Podcast Analytics Working Group") from the Open Podcast Analytics Working Group.
4
+
5
+ Installation:
6
+
7
+ ```
8
+ gem 'podcast_agent_parser', '~> 0.1.1'
9
+ ```
10
+
11
+ Then, look up your user agents like so:
12
+
13
+ ```
14
+ agent_text = "iTunes/12.9.5 (Macintosh; OS X 10.14.5) AppleWebKit/607.2.6.1.1"
15
+
16
+ agent_parser = PodcastAgentParser::Parser.new()
17
+
18
+ parsed = agent_parser.parse(agent_text)
19
+
20
+ parsed.app # iTunes
21
+ parsed.os # macOS
22
+ parsed.device # PC
23
+ parsed.bot # false
24
+ ```
@@ -0,0 +1,17 @@
1
+ require 'podcast_agent_parser/agent'
2
+ require 'podcast_agent_parser/parser'
3
+
4
+ module PodcastAgentParser
5
+ DefaultPatternsPath = File.join(File.dirname(__FILE__), '../vendor/opawg/user-agents.json')
6
+ OsNames = {
7
+ 'homepod os' => 'HomePod OS',
8
+ 'ios' => 'iOS',
9
+ 'ipados' => 'iPadOS',
10
+ 'macos' => 'macOS',
11
+ 'watchos' => 'watchOS'
12
+ }
13
+ DeviceNames = {
14
+ 'pc' => 'PC',
15
+ 'tv' => 'TV'
16
+ }
17
+ end
@@ -0,0 +1,14 @@
1
+ module PodcastAgentParser
2
+
3
+ class Agent
4
+ attr_accessor :app, :device, :os, :bot
5
+
6
+ def initialize(app, device, os, bot)
7
+ @app = app
8
+ @device = DeviceNames.key?(device) ? DeviceNames[device] : (device.nil? ? nil : device.capitalize)
9
+ @os = OsNames.key?(os) ? OsNames[os] : (os.nil? ? nil : os.capitalize)
10
+ @bot = bot.nil? ? false : bot
11
+ end
12
+ end
13
+
14
+ end
@@ -0,0 +1,27 @@
1
+ require 'json'
2
+
3
+ module PodcastAgentParser
4
+
5
+ class Parser
6
+ def initialize
7
+ @patterns_path = File.read(PodcastAgentParser::DefaultPatternsPath)
8
+ end
9
+
10
+ def parse(user_agent_string)
11
+ JSON.parse(@patterns_path).each do |pattern|
12
+ pattern['user_agents'].each do |str|
13
+ if Regexp.new(str).match(user_agent_string)
14
+ return Agent.new(
15
+ pattern['app'],
16
+ pattern['device'],
17
+ pattern['os'],
18
+ pattern['bot']
19
+ )
20
+ end
21
+ end
22
+ end
23
+ return nil
24
+ end
25
+ end
26
+
27
+ end
@@ -0,0 +1,1476 @@
1
+ [
2
+ {
3
+ "user_agents": [
4
+ "^Acast.+[Aa]ndroid"
5
+ ],
6
+ "app": "Acast",
7
+ "device": "phone",
8
+ "os": "android"
9
+ },
10
+ {
11
+ "user_agents": [
12
+ "^Acast.+iOS"
13
+ ],
14
+ "app": "Acast",
15
+ "device": "phone",
16
+ "os": "ios"
17
+ },
18
+ {
19
+ "user_agents": [
20
+ "^AdsBot-Google"
21
+ ],
22
+ "bot": true
23
+ },
24
+ {
25
+ "user_agents": [
26
+ "AhrefsBot"
27
+ ],
28
+ "bot": true
29
+ },
30
+ {
31
+ "user_agents": [
32
+ "^AlexaMediaPlayer/1\\.",
33
+ "^AlexaMediaPlayer/16\\.",
34
+ "^AlexaMediaPlayer/2\\."
35
+ ],
36
+ "app": "Alexa-enabled device",
37
+ "device": "speaker",
38
+ "os": "alexa",
39
+ "svg": "amazon.svg"
40
+ },
41
+ {
42
+ "user_agents": [
43
+ "^AmazonNewsContentService"
44
+ ],
45
+ "app": "Amazon Alexa Flash Briefing caching service",
46
+ "description": "A service which downloads, caches and normalises audio for the Flash Briefing service on Alexa-enabled devices",
47
+ "os": "alexa",
48
+ "info_url": "https://developer.amazon.com/docs/flashbriefing/flash-briefing-skill-api-feed-reference.html#performance-requirements",
49
+ "developer_notes": "Stats are available within the Alexa skills dashboard",
50
+ "svg": "amazon.svg",
51
+ "bot": true
52
+ },
53
+ {
54
+ "user_agents": [
55
+ "^AlexaMediaPlayer/5\\."
56
+ ],
57
+ "app": "Amazon Echo Dot",
58
+ "device": "speaker",
59
+ "os": "alexa",
60
+ "svg": "amazon.svg"
61
+ },
62
+ {
63
+ "user_agents": [
64
+ "Android 5.*ford/"
65
+ ],
66
+ "app": "Amazon Kindle Fire",
67
+ "device": "tablet",
68
+ "os": "android"
69
+ },
70
+ {
71
+ "user_agents": [
72
+ "^AndroidDownloadManager"
73
+ ],
74
+ "os": "android"
75
+ },
76
+ {
77
+ "user_agents": [
78
+ "^AntennaPod/",
79
+ "^de.danoeh.antennapod/"
80
+ ],
81
+ "app": "AntennaPod",
82
+ "examples": [
83
+ "de.danoeh.antennapod/1.7.3b (Linux;Android 8.0.0) ExoPlayerLib/2.9.3"
84
+ ],
85
+ "info_url": "https://github.com/AntennaPod/AntennaPod",
86
+ "os": "android"
87
+ },
88
+ {
89
+ "user_agents": [
90
+ "Apache-HttpClient"
91
+ ],
92
+ "bot": true
93
+ },
94
+ {
95
+ "user_agents": [
96
+ "^AppleCoreMedia/1\\..*iPod"
97
+ ],
98
+ "app": "Apple Podcasts",
99
+ "device": "mp3_player",
100
+ "examples": [
101
+ "AppleCoreMedia/1.0.0.16G114 (iPod touch; U; CPU OS 12_4_2 like Mac OS X; en_us)"
102
+ ],
103
+ "os": "ios"
104
+ },
105
+ {
106
+ "user_agents": [
107
+ "^AppleCoreMedia/1\\..*Macintosh"
108
+ ],
109
+ "examples": [
110
+ "AppleCoreMedia/1.0.0.19A583 (Macintosh; U; Intel Mac OS X 10_15; en_us)"
111
+ ],
112
+ "app": "Apple Podcasts",
113
+ "device": "pc",
114
+ "os": "macos",
115
+ "description": "The Apple Podcasts app on MacOS Catalina and above",
116
+ "developer_notes": "Used when progressively downloading podcasts"
117
+ },
118
+ {
119
+ "user_agents": [
120
+ "^AppleCoreMedia/1\\..*iPhone"
121
+ ],
122
+ "app": "Apple Podcasts",
123
+ "device": "phone",
124
+ "examples": [
125
+ "AppleCoreMedia/1.0.0.15G77 (iPhone; U; CPU OS 11_4_1 like Mac OS X; en_us)"
126
+ ],
127
+ "os": "ios"
128
+ },
129
+ {
130
+ "user_agents": [
131
+ "^AppleCoreMedia/1\\..*iPad"
132
+ ],
133
+ "app": "Apple Podcasts",
134
+ "device": "tablet",
135
+ "examples": [
136
+ "AppleCoreMedia/1.0.0.17A860 (iPad; U; CPU OS 13_1_2 like Mac OS X; en_us)"
137
+ ],
138
+ "os": "ios"
139
+ },
140
+ {
141
+ "user_agents": [
142
+ "^AppleCoreMedia/1\\..*HomePod"
143
+ ],
144
+ "app": "Apple Podcasts",
145
+ "device": "speaker",
146
+ "examples": [
147
+ "AppleCoreMedia/1.0.0.16G78 (HomePod; U; CPU OS 12_4 like Mac OS X; en_us)"
148
+ ],
149
+ "os": "homepod_os"
150
+ },
151
+ {
152
+ "user_agents": [
153
+ "^AppleCoreMedia/1\\..*Apple TV"
154
+ ],
155
+ "app": "Apple Podcasts",
156
+ "device": "tv",
157
+ "examples": [
158
+ "AppleCoreMedia/1.0.0.17J586 (Apple TV; U; CPU OS 13_0 like Mac OS X; en_us)"
159
+ ],
160
+ "os": "tvos"
161
+ },
162
+ {
163
+ "user_agents": [
164
+ "^AppleCoreMedia/1\\..*Apple Watch",
165
+ "watchOS/"
166
+ ],
167
+ "app": "Apple Podcasts",
168
+ "device": "watch",
169
+ "examples": [
170
+ "atc/1.0 watchOS/6.0.1 model/Watch4,1 hwp/t8006 build/17R605 (6; dt:190)"
171
+ ],
172
+ "os": "watchos"
173
+ },
174
+ {
175
+ "user_agents": [
176
+ "^Podcasts/.*\\(.*\\)",
177
+
178
+ "^Balados/.*\\(.*\\)",
179
+ "^Podcasti/.*\\(.*\\)",
180
+ "^Podcastit/.*\\(.*\\)",
181
+ "^Podcasturi/.*\\(.*\\)",
182
+ "^Podcasty/.*\\(.*\\)",
183
+ "^Podcast’ler/.*\\(.*\\)",
184
+ "^Podkaster/.*\\(.*\\)",
185
+ "^Podcaster/.*\\(.*\\)",
186
+ "^Подкасти/.*\\(.*\\)",
187
+ "^Подкасты/.*\\(.*\\)",
188
+ "^פודקאסטים/.*\\(.*\\)",
189
+ "^البودكاست/.*\\(.*\\)",
190
+ "^पॉडकास्ट/.*\\(.*\\)",
191
+ "^พ็อดคาสท์/.*\\(.*\\)",
192
+ "^播客/.*\\(.*\\)",
193
+ "^팟캐스트/.*\\(.*\\)"
194
+ ],
195
+ "examples": [
196
+ "Podcasts/1410.53 CFNetwork/1111 Darwin/19.0.0 (x86_64)",
197
+ "Podcaster/1410.53 CFNetwork/1111 Darwin/19.0.0 (x86_64)"
198
+ ],
199
+ "app": "Apple Podcasts",
200
+ "device": "pc",
201
+ "os": "macos",
202
+ "description": "The Apple Podcasts app on MacOS Catalina and above",
203
+ "developer_notes": "Used when downloading podcasts (not progressive downloads), with support for the following languages: Arabic, Chinese, Finnish, French, English, Hebrew, Hindi, Korean, Polish, Romanian, Russian, Serbian, Slovenian, Swedish, Thai, Turkish."
204
+ },
205
+ {
206
+ "user_agents": [
207
+ "^Podcasts/.*\\d$",
208
+
209
+ "^Balados/.*\\d$",
210
+ "^Podcasti/.*\\d$",
211
+ "^Podcastit/.*\\d$",
212
+ "^Podcasturi/.*\\d$",
213
+ "^Podcasty/.*\\d$",
214
+ "^Podcast’ler/.*\\d$",
215
+ "^Podkaster/.*\\d$",
216
+ "^Podcaster/.*\\d$",
217
+ "^Podcast/.*\\d$",
218
+ "^Подкасти/.*\\d$",
219
+ "^Подкасты/.*\\d$",
220
+ "^פודקאסטים/.*\\d$",
221
+ "^البودكاست/.*\\d$",
222
+ "^पॉडकास्ट/.*\\d$",
223
+ "^พ็อดคาสท์/.*\\d$",
224
+ "^播客/.*\\d$",
225
+ "^팟캐스트/.*\\d$"
226
+ ],
227
+ "app": "Apple Podcasts",
228
+ "os": "ios",
229
+ "description": "The Apple Podcasts app on devices other than MacOS Catalina and above",
230
+ "developer_notes": "Used when downloading podcasts (not progressive downloads), with support for the following languages: Arabic, Chinese, Finnish, French, English, Hebrew, Hindi, Korean, Polish, Romanian, Russian, Serbian, Slovenian, Swedish, Thai, Turkish",
231
+ "examples": [
232
+ "Podcasts/2.6",
233
+ "Podcast/1150.47 CFNetwork/811.5.4 Darwin/16.6.0"
234
+ ]
235
+ },
236
+ {
237
+ "user_agents": [
238
+ "^BashPodder"
239
+ ],
240
+ "app": "BashPodder",
241
+ "device": "pc",
242
+ "info_url": "http://lincgeek.org/bashpodder/"
243
+ },
244
+ {
245
+ "user_agents": [
246
+ "BBC%20Sounds/"
247
+ ],
248
+ "app": "BBC Sounds",
249
+ "device": "phone",
250
+ "examples": [
251
+ "BBC%20Sounds/1.13.1.7716 CFNetwork/1107.1 Darwin/19.0.0"
252
+ ],
253
+ "info_url": "https://www.bbc.co.uk/sounds/help/questions/getting-started-with-bbc-sounds/sounds-intro"
254
+ },
255
+ {
256
+ "user_agents": [
257
+ "BBCiPlayerRadio/"
258
+ ],
259
+ "app": "BBC iPlayer Radio",
260
+ "device": "phone",
261
+ "examples": [
262
+ "BBCiPlayerRadio/2.16.0.8764 CFNetwork/1107.1 Darwin/19.0.0"
263
+ ],
264
+ "info_url": "https://www.bbc.co.uk/programmes/p00zh17p"
265
+ },
266
+ {
267
+ "user_agents": [
268
+ "; BeyondPod"
269
+ ],
270
+ "app": "BeyondPod",
271
+ "device": "phone",
272
+ "examples": [
273
+ "Mozilla/5.0 (Linux; U; en-us; BeyondPod 4)"
274
+ ],
275
+ "os": "android"
276
+ },
277
+ {
278
+ "user_agents": [
279
+ "^Bose/"
280
+ ],
281
+ "app": "Bose SoundTouch",
282
+ "device": "speaker"
283
+ },
284
+ {
285
+ "user_agents": [
286
+ "^Breaker/"
287
+ ],
288
+ "app": "Breaker",
289
+ "device": "phone"
290
+ },
291
+ {
292
+ "user_agents": [
293
+ "Android.+(?:B|b)rave"
294
+ ],
295
+ "app": "Brave",
296
+ "os": "android"
297
+ },
298
+ {
299
+ "user_agents": [
300
+ "Linux.+(?:B|b)rave"
301
+ ],
302
+ "app": "Brave",
303
+ "device": "pc",
304
+ "os": "linux"
305
+ },
306
+ {
307
+ "user_agents": [
308
+ "Mac OS X.+(?:B|b)rave"
309
+ ],
310
+ "app": "Brave",
311
+ "device": "pc",
312
+ "os": "macos"
313
+ },
314
+ {
315
+ "user_agents": [
316
+ "Windows.+(?:B|b)rave"
317
+ ],
318
+ "app": "Brave",
319
+ "device": "pc",
320
+ "os": "windows"
321
+ },
322
+ {
323
+ "user_agents": [
324
+ "^Cast(?:b|B)ox/.+Android"
325
+ ],
326
+ "app": "CastBox",
327
+ "device": "phone",
328
+ "examples": [
329
+ "CastBox/8.2.6-191015245 (Linux;Android 10) ExoPlayerLib/2.10.4"
330
+ ],
331
+ "os": "android"
332
+ },
333
+ {
334
+ "user_agents": [
335
+ "^Cast(?:b|B)ox/.+iOS"
336
+ ],
337
+ "app": "CastBox",
338
+ "device": "phone",
339
+ "examples": [
340
+ "CastBox/8.5.1 (fm.castbox.audiobook.radio.podcast; build:11; iOS 13.1.2)"
341
+ ],
342
+ "os": "ios"
343
+ },
344
+ {
345
+ "user_agents": [
346
+ "^Cast(?:b|B)ox"
347
+ ],
348
+ "app": "CastBox",
349
+ "developer_notes": "There are CastBox compatible User Agents that come without Android/iOS platform marker",
350
+ "examples": [
351
+ "CastBox/5.7.5-190508115.r1a805d3"
352
+ ]
353
+ },
354
+ {
355
+ "user_agents": [
356
+ "^castget "
357
+ ],
358
+ "app": "castget",
359
+ "examples": [
360
+ "castget 1.2.4 (castget rss enclosure downloader)"
361
+ ],
362
+ "info_url": "https://castget.johndal.com/",
363
+ "device": "pc"
364
+ },
365
+ {
366
+ "user_agents": [
367
+ "Castro "
368
+ ],
369
+ "app": "Castro",
370
+ "device": "phone",
371
+ "examples": [
372
+ "Castro 2019.13/1167"
373
+ ],
374
+ "os": "ios"
375
+ },
376
+ {
377
+ "user_agents": [
378
+ "\\ CrKey/"
379
+ ],
380
+ "app": "Chromecast device",
381
+ "device": "speaker",
382
+ "os": "android"
383
+ },
384
+ {
385
+ "user_agents": [
386
+ "^Clementine "
387
+ ],
388
+ "app": "Clementine Music Player",
389
+ "device": "pc",
390
+ "info_url": "https://www.clementine-player.org/"
391
+ },
392
+ {
393
+ "user_agents": [
394
+ "^curl"
395
+ ],
396
+ "bot": true
397
+ },
398
+ {
399
+ "user_agents": [
400
+ "^Dalvik/"
401
+ ],
402
+ "examples": [
403
+ "Dalvik/2.1.0 (Linux; U; Android 9; SM-N950U Build/PPR1.180610.011)"
404
+ ],
405
+ "os": "android"
406
+ },
407
+ {
408
+ "user_agents": [
409
+ "^datagnionbot"
410
+ ],
411
+ "bot": true
412
+ },
413
+ {
414
+ "user_agents": [
415
+ "Deezer/.*Android;"
416
+ ],
417
+ "app": "Deezer",
418
+ "device": "phone",
419
+ "os": "android"
420
+ },
421
+ {
422
+ "user_agents": [
423
+ "^Deezer"
424
+ ],
425
+ "app": "Deezer"
426
+ },
427
+ {
428
+ "user_agents": [
429
+ "DoggCatcher"
430
+ ],
431
+ "app": "DoggCatcher",
432
+ "device": "phone",
433
+ "examples": [
434
+ "Mozilla/5.0 (Linux; U; Windows NT 6.1; en-us; dream) DoggCatcher"
435
+ ],
436
+ "os": "android"
437
+ },
438
+ {
439
+ "user_agents": [
440
+ "DotBot/1"
441
+ ],
442
+ "bot": true
443
+ },
444
+ {
445
+ "user_agents": [
446
+ "^doubleTwist CloudPlayer"
447
+ ],
448
+ "examples": [
449
+ "doubleTwist CloudPlayer"
450
+ ],
451
+ "app": "doubleTwitch CloudPlayer",
452
+ "device": "phone",
453
+ "info_url": "https://www.doubletwist.com/cloudplayer",
454
+ "os": "android"
455
+ },
456
+ {
457
+ "user_agents": [
458
+ "Downcast/"
459
+ ],
460
+ "app": "Downcast",
461
+ "device": "phone",
462
+ "examples": [
463
+ "Downcast/2.9.42 (iPhone; iOS 12.4.1; Scale/3.00)"
464
+ ],
465
+ "os": "ios"
466
+ },
467
+ {
468
+ "user_agents": [
469
+ "Xbox.+Edge/"
470
+ ],
471
+ "app": "Edge",
472
+ "device": "games_console",
473
+ "os": "windows"
474
+ },
475
+ {
476
+ "user_agents": [
477
+ "Windows Phone.+Edge/"
478
+ ],
479
+ "app": "Edge",
480
+ "device": "phone",
481
+ "os": "windows"
482
+ },
483
+ {
484
+ "user_agents": [
485
+ "Windows.+Edge/"
486
+ ],
487
+ "app": "Edge",
488
+ "device": "pc",
489
+ "examples": [
490
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64; WebView/3.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299"
491
+ ],
492
+ "os": "windows"
493
+ },
494
+ {
495
+ "user_agents": [
496
+ "^Echo/1\\."
497
+ ],
498
+ "device": "speaker",
499
+ "os": "alexa",
500
+ "svg": "amazon.svg"
501
+ },
502
+ {
503
+ "user_agents": [
504
+ "FacebookBot"
505
+ ],
506
+ "bot": true
507
+ },
508
+ {
509
+ "user_agents": [
510
+ "Linux.*Firefox/"
511
+ ],
512
+ "app": "Firefox",
513
+ "device": "pc",
514
+ "os": "linux"
515
+ },
516
+ {
517
+ "user_agents": [
518
+ "Mac OS X.*Firefox/"
519
+ ],
520
+ "app": "Firefox",
521
+ "device": "pc",
522
+ "os": "macos"
523
+ },
524
+ {
525
+ "user_agents": [
526
+ "Windows.*Firefox/"
527
+ ],
528
+ "app": "Firefox",
529
+ "device": "pc",
530
+ "examples": [
531
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0"
532
+ ],
533
+ "os": "windows"
534
+ },
535
+ {
536
+ "user_agents": [
537
+ "Android.*(Focus|Firefox)/"
538
+ ],
539
+ "app": "Firefox",
540
+ "os": "android"
541
+ },
542
+ {
543
+ "user_agents": [
544
+ "iPhone.*Focus/"
545
+ ],
546
+ "app": "Firefox",
547
+ "device": "phone",
548
+ "os": "ios"
549
+ },
550
+ {
551
+ "user_agents": [
552
+ "iPad.*Focus/"
553
+ ],
554
+ "app": "Firefox",
555
+ "device": "tablet",
556
+ "os": "ios"
557
+ },
558
+ {
559
+ "user_agents": [
560
+ "^Lavf/"
561
+ ],
562
+ "app": "ffmpeg"
563
+ },
564
+ {
565
+ "user_agents": [
566
+ "^MAC "
567
+ ],
568
+ "app": "Flash",
569
+ "device": "pc",
570
+ "os": "macos"
571
+ },
572
+ {
573
+ "user_agents": [
574
+ "^WIN\\ "
575
+ ],
576
+ "app": "Flash",
577
+ "device": "pc",
578
+ "os": "windows"
579
+ },
580
+ {
581
+ "user_agents": [
582
+ "^foobar2000/"
583
+ ],
584
+ "app": "foobar2000",
585
+ "examples": [
586
+ "foobar2000/1.x"
587
+ ],
588
+ "info_url": "https://www.foobar2000.org/"
589
+ },
590
+ {
591
+ "user_agents": [
592
+ "^fyyd-poll"
593
+ ],
594
+ "bot": true
595
+ },
596
+ {
597
+ "user_agents": [
598
+ "^Go-http-client"
599
+ ],
600
+ "bot": true
601
+ },
602
+ {
603
+ "user_agents": [
604
+ "^Googlebot"
605
+ ],
606
+ "bot": true
607
+ },
608
+ {
609
+ "user_agents": [
610
+ "Google-Podcast"
611
+ ],
612
+ "bot": true
613
+ },
614
+ {
615
+ "user_agents": [
616
+ "^Google-Speech-Actions"
617
+ ],
618
+ "app": "Google Home",
619
+ "device": "speaker",
620
+ "os": "google_assistant"
621
+ },
622
+ {
623
+ "user_agents": [
624
+ "GoogleChirp"
625
+ ],
626
+ "app": "Google Podcasts",
627
+ "device": "speaker",
628
+ "os": "google_assistant"
629
+ },
630
+ {
631
+ "user_agents": [
632
+ "iPhone;.*GSA/"
633
+ ],
634
+ "app": "Google Podcasts",
635
+ "device": "phone",
636
+ "os": "ios"
637
+ },
638
+ {
639
+ "user_agents": [
640
+ "iPad;.*GSA/"
641
+ ],
642
+ "app": "Google Podcasts",
643
+ "device": "tablet",
644
+ "os": "ios"
645
+ },
646
+ {
647
+ "user_agents": [
648
+ "(?:Android;.+)?GSA/"
649
+ ],
650
+ "app": "Google Podcasts",
651
+ "os": "android"
652
+ },
653
+ {
654
+ "user_agents": [
655
+ "Linux; Android.*SM-T350"
656
+ ],
657
+ "device": "tablet",
658
+ "os": "android"
659
+ },
660
+ {
661
+ "user_agents": [
662
+ "Android.*Chrome/"
663
+ ],
664
+ "app": "Google Chrome",
665
+ "os": "android"
666
+ },
667
+ {
668
+ "user_agents": [
669
+ "CrOS.*Chrome/"
670
+ ],
671
+ "app": "Google Chrome",
672
+ "device": "pc",
673
+ "os": "chromeos"
674
+ },
675
+ {
676
+ "user_agents": [
677
+ "Linux.*Chrome/"
678
+ ],
679
+ "app": "Google Chrome",
680
+ "device": "pc",
681
+ "os": "linux"
682
+ },
683
+ {
684
+ "user_agents": [
685
+ "Mac OS X.*Chrome/"
686
+ ],
687
+ "app": "Google Chrome",
688
+ "device": "pc",
689
+ "examples": [
690
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36"
691
+ ],
692
+ "os": "macos"
693
+ },
694
+ {
695
+ "user_agents": [
696
+ "Windows.*Chrome/"
697
+ ],
698
+ "app": "Google Chrome",
699
+ "device": "pc",
700
+ "examples": [
701
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"
702
+ ],
703
+ "os": "windows"
704
+ },
705
+ {
706
+ "user_agents": [
707
+ "iPad.*CriOS/"
708
+ ],
709
+ "app": "Google Chrome",
710
+ "device": "tablet",
711
+ "os": "ios"
712
+ },
713
+ {
714
+ "user_agents": [
715
+ "iPhone.*CriOS/"
716
+ ],
717
+ "app": "Google Chrome",
718
+ "device": "phone",
719
+ "os": "ios"
720
+ },
721
+ {
722
+ "user_agents": [
723
+ "^gPodder/",
724
+ "^gpodder\\.net"
725
+ ],
726
+ "app": "gPodder",
727
+ "examples": [
728
+ "gPodder/3.10.8 (+http://gpodder.org/) Windows/10"
729
+ ]
730
+ },
731
+ {
732
+ "user_agents": [
733
+ "^GStreamer"
734
+ ],
735
+ "device": "radio"
736
+ },
737
+ {
738
+ "user_agents": [
739
+ "^Guardian-iOSLive/"
740
+ ],
741
+ "app": "Guardian",
742
+ "os": "ios"
743
+ },
744
+ {
745
+ "user_agents": [
746
+ "GuardianAndroidApp/"
747
+ ],
748
+ "app": "Guardian",
749
+ "os": "android"
750
+ },
751
+ {
752
+ "user_agents": [
753
+ "^gvfs"
754
+ ],
755
+ "bot": true
756
+ },
757
+ {
758
+ "user_agents": [
759
+ "^\\+hermespod\\.com/"
760
+ ],
761
+ "app": "HermesPod",
762
+ "device": "pc",
763
+ "examples": [
764
+ "+hermespod.com/v1.5.x"
765
+ ],
766
+ "info_url": "http://hermespod.com/",
767
+ "os": "windows"
768
+ },
769
+ {
770
+ "user_agents": [
771
+ "^Himalaya/"
772
+ ],
773
+ "app": "Himalaya"
774
+ },
775
+ {
776
+ "user_agents": [
777
+ "^iCatcher"
778
+ ],
779
+ "app": "iCatcher",
780
+ "device": "phone",
781
+ "os": "ios"
782
+ },
783
+ {
784
+ "user_agents": [
785
+ "^iHeartRadio/"
786
+ ],
787
+ "app": "iHeartRadio"
788
+ },
789
+ {
790
+ "user_agents": [
791
+ "MSIE "
792
+ ],
793
+ "app": "Internet Explorer",
794
+ "device": "pc",
795
+ "examples": [
796
+ "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)"
797
+ ],
798
+ "os": "windows"
799
+ },
800
+ {
801
+ "user_agents": [
802
+ "iTMS",
803
+ "itunesstored"
804
+ ],
805
+ "bot": true
806
+ },
807
+ {
808
+ "user_agents": [
809
+ "^iTunes/.+Mac OS"
810
+ ],
811
+ "examples": [
812
+ "iTunes/10.6.3 (Macintosh; Intel Mac OS X 10.5.8) AppleWebKit/534.50.2"
813
+ ],
814
+ "app": "iTunes",
815
+ "device": "pc",
816
+ "info_url": "https://www.apple.com/itunes/",
817
+ "os": "macos"
818
+ },
819
+ {
820
+ "user_agents": [
821
+ "^iTunes/1[12]\\."
822
+ ],
823
+ "examples": [
824
+ "iTunes/11.4 (Windows; Microsoft Windows 7 x64 Home Premium Edition (Build 7600)) AppleWebKit/7600.1017.0.24"
825
+ ],
826
+ "app": "iTunes",
827
+ "device": "pc",
828
+ "os": "windows"
829
+ },
830
+ {
831
+ "user_agents": [
832
+ "^iTunes/4"
833
+ ],
834
+ "device": "speaker"
835
+ },
836
+ {
837
+ "user_agents": [
838
+ "J. River Internet Reader"
839
+ ],
840
+ "examples": [
841
+ "Microsoft-Windows-XP/2002, UPnP/1.1, J. River Internet Reader/2.0 (compatible; Windows-Media-Player/10)"
842
+ ],
843
+ "app": "JRiver Media Center",
844
+ "device": "pc",
845
+ "info_url": "https://www.jriver.com/",
846
+ "os": "windows"
847
+ },
848
+ {
849
+ "user_agents": [
850
+ "^Laughable.+iOS"
851
+ ],
852
+ "app": "Laughable",
853
+ "device": "phone",
854
+ "os": "ios"
855
+ },
856
+ {
857
+ "user_agents": [
858
+ "LG Player"
859
+ ],
860
+ "device": "phone",
861
+ "os": "android"
862
+ },
863
+ {
864
+ "user_agents": [
865
+ "^libwww-perl"
866
+ ],
867
+ "bot": true
868
+ },
869
+ {
870
+ "user_agents": [
871
+ "Listen5"
872
+ ],
873
+ "app": "Listen5",
874
+ "device": "phone",
875
+ "os": "ios"
876
+ },
877
+ {
878
+ "user_agents": [
879
+ "LivelapBot"
880
+ ],
881
+ "bot": true
882
+ },
883
+ {
884
+ "user_agents": [
885
+ "^Luminary/.+Android"
886
+ ],
887
+ "app": "Luminary",
888
+ "device": "phone",
889
+ "os": "android"
890
+ },
891
+ {
892
+ "user_agents": [
893
+ "^Luminary/.+iOS"
894
+ ],
895
+ "app": "Luminary",
896
+ "device": "phone",
897
+ "os": "ios"
898
+ },
899
+ {
900
+ "user_agents": [
901
+ "^MajelanApp"
902
+ ],
903
+ "app": "Majelan"
904
+ },
905
+ {
906
+ "user_agents": [
907
+ "^Mechanize"
908
+ ],
909
+ "bot": true
910
+ },
911
+ {
912
+ "user_agents": [
913
+ "^MediaMonkey"
914
+ ],
915
+ "app": "MediaMonkey",
916
+ "device": "pc",
917
+ "os": "windows"
918
+ },
919
+ {
920
+ "user_agents": [
921
+ "^Miro/.+Windows"
922
+ ],
923
+ "app": "Miro",
924
+ "device": "pc",
925
+ "examples": [
926
+ "Miro/6.0 (http://www.getmiro.com/; Windows post2008Server x86)"
927
+ ],
928
+ "info_url": "http://www.getmiro.com/",
929
+ "os": "windows"
930
+ },
931
+ {
932
+ "user_agents": [
933
+ "MJ12bot"
934
+ ],
935
+ "bot": true
936
+ },
937
+ {
938
+ "user_agents": [
939
+ "^mpv 0\\."
940
+ ],
941
+ "app": "mpv",
942
+ "info_url": "https://mpv.io/"
943
+ },
944
+ {
945
+ "user_agents": [
946
+ "^MusicBee"
947
+ ],
948
+ "app": "MusicBee",
949
+ "device": "pc",
950
+ "examples": [
951
+ "MusicBee"
952
+ ],
953
+ "info_url": "https://getmusicbee.com/",
954
+ "os": "windows"
955
+ },
956
+ {
957
+ "user_agents": [
958
+ "^OkDownload/"
959
+ ]
960
+ },
961
+ {
962
+ "user_agents": [
963
+ "okhttp"
964
+ ],
965
+ "examples": [
966
+ "okhttp/3.11.0"
967
+ ]
968
+ },
969
+ {
970
+ "user_agents": [
971
+ "Opera/.*Android;"
972
+ ],
973
+ "app": "Opera",
974
+ "os": "android"
975
+ },
976
+ {
977
+ "user_agents": [
978
+ "Opera/.*\\(Linux"
979
+ ],
980
+ "app": "Opera",
981
+ "device": "pc",
982
+ "os": "linux"
983
+ },
984
+ {
985
+ "user_agents": [
986
+ "Opera/.*\\(Macintosh"
987
+ ],
988
+ "app": "Opera",
989
+ "device": "pc",
990
+ "os": "macos"
991
+ },
992
+ {
993
+ "user_agents": [
994
+ "Opera/.*\\(Windows"
995
+ ],
996
+ "app": "Opera",
997
+ "device": "pc",
998
+ "os": "windows"
999
+ },
1000
+ {
1001
+ "user_agents": [
1002
+ "Opera[/ ]"
1003
+ ],
1004
+ "app": "Opera"
1005
+ },
1006
+ {
1007
+ "user_agents": [
1008
+ "^Overcast/"
1009
+ ],
1010
+ "app": "Overcast",
1011
+ "examples": [
1012
+ "Overcast/3.0 (+http://overcast.fm/; iOS podcast app)"
1013
+ ],
1014
+ "os": "ios"
1015
+ },
1016
+ {
1017
+ "user_agents": [
1018
+ "^PandoraRSSCrawler"
1019
+ ],
1020
+ "bot": true
1021
+ },
1022
+ {
1023
+ "user_agents": [
1024
+ "^Pandora.+Android"
1025
+ ],
1026
+ "app": "Pandora",
1027
+ "device": "phone",
1028
+ "os": "android"
1029
+ },
1030
+ {
1031
+ "user_agents": [
1032
+ "^Player FM"
1033
+ ],
1034
+ "app": "Player FM"
1035
+ },
1036
+ {
1037
+ "user_agents": [
1038
+ "^Pingdom"
1039
+ ],
1040
+ "bot": true
1041
+ },
1042
+ {
1043
+ "user_agents": [
1044
+ "^Pocket Casts",
1045
+ "^PocketCasts/"
1046
+ ],
1047
+ "app": "Pocket Casts",
1048
+ "device": "phone",
1049
+ "examples": [
1050
+ "Pocket Casts"
1051
+ ],
1052
+ "info_url": "https://www.pocketcasts.com/",
1053
+ "description": "A podcast app and web player",
1054
+ "developer_notes": "'PocketCasts' is a feed parser; 'Pocket Casts' is the app. There is also a web player.",
1055
+ "svg": "pocketcasts.svg"
1056
+ },
1057
+ {
1058
+ "user_agents": [
1059
+ "^Podcast.*Addict/"
1060
+ ],
1061
+ "app": "PodcastAddict",
1062
+ "device": "phone",
1063
+ "examples": [
1064
+ "PodcastAddict/v2 - Dalvik/2.1.0 (Linux; U; Android 9; SM-N950U Build/PPR1.180610.011)"
1065
+ ],
1066
+ "os": "android"
1067
+ },
1068
+ {
1069
+ "user_agents": [
1070
+ "iOS.*The Podcast App/"
1071
+ ],
1072
+ "app": "The Podcast App",
1073
+ "os": "ios"
1074
+ },
1075
+ {
1076
+ "user_agents": [
1077
+ "^PodcastRepublic.+Android"
1078
+ ],
1079
+ "app": "PodcastRepublic",
1080
+ "device": "phone",
1081
+ "examples": [
1082
+ "PodcastRepublic/18.0 (Linux; U; Android 10;blueline/QP1A.190711.020.C3)"
1083
+ ],
1084
+ "os": "android"
1085
+ },
1086
+ {
1087
+ "user_agents": [
1088
+ "podCloud"
1089
+ ],
1090
+ "app": "PodCloud",
1091
+ "description": "Le podcast, simplement. A French-language web-based podcast player.",
1092
+ "bot": true,
1093
+ "developer_notes": "This useragent is a bot, doing feed updates and downloading media files. It was observed every six hours. User plays will have a standard browser useragent with a referer of https://podcloud.fr/ ",
1094
+ "info_url": "https://podcloud.fr"
1095
+ },
1096
+ {
1097
+ "user_agents": [
1098
+ "^Podcoin"
1099
+ ],
1100
+ "app": "Podcoin"
1101
+ },
1102
+ {
1103
+ "user_agents": [
1104
+ "^PodCruncher/"
1105
+ ],
1106
+ "app": "PodCruncher"
1107
+ },
1108
+ {
1109
+ "user_agents": [
1110
+ "^Podbean/"
1111
+ ],
1112
+ "app": "Podbean"
1113
+ },
1114
+ {
1115
+ "user_agents": [
1116
+ "^Podkicker"
1117
+ ],
1118
+ "app": "Podkicker Pro",
1119
+ "os": "android"
1120
+ },
1121
+ {
1122
+ "user_agents": [
1123
+ "PodnewsBot"
1124
+ ],
1125
+ "app": "Podnews",
1126
+ "bot": true,
1127
+ "description": "Podnews runs a number of bots to read and test RSS and audio files",
1128
+ "info_url": "http://podnews.net"
1129
+ },
1130
+ {
1131
+ "user_agents": [
1132
+ "python-requests"
1133
+ ],
1134
+ "bot": true
1135
+ },
1136
+ {
1137
+ "user_agents": [
1138
+ "^Radioplayer Android app"
1139
+ ],
1140
+ "app": "RadioPlayer",
1141
+ "os": "android",
1142
+ "description": "Radioplayer is a radio and podcast app, with country-specific versions available in selected countries.",
1143
+ "info_url": "http://radioplayer.org"
1144
+ },
1145
+ {
1146
+ "user_agents": [
1147
+ "^Radioplayer iOS app"
1148
+ ],
1149
+ "app": "RadioPlayer",
1150
+ "os": "ios",
1151
+ "description": "Radioplayer is a radio and podcast app, with country-specific versions available in selected countries.",
1152
+ "info_url": "http://radioplayer.org"
1153
+ },
1154
+ {
1155
+ "user_agents": [
1156
+ "^RadioPublic/android-",
1157
+ "^RadioPublic Android"
1158
+ ],
1159
+ "app": "RadioPublic",
1160
+ "description": "RadioPublic’s free, easy to use podcast player makes listening to podcasts simple, enjoyable, and fun.",
1161
+ "examples": [
1162
+ "RadioPublic/android-2.2"
1163
+ ],
1164
+ "info_url": "https://radiopublic.com/",
1165
+ "svg": "radiopublic.svg",
1166
+ "os": "android"
1167
+ },
1168
+ {
1169
+ "user_agents": [
1170
+ "RadioPublic iOS",
1171
+ "RadioPublic.+CFNetwork"
1172
+ ],
1173
+ "app": "RadioPublic",
1174
+ "description": "RadioPublic’s free, easy to use podcast player makes listening to podcasts simple, enjoyable, and fun.",
1175
+ "info_url": "https://radiopublic.com/",
1176
+ "svg": "radiopublic.svg",
1177
+ "os": "ios"
1178
+ },
1179
+ {
1180
+ "user_agents": [
1181
+ "request\\.js"
1182
+ ],
1183
+ "bot": true
1184
+ },
1185
+ {
1186
+ "user_agents": [
1187
+ "^Roku/DVP-8.*\\(04"
1188
+ ],
1189
+ "device": "tv",
1190
+ "os": "roku"
1191
+ },
1192
+ {
1193
+ "user_agents": [
1194
+ "^RSSRadio \\("
1195
+ ],
1196
+ "bot": true
1197
+ },
1198
+ {
1199
+ "user_agents": [
1200
+ "^RSSRadio7?/"
1201
+ ],
1202
+ "app": "RSS Radio",
1203
+ "device": "phone",
1204
+ "examples": [
1205
+ "RSSRadio7/9252 CFNetwork/1107.1 Darwin/19.0.0"
1206
+ ],
1207
+ "info_url": "http://rssrad.io",
1208
+ "os": "ios"
1209
+ },
1210
+ {
1211
+ "user_agents": [
1212
+ "^Ruby"
1213
+ ],
1214
+ "bot": true
1215
+ },
1216
+ {
1217
+ "user_agents": [
1218
+ "^SEMrushBot"
1219
+ ],
1220
+ "bot": true
1221
+ },
1222
+ {
1223
+ "user_agents": [
1224
+ "^Spotify/.+Linux"
1225
+ ],
1226
+ "app": "Spotify",
1227
+ "device": "pc",
1228
+ "os": "linux"
1229
+ },
1230
+ {
1231
+ "user_agents": [
1232
+ "Macintosh.+Spotify/",
1233
+ "^Spotify/.+OSX"
1234
+ ],
1235
+ "app": "Spotify",
1236
+ "device": "pc",
1237
+ "os": "macos"
1238
+ },
1239
+ {
1240
+ "user_agents": [
1241
+ "Windows.+Spotify/",
1242
+ "^Spotify/.+Win32"
1243
+ ],
1244
+ "app": "Spotify",
1245
+ "device": "pc",
1246
+ "os": "windows"
1247
+ },
1248
+ {
1249
+ "user_agents": [
1250
+ "^Spotify/.+Android"
1251
+ ],
1252
+ "app": "Spotify",
1253
+ "device": "phone",
1254
+ "os": "android"
1255
+ },
1256
+ {
1257
+ "user_agents": [
1258
+ "^Spotify/.*iOS"
1259
+ ],
1260
+ "app": "Spotify",
1261
+ "device": "phone",
1262
+ "os": "ios"
1263
+ },
1264
+ {
1265
+ "user_agents": [
1266
+ "^Spotify/\\d+"
1267
+ ],
1268
+ "bot": true
1269
+ },
1270
+ {
1271
+ "user_agents": [
1272
+ "Macintosh.*AppleWebKit.*Safari/"
1273
+ ],
1274
+ "app": "Safari",
1275
+ "device": "pc",
1276
+ "os": "macos"
1277
+ },
1278
+ {
1279
+ "user_agents": [
1280
+ "Windows.*AppleWebKit.*Safari/"
1281
+ ],
1282
+ "app": "Safari",
1283
+ "device": "pc",
1284
+ "os": "windows"
1285
+ },
1286
+ {
1287
+ "user_agents": [
1288
+ "iPhone.*AppleWebKit.*Safari/"
1289
+ ],
1290
+ "app": "Safari",
1291
+ "device": "phone",
1292
+ "os": "ios"
1293
+ },
1294
+ {
1295
+ "user_agents": [
1296
+ "iPad.*AppleWebKit.*Safari/"
1297
+ ],
1298
+ "app": "Safari",
1299
+ "device": "tablet",
1300
+ "os": "ios"
1301
+ },
1302
+ {
1303
+ "user_agents": [
1304
+ "^Subcast"
1305
+ ],
1306
+ "app": "Subcast"
1307
+ },
1308
+ {
1309
+ "user_agents": [
1310
+ "Sonos"
1311
+ ],
1312
+ "app": "Sonos",
1313
+ "device": "speaker",
1314
+ "os": "sonos"
1315
+ },
1316
+ {
1317
+ "user_agents": [
1318
+ "^Spreaker"
1319
+ ],
1320
+ "app": "Spreaker"
1321
+ },
1322
+ {
1323
+ "user_agents": [
1324
+ "support@dorada.co.uk"
1325
+ ],
1326
+ "bot": true
1327
+ },
1328
+ {
1329
+ "user_agents": [
1330
+ "^Stitcher/Android"
1331
+ ],
1332
+ "app": "Stitcher",
1333
+ "os": "android"
1334
+ },
1335
+ {
1336
+ "user_agents": [
1337
+ "^AlexaMediaPlayer/Stitcher"
1338
+ ],
1339
+ "app": "Stitcher",
1340
+ "device": "speaker",
1341
+ "os": "alexa"
1342
+ },
1343
+ {
1344
+ "user_agents": [
1345
+ "^Stitcher/iOS"
1346
+ ],
1347
+ "app": "Stitcher",
1348
+ "os": "ios"
1349
+ },
1350
+ {
1351
+ "user_agents": [
1352
+ "StitcherBot"
1353
+ ],
1354
+ "bot": true
1355
+ },
1356
+ {
1357
+ "user_agents": [
1358
+ "^Storiyoh/"
1359
+ ],
1360
+ "app": "Storiyoh"
1361
+ },
1362
+ {
1363
+ "user_agents": [
1364
+ "^Swinsian/"
1365
+ ],
1366
+ "app": "Swinsian",
1367
+ "device": "pc",
1368
+ "examples": [
1369
+ "Swinsian/472 CFNetwork/978.0.7 Darwin/18.7.0 (x86_64)"
1370
+ ],
1371
+ "info_url": "https://swinsian.com/",
1372
+ "os": "macos"
1373
+ },
1374
+ {
1375
+ "user_agents": [
1376
+ "^Swoot/"
1377
+ ],
1378
+ "app": "Swoot"
1379
+ },
1380
+ {
1381
+ "user_agents": [
1382
+ "^Trackable/"
1383
+ ],
1384
+ "bot": true
1385
+ },
1386
+ {
1387
+ "user_agents": [
1388
+ "^TuneIn"
1389
+ ],
1390
+ "app": "TuneIn"
1391
+ },
1392
+ {
1393
+ "user_agents": [
1394
+ "^Twitterbot"
1395
+ ],
1396
+ "bot": true
1397
+ },
1398
+ {
1399
+ "user_agents": [
1400
+ "^Typhoeus"
1401
+ ],
1402
+ "bot": true
1403
+ },
1404
+ {
1405
+ "user_agents": [
1406
+ "^VictorReader Stream"
1407
+ ],
1408
+ "app": "VictorReader",
1409
+ "device": "speaker",
1410
+ "os": "victorreader"
1411
+ },
1412
+ {
1413
+ "user_agents": [
1414
+ "^VLC/\\d"
1415
+ ],
1416
+ "app": "VLC media player",
1417
+ "device": "pc",
1418
+ "examples": [
1419
+ "VLC/3.0.8 LibVLC/3.0.8"
1420
+ ],
1421
+ "info_url": "https://www.videolan.org/vlc/"
1422
+ },
1423
+ {
1424
+ "user_agents": [
1425
+ "Wget"
1426
+ ],
1427
+ "bot": true
1428
+ },
1429
+ {
1430
+ "user_agents": [
1431
+ "^Winamp"
1432
+ ],
1433
+ "app": "Winamp",
1434
+ "device": "pc",
1435
+ "examples": [
1436
+ "WinampMPEG/2.7"
1437
+ ],
1438
+ "os": "windows"
1439
+ },
1440
+ {
1441
+ "user_agents": [
1442
+ "^NSPlayer",
1443
+ "^WMPlayer/"
1444
+ ],
1445
+ "app": "Windows Media Player",
1446
+ "device": "pc",
1447
+ "examples": [
1448
+ "NSPlayer/12.00.18362.0418 WMFSDK/12.00.18362.0418"
1449
+ ],
1450
+ "os": "windows"
1451
+ },
1452
+ {
1453
+ "user_agents": [
1454
+ "^WordPress"
1455
+ ],
1456
+ "bot": true
1457
+ },
1458
+ {
1459
+ "user_agents": [
1460
+ "YandexBot"
1461
+ ],
1462
+ "bot": true
1463
+ },
1464
+ {
1465
+ "user_agents": [
1466
+ "^yapa/"
1467
+ ],
1468
+ "app": "Yapa"
1469
+ },
1470
+ {
1471
+ "user_agents": [
1472
+ "stagefright/"
1473
+ ],
1474
+ "os": "android"
1475
+ }
1476
+ ]