podcast-agent 0.0.2

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: 9c122d467688095b1b8e97dd3ed0c103a4a87212d8b3b9a99da13c8345ed50b3
4
+ data.tar.gz: 4da0078fe2eb72e6617bbd5fdbaa67be7cf1219ee25b4b6d7bb27f2233849108
5
+ SHA512:
6
+ metadata.gz: 3ae36ab2372ba29bd738cf27a52b9449a265c917f2be922d94fbdad510126370996b1baa041006c5de3d4809a5ddc44839d683958a476ef730c8b3ea47925fe5
7
+ data.tar.gz: e3d5449855f192b9548eb0a52db76991431974d130244d5ce3e326ff7f64e349026f2a8c984161bc8a94e99697c6c9c4eb09d93bd514bb13e2874bb45eb4d157
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ *.log
2
+ *.gem
3
+ .byebug_history
4
+ .ruby-gemset
5
+ .ruby-version
6
+ Gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ gem 'rake'
6
+ gem 'byebug'
7
+ gem 'useragent'
data/README.md ADDED
@@ -0,0 +1,45 @@
1
+
2
+
3
+ Podcast Agents
4
+ =========
5
+
6
+ This is library is for identifying entities that download or stream podcast episodes. For lack of a better term, these will be referred to as **Podcast Agents**. Podcast Agents include apps, bots, and browsers.
7
+
8
+ ## Identification
9
+
10
+ In order to identify a Podcast Agent, we will be just the **user-agent**. I intend to add the referring URL in the future to better improve the detection. This information will be compared to a database of Podcast Agents and will result in one and only one match.
11
+
12
+ **Name**: Name of the Podcast Agent that matches the database
13
+ **Browser**: Browser as parsed by [UserAgent GEM](https://github.com/gshutler/useragent)
14
+ **Platform**: Platform as parsed by [UserAgent GEM](https://github.com/gshutler/useragent)
15
+
16
+ ## Installation
17
+
18
+ gem install podcast-agent
19
+
20
+ ### Examples
21
+
22
+ #### Pandora on Safari
23
+
24
+ ```ruby
25
+ user_agent_string = 'Mozilla/5.0 (iPad; CPU OS 12_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 Pandora/1908.1'
26
+ podcast_agent = PodcastAgent.find_by(user_agent_string: user_agent_string)
27
+ podcast_agent.app
28
+ # => 'Pandora'
29
+ podcast_agent.browser
30
+ # => 'Safari'
31
+ podcast_agent.platform
32
+ # => 'iPad'
33
+ ```
34
+ #### Apple Home Pod
35
+
36
+ ```ruby
37
+ user_agent_string = 'AppleCoreMedia/1.0.0.15C4092b (HomePod; U; CPU OS 11_2 like Mac OS X; de_de)'
38
+ podcast_agent = PodcastAgent.find_by(user_agent_string: user_agent_string)
39
+ podcast_agent.app
40
+ # => 'Apple HomePod'
41
+ podcast_agent.browser
42
+ # => 'AppleCoreMedia'
43
+ podcast_agent.platform
44
+ # => 'HomePod'
45
+ ```
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ require "bundler/setup"
2
+ require "bundler/gem_tasks"
3
+ require "rake/testtask"
4
+
5
+ Rake::TestTask.new do |test|
6
+ test.libs << "test"
7
+ test.test_files = FileList["test/*_test.rb"]
8
+ test.warning = false
9
+ end
10
+
11
+ task default: :test
@@ -0,0 +1,461 @@
1
+ - name: 'Ahrefs'
2
+ regex: AhrefsBot
3
+ type: bot
4
+
5
+ - name: 'AhaRadio'
6
+ regex: ^AhaRadio2\/
7
+ type: app
8
+
9
+ - name: 'Acast'
10
+ regex: ^Acast
11
+ type: app
12
+
13
+ - name: 'Alexa Enabled Device'
14
+ regex: ^AlexaMediaPlayer\/\d.*ExoPlayerLib
15
+ type: app
16
+
17
+ - name: 'All You Can Books'
18
+ regex: AllYouCanBooks
19
+ type: app
20
+
21
+ - name: 'Amazon Alexa Flash Briefing'
22
+ regex: ^AmazonNewsContentService
23
+ type: app
24
+
25
+ - name: 'Amazon Echo'
26
+ regex: ^Echo
27
+ type: app
28
+
29
+ - name: 'Android Download Manager'
30
+ regex: ^AndroidDownloadManager
31
+ type: app
32
+
33
+ - name: 'Antenna Pod'
34
+ regex: ^AntennaPod|antennapod|antenna\/.*CFNetwork
35
+ type: app
36
+
37
+ - name: 'Apache HTTP Client'
38
+ regex: ^Apache-HttpClient\/
39
+ type: bot
40
+
41
+ - name: 'APK downloader'
42
+ regex: ^APKXDL
43
+ type: bot
44
+
45
+ - name: 'Apple Watch'
46
+ regex: ^AppleCoreMedia\/.*Apple Watch
47
+ type: app
48
+
49
+ - name: 'Apple HomePod'
50
+ regex: ^AppleCoreMedia\/.*HomePod
51
+ type: app
52
+
53
+ - name: 'Apple TV'
54
+ regex: ^AppleCoreMedia\/.*Apple TV
55
+ type: app
56
+
57
+ - name: 'Apple Podcasts'
58
+ regex: ^Podcasts\/|^AppleCoreMedia\/.*(iPad|iPhone|iPod)
59
+ type: app
60
+
61
+ - name: 'Apple Music'
62
+ regex: ^AppleCoreMedia\/.*Macintosh
63
+ type: app
64
+
65
+ - name: 'Apple News'
66
+ regex: AppleNews\/
67
+ type: app
68
+
69
+ - name: 'Apple iTMS'
70
+ regex: ^iTMS
71
+ type: bot
72
+
73
+ - name: 'Apple iTunes'
74
+ regex: ^iTunes\/
75
+ type: app
76
+
77
+ - name: 'Apple iTunes Store'
78
+ regex: ^itunesstored
79
+ type: bot
80
+
81
+ - name: 'BeyondPod'
82
+ regex: ^Mozilla.*BeyondPod
83
+ type: app
84
+
85
+ - name: 'Breaker'
86
+ regex: ^Breaker\/
87
+ type: app
88
+
89
+ - name: 'Bose'
90
+ regex: ^Bose\/
91
+ type: app
92
+
93
+ - name: 'Bullhorn'
94
+ regex: ^Bullhorn
95
+ type: app
96
+
97
+ - name: 'Castaway'
98
+ regex: ^Castaway\/
99
+ type: app
100
+
101
+ - name: 'Castro'
102
+ regex: ^Castro[\/|\s]
103
+ type: app
104
+
105
+ - name: 'CastBox'
106
+ regex: ^Cast[B|b]ox
107
+ type: app
108
+
109
+ - name: 'Chromecast'
110
+ regex: ^Mozilla.*CrKey
111
+ type: app
112
+
113
+ - name: 'Clementine'
114
+ regex: ^Clementine
115
+ type: app
116
+
117
+ - name: 'CloudPlayer'
118
+ regex: ^doubleTwist CloudPlayer
119
+ type: app
120
+
121
+ - name: 'Curl'
122
+ regex: curl|cURL
123
+ type: app
124
+
125
+ - name: 'Dalvik'
126
+ regex: ^Dalvik
127
+ type: app
128
+
129
+ - name: 'Deezer'
130
+ regex: ^Deezer\/
131
+ type: app
132
+
133
+ - name: 'DoggCatcher'
134
+ regex: DoggCatcher
135
+ type: app
136
+
137
+ - name: 'DotBot'
138
+ regex: DotBot\/
139
+ type: bot
140
+
141
+ - name: 'Downcast'
142
+ regex: Downcast[\/|\s]
143
+ type: app
144
+
145
+ - name: FacebookBot
146
+ regex: facebookexternalhit|Facebot
147
+ type: bot
148
+
149
+ - name: Facebook
150
+ regex: \[FBAN
151
+ type: app
152
+
153
+
154
+ - name: Fire OS
155
+ regex: ^Fire OS.+stagefright
156
+ type: app
157
+
158
+ - name: GNOME
159
+ regex: ^gvfs
160
+ type: bot
161
+
162
+ - name: GoldenPod
163
+ regex: ^GoldenPod\/
164
+ type: app
165
+
166
+ - name: Google Ads Bot
167
+ regex: AdsBot-Google
168
+ type: bot
169
+
170
+ - name: Google Bot
171
+ regex: Googlebot
172
+ type: bot
173
+
174
+ - name: Google Home
175
+ regex: ^Google-Speech-Action|GoogleChirp\/
176
+ type: app
177
+
178
+ - name: Google Podcasts Bot
179
+ regex: Google-Podcast\)
180
+ type: bot
181
+
182
+ - name: Google Search Appliance
183
+ regex: GSA\/
184
+ type: app
185
+
186
+ - name: gPodder
187
+ regex: ^gPodder\/|gpodder
188
+ type: app
189
+
190
+ - name: GStreamer
191
+ regex: GStreamer
192
+ type: app
193
+
194
+ - name: Himalaya
195
+ regex: Himalaya(\/|_test)
196
+ type: app
197
+
198
+ - name: HardCast
199
+ regex: ^HardCast
200
+ type: app
201
+
202
+ - name: HermesPod
203
+ regex: ^\+hermespod\.com
204
+ type: app
205
+
206
+ - name: iCatcher
207
+ regex: i[c|C]atcher[\!|\/]
208
+ type: app
209
+
210
+ - name: iHeartRadio
211
+ regex: ^iHeartRadio\/
212
+ type: app
213
+
214
+ - name: Juice Receiver
215
+ regex: ^Juice\/
216
+ type: app
217
+
218
+ - name: 'Laughable'
219
+ regex: ^Laughable
220
+ type: app
221
+
222
+ - name: 'LG Player'
223
+ regex: ^(LG-|LM-|Player).+LG Player.+Android.*\(stagefright alternative\)($|.Dynamo.*)
224
+ type: app
225
+
226
+ - name: Listen5
227
+ regex: ^Listen5
228
+ type: app
229
+
230
+ - name: Livelap Bot
231
+ regex: LivelapBot
232
+ type: bot
233
+
234
+ - name: Luminary
235
+ regex: ^Luminary\/
236
+ type: app
237
+
238
+ - name: Majestic-12 Bot
239
+ regex: MJ12bot\/
240
+ type: bot
241
+
242
+ - name: Majelan
243
+ regex: MajelanApp
244
+ type: app
245
+
246
+ - name: Mechanize
247
+ regex: Mechanize\/
248
+ type: bot
249
+
250
+ - name: MediaMonkey
251
+ regex: ^MediaMonkey
252
+ type: app
253
+
254
+ - name: MyTuner
255
+ regex: ^my[T|t]uner
256
+ type: app
257
+
258
+ - name: OkDownload
259
+ regex: OkDownload\/
260
+ type: app
261
+
262
+ - name: OkHTTP
263
+ regex: okhttp\/
264
+ type: app
265
+
266
+ - name: Overcast
267
+ regex: Overcast\/
268
+ type: app
269
+
270
+ - name: Pandora
271
+ regex: Pandora\/
272
+ type: app
273
+
274
+ - name: Pandora RSS Crawler
275
+ regex: PandoraRSSCrawler\/
276
+ type: bot
277
+
278
+ - name: Perl Script
279
+ regex: libwww-perl
280
+ type: bot
281
+
282
+ - name: Player FM
283
+ regex: ^Player FM|Player FM$
284
+ type: app
285
+
286
+ - name: Podbean
287
+ regex: ^Podbean
288
+ type: app
289
+
290
+ - name: Podcoin
291
+ regex: ^Podcoin
292
+ type: app
293
+
294
+ - name: Podkicker
295
+ regex: ^Podkicker( Pro)?\/
296
+ type: app
297
+
298
+ - name: PodCruncher
299
+ regex: PodCruncher
300
+ type: app
301
+
302
+ - name: Podcast Addict
303
+ regex: Podcast Addict|PodcastAddict
304
+ type: app
305
+
306
+ - name: Podcast Republic
307
+ regex: PodcastRepublic
308
+ type: app
309
+
310
+ - name: Podtrapper
311
+ regex: ^PodTrapper
312
+ type: app
313
+
314
+ - name: 'podCloud'
315
+ regex: ^MediaAnalyzer[\/| ]podCloud[\/| ]
316
+ type: bot
317
+
318
+ - name: Pocket Casts
319
+ regex: Pocket Casts|PocketCasts
320
+ type: app
321
+
322
+ - name: ProCast
323
+ regex: ^Pro[C|c]ast
324
+ type: app
325
+
326
+ - name: Python Requests
327
+ regex: ^python-requests
328
+ type: bot
329
+
330
+ - name: RadioPublic
331
+ regex: ^RadioPublic(Draper)?
332
+ type: app
333
+
334
+ - name: Request.js
335
+ regex: request.js
336
+ type: app
337
+
338
+ - name: Roku
339
+ regex: ^Roku\/DVP
340
+ type: app
341
+
342
+ - name: RSSRadio
343
+ regex: ^RSSRadio
344
+ type: app
345
+
346
+ - name: Ruby
347
+ regex: ^Ruby
348
+ type: bot
349
+
350
+ - name: ServeStream
351
+ regex: ^ServeStream
352
+ type: app
353
+
354
+ - name: Sodes
355
+ regex: ^Sodes
356
+ type: app
357
+
358
+ - name: Sonos
359
+ regex: ^Sonos|Linux.*Sonos\/
360
+ type: app
361
+
362
+ - name: Spotify
363
+ regex: ^Spotify\/
364
+ type: app
365
+
366
+ - name: Spreaker
367
+ regex: ^Spreaker|Spreaker\/\d*.\d*$
368
+ type: app
369
+
370
+ - name: Stitcher
371
+ regex: ^Stitcher\/|\/Stitcher
372
+ type: app
373
+
374
+ - name: StitcherBot
375
+ regex: ^StitcherBot
376
+ type: bot
377
+
378
+ - name: Subcast
379
+ regex: ^Subcast
380
+ type: app
381
+
382
+ - name: Swoot
383
+ regex: ^Swoot(\/| A)
384
+ type: app
385
+
386
+ - name: Storiyoh
387
+ regex: ^Storiyoh\/
388
+ type: app
389
+
390
+ - name: TED
391
+ regex: ^TED
392
+ type: app
393
+
394
+ - name: Trackable
395
+ regex: ^Trackable\/
396
+ type: bot
397
+
398
+ - name: TuneIn Radio
399
+ regex: ^TuneIn|TuneIn\/\d
400
+ type: app
401
+
402
+ - name: Twitter
403
+ regex: Twitter(\/|Android| for)
404
+ type: app
405
+
406
+ - name: Twitter Bot
407
+ regex: ^Twitterbot
408
+ type: bot
409
+
410
+ - name: Typhoeus
411
+ regex: ^Typhoeus
412
+ type: bot
413
+
414
+ - name: uTorrent
415
+ regex: ^uTorrent|BTWebClient
416
+ type: app
417
+
418
+ - name: Victor Reader Stream
419
+ regex: ^VictorReader
420
+ type: app
421
+
422
+ - name: Wget
423
+ regex: ^Wget
424
+ type: bot
425
+
426
+ - name: Winamp
427
+ regex: Winamp
428
+ type: bot
429
+
430
+ - name: Windows Media Player
431
+ regex: ^(Windows\-Media\-Player\/|NSPlayer|WMPlayer)
432
+ type: app
433
+
434
+ - name: Zune
435
+ regex: ^Zune
436
+ type: app
437
+
438
+ - name: WordPress
439
+ regex: WordPress
440
+ type: bot
441
+
442
+ - name: Yapa
443
+ regex: ^yapa\/
444
+ type: app
445
+
446
+ - name: Yandex Bot
447
+ regex: YandexBot
448
+ type: bot
449
+
450
+ - name: Datagnion Bot
451
+ regex: datagnionbot
452
+ type: bot
453
+
454
+ - name: SEMrush Bot
455
+ regex: SemrushBot
456
+ type: bot
457
+
458
+ - name: Go
459
+ regex: ^Go-http-client
460
+ type: bot
461
+
@@ -0,0 +1,27 @@
1
+ require 'YAML'
2
+ require 'user_agent'
3
+
4
+ class PodcastAgent
5
+ attr_reader :name, :type, :browser, :platform
6
+
7
+ def initialize(name:, type:, user_agent:)
8
+ @name = name
9
+ @type = type
10
+ @user_agent = user_agent
11
+ @browser = user_agent.browser
12
+ @platform = user_agent.platform
13
+ end
14
+
15
+ def self.find_by(user_agent_string:)
16
+ entry = database.find do |attrs|
17
+ user_agent_string =~ Regexp.new(attrs['regex'])
18
+ end
19
+ new(name: entry['name'], type: entry['type'], user_agent: UserAgent.parse(user_agent_string)) if entry
20
+ end
21
+
22
+ def self.database
23
+ @database ||= YAML.load_file('lib/data/podcast_agents.yml')
24
+ end
25
+
26
+ end
27
+
@@ -0,0 +1,20 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'podcast-agent'
3
+ s.version = '0.0.2'
4
+ s.date = '2019-08-21'
5
+ s.summary = "A GEM to identify podcast agent information"
6
+ s.description = "A GEM to identify podcast agent information"
7
+ s.authors = ["Tom Rossi"]
8
+ s.email = 'tom@higherpixels.com'
9
+ s.homepage = 'https://github.com/buzzsprout/podcast-agent'
10
+ s.license = 'MIT'
11
+
12
+ s.required_ruby_version = '>= 2.4.0'
13
+
14
+ s.add_dependency 'activesupport', '>= 5.2.0'
15
+
16
+ s.add_development_dependency 'bundler', '~> 1.15'
17
+
18
+ s.files = `git ls-files`.split("\n")
19
+ s.test_files = `git ls-files -- test/*`.split("\n")
20
+ end
@@ -0,0 +1,573 @@
1
+ 'Acast':
2
+ - Acast/2.0.1 (phone; android 9; samsung SM-G390F)
3
+ - Acast/2.0.0 (Phone; iOS 12.4.1; iPhone10,4)
4
+
5
+ 'Alexa Enabled Device':
6
+ - AlexaMediaPlayer/5.5.5-9010 (Linux;Android 5.1.1) ExoPlayerLib/1.5.0
7
+ - AlexaMediaPlayer/1.0.2253.0_1665410 (Linux;Android 5.1.1) ExoPlayerLib/1.5.9
8
+ - AlexaMediaPlayer/2.1.1878.0 (Linux;Android 5.1.1) ExoPlayerLib/1.5.9
9
+
10
+ 'All You Can Books':
11
+ - AllYouCanBooks/510 CFNetwork/811.5.4 Darwin/16.7.0
12
+ - Mozilla/5.0 (Linux; Android 9; CLT-L29 Build/HUAWEICLT-L29; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.101 Mobile Safari/537.36 AllYouCanBooksAppAndroid
13
+ - Mozilla/5.0 (Linux; Android 9; SM-G950U Build/PPR1.180610.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.89 Mobile Safari/537.36 AllYouCanBooksAppAndroid
14
+ - Mozilla/5.0 (iPhone; CPU iPhone OS 10_1_1 like Mac OS X) AppleWebKit/602.2.14 (KHTML, like Gecko) Mobile/14B100 AllYouCanBooksApp
15
+
16
+ 'Ahrefs':
17
+ - Mozilla/5.0 (compatible; AhrefsBot/6.1; +http://ahrefs.com/robot/)
18
+
19
+ 'AhaRadio':
20
+ - AhaRadio2/8.12.3 CFNetwork/976 Darwin/18.2.0
21
+ - AhaRadio2/5.4 CFNetwork/758.0.2 Darwin/15.0.0
22
+
23
+ 'Amazon Alexa Flash Briefing':
24
+ - AmazonNewsContentService
25
+
26
+ 'Amazon Echo':
27
+ - Echo/1.0(MRM)
28
+ - Echo/1.0(APNG)
29
+
30
+ 'Android Download Manager':
31
+ - AndroidDownloadManager/4.3 (Linux; U; Android 4.3; SGH-M919 Build/JSS15J)
32
+ - AndroidDownloadManager/6.0 (Linux; U; Android 6.0; Nexus 5 Build/MRA58K)
33
+
34
+ 'Antenna Pod':
35
+ - AntennaPod/1.7.2b Dynamo/1.0
36
+ - AntennaPod/1.6.6-RC2
37
+ - de.danoeh.antennapod/1.7.2b (Linux;Android 8.1.0) ExoPlayerLib/2.9.3
38
+ - antenna/19 CFNetwork/711.1.16 Darwin/14.0.0
39
+
40
+ 'Apache HTTP Client':
41
+ - Apache-HttpClient/4.5.3-SNAPSHOT (Java/1.8.0_73)
42
+ - Apache-HttpClient/4.5.6 (Java/1.8.0_222)
43
+
44
+ 'APK downloader':
45
+ - APKXDL (Linux; U; Android 4.4.4;nb_no; trlte/KTU84P) Downloader
46
+ - APKXDL (Linux; U; Android 4.4.4;en_au; C6903/14.4.A.0.108) Downloader
47
+
48
+ 'Apple Watch':
49
+ - AppleCoreMedia/1.0.0.16U113 (Apple Watch; U; CPU OS 5_2_1 like Mac OS X; pl_pl)
50
+ - AppleCoreMedia/1.0.0.17R5556d (Apple Watch; U; CPU OS 6_0 like Mac OS X; de_at)
51
+
52
+ 'Apple HomePod':
53
+ - AppleCoreMedia/1.0.0.15C4092b (HomePod; U; CPU OS 11_2 like Mac OS X; de_de)
54
+ - AppleCoreMedia/1.0.0.16G100 (HomePod; U; CPU OS 12_4_1 like Mac OS X; en_us)
55
+
56
+ 'Apple Podcasts':
57
+ - Podcasts/1410.25 CFNetwork/1107 Darwin/19.0.0
58
+ - Podcasts/1400.227 CFNetwork/1098.7 Darwin/19.0.0 Dynamo/1.0
59
+ - Podcasts/1.0.0 iPhone/12.4 hw/iPhone11_2
60
+ - Podcasts/1.2.3
61
+ - AppleCoreMedia/1.0.0.17A5821e (iPhone; U; CPU OS 13_1 like Mac OS X; tr_tr)
62
+ - AppleCoreMedia/1.0.0.16G102 (iPad; U; CPU OS 12_4_1 like Mac OS X; sk_sk)
63
+ - AppleCoreMedia/1.0.0.16G102 (iPod touch; U; CPU OS 12_4_1 like Mac OS X; en_ca)
64
+
65
+ 'Apple Music':
66
+ - AppleCoreMedia/1.0.0.16A323 (Macintosh; U; Intel Mac OS X 10_12; en_au)
67
+ - AppleCoreMedia/1.0.0.19A536g (Macintosh; U; Intel Mac OS X 10_15; fr_fr)
68
+ - AppleCoreMedia/1.0.0.18F132 (Macintosh; U; Intel Mac OS X 10_14_5; en_gb) Dynamo/1.0
69
+
70
+ 'Apple News':
71
+ - Mozilla/5.0 (iPad; CPU OS 12_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) AppleNews/2166 Version/4.4
72
+ - AppleNews/1470 Version/3.3
73
+ - Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) AppleNews/2132 Version/4.3
74
+
75
+ 'Apple iTunes':
76
+ - iTunes/12.9.5 (Windows; Microsoft Windows 8 x64 (Build 9200); x64) AppleWebKit/7607.2006.2001.1
77
+ - iTunes/4.7.1 (Linux; N; Debian; armv7l-linux; FR; utf8) SqueezeCenter, Squeezebox Server, Logitech Media Server/7.9.1/1512734075
78
+ - iTunes/10.4 (Macintosh; Intel Mac OS X 10.6.8) AppleWebKit/534.58.2
79
+
80
+ 'Apple TV':
81
+ - AppleCoreMedia/1.0.0.15L576 (Apple TV; U; CPU OS 11_4 like Mac OS X; en_us)
82
+ - AppleCoreMedia/1.0.0.15M73 (Apple TV; U; CPU OS 11_4_1 like Mac OS X; id)
83
+
84
+ 'Apple iTMS':
85
+ - iTMS
86
+ - iTMS Dynamo/1.0
87
+
88
+ 'Apple iTunes Store':
89
+ - itunesstored (unknown version) CFNetwork/548.1.4 Darwin/11.0.0
90
+ - itunesstored/1.0 iOS/7.1.1 model/iPhone5,3 build/11D201 (dt:97)
91
+
92
+ 'BeyondPod':
93
+ - Mozilla/5.0 (Linux; U; en-us; BeyondPod)
94
+ - 'Mozilla/5.0 (Linux; U; en-us; BeyondPod) AppEngine-Google; (+http://code.google.com/appengine; appid: s~turbulencesywir24)'
95
+ - Mozilla/5.0 (Linux; U; en-us; BeyondPod 4) Dynamo/1.0
96
+
97
+ 'Bose':
98
+ - Bose/7.22.0 Dynamo/1.0
99
+
100
+ 'Bullhorn':
101
+ - Bullhorn
102
+ - Bullhorn/4 CFNetwork/978.0.7 Darwin/18.6.0
103
+ - Bullhorn/1.0 (+http://bullhorn.fm/) Dynamo/1.0
104
+ - Bullhorn (https://bullhorn.fm)
105
+
106
+ 'Breaker':
107
+ - Breaker/840 CFNetwork/948.2.1 Darwin/18.0.0
108
+ - Breaker/0.7.2 (907)
109
+ - Breaker/Android/0.1.0 PRIVATE BETA (16)
110
+ - Breaker/iOS/0.8.1 (1076)
111
+
112
+ 'Castaway':
113
+ - Castaway/8 CFNetwork/1098.7 Darwin/19.0.0
114
+ - Castaway/8 CFNetwork/1085.4 Darwin/19.0.0
115
+
116
+ 'Castro':
117
+ - Castro/1024 CFNetwork/955.1.2 Darwin/18.0.0
118
+ - Castro Episode Download (http://supertop.co/castro)
119
+ - Castro 2 Episode Download
120
+
121
+ 'CastBox':
122
+ - CastBox/0.2.0 python-requests/2.20.1
123
+ - CastBox/7.69.20-190815047 (Linux;Android 4.2.2) ExoPlayerLib/2.9.1
124
+ - CastBox/7.69.20-190815047 (Linux;Android 4.4.4) ExoPlayerLib/2.9.1/7.69.20-190815047 (Linux;Android 4.4.4) ExoPlayerLib/2.9.1
125
+ - CastBox/8.4.1 (fm.castbox.audiobook.radio.podcast; build:1; iOS 10.0.1)
126
+ - CastBox/8.4.1 (fm.castbox.audiobook.radio.podcast; build:1; iOS 11.4.0) Dynamo/1.0
127
+ - Castbox/4.10.1 (fm.castbox.audiobook.radio.podcast; build:1; iOS 12.2.0) Alamofire/4.7.1
128
+ - Castbox/4.17 (fm.castbox.audiobook.radio.podcast; build:3; iOS 12.3.1) Alamofire/4.7.3
129
+
130
+ 'Chromecast':
131
+ - Mozilla/5.0 (Linux; Android 5.0; Build/LRX21V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.90 Safari/537.36 CrKey/1.15.38401
132
+ - Mozilla/5.0 (CrKey armv7l 1.8.17977) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.0 Safari/537.36
133
+ - Mozilla/5.0 (X11; Linux aarch64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.15 Safari/537.36 CrKey/1.39.147275
134
+ - Mozilla/5.0 (Unknown; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.0 Safari/537.36 CrKey
135
+
136
+ 'Clementine':
137
+ - Clementine 1.3.1-702-g3b76fa627 Clementine 1.3.1-702-g3b76fa627 Clementine 1.3.1-702-g3b76fa627
138
+ - Clementine 1.3.1 Clementine 1.3.1 Clementine 1.3.1 Clementine 1.3.1
139
+ - Clementine 1.3.1-702-g3b76fa627
140
+ - Clementine 1.2.1
141
+
142
+ 'CloudPlayer':
143
+ - doubleTwist CloudPlayer Dynamo/1.0
144
+ - doubleTwist CloudPlayer BMID/E678F730EA
145
+ - doubleTwist CloudPlayer
146
+
147
+ 'Curl':
148
+ - curl/7.39.0
149
+ - libcurl/7.65.1
150
+ - PycURL/7.43.0 libcurl/7.47.0 GnuTLS/3.4.10 zlib/1.2.8 libidn/1.32 librtmp/2.3
151
+ - GuzzleHttp/6.1.0 curl/7.50.1 PHP/7.0.13-0ubuntu0.16.10.1
152
+
153
+ 'Dalvik':
154
+ - Dalvik/2.1.0 (Linux; U; Android 8.0.0; G8341 Build/47.1.A.2.281)
155
+ - Dalvik (Linux; U; Android 4.1.1;aries/JRO03L)
156
+ - Dalvik/1.6.0 (Linux; U; Android 4.3; Galaxy Nexus Build/JWR66Y)
157
+
158
+ 'Deezer':
159
+ - Deezer/5.7.0.7 CFNetwork/758.1.6 Darwin/15.0.0
160
+ - Deezer/7.15.0.4 CFNetwork/1098.7 Darwin/19.0.0
161
+ - Deezer/5.4.18.30 (Android; 7.0; Mobile; br) samsung SM-G950F
162
+ - Deezer/5.4.18.30 (Android; 7.0; Mobile; us) samsung SM-G950F
163
+ - Deezer/6.1.8.54 (Android; 8.0.0; Mobile; br) motorola moto g(6)
164
+
165
+ 'DoggCatcher':
166
+ - Mozilla/5.0 (Linux; U; Windows NT 6.1; en-us; dream) DoggCatcher Dynamo/1.0
167
+ - Mozilla/5.0 (Linux; U; Windows NT 6.1; en-us; dream) DoggCatcher
168
+
169
+ 'DotBot':
170
+ - Mozilla/5.0 (compatible; DotBot/1.1; http://www.opensiteexplorer.org/dotbot, help@moz.com)
171
+ - Mozilla/5.0 (compatible; DotBot/1.1; http://www.dotnetdotcom.org/, crawler@dotnetdotcom.org)
172
+
173
+ 'Downcast':
174
+ - Downcast/2.9.12 (Mac OS X Version 10.12.6 (Build 16G1036))
175
+
176
+ 'Facebook':
177
+ - Mozilla/5.0 (iPad; CPU OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 [FBAN/FBIOS;FBDV/iPad6,12;FBMD/iPad;FBSN/iOS;FBSV/12.3.1;FBSS/2;FBID/tablet;FBLC/en_GB;FBOP/5;FBCR/EE]
178
+ - Mozilla/5.0 (iPhone; CPU iPhone OS 11_0_1 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Mobile/15A402 [FBAN/FBIOS;FBAV/188.0.0.44.85;FBBV/123253203;FBDV/iPhone7,2;FBMD/iPhone;FBSN/iOS;FBSV/11.0.1;FBSS/2;FBCR/3DK;FBID/phone;FBLC/da_DK;FBOP/5;FBRV
179
+
180
+ 'FacebookBot':
181
+ - facebookexternalhit
182
+ - facebookexternalhit/1.1;line-poker/1.0
183
+ - facebookexternalhit/1.1 (compatible; Blueno/1.0; +http://naver.me/scrap)
184
+ - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/601.2.4 (KHTML, like Gecko) Version/9.0.1 Safari/601.2.4 facebookexternalhit/1.1 Facebot Twitterbot/1.0
185
+ - Facebot
186
+
187
+ 'Fire OS':
188
+ - Fire OS/5.2.7.1 stagefright/1.2 (Linux;Android 5.1.1)
189
+ - Fire OS/5.3.6.8 stagefright/1.2 (Linux;Android 5.1.1) Dynamo/1.0
190
+ - Fire OS/6.0 stagefright/1.2 (Linux;Android 7.1.2)
191
+
192
+ 'GNOME':
193
+ - gvfs/1.38.3
194
+ - gvfs/1.40.1
195
+ - gvfs/1.6.1
196
+
197
+ 'GoldenPod':
198
+ - GoldenPod/0.8.4 (GNU/Linux; podcatcher; Using LWP) libwwwperl
199
+
200
+ 'Google Ads Bot':
201
+ - AdsBot-Google (+http://www.google.com/adsbot.html) Dynamo/1.0
202
+ - Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1 (compatible; AdsBot-Google-Mobile; +http://www.google.com/mobile/adsbot.html) Dynamo/1.0
203
+ - Mozilla/5.0 (Linux; Android 5.0; SM-G920A) AppleWebKit (KHTML, like Gecko) Chrome Mobile Safari (compatible; AdsBot-Google-Mobile; +http://www.google.com/mobile/adsbot.html)
204
+
205
+ 'Google Bot':
206
+ - Googlebot-Video/1.0
207
+ - Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
208
+ - Googlebot-Image/1.0
209
+ - Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html)
210
+ - Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
211
+
212
+ 'Google Home':
213
+ - Libassistant/1.0 GoogleChirp/1.0.1 (Linux; Android/5.0) GOOG/7 AppleWebKit/534.30 (KHTML, like Gecko)
214
+ - Google-Speech-Actions
215
+
216
+ 'Google Podcasts Bot':
217
+ - Mozilla/5.0 (compatible; Google-Podcast)
218
+ - Mozilla/5.0 (compatible; Google-Podcast) Dynamo/1.0
219
+
220
+ 'Google Search Appliance':
221
+ - Mozilla/5.0 (iPad; CPU OS 7_0_4 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) GSA/3.2.1.25875 Mobile/11B554a Safari/8536.25
222
+ - Mozilla/5.0 (Linux; Android 6.0.1; Nexus 6P Build/MTC19T; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/50.0.2661.86 Mobile Safari/537.36 GSA/5.13.31.21.arm64
223
+
224
+ 'gPodder':
225
+ - mygpo-feedservice +http://feeds.gpodder.net/
226
+ - gPodder/3.5.2 (+http://gpodder.org/)
227
+ - Detlef/1 (https://github.com/gpodder/detlef/
228
+ - gPodder/4.4.0 (+http://gpodder.org/)
229
+
230
+ 'GStreamer':
231
+ - GStreamer souphttpsrc libsoup/2.38.1
232
+ - amarok/2.8.0 (Phonon/4.7.80; Phonon-GStreamer/4.7.80)
233
+ - GStreamer neonhttpsrc
234
+ - yarock/1.1.6 (Phonon/4.7.1; Phonon-GStreamer/4.7.2)
235
+
236
+ 'HardCast':
237
+ - HardCast/11 CFNetwork/978.0.7 Darwin/18.7.0
238
+ - HardCast/11 CFNetwork/901.1 Darwin/17.6.0
239
+
240
+ 'HermesPod':
241
+ - +hermespod.com/v1.5.x
242
+
243
+ 'Himalaya':
244
+ - Himalaya/2.2.7 Android/25 (A577VL)
245
+ - Himalaya/1558 CFNetwork/974.2.1 Darwin/18.0.0
246
+ - Himalaya/1460 CFNetwork/976 Darwin/18.2.0
247
+ - Himalaya/2.2.10 (iPhone; iOS 12.0; Scale/2.00; CFNetwork; iPhone7,2)
248
+ - Himalaya_test/55 CFNetwork/894 Darwin/17.4.0
249
+
250
+ 'iCatcher':
251
+ - icatcher/4506 CFNetwork/609.1.4 Darwin/13.0.0
252
+ - iCatcher! 1.7.2 (iPad; iPhone OS 5.1.1; en_GB)
253
+ - iCatcher! podcast app/2.2.4
254
+ - iCatcher!/4.6.6 (iPhone; iOS 11.2.5; Scale/2.0)
255
+ - iTunes (iCatcher!/2.6.3)
256
+ - iTunes (iCatcher!/3.0.6)
257
+
258
+ 'iHeartRadio':
259
+ - iHeartRadio/7.3.3 (Android Sdk 21)
260
+ - iHeartRadio/8.0.0 (Android 7.0; XT1650 Build/NCL25.86-11.5)
261
+ - iHeartRadio/8.7.0 (iPhone; iOS 11.0.3; iPhone6,1)
262
+ - iHeartRadio/8.9.1 (iPad; iOS 11.2.6; iPad6,7)
263
+
264
+ 'Juice Receiver':
265
+ - Juice/2.2 (Darwin) +http://juicereceiver.sf.net/
266
+ - Juice/2.2 (Windows) +http://juicereceiver.sf.net/
267
+
268
+ 'Laughable':
269
+ - Laughable/2.1.6.1 CFNetwork/808.1.4 Darwin/16.1.0
270
+ - Laughable iOS/3.0.1 (com.bywayEndeavors.Laughable; build:3.0.1.0; iOS 12.1.3) Alamofire/4.7.3
271
+ - Laughable/2.1.6.1 CFNetwork/808.3 Darwin/16.3.0
272
+ - Laughable/2 CFNetwork/811.5.4 Darwin/16.6.0
273
+
274
+ 'Listen5':
275
+ - Listen5 1.1 build 36 (iPhone; iOS 12.1.2; en_US)
276
+ - Listen5 1.2 build 36 (iPhone; iOS 12.3.1; en_US)
277
+
278
+ 'Livelap Bot':
279
+ - LivelapBot/0.2 (http://site.livelap.com/crawler)
280
+
281
+ 'LG Player':
282
+ - LG-H930/V30b Player/LG Player 1.0 for Android 9 (stagefright alternative)
283
+ - LM-X410.F/V10o Player/LG Player 1.0 for Android 7.1.2 (stagefright alternative)
284
+ - Player/LG Player 1.0 for Android 6.0.1 (stagefright alternative) Dynamo/1.0
285
+
286
+ 'Luminary':
287
+ - Luminary/0.0.244 build 3915/iOS 13.0
288
+ - Luminary/1.0.24 build 92/iOS 12.3.1 Dynamo/1.0
289
+ - Luminary/1.0.10 build 1436/Android SDK 28
290
+ - Luminary/1.0.10 build 66/Android SDK 28 Dynamo/1.0
291
+
292
+ 'Majestic-12 Bot':
293
+ - Mozilla/5.0 (compatible; MJ12bot/v1.4.3; http://www.majestic12.co.uk/bot.php?+)
294
+ - Mozilla/5.0 (compatible; MJ12bot/v1.4.5; http://www.majestic12.co.uk/bot.php?+)
295
+ - Mozilla/5.0 (compatible; MJ12bot/v1.4.4; http://www.majestic12.co.uk/bot.php?+)
296
+
297
+ 'Majelan':
298
+ - MajelanApp/8 CFNetwork/975.0.3 Darwin/17.7.0
299
+ - MajelanApp 1.0 build 8 (iPhone; iOS 12.1; en_US)
300
+ - MajelanApp/70 CFNetwork/978.0.7 Darwin/18.6.0
301
+ - MajelanApp/914 CFNetwork/978.0.7 Darwin/18.7.0
302
+
303
+ 'MediaMonkey':
304
+ - MediaMonkey
305
+ - MediaMonkey 4.0.1.1461
306
+ - MediaMonkey5 5.0.0.2191
307
+
308
+ 'Mechanize':
309
+ - Mechanize/2.7.6 Ruby/2.6.2p47 (http://github.com/sparklemotion/mechanize/) Dynamo/1.0
310
+ - Mechanize/2.7.6 Ruby/2.5.3p105 (http://github.com/sparklemotion/mechanize/)
311
+ - Mozilla/5.0 (compatible; Mechanize/2.7.4)
312
+ - WWW-Mechanize/1.72
313
+
314
+ 'MyTuner':
315
+ - myTuner Radio app/11 CFNetwork/978.0.7 Darwin/18.7.0
316
+ - myTuner%20Radio%20app/11 CFNetwork/978.0.7 Darwin/18.7.0
317
+ - mytuner_podcasts_androidplayer/1.0.0 (Linux;Android 6.0) ExoPlayerLib/2.8.4
318
+ - mytuner_podcasts_androidplayer/1.0.2 (Linux;Android 6.0.1) ExoPlayerLib/2.8.4
319
+
320
+ 'OkDownload':
321
+ - OkDownload/1.0.4-SNAPSHOT
322
+ - OkDownload/1.0.3
323
+
324
+ 'OkHTTP':
325
+ - okhttp/2.7.0
326
+ - Android 9 / Wire 3.30.764 / HttpLibrary okhttp/3.9.0
327
+ - okhttp/3.6.0 Dynamo/1.0
328
+
329
+ 'Overcast':
330
+ - Overcast/792 CFNetwork/1098.7 Darwin/19.0.0
331
+ - Overcast/1.0 (+http://overcast.fm/; iOS podcast app)
332
+
333
+ 'Pandora':
334
+ - Pandora/1908.1 Android/9 ali (ExoPlayerLib1.5.14.1)
335
+ - Mozilla/5.0 (iPad; CPU OS 12_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 Pandora/1908.1
336
+ - Mozilla/5.0 (iPad; CPU OS 12_1_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/16D57 Pandora/1908.1
337
+
338
+ 'Pandora RSS Crawler':
339
+ - PandoraRSSCrawler/1.0 (podcastpartnerships@pandora.com)
340
+
341
+ 'Perl Script':
342
+ - LWP::Simple/6.34 libwww-perl/6.34
343
+ - libwww-perl/6.15
344
+ - libwww-perl/6.04
345
+
346
+ 'Player FM':
347
+ - Player FM/349 CFNetwork/894 Darwin/17.4.0
348
+ - Player FM/348 CFNetwork/978.0.7 Darwin/18.5.0 Dynamo/1.0
349
+ - Player/LG Player 1.0 for Android(stagefright alternative), Player FM
350
+ - stagefright/1.2 (Linux;Android NexPlayer LG-L39CV10a), Player FM
351
+
352
+ 'Podkicker':
353
+ - Podkicker/2.2.9 Dynamo/1.0
354
+ - Podkicker Pro/3.0.5
355
+ - Podkicker Pro/1.9.4
356
+ - Podkicker/1.1.0 Android/2.3.7
357
+
358
+ 'Pocket Casts':
359
+ - Shifty Jelly Pocket Casts, iOS v4.2
360
+ - Player/LG Player 1.0 for Android 4.4.2 (stagefright alternative), Pocket Casts
361
+ - 'Pocket Casts AppEngine-Google; (+http://code.google.com/appengine; appid: s~i8964-200-03)'
362
+ - Shifty Jelly Pocket Casts, Android v4.2.5
363
+
364
+ 'Podbean':
365
+ - Podbean/Android App 7.0.3 (http://podbean.com),b1cd4156abce30aab18baddeac90724f
366
+ - Podbean/iOS (http://podbean.com) 5.0.3 - 153acb4cd1d12fba94416523f7c1f530
367
+
368
+ 'Podcast Addict':
369
+ - PodcastAddict/v2 - Dalvik/2.1.0 (Linux; U; Android 9; G8142 Build/47.2.A.10.80)
370
+ - PodcastAddict/v2 - Mozilla/5.0 (Linux; Android 8.1.0; 5008D_EEA Build/O11019; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/64.0.3282.137 Mobile Safari/537.36
371
+ - Podcast Addict - Dalvik/2.1.0 (Linux; U; Android 9; SM-G960F Build/PPR1.180610.011)
372
+ - Podcast Addict - Dalvik/2.1.0 (Linux; U; Android 5.0; RCT6773W22B Build/LRX21M)
373
+
374
+ 'podCloud':
375
+ - 'MediaAnalyzer podCloud/3.9.0-f575fbd4 (Podcast app like iTunes/12.0; Reason: media-5d65d68fa9b49765a47065a6)'
376
+ - 'MediaAnalyzer podCloud/3.9.0-d5c42d86 (Podcast app like iTunes/12.0; Reason: media-5b100cdfa9b4972072000002)'
377
+ - 'MediaAnalyzer/podCloud 1.1 (like iTunes/10.0)'
378
+
379
+ 'Podcoin':
380
+ - Podcoin/60 CFNetwork/978.0.7 Darwin/18.7.0
381
+ - Podcoin Dynamo/1.0
382
+ - Podcoin
383
+ - Podcoin/168 CFNetwork/978.0.7 Darwin/18.5.0 Dynamo/1.0
384
+
385
+ 'PodCruncher':
386
+ - PodCruncher/3.3.1 CFNetwork/978.0.7 Darwin/18.7.0
387
+ - PodCruncher/3.7.1 CFNetwork/978.0.7 Darwin/18.7.0 Dynamo/1.0
388
+
389
+ 'Podcast Republic':
390
+ - PodcastRepublic/18.0 (Linux; U; Android 8.0.0;hannah/OCPS27.91-164-1)
391
+ - PodcastRepublic/18.0 (Linux; U; Android 5.0;A1000/S100)
392
+ - PodcastRepublic/18.0 (Linux; U; Android 9;HWVTR/HUAWEIVTR-L29)
393
+
394
+ 'Podtrapper':
395
+ - PodTrapper
396
+
397
+ 'ProCast':
398
+ - ProCast/2 CFNetwork/1098.7 Darwin/19.0.0
399
+ - Procast (iOS)
400
+ - ProCast/1 CFNetwork/811.5.4 Darwin/16.7.0
401
+ - ProCast/3 CFNetwork/894 Darwin/17.4.0
402
+
403
+ 'Python Requests':
404
+ - python-requests/2.7.0 CPython/2.7.12 Linux/4.14.123-95.109.amzn2.x86_64
405
+ - python-requests/2.22.0
406
+ - python-requests/2.2.1 CPython/2.7.3+ Darwin/17.7.0 QCast/1.81
407
+ - python-requests/2.7.0 CPython/2.7.12 Linux/4.14.88-72.73.amzn1.x86_64
408
+
409
+ 'RadioPublic':
410
+ - RadioPublic/android-2.2 Dynamo/1.0
411
+ - RadioPublic/android-2.2
412
+ - RadioPublicDraper/81b12be Faraday/0.15.2 ruby/2.3.8
413
+ - RadioPublic iOS 1.9.18
414
+ - RadioPublic/9 CFNetwork/808.3 Darwin/16.3.0
415
+
416
+ 'Request.js':
417
+ - request.js
418
+
419
+ 'Roku':
420
+ - Roku/DVP-9.10 (499.10E04121A)
421
+ - Roku/DVP-9.12 (909.12E04066A)
422
+ - Roku/DVP-9.0 (519.00E04142A) Dynamo/1.0
423
+
424
+ 'Ruby':
425
+ - Ruby, Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36
426
+ - Ruby, linkthumbnailer
427
+ - Ruby, Twurly v1.1 (http://twurly.org)
428
+ - Ruby, link_thumbnailer
429
+ - Ruby
430
+
431
+ 'RSSRadio':
432
+ - RSSRadio/9213 (iPhone;iOS;12.0)
433
+ - RSSRadio7Lite/9216 CFNetwork/974.2.1 Darwin/18.0.0
434
+ - RSSRadio/9216 (iPhone;iOS;12.0.1)
435
+ - RSSRadio7Lite/9195 CFNetwork/893.14.2 Darwin/17.3.0
436
+
437
+ 'ServeStream':
438
+ - ServeStream Dynamo/1.0
439
+ - ServeStream
440
+
441
+ 'Sodes':
442
+ - Sodes/1657 CFNetwork/1098.6 Darwin/19.0.0
443
+ - Sodes/1468 CFNetwork/958.1 Darwin/18.0.0
444
+
445
+ 'Sonos':
446
+ - Sonos
447
+ - Linux UPnP/1.0 Sonos/52.13-68180 (ZPS18)
448
+ - Linux UPnP/1.0 Sonos/53.1-68130-ci-124-Mainline-590142 (ZPS13)
449
+ - Linux UPnP/1.0 Sonos/49.2-60220-trunk_ext_release (ZPS1)
450
+
451
+ 'Spotify':
452
+ - Spotify/8.5.20 Android/27 (Ilium M7)
453
+ - Spotify/8.5.19 iOS/12.4 (iPad7,6)
454
+ - Spotify/8.5.20 Android/25 (Samsung Chromebook 3)
455
+ - Spotify/111200449 OSX/0 (MacBookAir6,2)
456
+
457
+ 'Spreaker':
458
+ - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.6983.89 Safari/537.36 Spreaker/1.0
459
+ - Spreaker for Android 4.10.8 release:2019-08-05 device:phone (samsung SM-G950U; Android 9; en_US)
460
+ - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.1236.89 Safari/537.36 Spreaker/1.0
461
+
462
+ 'Stitcher':
463
+ - Stitcher/28420 CFNetwork/609.1.4 Darwin/13.0.0
464
+ - AlexaMediaPlayer/Stitcher (Linux;Android 8.1.0) ExoPlayerLib/2.2.0 Dynamo/1.0
465
+ - Stitcher/13874 CFNetwork/485.13.9 Darwin/11.0.0
466
+ - Stitcher/Android
467
+ - Stitcher/iOS
468
+
469
+ 'StitcherBot':
470
+ - StitcherBot (MP3 Search Bot for Stitcher Personalized Radio Service) Dynamo/1.0
471
+ - StitcherBot (MP3 Search Bot for Stitcher Personalized Radio Service)
472
+
473
+ 'Swoot':
474
+ - Swoot/1.57.0 (Linux;Android 7.0) ExoPlayerLib/2.9.6
475
+ - Swoot/1.0 (build 9e4f293)
476
+ - Swoot Agent 1.0
477
+ - Swoot/2517
478
+
479
+ 'Storiyoh':
480
+ - Storiyoh/2.2.3 (Linux;Android 8.1.0) ExoPlayerLib/2.9.0
481
+ - Storiyoh/5 CFNetwork/902.2 Darwin/17.7.0
482
+ - Storiyoh/1 CFNetwork/894 Darwin/17.4.0
483
+
484
+ 'Subcast':
485
+ - Subcast/1.0 (user=933ffa24-9b4d-4c7d-bb42-843656b56a84)
486
+ - Subcast/1.0 (user=390d4c85-75a8-495c-9254-2bb53cef34d9)
487
+
488
+ 'TED':
489
+ - TED POD-2.0.2
490
+ - TED/2941 CFNetwork/976 Darwin/18.2.0
491
+ - TED Android; Version 3.3.3; OPPO R15 9
492
+
493
+ 'Trackable':
494
+ - Trackable/0.1 Dynamo/1.0
495
+ - Trackable/0.1
496
+
497
+ 'Twitter':
498
+ - Mozilla/5.0 (Linux; Android 8.1.0; POCOPHONE F1 Build/OPM1.171019.026; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/76.0.3809.111 Mobile Safari/537.36 TwitterAndroid
499
+ - TwitterAndroid/8.8.0-release.82 (18080082-r-82) SM-T837V/9 (samsung;SM-T837V;Verizon;gts4lltevzw;0;;0;2015)
500
+ - Twitter/7.51.5 CFNetwork/978.0.7 Darwin/18.6.0
501
+ - Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/16D57 Twitter for iPhone/7.50
502
+ - Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/16F203 Twitter for iPhone/7.52.5
503
+
504
+ 'Twitter Bot':
505
+ - Twitterbot/1.0 Dynamo/1.0
506
+ - Twitterbot/1.0
507
+
508
+ 'Typhoeus':
509
+ - Typhoeus - https://github.com/typhoeus/typhoeus, Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
510
+ - Typhoeus - https://github.com/typhoeus/typhoeus
511
+
512
+ 'TuneIn Radio':
513
+ - TuneIn%20Radio%20Pro/1224 CFNetwork/978.0.7 Darwin/18.7.0
514
+ - TuneIn Radio/22.7.2 (Linux;Android 8.0.0) ExoPlayerLib/2.9.4
515
+ - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) TuneIn/1.12.0 Chrome/69.0.3497.128 Electron/4.2.8 Safari/537.36
516
+
517
+ 'uTorrent':
518
+ - BTWebClient/1870(43938)
519
+ - uTorrent/341(109279400)(30888)
520
+
521
+ 'Victor Reader Stream':
522
+ - VictorReader Stream 503 au-en Tyler Lucy 4.7.2
523
+ - VictorReader Stream 503 uk-en Graham Rachel 4.7.2
524
+ - VictorReader_4-4-2
525
+
526
+ 'Wget':
527
+ - Wget/1.14
528
+ - Wget/1.20.3 (darwin17.7.0)
529
+ - Wget
530
+
531
+ 'Winamp':
532
+ - WinampMPEG/5.57, Ultravox/2.1
533
+ - WinampMPEG/2.9
534
+ - Winamp/5.8
535
+ - Winamp
536
+ - WinampMPEG
537
+
538
+ 'Windows Media Player':
539
+ - Windows-Media-Player/12.0.15063.1805
540
+ - Windows-Media-Player/11.0.5721.5145
541
+ - NSPlayer/12.0.15063.0 (compatible; J. River Internet Reader/2.0; Windows-Media-Player/10)
542
+ - NSPlayer/12.00.18965.1000 WMFSDK/12.00.18965.1000
543
+ - WMPlayer/10.0.0.364 guid/3300AD50-2C39-46C0-AE0A-AC7B8159E203 Dynamo/1.0
544
+ - WMPlayer/10.0.0.364 guid/2F8D1CB4-0A5A-4FD7-986F-FFDBA14156C7
545
+
546
+ 'Zune':
547
+ - Zune/4.8 Dynamo/1.0
548
+ - Zune/4.7
549
+
550
+ 'WordPress':
551
+ - WordPress/4.4; http://
552
+ - WordPress/5.2.2; http://
553
+ - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) WordPressDesktop/4.2.0 Chrome/58.0.3029.110 Electron/1.7.16 Safari/537.36
554
+ - WordPress.com; https://phiquyenchinh.org
555
+
556
+ 'Yapa':
557
+ - yapa/1.6.2 (Linux;Android 8.0.0) ExoPlayerLib/2.9.6
558
+ - yapa/1.4.37 (Linux;Android 8.0.0) ExoPlayerLib/2.9.6
559
+
560
+ 'Yandex Bot':
561
+ - Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)
562
+
563
+ 'Datagnion Bot':
564
+ - datagnionbot (+http://www.datagnion.com/bot.html)
565
+
566
+ 'SEMrush Bot':
567
+ - Mozilla/5.0 (compatible; SemrushBot/6~bl; +http://www.semrush.com/bot.html)
568
+ - Mozilla/5.0 (compatible; SemrushBot/3~bl; +http://www.semrush.com/bot.html)
569
+
570
+ 'Go':
571
+ - Go-http-client/2.0
572
+ - Go-http-client/1.1 Dynamo/1.0
573
+ - Go-http-client/1.1
@@ -0,0 +1,20 @@
1
+ require 'test_helper'
2
+
3
+ class IntegrityTest < ActiveSupport::TestCase
4
+
5
+ test 'no multiple matches for name samples' do
6
+ user_agent_samples.each do |name, samples|
7
+ samples.each do |sample|
8
+ matches = PodcastAgent.database.select do |attrs|
9
+ sample =~ Regexp.new(attrs['regex'])
10
+ end
11
+ assert_equal 1, matches.length, "'#{sample}' has multiple matches"
12
+ end
13
+ end
14
+ end
15
+
16
+ test 'no duplicate name entries' do
17
+ assert_equal PodcastAgent.database.map(&:first).length, PodcastAgent.database.map(&:first).uniq.length
18
+ end
19
+
20
+ end
@@ -0,0 +1,23 @@
1
+ require 'test_helper'
2
+
3
+ class PocastAgentTest < ActiveSupport::TestCase
4
+
5
+ test 'should match all sample user_agents' do
6
+ user_agent_samples.each do |name, samples|
7
+ samples.each do |sample|
8
+ agent = PodcastAgent.find_by(user_agent_string: sample)
9
+ assert agent, "'#{sample}' could not be parsed as #{name}'"
10
+ assert_equal name, agent.name, sample
11
+ end
12
+ end
13
+ end
14
+
15
+ test 'should match the app and the browser' do
16
+ pandora_user_agent = 'Mozilla/5.0 (iPad; CPU OS 12_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 Pandora/1908.1'
17
+ agent = PodcastAgent.find_by(user_agent_string: pandora_user_agent)
18
+ assert_equal 'Pandora', agent.name
19
+ assert_equal 'Safari', agent.browser
20
+ assert_equal 'iPad', agent.platform
21
+ end
22
+
23
+ end
@@ -0,0 +1,16 @@
1
+ # $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
2
+ require 'active_support'
3
+ require 'active_support/testing/autorun'
4
+
5
+ require 'podcast_agent'
6
+ require 'byebug'
7
+
8
+ class ActiveSupport::TestCase
9
+
10
+ private
11
+
12
+ def user_agent_samples
13
+ @user_agent_samples ||=
14
+ YAML.load_file('test/data/sample_user_agents.yml')
15
+ end
16
+ end
metadata ADDED
@@ -0,0 +1,85 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: podcast-agent
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Tom Rossi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-08-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 5.2.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 5.2.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.15'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.15'
41
+ description: A GEM to identify podcast agent information
42
+ email: tom@higherpixels.com
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - ".gitignore"
48
+ - Gemfile
49
+ - README.md
50
+ - Rakefile
51
+ - lib/data/podcast_agents.yml
52
+ - lib/podcast_agent.rb
53
+ - podcast-agent.gemspec
54
+ - test/data/sample_user_agents.yml
55
+ - test/integrity_test.rb
56
+ - test/podcast_agent_test.rb
57
+ - test/test_helper.rb
58
+ homepage: https://github.com/buzzsprout/podcast-agent
59
+ licenses:
60
+ - MIT
61
+ metadata: {}
62
+ post_install_message:
63
+ rdoc_options: []
64
+ require_paths:
65
+ - lib
66
+ required_ruby_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: 2.4.0
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ requirements: []
77
+ rubygems_version: 3.0.3
78
+ signing_key:
79
+ specification_version: 4
80
+ summary: A GEM to identify podcast agent information
81
+ test_files:
82
+ - test/data/sample_user_agents.yml
83
+ - test/integrity_test.rb
84
+ - test/podcast_agent_test.rb
85
+ - test/test_helper.rb