]> gitweb.factorcode.org Git - factor.git/commitdiff
itunes: Add a way to query top podcasts from itunes.
authorDoug Coleman <doug.coleman@gmail.com>
Mon, 21 Dec 2020 02:15:16 +0000 (20:15 -0600)
committerDoug Coleman <doug.coleman@gmail.com>
Mon, 21 Dec 2020 15:15:58 +0000 (09:15 -0600)
extra/itunes/itunes.factor [new file with mode: 0644]

diff --git a/extra/itunes/itunes.factor b/extra/itunes/itunes.factor
new file mode 100644 (file)
index 0000000..5b646df
--- /dev/null
@@ -0,0 +1,158 @@
+! Copyright (C) 2020 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors assocs biassocs combinators formatting
+http.client json.reader kernel literals sequences ;
+IN: itunes
+
+ERROR: http-get-error url res json ;
+
+: get-json ( url -- json )
+    dup http-get over code>> 200 = [
+        2nip json>
+    ] [
+        http-get-error
+    ] if ;
+
+: ?key ( key assoc -- key ? ) dupd key? ; inline
+
+: find-first-value ( assoc keys -- value key )
+    [ of ] with map-find ; inline
+
+CONSTANT: apple-languages $[
+    H{
+        { "af" "Afrikaans" }
+        { "sq" "Albanian" }
+        { "sq" "Albanian" }
+        { "eu" "Basque" }
+        { "be" "Belarusian" }
+        { "bg" "Bulgarian" }
+        { "ca" "Catalan" }
+        { "Chinese (Simplified)" "zh-cn" }
+        { "Chinese (Traditional)" "zh-tw" }
+        { "hr" "Croatian" }
+        { "cs" "Czech" }
+        { "da" "Danish" }
+        { "nl" "Dutch" }
+        { "nl-be" "Dutch (Belgium)" }
+        { "nl-nl" "Dutch (Netherlands)" }
+        { "en" "English" }
+        { "en-au" "English (Australia)" }
+        { "en-bz" "English (Belize)" }
+        { "en-ca" "English (Canada)" }
+        { "en-ie" "English (Ireland)" }
+        { "en-jm" "English (Jamaica)" }
+        { "en-nz" "English (New Zealand)" }
+        { "en-ph" "English (Phillipines)" }
+        { "en-za" "English (South Africa)" }
+        { "en-tt" "English (Trinidad)" }
+        { "en-gb" "English (United Kingdom)" }
+        { "en-us" "English (United States)" }
+        { "en-zw" "English (Zimbabwe)" }
+        { "et" "Estonian" }
+        { "fo" "Faeroese" }
+        { "fi" "Finnish" }
+        { "fr" "French" }
+        { "fr-be" "French (Belgium)" }
+        { "fr-ca" "French (Canada)" }
+        { "fr-fr" "French (France)" }
+        { "fr-lu" "French (Luxembourg)" }
+        { "fr-mc" "French (Monaco)" }
+        { "fr-ch" "French (Switzerland)" }
+        { "gl" "Galician" }
+        { "gd" "Gaelic" }
+        { "de" "German" }
+        { "de-at" "German (Austria)" }
+        { "de-de" "German (Germany)" }
+        { "de-li" "German (Liechtenstein)" }
+        { "de-lu" "German (Luxembourg)" }
+        { "de-ch" "German (Switzerland)" }
+        { "el" "Greek" }
+        { "haw" "Hawaiian" }
+        { "hu" "Hungarian" }
+        { "is" "Icelandic" }
+        { "in" "Indonesian" }
+        { "ga" "Irish" }
+        { "it" "Italian" }
+        { "it-it" "Italian (Italy)" }
+        { "it-ch" "Italian (Switzerland)" }
+        { "ja" "Japanese" }
+        { "ko" "Korean" }
+        { "mk" "Macedonian" }
+        { "no" "Norwegian" }
+        { "pl" "Polish" }
+        { "pt" "Portugese" }
+        { "pt-br" "Portugese (Brazil)" }
+        { "pt-pt" "Portugese (Portugal" }
+        { "ro" "Romanian" }
+        { "ro-mo" "Romanian (Moldova)" }
+        { "ro-ro" "Romanian (Romania" }
+        { "ru" "Russian" }
+        { "ru-mo" "Russian (Moldova)" }
+        { "ru-ru" "Russian (Russia)" }
+        { "sr" "Serbian" }
+        { "sk" "Slovak" }
+        { "sl" "Slovenian" }
+        { "es" "Spanish" }
+        { "es-ar" "Spanish (Argentinia)" }
+        { "es=bo" "Spanish (Bolivia)" }
+        { "es-cl" "Spanish (Chile)" }
+        { "es-co" "Spanish (Colombia)" }
+        { "es-cr" "Spanish (Costa Rica)" }
+        { "es-do" "Spanish (Dominican Republic)" }
+        { "es-ec" "Spanish (Ecuador)" }
+        { "es-sv" "Spanish (El Salvador)" }
+        { "es-gt" "Spanish (Guatemala)" }
+        { "es-hn" "Spanish (Honduras)" }
+        { "es-mx" "Spanish (Mexico)" }
+        { "es-ni" "Spanish (Nicaragua)" }
+        { "es-pa" "Spanish (Panama)" }
+        { "es-py" "Spanish (Paraguay)" }
+        { "es-pe" "Spanish (Peru)" }
+        { "es-pr" "Spanish (Puerto Rico)" }
+        { "es-es" "Spanish (Spain)" }
+        { "es-uy" "Spanish (Uruguay)" }
+        { "es-ve" "Spanish (Venezuela)" }
+        { "sv" "Swedish" }
+        { "sv-fi" "Swedish (Finland)" }
+        { "sv-se" "Swedish (Sweden)" }
+        { "tr" "Turkish" }
+        { "uk" "Ukranian" }
+    } >biassoc
+]
+
+: >language-code ( name/code -- abbrev )
+    apple-languages from>> ?key [ ] [ apple-languages to>> ?at drop ] if ;
+
+: search-apple-podcasts ( terms -- json )
+    "https://itunes.apple.com/search?media=podcast&term=%s" sprintf get-json ;
+
+! https://podcasts.apple.com/de/genre/podcasts/id26
+
+: >top-apple-podcasts ( hash -- json )
+    {
+        [ { "language" "code" } find-first-value drop >language-code "US" or ]
+        [ { "genre" } find-first-value drop "26" or ] ! Genre "26" is "top"
+        [ { "limit" } find-first-value drop "10" or ]
+        [ { "explicit" } find-first-value drop "true" or ]
+    } cleave
+    "https://itunes.apple.com/%s/rss/toppodcasts/genre=%s/limit=%s/explicit=%s/json"
+    sprintf get-json  ;
+
+: top-100-apple-podcasts ( code/f -- json )
+    "US" or
+    'H{
+        { "limit" "100" }
+        { "code" _ }
+        { "explicit" "true" }
+        { "genre" "26" }
+    } >top-apple-podcasts ;
+
+: id>podcast ( id -- podcast )
+    "https://itunes.apple.com/lookup?id=%s" sprintf get-json ;
+
+
+! TODO
+! https://rss.itunes.apple.com/api/v1/us/apple-music/coming-soon/all/10/explicit.json
+! https://rss.itunes.apple.com/api/v1/us/podcasts/top-podcasts/all/10/explicit.json
+! https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewTop?genreId=26&popId=28
+! https://affiliate.itunes.apple.com/resources/documentation/itunes-store-web-service-search-api/