From 753b0f4c831ce227df68ca031a456e8d410049b1 Mon Sep 17 00:00:00 2001 From: Eric Teubert Date: Sun, 24 Nov 2024 17:26:22 +0100 Subject: [PATCH] feat: upgrade to opawg v2 user agents --- bin/uadetect.php | 21 +- bin/update-opawg.sh | 7 +- data/apps.runtime.json | 1900 ++++++++++++++++++++++++++++++++ data/bots.runtime.json | 672 ++++++++++++ data/browsers.runtime.json | 44 + data/devices.runtime.json | 99 ++ data/libraries.runtime.json | 239 ++++ data/opawg.json | 2058 ----------------------------------- data/referrers.runtime.json | 325 ++++++ lib/model/user_agent.php | 118 +- 10 files changed, 3376 insertions(+), 2107 deletions(-) create mode 100644 data/apps.runtime.json create mode 100644 data/bots.runtime.json create mode 100644 data/browsers.runtime.json create mode 100644 data/devices.runtime.json create mode 100644 data/libraries.runtime.json delete mode 100644 data/opawg.json create mode 100644 data/referrers.runtime.json diff --git a/bin/uadetect.php b/bin/uadetect.php index 408bb2cfe..ba0332aaf 100644 --- a/bin/uadetect.php +++ b/bin/uadetect.php @@ -1,20 +1,9 @@ user_agent = trim($args[1]); +$agent->parse(); -$userAgent = $argv[1]; -$dd = new DeviceDetector($userAgent); -$dd->parse(); - -if ($dd->isBot()) { - var_dump($botInfo = $dd->getBot()); -} else { - $clientInfo = $dd->getClient(); // holds information about browser, feed reader, media player, ... - $osInfo = $dd->getOs(); - $device = $dd->getDevice(); - $brand = $dd->getBrand(); - $model = $dd->getModel(); - var_dump($clientInfo, $osInfo, $device, $brand, $model); -} +print_r($agent); diff --git a/bin/update-opawg.sh b/bin/update-opawg.sh index 433ed9fcb..a9b7c48d1 100644 --- a/bin/update-opawg.sh +++ b/bin/update-opawg.sh @@ -1,3 +1,8 @@ #!/usr/bin/env bash -wget -O data/opawg.json https://raw.githubusercontent.com/opawg/user-agents/master/src/user-agents.json +wget -O data/apps.runtime.json https://raw.githubusercontent.com/opawg/user-agents-v2/refs/heads/master/build/apps.runtime.json +wget -O data/bots.runtime.json https://raw.githubusercontent.com/opawg/user-agents-v2/refs/heads/master/build/bots.runtime.json +wget -O data/browsers.runtime.json https://raw.githubusercontent.com/opawg/user-agents-v2/refs/heads/master/build/browsers.runtime.json +wget -O data/devices.runtime.json https://raw.githubusercontent.com/opawg/user-agents-v2/refs/heads/master/build/devices.runtime.json +wget -O data/libraries.runtime.json https://raw.githubusercontent.com/opawg/user-agents-v2/refs/heads/master/build/libraries.runtime.json +wget -O data/referrers.runtime.json https://raw.githubusercontent.com/opawg/user-agents-v2/refs/heads/master/build/referrers.runtime.json diff --git a/data/apps.runtime.json b/data/apps.runtime.json new file mode 100644 index 000000000..f030b246f --- /dev/null +++ b/data/apps.runtime.json @@ -0,0 +1,1900 @@ +{ + "entries": [ + { + "name": "Abandon", + "pattern": "Abandon/" + }, + { + "name": "Acast", + "pattern": "^Acast.+([Aa]ndroid|iOS|Darwin)" + }, + { + "name": "Accompany", + "pattern": "Accompany/" + }, + { + "name": "ActiasLuna", + "pattern": "ActiasLuna/" + }, + { + "name": "ActionExtension", + "pattern": "ActionExtension/" + }, + { + "name": "Adori", + "pattern": "^Adori(-Dev)?/" + }, + { + "name": "Adori-Listen", + "pattern": "^Adori-Listen/" + }, + { + "name": "AdventureChurch", + "pattern": "^AdventureChurch/" + }, + { + "name": "Aftenposten Android app", + "pattern": "Android AP Hermes/" + }, + { + "name": "Aftenposten iOS app", + "pattern": "iOS AP Hermes/" + }, + { + "name": "Aftonbladet Android app", + "pattern": "Android Aftonbladet Hermes/" + }, + { + "name": "Aftonbladet iOS app", + "pattern": "iOS Aftonbladet Hermes/" + }, + { + "name": "Agora", + "pattern": "^Agora/" + }, + { + "name": "AhaRadio", + "pattern": "^AhaRadio2/" + }, + { + "name": "Airr", + "pattern": "^Airr(%20Beta)?/|^Airr \\(" + }, + { + "name": "Airsonic", + "pattern": "^Airsonic/" + }, + { + "name": "Alexa-enabled device", + "pattern": "^AlexaMediaPlayer/[\\dv]|^Echo/|^AlexaService/|^Alexa Mobile Voice/|^Amazon;Echo" + }, + { + "name": "AlienBlue", + "pattern": "^AlienBlue/" + }, + { + "name": "All You Can Books", + "pattern": "AllYouCanBooks" + }, + { + "name": "AllHitMusicRadio", + "pattern": "^AllHitMusicRadio/" + }, + { + "name": "Aloha", + "pattern": "^Aloha/" + }, + { + "name": "Amazon Fire", + "pattern": "^Amazon;AF" + }, + { + "name": "Amazon Music", + "pattern": "^AmazonMusic|^Harley/\\d" + }, + { + "name": "Ampache", + "pattern": "^Ampache/\\d" + }, + { + "name": "AMPApp", + "pattern": "^AMPApp/" + }, + { + "name": "Anchor", + "pattern": "^Anchor/" + }, + { + "name": "AnchorFM", + "pattern": "^AnchorFM/" + }, + { + "name": "Android Browser", + "pattern": "\\(Linux; Android \\d*; MHA-AL00 Build/HUAWEIMHA-AL00\\)" + }, + { + "name": "Anghami", + "pattern": "Anghami/|^Anghami Android|^%D8%A3%D9%86%D8%BA%D8%A7%D9%85%D9%8A/" + }, + { + "name": "AntennaPod", + "pattern": "(^AntennaPod/|^de\\.danoeh\\.antennapod/|antenna/.*CFNetwork)" + }, + { + "name": "Anybox", + "pattern": "^Anybox/" + }, + { + "name": "Anytime Podcast Player", + "pattern": "^Anytime/.*amugofjava" + }, + { + "name": "APK Downloader", + "pattern": "^APKXDL" + }, + { + "name": "Apollo", + "pattern": "^Apollo/|Apollo Podcasts \\(android\\)" + }, + { + "name": "Apple HomePod", + "pattern": "^AirPodcasts/\\d" + }, + { + "name": "Apple iMessage", + "pattern": "^MessagesViewService/|^Messages/|^Messages Share Extension/|^MessagesNotificationExtension/" + }, + { + "name": "Apple Mail", + "pattern": "^Mail/" + }, + { + "name": "Apple News", + "pattern": "AppleNews/" + }, + { + "name": "Apple Podcasts", + "pattern": "^Podcasts/.*|^Balados/|^Podcasti/|^Podcastit/|^Podcasturi/|^Podcasty/|^Podcast’ler/|^Podcast%E2%80%99ler/|^Podkaster/|^Podcaster/.*\\(.*\\)|^Podcastok/|^Подкасти/|^Подкасты/|^פודקאסטים/|^البودكاست/|^पॉडकास्ट/|^พ็อดคาสท์/|^播客/|^팟캐스트/|ポッドキャスト/|^%D8%A7%D9%84%D8%A8%D9%88%D8%AF%D9%83%D8%A7%D8%B3%D8%AA/|^%D0%9F%D0%BE%D0%B4%D0%BA%D0%B0%D1%81%D1%82%D1%8B/|^%D0%9F%D0%BE%D0%B4%D0%BA%D0%B0%D1%81%D1%82%D0%B8/|^Podcastok/|^%D7%A4%D7%95%D7%93%D7%A7%D7%90%D7%A1%D7%98%D7%99%D7%9D/|^%ED%8C%9F%EC%BA%90%EC%8A%A4%ED%8A%B8/|^%D8%A7%D9%95%D8%B3%D9%85%D8%B9%D9%84%D9%8A/|^Podcaster/\\d|^%E6%92%AD%E5%AE%A2/|^%E3%83%9D%E3%83%83%E3%83%89%E3%82%AD%E3%83%A3%E3%82%B9%E3%83%88/|^Podcast/|^%E0%B8%9E%E0%B9%87%E0%B8%AD%E0%B8%94%E0%B8%84%E0%B8%B2%E0%B8%AA%E0%B8%97%E0%B9%8C/\\d|%D0%9F%D0%BE%D0%B4%D0%BA%D0%B0%D1%81%D1%82%D1%82%D0%B0%D1%80/\\d|^%E0%A4%AA%E0%A5%89%E0%A4%A1%E0%A4%95%E0%A4%BE%E0%A4%B8%E0%A5%8D%E0%A4%9F/\\d" + }, + { + "name": "Apple Reminders", + "pattern": "^Recordatorios/" + }, + { + "name": "ARD Audiothek", + "pattern": "^ARD Audiothek|^ARD%20Audiothek/|^ARD-Audiothek" + }, + { + "name": "Arte Radio", + "pattern": "^arteradio/" + }, + { + "name": "Arvocast", + "pattern": "^Arvocast/" + }, + { + "name": "Askoyvaringen iOS app", + "pattern": "iOS Askoyvaringen Hermes/" + }, + { + "name": "Audacious", + "pattern": "^Audacious" + }, + { + "name": "Audacy", + "pattern": "^Radio\\.com/" + }, + { + "name": "Audials", + "pattern": "^com\\.audials(\\.paid)?/" + }, + { + "name": "Audible", + "pattern": "(^com\\.audible\\.playersdk\\.player|^Audible,|^Audible.*Darwin)" + }, + { + "name": "Audio", + "pattern": "^Audio/" + }, + { + "name": "Audio Now", + "pattern": "^Android_AudioNow" + }, + { + "name": "audiobookshelf", + "pattern": "^audiobookshelf" + }, + { + "name": "AudioWave", + "pattern": "(^AudioWave/1|^AudioWave iOS)" + }, + { + "name": "Aural", + "pattern": "^Aural/" + }, + { + "name": "Aurora", + "pattern": "^Aurora/" + }, + { + "name": "Autopod", + "pattern": "^Autopod/" + }, + { + "name": "avassetReader", + "pattern": "^avassetReader/" + }, + { + "name": "avopodo", + "pattern": "^avopodo/" + }, + { + "name": "AVPlay", + "pattern": "^AVPlay/" + }, + { + "name": "Awasu", + "pattern": "^Awasu/" + }, + { + "name": "Azul", + "pattern": "^Azul/" + }, + { + "name": "BaladoQuebec", + "pattern": "^BaladoQuebec/" + }, + { + "name": "Banter", + "pattern": "^Banter/|^banter-beta/" + }, + { + "name": "Barabbas Road Church", + "pattern": "^Barabbas Road Church/" + }, + { + "name": "BashPodder", + "pattern": "^BashPodder" + }, + { + "name": "BBC iPlayer", + "pattern": "^BBCiPlayer/" + }, + { + "name": "BBC iPlayer Radio", + "pattern": "BBCiPlayerRadio/" + }, + { + "name": "BBC Sounds", + "pattern": "BBC%20Sounds/" + }, + { + "name": "Bear", + "pattern": "^Bear/" + }, + { + "name": "Bergens Tidende Android app", + "pattern": "Android BT Hermes/" + }, + { + "name": "Bergens Tidende iOS app", + "pattern": "iOS BT Hermes/" + }, + { + "name": "BeyondPod", + "pattern": "; BeyondPod" + }, + { + "name": "bgwnr", + "pattern": "^bgwnr/" + }, + { + "name": "Bible", + "pattern": "^Bible/" + }, + { + "name": "Bitcast", + "pattern": "^Bitcast(\\.fm)?/|^bitcast 4 reel/|^bitcastbitcast/" + }, + { + "name": "Bitly", + "pattern": "^Bitly/" + }, + { + "name": "BizCoachPal", + "pattern": "^BizCoachPal/" + }, + { + "name": "BMR", + "pattern": "^BMR/" + }, + { + "name": "Bolt", + "pattern": "^Bolt/" + }, + { + "name": "Bookmobile", + "pattern": "^Bookmobile/" + }, + { + "name": "Bookself", + "pattern": "^Bookself/" + }, + { + "name": "Boom", + "pattern": "^Boom/" + }, + { + "name": "Boomplay", + "pattern": "^Boomplay/" + }, + { + "name": "Bose SoundTouch", + "pattern": "^Bose/" + }, + { + "name": "bPod", + "pattern": "^bPod$" + }, + { + "name": "Breaker", + "pattern": "^Breaker/" + }, + { + "name": "Breez", + "pattern": "^breez/" + }, + { + "name": "BrewApp", + "pattern": "^BrewApp/" + }, + { + "name": "Broadcast", + "pattern": "^Broadcast/" + }, + { + "name": "Broadway Podcast Network", + "pattern": "BroadwayPodcastNetwork/iOS" + }, + { + "name": "Browser", + "pattern": "^Browser/" + }, + { + "name": "Browser iOS", + "pattern": "^browser_ios/" + }, + { + "name": "BrowserPlus", + "pattern": "^BrowserPlus/" + }, + { + "name": "Bullhorn", + "pattern": "^Bullhorn(/.*)?$|^Bullhorn \\(" + }, + { + "name": "Bygdanytt iOS app", + "pattern": "iOS Bygdanytt Hermes/" + }, + { + "name": "Canvas", + "pattern": "^Canvas/" + }, + { + "name": "Capital", + "pattern": "^Capital/" + }, + { + "name": "capsule.fm", + "pattern": "^capsule\\.fm/|^capsule-android" + }, + { + "name": "Cast", + "pattern": "^Cast/" + }, + { + "name": "Castamatic", + "pattern": "^Castamatic/" + }, + { + "name": "Castaway", + "pattern": "^Castaway/" + }, + { + "name": "CastBox", + "pattern": "^Cast[Bb]ox|^fm\\.castbox\\." + }, + { + "name": "Casterbate", + "pattern": "^Casterbate/" + }, + { + "name": "castero", + "pattern": "^castero \\d" + }, + { + "name": "castget", + "pattern": "^castget " + }, + { + "name": "Castro", + "pattern": "^Castro[/ ]" + }, + { + "name": "Casts", + "pattern": "^Casts/" + }, + { + "name": "CCGF", + "pattern": "^CCGF/" + }, + { + "name": "CEBrowser", + "pattern": "^CEBrowser/" + }, + { + "name": "CFC", + "pattern": "^CFC/" + }, + { + "name": "CHCLeaders", + "pattern": "^CHCLeaders/" + }, + { + "name": "Childress", + "pattern": "^Childress/" + }, + { + "name": "chorus", + "pattern": "^chorus/" + }, + { + "name": "Christian Life Austin", + "pattern": "^Christian Life Austin/" + }, + { + "name": "Chromecast device", + "pattern": "CrKey/|\\(CrKey |^Google;Chromecast" + }, + { + "name": "ChurchLink", + "pattern": "^ChurchLink/" + }, + { + "name": "Clammr", + "pattern": "^Clammr/" + }, + { + "name": "Client", + "pattern": "^Client/" + }, + { + "name": "Clementine Music Player", + "pattern": "^Clementine " + }, + { + "name": "Club", + "pattern": "^Club/" + }, + { + "name": "Commotion", + "pattern": "^Commotion/" + }, + { + "name": "Cooler", + "pattern": "^CoolerFM/" + }, + { + "name": "Copied", + "pattern": "^Copied/" + }, + { + "name": "CoreDataPlayerSample", + "pattern": "^CoreDataPlayerSample/" + }, + { + "name": "Cosmicast", + "pattern": "^Cosmicast/" + }, + { + "name": "CPod", + "pattern": "CPod/" + }, + { + "name": "Crosspoint City Church", + "pattern": "^Crosspoint City Church/" + }, + { + "name": "Crosspointe", + "pattern": "^Crosspointe/" + }, + { + "name": "CrossPreach", + "pattern": "^CrossPreach/" + }, + { + "name": "Damus", + "pattern": "^damus|%D8%AF%D8%A7%D9%85%D9%8F%D8%B3|%E8%BE%BE%E6%91%A9/" + }, + { + "name": "DataDogApp", + "pattern": "^DataDogApp/" + }, + { + "name": "DaumWebtoon", + "pattern": "^DaumWebtoon/" + }, + { + "name": "De Standaard", + "pattern": "be\\.standaard\\.audio|^DS%20Podcast/" + }, + { + "name": "Deezer", + "pattern": "(^Deezer/|^DeezerJukebox/|^Deezer.*Electron)" + }, + { + "name": "Delve", + "pattern": "^Delve/" + }, + { + "name": "DevCasts", + "pattern": "^devcasts/.*CFNetwork" + }, + { + "name": "Dlf Audiothek", + "pattern": "^DlfAudiothek/|^Dlf Audiothek" + }, + { + "name": "DManager", + "pattern": "^DManager/" + }, + { + "name": "Documents", + "pattern": "^Documents/" + }, + { + "name": "DoggCatcher", + "pattern": "DoggCatcher" + }, + { + "name": "DolphiniPad", + "pattern": "^Dolphini(Pad|Phone)/" + }, + { + "name": "doubleTwist CloudPlayer", + "pattern": "^doubleTwist CloudPlayer" + }, + { + "name": "Doughnut", + "pattern": "^Doughnut/" + }, + { + "name": "Downcast", + "pattern": "Downcast/" + }, + { + "name": "Downie", + "pattern": "^Downie/" + }, + { + "name": "DownloadAll", + "pattern": "^DownloadAll/" + }, + { + "name": "Downloader", + "pattern": "^Downloader/" + }, + { + "name": "DownloaderLite", + "pattern": "^DownloaderLite/" + }, + { + "name": "DownloaderSound", + "pattern": "^DownloaderSound/" + }, + { + "name": "Download Shuttle", + "pattern": "^Download Shuttle/" + }, + { + "name": "DownloadPro", + "pattern": "^DownloadPro/" + }, + { + "name": "Downloads", + "pattern": "^Downloads/" + }, + { + "name": "DownMan", + "pattern": "^DownMan/" + }, + { + "name": "DowntonAppy", + "pattern": "^DowntonAppy/" + }, + { + "name": "DriveCast", + "pattern": "^DriveCast/" + }, + { + "name": "DRN1", + "pattern": "^DRN1;" + }, + { + "name": "DroolRadio", + "pattern": "^DroolRadio/" + }, + { + "name": "Dynamo", + "pattern": "^Dynamo/" + }, + { + "name": "E24 Android app", + "pattern": "Android E24 Hermes/" + }, + { + "name": "E24 iOS app", + "pattern": "iOS E24 Hermes/" + }, + { + "name": "Earbud", + "pattern": "^Earbud/" + }, + { + "name": "Earmark", + "pattern": "^Earmark/" + }, + { + "name": "EasyGet", + "pattern": "^EasyGet/" + }, + { + "name": "Economist Espresso", + "pattern": "^TheEconomist-Darwin-" + }, + { + "name": "Elevation Health", + "pattern": "^Elevation_Health/" + }, + { + "name": "EMAudioPlayer", + "pattern": "^EMAudioPlayer " + }, + { + "name": "Emacs", + "pattern": "^URL/Emacs " + }, + { + "name": "Encounter", + "pattern": "^Encounter/" + }, + { + "name": "EpisodeFever", + "pattern": "^EpisodeFever/" + }, + { + "name": "EQu", + "pattern": "^EQu/" + }, + { + "name": "EvanApp", + "pattern": "^EvanApp/" + }, + { + "name": "Expo", + "pattern": "^Expo/" + }, + { + "name": "ExtDownloader", + "pattern": "^ExtDownloader/" + }, + { + "name": "ExtraCloud", + "pattern": "^ExtraCloud/" + }, + { + "name": "Facebook", + "pattern": "(iPhone|iPad).* \\[FBAN|iOS/Facebook|^FB4A/Facebook|^facebook-mobile/|^Facebook/|^\\[FBAN/" + }, + { + "name": "faidr", + "pattern": "^CFR%20Plus/" + }, + { + "name": "FaithPlay", + "pattern": "^FaithPlay FaithPlay/" + }, + { + "name": "Fallound", + "pattern": "^Fallound/" + }, + { + "name": "FancyMusic", + "pattern": "^FancyMusic/" + }, + { + "name": "Fathom", + "pattern": "^Fathom/" + }, + { + "name": "Feeder", + "pattern": "^Feeder/" + }, + { + "name": "Feedly", + "pattern": "^feedly/" + }, + { + "name": "FeedStation", + "pattern": "^FeedStation/\\d" + }, + { + "name": "Fellowship Bible Church Topeka", + "pattern": "^Fellowship Bible Church Topeka/" + }, + { + "name": "Filebox", + "pattern": "^Filebox/" + }, + { + "name": "FileBrowser", + "pattern": "^FileBrowser/" + }, + { + "name": "Filer", + "pattern": "^Filer/" + }, + { + "name": "Files", + "pattern": "^Files/" + }, + { + "name": "FilesPro", + "pattern": "^FilesPro/" + }, + { + "name": "Fili", + "pattern": "^Fili/" + }, + { + "name": "Flash", + "pattern": "(^MAC |^WIN )" + }, + { + "name": "folkebladet.no", + "pattern": "^folkebladet\\.no/" + }, + { + "name": "FocusPodcast", + "pattern": "^FocusPodcast_" + }, + { + "name": "foobar2000", + "pattern": "^foobar2000/" + }, + { + "name": "Fountain", + "pattern": "^Fountain|^fountainapp/\\d" + }, + { + "name": "Free Download Manager", + "pattern": "^FDM/|^FDM \\d" + }, + { + "name": "FreeMP3MusicDownload", + "pattern": "^FreeMP3MusicDownload/" + }, + { + "name": "freemusic", + "pattern": "^freemusic/" + }, + { + "name": "FreeMusicDownloadPro", + "pattern": "^FreeMusicDownloadPro/" + }, + { + "name": "FreeMusicPlusFree", + "pattern": "^FreeMusicPlusFree/" + }, + { + "name": "Fréquence Plus", + "pattern": "^FrequencePlus/" + }, + { + "name": "Gaana", + "pattern": "^GaanaAndroid-|^Gaana-iOS|^Gaana/" + }, + { + "name": "Garmin fenix", + "pattern": "^Garmin fenix " + }, + { + "name": "Garmin Forerunner", + "pattern": "^Garmin Forerunner" + }, + { + "name": "Garmin tactix", + "pattern": "^Garmin tactix" + }, + { + "name": "Garmin Venu", + "pattern": "^Garmin Venu " + }, + { + "name": "Garmin Vivoactive", + "pattern": "^Garmin v" + }, + { + "name": "GBEngine", + "pattern": "^GBEngine/" + }, + { + "name": "GMB Show", + "pattern": "^GMB Show/" + }, + { + "name": "Godster", + "pattern": "^Godster/" + }, + { + "name": "GoldenPod", + "pattern": "^GoldenPod/" + }, + { + "name": "GoLoud", + "pattern": "^GoLoud/" + }, + { + "name": "Goodpods", + "pattern": "Goodpods\\.|^[Gg]oodpods/" + }, + { + "name": "GoodReader", + "pattern": "^GoodReader(4|IPad)?/" + }, + { + "name": "Google Assistant", + "pattern": "^Google-Speech-Actions" + }, + { + "name": "Google Nest Hub", + "pattern": "(Fuchsia).* CrKey/" + }, + { + "name": "Google Podcasts", + "pattern": "(GoogleChirp|^GooglePodcasts/|^Podcasts$|GSA/)" + }, + { + "name": "gPodder", + "pattern": "^gPodder/|^gpodder\\.net|gpodder" + }, + { + "name": "Grace Community Church - Texas", + "pattern": "^Grace%20Community%20Church%20-%20Texas/" + }, + { + "name": "Grace Evangelical Covenant Church", + "pattern": "^Grace%20Evangelical%20Covenant%20Church/" + }, + { + "name": "Gretale", + "pattern": "^Gretale/" + }, + { + "name": "GroupMe", + "pattern": "^GroupMe/" + }, + { + "name": "Guardian", + "pattern": "^Guardian-iOSLive/|GuardianAndroidApp/|^Guardian Podcast" + }, + { + "name": "Guacamole", + "pattern": "^Guacamole/" + }, + { + "name": "GrabRadioWorld", + "pattern": "^GrabRadioWorld/" + }, + { + "name": "HalfTunes", + "pattern": "^HalfTunes/" + }, + { + "name": "Hammel", + "pattern": "^Hammel/" + }, + { + "name": "HardCast", + "pattern": "^HardCast/" + }, + { + "name": "Hark Audio", + "pattern": "^Hark/" + }, + { + "name": "Headliner", + "pattern": "^Headliner/.*\\(Headliner-.*\\+https://www\\.headliner\\.app\\)$" + }, + { + "name": "HermesPod", + "pattern": "hermespod\\.com/" + }, + { + "name": "HiCast", + "pattern": "^HiCast/" + }, + { + "name": "Highly", + "pattern": "^Highly/" + }, + { + "name": "Himalaya", + "pattern": "^Himalaya(_test)?/" + }, + { + "name": "HopeChurchCleburne", + "pattern": "^HopeChurchCleburne/" + }, + { + "name": "Horse Radio Network", + "pattern": "^HRN/" + }, + { + "name": "Hubbard Radio", + "pattern": "HubbardApp/" + }, + { + "name": "Hubhopper", + "pattern": "^Hubhopper$" + }, + { + "name": "Hyper", + "pattern": "^Hyper/" + }, + { + "name": "HyperCatcher", + "pattern": "^HyperCatcher" + }, + { + "name": "iBuilder", + "pattern": "^iBuilder/" + }, + { + "name": "iCatcher", + "pattern": "^i[Cc]atcher|\\(iCatcher" + }, + { + "name": "iDL", + "pattern": "^iDL/" + }, + { + "name": "iDownloader", + "pattern": "IDownloaderApps4StarsFree/|^IDownloaderFree_Apps4Stars/|^iDownloader" + }, + { + "name": "iDownloadsAppPlus", + "pattern": "^iDownloadsAppPlus/" + }, + { + "name": "iFeedTouch", + "pattern": "^iFeedTouch/" + }, + { + "name": "Iframely", + "pattern": "Iframely/" + }, + { + "name": "IFTTT", + "pattern": "^IFTTT/" + }, + { + "name": "iHeartRadio", + "pattern": "^iHeartRadio/|^iHeartPodcasts/" + }, + { + "name": "iHorror", + "pattern": "^iHorror/" + }, + { + "name": "InCast", + "pattern": "^InCast/" + }, + { + "name": "Instacast", + "pattern": "^Instacast Instacast/|^Instacast/" + }, + { + "name": "Instagram", + "pattern": "^Instagram/|Mobile/.* Instagram" + }, + { + "name": "iOnGreenville", + "pattern": "^iOnGreenville/" + }, + { + "name": "IOSAudiobooks", + "pattern": "^IOSAudiobooks/" + }, + { + "name": "IPF", + "pattern": "^IPF/" + }, + { + "name": "iPlay", + "pattern": "^iPlay/" + }, + { + "name": "isitgood", + "pattern": "^isitgood/" + }, + { + "name": "iTunes", + "pattern": "^iTunesU?[/-]" + }, + { + "name": "iVoox", + "pattern": "^[iI][Vv]oox" + }, + { + "name": "iWeb", + "pattern": "^iWeb/" + }, + { + "name": "Jabbercast", + "pattern": "^Jabbercast/" + }, + { + "name": "Jam", + "pattern": "^Jam/\\d.*listentojam" + }, + { + "name": "Jamit", + "pattern": "^Jamit$" + }, + { + "name": "JamxFeeds", + "pattern": "^JamxFeeds/" + }, + { + "name": "Jimcast", + "pattern": "^Jimcast/" + }, + { + "name": "JioSaavn", + "pattern": "(^com\\.jio\\.media\\.jiobeats|^com\\.saavn\\.android|^[sS]aavn)" + }, + { + "name": "JRiver Media Center", + "pattern": "J\\. River Internet Reader" + }, + { + "name": "Juice", + "pattern": "^Juice/" + }, + { + "name": "Kajabi", + "pattern": " Kajabi|KajabiPodcast" + }, + { + "name": "KakaoTalk", + "pattern": "^KakaoTalk/" + }, + { + "name": "KaoticRadio.com", + "pattern": "^KaoticRadio\\.com/" + }, + { + "name": "Kasts", + "pattern": "^Kasts/|^kasts " + }, + { + "name": "Kids Listen", + "pattern": "^Kids(%20| )Listen/" + }, + { + "name": "KidsPod", + "pattern": "^KidspodMobileClient/" + }, + { + "name": "KKBOX", + "pattern": "^KKBOX/" + }, + { + "name": "Kloudie", + "pattern": "^Kloudie/" + }, + { + "name": "Knomad", + "pattern": "^Knomad/" + }, + { + "name": "Kodi", + "pattern": "^Kodi/" + }, + { + "name": "KREAFUNK", + "pattern": "^KREAFUNK/" + }, + { + "name": "labs", + "pattern": "^labs/" + }, + { + "name": "Laughable", + "pattern": "^Laughable.+iOS|^Laughable/" + }, + { + "name": "Leaf", + "pattern": "^Leaf/" + }, + { + "name": "Les Indés Radios", + "pattern": "(^lesindesradios$|^lesindesradios/)" + }, + { + "name": "LG Player", + "pattern": "LG Player" + }, + { + "name": "LifeEssentials", + "pattern": "^Life(%20)?Essentials(App)?/" + }, + { + "name": "lifegateburleson", + "pattern": "^lifegateburleson/" + }, + { + "name": "Life Radio", + "pattern": "^life-radio-konsole-app-android" + }, + { + "name": "LinkedIn", + "pattern": "AppleWebKit.+\\[LinkedInApp\\]|^LinkedIn/" + }, + { + "name": "Lisny", + "pattern": "Lisny" + }, + { + "name": "Listen", + "pattern": "^Listen(( |%20)App)?/" + }, + { + "name": "Liulo", + "pattern": "^Liulo/" + }, + { + "name": "Listen5", + "pattern": "Listen5" + }, + { + "name": "Livio Radio", + "pattern": "^Livio Radio/" + }, + { + "name": "Luminary", + "pattern": "^Luminary(Preprod)?/|^luminary\\.next/" + }, + { + "name": "MacJournal", + "pattern": "^MacJournal/" + }, + { + "name": "Majelan", + "pattern": "^MajelanApp" + }, + { + "name": "Mame Cast", + "pattern": "^Mame%20Cast/" + }, + { + "name": "MaxTubePro", + "pattern": "^MaxTubePro/" + }, + { + "name": "Meadowbrook Church", + "pattern": "^Meadowbrook Church/" + }, + { + "name": "MediaMonkey", + "pattern": "^MediaMonkey" + }, + { + "name": "Mediatap", + "pattern": "^Mediatap/" + }, + { + "name": "Megaphone", + "pattern": "^Megaphone\\.fm" + }, + { + "name": "Menucast", + "pattern": "^Menucast/" + }, + { + "name": "Message+", + "pattern": "^Message\\+/" + }, + { + "name": "Messenger", + "pattern": "^Messenger/" + }, + { + "name": "Metacast", + "pattern": "^Metacast/" + }, + { + "name": "Microsoft Outlook", + "pattern": "^Outlook-Android/|^Microsoft Office/.*?Microsoft Outlook" + }, + { + "name": "Microsoft Xbox", + "pattern": "^microsoft;xbox_" + }, + { + "name": "Mimir", + "pattern": "^Mimir(-macOS|-iOS)?/" + }, + { + "name": "Miro", + "pattern": "^Miro/.+Windows" + }, + { + "name": "Mixcloud", + "pattern": "^Mixcloud/" + }, + { + "name": "MixerBox", + "pattern": "^MixerBox(%20Pro)?/" + }, + { + "name": "MobileApp", + "pattern": "^MobileApp/" + }, + { + "name": "MobileSMS", + "pattern": "^MobileSMS/" + }, + { + "name": "MoonFM", + "pattern": "^Moon ?FM/" + }, + { + "name": "mowPod", + "pattern": "^mowPod/" + }, + { + "name": "MPlayer", + "pattern": "^MPlayer \\d" + }, + { + "name": "mpv", + "pattern": "^mpv 0\\.|^libmpv$" + }, + { + "name": "MusicBee", + "pattern": "^MusicBee" + }, + { + "name": "Music Download App", + "pattern": "^Music%20Download/" + }, + { + "name": "MyTuner", + "pattern": "^myTuner Radio app/|^myTuner%20Radio%20app/|^mytuner_podcasts_androidplayer/|^MyTuner-|^myTuner$|^myTuneriOS%20Free/" + }, + { + "name": "NetNewsWire", + "pattern": "^NetNewsWire" + }, + { + "name": "Newsboat", + "pattern": "^Newsboat/" + }, + { + "name": "Newsly", + "pattern": "^Newsly" + }, + { + "name": "Noice", + "pattern": "^Noice/" + }, + { + "name": "Nos", + "pattern": "^Nos|Nos%20Staging|Nos%20Dev/" + }, + { + "name": "NPR", + "pattern": "^NPR/|^NPR%20One/|^NPROneAndroid|nprone_android/" + }, + { + "name": "NRC Audio", + "pattern": "^NRC( |%20)Audio/" + }, + { + "name": "NRC", + "pattern": "nl\\.nrc\\.nrcapp|^NRC-Nieuws/|com\\.twipemobile\\.nrc" + }, + { + "name": "Outcast", + "pattern": "^Outcast[/ ]" + }, + { + "name": "Overcast", + "pattern": "^Overcast/|^Overcast.*Apple Watch" + }, + { + "name": "Overhaul", + "pattern": "^Podcast Overhaul/" + }, + { + "name": "Palco MP3", + "pattern": "^Palco MP3" + }, + { + "name": "Pandora", + "pattern": "(^Pandora/| Pandora/)" + }, + { + "name": "Parler", + "pattern": "^Parler( Staging)?/" + }, + { + "name": "PeaCast", + "pattern": "^PeaCast/" + }, + { + "name": "Playapod", + "pattern": "^Playapod" + }, + { + "name": "PlaydioCast Podcast Radio", + "pattern": "^PlaydioCast/" + }, + { + "name": "Player FM", + "pattern": "^Player FM|^Player%20FM|^Alpha%20PlayerFM/" + }, + { + "name": "Pocket Casts", + "pattern": "^Pocket Casts|^PocketCasts/|^Shifty Jelly Pocket Casts" + }, + { + "name": "Podbay", + "pattern": "^Podbay/" + }, + { + "name": "Podbean", + "pattern": "^Podbean/" + }, + { + "name": "Podcast Guru", + "pattern": "^PodcastGuru" + }, + { + "name": "Podcast Addict", + "pattern": "^Podcast.*Addict/|^Podcast Addict " + }, + { + "name": "Podcast Archiver", + "pattern": "janwh/podcast-archiver" + }, + { + "name": "Podcast Player", + "pattern": "^Podcast Player/" + }, + { + "name": "Podcast Republic", + "pattern": "^PodcastRepublic/" + }, + { + "name": "Podcastly", + "pattern": "^Podcastly/|^Podcastly$" + }, + { + "name": "Podchaser", + "pattern": "^Podchaser |^Podchaser-Parser" + }, + { + "name": "Podcini", + "pattern": "^Podcini/\\d" + }, + { + "name": "Podclipper", + "pattern": "^Podclipper/" + }, + { + "name": "Podcoin", + "pattern": "^Podcoin" + }, + { + "name": "PodCruncher", + "pattern": "^PodCruncher/.* CFNetwork/" + }, + { + "name": "poddl - podcast downloader", + "pattern": "poddl - podcast downloader" + }, + { + "name": "Podeo", + "pattern": "^Podeo/" + }, + { + "name": "Podfriend", + "pattern": "^Podfriend" + }, + { + "name": "Podgrab", + "pattern": "^Podgrab " + }, + { + "name": "Podhero", + "pattern": "^Podhero|^Swoot[/ ]" + }, + { + "name": "Podhome", + "pattern": "^Podhome App" + }, + { + "name": "Podimo", + "pattern": "^Podimo/" + }, + { + "name": "Podium Podcast", + "pattern": "^Podium/\\d" + }, + { + "name": "PodKast app", + "pattern": ".*PodKast$" + }, + { + "name": "Podkicker Pro", + "pattern": "^Podkicker" + }, + { + "name": "PodLink", + "pattern": "PodLink" + }, + { + "name": "PodLP podcast app for KaiOS", + "pattern": ".*PodLP/" + }, + { + "name": "PodMe", + "pattern": "^Podme android app/|^PodMe/" + }, + { + "name": "PodMN", + "pattern": "^PodMN/" + }, + { + "name": "PodNL", + "pattern": "^PodNL/" + }, + { + "name": "Podnods", + "pattern": "podnods-player" + }, + { + "name": "Podopolo", + "pattern": "^Podopolo|^podopolo/" + }, + { + "name": "Podplay", + "pattern": "^Podplay/" + }, + { + "name": "PodPuppy", + "pattern": "felixwatts/PodPuppy" + }, + { + "name": "PodQast", + "pattern": "^PodQast/" + }, + { + "name": "Pods", + "pattern": "^Pods/" + }, + { + "name": "Podurama", + "pattern": "^Podurama" + }, + { + "name": "PodTrapper", + "pattern": "^PodTrapper" + }, + { + "name": "Podvine", + "pattern": "^Podvine/\\d" + }, + { + "name": "Podverse", + "pattern": "^[Pp]odverse/" + }, + { + "name": "Podyssey", + "pattern": "Podyssey App|com\\.toysinboxes\\.Echo|fm\\.podyssey\\.podcasts|^Podyssey" + }, + { + "name": "ProCast", + "pattern": "Pro[Cc]ast" + }, + { + "name": "PugPig Bolt", + "pattern": "^PugpigBolt " + }, + { + "name": "Pypodder", + "pattern": "^pypodder$" + }, + { + "name": "Radio Downloader", + "pattern": "^Podcast Provider.*?Radio Downloader" + }, + { + "name": "Radio thmanyah", + "pattern": "^Radio thmanyah " + }, + { + "name": "radio.de", + "pattern": "^(radio\\.[a-z]{2,3}|GetPodcast)[ /]\\d" + }, + { + "name": "Radioline", + "pattern": "^Radioline%202/|^Radioline$" + }, + { + "name": "RadioPlayer", + "pattern": "(^Radioplayer Android app|^Radioplayer iOS app)|^Radioplayer(%20UK)?/" + }, + { + "name": "RadioPublic", + "pattern": "^RadioPublic/android-|^RadioPublic Android|RadioPublic iOS|RadioPublic.+CFNetwork|^RadioPublic/iOS|^RadioPublicDraper/" + }, + { + "name": "Reeder", + "pattern": "^Reeder/" + }, + { + "name": "Repod", + "pattern": "(^Repod/.+iOS|^Repod/.+Android)" + }, + { + "name": "Roka Stereo", + "pattern": "^Roka Stereo/" + }, + { + "name": "Roku", + "pattern": "^Roku/" + }, + { + "name": "Rhythmbox", + "pattern": "(^gvfs/|^rhythmbox/)" + }, + { + "name": "RSS Radio", + "pattern": "^RSSRadio" + }, + { + "name": "RSSDemon", + "pattern": "com\\.meecel\\.feedreader\\.RssDemonAd" + }, + { + "name": "RSSOwl", + "pattern": "^RSSOwl.*Windows" + }, + { + "name": "RTL+", + "pattern": "RTL\\+" + }, + { + "name": "SachNoi", + "pattern": "^SachNoi\\.app/|^SachNoiApp/" + }, + { + "name": "Samsung Podcasts", + "pattern": "^sp-agent" + }, + { + "name": "ServeStream", + "pattern": "^ServeStream Dynamo/|^ServeStream$" + }, + { + "name": "Shadow", + "pattern": "^Shadow" + }, + { + "name": "SiriusXM", + "pattern": "^SiriusXM|SXMApp|sxm-android|sxm-apple/" + }, + { + "name": "Slack", + "pattern": "^Slack/" + }, + { + "name": "Snipd", + "pattern": "^Snipd/" + }, + { + "name": "Snapchat", + "pattern": "s~snapchat-proxy" + }, + { + "name": "Sodes", + "pattern": "^Sodes/" + }, + { + "name": "Sonnet", + "pattern": "(Sonnet|^Simple Podcast Player)" + }, + { + "name": "Sony PlayStation 5", + "pattern": "^sony_tv;ps5;" + }, + { + "name": "Sonos", + "pattern": "Sonos" + }, + { + "name": "SoundOn", + "pattern": "^SoundOn/" + }, + { + "name": "SoundWaves", + "pattern": "^SoundWaves-\\d" + }, + { + "name": "Sportbladet Android app", + "pattern": "Android Sportbladet Hermes/" + }, + { + "name": "Sportbladet iOS app", + "pattern": "iOS Sportbladet Hermes/" + }, + { + "name": "Spotify", + "pattern": "^Spotify/.+Linux|Macintosh.+Spotify/|^Spotify/.+OSX|Windows.+Spotify/|^Spotify/.+Win32|^Spotify/.+Android|^Spotify/.+iOS|^Spotify/.+Polestar|^Spotify/.+Volvo|^spotify_|^Spotify-Lite|^Spotify/\\d" + }, + { + "name": "Spreaker", + "pattern": "(^Spreaker for Android|Spreaker/)" + }, + { + "name": "Sprewell", + "pattern": "^Sprewell/" + }, + { + "name": "Stavanger Aftenblad Android app", + "pattern": "Android SA Hermes/" + }, + { + "name": "Stavanger Aftenblad iOS app", + "pattern": "iOS SA Hermes/" + }, + { + "name": "Stitcher", + "pattern": "^Stitcher/|^Stitcher Demo/|^AlexaMediaPlayer/Stitcher" + }, + { + "name": "Stoler Report", + "pattern": "^Stoler(%20| )Report/" + }, + { + "name": "Storiyoh", + "pattern": "^Storiyoh/" + }, + { + "name": "Storybutton", + "pattern": "^Storybutton/" + }, + { + "name": "StoryShots", + "pattern": "^StoryShots/" + }, + { + "name": "Strilen iOS app", + "pattern": "iOS Strilen Hermes/" + }, + { + "name": "Subcast", + "pattern": "^Subcast" + }, + { + "name": "Substack", + "pattern": "^Substack/" + }, + { + "name": "Svenska Dagbladet iOS app", + "pattern": "iOS SvD Hermes/" + }, + { + "name": "Svenska Dagbladet Android app", + "pattern": "SvD Hermes/" + }, + { + "name": "Swinsian", + "pattern": "^Swinsian/" + }, + { + "name": "Sybel", + "pattern": "^Sybel$" + }, + { + "name": "SYOK", + "pattern": "^SYOK|^my\\.com\\.astro\\.player" + }, + { + "name": "TED", + "pattern": "^TED |^TED/" + }, + { + "name": "The God Minute", + "pattern": "^The God Minute/" + }, + { + "name": "The Economist", + "pattern": "(^lamarr-iOS|^TheEconomist-Lamarr-ios|^TheEconomist-Lamarr-iOS|^lamarr-android|^TheEconomist-Lamarr-android)" + }, + { + "name": "The Podcast App", + "pattern": "^ThePodcastApp|iOS.*The Podcast App/|com\\.evolve\\.podcast/|^podcast/\\d* |^PodcastApp/\\d" + }, + { + "name": "Twipe Mobile App", + "pattern": "^TwipeMobileApp" + }, + { + "name": "Mozilla Thunderbird", + "pattern": " Thunderbird/" + }, + { + "name": "TikTok", + "pattern": "musical_ly" + }, + { + "name": "Treble", + "pattern": "^TREBLE/" + }, + { + "name": "Tumult", + "pattern": "^Tumult" + }, + { + "name": "TuneIn", + "pattern": "^TuneIn| TuneIn/" + }, + { + "name": "Turtlecast", + "pattern": "^(Turtlecast|TURTLECAST)/" + }, + { + "name": "Twitter", + "pattern": "^Twitter(Android)?/| Twitter for i" + }, + { + "name": "Tweetbot", + "pattern": "^Tweetbot/" + }, + { + "name": "Ubook Player", + "pattern": "^Ubook Player" + }, + { + "name": "uTorrent", + "pattern": "^uTorrent|BTWebClient" + }, + { + "name": "Vestnytt iOS app", + "pattern": "iOS Vestnytt Hermes/" + }, + { + "name": "VG Android app", + "pattern": "Android VG Hermes/" + }, + { + "name": "VG iOS app", + "pattern": "iOS VG Hermes/" + }, + { + "name": "VictorReader", + "pattern": "^VictorReader Stream|^VictorReader_" + }, + { + "name": "VLC media player", + "pattern": "^VLC/\\d" + }, + { + "name": "Vodacast", + "pattern": "^Vodacast" + }, + { + "name": "Voiz FM", + "pattern": "^Voiz FM/" + }, + { + "name": "Wavlake", + "pattern": "^Wavlake/" + }, + { + "name": "Winamp", + "pattern": "^Winamp" + }, + { + "name": "WeCast", + "pattern": "^WeCast/" + }, + { + "name": "WhatsApp", + "pattern": "^WhatsApp/" + }, + { + "name": "Windows Media Player", + "pattern": "^NSPlayer|WMPlayer/|^Windows-Media-Player/" + }, + { + "name": "WynkMusic", + "pattern": "^WynkMusic/" + }, + { + "name": "Xiao Yu Zhou", + "pattern": "^Xiaoyuzhou/" + }, + { + "name": "XING", + "pattern": "iPhone.*XING" + }, + { + "name": "Yandex Music", + "pattern": "^Ya(ndex)?\\.Music/" + }, + { + "name": "Yapa", + "pattern": "^yapa/" + }, + { + "name": "YouTube Music", + "pattern": "^com\\.google\\.android\\.apps\\.youtube\\.music/|^YouTubeMusic/\\d" + }, + { + "name": "YouTube Music (ReVanced)", + "pattern": "^app\\.revanced\\.android\\.apps\\.youtube\\.music/" + }, + { + "name": "Zeno", + "pattern": "^Zeno$" + }, + { + "name": "Zune", + "pattern": "Zune/" + }, + { + "name": "小宇宙", + "pattern": "^Podcast/1\\." + }, + { + "name": "KAIOS podcast app", + "pattern": ".*KAIOS/" + }, + { + "name": "talkSPORT app", + "pattern": "^talkS(PORT|port)/" + }, + { + "name": "Times Radio app", + "pattern": "^Times(%20|\\s)Radio" + }, + { + "name": "Virgin Radio app", + "pattern": "^Virgin(%20|\\s)Radio" + }, + { + "name": "Global Player", + "pattern": "^Global Player/|^Radio X/|^Capital (XTRA|FM)/|^Smooth/|^LBC/|^Heart/|^Classic FM/|^Gold/" + }, + { + "name": "TalkRadio", + "pattern": "^Talk%20Radio/" + } + ] +} \ No newline at end of file diff --git a/data/bots.runtime.json b/data/bots.runtime.json new file mode 100644 index 000000000..d1410f820 --- /dev/null +++ b/data/bots.runtime.json @@ -0,0 +1,672 @@ +{ + "entries": [ + { + "name": "AAABot - unknown bot", + "pattern": "AAABot" + }, + { + "name": "Adswizz", + "pattern": "^AIS VirtualListener" + }, + { + "name": "ma Podcast (agma) Bot", + "pattern": "^agma/" + }, + { + "name": "AhrefsBot", + "pattern": "AhrefsBot/" + }, + { + "name": "AirableBot", + "pattern": "AirableBot-Podcast/" + }, + { + "name": "Alexa Flash Briefing cache", + "pattern": "^AmazonNewsContentService" + }, + { + "name": "AlignaBot", + "pattern": "^Alignabot" + }, + { + "name": "All Ears", + "pattern": "^AllEars/" + }, + { + "name": "Amazon Music Podcasts Bot", + "pattern": "^Amazon Music Podcast" + }, + { + "name": "Anchor Importer", + "pattern": "AnchorImport" + }, + { + "name": "Apple Notes share extension", + "pattern": "^com.apple.(mobilenotes.SharingExtension|Notes.SharingExtension)/" + }, + { + "name": "Apple Podcasts (Watch)", + "pattern": "^atc/|\\(null\\) watchOS/" + }, + { + "name": "Apple Podcasts automated checks", + "pattern": "(iTMS|itunesstored|itms)" + }, + { + "name": "Applebot", + "pattern": "^Applebot/" + }, + { + "name": "Archive.org", + "pattern": "archive\\.org_bot" + }, + { + "name": "atheerfm", + "pattern": "^atheerfm/" + }, + { + "name": "Audiomack", + "pattern": "^Audiomack Podcast Processor/" + }, + { + "name": "AudioWave feed parser", + "pattern": "^AudioWaveBot/1\\.0" + }, + { + "name": "AwarioSmartBot", + "pattern": "^AwarioSmartBot/" + }, + { + "name": "Babbar", + "pattern": "Barkrowler/" + }, + { + "name": "Baidu", + "pattern": "\\(ce\\.baidu\\.com" + }, + { + "name": "bbot", + "pattern": "^bbot/" + }, + { + "name": "Beacon Podcast Sync", + "pattern": "^Beacon/\\d" + }, + { + "name": "British Library", + "pattern": "^bl\\.uk_ldfc_bot" + }, + { + "name": "Blubrry Migration Service", + "pattern": "^Blubrry Migration Service" + }, + { + "name": "Bullhorn Crawler", + "pattern": "^BullhornCrawler/" + }, + { + "name": "Buzzsprout Importer", + "pattern": "^Buzzsprout Importer" + }, + { + "name": "Bytespider.*bytedance", + "pattern": "Bytespider" + }, + { + "name": "CastFeedValidator", + "pattern": "^CastFeedValidator/" + }, + { + "name": "Castopod", + "pattern": "Castopod/\\d" + }, + { + "name": "Chartable", + "pattern": "^Trackable/" + }, + { + "name": "Clark-Crawler, unknown", + "pattern": "^clark-crawler2" + }, + { + "name": "Claudebot", + "pattern": "ClaudeBot/" + }, + { + "name": "Critical Mention", + "pattern": "^Podcast-CriticalMention/" + }, + { + "name": "curl", + "pattern": "^curl|^libcurl/|^PycURL/| curl/" + }, + { + "name": "DataforSEO", + "pattern": "DataForSeoBot/" + }, + { + "name": "Datagnion Bot", + "pattern": "^datagnionbot" + }, + { + "name": "dataprovider.com", + "pattern": "Dataprovider\\.com" + }, + { + "name": "Daum", + "pattern": "http://cs\\.daum\\.net" + }, + { + "name": "Deepcast Podcast Sync", + "pattern": "^DeepCast/\\d.*Sync" + }, + { + "name": "Deezer Podcasters", + "pattern": "^Deezer Podcasters/1\\.0" + }, + { + "name": "Digg", + "pattern": "^Digg " + }, + { + "name": "dorada", + "pattern": "support@dorada\\.co\\.uk" + }, + { + "name": "DotBot", + "pattern": "DotBot" + }, + { + "name": "Downcast Bot", + "pattern": "downcast feed consumer/" + }, + { + "name": "DuckDuckBot", + "pattern": "DuckDuckBot" + }, + { + "name": "F-Secure Riddler", + "pattern": "^Riddler " + }, + { + "name": "Facebook Bot", + "pattern": "FacebookBot|f?acebookexternalhit/?|^podcastbot$|Facebot|facebookexternalua|^facebookplatform/" + }, + { + "name": "Feedly", + "pattern": "^Feedly/" + }, + { + "name": "Feedspot Fetcher", + "pattern": "https://www\\.feedspot\\.com/fs/fetcher" + }, + { + "name": "FlexGet", + "pattern": "^FlexGet/" + }, + { + "name": "Flipboard Proxy", + "pattern": "FlipboardProxy/" + }, + { + "name": "Fyyd", + "pattern": "^fyyd-poll" + }, + { + "name": "Go Storage Gateway V1", + "pattern": "^storagegw-v1-go$" + }, + { + "name": "Goodpods Bot", + "pattern": "Goodpods/\\d+\\.\\d+" + }, + { + "name": "Google Adsense Bot", + "pattern": "Mediapartners-Google" + }, + { + "name": "Google AdsBot", + "pattern": "AdsBot-Google" + }, + { + "name": "Google Podcasts Manager", + "pattern": "Google-Podcast" + }, + { + "name": "Googlebot", + "pattern": "Googlebot/|Googlebot-Video/|Googlebot-Image/|^Feedfetcher-Google|google-xrawler|^Googlebot-News|^Google-Safety$" + }, + { + "name": "Gumball", + "pattern": "^Gumball" + }, + { + "name": "Headliner", + "pattern": "^Headliner/.*\\+https://headliner\\.app$" + }, + { + "name": "HubSpot Crawler", + "pattern": "HubSpot Crawler" + }, + { + "name": "Internet Archive", + "pattern": "Archive-It;|web\\.archive\\.org" + }, + { + "name": "iOS share menu", + "pattern": "^SharingUIService/" + }, + { + "name": "IPFS Podcasting Node", + "pattern": "^IPFS Podcasting Node/" + }, + { + "name": "Jaunt", + "pattern": "^Jaunt/" + }, + { + "name": "l'Institut national de l'audiovisuel", + "pattern": "INA dlweb" + }, + { + "name": "Library and Archives Canada", + "pattern": "LAC_IAHarvester/" + }, + { + "name": "Libsyn", + "pattern": "^Libsyn4" + }, + { + "name": "libwww-perl", + "pattern": "^libwww-perl| libwww-perl" + }, + { + "name": "Livelap Crawler", + "pattern": "LivelapBot" + }, + { + "name": "ListenNotes", + "pattern": "^ListenNotes/3\\.0 \\(" + }, + { + "name": "LTX71", + "pattern": "^ltx71 " + }, + { + "name": "MacOS share menu", + "pattern": "^ShareSheetUI/" + }, + { + "name": "MauiBot", + "pattern": "^MauiBot" + }, + { + "name": "Mastodon Bot", + "pattern": "rb/.*Mastodon/" + }, + { + "name": "Metacast Crawler", + "pattern": "^Metacast/.* Crawler" + }, + { + "name": "Microsoft Bingbot", + "pattern": "(BingPreview/|adidxbot/|[bB]ingbot/)" + }, + { + "name": "Microsoft Office", + "pattern": "ms-office; MSOffice" + }, + { + "name": "Mixcloud Podcast Importer", + "pattern": "^MixcloudPodcastImporter/" + }, + { + "name": "MJ12bot", + "pattern": ".*MJ12bot" + }, + { + "name": "Mozilla Bot", + "pattern": "^'?Mozilla(/5\\.0(\\.\\.\\.)?)?$|^\\(Mozilla/5\\.0\\)$" + }, + { + "name": "MSN Bot", + "pattern": "^msnbot/" + }, + { + "name": "Neevabot", + "pattern": ".*Neevabot" + }, + { + "name": "Netcraft Survey Agent", + "pattern": " NetcraftSurveyAgent/" + }, + { + "name": "Newspaper", + "pattern": "^newspaper/\\d" + }, + { + "name": "OgScrper", + "pattern": "OgScrper" + }, + { + "name": "OkDownload", + "pattern": "^OkDownload/" + }, + { + "name": "OP3 Fetcher", + "pattern": "^op3-fetcher/" + }, + { + "name": "OpenAI GPTBot", + "pattern": "GPTBot/" + }, + { + "name": "Overcast feed parser", + "pattern": "^Overcast/1\\.0 Podcast Sync" + }, + { + "name": "Pandora RSS crawler", + "pattern": "^PandoraRSSCrawler" + }, + { + "name": "PaperLi", + "pattern": "PaperLiBot/" + }, + { + "name": "PetalBot", + "pattern": "PetalBot" + }, + { + "name": "Pingdom", + "pattern": "^Pingdom" + }, + { + "name": "PlayerFM Podcast Sync", + "pattern": "PlayerFM/.* Podcast Sync" + }, + { + "name": "Podbean Importer", + "pattern": "^Podbean Importer" + }, + { + "name": "Podcastindex.org", + "pattern": "^Podcastindex\\.org/" + }, + { + "name": "Podcast de facto Standard", + "pattern": "^PodcastStandard/" + }, + { + "name": "Podcast Archiver", + "pattern": "^Podcast%20Archiver/" + }, + { + "name": "PodCloud", + "pattern": "podCloud" + }, + { + "name": "Podcorn", + "pattern": "Podcorn/" + }, + { + "name": "PodderBot", + "pattern": "PodderBot/" + }, + { + "name": "Podfollow", + "pattern": "podfollowbot/" + }, + { + "name": "Podgrab", + "pattern": "^Podgrab$" + }, + { + "name": "Podhound", + "pattern": "PodhoundBeta" + }, + { + "name": "Podio Bot", + "pattern": "^Podio/" + }, + { + "name": "Podmon Bot", + "pattern": "^Podmonbot/" + }, + { + "name": "Podnews", + "pattern": "PodnewsBot" + }, + { + "name": "Podnods Bot", + "pattern": "(podnods-crawler|podnods)" + }, + { + "name": "Podplay Podcast Sync", + "pattern": "^Podplay-Podcast-Sync/" + }, + { + "name": "Podroll Analyzer", + "pattern": "^pdrl\\.fm " + }, + { + "name": "Podscan Bot", + "pattern": "^PodscanBot/" + }, + { + "name": "Podscribe", + "pattern": "(^Adswizz-podscribe/|^Podscribe/)" + }, + { + "name": "PodUptime", + "pattern": "(PodUptime|PodUptimeBot)/\\d" + }, + { + "name": "Podverse Feed Parser", + "pattern": "^Podverse/Feed Parser" + }, + { + "name": "PodvineBot", + "pattern": "^PodvineBot/" + }, + { + "name": "PostRank Bot", + "pattern": "^PostRank/" + }, + { + "name": "PodwatchPro", + "pattern": "Podwatch-Pro Crawler" + }, + { + "name": "Puppeteer", + "pattern": " HeadlessChrome/\\d" + }, + { + "name": "python-requests", + "pattern": "python-requests" + }, + { + "name": "Qiniu spider", + "pattern": "qiniu.*spider" + }, + { + "name": "Radioline Stream Monitoring", + "pattern": "^Radioline Stream Monitoring" + }, + { + "name": "RedCircle", + "pattern": "RedCircle" + }, + { + "name": "Rephonic", + "pattern": "^Rephonic/\\d" + }, + { + "name": "Ridder Bot", + "pattern": " RidderBot/" + }, + { + "name": "RSS to Telegram", + "pattern": "^RSStT" + }, + { + "name": "RSSRadio", + "pattern": "^RSSRadio \\(" + }, + { + "name": "Ruby Mechanize", + "pattern": "^Mechanize|[ -]Mechanize/" + }, + { + "name": "Screaming Frog SEO Spider", + "pattern": "^Screaming Frog " + }, + { + "name": "SearchAtlas.com SEO Crawler", + "pattern": "^SearchAtlas.*Crawler" + }, + { + "name": "SEMrushBot", + "pattern": "SemrushBot/|^SEMrushBot$" + }, + { + "name": "Serendeputy", + "pattern": "SerendeputyBot/" + }, + { + "name": "Simplecast", + "pattern": "^Simplecast$" + }, + { + "name": "Slack Bot", + "pattern": "^Slackbot 1\\.0" + }, + { + "name": "Snapchat Bot", + "pattern": "://developers\\.snap\\.com/robots" + }, + { + "name": "SoundOn Bot", + "pattern": "^SoundOn/[\\d.]+\\s+\\(bot" + }, + { + "name": "Speechmatics ASR", + "pattern": "^Speechmatics-API/" + }, + { + "name": "Spotify cache service", + "pattern": "^Spotify/1\\.0$" + }, + { + "name": "Stitcher Bot", + "pattern": "^StitcherBot" + }, + { + "name": "Substack Content Fetcher", + "pattern": "^SubstackContentFetch/" + }, + { + "name": "SupportingCast", + "pattern": "^SupportingCast(/.*)?$" + }, + { + "name": "Timpi search crawler", + "pattern": "Timpibot/" + }, + { + "name": "Tiny Tiny RSS", + "pattern": "^Tiny Tiny RSS/" + }, + { + "name": "Transistor", + "pattern": "^Transistor\\.fm/" + }, + { + "name": "Trendsmap Resolver", + "pattern": "TrendsmapResolver/" + }, + { + "name": "Triton Digital Podcast Sync", + "pattern": "^Triton Digital Podcast Sync$" + }, + { + "name": "Twingly Bot", + "pattern": "Twingly Recon;" + }, + { + "name": "Twitterbot", + "pattern": "^Twitterbot" + }, + { + "name": "Typhoeus", + "pattern": "^Typhoeus" + }, + { + "name": "UCast", + "pattern": "^UCast/" + }, + { + "name": "UptimeRobot", + "pattern": "UptimeRobot/\\d" + }, + { + "name": "TelegramBot", + "pattern": "^TelegramBot " + }, + { + "name": "theTradeDesk Content Web Scraper", + "pattern": "TTD-Content" + }, + { + "name": "Veritone Engine Toolkit", + "pattern": "^veritone/engine-toolkit" + }, + { + "name": "Vurbl", + "pattern": "VurblBot" + }, + { + "name": "Wget", + "pattern": "Wget" + }, + { + "name": "weborama", + "pattern": "^weborama-fetcher" + }, + { + "name": "Windows Crawler", + "pattern": "^ZDM/.*Windows" + }, + { + "name": "Windows PowerShell", + "pattern": "WindowsPowerShell/" + }, + { + "name": "WordPress", + "pattern": "^WordPress" + }, + { + "name": "wsrv.nl", + "pattern": "https?://wsrv.nl/" + }, + { + "name": "YaCy", + "pattern": "^yacybot" + }, + { + "name": "Yahoo Crawler", + "pattern": "Yahoo! Slurp" + }, + { + "name": "YandexBot", + "pattern": "YandexBot/" + }, + { + "name": "Zapier", + "pattern": "^Zapier$" + }, + { + "name": "Zencast", + "pattern": "^Zencastr/" + } + ] +} \ No newline at end of file diff --git a/data/browsers.runtime.json b/data/browsers.runtime.json new file mode 100644 index 000000000..8d6d92982 --- /dev/null +++ b/data/browsers.runtime.json @@ -0,0 +1,44 @@ +{ + "entries": [ + { + "name": "Brave", + "pattern": ".+[Bb]rave" + }, + { + "name": "Opera", + "pattern": "Opera/|Macintosh.*OPR/|Windows.*OPR/|Mobile/.* OPT/" + }, + { + "name": "Edge", + "pattern": "(Xbox.+Edg?/|Android.+EdgA/|iPhone.+EdgiOS/|Macintosh.+MacEdgeClient/|Windows Phone.+Edge?/|Windows.+Edge?/)" + }, + { + "name": "Chrome", + "pattern": "^.*Android.*Chrome/|CrOS.*Chrome/|Linux.*Chrome/|Mac OS X.*Chrome/|Windows.*Chrome/|iPad.*CriOS/|iPhone.*CriOS/|^Chrome/\\d.*CFNetwork" + }, + { + "name": "Firefox", + "pattern": "Firefox/|(Android|iPhone|iPad).*Focus/| FxiOS/" + }, + { + "name": "Internet Explorer", + "pattern": "MSIE | Trident/" + }, + { + "name": "NCSA Mosaic", + "pattern": "^NCSA Mosaic/" + }, + { + "name": "DuckDuckGo", + "pattern": "^DuckDuckGo" + }, + { + "name": "Safari", + "pattern": "Macintosh.*AppleWebKit.*Safari/|Windows.*AppleWebKit.*Safari/|iPhone.*AppleWebKit.*Safari/|iPad.*AppleWebKit.*Safari/|^MobileSafari/|^Safari/" + }, + { + "name": "iOS WebView", + "pattern": "Mozilla/5\\.0 \\([A-Za-z ]+; CPU( iPhone)? OS [\\d_]+ like Mac OS X\\) AppleWebKit/[\\d.]+ \\(KHTML, like Gecko\\) Mobile/[0-9A-Z]{6,}" + } + ] +} \ No newline at end of file diff --git a/data/devices.runtime.json b/data/devices.runtime.json new file mode 100644 index 000000000..a23219e76 --- /dev/null +++ b/data/devices.runtime.json @@ -0,0 +1,99 @@ +{ + "entries": [ + { + "name": "Apple HomePod", + "pattern": "HomePod|^AirPodcasts/\\d", + "category": "smart_speaker" + }, + { + "name": "Apple iPad", + "pattern": "ipad|iPad|IPAD", + "category": "mobile" + }, + { + "name": "Apple TV", + "pattern": "Apple TV|AppleTV|apple;apple_tv", + "category": "smart_tv" + }, + { + "name": "Apple iPhone", + "pattern": "iphone|iOS|iPhone|CFNetwork| ios |phone;ios", + "category": "mobile" + }, + { + "name": "Apple Watch", + "pattern": "watch|Watch OS", + "category": "watch" + }, + { + "name": "Apple iPod", + "pattern": "iPod|IPOD", + "category": "mobile" + }, + { + "name": "Apple Computer", + "pattern": "OS X|OSX|Macintosh|Macbook", + "category": "computer" + }, + { + "name": "Google Home", + "pattern": "GoogleChirp|Google-Speech-Actions|CrKey.*DeviceType/SmartSpeaker", + "category": "smart_speaker" + }, + { + "name": "Google Chromebook", + "pattern": "Chromebook|CrOS", + "category": "computer" + }, + { + "name": "Android Tablet", + "pattern": "[a|A]ndroid.*[t|T]ablet|[t|T]ablet.*[a|A]ndroid|SM-T| GT-|^ZTE;Xview", + "category": "mobile" + }, + { + "name": "Other Smart TV", + "pattern": "SmartTV|[Rr]oku|CrKey|AFTT Build|AFTM Build|BRAVIA 4K|Opera TV|SmartTv|TSBNetTV|SMART-TV|TV Safari|WebTV|InettvBrowser|GoogleTV|HbbTV|smart-tv|olleh tv|^sony_tv;ps5;|Microsoft Xbox|^Google;Chromecast|^TCL;|^Xiaomi;(MIBOX|MiTV-)|^samsung;[uq][nej]\\d|^hisense;(c235x|c205x)|^skyworth;NoblexTV|^Sony;BRAVIA|^tcl;(c1\\d{2}x|7140x)|^onn\\.;8821x|^Funai;PHILIPS4KTV|^Sagemcom;VSB|^TPV;[A-Z0-9]+AndroidTV;|^(CVT_NULL|MediaTek);SMARTTV;|^NVIDIA;SHIELDAndroidTV|UHDAndroidTV;|^westinghouse;7808x;|^ZTE;B820C", + "category": "smart_tv" + }, + { + "name": "Android Phone", + "pattern": "ServeStream|Android|android|HTC|ExoPlayer|^AntennaPod/|^GSA/.*\\.arm(64)?$|^sp-agent|^PRDownloader$|^(Turtlecast|TURTLECAST)/", + "category": "mobile" + }, + { + "name": "Windows Computer", + "pattern": "Windows|windows|WMPlayer|Winamp|Win32|Win64|NSPlayer|MediaMonkey|NSPlayer|PC", + "category": "computer" + }, + { + "name": "Amazon Smart Speaker", + "pattern": "Alexa|^Echo/|^Amazon;Echo", + "category": "smart_speaker" + }, + { + "name": "Other Smart Speaker", + "pattern": "sonos|Sonos|^Bose/|^VictorReader|^Bose;Bose_(Home_Speaker|Soundbar|Portable_Home|Smart_Speaker)|^HEOS;DENON|^Denon;DENON-DWHS|^Storybutton/|^Bluesound;|^Yamaha;WX-", + "category": "smart_speaker" + }, + { + "name": "Other Computer", + "pattern": "Lavf/|desktop|Linux|linux|VLC|^okhttp/|CastBox/", + "category": "computer" + }, + { + "name": "Other Tablet", + "pattern": "tablet|Tablet", + "category": "mobile" + }, + { + "name": "Other Watch", + "pattern": "watch|Watch|^Garmin ", + "category": "watch" + }, + { + "name": "Other Mobile Device", + "pattern": "Player FM$|^Podkicker/|spotify_unknown|^Castro|^Swoot Agent| KAIOS/|^Zune/|^PodcastGuru |^Pocket Casts$|^AmazonMusic$|RTL\\+", + "category": "mobile" + } + ] +} \ No newline at end of file diff --git a/data/libraries.runtime.json b/data/libraries.runtime.json new file mode 100644 index 000000000..fbeae235b --- /dev/null +++ b/data/libraries.runtime.json @@ -0,0 +1,239 @@ +{ + "entries": [ + { + "name": "AIOHTTP", + "pattern": "^Python/\\d.*aiohttp/\\d", + "category": "bot" + }, + { + "name": "AndroidDownloadManager", + "pattern": "^AndroidDownloadManager" + }, + { + "name": "Apache HttpClient", + "pattern": "Apache-HttpClient", + "category": "bot" + }, + { + "name": "AppleCoreMedia", + "pattern": "^AppleCoreMedia/1" + }, + { + "name": "aria2", + "pattern": "^aria2/", + "category": "bot" + }, + { + "name": "Armadillo", + "pattern": "^Armadillo/1" + }, + { + "name": "Async Http Client (java)", + "pattern": "^AHC/\\d+\\.\\d+", + "category": "bot" + }, + { + "name": "Axios (Node)", + "pattern": "^axios/", + "category": "bot" + }, + { + "name": "Bubble (no-code)", + "pattern": "^Bubble$" + }, + { + "name": "Bun", + "pattern": "^Bun/\\d", + "category": "bot" + }, + { + "name": "CarrierWave (ruby)", + "pattern": "^CarrierWave/", + "category": "bot" + }, + { + "name": "Colly", + "pattern": "github\\.com/gocolly", + "category": "bot" + }, + { + "name": "Dalvik", + "pattern": "^Dalvik[/ ]" + }, + { + "name": "Dart", + "pattern": "^Dart/", + "category": "bot" + }, + { + "name": "Deno", + "pattern": "^Deno/", + "category": "bot" + }, + { + "name": "Down (ruby)", + "pattern": "^Down/\\d", + "category": "bot" + }, + { + "name": "ffmpeg", + "pattern": "^Lavf/", + "category": "bot" + }, + { + "name": "FileDownloader (Android)", + "pattern": "^FileDownloader/" + }, + { + "name": "git-annex", + "pattern": "^git-annex", + "category": "bot" + }, + { + "name": "Go Http Client", + "pattern": "^Go-http-client", + "category": "bot" + }, + { + "name": "Got (node)", + "pattern": "^got(/| \\()", + "category": "bot" + }, + { + "name": "GStreamer", + "pattern": "^GStreamer|GStreamer/" + }, + { + "name": "Guzzle", + "pattern": "^GuzzleHttp", + "category": "bot" + }, + { + "name": "gvfs", + "pattern": "^gvfs" + }, + { + "name": "hackney (elixir)", + "pattern": "^hackney/\\d", + "category": "bot" + }, + { + "name": "HTTP:Tiny", + "pattern": "^HTTP-Tiny/", + "category": "bot" + }, + { + "name": "http.rb", + "pattern": "^http\\.rb/[\\d.]+", + "category": "bot" + }, + { + "name": "Just Audio", + "pattern": "^just_audio/" + }, + { + "name": "KaiOS Downloader", + "pattern": "KaiOS Downloader" + }, + { + "name": "libsoup", + "pattern": "^libsoup/" + }, + { + "name": "lua-resty-http", + "pattern": "^lua-resty-http/\\d", + "category": "bot" + }, + { + "name": "Android License Verification Library", + "pattern": "^Android\\.LVLDM$" + }, + { + "name": "node-fetch", + "pattern": "^node-fetch(/.*)?$", + "category": "bot" + }, + { + "name": "okhttp", + "pattern": "okhttp", + "category": "bot" + }, + { + "name": "PRDownloader", + "pattern": "^PRDownloader$" + }, + { + "name": "python-httpx", + "pattern": "^python-httpx/", + "category": "bot" + }, + { + "name": "react-native-track-player", + "pattern": "^react-native-track-player/" + }, + { + "name": "Request (node)", + "pattern": "request\\.js", + "category": "bot" + }, + { + "name": "reqwest (rust)", + "pattern": "^reqwest/\\d" + }, + { + "name": "resty (go)", + "pattern": "^go-resty/\\d", + "category": "bot" + }, + { + "name": "resty-requests (lua)", + "pattern": "^resty-requests", + "category": "bot" + }, + { + "name": "ruby", + "pattern": "^Ruby" + }, + { + "name": "rest-client (ruby)", + "pattern": "^rest-client/.*ruby/", + "category": "bot" + }, + { + "name": "Safari View Service (SFSafariViewController)", + "pattern": "^SafariViewService/" + }, + { + "name": "Scrapy (python)", + "pattern": "^Scrapy/", + "category": "bot" + }, + { + "name": "stagefright", + "pattern": "stagefright/" + }, + { + "name": "Symfony (php)", + "pattern": "^Symfony HttpClient[/ ]", + "category": "bot" + }, + { + "name": "undici (node)", + "pattern": "^undici$", + "category": "bot" + }, + { + "name": "urllib (python)", + "pattern": "^(Python-urllib|python-urllib3)/", + "category": "bot" + }, + { + "name": "ExoPlayer (Android)", + "pattern": " ExoPlayerLib/" + }, + { + "name": "ESP32 HTTP Client", + "pattern": "^ESP32 HTTP Client/" + } + ] +} \ No newline at end of file diff --git a/data/opawg.json b/data/opawg.json deleted file mode 100644 index 13bb5398c..000000000 --- a/data/opawg.json +++ /dev/null @@ -1,2058 +0,0 @@ -[{ - "user_agents": ["^Acast.+[Aa]ndroid"], - "app": "Acast", - "device": "phone", - "os": "android" -}, { - "user_agents": ["^Acast.+iOS"], - "app": "Acast", - "device": "phone", - "os": "ios" -}, { - "user_agents": ["AdsBot-Google"], - "app": "Google AdsBot", - "bot": true, - "info_url": "http:\/\/www.google.com\/adsbot.html" -}, { - "user_agents": ["AhrefsBot\/"], - "app": "AhrefsBot", - "bot": true, - "info_url": "http:\/\/ahrefs.com\/robot\/", - "examples": ["Mozilla\/5.0 (compatible; AhrefsBot\/7.0; http:\/\/ahrefs.com\/robot\/)"] -}, { - "user_agents": ["^Airr\/"], - "app": "Airr", - "info_url": "https:\/\/www.airr.io\/", - "examples": ["Airr\/3787 CFNetwork\/1128.0.1 Darwin\/19.6.0", "Airr\/4070 CFNetwork\/1206 Darwin\/20.1.0"] -}, { - "user_agents": ["^AirableBot-Podcast"], - "app": "Airable", - "info_url": "https:\/\/www.airablenow.com\/", - "examples": ["AirableBot-Podcast\/1.0 ( https\/\/www.airablenow.com)"] -}, { - "user_agents": ["^AlexaMediaPlayer\/1\\.", "^AlexaMediaPlayer\/16\\.", "^AlexaMediaPlayer\/2\\.", "^Echo.*APNG"], - "app": "Alexa-enabled device", - "device": "speaker", - "os": "alexa", - "svg": "amazon.svg", - "examples": ["Echo\/1.0(APNG)"] -}, { - "user_agents": ["^AmazonNewsContentService"], - "app": "Alexa Flash Briefing cache", - "description": "A service which downloads, caches and normalises audio for the Flash Briefing service on Alexa-enabled devices", - "os": "alexa", - "info_url": "https:\/\/developer.amazon.com\/docs\/flashbriefing\/flash-briefing-skill-api-feed-reference.html#performance-requirements", - "developer_notes": "Stats are available within the Alexa skills dashboard.", - "svg": "amazon.svg", - "bot": true -}, { - "user_agents": ["^AmazonMusic(?!.*iPhone|.*Android|.*iPad)"], - "examples": ["AmazonMusic"], - "app": "Amazon Music Podcasts", - "description": "A music and podcasts streaming app", - "svg": "amazon.svg" -}, { - "user_agents": ["^AmazonMusic.*iPhone"], - "examples": ["AmazonMusic\/9.15.2 iPhone7,2 CFNetwork\/978.0.7 Darwin\/18.7.0", "AmazonMusic\/9.16.1 iPhone9,1 CFNetwork\/1128.0.1 Darwin\/19.6.0", "AmazonMusic\/9.16.0 iPhone12,1 CFNetwork\/1128.0.1 Darwin\/19.6.0"], - "app": "Amazon Music Podcasts", - "description": "A music and podcasts streaming app", - "os": "ios", - "device": "phone", - "developer_notes": "Examples are from an Amazon contact", - "svg": "amazon.svg" -}, { - "user_agents": ["^AmazonMusic.*iPad"], - "examples": ["AmazonMusic/22.13.3 iPad7,3 CFNetwork/1335.0.3 Darwin/21.6.0"], - "app": "Amazon Music Podcasts", - "description": "A music and podcasts streaming app", - "os": "ipados", - "device": "tablet" -}, { - "user_agents": ["^AmazonMusic.*Android"], - "examples": ["AmazonMusic\/16.17.0 Dalvik\/2.1.0 (Linux; U; Android 6.0.1; vivo 1610 Build\/MMB29M)"], - "app": "Amazon Music Podcasts", - "description": "A music and podcasts streaming app", - "os": "android", - "developer_notes": "Examples are from an Amazon contact", - "svg": "amazon.svg" -}, { - "user_agents": ["^Amazon Music Podcast"], - "app": "Amazon Music Podcasts", - "description": "A music and podcasts streaming app", - "developer_notes": "Backend ingestion service", - "svg": "amazon.svg", - "bot": true -}, { - "user_agents": ["^AlexaMediaPlayer\/5\\."], - "app": "Amazon Echo Dot", - "device": "speaker", - "os": "alexa", - "svg": "amazon.svg" -}, { - "user_agents": ["^com.audible.playersdk.player", "^Audible,"], - "app": "Audible", - "os": "android" -}, { - "user_agents": ["^Audible.*Darwin"], - "app": "Audible", - "os": "ios" -}, { - "user_agents": ["^Android_AudioNow\/"], - "app": "Audio Now", - "examples": ["Android_AudioNow"], - "info_url": "https:\/\/audionow.de\/", - "os": "android" -}, { - "user_agents": ["^AndroidDownloadManager"], - "os": "android" -}, { - "user_agents": ["^AntennaPod\/", "^de.danoeh.antennapod\/"], - "app": "AntennaPod", - "examples": ["de.danoeh.antennapod\/1.7.3b (Linux;Android 8.0.0) ExoPlayerLib\/2.9.3"], - "info_url": "https:\/\/github.com\/AntennaPod\/AntennaPod", - "os": "android", - "developer_notes": "The de.danoeh version was used when streaming only, and will been phased out as of v2" -}, { - "user_agents": ["Apache-HttpClient"], - "bot": true -}, { - "user_agents": ["^Applebot\/"], - "bot": true, - "info_url": "http:\/\/www.apple.com\/go\/applebot", - "description": "Applebot is the web crawler for Apple. Products like Siri and Spotlight Suggestions use Applebot." -}, { - "user_agents": ["^AppleCoreMedia\/1\\..*iPod"], - "device": "mp3_player", - "examples": ["AppleCoreMedia\/1.0.0.16G114 (iPod touch; U; CPU OS 12_4_2 like Mac OS X; en_us)"], - "os": "ios", - "description": "AppleCoreMedia library", - "info_url": "https:\/\/podnews.net\/article\/applecoremedia-user-agent", - "developer_notes": "This is a library used by a number of apps when progressively downloading podcasts. It is not (just) Apple Podcasts, and should not be treated as an Apple Podcasts useragent" -}, { - "user_agents": ["^AppleCoreMedia\/1\\..*Macintosh"], - "examples": ["AppleCoreMedia\/1.0.0.19A583 (Macintosh; U; Intel Mac OS X 10_15; en_us)"], - "device": "pc", - "os": "macos", - "description": "AppleCoreMedia library", - "info_url": "https:\/\/podnews.net\/article\/applecoremedia-user-agent", - "developer_notes": "This is a library used by a number of apps when progressively downloading podcasts. It is not (just) Apple Podcasts, and should not be treated as an Apple Podcasts useragent" -}, { - "user_agents": ["^AppleCoreMedia\/1\\..*iPhone"], - "device": "phone", - "examples": ["AppleCoreMedia\/1.0.0.15G77 (iPhone; U; CPU OS 11_4_1 like Mac OS X; en_us)"], - "os": "ios", - "description": "AppleCoreMedia library", - "info_url": "https:\/\/podnews.net\/article\/applecoremedia-user-agent", - "developer_notes": "This is a library used by a number of apps when progressively downloading podcasts. It is not (just) Apple Podcasts, and should not be treated as an Apple Podcasts useragent" -}, { - "user_agents": ["^AppleCoreMedia\/1\\..*iPad"], - "device": "tablet", - "examples": ["AppleCoreMedia\/1.0.0.17A860 (iPad; U; CPU OS 13_1_2 like Mac OS X; en_us)"], - "os": "ios", - "description": "AppleCoreMedia library", - "info_url": "https:\/\/podnews.net\/article\/applecoremedia-user-agent", - "developer_notes": "This is a library used by a number of apps when progressively downloading podcasts. It is not (just) Apple Podcasts, and should not be treated as an Apple Podcasts useragent" -}, { - "user_agents": ["^AppleCoreMedia\/1\\..*HomePod"], - "device": "speaker", - "examples": ["AppleCoreMedia\/1.0.0.16G78 (HomePod; U; CPU OS 12_4 like Mac OS X; en_us)"], - "os": "homepodos", - "description": "AppleCoreMedia library", - "info_url": "https:\/\/podnews.net\/article\/applecoremedia-user-agent", - "developer_notes": "This is a library used by a number of apps when progressively downloading podcasts. It is not (just) Apple Podcasts, and should not be treated as an Apple Podcasts useragent" -}, { - "user_agents": ["^AppleCoreMedia\/1\\..*Apple TV"], - "device": "tv", - "examples": ["AppleCoreMedia\/1.0.0.17J586 (Apple TV; U; CPU OS 13_0 like Mac OS X; en_us)"], - "os": "tvos", - "description": "AppleCoreMedia library", - "info_url": "https:\/\/podnews.net\/article\/applecoremedia-user-agent", - "developer_notes": "This is a library used by a number of apps when progressively downloading podcasts. It is not (just) Apple Podcasts, and should not be treated as an Apple Podcasts useragent" -}, { - "user_agents": ["^AppleCoreMedia\/1\\..*Apple Watch"], - "device": "watch", - "os": "watchos", - "description": "AppleCoreMedia library", - "info_url": "https:\/\/podnews.net\/article\/applecoremedia-user-agent", - "developer_notes": "This is a library used by a number of apps when progressively downloading podcasts. It is not (just) Apple Podcasts, and should not be treated as an Apple Podcasts useragent" -}, { - "user_agents": ["^Audacious"], - "examples": ["Audacious/3.10.1 neon/0.30.2"], - "device": "pc", - "description": "Audacious is an open source audio player.", - "info_url": "https:\/\/audacious-media-player.org\/" -}, { - "user_agents": ["^atc\/"], - "app": "Apple Podcasts", - "device": "watch", - "os": "watchos", - "bot": true, - "developer_notes": "Verified (via stamping the audio URL with the RSS useragent) as being sourced from Apple Podcasts; and accordingly this is marked as a bot since these downloads are duplicated with the phone.", - "examples": ["atc\/1.0","atc\/1.0 watchOS\/6.2 model\/Watch3,3 hwp\/t8004 build\/17T529 (6; dt:155)", "atc\/1.0 watchOS\/6.2.8 model\/Watch2,3 hwp\/t8002 build\/17U63 (6; dt:133)", "atc\/1.0 watchOS\/6.2.8 model\/Watch3,3 hwp\/t8004 build\/17U63 (6; dt:155)", "atc\/1.0 watchOS\/6.2.8 model\/Watch4,2 hwp\/t8006 build\/17U63 (6; dt:191)", "atc\/1.0 watchOS\/7.0.2 model\/Watch5,10 hwp\/t8006 build\/18R402 (6; dt:233)", "atc\/1.0 watchOS\/7.0.2 model\/Watch5,11 hwp\/t8006 build\/18R402 (6; dt:234)", "atc\/1.0 watchOS\/7.1 model\/Watch4,2 hwp\/t8006 build\/18R590 (6; dt:191)", "atc\/1.0 watchOS\/7.1 model\/Watch4,3 hwp\/t8006 build\/18R590 (6; dt:192)", "atc\/1.0 watchOS\/7.1 model\/Watch4,4 hwp\/t8006 build\/18R590 (6; dt:193)", "atc\/1.0 watchOS\/7.1 model\/Watch5,1 hwp\/t8006 build\/18R590 (6; dt:201)", "atc\/1.0 watchOS\/7.1 model\/Watch5,3 hwp\/t8006 build\/18R590 (6; dt:202)", "atc\/1.0 watchOS\/7.1 model\/Watch5,4 hwp\/t8006 build\/18R590 (6; dt:202)"] -}, { - "user_agents": ["^Podcasts\/.*", "^Balados\/.*\\(.*\\)", "^Podcasti\/.*\\(.*\\)", "^Podcastit\/.*\\(.*\\)", "^Podcasturi\/.*\\(.*\\)", "^Podcasty\/.*\\(.*\\)", "^Podcast\u2019ler\/.*\\(.*\\)", "^Podkaster\/.*\\(.*\\)", "^Podcaster\/.*\\(.*\\)", "^Podcastok\/.*\\(.*\\)", "^\u041f\u043e\u0434\u043a\u0430\u0441\u0442\u0438\/.*\\(.*\\)", "^\u041f\u043e\u0434\u043a\u0430\u0441\u0442\u044b\/.*\\(.*\\)", "^\u05e4\u05d5\u05d3\u05e7\u05d0\u05e1\u05d8\u05d9\u05dd\/.*\\(.*\\)", "^\u0627\u0644\u0628\u0648\u062f\u0643\u0627\u0633\u062a\/.*\\(.*\\)", "^\u092a\u0949\u0921\u0915\u093e\u0938\u094d\u091f\/.*\\(.*\\)", "^\u0e1e\u0e47\u0e2d\u0e14\u0e04\u0e32\u0e2a\u0e17\u0e4c\/.*\\(.*\\)", "^\u64ad\u5ba2\/.*\\(.*\\)", "^\ud31f\uce90\uc2a4\ud2b8\/.*\\(.*\\)"], - "examples": ["Podcasts\/1410.53 CFNetwork\/1111 Darwin\/19.0.0 (x86_64)", "Podcaster\/1410.53 CFNetwork\/1111 Darwin\/19.0.0 (x86_64)"], - "app": "Apple Podcasts", - "description": "The Apple Podcasts app.", - "developer_notes": "This could be on iOS, iPadOS or macOS. Used when downloading podcasts (not progressive downloads), with support for the following languages: Arabic, Chinese, Finnish, French, English, Hebrew, Hindi, Hungarian, Korean, Polish, Romanian, Russian, Serbian, Slovenian, Swedish, Thai, Turkish." -}, { - "user_agents": ["^Armadillo\/1"], - "examples": ["Armadillo/12.19 (Linux;Android 11) ExoPlayerLib/2.17.1"], - "os": "android", - "developer_notes": "This is a library, and not an app", - "info_url": "https:\/\/tech.scribd.com\/blog\/2021\/android-audio-player-tutorial-with-armadillo.html" -}, { - "user_agents": ["^AudioWave\/1"], - "app": "AudioWave", - "examples": ["AudioWave\/1.5 (+https:\/\/audiowave.io\/; iPhone 15.4)"], - "os": "ios" -}, { - "user_agents": ["^AudioWaveBot\/1.0"], - "app": "AudioWave feed parser", - "examples": ["AudioWaveBot\/1.0"], - "info_url": "https:\/\/audiowave.io", - "bot": true -}, { - "user_agents": ["^BashPodder"], - "app": "BashPodder", - "device": "pc", - "info_url": "http:\/\/lincgeek.org\/bashpodder\/" -}, { - "user_agents": ["Barkrowler\/"], - "app": "Babbar", - "bot": true, - "info_url": "https:\/\/beta.babbar.tech\/crawler" -}, { - "user_agents": ["BBC%20Sounds\/"], - "app": "BBC Sounds", - "device": "phone", - "examples": ["BBC%20Sounds\/1.13.1.7716 CFNetwork\/1107.1 Darwin\/19.0.0"], - "info_url": "https:\/\/www.bbc.co.uk\/sounds\/help\/questions\/getting-started-with-bbc-sounds\/sounds-intro" -}, { - "user_agents": ["BBCiPlayerRadio\/"], - "app": "BBC iPlayer Radio", - "device": "phone", - "examples": ["BBCiPlayerRadio\/2.16.0.8764 CFNetwork\/1107.1 Darwin\/19.0.0"], - "info_url": "https:\/\/www.bbc.co.uk\/programmes\/p00zh17p" -}, { - "user_agents": ["; BeyondPod"], - "app": "BeyondPod", - "device": "phone", - "examples": ["Mozilla\/5.0 (Linux; U; en-us; BeyondPod 4)"], - "os": "android" -}, { - "user_agents": ["^Bitcast\/"], - "app": "Bitcast", - "os": "ios", - "info_url": "https:\/\/bitcast.fm\/", - "examples": ["Bitcast\/336 CFNetwork\/1197 Darwin\/20.0.0"] -}, { - "user_agents": ["^Bose\/"], - "app": "Bose SoundTouch", - "device": "speaker" -}, { - "user_agents": ["^Breaker\/Android"], - "app": "Breaker", - "os": "android" -}, { - "user_agents": ["^Breaker\/iOS"], - "app": "Breaker", - "os": "ios" -}, { - "user_agents": ["Android.+(?:B|b)rave"], - "app": "Brave", - "os": "android" -}, { - "user_agents": ["Linux.+(?:B|b)rave"], - "app": "Brave", - "device": "pc", - "os": "linux" -}, { - "user_agents": ["iPhone.+(?:B|b)rave"], - "app": "Brave", - "device": "phone", - "os": "ios" -}, { - "user_agents": ["Mac OS X.+(?:B|b)rave"], - "app": "Brave", - "device": "pc", - "os": "macos" -}, { - "user_agents": ["Windows.+(?:B|b)rave"], - "app": "Brave", - "device": "pc", - "os": "windows" -}, { - "user_agents": ["BroadwayPodcastNetwork\/iOS"], - "app": "Broadway Podcast Network", - "description": "The Broadway Podcast Network iOS App", - "device": "phone", - "examples": ["BroadwayPodcastNetwork\/iOS"], - "os": "ios" -}, { - "user_agents": ["^Castamatic\/.+Darwin"], - "app": "Castamatic", - "description": "Your new favorite podcast player for iOS devices", - "device": "phone", - "examples": ["Castamatic\/3847 CFNetwork\/1240.0.4 Darwin\/20.6.0"], - "os": "ios", - "info_url": "https:\/\/castamatic.com" -}, { - "user_agents": ["^Cast(?:b|B)ox\/.+Android"], - "app": "CastBox", - "device": "phone", - "examples": ["CastBox\/8.2.6-191015245 (Linux;Android 10) ExoPlayerLib\/2.10.4", "CastBox\/8.19.0-200927161 (Linux;Android 10) ExoPlayerLib\/2.10.4", "CastBox\/8.18.1-200917153 (Linux;Android 8.0.0) ExoPlayerLib\/2.10.4"], - "os": "android" -}, { - "user_agents": ["^Cast(?:b|B)ox\/.+iOS"], - "app": "CastBox", - "device": "phone", - "examples": ["CastBox\/8.5.1 (fm.castbox.audiobook.radio.podcast; build:11; iOS 13.1.2)"], - "os": "ios" -}, { - "user_agents": ["^Cast(?:b|B)ox(?!.*(Android|iOS))"], - "app": "CastBox", - "developer_notes": "There are CastBox compatible User Agents that come without Android\/iOS platform marker", - "examples": ["CastBox\/5.7.5-190508115.r1a805d3"] -}, { - "user_agents": ["^castget "], - "app": "castget", - "examples": ["castget 1.2.4 (castget rss enclosure downloader)"], - "info_url": "https:\/\/castget.johndal.com\/", - "device": "pc" -}, { - "user_agents": ["Castopod\/1.0"], - "app": "Castopod", - "examples": ["Castopod\/1.0"], - "bot": true -}, { - "user_agents": ["Castro "], - "app": "Castro", - "device": "phone", - "examples": ["Castro 2019.13\/1167", "Castro 2020.14\/1287"], - "os": "ios" -}, { - "user_agents": ["(Linux).* CrKey\/"], - "app": "Chromecast device", - "device": "speaker", - "os": "linux" -}, { - "user_agents": ["(Fuchsia).* CrKey\/"], - "app": "Google Nest Hub", - "device": "speaker", - "os": "fuschia" -}, { - "user_agents": ["^Clementine "], - "app": "Clementine Music Player", - "device": "pc", - "info_url": "https:\/\/www.clementine-player.org\/" -}, { - "user_agents": ["^clark-crawler2"], - "app": "Clark-Crawler, unknown", - "bot": true -}, { - "user_agents": ["^curl"], - "bot": true -}, { - "user_agents": ["^Dalvik\/"], - "examples": ["Dalvik\/2.1.0 (Linux; U; Android 9; SM-N950U Build\/PPR1.180610.011)"], - "os": "android" -}, { - "user_agents": ["^datagnionbot"], - "bot": true -}, { - "user_agents": ["^Deezer\/.*Android;", "^DeezerJukebox\/.+Android"], - "app": "Deezer", - "device": "phone", - "os": "android", - "examples": ["Deezer\/6.2.2.80 (Android; 9; Mobile; fr) samsung SM-G950F", "Deezer\/6.2.3.96 (Android; 10; Mobile; fr) samsung SM-A405FN", "DeezerJukebox\/6.2.26.58 (Linux;Android 10) ExoPlayerLib\/2.12.1"], - "info_url": "https:\/\/play.google.com\/store\/apps\/details?id=deezer.android.app" -}, { - "user_agents": ["^Deezer\/.*CFNetwork\/"], - "app": "Deezer", - "os": "ios", - "examples": ["Deezer\/8.13.0.4 CFNetwork\/1125.2 Darwin\/19.4.0"], - "info_url": "https:\/\/apps.apple.com\/us\/app\/deezer-music-podcast-player\/id292738169" -}, { - "user_agents": ["^Deezer.*Electron; windows"], - "app": "Deezer", - "examples": ["Deezer\/4.20.0 (Electron; windows\/10.0.18362; Desktop; fr)"], - "device": "pc", - "os": "windows" -}, { - "user_agents": ["^Deezer.*Electron; osx"], - "app": "Deezer", - "examples": ["Deezer\/4.20.0 (Electron; osx\/10.14.6; Desktop; fr)"], - "device": "pc", - "os": "macos" -}, { - "user_agents": ["DoggCatcher"], - "app": "DoggCatcher", - "device": "phone", - "examples": ["Mozilla\/5.0 (Linux; U; Windows NT 6.1; en-us; dream) DoggCatcher"], - "os": "android" -}, { - "user_agents": ["DotBot"], - "app": "DotBot", - "examples": ["Mozilla\/5.0 (compatible; DotBot\/1.1; http:\/\/www.opensiteexplorer.org\/dotbot, help@moz.com)", "Mozilla\/5.0 (compatible; DotBot\/1.2; https:\/\/opensiteexplorer.org\/dotbot; help@moz.com)"], - "bot": true -}, { - "user_agents": ["^doubleTwist CloudPlayer"], - "examples": ["doubleTwist CloudPlayer"], - "app": "doubleTwist CloudPlayer", - "device": "phone", - "info_url": "https:\/\/www.doubletwist.com\/cloudplayer", - "os": "android" -}, { - "user_agents": ["Downcast\/.*iPhone"], - "app": "Downcast", - "device": "phone", - "examples": ["Downcast\/2.9.42 (iPhone; iOS 12.4.1; Scale\/3.00)"], - "os": "ios" -}, { - "user_agents": ["Downcast\/.*iPad"], - "app": "Downcast", - "device": "tablet", - "examples": ["Downcast\/2.9.57 (iPad; iOS 14.2; Scale\/2.00)"], - "os": "ios" -}, { - "user_agents": ["Downcast\/.*Mac OS X"], - "app": "Downcast", - "examples": ["Downcast\/2.9.57 (Mac OS X Version 10.15.7 (Build 19H15))"], - "os": "macos", - "device": "pc" -}, { - "user_agents": ["downcast feed consumer\/"], - "app": "Downcast", - "examples": ["downcast feed consumer\/0.0.175; (mode=dev; id=u2NgjBSPM6; downcast.fm)"], - "bot": true -}, { - "user_agents": ["Xbox.+Edg?\/"], - "app": "Edge", - "device": "games_console", - "os": "windows" -}, { - "user_agents": ["Android.+EdgA\/"], - "app": "Microsoft Edge", - "os": "android", - "info_url": "https:\/\/play.google.com\/store\/apps\/details?id=com.microsoft.emmx&hl=en_AU&gl=US" -}, { - "user_agents": ["iPhone.+EdgiOS\/"], - "app": "Edge", - "device": "phone", - "os": "ios" -}, { - "user_agents": ["Macintosh.+MacEdgeClient\/"], - "app": "Edge", - "device": "pc", - "os": "macos" -}, { - "user_agents": ["Windows Phone.+Edge?\/"], - "app": "Edge", - "device": "phone", - "os": "windows" -}, { - "user_agents": ["Windows(?!.*(Xbox)).+Edg?\/"], - "app": "Edge", - "device": "pc", - "examples": ["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"], - "os": "windows" -}, { - "user_agents": ["FacebookBot", "facebookexternalhit\/", "podcastbot"], - "bot": true, - "app": "Facebook", - "info_url": "https:\/\/www.facebook.com\/externalhit_uatext.php", - "developer_notes": "The podcastbot UA appears to be part of Facebook Podcasts onboarding", - "examples": ["facebookexternalhit\/1.1 ( http:\/\/www.facebook.com\/externalhit_uatext.php)", "podcastbot"] -}, { - "user_agents": ["iPhone.+\\[FBAN\/FBIO.+\\]"], - "app": "Facebook", - "device": "phone", - "os": "ios", - "examples": ["Mozilla\/5.0 (iPhone; CPU iPhone OS 12_4_8 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148 [FBAN\/FBIOS;FBDV\/iPhone7,2;FBMD\/iPhone;FBSN\/iOS;FBSV\/12.4.8;FBSS\/2;FBID\/phone;FBLC\/de_DE;FBOP\/5]"], - "description": "The Facebook app's built-in browser on iPhones." -}, { - "user_agents": ["iOS\/Facebook"], - "app": "Facebook", - "device": "phone", - "os": "ios", - "examples": ["iOS\/Facebook"], - "developer_notes": "Spotted using a Facebook-exclusive audio feed. Distinct from the above, since it's the actual podcast player.", - "description": "The Facebook app's podcast player on iOS." -}, { - "user_agents": ["^FB4A\/Facebook"], - "app": "Facebook", - "device": "phone", - "os": "android", - "examples": ["FB4A\/Facebook"], - "developer_notes": "Spotted using a Facebook-exclusive audio feed", - "description": "The Facebook app's podcast player on Android." -}, { - "user_agents": ["^feedly\/"], - "app": "Feedly", - "examples": ["feedly\/81.0.1 CFNetwork\/1206 Darwin\/20.1.0"], - "description": "An RSS reader" -}, { - "user_agents": ["Linux.*Firefox\/"], - "app": "Firefox", - "device": "pc", - "os": "linux" -}, { - "user_agents": ["Mac OS X.*Firefox\/"], - "app": "Firefox", - "device": "pc", - "os": "macos" -}, { - "user_agents": ["Windows.*Firefox\/"], - "app": "Firefox", - "device": "pc", - "examples": ["Mozilla\/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko\/20100101 Firefox\/69.0"], - "os": "windows" -}, { - "user_agents": ["Android.*(Focus|Firefox)\/"], - "app": "Firefox", - "os": "android" -}, { - "user_agents": ["iPhone.*Focus\/"], - "app": "Firefox", - "device": "phone", - "os": "ios" -}, { - "user_agents": ["iPad.*Focus\/"], - "app": "Firefox", - "device": "tablet", - "os": "ios" -}, { - "user_agents": ["^Lavf\/"], - "developer_notes": "ffmpeg is a library used within TuneIn, VLC, ffmpeg and other programs. This is the default useragent for the ffmpeg library. Since it's a library, not an app by itself, we don't add its name here." -}, { - "user_agents": ["^MAC "], - "app": "Flash", - "device": "pc", - "os": "macos" -}, { - "user_agents": ["^WIN "], - "app": "Flash", - "device": "pc", - "os": "windows" -}, { - "user_agents": ["^foobar2000\/"], - "app": "foobar2000", - "examples": ["foobar2000\/1.x"], - "info_url": "https:\/\/www.foobar2000.org\/" -}, { - "user_agents": ["^Fountain.+(iOS|ios)"], - "app": "Fountain", - "examples": ["Fountain\/0.2.6 iOS https:\/\/www.fountain.fm'", "Fountain\/0.3.8 ios https:\/\/www.fountain.fm"], - "info_url": "https:\/\/www.fountain.fm", - "os": "ios" -}, { - "user_agents": ["^Fountain.+(Android|android)"], - "app": "Fountain", - "examples": ["Fountain\/0.2.6 Android https:\/\/www.fountain.fm'", "Fountain\/0.3.13 android https:\/\/www.fountain.fm"], - "info_url": "https:\/\/www.fountain.fm", - "os": "android" -}, { - "user_agents": ["^fyyd-poll"], - "app": "Fyyd", - "bot": true -}, { - "user_agents": ["^Garmin Forerunner"], - "app": "Garmin Forerunner", - "developer_notes": "This uses Spotify to transfer audio to compatible watches", - "device": "watch", - "examples": ["Garmin Forerunner 245 Music\/11.60"] -}, { - "user_agents": ["^Garmin fenix 5X Plus"], - "app": "Garmin fenix 5X", - "developer_notes": "This uses Spotify to transfer audio to compatible watches", - "device": "watch", - "examples": ["Garmin fenix 5X Plus/18.0"] -}, { - "user_agents": ["^Go-http-client"], - "developer_notes": "This has been seen being used by a TuneIn client, and may be within WinAMP code.", - "examples": ["Go-http-client\/2.0"] -}, { - "user_agents": ["Goodpods(.)Android \/"], - "examples": ["Goodpods.Android \/ 2.2.2","Goodpods.Android / 3.2.9"], - "app": "Goodpods", - "os": "android", - "description": "The social podcasting app", - "info_url": "https:\/\/www.goodpods.com\/", - "svg": "goodpods.svg" -}, { - "user_agents": ["Goodpods.[iI]OS \/ \\d+\\.\\d+\\.\\d+"], - "examples": ["Goodpods.iOS \/ 2.2.2"], - "app": "Goodpods", - "os": "ios", - "description": "The social podcasting app", - "info_url": "https:\/\/www.goodpods.com\/", - "svg": "goodpods.svg" -}, { - "user_agents": ["Goodpods\/\\d+\\.\\d+"], - "examples": ["Goodpods\/2.2"], - "app": "Goodpods", - "os": "linux", - "bot": true, - "description": "The social podcasting app", - "info_url": "https:\/\/www.goodpods.com\/", - "svg": "goodpods.svg", - "developer_notes": "RSS scraper \/ podcast verifier. Contact hello at goodpods dot com." -}, { - "user_agents": ["Goodpods\/1 CFNetwork"], - "examples": ["Goodpods\/1 CFNetwork\/1329 Darwin\/21.3.0"], - "app": "Goodpods", - "os": "ios", - "description": "The social podcasting app", - "info_url": "https:\/\/www.goodpods.com\/", - "svg": "goodpods.svg" -}, { - "user_agents": ["^Gumball"], - "examples": ["Gumball.fm Analytics Prefix Checker"], - "app": "Gumball", - "bot": true, - "description": "An attribution service (known as Gumshoe) from the Gumball network" -}, { - "user_agents": ["Googlebot\/", "Googlebot-Video\/", "Googlebot-Image\/"], - "examples": ["Mozilla\/5.0 (Linux; Android 6.0.1; Nexus 5X Build\/MMB29P) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/86.0.4240.96 Mobile Safari\/537.36 (compatible; Googlebot\/2.1; http:\/\/www.google.com\/bot.html)", "Googlebot-Image\/1.0"], - "description": "Google's search bots", - "app": "Googlebot", - "info_url": "http:\/\/www.google.com\/bot.html", - "bot": true -}, { - "user_agents": ["Google-Podcast"], - "bot": true, - "app": "Google Podcasts Manager" -}, { - "user_agents": ["^Google-Speech-Actions"], - "app": "Google Assistant", - "device": "speaker", - "developer_notes": "This is audio downloaded as a result of a Google Assistant voice action. It's unlikely to appear in podcast host logs, since voice actions can only use up to 120 seconds of audio.", - "os": "android", - "info_url": "https:\/\/cloud.google.com\/text-to-speech\/docs\/ssml" -}, { - "user_agents": ["GoogleChirp"], - "app": "Google Podcasts", - "device": "speaker", - "description": "Google Podcasts on smart speakers", - "os": "android" -}, { - "user_agents": ["^GooglePodcasts\/(iPhone|iPad|iPod touch|!Android).*GSA\/", "^Podcasts$", "^GooglePodcasts\/.*(iPhone|iPad|iPod touch)"], - "app": "Google Podcasts", - "description": "Google Podcasts on iOS", - "examples": ["GooglePodcasts\/2.0.2 iPod_touch\/13.4.1 hw\/iPod9_1", "GooglePodcasts\/2.0.10 iPhone\/14.6 hw\/iPhone12_1", "GooglePodcasts\/2.0.10 iPhone\/14.6 hw\/iPhone13_3", "Mozilla\/5.0 (iPhone; CPU iPhone OS 13_4 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) GSA\/107.0.310639584 Mobile\/15E148 Safari\/604.1", "Mozilla\/5.0 (iPod touch; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) GSA\/107.0.310639584 Mobile\/15E148 Safari\/601.1"], - "developer_notes": "'GooglePodcasts' is the iOS app, while (?:(?:iPhone|iPad|iPod touch);.+)?GSA\/ is used in the Google app when searching and playing podcasts. The first useragent was simply 'Podcasts'.", - "os": "ios" -}, { - "user_agents": ["(Android).*GSA\/","^GSA\/"], - "app": "Google Podcasts", - "os": "android", - "description": "Google Podcasts on Android (the app or player)", - "examples": ["GSA/13.38.11.26.arm64","Mozilla\/5.0 (Linux; Android 10; Pixel 3a Build\/QQ2A.200305.002; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/80.0.3987.149 Mobile Safari\/537.36 GSA\/11.2.7.21.arm64", "Mozilla\/5.0 (Linux; Android 10; SM-G986U Build\/QP1A.190711.020; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/86.0.4240.75 Mobile Safari\/537.36 GSA\/11.31.12.21.arm64"], - "developer_notes": "*GSA\/ is used in the Google app when searching and playing podcasts, and in the Google Podcasts app" -}, { - "user_agents": ["Linux; Android.*SM-T350"], - "device": "tablet", - "os": "android" -}, { - "user_agents": ["^(?!Podverse).*Android.*Chrome\/(?!.*(Googlebot|CrKey|GSA|Edge|EdgA\/))"], - "app": "Google Chrome", - "os": "android", - "developer_notes": "This won't match Googlebot, a Chromecast device, Google speaker or Google app, or the Podverse app" -}, { - "user_agents": ["CrOS.*Chrome\/"], - "app": "Google Chrome", - "device": "pc", - "os": "chromeos" -}, { - "user_agents": ["Linux(?!.*(Android)).*Chrome\/(?!.*(CrKey|GSA\/))"], - "app": "Google Chrome", - "device": "pc", - "os": "linux", - "developer_notes": "This won't match an Android device, Chromecast device, Google speaker or Google app" -}, { - "user_agents": ["Mac OS X.*Chrome\/(?!.*(Spreaker\/|OPR\/))"], - "app": "Google Chrome", - "device": "pc", - "examples": ["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"], - "os": "macos", - "developer_notes": "This won't match the Spreaker app" -}, { - "user_agents": ["Windows.*Chrome\/(?!.*(OPR|Edg|Electron|PodFriend\/))"], - "app": "Google Chrome", - "device": "pc", - "examples": ["Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/77.0.3865.120 Safari\/537.36"], - "os": "windows" -}, { - "user_agents": ["iPad.*CriOS\/"], - "app": "Google Chrome", - "device": "tablet", - "os": "ios" -}, { - "user_agents": ["iPhone.*CriOS\/"], - "app": "Google Chrome", - "device": "phone", - "os": "ios" -}, { - "user_agents": ["iPhone.+GSA\/\\d+"], - "app": "Google Search App", - "device": "phone", - "os": "ios", - "examples": ["Mozilla\/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) GSA\/166.0.381336632 Mobile\/15E148 Safari\/604.1"], - "description": "The Google Search App on iPhone." -}, { - "user_agents": ["^gPodder\/.*Windows", "^gpodder\\.net"], - "app": "gPodder", - "os": "windows", - "device": "pc", - "examples": ["gPodder\/3.10.8 (+http:\/\/gpodder.org\/) Windows\/10"] -}, { - "user_agents": ["^GStreamer"], - "device": "radio" -}, { - "user_agents": ["^GaanaAndroid-"], - "app": "Gaana", - "os": "android", - "examples": ["GaanaAndroid-8.13.0\/Dalvik\/2.1.0 (Linux; U; Android 9; vivo 1906 Build\/PKQ1.190616.001)", "GaanaAndroid-8.13.0\/Dalvik\/2.1.0 (Linux; U; Android 5.1; Micromax P701 Build\/LMY47D)"] -}, { - "user_agents": ["^Gaana-iOS"], - "app": "Gaana", - "os": "ios", - "examples": ["Gaana-iOS"] -}, { - "user_agents": ["^Guardian-iOSLive\/"], - "app": "Guardian", - "os": "ios" -}, { - "user_agents": ["GuardianAndroidApp\/"], - "app": "Guardian", - "os": "android" -}, { - "user_agents": ["^gvfs"], - "bot": true -}, { - "user_agents": ["^Himalaya\/.+iPhone"], - "app": "Himalaya", - "device": "phone", - "examples": ["Himalaya\/2.4.41 (iPhone; iOS 14.0.1; Scale\/3.00; CFNetwork; iPhone9,4)", "Himalaya\/2.4.42 (iPhone; iOS 14.2; Scale\/2.00; CFNetwork; iPhone8,1)"], - "os": "ios", - "description": "Himalaya is a podcast app" -}, { - "user_agents": ["^HyperCatcher"], - "app": "HyperCatcher", - "device": "phone", - "examples": ["HyperCatcher\/1"], - "os": "ios", - "description": "Newsletters and podcasts together!" -}, { - "user_agents": ["^iCatcher"], - "app": "iCatcher", - "device": "phone", - "os": "ios" -}, { - "user_agents": ["^iHeartRadio\/.*Android"], - "app": "iHeartRadio", - "os": "android", - "examples": ["iHeartRadio\/9.19.0 (Android 10; SM-G960U Build\/QP1A.190711.020)", "iHeartRadio\/9.19.0 (Android 9; SM-G950U Build\/PPR1.180610.011)"], - "info_url": "https:\/\/play.google.com\/store\/apps\/details?id=com.clearchannel.iheartradio.controller" -}, { - "user_agents": ["^iHeartRadio\/.* CFNetwork\/", "^iHeartRadio\/.* iOS"], - "app": "iHeartRadio", - "os": "ios", - "examples": ["iHeartRadio\/2020052002 CFNetwork\/1125.2 Darwin\/19.4.0", "iHeartRadio\/9.20.0 (iPhone; iOS 13.4.1; iPhone11,8)", "iHeartRadio\/9.20.0 (iPad; iOS 13.4.1; iPad6,12)", "iHeartRadio\/9.7.0 (iPod touch; iOS 12.4.5; iPod7,1)"], - "info_url": "https:\/\/apps.apple.com\/us\/app\/iheart-radio-music-podcasts\/id290638154" -}, { - "user_agents": ["MSIE "], - "app": "Internet Explorer", - "device": "pc", - "examples": ["Mozilla\/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident\/6.0)"], - "os": "windows" -}, { - "user_agents": ["iVoox"], - "app": "iVoox", - "info_url": "https:\/\/www.ivoox.com\/" -}, { - "user_agents": ["iVooxApp.*iPhone"], - "app": "iVoox", - "os": "ios", - "examples": ["iVooxApp/3.85 (iPhone; iOS; iOS 15.6.1; d:16910714; 113F)"], - "info_url": "https:\/\/www.ivoox.com\/" -}, { - "user_agents": ["ivooxApp.*Android", "FileDownloader\/"], - "app": "iVoox", - "os": "android", - "examples": ["ivooxApp\/2.281.428_428 (G8341; Android 9; d:420031; E5A4)"], - "info_url": "https:\/\/www.ivoox.com\/" -}, { - "user_agents": ["iTMS", "itunesstored"], - "app": "Apple Podcasts automated checks", - "bot": true -}, { - "user_agents": ["^iTunes\/.+Mac OS", "^iTunes\/.+OS X"], - "examples": ["iTunes\/10.6.3 (Macintosh; Intel Mac OS X 10.5.8) AppleWebKit\/534.50.2"], - "app": "iTunes", - "device": "pc", - "info_url": "https:\/\/www.apple.com\/itunes\/", - "os": "macos" -}, { - "user_agents": ["^iTunes\/.+Windows"], - "examples": ["iTunes\/11.4 (Windows; Microsoft Windows 7 x64 Home Premium Edition (Build 7600)) AppleWebKit\/7600.1017.0.24", "iTunes\/12.10.9 (Windows; Microsoft Windows 10 x64 Home Premium Edition (Build 19041); x64) AppleWebKit\/7609.3005.1003.3"], - "app": "iTunes", - "device": "pc", - "os": "windows" -}, { - "user_agents": ["^iTunes\/4"], - "device": "speaker" -}, { - "user_agents": ["J. River Internet Reader"], - "examples": ["Microsoft-Windows-XP\/2002, UPnP\/1.1, J. River Internet Reader\/2.0 (compatible; Windows-Media-Player\/10)"], - "app": "JRiver Media Center", - "device": "pc", - "info_url": "https:\/\/www.jriver.com\/", - "os": "windows" -}, { - "user_agents": [".*KAIOS\/(?!.*(PodKast))"], - "app": "KAIOS podcast app", - "device": "phone", - "os": "kaios", - "info_url": "https:\/\/kaiostech.com", - "examples": ["Mozilla\/5.0 (Mobile; LYF\/F271i\/LYF_F271i-000-01-20-101019; Android; rv:48.0) Gecko\/48.0 Firefox\/48.0 KAIOS\/2.5"], - "developer_notes": "This is a standard useragent for KaiOS, the cut-down operating system for mobile phones in developing countries. Watch out - it may also contain Android." -}, { - "user_agents": [".*PodLP\/"], - "app": "PodLP podcast app for KaiOS", - "device": "phone", - "os": "kaios", - "info_url": "https:\/\/podlp.com", - "examples": ["Mozilla\/5.0 (Mobile; LYF\/F271i\/LYF_F271i-000-01-20-101019; Android; rv:48.0) Gecko\/48.0 Firefox\/48.0 KAIOS\/2.5 PodLP\/1.3.2.0"], - "description": "PodLP is the first podcast app available for KaiOS smart feature phones on the KaiStore.", - "developer_notes": "Introduced in version v1.2.0.0 for limited content (downloads); available for all content after v1.3.0.0" -}, { - "user_agents": [".*PodKast$"], - "app": "PodKast app", - "device": "phone", - "os": "kaios", - "examples": ["Mozilla\/5.0 (Mobile; M571M3; rv:48.0) Gecko\/48.0 Firefox\/48.0 KAIOS\/2.5.1.2 PodKast", "KaiOS Downloader PodKast"], - "description": "PodKast is a podcast app available for KaiOS smartphones" -}, { - "user_agents": ["^Laughable.+iOS"], - "app": "Laughable", - "device": "phone", - "os": "ios" -}, { - "user_agents": ["^lesindesradios$"], - "app": "Les Ind\u00e9s Radios", - "os": "ios", - "device": "phone", - "description": "Les Ind\u00e9s Radios is a radio app, available on multiple devices and OSs", - "info_url": "https:\/\/www.lesindesradios.fr\/", - "examples": ["lesindesradios"] -}, { - "user_agents": ["^lesindesradios\/.*\\(Linux;Android"], - "app": "Les Ind\u00e9s Radios", - "os": "android", - "device": "phone", - "description": "Les Ind\u00e9s Radios is a radio app, available on multiple devices and OSs", - "info_url": "https:\/\/www.lesindesradios.fr\/", - "examples": ["lesindesradios\/9.1.0 (Linux;Android 8.0.0) ExoPlayerLib\/2.9.2", "lesindesradios\/9.1.0 (Linux;Android 11) ExoPlayerLib\/2.9.2"] -}, { - "user_agents": ["^com.jio.media.jiobeats", "^com.saavn.android", "^saavn"], - "app": "JioSaavn", - "os": "android", - "info_url": "https:\/\/www.jiosaavn.com\/", - "description": "A music streaming and podcast app from India. Earn Your Happy!", - "developer_notes": "The user-agent will start with one of the above strings followed by the app version and player version.", - "examples": ["com.jio.media.jiobeats\/7.3.1 (Linux;Android 8.1.0) ExoPlayerLib\/2.11.4"] -}, { - "user_agents": ["^lamarr-iOS", "^TheEconomist-Lamarr-ios"], - "app": "The Economist", - "device": "phone", - "os": "ios", - "examples": ["lamarr-iOS-2.20.3-116", "TheEconomist-Lamarr-ios-2.22.2-12002"] -}, { - "user_agents": ["^lamarr-android", "^TheEconomist-Lamarr-android"], - "app": "The Economist", - "device": "phone", - "os": "android", - "examples": ["lamarr-android-2.18.1-21810", "TheEconomist-Lamarr-android-2.22.2-12002"] -}, { - "user_agents": ["LG Player"], - "device": "phone", - "os": "android" -}, { - "user_agents": ["^libwww-perl"], - "bot": true -}, { - "user_agents": ["iPhone.+\\[LinkedInApp\\]"], - "app": "LinkedIn", - "device": "phone", - "os": "ios", - "examples": ["Mozilla\/5.0 (iPhone; CPU iPhone OS 14_4_2 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148 [LinkedInApp]"], - "description": "The LinkedIn app's built-in browser on iPhones." -}, { - "user_agents": ["Listen5"], - "app": "Listen5", - "device": "phone", - "os": "ios" -}, { - "user_agents": ["Lisny"], - "app": "Lisny", - "os": "android", - "examples": ["Lisny"], - "info_url": "https:\/\/www.lisny.com", - "description": "Lisny is a fast, beautiful and fun listening experience." -}, { - "user_agents": ["LivelapBot"], - "bot": true -}, { - "user_agents": ["^Luminary\/.+Android"], - "app": "Luminary", - "device": "phone", - "os": "android" -}, { - "user_agents": ["^Luminary\/.+iOS"], - "app": "Luminary", - "device": "phone", - "os": "ios" -}, { - "user_agents": ["^MajelanApp"], - "app": "Majelan" -}, { - "user_agents": ["^Mechanize"], - "bot": true -}, { - "user_agents": ["^MediaMonkey"], - "app": "MediaMonkey", - "device": "pc", - "os": "windows" -}, { - "user_agents": ["^Miro\/.+Windows"], - "app": "Miro", - "device": "pc", - "examples": ["Miro\/6.0 (http:\/\/www.getmiro.com\/; Windows post2008Server x86)"], - "info_url": "http:\/\/www.getmiro.com\/", - "os": "windows" -}, { - "user_agents": [".*MJ12bot"], - "app": "MJ12bot", - "examples": ["Mozilla\/5.0 (compatible; MJ12bot\/v1.4.8; http:\/\/mj12bot.com\/)"], - "bot": true -}, { - "user_agents": ["^mpv 0\\."], - "app": "mpv", - "info_url": "https:\/\/mpv.io\/" -}, { - "user_agents": ["^MusicBee"], - "app": "MusicBee", - "device": "pc", - "examples": ["MusicBee"], - "info_url": "https:\/\/getmusicbee.com\/", - "os": "windows" -}, { - "user_agents": [".*Neevabot"], - "app": "Neevabot", - "bot": true, - "info_url": "https:\/\/neeva.com\/neevabot", - "examples": ["Mozilla\/5.0 (compatible; Neevabot\/1.0; https:\/\/neeva.com\/neevabot)"] -}, { - "user_agents": ["^NPR%20One\/"], - "app": "NPR One", - "examples": ["NPR%20One\/234 CFNetwork\/1197 Darwin\/20.0.0"] -}, { - "user_agents": ["^NPROneAndroid"], - "app": "NPR One", - "os": "android", - "examples": ["NPROneAndroid"] -}, { - "user_agents": ["NRC Audio\/.*Android"], - "examples": ["NRC Audio/2.0.0 (nl.nrc.audio; build:29; Android 12; Sdk:31; Manufacturer:samsung; Model: SM-G975F) OkHttp/4.9.3"], - "description": "NRC Audio", - "os": "android" -}, { - "user_agents": ["^OkDownload\/"] -}, { - "user_agents": ["okhttp"], - "examples": ["okhttp\/3.11.0"] -}, { - "user_agents": ["Opera\/.*Android;"], - "app": "Opera", - "os": "android" -}, { - "user_agents": ["Opera\/.*\\(Linux"], - "app": "Opera", - "device": "pc", - "os": "linux" -}, { - "user_agents": ["Opera\/.*\\(Macintosh", "Macintosh.*OPR\/"], - "app": "Opera", - "device": "pc", - "os": "macos", - "examples": ["Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/86.0.4240.111 Safari\/537.36 OPR\/72.0.3815.186"] -}, { - "user_agents": ["Opera\/.*\\(Windows", "Windows.*OPR\/"], - "app": "Opera", - "device": "pc", - "os": "windows" -}, { - "user_agents": ["^MauiBot"], - "app": "MauiBot", - "bot": true, - "examples": ["MauiBot (crawler.feedback dc@gmail.com)"] -}, { - "user_agents": ["^Overcast\/.*iOS"], - "app": "Overcast", - "examples": ["Overcast\/3.0 (+http:\/\/overcast.fm\/; iOS podcast app)"], - "os": "ios" -}, { - "user_agents": ["^Overcast.*Apple Watch"], - "app": "Overcast", - "examples": ["Overcast ( http:\/\/overcast.fm\/; Apple Watch podcast app)"], - "os": "watchos", - "device": "watch" -}, { - "user_agents": ["^Overcast\/1.0 Podcast Sync"], - "app": "Overcast feed parser", - "examples": ["Overcast\/1.0 Podcast Sync"], - "developer_notes": "Marco Arment says: when a new episode is detected, the servers fetch a copy of it to seed these values with an initial set of data to make the privacy screen more accurate.", - "bot": true -}, { - "user_agents": ["^PandoraRSSCrawler"], - "bot": true, - "app": "Pandora RSS crawler" -}, { - "user_agents": ["^Pandora.+Android"], - "app": "Pandora", - "os": "android", - "examples": ["Pandora\/2009.2 Android\/7.1.1 gteslteatt (ExoPlayerLib1.5.14.1)"] -}, { - "user_agents": ["iPhone.+Pandora\/"], - "app": "Pandora", - "device": "phone", - "os": "ios", - "examples": ["Mozilla\/5.0 (iPhone; CPU iPhone OS 12_4_6 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148 Pandora\/2009.2"] -}, { - "user_agents": ["PaperLiBot\/"], - "app": "PaperLi", - "examples": ["Mozilla\/5.0 (compatible; PaperLiBot\/2.1; https:\/\/support.paper.li\/entries\/20023257-what-is-paper-li)"], - "bot": true -}, { - "user_agents": ["^Player FM","^Player%20FM"], - "app": "Player FM", - "examples": ["Player%20FM/588 CFNetwork/1121.2.2 Darwin/19.2.0"] -}, { - "user_agents": ["^Pingdom"], - "bot": true -}, { - "user_agents": ["^Pocket Casts", "^PocketCasts\/"], - "app": "Pocket Casts", - "examples": ["Pocket Casts"], - "info_url": "https:\/\/www.pocketcasts.com\/", - "description": "A podcast app and web player", - "developer_notes": "'PocketCasts' is a feed parser; 'Pocket Casts' is the app. There is also a web player.", - "svg": "pocketcasts.svg" -}, { - "user_agents": ["^Podcast.*Addict\/"], - "app": "PodcastAddict", - "device": "phone", - "examples": ["PodcastAddict\/v2 - Dalvik\/2.1.0 (Linux; U; Android 9; SM-N950U Build\/PPR1.180610.011)", "PodcastAddict\/v5 ( https:\/\/podcastaddict.com\/; Android podcast app)"], - "os": "android" -}, { - "user_agents": ["^ThePodcastApp.*iPhone"], - "app": "The Podcast App", - "os": "ios", - "device": "phone", - "examples": ["ThePodcastApp/6.23.0 (iPhone; iOS 15.6.1; ) player (build 6272; +https://podcast.app/)"] -}, { - "user_agents": ["iOS.*The Podcast App\/", "com.evolve.podcast\/", "^ThePodcastApp(?!.*(iPhone))"], - "app": "The Podcast App", - "os": "ios", - "examples": ["ThePodcastApp/6.28.1 (iPhone; iOS 16.0.2; ) player (build 6391; +https://podcast.app/)","podcast\/2358 iOS\/Version 13.5.1 (Build 017F80) The Podcast App\/3.22.1", "com.evolve.podcast\/3.22.1 (iPhone; ) (build 2358, iOS 13.5.1)"], - "developer_notes": "The com.evolve version of the useragent is an error, and has been reported to the developers as a bug. Caution: the beginning of their main useragent is similar to Google Podcasts." -}, { - "user_agents": ["^PodcastGuru"], - "app": "Podcast Guru", - "os": "android", - "info_url": "https:\/\/podcastguru.io\/", - "description": "Podcast Guru is the simple and free podcast player" -}, { - "user_agents": ["^PodcastRepublic.+Android"], - "app": "PodcastRepublic", - "device": "phone", - "examples": ["PodcastRepublic\/18.0 (Linux; U; Android 10;blueline\/QP1A.190711.020.C3)"], - "os": "android" -}, { - "user_agents": ["podCloud"], - "app": "PodCloud", - "description": "Le podcast, simplement. A French-language web-based podcast player.", - "bot": true, - "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\/ ", - "info_url": "https:\/\/podcloud.fr" -}, { - "user_agents": ["^Podcoin"], - "app": "Podcoin" -}, { - "user_agents": ["^PodCruncher\/.* CFNetwork\/"], - "app": "PodCruncher", - "os": "ios", - "examples": ["PodCruncher\/3.7.1 CFNetwork\/1125.2 Darwin\/19.4.0", "PodCruncher\/3.7.1 CFNetwork\/978.0.7 Darwin\/18.7.0"], - "info_url": "https:\/\/apps.apple.com\/us\/app\/podcruncher-podcast-player\/id421894356" -}, { - "user_agents": ["^Podbean\/Android App", "^Podbean\/Android generic"], - "app": "Podbean", - "os": "android", - "examples": ["Podbean\/Android App 7.6.4 (http:\/\/podbean.com),1927526fe23b5acf535b3e91b64cee95", "Podbean\/Android App 8.1.5 (http:\/\/podbean.com),4f6852f59091d32475ef75a53325a4fe", "Podbean\/Android generic 1.1.2 (http:\/\/podbean.com),9376c517335ded9a716022cc1f15c884"], - "info_url": "https:\/\/play.google.com\/store\/apps\/details?id=com.podbean.app.podcast" -}, { - "user_agents": ["^Podbean\/iOS"], - "app": "Podbean", - "os": "ios", - "examples": ["Podbean\/iOS (http:\/\/podbean.com) 5.2.0 - 19c4ff292bd09cd2ccbad22cc6755a45"], - "info_url": "https:\/\/apps.apple.com\/us\/app\/podbean-podcast-app-player\/id973361050" -}, { - "user_agents": ["podfollowbot\/"], - "app": "Podfollow", - "examples": ["Mozilla\/5.0 https:\/\/podfollow.com\/crawling podfollowbot\/1.0"], - "info_url": "https:\/\/podfollow.com", - "description": "Podfollow, a service to help link to your podcast", - "bot": true -}, { - "user_agents": ["PodderBot\/"], - "examples": ["PodderBot\/1.0"], - "app": "PodderBot", - "bot": true, - "description": "PodderApp bot", - "info_url": "https:\/\/www.podderapp.com\/", - "developer_notes": "PodderApp bot for RSS fetching / verification" -}, { - "user_agents": ["^Podfriend"], - "app": "Podfriend", - "examples": ["Podfriend\/1.0 Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) PodFriend\/0.7.11 Chrome\/83.0.4103.122 Electron\/9.2.0 Safari\/537.36"], - "info_url": "https:\/\/podfriend.com", - "description": "Podfriend Electron app" -}, { - "user_agents": ["^Podhero", "^Swoot\/"], - "app": "Podhero", - "examples": ["Podhero%20Alpha\/4373 CFNetwork\/1197 Darwin\/20.0.0"], - "info_url": "https:\/\/podhero.com", - "description": "Podhero app on iOS and Android." -}, { - "user_agents": ["^Podkicker"], - "app": "Podkicker Pro", - "os": "android" -}, { - "user_agents": ["PodLink"], - "app": "PodLink", - "info_url": "https:\/\/pod.link\/faq\/crawler" -}, { - "user_agents": ["^PodMN\/Android"], - "description": "Minnesota Podcasts Live Here", - "examples": ["PodMN\/Android 1.2.6 (Android 7.1.1; SM-J510FN Build\/NMF26X)"], - "info_url": "https:\/\/play.google.com\/store\/apps\/details?id=com.podmn.app", - "app": "PodMN", - "device": "phone", - "os": "android", - "svg": "podmn.svg" -}, { - "user_agents": ["^PodMN\/iOS"], - "description": "Minnesota Podcasts Live Here", - "examples": ["PodMN\/iOS 1.2.6 (iPhone XR\/13.6.1)"], - "info_url": "https:\/\/apps.apple.com\/us\/app\/podmn\/id1464935818", - "app": "PodMN", - "device": "phone", - "os": "ios", - "svg": "podmn.svg" -}, { - "user_agents": ["PodnewsBot"], - "app": "Podnews", - "bot": true, - "description": "Podnews runs a number of bots to read and test RSS and audio files", - "info_url": "http:\/\/podnews.net" -}, { - "user_agents": ["podnods-crawler", "podnods"], - "app": "Podnods", - "bot": true, - "description": "Podnods is a podcast discovery site. This user agent is for crawling podcast data.", - "info_url": "https:\/\/podnods.com\/about" -}, { - "user_agents": ["^Podurama"], - "app": "Podurama", - "description": "Best free cross-platform podcast app", - "examples": ["Podurama/4.0.8.1 CFNetwork/1390 Darwin/22.0.0"], - "info_url": "https:\/\/podurama.com" -}, { - "user_agents": ["podnods-player"], - "app": "Podnods", - "description": "Podnods is a podcast discovery site. This user agent is for users to sample and play podcasts.", - "info_url": "https:\/\/podnods.com\/about" -}, { - "user_agents": ["^Procast.+iOS"], - "app": "Procast", - "description": "Procast - The Podcast App", - "info_url": "https:\/\/procast.coderocker.de\/", - "os": "ios" -}, { - "user_agents": ["Podwatch-Pro Crawler"], - "app": "PodwatchPro", - "bot": true, - "description": "PodwatchPro is a podcast analytics software. This user agent is for crawling podcast data.", - "info_url": "https:\/\/www.agma-mmc.de\/media-analyse\/ma-podcast" -}, { - "user_agents": ["Podyssey App"], - "app": "Podyssey", - "description": "Podyssey is a community for people that love podcasts. It's like Goodreads, but for podcasts.", - "info_url": "https:\/\/podyssey.fm" -}, { - "user_agents": ["com.toysinboxes.Echo"], - "app": "Podyssey", - "description": "Podyssey is a community for people that love podcasts. It's like Goodreads, but for podcasts.", - "info_url": "https:\/\/podyssey.fm", - "os": "ios" -}, { - "user_agents": ["^Podopolo"], - "app": "Podopolo", - "description": "Listen with passion - connect with purpose", - "info_url": "https:\/\/podopolo.com\/" -}, { - "user_agents": ["fm.podyssey.podcasts"], - "app": "Podyssey", - "description": "Podyssey is a community for people that love podcasts. It's like Goodreads, but for podcasts.", - "info_url": "https:\/\/podyssey.fm", - "os": "android" -}, { - "user_agents": ["python-requests"], - "bot": true -}, { - "user_agents": ["^radio.de\/app.+Android"], - "app": "radio.de", - "os": "android", - "description": "Radio.de is a radio and podcast app in Germany", - "info_url": "https:\/\/www.radio.de\/" -}, { - "user_agents": ["^Radioplayer Android app"], - "app": "RadioPlayer", - "os": "android", - "description": "Radioplayer is a radio and podcast app, with country-specific versions available in selected countries.", - "info_url": "http:\/\/radioplayer.org" -}, { - "user_agents": ["^Radioplayer iOS app"], - "app": "RadioPlayer", - "os": "ios", - "description": "Radioplayer is a radio and podcast app, with country-specific versions available in selected countries.", - "info_url": "http:\/\/radioplayer.org" -}, { - "user_agents": ["^RadioPublic\/android-", "^RadioPublic Android"], - "app": "RadioPublic", - "description": "RadioPublic\u2019s free, easy to use podcast player makes listening to podcasts simple, enjoyable, and fun.", - "examples": ["RadioPublic\/android-2.2"], - "info_url": "https:\/\/radiopublic.com\/", - "svg": "radiopublic.svg", - "os": "android" -}, { - "user_agents": ["RadioPublic iOS", "RadioPublic.+CFNetwork", "^RadioPublic\/iOS"], - "app": "RadioPublic", - "description": "RadioPublic\u2019s free, easy to use podcast player makes listening to podcasts simple, enjoyable, and fun.", - "examples": ["RadioPublic\/iOS-2.0"], - "info_url": "https:\/\/radiopublic.com\/", - "svg": "radiopublic.svg", - "os": "ios" -}, { - "user_agents": ["^Repod\/.+iOS"], - "app": "Repod", - "device": "phone", - "examples": ["Repod\/2.9.0.363 CFNetwork\/1240.0.4 Darwin\/20.6.0 (iPhone\/X iOS\/14.7.1)"], - "os": "ios", - "info_url": "https:\/\/repod.io\/", - "description": "Repod is a social podcast app that helps creators engage, montetization, and grow their community.", - "svg": "repod.svg" -}, { - "user_agents": ["^Repod\/.+Android"], - "app": "Repod", - "device": "phone", - "examples": ["Repod\/2.9.0.221 Mozilla\/5.0 (Linux; Android 11; Pixel 3 Build\/RQ3A.210905.001; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/94.0.4606.85 Mobile Safari\/537.36"], - "os": "android", - "info_url": "https:\/\/repod.io\/", - "description": "Repod is a social podcast app that helps creators engage, montetization, and grow their community.", - "svg": "repod.svg" -}, { - "user_agents": ["request\\.js"], - "bot": true -}, { - "user_agents": ["^Roku\/DVP-"], - "device": "tv", - "os": "roku" -}, { - "user_agents": ["^RSSRadio \\("], - "bot": true -}, { - "user_agents": ["^RSSRadio"], - "app": "RSS Radio", - "device": "phone", - "examples": ["RSSRadio7\/9252 CFNetwork\/1107.1 Darwin\/19.0.0", "RSSRadio\/9710"], - "info_url": "http:\/\/rssrad.io", - "os": "ios" -}, { - "user_agents": ["^Ruby"], - "developer_notes": "The generic Ruby user-agent." -}, { - "user_agents": ["sp-agent"], - "app": "Samsung Free", - "examples": ["sp-agent"], - "device": "phone", - "os": "android", - "info_url": "https:\/\/developer.samsung.com\/podcasts" -}, { - "user_agents": ["SemrushBot\/"], - "app": "SEMrushBot", - "examples": ["Mozilla\/5.0 (compatible; SemrushBot\/6~bl; http:\/\/www.semrush.com\/bot.html)"], - "bot": true -}, { - "user_agents": ["SerendeputyBot\/"], - "app": "Serendeputy", - "examples": ["SerendeputyBot\/0.8.6 (http:\/\/serendeputy.com\/about\/serendeputy-bot)"], - "bot": true, - "info_url": "https:\/\/serendeputy.com\/about\/serendeputy-bot" -}, { - "user_agents": ["^Spotify\/.+Linux"], - "app": "Spotify", - "device": "pc", - "os": "linux" -}, { - "user_agents": ["Macintosh.+Spotify\/", "^Spotify\/.+OSX"], - "app": "Spotify", - "device": "pc", - "os": "macos" -}, { - "user_agents": ["Windows.+Spotify\/", "^Spotify\/.+Win32"], - "app": "Spotify", - "device": "pc", - "os": "windows" -}, { - "user_agents": ["^Spotify\/.+Android"], - "app": "Spotify", - "device": "phone", - "os": "android" -}, { - "user_agents": ["^Spotify\/.+iOS"], - "app": "Spotify", - "device": "phone", - "os": "ios", - "examples": ["Spotify\/8.7.10 iOS\/15.3.1 (iPhone13,2)"] -}, { - "user_agents": ["^Spotify\/1.0$"], - "app": "Spotify cache service", - "bot": true, - "examples": ["Spotify\/1.0"], - "developer_notes": "This useragent, currently simply Spotify\/1.0, is used when retrieving the RSS and audio for Spotify's catalogue. It isn't used for passthru." -}, { - "user_agents": ["Macintosh.*AppleWebKit(?!.*(Chrome\/|GSA\/)).*Safari\/(?!.*(AdsBot\/))"], - "app": "Safari", - "device": "pc", - "os": "macos", - "examples": ["Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit\/605.1.15 (KHTML, like Gecko) Version\/14.0 Safari\/605.1.15"] -}, { - "user_agents": ["Windows.*AppleWebKit(?!.*(Chrome\/)).*Safari\/"], - "app": "Safari", - "device": "pc", - "os": "windows" -}, { - "user_agents": ["iPhone.*AppleWebKit(?!.*(AdsBot|bingbot|CriOS|GSA\/)).*Safari\/"], - "app": "Safari", - "device": "phone", - "os": "ios" -}, { - "user_agents": ["iPad.*AppleWebKit(?!.*(AdsBot|bingbot|CriOS|GSA\/)).*Safari\/"], - "app": "Safari", - "device": "tablet", - "os": "ios" -}, { - "user_agents": ["^Shadow"], - "app": "Shadow", - "os": "ios", - "info_url": "https:\/\/apps.apple.com\/us\/app\/shadow\/id940127690" -}, { - "user_agents": ["^Slack\/"], - "app": "Slack" -}, { - "user_agents": ["^Slackbot 1.0"], - "app": "Slack", - "bot": true, - "examples": ["Slackbot 1.0 ( https:\/\/api.slack.com\/robots)"] -}, { - "user_agents": ["^Snipd\/"], - "app": "Snipd", - "os": "ios", - "info_url": "https:\/\/www.snipd.com\/", - "examples": ["Snipd\/90 CFNetwork\/1329 Darwin\/21.3.0"] -}, { - "user_agents": ["^Subcast"], - "app": "Subcast" -}, { - "user_agents": ["Sonnet","^Simple Podcast Player"], - "app": "Sonnet", - "description": "Sonnet is a simple, easy to use podcast app aimed at new listeners", - "os": "android", - "info_url": "https:\/\/sonnet.fm", - "examples": ["Simple Podcast Player/1.8 (Linux;Android 12) ExoPlayerLib/2.10.1"], - "svg": "sonnet.svg" -}, { - "user_agents": ["Sonos"], - "app": "Sonos", - "device": "speaker", - "os": "sonos" -}, { - "user_agents": ["^Spreaker for Android"], - "app": "Spreaker", - "os": "android" -}, { - "user_agents": ["Spreaker\/"], - "app": "Spreaker" -}, { - "user_agents": ["support@dorada.co.uk"], - "bot": true -}, { - "user_agents": ["^Stitcher\/Android", "^Stitcher Demo\/"], - "examples": ["Stitcher Demo\/4.8.0 (Linux;Android 11) ExoPlayerLib\/2.10.7", "Stitcher\/Android"], - "app": "Stitcher", - "os": "android" -}, { - "user_agents": ["^AlexaMediaPlayer\/Stitcher"], - "app": "Stitcher", - "device": "speaker", - "os": "alexa" -}, { - "user_agents": ["^Stitcher\/iOS"], - "app": "Stitcher", - "os": "ios", - "device": "phone" -}, { - "user_agents": ["^StitcherBot"], - "app": "Stitcher", - "bot": true -}, { - "user_agents": ["^Storiyoh\/"], - "app": "Storiyoh" -}, { - "user_agents": ["^Swinsian\/"], - "app": "Swinsian", - "device": "pc", - "examples": ["Swinsian\/472 CFNetwork\/978.0.7 Darwin\/18.7.0 (x86_64)"], - "info_url": "https:\/\/swinsian.com\/", - "os": "macos" -}, { - "user_agents": ["Timpibot\/"], - "app": "Timpi search crawler", - "bot": true, - "examples": ["Timpibot\/0.8 ( http:\/\/www.timpi.io)"] -}, { - "user_agents": ["TrendsmapResolver\/"], - "app": "Trendsmap Resolver", - "bot": true -}, { - "user_agents": ["^Trackable\/"], - "app": "Chartable", - "info_url": "https:\/\/chartable.com\/", - "bot": true -}, { - "user_agents": ["^TuneIn Radio\/.*;Android"], - "examples": ["TuneIn Radio\/24.2 (Linux;Android 10) ExoPlayerLib\/2.11.4"], - "app": "TuneIn", - "os": "android", - "info_url": "https:\/\/play.google.com\/store\/apps\/details?id=tunein.player" -}, { - "user_agents": ["^TuneIn Radio Pro\/.*;Android"], - "examples": ["TuneIn Radio Pro\/23.3.2 (Linux;Android 5.1.1) ExoPlayerLib\/2.10.7"], - "app": "TuneIn", - "os": "android", - "info_url": "https:\/\/play.google.com\/store\/apps\/details?id=radiotime.player" -}, { - "user_agents": ["^TuneIn(%20| )Radio\/.*(CFNetwork\/|iPhone)"], - "examples": ["TuneIn Radio\/1366 CFNetwork\/1121.2.2 Darwin\/19.3.0", "TuneIn Radio\/18.1; iPhone12,8; iOS\/13.4.1", "TuneIn%20Radio\/1383 CFNetwork\/1125.2 Darwin\/19.4.0"], - "app": "TuneIn", - "os": "ios", - "info_url": "https:\/\/apps.apple.com\/us\/app\/tunein-radio-live-news-music\/id418987775" -}, { - "user_agents": ["^TuneIn(%20| )Radio(%20| )Pro\/.*(CFNetwork\/|iPhone)"], - "examples": ["TuneIn Radio Pro/24.2.1; iPhone13,4; iOS/16.1"], - "app": "TuneIn", - "os": "ios", - "info_url": "https:\/\/apps.apple.com\/us\/app\/tunein-pro-radio-sports\/id319295332" -}, { - "user_agents": ["^TuneIn(?!.*(CFNetwork|Android|iPhone|iPad))"], - "examples": ["TuneIn Radio"], - "app": "TuneIn", - "info_url": "https:\/\/tunein.com\/", - "developer_notes": "Other versions of this app use many other user agents." -}, { - "user_agents": ["^TuneIn\/"], - "examples": ["Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) TuneIn\/1.25.0 Chrome\/69.0.3497.128 Electron\/4.2.8 Safari\/537.36"], - "app": "TuneIn", - "device": "pc", - "info_url": "https:\/\/tunein.com\/", - "developer_notes": "A TuneIn Electron app" -}, { - "user_agents": ["^Twitterbot"], - "bot": true -}, { - "user_agents": ["^Typhoeus"], - "bot": true -}, { - "user_agents": ["^VictorReader Stream"], - "app": "VictorReader", - "device": "speaker", - "os": "victorreader" -}, { - "user_agents": ["^VLC\/\\d"], - "app": "VLC media player", - "device": "pc", - "examples": ["VLC\/3.0.8 LibVLC\/3.0.8"], - "info_url": "https:\/\/www.videolan.org\/vlc\/" -}, { - "user_agents": ["Wget"], - "app": "Wget", - "bot": true -}, { - "user_agents": ["^Winamp"], - "app": "Winamp", - "device": "pc", - "examples": ["WinampMPEG\/2.7"], - "os": "windows" -}, { - "user_agents": ["^NSPlayer", "^WMPlayer\/"], - "app": "Windows Media Player", - "device": "pc", - "examples": ["NSPlayer\/12.00.18362.0418 WMFSDK\/12.00.18362.0418"], - "os": "windows" -}, { - "user_agents": ["^WordPress"], - "bot": true -}, { - "user_agents": ["iPhone.*XING"], - "app": "XING", - "device": "phone", - "os": "ios", - "examples": ["Mozilla\/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) ; iPhone\/13.6 XING\/8.15.2 ttt_webview_iosm"], - "info_url": "https:\/\/www.xing.com\/", - "description": "German version of LinkedIn" -}, { - "user_agents": ["YandexBot\/"], - "app": "YandexBot", - "bot": true -}, { - "user_agents": ["^yapa\/"], - "app": "Yapa" -}, { - "user_agents": ["stagefright\/"], - "os": "android" -}, { - "user_agents": ["^Podimo\/.*iOS"], - "app": "Podimo", - "device": "phone", - "os": "ios", - "examples": ["Podimo\/1.11.3 build 121\/iOS 13.3"], - "info_url": "https:\/\/apps.apple.com\/dk\/app\/podimo-a-world-of-podcasts\/id1476538730" -}, { - "user_agents": ["^Podimo\/.*Android"], - "app": "Podimo", - "device": "phone", - "os": "android", - "examples": ["Podimo\/1.11.3 build 91\/Android 28"], - "info_url": "https:\/\/play.google.com\/store\/apps\/details?id=com.podimo&hl=en_US" -}, { - "user_agents": ["BingPreview\/", "adidxbot\/", "bingbot\/"], - "app": "Microsoft Bingbot", - "bot": true, - "info_url": "https:\/\/www.bing.com\/webmaster\/help\/which-crawlers-does-bing-use-8c184ec0", - "examples": ["Mozilla\/5.0 (Windows NT 6.1; WOW64) AppleWebKit\/534 (KHTML, like Gecko) BingPreview\/1.0b"] -}, { - "user_agents": ["^msnbot\/"], - "bot": true -}, { - "user_agents": ["^Deezer Podcasters\/1\\.0"], - "bot": true, - "app": "Deezer Podcasters" -}, { - "user_agents": ["^devcasts\/.*CFNetwork"], - "app": "DevCasts", - "os": "ios", - "description": "Our Devcasts app is a new kind of podcast listening app. It is simply the best way for developers to enjoy all of the excellent podcast content created for developers.", - "examples": ["devcasts\/1.0.1.00 CFNetwork\/1197 Darwin\/20.0.0"], - "info_url": "http:\/\/devcasts.co\/" -}, { - "user_agents": ["^got\/"], - "bot": true, - "info_url": "https:\/\/play.google.com\/store\/apps\/details?id=com.podimo&hl=en_US", - "developer_notes": "Got is a HTTP library for NodeJs" -}, { - "user_agents": ["INA dlweb"], - "bot": true, - "app": "l'Institut national de l'audiovisuel", - "info_url": "https:\/\/institut.ina.fr\/collecte-du-depot-legal-web", - "developer_notes": "Institut National de l'Audiovisuel is a repository of all French radio and television audiovisual archives." -}, { - "user_agents": ["^Instagram\/"], - "app": "Instagram", - "examples": ["Instagram\/252729634 CFNetwork\/1126 Darwin\/19.5.0"] -}, { - "user_agents": ["^SoundOn\/[\\d.]+s+\\(Linux;Android", "^SoundOn\/[^12]\\.d+\\.d+$", "^SoundOn\/1\\.[^1][^0-2]?\\.d+$"], - "app": "SoundOn", - "device": "phone", - "examples": ["SoundOn\/1.9.17 (Linux;Android 10) ExoPlayerLib\/2.9.4"], - "os": "android" -}, { - "user_agents": ["^SoundOn\/1\\.1[0-2]\\.\\d+$", "^SoundOn\/2\\.\\d+\\.\\d+$", "^SoundOn\/[\\d.]+s+\\(iOS"], - "app": "SoundOn", - "device": "phone", - "examples": ["SoundOn\/1.10.1", "SoundOn\/2.2.0", "SoundOn\/2.2.2 (iOS)"], - "os": "ios" -}, { - "user_agents": ["^SoundOn\/[\\d.]+\\s+\\(bot"], - "bot": true -}, { - "user_agents": ["^Podverse\/.*Android Mobile App"], - "app": "Podverse", - "device": "phone", - "os": "android", - "info_url": "https:\/\/play.google.com\/store\/apps\/details?id=com.podverse&hl=en_US", - "description": "Open source podcast catcher for Android, with clip-sharing, playlists, device syncing and more.", - "examples": ["Podverse/Android Mobile App","Podverse/F-Droid Android Mobile App/","Podverse/Android Mobile App/Mozilla/5.0 (Linux; Android 12; SM-S134DL Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/105.0.5195.136 Mobile Safari/537.36"], - "developer_notes": "The standard device user agent was formerly concatenated to the end of the Podverse\/Android Mobile App\/ user agent." -}, { - "user_agents": ["^Podverse\/iOS Mobile App"], - "app": "Podverse", - "device": "phone", - "os": "ios", - "examples": ["Podverse/iOS Mobile App","Podverse\/iOS Mobile App\/Mozilla\/5.0 (iPhone; CPU iPhone OS 13_6_1 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/1234"], - "description": "Open source podcast catcher for iOS, with clip-sharing, playlists, device syncing and more.", - "info_url": "https:\/\/apps.apple.com\/us\/app\/podverse\/id1390888454", - "developer_notes": "The standard device user agent was formerly concatenated to the end of the Podverse\/iOS Mobile App\/ user agent." -}, { - "user_agents": ["^Podverse\/Feed Parser"], - "bot": true, - "app": "Podverse Feed Parser", - "info_url": "https:\/\/podverse.fm", - "description": "The Podverse feed parser.", - "developer_notes": "This service parses publicly-accessible RSS feeds on a timer, then stores parsed data in the Podverse database." -}, { - "user_agents": ["^Podcast\/1."], - "app": "\u5c0f\u5b87\u5b99", - "info_url": "https:\/\/www.coolapk.com\/apk\/app.podcast.cosmos", - "description": "Cosmos, a chinese podcast app" -}, { - "user_agents": ["^Xiaoyuzhou\/.*Android\/"], - "app": "Xiao Yu Zhou", - "description": "Xiao Yu Zhou, a podcast app", - "os": "android", - "examples": ["Xiaoyuzhou\/1.9.6 Android\/10"] -}, { - "user_agents": ["^Xiaoyuzhou\/(?!.*(Android\/))"], - "app": "Xiao Yu Zhou", - "description": "Xiao Yu Zhou, a podcast app", - "info_url": "https:\/\/apps.apple.com\/cn\/app\/%E5%B0%8F%E5%AE%87%E5%AE%99-%E4%B8%80%E8%B5%B7%E5%90%AC%E6%92%AD%E5%AE%A2\/id1488894313", - "os": "ios", - "examples": ["Xiaoyuzhou\/1.9.0", "Xiaoyuzhou\/1.5.1"] -}, { - "user_agents": ["^yacybot"], - "app": "YaCy", - "bot": true, - "description": "Decentralized Web Search", - "info_url": "http:\/\/yacy.net\/bot.html", - "examples": ["yacybot (\/global; amd64 Linux 5.9.8-zen1-1-zen; java 1.8.0_265; Europe\/de) http:\/\/yacy.net\/bot.html"] -}, { - "user_agents": ["^Podcast-CriticalMention\/"], - "app": "Critical Mention", - "description": "Critical Mention is a business intelligence company, monitoring podcasts on the web for their clients", - "bot": true, - "examples": ["Podcast-CriticalMention\/1.0"] -}, { - "user_agents": ["^RSSOwl.*Windows"], - "app": "RSSOwl", - "description": "A Mac and Windows app, to help organize, search, and read feeds", - "device": "pc", - "os": "windows", - "info_url": "http:\/\/www.rssowl.org\/", - "examples": ["RSSOwl\/2.2.1.201312301314 (Windows; U; en)"] -}, { - "user_agents": ["^ltx71 "], - "app": "LTX71", - "info_url": "http:\/\/ltx71.com\/", - "description": "We continuously scan the internet for security research purposes.", - "bot": true, - "examples": ["ltx71 - (http:\/\/ltx71.com\/)"] -}, { - "user_agents": ["^bl.uk_ldfc_bot"], - "app": "British Library", - "info_url": "http:\/\/www.bl.uk\/aboutus\/legaldeposit\/websites\/websites\/faqswebmaster\/index.html", - "description": "British Library's legal deposit web crawler", - "bot": true, - "examples": ["bl.uk_ldfc_bot\/3.4.0-20200518 ( http:\/\/www.bl.uk\/aboutus\/legaldeposit\/websites\/websites\/faqswebmaster\/index.html)"] -}, { - "user_agents": ["Archive-It;"], - "app": "Internet Archive", - "info_url": "https:\/\/archive-it.org\/files\/site-owners-special.html", - "description": "Archive-It is a web archiving service that allows institutions to build and preserve collections of born digital content saving this content for future generations.", - "bot": true, - "examples": ["Mozilla\/5.0 (compatible; special_archiver; Archive-It; http:\/\/archive-it.org\/files\/site-owners-special.html)"] -}, { - "user_agents": ["VurblBot"], - "app": "Vurbl", - "info_url": "https:\/\/vurbl.com\/about-us\/", - "description": "An audio streaming destination", - "bot": true, - "examples": ["Mozilla\/5.0 https:\/\/vurbl.com VurblBot\/1.0"] -}, { - "user_agents": ["PetalBot"], - "app": "PetalBot", - "info_url": "https:\/\/aspiegel.com\/petalbot", - "description": "PetalBot is an automatic program of the Petal search engine.", - "bot": true, - "examples": ["Mozilla\/5.0 (Linux; Android 7.0;) AppleWebKit\/537.36 (KHTML, like Gecko) Mobile Safari\/537.36 (compatible; PetalBot; https:\/\/aspiegel.com\/petalbot)"] -}, { - "user_agents": ["PodhoundBeta"], - "app": "Podhound", - "info_url": "http:\/\/podhound.co", - "description": "AI-powered podcast discovery", - "bot": true, - "examples": ["PodhoundBeta"], - "developer_notes": "'It grabs it once to get the audio file length.', says the developer." -}, { - "user_agents": ["hermespod.com\/"], - "app": "HermesPod", - "info_url": "http:\/\/hermespod.com\/", - "description": "HermesPod is the easiest way to subscribe, download and listen to podcasts. It's a Windows app.", - "examples": ["hermespod.com\/v1.5.x"], - "developer_notes": "HermesPod is no longer supported by its author." -}, { - "user_agents": ["^gvfs\/", "^rhythmbox\/"], - "app": "Rhythmbox", - "info_url": "https:\/\/gitlab.gnome.org\/GNOME\/rhythmbox", - "description": "Rhythmbox is your one-stop multimedia application, supporting a music library, multiple playlists, internet radio, and more.", - "examples": ["gvfs\/1.46.1"], - "developer_notes": "The new UA is Rhythmbox: https:\/\/gitlab.gnome.org\/GNOME\/rhythmbox\/-\/issues\/1855" -}, { - "user_agents": ["archive.org_bot"], - "app": "Archive.org", - "info_url": "https:\/\/archive.org\/details\/archive.org_bot", - "description": "The Internet Archive is a nonprofit digital library that preserves web data and makes it available for research purposes through the Wayback Machine.", - "bot": true, - "examples": ["Mozilla\/5.0 (compatible; archive.org_bot http:\/\/archive.org\/details\/archive.org_bot)"] -}, { - "user_agents": ["AAABot"], - "app": "AAABot - unknown bot", - "bot": true, - "examples": ["AAABot"] -}, { - "user_agents": ["^MixerBox\/.*Android"], - "app": "MixerBox", - "os": "android", - "examples": ["MixerBox\/12.33 (Linux;Android 11) ExoPlayerLib\/2.11.1"] -}, { - "user_agents": ["^MixerBox\/.*iOS"], - "app": "MixerBox", - "os": "ios", - "examples": ["MixerBox\/807.iOS (iPhone; iOS 14.4; en_US)"] -}, { - "user_agents": ["^Podcastindex\\.org\/"], - "app": "Podcastindex.org", - "bot": true, - "svg": "podcast-index.svg", - "info_url": "https:\/\/podcastindex.org\/", - "examples": ["Podcastindex.org\/v0.3.3 (Aggrivate)"] -}, { - "user_agents": ["^sp-agent"], - "app": "Samsung Podcasts", - "info_url": "https:\/\/developer.samsung.com\/podcasts", - "examples": ["sp-agent"] -}, { - "user_agents": ["^MixerBox\/"], - "app": "Mixerbox", - "info_url": "https:\/\/www.mixerbox.com\/", - "examples": ["MixerBox\/869 CFNetwork\/1300.1 Darwin\/21.0.0"], - "developer_notes": "This app appears to use a RSS useragent of AmazonCloudFront (or it may simply be blank)" -}, { - "user_agents": ["^Tumult"], - "app": "Tumult", - "description": "Et le podcast devient social", - "device": "phone", - "examples": ["Tumult"], - "info_url": "https:\/\/tumult-podcast.com\/" -}, { - "user_agents": ["^Vodacast"], - "app": "Vodacast", - "description": "Podcasts with deeper digital stories", - "device": "phone", - "info_url": "https:\/\/auddiainc.com\/vodacast-app\/" -}, { - "user_agents": ["^Palco MP3"], - "app": "Palco MP3", - "info_url": "https:\/\/www.palcomp3.com.br\/", - "examples": ["Palco MP3\/3.13.18 (Linux;Android 11) ExoPlayerLib\/2.11.0"] -}, { - "user_agents": ["^TheEconomist-Darwin-android"], - "app": "Economist Espresso", - "device": "phone", - "os": "android", - "examples": ["TheEconomist-Darwin-android-2.1.1-master-2999-2001024"] -}, { - "user_agents": ["^TheEconomist-Darwin-ios"], - "app": "Economist Espresso", - "device": "phone", - "os": "ios", - "examples": ["TheEconomist-Darwin-ios-2.1.1-master-2999-2001024"] -}, { - "user_agents": ["^AudioWave iOS"], - "app": "AudioWave", - "device": "phone", - "os": "ios", - "info_url": "https:\/\/apps.apple.com\/be\/app\/audiowave-podcast-player\/id1602776751", - "examples": ["AudioWave iOS"] -}, { - "user_agents": ["iOS VG Hermes\/"], - "examples": ["AppleCoreMedia\/1.0.0.19E239 (iPhone; U; CPU OS 15_4 like Mac OS X; sv_se) iOS VG Hermes\/90.0.0 _app_"], - "app": "VG iOS app", - "description": "VG iOS app", - "os": "ios" -}, { - "user_agents": ["iOS Aftonbladet Hermes\/"], - "examples": ["AppleCoreMedia\/1.0.0.19E239 (iPhone; U; CPU OS 15_4 like Mac OS X; sv_se) iOS Aftonbladet Hermes\/90.0.0 _app_"], - "app": "Aftonbladet iOS app", - "description": "Aftonbladet iOS app", - "os": "ios" -}, { - "user_agents": ["iOS Sportbladet Hermes\/"], - "examples": ["AppleCoreMedia\/1.0.0.19E239 (iPhone; U; CPU OS 15_4 like Mac OS X; sv_se) iOS Sportbladet Hermes\/90.0.0 _app_"], - "app": "Sportbladet iOS app", - "description": "Sportbladet iOS app", - "os": "ios" -}, { - "user_agents": ["iOS AP Hermes\/"], - "examples": ["AppleCoreMedia\/1.0.0.19E239 (iPhone; U; CPU OS 15_4 like Mac OS X; sv_se) iOS AP Hermes\/90.0.0 _app_"], - "app": "Aftenposten iOS app", - "description": "Aftenposten iOS app", - "os": "ios" -}, { - "user_agents": ["iOS BT Hermes\/"], - "examples": ["AppleCoreMedia\/1.0.0.19E239 (iPhone; U; CPU OS 15_4 like Mac OS X; sv_se) iOS BT Hermes\/90.0.0 _app_"], - "app": "Bergens Tidende iOS app", - "description": "Bergens Tidende iOS app", - "os": "ios" -}, { - "user_agents": ["iOS SA Hermes\/"], - "examples": ["AppleCoreMedia\/1.0.0.19E239 (iPhone; U; CPU OS 15_4 like Mac OS X; sv_se) iOS SA Hermes\/90.0.0 _app_"], - "app": "Stavanger Aftenblad iOS app", - "description": "Stavanger Aftenblad iOS app", - "os": "ios" -}, { - "user_agents": ["iOS SvD Hermes\/"], - "examples": ["AppleCoreMedia\/1.0.0.19E239 (iPhone; U; CPU OS 15_4 like Mac OS X; sv_se) iOS SvD Hermes\/90.0.0 _app_"], - "app": "Svenska Dagbladet iOS app", - "description": "Svenska Dagbladet iOS app", - "os": "ios" -}, { - "user_agents": ["iOS E24 Hermes\/"], - "examples": ["AppleCoreMedia\/1.0.0.19E239 (iPhone; U; CPU OS 15_4 like Mac OS X; sv_se) iOS E24 Hermes\/90.0.0 _app_"], - "app": "E24 iOS app", - "description": "E24 iOS app", - "os": "ios" -}, { - "user_agents": ["iOS Askoyvaringen Hermes\/"], - "examples": ["AppleCoreMedia\/1.0.0.19E239 (iPhone; U; CPU OS 15_4 like Mac OS X; sv_se) iOS Askoyvaringen Hermes\/90.0.0 _app_"], - "app": "Askoyvaringen iOS app", - "description": "Askoyvaringen iOS app", - "os": "ios" -}, { - "user_agents": ["iOS Bygdanytt Hermes\/"], - "examples": ["AppleCoreMedia\/1.0.0.19E239 (iPhone; U; CPU OS 15_4 like Mac OS X; sv_se) iOS Bygdanytt Hermes\/90.0.0 _app_"], - "app": "Bygdanytt iOS app", - "description": "Bygdanytt iOS app", - "os": "ios" -}, { - "user_agents": ["iOS Strilen Hermes\/"], - "examples": ["AppleCoreMedia\/1.0.0.19E239 (iPhone; U; CPU OS 15_4 like Mac OS X; sv_se) iOS Strilen Hermes\/90.0.0 _app_"], - "app": "Strilen iOS app", - "description": "Strilen iOS app", - "os": "ios" -}, { - "user_agents": ["iOS Vestnytt Hermes\/"], - "examples": ["AppleCoreMedia\/1.0.0.19E239 (iPhone; U; CPU OS 15_4 like Mac OS X; sv_se) iOS Vestnytt Hermes\/90.0.0 _app_"], - "app": "Vestnytt iOS app", - "description": "Vestnytt iOS app", - "os": "ios" -}, { - "user_agents": ["Android VG Hermes\/"], - "examples": ["Android VG Hermes/1000094692 app vg_app_ VG/Snarvei/1000094692 VG-App"], - "app": "VG Android app", - "description": "VG Android app", - "os": "android" -}, { - "user_agents": ["Android Aftonbladet Hermes\/"], - "examples": ["Android Aftonbladet Hermes/1000094692 _app_"], - "app": "Aftonbladet Android app", - "description": "Aftonbladet Android app", - "os": "android" -},{ - "user_agents": ["Android Sportbladet Hermes\/"], - "examples": ["Android Sportbladet Hermes/1000094692 _app_"], - "app": "Sportbladet Android app", - "description": "Sportbladet Android app", - "os": "android" -}, { - "user_agents": ["Android AP Hermes\/"], - "examples": ["Android AP Hermes/1000094692 _app_"], - "app": "Aftenposten Android app", - "description": "Aftenposten Android app", - "os": "android" -}, { - "user_agents": ["Android BT Hermes\/"], - "examples": ["Android BT Hermes/1000094692 _app_"], - "app": "Bergens Tidende Android app", - "description": "Bergens Tidende Android app", - "os": "android" -}, { - "user_agents": ["Android SA Hermes\/"], - "examples": ["Android SA Hermes/1000094692 _app_"], - "app": "Stavanger Aftenblad Android app", - "description": "Stavanger Aftenblad Android app", - "os": "android" -}, { - "user_agents": ["SvD Hermes\/"], - "examples": ["SvD Hermes/999999999 _app_"], - "app": "Svenska Dagbladet Android app", - "description": "Svenska Dagbladet Android app", - "os": "android" -}, { - "user_agents": ["Android E24 Hermes\/"], - "examples": ["Android E24 Hermes/1000094692 _app_"], - "app": "E24 Android app", - "description": "E24 Android app", - "os": "android" -}, { - "user_agents": ["^Riddler "], - "examples": ["Riddler (http:\/\/riddler.io\/about)"], - "app": "F-Secure Riddler", - "description": "an online research project which investigates algorithms for mapping the topology of the Internet", - "bot": true -}, { - "user_agents": ["^RSStT"], - "examples": ["RSStT\/2.2.1 RSS Reader"], - "app": "RSS to Telegram", - "description": "an RSS to Telegram bot", - "info_url": "https:\/\/apps.apple.com\/be\/app\/audiowave-podcast-player\/id1602776751", - "bot": true -}, { - "user_agents": ["^Newsly"], - "examples": ["Newsly"], - "app": "Newsly", - "device": "phone", - "description": "Stop Scrolling, Start Listening.", - "info_url": "https:\/\/www.newsly.me\/" -}, { - "user_agents": ["KaiOS Downloader"], - "examples": ["KaiOS Downloader"], - "os": "kaios", - "device": "phone", - "developer_notes": "This is the KaiOS Downloader library, and this could refer to any app on this platform" -}, { - "user_agents": ["CPod\/"], - "examples": ["CPod\/1.27.1 (github.com\/z-------------)"], - "info_url": "https:\/\/github.com\/z-------------\/CPod", - "app": "CPod", - "device": "pc", - "description": "A simple, beautiful podcast app, for Windows, MacOS and Linux" -}, { - "user_agents": ["DataForSeoBot\/"], - "examples": ["Mozilla\/5.0 (compatible; DataForSeoBot\/1.0; +https:\/\/dataforseo.com\/dataforseo-bot)"], - "info_url": "https:\/\/dataforseo.com\/dataforseo-bot", - "app": "DataforSEO", - "bot": true, - "description": "Working on the biggest available backlink database on the web that every single member of the community, including you, can use and benefit from." -}, { - "user_agents": ["Bullhorn\/"], - "examples": ["Bullhorn\/1.0 (+http:\/\/bullhorn.fm\/)"], - "info_url": "http:\/\/bullhorn.fm\/", - "app": "Bullhorn" -}, { - "user_agents": ["gPodder\/.*Linux"], - "examples": ["gPodder\/3.10.21 (+http:\/\/gpodder.org\/) Linux", "gPodder\/3.10.15 (+http:\/\/gpodder.org\/) Linux\/5.4.0-74-generic", "gPodder\/3.10.15 (+http:\/\/gpodder.org\/) Linux\/5.4.0-90-generic", "gPodder\/3.10.17 (+http:\/\/gpodder.org\/) Linux\/5.11.0-49-generic"], - "info_url": "http:\/\/gpodder.org\/", - "app": "gPodder", - "device": "pc" -}, { - "user_agents": ["AirableBot-Podcast\/"], - "examples": ["AirableBot-Podcast\/1.0 (+https\/\/www.airablenow.com)"], - "info_url": "https\/\/www.airablenow.com", - "bot": true, - "description": "An aggregator of internet radio and podcasts, for connected devices." -}, { - "user_agents": ["Podcorn\/"], - "examples": ["Podcorn\/1.0"], - "info_url": "https:\/\/podcorn.com\/", - "bot": true, - "description": "The leading podcast influencer marketplace. Connecting unique voices to unique brands for native advertising." -}, { - "user_agents": ["RedCircle"], - "examples": ["RedCircle"], - "info_url": "https:\/\/redcircle.com\/", - "bot": true, - "app": "RedCircle", - "description": "A platform for podcasts and brands to scale their message." -}, { - "user_agents": ["ProCast"], - "examples": ["ProCast\/1 CFNetwork\/1240.0.4 Darwin\/20.6.0"], - "info_url": "https:\/\/podcast-app.de\/", - "description": "The new generation of Podcast player." -}, { - "user_agents": ["AnchorImport"], - "examples": ["AnchorImport\/1.0"], - "description": "Anchor's tool for importing podcasts", - "bot": true, - "developer_notes": "This useragent is used during a user importing a podcast to the Anchor platform" -}, { - "user_agents": ["^Podio\/"], - "examples": ["Podio\/1.0"], - "description": "Podcasts + Radio = Podio", - "info_url": "https:\/\/podio.radio\/", - "bot": true, - "developer_notes": "This useragent appears to download and cache audio" -}, { - "user_agents": ["^Playapod"], - "app": "Playapod", - "examples": ["Playapod/2.4.11"], - "description": "Best Cross-Platform Podcast and News App", - "info_url": "https:\/\/playapod.com\/" -}, { - "user_agents": ["Zune\/"], - "app": "Zune", - "examples": ["Zune\/4.8"] -}, { - "user_agents": ["Headliner\/"], - "app":"Headliner", - "examples": ["Headliner/1.0.0 +https://headliner.app"], - "bot":true, - "developer_notes": "A tool that takes audio to reformat it for video platforms" -}, { - "user_agents": ["Iframely\/"], - "app":"Iframely", - "examples": ["Iframely/1.3.1 (+https://iframely.com/docs/about)"], - "info_url": "https:\/\/iframely.com\/docs\/about" -}, { - "user_agents": ["^(radio\\.[a-zA-Z]{2,3}|GetPodcast) [0-9]+.[0-9]+.[0-9]+ \\([a-zA-Z]+;( iPhone OS)? .+; .+\\)$"], - "app": "radio.net", - "device": "phone", - "os": "ios", - "info_url": "https:\/\/www.radio.net\/", - "examples": ["radio.fr 5.6.22 (iPhone; iPhone OS 16.4; fr_FR)", "radio.de 5.6.22 (iPad; iPhone OS 16.4; de_DE)", "radio.de 5.6.22 (iPhone; iPhone OS 16.4; de_DE)", "radio.net 5.7.3 (iPhone; iPhone OS 17.0.1; fr_FR)", "GetPodcast 5.6.22 (iPhone; iPhone OS 16.4; de_DE)", "GetPodcast 5.6.22 (iPhone; 16.4; de_DE)"] -}, { - "user_agents": ["^(radio\\.[a-zA-Z]{2,3}|GetPodcast)( |\\/)[0-9]+(\\.[0-9]+){3} \\([a-zA-Z]+;( ?(Android))? [\\.\\d]+(; [a-z]{1,3}(\\_|\\-)[a-zA-Z]{2,4})?\\)( ExoPlayerLib\\/[\\.\\d].+)?$"], - "app": "radio.net", - "device": "phone", - "os": "android", - "info_url": "https:\/\/www.radio.net\/", - "examples": ["radio.de/5.10.5.3 (Linux; 13) ExoPlayerLib/2.18.2", "radio.de/5.10.3.0 (Linux;Android 13) ExoPlayerLib/2.18.2", "radio.de/5.10.5.3 (Linux; Android 13) ExoPlayerLib/2.18.2", "radio.de/5.10.5.3 (Linux; Android 13; de_DE) ExoPlayerLib/2.18.2", "radio.de/5.10.5.3 (Linux; Android 13; zn-Hans) ExoPlayerLib/2.18.2", "GetPodcast/5.10.5.3 (Linux; Android 13; de_DE) ExoPlayerLib/2.18.2"] -}, { - "user_agents": ["^SYOK.+(iOS|Darwin)"], - "app": "SYOK", - "device": "phone", - "os": "ios", - "info_url": "https:\/\/syok.my\/", - "examples": ["SYOK/965 CFNetwork/1406.0.4 Darwin/22.4.0"] -}] diff --git a/data/referrers.runtime.json b/data/referrers.runtime.json new file mode 100644 index 000000000..415977805 --- /dev/null +++ b/data/referrers.runtime.json @@ -0,0 +1,325 @@ +{ + "entries": [ + { + "name": "Alitu Web Player", + "pattern": "://[^./]+\\.alitu\\.com/", + "category": "host" + }, + { + "name": "Amazon Music", + "pattern": "^https://music\\.amazon\\.", + "category": "app" + }, + { + "name": "Apple Podcasts", + "pattern": "^https://(embed\\.)?podcasts\\.apple\\.com", + "category": "app" + }, + { + "name": "Audible", + "pattern": "://www\\.audible(\\.com|\\.co\\.uk)/", + "category": "app" + }, + { + "name": "Buzzsprout Web Player", + "pattern": "://[^./]+\\.buzzsprout\\.com/", + "category": "host" + }, + { + "name": "Captivate Web Player", + "pattern": "://player\\.captivate\\.fm/", + "category": "host" + }, + { + "name": "Castamatic", + "pattern": "://castamatic\\.com/", + "category": "app" + }, + { + "name": "CastBox", + "pattern": "^https://castbox\\.fm/", + "category": "app" + }, + { + "name": "Castos Web Player", + "pattern": "^https://[a-z0-9]+\\.castos\\.com/", + "category": "host" + }, + { + "name": "Castro", + "pattern": "^https://castro\\.fm/", + "category": "app" + }, + { + "name": "Chartable", + "pattern": "://link\\.chtbl\\.com/" + }, + { + "name": "CurioCaster", + "pattern": "://curiocaster\\.com/", + "category": "app" + }, + { + "name": "Czech Podcasts", + "pattern": "^https://ceskepodcasty\\.cz/" + }, + { + "name": "Deezer", + "pattern": "^https://www\\.deezer\\.com/", + "category": "app" + }, + { + "name": "Discord", + "pattern": "://[^/]+\\.discordsays\\.com/", + "category": "app" + }, + { + "name": "Facebook", + "pattern": "^https?://(lm|m|www|l)\\.facebook\\.com/", + "category": "app" + }, + { + "name": "Feedly", + "pattern": "://feedly\\.com/", + "category": "app" + }, + { + "name": "Feedspot", + "pattern": "://[^./]+\\.feedspot\\.com/", + "category": "app" + }, + { + "name": "Fountain", + "pattern": "://fountain\\.fm/", + "category": "app" + }, + { + "name": "Gaana", + "pattern": "^https://gaana\\.com/", + "category": "app" + }, + { + "name": "Goodpods", + "pattern": "^https://(www\\.)?goodpods\\.com", + "category": "app" + }, + { + "name": "Google Podcasts", + "pattern": "^https://podcasts\\.google\\.com/", + "category": "app" + }, + { + "name": "Headliner", + "pattern": "^https\\://((make|disco|eddy|play)\\.)?headliner\\.(app|link)/", + "category": "app" + }, + { + "name": "iHeartRadio", + "pattern": "^https://www\\.iheart\\.com/", + "category": "app" + }, + { + "name": "Inoreader", + "pattern": "://www\\.inoreader\\.com/", + "category": "app" + }, + { + "name": "iVoox", + "pattern": "://www\\.ivoox\\.com/", + "category": "app" + }, + { + "name": "Jam", + "pattern": "://www\\.jam\\.ai/", + "category": "app" + }, + { + "name": "JustCast", + "pattern": "://[^./]+\\.justcast\\.com/", + "category": "host" + }, + { + "name": "Kajabi", + "pattern": "kajabi\\.com/?$", + "category": "host" + }, + { + "name": "LinkedIn", + "pattern": "^https://www\\.linkedin\\.com/", + "category": "app" + }, + { + "name": "Listen Notes", + "pattern": "^https://www\\.listennotes\\.com/" + }, + { + "name": "LN Beats", + "pattern": "://lnbeats\\.com/", + "category": "app" + }, + { + "name": "Luminary", + "pattern": "://luminarypodcasts\\.com/", + "category": "app" + }, + { + "name": "Megaphone", + "pattern": "://[^./]+\\.megaphone\\.fm/", + "category": "host" + }, + { + "name": "Mixcloud", + "pattern": "^https://www\\.mixcloud\\.com/", + "category": "app" + }, + { + "name": "Overcast", + "pattern": "^https://overcast\\.fm/", + "category": "app" + }, + { + "name": "Pandora", + "pattern": "^https://(\\w*\\.)?pandora\\.com/", + "category": "app" + }, + { + "name": "Parler", + "pattern": "^https://(www\\.|app\\.)?parler\\.com", + "category": "app" + }, + { + "name": "Playapod", + "pattern": "://playapod\\.com/", + "category": "app" + }, + { + "name": "Player FM", + "pattern": "^https://(\\w*\\.)?player\\.fm/", + "category": "app" + }, + { + "name": "Pocket Casts", + "pattern": "://play\\.pocketcasts\\.com/|://pca\\.st/", + "category": "app" + }, + { + "name": "Podbay", + "pattern": "^https?://(old\\.)?podbay\\.fm/", + "category": "app" + }, + { + "name": "Podbean", + "pattern": "^https://www\\.podbean\\.com/", + "category": "host" + }, + { + "name": "Podcast Addict", + "pattern": "^https://(www\\.)?podcastaddict\\.com", + "category": "app" + }, + { + "name": "Podcast Index", + "pattern": "^https://podcastindex\\.org" + }, + { + "name": "Podcast.app", + "pattern": "^https://podcast\\.app/", + "category": "app" + }, + { + "name": "Podchaser", + "pattern": "https://www\\.podchaser\\.com/", + "category": "app" + }, + { + "name": "Podfriend", + "pattern": "://[^./]+\\.podfriend\\.com/", + "category": "app" + }, + { + "name": "PodGrabber", + "pattern": "://podgrabber\\.com/", + "category": "app" + }, + { + "name": "PodLink", + "pattern": "//pod\\.link/", + "category": "app" + }, + { + "name": "Podmust", + "pattern": "://podmust\\.com/", + "category": "app" + }, + { + "name": "Podplay", + "pattern": "podplay\\.com", + "category": "app" + }, + { + "name": "Podtail", + "pattern": "^https://podtail\\.com/", + "category": "app" + }, + { + "name": "Podverse", + "pattern": "://podverse\\.fm/", + "category": "app" + }, + { + "name": "Podvine", + "pattern": "://podvine\\.com/", + "category": "host" + }, + { + "name": "Podyssey", + "pattern": "^https://podyssey\\.fm/", + "category": "app" + }, + { + "name": "Radioline", + "pattern": "://www\\.radioline\\.co/", + "category": "app" + }, + { + "name": "RadioPublic", + "pattern": "://(embed\\.)?radiopublic\\.com/", + "category": "app" + }, + { + "name": "Simplecast", + "pattern": "://player\\.simplecast\\.com/", + "category": "host" + }, + { + "name": "Spotify", + "pattern": "https://(open|api-partner)\\.spotify\\.com", + "category": "app" + }, + { + "name": "Stitcher", + "pattern": "^https://(www|app|classic)\\.stitcher\\.com/", + "category": "app" + }, + { + "name": "Transistor Web Player", + "pattern": "://([^./]+\\.)?transistor\\.fm/", + "category": "host" + }, + { + "name": "TrueFans", + "pattern": "://(pod|true)fans\\.fm/", + "category": "app" + }, + { + "name": "TuneIn", + "pattern": "^https://tunein\\.com/", + "category": "app" + }, + { + "name": "Wix", + "pattern": "^https://podcasts\\.wixapps\\.net", + "category": "host" + } + ] +} \ No newline at end of file diff --git a/lib/model/user_agent.php b/lib/model/user_agent.php index 79d98fb23..e1763dade 100644 --- a/lib/model/user_agent.php +++ b/lib/model/user_agent.php @@ -20,47 +20,46 @@ public static function reparse_all() */ public function parse() { - // parse with opawg - $data_file = \Podlove\PLUGIN_DIR.'data/opawg.json'; - $data_raw = file_get_contents($data_file); - $user_agent_data = json_decode($data_raw); - $user_agent_data = apply_filters('podlove_useragent_opawg_data', $user_agent_data); - - if (!$user_agent_data) { - error_log('[Podlove Publisher] OPAWG data file is invalid JSON'); - - // fallback to DeviceDetector parser - return $this->parse_by_device_detector(); - } - - $user_agent_string = $this->user_agent; - - $user_agent_match = array_reduce($user_agent_data, function ($agg, $item) use ($user_agent_string) { - if ($agg !== null) { - return $agg; - } - - foreach ($item->user_agents as $regex) { - $compiled_regex = str_replace('/', '\/', $regex); - if (preg_match("/{$compiled_regex}/", $user_agent_string) === 1) { - return $item; - } + [ + 'bot' => $bot, + 'client_name' => $client_name, + 'type' => $type + ] = self::find_opawg_client($this->user_agent); + + if ($client_name != null) { + $this->bot = $bot; + $this->client_name = $client_name; + + // if it's not a bot, find device + if (!$this->bot) { + [ + 'device_category' => $device_category, + 'name' => $name + ] = self::find_opawg_device($this->user_agent); + + $this->client_type = $device_category; + $this->device_model = $name; } - return $agg; - }, null); + $referer = filter_var($_SERVER['HTTP_REFERER'] ?? '', FILTER_VALIDATE_URL); - if ($user_agent_match) { - $this->client_name = isset($user_agent_match->app) ? $user_agent_match->app : ''; - $this->os_name = isset($user_agent_match->os) ? self::normalizeOS($user_agent_match->os) : ''; + if ($type == 'browsers' && $referer !== false) { + ['name' => $referrer_name] = self::find_opawg_referrer($referer); - if (isset($user_agent_match->bot) && $user_agent_match->bot) { - $this->bot = 1; + // I should probably save this separately, but let's be + // pragmatic and not write a database migration for now. I a + // user listens via Apple Podcasts on Safari, the interesting + // bit for the podcaster os the app/platform, not the browser. + // So let's override it for the moment. + if ($referrer_name) { + $this->client_name = $referrer_name.' (Web)'; + } } return $this; } + // TODO: simplify, get rid of DeviceDetector // fallback to DeviceDetector parser return $this->parse_by_device_detector(); } @@ -102,6 +101,61 @@ public static function normalizeOS($os_name) return $map[trim(strtolower($os_name))] ?? $os_name; } + private static function find_opawg_client($user_agent) + { + $types = ['bots', 'apps', 'libraries', 'browsers']; + + foreach ($types as $type) { + $user_agent_data = self::read_opawg_file($type); + foreach ($user_agent_data->entries as $entry) { + $compiled_regex = str_replace('/', '\/', $entry->pattern); + if (preg_match("/{$compiled_regex}/", $user_agent) === 1) { + return [ + 'bot' => $type == 'bots', + 'client_name' => $entry->name, + 'type' => $type + ]; + } + } + } + + return ['bot' => false, 'client_name' => null, 'type' => null]; + } + + private static function find_opawg_device($user_agent) + { + $user_agent_data = self::read_opawg_file('devices'); + foreach ($user_agent_data->entries as $entry) { + $compiled_regex = str_replace('/', '\/', $entry->pattern); + if (preg_match("/{$compiled_regex}/", $user_agent) === 1) { + return ['device_category' => $entry->category, 'name' => $entry->name]; + } + } + + return ['device_category' => null, 'name' => null]; + } + + private static function find_opawg_referrer($referer) + { + $user_agent_data = self::read_opawg_file('referrers'); + foreach ($user_agent_data->entries as $entry) { + $compiled_regex = str_replace('/', '\/', $entry->pattern); + if (preg_match("/{$compiled_regex}/", $referer) === 1) { + return ['name' => $entry->name]; + } + } + + return ['name' => null]; + } + + private static function read_opawg_file($name) + { + $data_file = \Podlove\PLUGIN_DIR.'data/'.$name.'.runtime.json'; + $data_raw = file_get_contents($data_file); + + return json_decode($data_raw); + } + private function parse_by_device_detector() { $dd = new DeviceDetector($this->user_agent);