podcast-agent 0.0.2

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: 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