podcast_agent_parser 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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
+ ]