From af44bea64a1b7f799a50f0509c0ae010a0405158 Mon Sep 17 00:00:00 2001 From: Nasko Vasilev Date: Thu, 12 Dec 2024 18:07:35 +0100 Subject: [PATCH 01/11] Add "format" to the "imageUrlHash" field in the OpenAPI spec because it is a 64 bit integer (https://github.com/Podcastindex-org/docs-api/issues/135) --- api_src/components/properties/imageUrlHash.yaml | 4 ++-- docs/pi_api.json | 3 ++- docs/pi_api.yaml | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/api_src/components/properties/imageUrlHash.yaml b/api_src/components/properties/imageUrlHash.yaml index 200ce33..2423173 100644 --- a/api_src/components/properties/imageUrlHash.yaml +++ b/api_src/components/properties/imageUrlHash.yaml @@ -1,5 +1,5 @@ # language=Markdown description: | - A CRC32 hash of the `image` URL with the protocol (`http://`, `https://`) removed. + A CRC32 hash of the `image` URL with the protocol (`http://`, `https://`) removed. 64bit integer. type: integer -example: 1639321931 +example: 3969216649 diff --git a/docs/pi_api.json b/docs/pi_api.json index da3bc19..8a3677e 100644 --- a/docs/pi_api.json +++ b/docs/pi_api.json @@ -2685,7 +2685,8 @@ "imageUrlHash": { "description": "A CRC32 hash of the `image` URL with the protocol (`http://`, `https://`) removed.\n", "type": "integer", - "example": 1639321931 + "format": "int64", + "example": 3969216649 }, "newestItemPublishTime": { "description": "The time the most recent episode in the feed was published.\n\n\nNote: some endpoints use `newestItemPubdate` while others use `newestItemPublishTime`. \nThey return the same information. See https://github.com/Podcastindex-org/api/issues/3 to track when the property name is updated.\n", diff --git a/docs/pi_api.yaml b/docs/pi_api.yaml index 92324ff..a841071 100644 --- a/docs/pi_api.yaml +++ b/docs/pi_api.yaml @@ -2620,7 +2620,8 @@ components: description: | A CRC32 hash of the `image` URL with the protocol (`http://`, `https://`) removed. type: integer - example: 1639321931 + format: int64 + example: 3969216649 newestItemPublishTime: description: | The time the most recent episode in the feed was published. From 75896d9208d4ae58d8cbc232ca7d5eed9051e502 Mon Sep 17 00:00:00 2001 From: Steven Crader Date: Fri, 23 Aug 2024 16:02:07 -0700 Subject: [PATCH 02/11] Update redocly cli --- package.json | 2 +- yarn.lock | 366 +++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 267 insertions(+), 101 deletions(-) diff --git a/package.json b/package.json index f790c3c..1fe2b4a 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "1.12.1", "private": true, "devDependencies": { - "@redocly/cli": "^1.10.6", + "@redocly/cli": "^1.21.0", "copyfiles": "^2.4.1", "http-server": "^14.1.1", "livereload": "^0.9.3", diff --git a/yarn.lock b/yarn.lock index f429941..5ba618c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1572,6 +1572,23 @@ __metadata: languageName: node linkType: hard +"@cfaester/enzyme-adapter-react-18@npm:^0.8.0": + version: 0.8.0 + resolution: "@cfaester/enzyme-adapter-react-18@npm:0.8.0" + dependencies: + enzyme-shallow-equal: "npm:^1.0.0" + function.prototype.name: "npm:^1.1.6" + has: "npm:^1.0.4" + react-is: "npm:^18.2.0" + react-shallow-renderer: "npm:^16.15.0" + peerDependencies: + enzyme: ^3.11.0 + react: ">=18" + react-dom: ">=18" + checksum: 10/f21a82083dc4a670749824cf27fc3640df9189144b2197d3531110efa020f45137c3ab4ba6ffa8fac8a124fb3e351a20f3628f4d767802342a636fefb3c2e45f + languageName: node + linkType: hard + "@emotion/is-prop-valid@npm:^1.2.1": version: 1.2.1 resolution: "@emotion/is-prop-valid@npm:1.2.1" @@ -1690,11 +1707,11 @@ __metadata: languageName: node linkType: hard -"@redocly/cli@npm:^1.10.6": - version: 1.10.6 - resolution: "@redocly/cli@npm:1.10.6" +"@redocly/cli@npm:^1.21.0": + version: 1.21.0 + resolution: "@redocly/cli@npm:1.21.0" dependencies: - "@redocly/openapi-core": "npm:1.10.6" + "@redocly/openapi-core": "npm:1.21.0" abort-controller: "npm:^3.0.0" chokidar: "npm:^3.5.1" colorette: "npm:^1.2.0" @@ -1705,9 +1722,10 @@ __metadata: handlebars: "npm:^4.7.6" mobx: "npm:^6.0.4" node-fetch: "npm:^2.6.1" + pluralize: "npm:^8.0.0" react: "npm:^17.0.0 || ^18.2.0" react-dom: "npm:^17.0.0 || ^18.2.0" - redoc: "npm:~2.1.3" + redoc: "npm:~2.1.5" semver: "npm:^7.5.2" simple-websocket: "npm:^9.0.0" styled-components: "npm:^6.0.7" @@ -1715,24 +1733,25 @@ __metadata: bin: openapi: bin/cli.js redocly: bin/cli.js - checksum: 10/a823a665861096c96edc24327b37955311666b23d94f63d1ede1d260a4e3cd2f8d89586207edf3c8e9d9296625e347ea09f6d464b2e56810a02bd6da3c1de054 + checksum: 10/46067b4d6d0cdfbd6e57d168f81a7e0bb9fc4c42bb3ce780d1c24d9abf82027199774e87cfeff4060ec32ee7f2eddf8eb696d395fbc50c4a3f79e5d8b1f8d6cf languageName: node linkType: hard -"@redocly/config@npm:^0.1.4": - version: 0.1.6 - resolution: "@redocly/config@npm:0.1.6" - checksum: 10/5bf099245ac9a955a0eb4649f6996575142932de7eb1f276b9c0cb738bb42e9e58de4872cdd6f28f413d12a40727b23a5beaca45d9d5076bbe40297024e0e620 +"@redocly/config@npm:^0.9.0": + version: 0.9.0 + resolution: "@redocly/config@npm:0.9.0" + checksum: 10/b74c1ad8d5128c1062c9dc14eacc71b5426709a4a0cb4fefcc6d16d088dd19d96967ffd4a869f455bb39d412525e786d1c1a1700dcfb72712d65caa3c740f834 languageName: node linkType: hard -"@redocly/openapi-core@npm:1.10.6": - version: 1.10.6 - resolution: "@redocly/openapi-core@npm:1.10.6" +"@redocly/openapi-core@npm:1.21.0, @redocly/openapi-core@npm:^1.4.0": + version: 1.21.0 + resolution: "@redocly/openapi-core@npm:1.21.0" dependencies: "@redocly/ajv": "npm:^8.11.0" - "@redocly/config": "npm:^0.1.4" + "@redocly/config": "npm:^0.9.0" colorette: "npm:^1.2.0" + https-proxy-agent: "npm:^7.0.4" js-levenshtein: "npm:^1.1.6" js-yaml: "npm:^4.1.0" lodash.isequal: "npm:^4.5.0" @@ -1740,25 +1759,7 @@ __metadata: node-fetch: "npm:^2.6.1" pluralize: "npm:^8.0.0" yaml-ast-parser: "npm:0.0.43" - checksum: 10/f20ed1ce6756f90f69866a92e9c8a5440749b4a610999f35af38603509abf34089cb8e825a9c09344792db0d4dfd8294d819021f408d350c43f65018fe1b65d9 - languageName: node - linkType: hard - -"@redocly/openapi-core@npm:^1.0.0-rc.2": - version: 1.1.0 - resolution: "@redocly/openapi-core@npm:1.1.0" - dependencies: - "@redocly/ajv": "npm:^8.11.0" - "@types/node": "npm:^14.11.8" - colorette: "npm:^1.2.0" - js-levenshtein: "npm:^1.1.6" - js-yaml: "npm:^4.1.0" - lodash.isequal: "npm:^4.5.0" - minimatch: "npm:^5.0.1" - node-fetch: "npm:^2.6.1" - pluralize: "npm:^8.0.0" - yaml-ast-parser: "npm:0.0.43" - checksum: 10/8fc55cc45687f7db8f4d1e09ed1a5c1f0cf3609b854e70f8ae24311d4ce546cd878844f8f800e6abe5b03bf0f53e11c5aa0866caef4216a711f90b00736f61de + checksum: 10/6fadc24482732a802be05aab7d4bc7b85325cca367bd6bf62b9dd47d95124f7b181e4695b0b3e534944687b07dfc6f7d09db427c00cd74607b41f69d83a6a6f6 languageName: node linkType: hard @@ -1776,13 +1777,6 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^14.11.8": - version: 14.14.31 - resolution: "@types/node@npm:14.14.31" - checksum: 10/0a76de64dfe0187adb29158c5752347c64e8b40b9e796020c9cdcfc5ed8faafff0971e67b413b62d1984e532a563264ecfa2dad5ec2fe85bb6eca80878f7a453 - languageName: node - linkType: hard - "@types/stylis@npm:^4.0.2": version: 4.2.0 resolution: "@types/stylis@npm:4.2.0" @@ -1815,6 +1809,15 @@ __metadata: languageName: node linkType: hard +"agent-base@npm:^7.0.2": + version: 7.1.1 + resolution: "agent-base@npm:7.1.1" + dependencies: + debug: "npm:^4.3.4" + checksum: 10/c478fec8f79953f118704d007a38f2a185458853f5c45579b9669372bd0e12602e88dc2ad0233077831504f7cd6fcc8251c383375bba5eaaf563b102938bda26 + languageName: node + linkType: hard + "agentkeepalive@npm:^4.2.1": version: 4.2.1 resolution: "agentkeepalive@npm:4.2.1" @@ -2108,6 +2111,19 @@ __metadata: languageName: node linkType: hard +"call-bind@npm:^1.0.7": + version: 1.0.7 + resolution: "call-bind@npm:1.0.7" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + set-function-length: "npm:^1.2.1" + checksum: 10/cd6fe658e007af80985da5185bff7b55e12ef4c2b6f41829a26ed1eef254b1f1c12e3dfd5b2b068c6ba8b86aba62390842d81752e67dcbaec4f6f76e7113b6b7 + languageName: node + linkType: hard + "call-me-maybe@npm:^1.0.1": version: 1.0.2 resolution: "call-me-maybe@npm:1.0.2" @@ -2214,10 +2230,10 @@ __metadata: languageName: node linkType: hard -"classnames@npm:^2.3.1": - version: 2.3.2 - resolution: "classnames@npm:2.3.2" - checksum: 10/ba3151c12e8b6a84c64b340ab4259ad0408947652009314462d828e94631505989c6a7d7e796bec1d309be9295d3111b498ad18a9d533fe3e6f859e51e574cbb +"classnames@npm:^2.3.2": + version: 2.5.1 + resolution: "classnames@npm:2.5.1" + checksum: 10/58eb394e8817021b153bb6e7d782cfb667e4ab390cb2e9dac2fc7c6b979d1cc2b2a733093955fc5c94aa79ef5c8c89f11ab77780894509be6afbb91dddd79d15 languageName: node linkType: hard @@ -2250,10 +2266,10 @@ __metadata: languageName: node linkType: hard -"clsx@npm:^1.1.0": - version: 1.2.1 - resolution: "clsx@npm:1.2.1" - checksum: 10/5ded6f61f15f1fa0350e691ccec43a28b12fb8e64c8e94715f2a937bc3722d4c3ed41d6e945c971fc4dcc2a7213a43323beaf2e1c28654af63ba70c9968a8643 +"clsx@npm:^2.0.0": + version: 2.1.1 + resolution: "clsx@npm:2.1.1" + checksum: 10/cdfb57fa6c7649bbff98d9028c2f0de2f91c86f551179541cf784b1cfdc1562dcb951955f46d54d930a3879931a980e32a46b598acaea274728dbe068deca919 languageName: node linkType: hard @@ -2461,6 +2477,18 @@ __metadata: languageName: node linkType: hard +"debug@npm:^4.3.4": + version: 4.3.6 + resolution: "debug@npm:4.3.6" + dependencies: + ms: "npm:2.1.2" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10/d3adb9af7d57a9e809a68f404490cf776122acca16e6359a2702c0f462e510e91f9765c07f707b8ab0d91e03bad57328f3256f5082631cefb5393d0394d50fb7 + languageName: node + linkType: hard + "decko@npm:^1.2.0": version: 1.2.0 resolution: "decko@npm:1.2.0" @@ -2479,7 +2507,18 @@ __metadata: languageName: node linkType: hard -"define-properties@npm:^1.1.3, define-properties@npm:^1.1.4, define-properties@npm:^1.2.0": +"define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: "npm:^1.0.0" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.0.1" + checksum: 10/abdcb2505d80a53524ba871273e5da75e77e52af9e15b3aa65d8aad82b8a3a424dad7aee2cc0b71470ac7acf501e08defac362e8b6a73cdb4309f028061df4ae + languageName: node + linkType: hard + +"define-properties@npm:^1.1.3, define-properties@npm:^1.1.4, define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": version: 1.2.1 resolution: "define-properties@npm:1.2.1" dependencies: @@ -2511,10 +2550,10 @@ __metadata: languageName: node linkType: hard -"dompurify@npm:^2.2.8": - version: 2.4.7 - resolution: "dompurify@npm:2.4.7" - checksum: 10/bf223b4608204b0f4ded4cad2e7711b9afbe4dc9646f645601463629484a6ccc83906571d24340c0df7776a147ceb6d42cc36697e514aa72c865662977164784 +"dompurify@npm:^3.0.6": + version: 3.1.6 + resolution: "dompurify@npm:3.1.6" + checksum: 10/036844bc9b717b172ba27f5863b56f950289a05d8eebfb702d6953bbf80bd021e480ce4217bd084567186f2d0ada13358ce5556963492cfe402d774e8667f120 languageName: node linkType: hard @@ -2548,6 +2587,16 @@ __metadata: languageName: node linkType: hard +"enzyme-shallow-equal@npm:^1.0.0": + version: 1.0.7 + resolution: "enzyme-shallow-equal@npm:1.0.7" + dependencies: + hasown: "npm:^2.0.0" + object-is: "npm:^1.1.5" + checksum: 10/ecbdf5a897ba33e699316f1456c7865b8140a6fc7916b700721964fe169e750be35f1fff5184a80e35b39e793523d678f4f4d12f48fce15145d206f5db01daa9 + languageName: node + linkType: hard + "err-code@npm:^2.0.2": version: 2.0.3 resolution: "err-code@npm:2.0.3" @@ -2611,6 +2660,22 @@ __metadata: languageName: node linkType: hard +"es-define-property@npm:^1.0.0": + version: 1.0.0 + resolution: "es-define-property@npm:1.0.0" + dependencies: + get-intrinsic: "npm:^1.2.4" + checksum: 10/f66ece0a887b6dca71848fa71f70461357c0e4e7249696f81bad0a1f347eed7b31262af4a29f5d726dc026426f085483b6b90301855e647aa8e21936f07293c6 + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: 10/96e65d640156f91b707517e8cdc454dd7d47c32833aa3e85d79f24f9eb7ea85f39b63e36216ef0114996581969b59fe609a94e30316b08f5f4df1d44134cf8d5 + languageName: node + linkType: hard + "es-set-tostringtag@npm:^2.0.1": version: 2.0.2 resolution: "es-set-tostringtag@npm:2.0.2" @@ -2668,13 +2733,20 @@ __metadata: languageName: node linkType: hard -"eventemitter3@npm:^4.0.0, eventemitter3@npm:^4.0.7": +"eventemitter3@npm:^4.0.0": version: 4.0.7 resolution: "eventemitter3@npm:4.0.7" checksum: 10/8030029382404942c01d0037079f1b1bc8fed524b5849c237b80549b01e2fc49709e1d0c557fa65ca4498fc9e24cff1475ef7b855121fcc15f9d61f93e282346 languageName: node linkType: hard +"eventemitter3@npm:^5.0.1": + version: 5.0.1 + resolution: "eventemitter3@npm:5.0.1" + checksum: 10/ac6423ec31124629c84c7077eed1e6987f6d66c31cf43c6fcbf6c87791d56317ce808d9ead483652436df171b526fc7220eccdc9f3225df334e81582c3cf7dd5 + languageName: node + linkType: hard + "fast-deep-equal@npm:^3.1.1": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" @@ -2864,6 +2936,19 @@ __metadata: languageName: node linkType: hard +"get-intrinsic@npm:^1.2.4": + version: 1.2.4 + resolution: "get-intrinsic@npm:1.2.4" + dependencies: + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + has-proto: "npm:^1.0.1" + has-symbols: "npm:^1.0.3" + hasown: "npm:^2.0.0" + checksum: 10/85bbf4b234c3940edf8a41f4ecbd4e25ce78e5e6ad4e24ca2f77037d983b9ef943fd72f00f3ee97a49ec622a506b67db49c36246150377efcda1c9eb03e5f06d + languageName: node + linkType: hard + "get-port-please@npm:^3.0.1": version: 3.1.1 resolution: "get-port-please@npm:3.1.1" @@ -3027,6 +3112,15 @@ __metadata: languageName: node linkType: hard +"has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" + dependencies: + es-define-property: "npm:^1.0.0" + checksum: 10/2d8c9ab8cebb572e3362f7d06139a4592105983d4317e68f7adba320fe6ddfc8874581e0971e899e633fd5f72e262830edce36d5a0bc863dad17ad20572484b2 + languageName: node + linkType: hard + "has-proto@npm:^1.0.1": version: 1.0.1 resolution: "has-proto@npm:1.0.1" @@ -3066,6 +3160,13 @@ __metadata: languageName: node linkType: hard +"has@npm:^1.0.4": + version: 1.0.4 + resolution: "has@npm:1.0.4" + checksum: 10/c245f332fe78c7b6b8753857240ac12b3286f995f656a33c77e0f5baab7d0157e6ddb1c34940ffd2bffc51f75ede50cd8b29ff65c13e336376aca8cf3df58043 + languageName: node + linkType: hard + "hasown@npm:^2.0.0": version: 2.0.0 resolution: "hasown@npm:2.0.0" @@ -3169,6 +3270,16 @@ __metadata: languageName: node linkType: hard +"https-proxy-agent@npm:^7.0.4": + version: 7.0.5 + resolution: "https-proxy-agent@npm:7.0.5" + dependencies: + agent-base: "npm:^7.0.2" + debug: "npm:4" + checksum: 10/6679d46159ab3f9a5509ee80c3a3fc83fba3a920a5e18d32176c3327852c3c00ad640c0c4210a8fd70ea3c4a6d3a1b375bf01942516e7df80e2646bdc77658ab + languageName: node + linkType: hard + "humanize-ms@npm:^1.2.1": version: 1.2.1 resolution: "humanize-ms@npm:1.2.1" @@ -3663,7 +3774,7 @@ __metadata: languageName: node linkType: hard -"marked@npm:^4.0.15": +"marked@npm:^4.3.0": version: 4.3.0 resolution: "marked@npm:4.3.0" bin: @@ -3842,35 +3953,37 @@ __metadata: languageName: node linkType: hard -"mobx-react-lite@npm:^3.4.0": - version: 3.4.3 - resolution: "mobx-react-lite@npm:3.4.3" +"mobx-react-lite@npm:^4.0.7": + version: 4.0.7 + resolution: "mobx-react-lite@npm:4.0.7" + dependencies: + use-sync-external-store: "npm:^1.2.0" peerDependencies: - mobx: ^6.1.0 + mobx: ^6.9.0 react: ^16.8.0 || ^17 || ^18 peerDependenciesMeta: react-dom: optional: true react-native: optional: true - checksum: 10/768ada82ab181330cf57562552c591065c57e59378cafe1a9d100660b1acf5d73fe9f5eeea8ea7b2adc5a87dd322bc1e119d853474c51e032021deef967b07e4 + checksum: 10/294754f8a3b44aa83ace02397530f059cce40dda09bdd546f0fca6b004be4dff2dfc6e180ab24686957e45d244408b08e13754cc74c3c2af3076f6ad0ecaa898 languageName: node linkType: hard -"mobx-react@npm:^7.2.0": - version: 7.6.0 - resolution: "mobx-react@npm:7.6.0" +"mobx-react@npm:^9.1.1": + version: 9.1.1 + resolution: "mobx-react@npm:9.1.1" dependencies: - mobx-react-lite: "npm:^3.4.0" + mobx-react-lite: "npm:^4.0.7" peerDependencies: - mobx: ^6.1.0 + mobx: ^6.9.0 react: ^16.8.0 || ^17 || ^18 peerDependenciesMeta: react-dom: optional: true react-native: optional: true - checksum: 10/33cdc54d44714c87a2fd50fa20ac84114d1032b20a4f1e5a1147c37aaca25147e43a4b970f7aded42ddd8f55c6b3d09d157be6019c8527381a7da161e5c9a45d + checksum: 10/61f2a9bb36417f4d88ef737520369ace1ca75865ad5ae5d90ae25e9febbf984d7855ec40a9bdbb7bf60942bfbb9cf9396da1019e83ffa71460cf776b53b1a2fe languageName: node linkType: hard @@ -4129,6 +4242,16 @@ __metadata: languageName: node linkType: hard +"object-is@npm:^1.1.5": + version: 1.1.6 + resolution: "object-is@npm:1.1.6" + dependencies: + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + checksum: 10/4f6f544773a595da21c69a7531e0e1d6250670f4e09c55f47eb02c516035cfcb1b46ceb744edfd3ecb362309dbccb6d7f88e43bf42e4d4595ac10a329061053a + languageName: node + linkType: hard + "object-keys@npm:^1.1.1": version: 1.1.1 resolution: "object-keys@npm:1.1.1" @@ -4157,13 +4280,13 @@ __metadata: languageName: node linkType: hard -"openapi-sampler@npm:^1.3.1": - version: 1.3.1 - resolution: "openapi-sampler@npm:1.3.1" +"openapi-sampler@npm:^1.5.0": + version: 1.5.1 + resolution: "openapi-sampler@npm:1.5.1" dependencies: "@types/json-schema": "npm:^7.0.7" json-pointer: "npm:0.6.2" - checksum: 10/f180fd4d795c0e2d63f913d427c8503e8a94caf5d6c87970fca982dd66942399f601dece13938ca7786e9f264f61d9973362d496bb6d1640744b2ff73170e41e + checksum: 10/c0ba165447deaf8fd74d4d4d410acd32db5d7d30d96b0f5ff0f97795d76da5790097e4e73ecf86431aae7ce0bd9360f7ed10bc951130818394dd2ba9e77b05bd languageName: node linkType: hard @@ -4250,7 +4373,7 @@ __metadata: version: 0.0.0-use.local resolution: "pi_api_docs@workspace:." dependencies: - "@redocly/cli": "npm:^1.10.6" + "@redocly/cli": "npm:^1.21.0" copyfiles: "npm:^2.4.1" http-server: "npm:^14.1.1" livereload: "npm:^0.9.3" @@ -4302,12 +4425,12 @@ __metadata: languageName: node linkType: hard -"polished@npm:^4.1.3": - version: 4.2.2 - resolution: "polished@npm:4.2.2" +"polished@npm:^4.2.2": + version: 4.3.1 + resolution: "polished@npm:4.3.1" dependencies: "@babel/runtime": "npm:^7.17.8" - checksum: 10/da71b15c1e1d98b7f55e143bbf9ebb1b0934286c74c333522e571e52f89e42a61d7d44c5b4f941dc927355c7ae09780877aeb8f23707376fa9f006ab861e758b + checksum: 10/0902fe2eb16aecde1587a00efee7db8081b1331ac7bcfb6e61214d266388723a84858d732ad9395028e0aecd2bb8d0c39cc03d14b4c24c22329a0e40c38141eb languageName: node linkType: hard @@ -4340,7 +4463,7 @@ __metadata: languageName: node linkType: hard -"prismjs@npm:^1.27.0": +"prismjs@npm:^1.29.0": version: 1.29.0 resolution: "prismjs@npm:1.29.0" checksum: 10/2080db382c2dde0cfc7693769e89b501ef1bfc8ff4f8d25c07fd4c37ca31bc443f6133d5b7c145a73309dc396e829ddb7cc18560026d862a887ae08864ef6b07 @@ -4371,7 +4494,7 @@ __metadata: languageName: node linkType: hard -"prop-types@npm:^15.5.0, prop-types@npm:^15.7.2": +"prop-types@npm:^15.5.0, prop-types@npm:^15.8.1": version: 15.8.1 resolution: "prop-types@npm:15.8.1" dependencies: @@ -4426,6 +4549,13 @@ __metadata: languageName: node linkType: hard +"react-is@npm:^16.12.0 || ^17.0.0 || ^18.0.0, react-is@npm:^18.2.0": + version: 18.3.1 + resolution: "react-is@npm:18.3.1" + checksum: 10/d5f60c87d285af24b1e1e7eaeb123ec256c3c8bdea7061ab3932e3e14685708221bf234ec50b21e10dd07f008f1b966a2730a0ce4ff67905b3872ff2042aec22 + languageName: node + linkType: hard + "react-is@npm:^16.13.1": version: 16.13.1 resolution: "react-is@npm:16.13.1" @@ -4433,15 +4563,27 @@ __metadata: languageName: node linkType: hard -"react-tabs@npm:^4.3.0": - version: 4.3.0 - resolution: "react-tabs@npm:4.3.0" +"react-shallow-renderer@npm:^16.15.0": + version: 16.15.0 + resolution: "react-shallow-renderer@npm:16.15.0" + dependencies: + object-assign: "npm:^4.1.1" + react-is: "npm:^16.12.0 || ^17.0.0 || ^18.0.0" + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + checksum: 10/06457fe5bcaa44aeca998905b6849304742ea1cc2d3841e4a0964c745ff392bc4dec07f8c779f317faacce3a0bf6f84e15020ac0fa81adb931067dbb0baf707b + languageName: node + linkType: hard + +"react-tabs@npm:^6.0.2": + version: 6.0.2 + resolution: "react-tabs@npm:6.0.2" dependencies: - clsx: "npm:^1.1.0" + clsx: "npm:^2.0.0" prop-types: "npm:^15.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0-0 || ^18.0.0 - checksum: 10/5d6e25dc900fe82a7744cb8eb0b4f25a6e5df909e69f66a6216dadb18ec8392f95a97660aa19820bf4c25e3dc720fdce4a27ee475b046f79c97aebe2653884c2 + react: ^18.0.0 + checksum: 10/7bb3eebb75470515ec898a9f53fff2a1a21c92176f7b788e3ad1f5aa8f123d5323ba56eeabdc290dafaf116bbc9636844d95f500f2e32f001af9688d46d20434 languageName: node linkType: hard @@ -4521,30 +4663,31 @@ __metadata: languageName: node linkType: hard -"redoc@npm:~2.1.3": - version: 2.1.3 - resolution: "redoc@npm:2.1.3" +"redoc@npm:~2.1.5": + version: 2.1.5 + resolution: "redoc@npm:2.1.5" dependencies: - "@redocly/openapi-core": "npm:^1.0.0-rc.2" - classnames: "npm:^2.3.1" + "@cfaester/enzyme-adapter-react-18": "npm:^0.8.0" + "@redocly/openapi-core": "npm:^1.4.0" + classnames: "npm:^2.3.2" decko: "npm:^1.2.0" - dompurify: "npm:^2.2.8" - eventemitter3: "npm:^4.0.7" + dompurify: "npm:^3.0.6" + eventemitter3: "npm:^5.0.1" json-pointer: "npm:^0.6.2" lunr: "npm:^2.3.9" mark.js: "npm:^8.11.1" - marked: "npm:^4.0.15" - mobx-react: "npm:^7.2.0" - openapi-sampler: "npm:^1.3.1" + marked: "npm:^4.3.0" + mobx-react: "npm:^9.1.1" + openapi-sampler: "npm:^1.5.0" path-browserify: "npm:^1.0.1" perfect-scrollbar: "npm:^1.5.5" - polished: "npm:^4.1.3" - prismjs: "npm:^1.27.0" - prop-types: "npm:^15.7.2" - react-tabs: "npm:^4.3.0" + polished: "npm:^4.2.2" + prismjs: "npm:^1.29.0" + prop-types: "npm:^15.8.1" + react-tabs: "npm:^6.0.2" slugify: "npm:~1.4.7" stickyfill: "npm:^1.1.1" - swagger2openapi: "npm:^7.0.6" + swagger2openapi: "npm:^7.0.8" url-template: "npm:^2.0.8" peerDependencies: core-js: ^3.1.4 @@ -4552,7 +4695,7 @@ __metadata: react: ^16.8.4 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.4 || ^17.0.0 || ^18.0.0 styled-components: ^4.1.1 || ^5.1.1 || ^6.0.5 - checksum: 10/83cdc99c9f4035331fd062289f10c2df781b3d03e5153448079e26fd29af62ae6f877868f26610eae4c184297dadb6a6a002ee8931906c3a69ec78cba6119fde + checksum: 10/8641be6f54c467cd2c38e52d1ae8912f9c37b48ecc81fe2fa11c754331441c1c2b30449631f989de648b211ac0507b9a890c1dc1a9205c7c8a0b71d3799bd6cd languageName: node linkType: hard @@ -4841,6 +4984,20 @@ __metadata: languageName: node linkType: hard +"set-function-length@npm:^1.2.1": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" + dependencies: + define-data-property: "npm:^1.1.4" + es-errors: "npm:^1.3.0" + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.4" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.2" + checksum: 10/505d62b8e088468917ca4e3f8f39d0e29f9a563b97dbebf92f4bd2c3172ccfb3c5b8e4566d5fcd00784a00433900e7cb8fbc404e2dbd8c3818ba05bb9d4a8a6d + languageName: node + linkType: hard + "set-function-name@npm:^2.0.0": version: 2.0.1 resolution: "set-function-name@npm:2.0.1" @@ -5257,7 +5414,7 @@ __metadata: languageName: node linkType: hard -"swagger2openapi@npm:^7.0.6": +"swagger2openapi@npm:^7.0.8": version: 7.0.8 resolution: "swagger2openapi@npm:7.0.8" dependencies: @@ -5497,6 +5654,15 @@ __metadata: languageName: node linkType: hard +"use-sync-external-store@npm:^1.2.0": + version: 1.2.2 + resolution: "use-sync-external-store@npm:1.2.2" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: 10/671e9c190aab9a8374a5d468c6ba17f52c38b6fae970110bc196fc1e2b57204149aea9619be49a1bb5207fb6e51d8afd19c3bcb94afe61813fed039821461dc0 + languageName: node + linkType: hard + "util-deprecate@npm:^1.0.1, util-deprecate@npm:~1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" From 451f522912d9b5044035317b6a5491e78605cfe9 Mon Sep 17 00:00:00 2001 From: Steven Crader Date: Fri, 23 Aug 2024 16:02:49 -0700 Subject: [PATCH 03/11] Add newest argument to `/episodes/byfeedid` https://podcastindex.social/@dave/113006227150285081 --- Postman Docs/PodcastIndex.postman_collection.json | 8 +++++++- api_src/components/parameters/newest.yaml | 11 +++++++++++ api_src/paths/episodes/byfeedid.yaml | 3 +++ docs/pi_api.json | 14 +++++++++++++- docs/pi_api.yaml | 14 ++++++++++++++ 5 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 api_src/components/parameters/newest.yaml diff --git a/Postman Docs/PodcastIndex.postman_collection.json b/Postman Docs/PodcastIndex.postman_collection.json index f759ba1..cb0f0d5 100644 --- a/Postman Docs/PodcastIndex.postman_collection.json +++ b/Postman Docs/PodcastIndex.postman_collection.json @@ -599,6 +599,12 @@ "description": "If present, return the full text value of any text fields (ex: `description`). If not provided, field value is truncated to 100 words.\n\nParameter shall not have a value\n", "disabled": true }, + { + "key": "newest", + "value": "", + "description": "If present, returns only the most recent (newest) episode for each specified feed id.\n\nParameter shall not have a value\n", + "disabled": true + }, { "key": "pretty", "value": "", @@ -607,7 +613,7 @@ } ] }, - "description": "This call returns all the episodes we know about for this feed from the PodcastIndex ID.\nEpisodes are in reverse chronological order.\n\nWhen using the `enclosure` parameter, only the episode matching the URL is returned.\n\nExamples:\n\n - https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=75075&pretty\n - https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=41504,920666&pretty\n - Includes `persons`: https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=169991&pretty\n - Includes `value`: https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=4058673&pretty\n - Using `enclosure`: https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=41504&enclosure=https://op3.dev/e/mp3s.nashownotes.com/NA-1551-2023-04-30-Final.mp3&pretty\n" + "description": "This call returns all the episodes we know about for this feed from the PodcastIndex ID.\nEpisodes are in reverse chronological order.\n\nWhen using the `enclosure` parameter, only the episode matching the URL is returned.\n\nExamples:\n\n - https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=75075&pretty\n - https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=41504,920666&pretty\n - https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=75075&newest&pretty\n - https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=41504,920666&newest&pretty\n - Includes `persons`: https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=169991&pretty\n - Includes `value`: https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=4058673&pretty\n - Using `enclosure`: https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=41504&enclosure=https://op3.dev/e/mp3s.nashownotes.com/NA-1551-2023-04-30-Final.mp3&pretty\n" }, "response": [] }, diff --git a/api_src/components/parameters/newest.yaml b/api_src/components/parameters/newest.yaml new file mode 100644 index 0000000..02b7479 --- /dev/null +++ b/api_src/components/parameters/newest.yaml @@ -0,0 +1,11 @@ +name: newest +in: query +# language=Markdown +description: | + If present, returns only the most recent (newest) episode for each specified feed id. + + + Parameter shall not have a value +schema: + type: boolean +allowEmptyValue: true diff --git a/api_src/paths/episodes/byfeedid.yaml b/api_src/paths/episodes/byfeedid.yaml index 1b1cd43..faf46dd 100644 --- a/api_src/paths/episodes/byfeedid.yaml +++ b/api_src/paths/episodes/byfeedid.yaml @@ -15,6 +15,8 @@ get: - https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=75075&pretty - https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=41504,920666&pretty + - https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=75075&newest&pretty + - https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=41504,920666&newest&pretty - Includes `persons`: https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=169991&pretty - Includes `value`: https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=4058673&pretty - Using `enclosure`: https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=41504&enclosure=https://op3.dev/e/mp3s.nashownotes.com/NA-1551-2023-04-30-Final.mp3&pretty @@ -27,6 +29,7 @@ get: - $ref: '../../components/parameters/max.yaml' - $ref: '../../components/parameters/enclosure.yaml' - $ref: '../../components/parameters/fulltext.yaml' + - $ref: '../../components/parameters/newest.yaml' - $ref: '../../components/parameters/pretty.yaml' responses: '200': diff --git a/docs/pi_api.json b/docs/pi_api.json index 8a3677e..2802112 100644 --- a/docs/pi_api.json +++ b/docs/pi_api.json @@ -676,7 +676,7 @@ "Episodes" ], "summary": "By Feed ID", - "description": "This call returns all the episodes we know about for this feed from the PodcastIndex ID.\nEpisodes are in reverse chronological order.\n\n\nWhen using the `enclosure` parameter, only the episode matching the URL is returned.\n\n\nExamples:\n\n - https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=75075&pretty\n - https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=41504,920666&pretty\n - Includes `persons`: https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=169991&pretty\n - Includes `value`: https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=4058673&pretty\n - Using `enclosure`: https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=41504&enclosure=https://op3.dev/e/mp3s.nashownotes.com/NA-1551-2023-04-30-Final.mp3&pretty\n", + "description": "This call returns all the episodes we know about for this feed from the PodcastIndex ID.\nEpisodes are in reverse chronological order.\n\n\nWhen using the `enclosure` parameter, only the episode matching the URL is returned.\n\n\nExamples:\n\n - https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=75075&pretty\n - https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=41504,920666&pretty\n - https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=75075&newest&pretty\n - https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=41504,920666&newest&pretty\n - Includes `persons`: https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=169991&pretty\n - Includes `value`: https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=4058673&pretty\n - Using `enclosure`: https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=41504&enclosure=https://op3.dev/e/mp3s.nashownotes.com/NA-1551-2023-04-30-Final.mp3&pretty\n", "operationId": "episodes/byfeedid", "security": [ { @@ -702,6 +702,9 @@ { "$ref": "#/components/parameters/fulltext" }, + { + "$ref": "#/components/parameters/newest" + }, { "$ref": "#/components/parameters/pretty" } @@ -2088,6 +2091,15 @@ }, "example": "https://op3.dev/e/mp3s.nashownotes.com/NA-1551-2023-04-30-Final.mp3" }, + "newest": { + "name": "newest", + "in": "query", + "description": "If present, returns only the most recent (newest) episode for each specified feed id.\n\n\nParameter shall not have a value\n", + "schema": { + "type": "boolean" + }, + "allowEmptyValue": true + }, "id_episode_pi": { "name": "id", "in": "query", diff --git a/docs/pi_api.yaml b/docs/pi_api.yaml index a841071..3999c0c 100644 --- a/docs/pi_api.yaml +++ b/docs/pi_api.yaml @@ -734,6 +734,8 @@ paths: - https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=75075&pretty - https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=41504,920666&pretty + - https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=75075&newest&pretty + - https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=41504,920666&newest&pretty - Includes `persons`: https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=169991&pretty - Includes `value`: https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=4058673&pretty - Using `enclosure`: https://api.podcastindex.org/api/1.0/episodes/byfeedid?id=41504&enclosure=https://op3.dev/e/mp3s.nashownotes.com/NA-1551-2023-04-30-Final.mp3&pretty @@ -749,6 +751,7 @@ paths: - $ref: '#/components/parameters/max' - $ref: '#/components/parameters/enclosure' - $ref: '#/components/parameters/fulltext' + - $ref: '#/components/parameters/newest' - $ref: '#/components/parameters/pretty' responses: '200': @@ -1964,6 +1967,17 @@ components: schema: type: string example: https://op3.dev/e/mp3s.nashownotes.com/NA-1551-2023-04-30-Final.mp3 + newest: + name: newest + in: query + description: | + If present, returns only the most recent (newest) episode for each specified feed id. + + + Parameter shall not have a value + schema: + type: boolean + allowEmptyValue: true id_episode_pi: name: id in: query From 4a61ac2a52be8633886aa4b44e00cdab6face0dc Mon Sep 17 00:00:00 2001 From: Steven Crader Date: Fri, 23 Aug 2024 17:11:50 -0700 Subject: [PATCH 04/11] Add `/podcasts/batch/byguid` --- .../PodcastIndex.postman_collection.json | 37 +++ api_src/components/properties/createdOn.yaml | 6 + .../properties/feed_podcast_batch.yaml | 75 ++++++ .../components/properties/feeds_batch.yaml | 6 + .../components/properties/inPollingQueue.yaml | 6 + api_src/components/properties/priority.yaml | 15 ++ api_src/components/properties/valueBlock.yaml | 13 + .../responses/podcasts_batch_byguid.yaml | 16 ++ .../schemas/podcasts_batch_byguid.yaml | 9 + api_src/paths/add/batch/byfeedurl.yaml | 2 +- api_src/paths/podcasts/batch/byguid.yaml | 30 +++ api_src/root.yaml | 2 + docs/pi_api.json | 251 +++++++++++++++++- docs/pi_api.yaml | 199 +++++++++++++- 14 files changed, 646 insertions(+), 21 deletions(-) create mode 100644 api_src/components/properties/createdOn.yaml create mode 100644 api_src/components/properties/feed_podcast_batch.yaml create mode 100644 api_src/components/properties/feeds_batch.yaml create mode 100644 api_src/components/properties/inPollingQueue.yaml create mode 100644 api_src/components/properties/priority.yaml create mode 100644 api_src/components/properties/valueBlock.yaml create mode 100644 api_src/components/responses/podcasts_batch_byguid.yaml create mode 100644 api_src/components/schemas/podcasts_batch_byguid.yaml create mode 100644 api_src/paths/podcasts/batch/byguid.yaml diff --git a/Postman Docs/PodcastIndex.postman_collection.json b/Postman Docs/PodcastIndex.postman_collection.json index cb0f0d5..d610b88 100644 --- a/Postman Docs/PodcastIndex.postman_collection.json +++ b/Postman Docs/PodcastIndex.postman_collection.json @@ -549,6 +549,43 @@ "description": "This call returns all feeds that have been marked dead (`dead` == 1)\n\nDead feeds can also be accessed from object storage at https://public.podcastindex.org/podcastindex_dead_feeds.csv\n\nExample: https://api.podcastindex.org/api/1.0/podcasts/dead?pretty\n" }, "response": [] + }, + { + "name": "Batch By Feed GUID", + "request": { + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "[\n \"856cd618-7f34-57ea-9b84-3600f1f65e7f\",\n \"917393e3-1b1e-5cef-ace4-edaa54e1f810\"\n]", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/podcasts/batch/byguid", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "podcasts", + "batch", + "byguid" + ], + "query": [ + { + "key": "pretty", + "value": "", + "description": "If present, makes the output “pretty” to help with debugging.\n\nParameter shall not have a value\n", + "disabled": true + } + ] + }, + "description": "This call returns everything we know about the feed from the feed's GUID provided in JSON array in the body of the request.\n\n\nThe GUID is a unique, global identifier for the podcast. See the namespace spec for\n[guid](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#guid) for details." + }, + "response": [] } ] }, diff --git a/api_src/components/properties/createdOn.yaml b/api_src/components/properties/createdOn.yaml new file mode 100644 index 0000000..d9da285 --- /dev/null +++ b/api_src/components/properties/createdOn.yaml @@ -0,0 +1,6 @@ + # language=Markdown +description: | + The first time the feed was seen by Podcast Index +type: integer +format: Unix Epoch +example: 1613394034 diff --git a/api_src/components/properties/feed_podcast_batch.yaml b/api_src/components/properties/feed_podcast_batch.yaml new file mode 100644 index 0000000..761bde4 --- /dev/null +++ b/api_src/components/properties/feed_podcast_batch.yaml @@ -0,0 +1,75 @@ + # language=Markdown +description: | + Known details of podcast feed +type: object +properties: + id: + $ref: '../properties/id_feed.yaml' + title: + $ref: '../properties/title_feed.yaml' + url: + $ref: '../properties/url_feed.yaml' + originalUrl: + $ref: '../properties/originalUrl.yaml' + link: + $ref: '../properties/link_feed.yaml' + description: + $ref: '../properties/description_feed.yaml' + author: + $ref: '../properties/author.yaml' + ownerName: + $ref: '../properties/ownerName.yaml' + image: + $ref: '../properties/image_feed.yaml' + artwork: + $ref: '../properties/artwork.yaml' + lastUpdateTime: + $ref: '../properties/lastUpdateTime.yaml' + lastCrawlTime: + $ref: '../properties/lastCrawlTime.yaml' + lastParseTime: + $ref: '../properties/lastParseTime.yaml' + inPollingQueue: + $ref: '../properties/inPollingQueue.yaml' + priority: + $ref: '../properties/priority.yaml' + lastGoodHttpStatusTime: + $ref: '../properties/lastGoodHttpStatusTime.yaml' + lastHttpStatus: + $ref: '../properties/lastHttpStatus.yaml' + contentType: + $ref: '../properties/contentType.yaml' + itunesId: + $ref: '../properties/itunesId_feed.yaml' + generator: + $ref: '../properties/generator.yaml' + createdOn: + $ref: '../properties/createdOn.yaml' + language: + $ref: '../properties/language.yaml' + type: + $ref: '../properties/type.yaml' + dead: + $ref: '../properties/dead.yaml' + crawlErrors: + $ref: '../properties/crawlErrors.yaml' + parseErrors: + $ref: '../properties/parseErrors.yaml' + categories: + $ref: '../properties/categories.yaml' + locked: + $ref: '../properties/locked.yaml' + explicit: + $ref: '../properties/explicit_feed.yaml' + podcastGuid: + $ref: '../properties/podcastguid.yaml' + medium: + $ref: '../properties/medium_feed.yaml' + episodeCount: + $ref: '../properties/episodeCount.yaml' + imageUrlHash: + $ref: '../properties/imageUrlHash.yaml' + newestItemPubdate: + $ref: '../properties/newestItemPublishTime.yaml' + valueBlock: + $ref: '../properties/valueBlock.yaml' diff --git a/api_src/components/properties/feeds_batch.yaml b/api_src/components/properties/feeds_batch.yaml new file mode 100644 index 0000000..f7f34ff --- /dev/null +++ b/api_src/components/properties/feeds_batch.yaml @@ -0,0 +1,6 @@ + # language=Markdown +description: | + List of feeds with matching GUID +type: array +items: + $ref: 'feed_podcast_batch.yaml' diff --git a/api_src/components/properties/inPollingQueue.yaml b/api_src/components/properties/inPollingQueue.yaml new file mode 100644 index 0000000..ab2dac3 --- /dev/null +++ b/api_src/components/properties/inPollingQueue.yaml @@ -0,0 +1,6 @@ + # language=Markdown +description: | + Indicates if feed is currently scheduled to be polled/checked for new episodes. +type: integer +nullable: true +example: 1 diff --git a/api_src/components/properties/priority.yaml b/api_src/components/properties/priority.yaml new file mode 100644 index 0000000..a55d2d5 --- /dev/null +++ b/api_src/components/properties/priority.yaml @@ -0,0 +1,15 @@ + # language=Markdown +description: | + How often the feed is checked for updates and new episodes + + A value of -1 means never check. A value of 5 means check the most. +type: integer +enum: + - -1 + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 +example: 5 diff --git a/api_src/components/properties/valueBlock.yaml b/api_src/components/properties/valueBlock.yaml new file mode 100644 index 0000000..fc7b61d --- /dev/null +++ b/api_src/components/properties/valueBlock.yaml @@ -0,0 +1,13 @@ + # language=Markdown +description: | + Information for supporting the podcast via one of the "Value for Value" methods. May not be reported. + + + Value is a string of JSON data representing the feed value block data. + + + Examples: + - `lightning` value type: https://api.podcastindex.org/api/1.0/podcasts/byfeedid?id=169991&pretty + - `webmonetization` value type: https://api.podcastindex.org/api/1.0/podcasts/byfeedid?id=779873&pretty +type: string +# TODO: waiting for clarification on format https://podcastindex.social/@steven/113014028344047257 diff --git a/api_src/components/responses/podcasts_batch_byguid.yaml b/api_src/components/responses/podcasts_batch_byguid.yaml new file mode 100644 index 0000000..eadcb66 --- /dev/null +++ b/api_src/components/responses/podcasts_batch_byguid.yaml @@ -0,0 +1,16 @@ +description: Success +content: + application/json: + schema: + type: object + properties: + status: + $ref: '../properties/status.yaml' + allFound: + $ref: '../properties/allfound.yaml' + found: + $ref: '../properties/found.yaml' + feeds: + $ref: '../properties/feeds_batch.yaml' + description: + $ref: '../properties/description_response.yaml' diff --git a/api_src/components/schemas/podcasts_batch_byguid.yaml b/api_src/components/schemas/podcasts_batch_byguid.yaml new file mode 100644 index 0000000..28ec22d --- /dev/null +++ b/api_src/components/schemas/podcasts_batch_byguid.yaml @@ -0,0 +1,9 @@ + # language=Markdown +description: | + JSON array of feed GUIDs +type: array +items: + type: string +example: + - 917393e3-1b1e-5cef-ace4-edaa54e1f810 + - c73b1a23-1c28-5edb-94c3-10d1745d0877 diff --git a/api_src/paths/add/batch/byfeedurl.yaml b/api_src/paths/add/batch/byfeedurl.yaml index cd4d4a4..da9666d 100644 --- a/api_src/paths/add/batch/byfeedurl.yaml +++ b/api_src/paths/add/batch/byfeedurl.yaml @@ -21,7 +21,7 @@ post: Example: https://api.podcastindex.org/api/1.0/add/batch/byfeedurl?pretty operationId: add/batch/byfeedurl security: - - $ref: '../../components/security/security.yaml' + - $ref: '../../../components/security/security.yaml' parameters: - $ref: '../../../components/parameters/pretty.yaml' requestBody: diff --git a/api_src/paths/podcasts/batch/byguid.yaml b/api_src/paths/podcasts/batch/byguid.yaml new file mode 100644 index 0000000..530fa12 --- /dev/null +++ b/api_src/paths/podcasts/batch/byguid.yaml @@ -0,0 +1,30 @@ +post: + tags: + - Podcasts + summary: Batch By Feed GUID + # language=Markdown + description: | + This call returns everything we know about the feed from the feed's GUID provided in JSON array in the body of the request. + + + The GUID is a unique, global identifier for the podcast. See the namespace spec for + [guid](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#guid) for details. + operationId: podcasts/batch/byguid + security: + - $ref: '../../../components/security/security.yaml' + parameters: + - $ref: '../../../components/parameters/pretty.yaml' + requestBody: + description: Get episode value data + required: true + content: + application/json: + schema: + $ref: '../../../components/schemas/podcasts_batch_byguid.yaml' + responses: + '200': + $ref: '../../../components/responses/podcasts_batch_byguid.yaml' + '400': + $ref: '../../../components/responses/400.yaml' + '401': + $ref: '../../../components/responses/401.yaml' diff --git a/api_src/root.yaml b/api_src/root.yaml index b57d1f9..b437149 100644 --- a/api_src/root.yaml +++ b/api_src/root.yaml @@ -193,6 +193,8 @@ paths: $ref: 'paths/podcasts/trending.yaml' '/podcasts/dead': $ref: 'paths/podcasts/dead.yaml' + '/podcasts/batch/byguid': + $ref: 'paths/podcasts/batch/byguid.yaml' '/episodes/byfeedid': $ref: 'paths/episodes/byfeedid.yaml' '/episodes/byfeedurl': diff --git a/docs/pi_api.json b/docs/pi_api.json index 2802112..3dad307 100644 --- a/docs/pi_api.json +++ b/docs/pi_api.json @@ -670,6 +670,51 @@ } } }, + "/podcasts/batch/byguid": { + "post": { + "tags": [ + "Podcasts" + ], + "summary": "Batch By Feed GUID", + "description": "This call returns everything we know about the feed from the feed's GUID provided in JSON array in the body of the request.\n\n\nThe GUID is a unique, global identifier for the podcast. See the namespace spec for\n[guid](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#guid) for details.\n", + "operationId": "podcasts/batch/byguid", + "security": [ + { + "API-Key": [], + "User-Agent": [], + "Date": [], + "Authorization": [] + } + ], + "parameters": [ + { + "$ref": "#/components/parameters/pretty" + } + ], + "requestBody": { + "description": "Get episode value data", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/podcasts_batch_byguid" + } + } + } + }, + "responses": { + "200": { + "$ref": "#/components/responses/podcasts_batch_byguid" + }, + "400": { + "$ref": "#/components/responses/400" + }, + "401": { + "$ref": "#/components/responses/401" + } + } + } + }, "/episodes/byfeedid": { "get": { "tags": [ @@ -3682,6 +3727,175 @@ "$ref": "#/components/schemas/feed_dead" } }, + "podcasts_batch_byguid": { + "description": "JSON array of feed GUIDs\n", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "917393e3-1b1e-5cef-ace4-edaa54e1f810", + "c73b1a23-1c28-5edb-94c3-10d1745d0877" + ] + }, + "allfound": { + "description": "Indicates if data was found for all `podcastguid` and `episodeguid` values.\n", + "type": "boolean", + "example": true + }, + "found": { + "description": "Number of value data returned.\n", + "type": "integer", + "example": 4 + }, + "inPollingQueue": { + "description": "Indicates if feed is currently scheduled to be polled/checked for new episodes.\n", + "type": "integer", + "nullable": true, + "example": 1 + }, + "priority": { + "description": "How often the feed is checked for updates and new episodes\n\nA value of -1 means never check. A value of 5 means check the most.\n", + "type": "integer", + "enum": [ + -1, + 0, + 1, + 2, + 3, + 4, + 5 + ], + "example": 5 + }, + "createdOn": { + "description": "The first time the feed was seen by Podcast Index\n", + "type": "integer", + "format": "Unix Epoch", + "example": 1613394034 + }, + "valueBlock": { + "description": "Information for supporting the podcast via one of the \"Value for Value\" methods. May not be reported.\n\n\nValue is a string of JSON data representing the feed value block data.\n\n\nExamples:\n - `lightning` value type: https://api.podcastindex.org/api/1.0/podcasts/byfeedid?id=169991&pretty\n - `webmonetization` value type: https://api.podcastindex.org/api/1.0/podcasts/byfeedid?id=779873&pretty\n", + "type": "string" + }, + "feed_podcast_batch": { + "description": "Known details of podcast feed\n", + "type": "object", + "properties": { + "id": { + "$ref": "#/components/schemas/id_feed" + }, + "title": { + "$ref": "#/components/schemas/title_feed" + }, + "url": { + "$ref": "#/components/schemas/url_feed" + }, + "originalUrl": { + "$ref": "#/components/schemas/originalUrl" + }, + "link": { + "$ref": "#/components/schemas/link_feed" + }, + "description": { + "$ref": "#/components/schemas/description_feed" + }, + "author": { + "$ref": "#/components/schemas/author" + }, + "ownerName": { + "$ref": "#/components/schemas/ownerName" + }, + "image": { + "$ref": "#/components/schemas/image_feed" + }, + "artwork": { + "$ref": "#/components/schemas/artwork" + }, + "lastUpdateTime": { + "$ref": "#/components/schemas/lastUpdateTime" + }, + "lastCrawlTime": { + "$ref": "#/components/schemas/lastCrawlTime" + }, + "lastParseTime": { + "$ref": "#/components/schemas/lastParseTime" + }, + "inPollingQueue": { + "$ref": "#/components/schemas/inPollingQueue" + }, + "priority": { + "$ref": "#/components/schemas/priority" + }, + "lastGoodHttpStatusTime": { + "$ref": "#/components/schemas/lastGoodHttpStatusTime" + }, + "lastHttpStatus": { + "$ref": "#/components/schemas/lastHttpStatus" + }, + "contentType": { + "$ref": "#/components/schemas/contentType" + }, + "itunesId": { + "$ref": "#/components/schemas/itunesId_feed" + }, + "generator": { + "$ref": "#/components/schemas/generator" + }, + "createdOn": { + "$ref": "#/components/schemas/createdOn" + }, + "language": { + "$ref": "#/components/schemas/language" + }, + "type": { + "$ref": "#/components/schemas/type" + }, + "dead": { + "$ref": "#/components/schemas/dead" + }, + "crawlErrors": { + "$ref": "#/components/schemas/crawlErrors" + }, + "parseErrors": { + "$ref": "#/components/schemas/parseErrors" + }, + "categories": { + "$ref": "#/components/schemas/categories" + }, + "locked": { + "$ref": "#/components/schemas/locked" + }, + "explicit": { + "$ref": "#/components/schemas/explicit_feed" + }, + "podcastGuid": { + "$ref": "#/components/schemas/podcastguid" + }, + "medium": { + "$ref": "#/components/schemas/medium_feed" + }, + "episodeCount": { + "$ref": "#/components/schemas/episodeCount" + }, + "imageUrlHash": { + "$ref": "#/components/schemas/imageUrlHash" + }, + "newestItemPubdate": { + "$ref": "#/components/schemas/newestItemPublishTime" + }, + "valueBlock": { + "$ref": "#/components/schemas/valueBlock" + } + } + }, + "feeds_batch": { + "description": "List of feeds with matching GUID\n", + "type": "array", + "items": { + "$ref": "#/components/schemas/feed_podcast_batch" + } + }, "datePublishedPretty": { "description": "The date and time the episode was published formatted as a human readable string.\n\n\nNote: uses the PodcastIndex server local time to do conversion.\n", "type": "string", @@ -4975,16 +5189,6 @@ "$ref": "#/components/schemas/value_byepisodeguid_batch" } }, - "allfound": { - "description": "Indicates if data was found for all `podcastguid` and `episodeguid` values.\n", - "type": "boolean", - "example": true - }, - "found": { - "description": "Number of value data returned.\n", - "type": "integer", - "example": 4 - }, "stats": { "description": "An array statistic properties\n", "type": "object", @@ -5378,6 +5582,33 @@ } } }, + "podcasts_batch_byguid": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "status": { + "$ref": "#/components/schemas/status" + }, + "allFound": { + "$ref": "#/components/schemas/allfound" + }, + "found": { + "$ref": "#/components/schemas/found" + }, + "feeds": { + "$ref": "#/components/schemas/feeds_batch" + }, + "description": { + "$ref": "#/components/schemas/description_response" + } + } + } + } + } + }, "episodes_byfeedid": { "description": "Success", "content": { diff --git a/docs/pi_api.yaml b/docs/pi_api.yaml index 3999c0c..54e3193 100644 --- a/docs/pi_api.yaml +++ b/docs/pi_api.yaml @@ -717,6 +717,39 @@ paths: $ref: '#/components/responses/400' '401': $ref: '#/components/responses/401' + /podcasts/batch/byguid: + post: + tags: + - Podcasts + summary: Batch By Feed GUID + description: | + This call returns everything we know about the feed from the feed's GUID provided in JSON array in the body of the request. + + + The GUID is a unique, global identifier for the podcast. See the namespace spec for + [guid](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#guid) for details. + operationId: podcasts/batch/byguid + security: + - API-Key: [] + User-Agent: [] + Date: [] + Authorization: [] + parameters: + - $ref: '#/components/parameters/pretty' + requestBody: + description: Get episode value data + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/podcasts_batch_byguid' + responses: + '200': + $ref: '#/components/responses/podcasts_batch_byguid' + '400': + $ref: '#/components/responses/400' + '401': + $ref: '#/components/responses/401' /episodes/byfeedid: get: tags: @@ -3460,6 +3493,145 @@ components: type: array items: $ref: '#/components/schemas/feed_dead' + podcasts_batch_byguid: + description: | + JSON array of feed GUIDs + type: array + items: + type: string + example: + - 917393e3-1b1e-5cef-ace4-edaa54e1f810 + - c73b1a23-1c28-5edb-94c3-10d1745d0877 + allfound: + description: | + Indicates if data was found for all `podcastguid` and `episodeguid` values. + type: boolean + example: true + found: + description: | + Number of value data returned. + type: integer + example: 4 + inPollingQueue: + description: | + Indicates if feed is currently scheduled to be polled/checked for new episodes. + type: integer + nullable: true + example: 1 + priority: + description: | + How often the feed is checked for updates and new episodes + + A value of -1 means never check. A value of 5 means check the most. + type: integer + enum: + - -1 + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + example: 5 + createdOn: + description: | + The first time the feed was seen by Podcast Index + type: integer + format: Unix Epoch + example: 1613394034 + valueBlock: + description: | + Information for supporting the podcast via one of the "Value for Value" methods. May not be reported. + + + Value is a string of JSON data representing the feed value block data. + + + Examples: + - `lightning` value type: https://api.podcastindex.org/api/1.0/podcasts/byfeedid?id=169991&pretty + - `webmonetization` value type: https://api.podcastindex.org/api/1.0/podcasts/byfeedid?id=779873&pretty + type: string + feed_podcast_batch: + description: | + Known details of podcast feed + type: object + properties: + id: + $ref: '#/components/schemas/id_feed' + title: + $ref: '#/components/schemas/title_feed' + url: + $ref: '#/components/schemas/url_feed' + originalUrl: + $ref: '#/components/schemas/originalUrl' + link: + $ref: '#/components/schemas/link_feed' + description: + $ref: '#/components/schemas/description_feed' + author: + $ref: '#/components/schemas/author' + ownerName: + $ref: '#/components/schemas/ownerName' + image: + $ref: '#/components/schemas/image_feed' + artwork: + $ref: '#/components/schemas/artwork' + lastUpdateTime: + $ref: '#/components/schemas/lastUpdateTime' + lastCrawlTime: + $ref: '#/components/schemas/lastCrawlTime' + lastParseTime: + $ref: '#/components/schemas/lastParseTime' + inPollingQueue: + $ref: '#/components/schemas/inPollingQueue' + priority: + $ref: '#/components/schemas/priority' + lastGoodHttpStatusTime: + $ref: '#/components/schemas/lastGoodHttpStatusTime' + lastHttpStatus: + $ref: '#/components/schemas/lastHttpStatus' + contentType: + $ref: '#/components/schemas/contentType' + itunesId: + $ref: '#/components/schemas/itunesId_feed' + generator: + $ref: '#/components/schemas/generator' + createdOn: + $ref: '#/components/schemas/createdOn' + language: + $ref: '#/components/schemas/language' + type: + $ref: '#/components/schemas/type' + dead: + $ref: '#/components/schemas/dead' + crawlErrors: + $ref: '#/components/schemas/crawlErrors' + parseErrors: + $ref: '#/components/schemas/parseErrors' + categories: + $ref: '#/components/schemas/categories' + locked: + $ref: '#/components/schemas/locked' + explicit: + $ref: '#/components/schemas/explicit_feed' + podcastGuid: + $ref: '#/components/schemas/podcastguid' + medium: + $ref: '#/components/schemas/medium_feed' + episodeCount: + $ref: '#/components/schemas/episodeCount' + imageUrlHash: + $ref: '#/components/schemas/imageUrlHash' + newestItemPubdate: + $ref: '#/components/schemas/newestItemPublishTime' + valueBlock: + $ref: '#/components/schemas/valueBlock' + feeds_batch: + description: | + List of feeds with matching GUID + type: array + items: + $ref: '#/components/schemas/feed_podcast_batch' datePublishedPretty: description: | The date and time the episode was published formatted as a human readable string. @@ -4461,16 +4633,6 @@ components: type: array items: $ref: '#/components/schemas/value_byepisodeguid_batch' - allfound: - description: | - Indicates if data was found for all `podcastguid` and `episodeguid` values. - type: boolean - example: true - found: - description: | - Number of value data returned. - type: integer - example: 4 stats: description: | An array statistic properties @@ -4733,6 +4895,23 @@ components: $ref: '#/components/schemas/count' description: $ref: '#/components/schemas/description_response' + podcasts_batch_byguid: + description: Success + content: + application/json: + schema: + type: object + properties: + status: + $ref: '#/components/schemas/status' + allFound: + $ref: '#/components/schemas/allfound' + found: + $ref: '#/components/schemas/found' + feeds: + $ref: '#/components/schemas/feeds_batch' + description: + $ref: '#/components/schemas/description_response' episodes_byfeedid: description: Success content: From 06380e305e6ef8e7325403d252157845e484c7b0 Mon Sep 17 00:00:00 2001 From: Steven Crader Date: Fri, 23 Aug 2024 21:14:02 -0700 Subject: [PATCH 05/11] Add separate entries for non-API but useful resources. See "Static Data" section --- .editorconfig | 1 + .../PodcastIndex.postman_collection.json | 276 +++++- .../components/properties/data_static.yaml | 18 + .../properties/episodeCountTotal.yaml | 5 + .../properties/episodesWithChapters.yaml | 5 + .../properties/episodesWithTranscripts.yaml | 7 + .../components/properties/feedCountTotal.yaml | 5 + .../properties/feedsWithChapters.yaml | 7 + .../properties/feedsWithFundingTag.yaml | 7 + .../properties/feedsWithMediumMusic.yaml | 7 + .../properties/feedsWithMediumVideo.yaml | 7 + .../feedsWithNewEpisodes10days.yaml | 5 + .../feedsWithNewEpisodes14days.yaml | 5 + .../feedsWithNewEpisodes30days.yaml | 5 + .../properties/feedsWithNewEpisodes3days.yaml | 5 + .../feedsWithNewEpisodes60days.yaml | 5 + .../properties/feedsWithNewEpisodes7days.yaml | 5 + .../feedsWithNewEpisodes90days.yaml | 5 + .../properties/feedsWithTranscripts.yaml | 7 + .../properties/feedsWithValueBlocks.yaml | 7 + .../properties/newEpisodes10days.yaml | 5 + .../properties/newEpisodes14days.yaml | 5 + .../properties/newEpisodes30days.yaml | 5 + .../properties/newEpisodes3days.yaml | 5 + .../properties/newEpisodes60days.yaml | 5 + .../properties/newEpisodes7days.yaml | 5 + .../properties/newEpisodes90days.yaml | 5 + .../paidFeedsWithNewEpisodes10days.yaml | 7 + .../paidFeedsWithNewEpisodes14days.yaml | 7 + .../paidFeedsWithNewEpisodes30days.yaml | 7 + .../paidFeedsWithNewEpisodes3days.yaml | 7 + .../paidFeedsWithNewEpisodes60days.yaml | 7 + .../paidFeedsWithNewEpisodes7days.yaml | 7 + .../paidFeedsWithNewEpisodes90days.yaml | 7 + api_src/components/properties/stats.yaml | 35 +- api_src/components/responses/400_static.yaml | 18 + api_src/components/responses/404.yaml | 1 + .../components/responses/static_current.yaml | 24 + .../responses/static_dead_feeds.yaml | 22 + .../components/responses/static_feeds_db.yaml | 7 + .../responses/static_music_json.yaml | 45 + .../responses/static_music_opml.yaml | 34 + .../responses/static_music_rss.yaml | 15 + .../responses/static_sats_data.yaml | 70 ++ .../responses/static_stats_counts.yaml | 68 ++ .../static_tracking_episode_value_blocks.yaml | 24 + .../static_tracking_feed_value_blocks.yaml | 20 + api_src/paths/podcasts/dead.yaml | 7 +- api_src/paths/recent/data.yaml | 15 +- .../public/podcastindex_dead_feeds.yaml | 25 + .../static/public/podcastindex_feeds_db.yaml | 25 + api_src/paths/static/stats/daily_counts.yaml | 25 + api_src/paths/static/stats/hourly_counts.yaml | 25 + api_src/paths/static/stats/music_json.yaml | 30 + api_src/paths/static/stats/music_opml.yaml | 30 + api_src/paths/static/stats/music_rss.yaml | 30 + api_src/paths/static/stats/v4v.yaml | 30 + api_src/paths/static/tracking/current.yaml | 34 + .../static/tracking/episodeValueBlocks.yaml | 22 + .../static/tracking/feedValueBlocks.yaml | 22 + api_src/paths/stats/current.yaml | 7 +- api_src/root.yaml | 26 +- docs/pi_api.yaml | 893 +++++++++++++++++- 63 files changed, 2031 insertions(+), 76 deletions(-) create mode 100644 api_src/components/properties/data_static.yaml create mode 100644 api_src/components/properties/episodeCountTotal.yaml create mode 100644 api_src/components/properties/episodesWithChapters.yaml create mode 100644 api_src/components/properties/episodesWithTranscripts.yaml create mode 100644 api_src/components/properties/feedCountTotal.yaml create mode 100644 api_src/components/properties/feedsWithChapters.yaml create mode 100644 api_src/components/properties/feedsWithFundingTag.yaml create mode 100644 api_src/components/properties/feedsWithMediumMusic.yaml create mode 100644 api_src/components/properties/feedsWithMediumVideo.yaml create mode 100644 api_src/components/properties/feedsWithNewEpisodes10days.yaml create mode 100644 api_src/components/properties/feedsWithNewEpisodes14days.yaml create mode 100644 api_src/components/properties/feedsWithNewEpisodes30days.yaml create mode 100644 api_src/components/properties/feedsWithNewEpisodes3days.yaml create mode 100644 api_src/components/properties/feedsWithNewEpisodes60days.yaml create mode 100644 api_src/components/properties/feedsWithNewEpisodes7days.yaml create mode 100644 api_src/components/properties/feedsWithNewEpisodes90days.yaml create mode 100644 api_src/components/properties/feedsWithTranscripts.yaml create mode 100644 api_src/components/properties/feedsWithValueBlocks.yaml create mode 100644 api_src/components/properties/newEpisodes10days.yaml create mode 100644 api_src/components/properties/newEpisodes14days.yaml create mode 100644 api_src/components/properties/newEpisodes30days.yaml create mode 100644 api_src/components/properties/newEpisodes3days.yaml create mode 100644 api_src/components/properties/newEpisodes60days.yaml create mode 100644 api_src/components/properties/newEpisodes7days.yaml create mode 100644 api_src/components/properties/newEpisodes90days.yaml create mode 100644 api_src/components/properties/paidFeedsWithNewEpisodes10days.yaml create mode 100644 api_src/components/properties/paidFeedsWithNewEpisodes14days.yaml create mode 100644 api_src/components/properties/paidFeedsWithNewEpisodes30days.yaml create mode 100644 api_src/components/properties/paidFeedsWithNewEpisodes3days.yaml create mode 100644 api_src/components/properties/paidFeedsWithNewEpisodes60days.yaml create mode 100644 api_src/components/properties/paidFeedsWithNewEpisodes7days.yaml create mode 100644 api_src/components/properties/paidFeedsWithNewEpisodes90days.yaml create mode 100644 api_src/components/responses/400_static.yaml create mode 100644 api_src/components/responses/404.yaml create mode 100644 api_src/components/responses/static_current.yaml create mode 100644 api_src/components/responses/static_dead_feeds.yaml create mode 100644 api_src/components/responses/static_feeds_db.yaml create mode 100644 api_src/components/responses/static_music_json.yaml create mode 100644 api_src/components/responses/static_music_opml.yaml create mode 100644 api_src/components/responses/static_music_rss.yaml create mode 100644 api_src/components/responses/static_sats_data.yaml create mode 100644 api_src/components/responses/static_stats_counts.yaml create mode 100644 api_src/components/responses/static_tracking_episode_value_blocks.yaml create mode 100644 api_src/components/responses/static_tracking_feed_value_blocks.yaml create mode 100644 api_src/paths/static/public/podcastindex_dead_feeds.yaml create mode 100644 api_src/paths/static/public/podcastindex_feeds_db.yaml create mode 100644 api_src/paths/static/stats/daily_counts.yaml create mode 100644 api_src/paths/static/stats/hourly_counts.yaml create mode 100644 api_src/paths/static/stats/music_json.yaml create mode 100644 api_src/paths/static/stats/music_opml.yaml create mode 100644 api_src/paths/static/stats/music_rss.yaml create mode 100644 api_src/paths/static/stats/v4v.yaml create mode 100644 api_src/paths/static/tracking/current.yaml create mode 100644 api_src/paths/static/tracking/episodeValueBlocks.yaml create mode 100644 api_src/paths/static/tracking/feedValueBlocks.yaml diff --git a/.editorconfig b/.editorconfig index 5aa0d16..b6a3f17 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,6 +8,7 @@ indent_style = space insert_final_newline = true max_line_length = 120 tab_width = 4 +trim_trailing_whitespace = true [{*.yaml,*.yml}] indent_size = 2 diff --git a/Postman Docs/PodcastIndex.postman_collection.json b/Postman Docs/PodcastIndex.postman_collection.json index d610b88..19bd9bb 100644 --- a/Postman Docs/PodcastIndex.postman_collection.json +++ b/Postman Docs/PodcastIndex.postman_collection.json @@ -546,7 +546,7 @@ } ] }, - "description": "This call returns all feeds that have been marked dead (`dead` == 1)\n\nDead feeds can also be accessed from object storage at https://public.podcastindex.org/podcastindex_dead_feeds.csv\n\nExample: https://api.podcastindex.org/api/1.0/podcasts/dead?pretty\n" + "description": "This call returns all feeds that have been marked dead (`dead` == 1)\n\n\nHourly statistics can also be access at https://public.podcastindex.org/podcastindex_dead_feeds.csv\nFor details, see [Dead Feeds](#get-/static/public/podcastindex_dead_feeds.csv).\n\n\nExample: https://api.podcastindex.org/api/1.0/podcasts/dead?pretty" }, "response": [] }, @@ -1231,7 +1231,7 @@ } ] }, - "description": "This call returns every new feed and episode added to the index over the past 24 hours in reverse chronological order.\n\nThis is similar to `/recent/feeds` but uses the date the feed was found by the index rather than the feed's\ninternal timestamp.\n\nSimilar data can also be accessed using object storage root url https://tracking.podcastindex.org/current\n\nExamples:\n\n - https://api.podcastindex.org/api/1.0/recent/data?pretty\n - https://api.podcastindex.org/api/1.0/recent/data?pretty&max=10\n - https://api.podcastindex.org/api/1.0/recent/data?pretty&max=10&since=1671164867\n" + "description": "This call returns every new feed and episode added to the index over the past 24 hours in reverse chronological order.\n\n\nThis is similar to `/recent/feeds` but uses the date the feed was found by the index rather than the feed's\ninternal timestamp.\n\n\nSimilar data can also be accessed using object storage root url https://tracking.podcastindex.org/current\nFor details, see [Current](#get-/static/tracking/current).\n\n\nExamples:\n\n - https://api.podcastindex.org/api/1.0/recent/data?pretty\n - https://api.podcastindex.org/api/1.0/recent/data?pretty&max=10\n - https://api.podcastindex.org/api/1.0/recent/data?pretty&max=10&since=1671164867" }, "response": [] }, @@ -1486,7 +1486,7 @@ } ] }, - "description": "Return the most recent index statistics.\n\nHourly statistics can also be access at https://stats.podcastindex.org/daily_counts.json\n\nExample: https://api.podcastindex.org/api/1.0/stats/current?pretty\n" + "description": "Return the most recent index statistics.\n\n\nHourly statistics can also be access at https://stats.podcastindex.org/hourly_counts.json\nFor details, see [Stats Hourly Counts](#get-/static/stats/hourly_counts.json).\n\n\nDaily statistics can also be access at https://stats.podcastindex.org/daily_counts.json.\nFor details, see [Stats Daily Counts](#get-/static/stats/daily_counts.json).\n\n\nExample: https://api.podcastindex.org/api/1.0/stats/current?pretty" }, "response": [] } @@ -1744,9 +1744,9 @@ "method": "GET", "header": [], "url": { - "raw": "{{baseAppleUrl}}/search?term=batman", + "raw": "https://api.podcastindex.org/search?term=batman", "host": [ - "{{baseAppleUrl}}" + "https://api.podcastindex.org" ], "path": [ "search" @@ -1778,9 +1778,9 @@ "method": "GET", "header": [], "url": { - "raw": "{{baseAppleUrl}}/lookup?id=1441923632&entity=podcast", + "raw": "https://api.podcastindex.org/lookup?id=1441923632&entity=podcast", "host": [ - "{{baseAppleUrl}}" + "https://api.podcastindex.org" ], "path": [ "lookup" @@ -1809,6 +1809,264 @@ "response": [] } ] + }, + { + "name": "Static Data", + "item": [ + { + "name": "Dead Feeds", + "request": { + "auth": { + "type": "noauth" + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://public.podcastindex.org/podcastindex_dead_feeds.csv", + "host": [ + "https://public.podcastindex.org" + ], + "path": [ + "podcastindex_dead_feeds.csv" + ], + "query": [ + ] + }, + "description": "Lists all feed Ids that have been marked dead in the Podcast Index database. The list is updated every X hours.\n\n\nA subset of stats can be retrieved using the API endpoint [podcasts/dead](#get-/podcasts/dead).\n\n\nDownload from: https://public.podcastindex.org/podcastindex_dead_feeds.csv" + }, + "response": [] + }, + { + "name": "Feeds Database", + "request": { + "auth": { + "type": "noauth" + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://public.podcastindex.org/podcastindex_feeds.db.tgz", + "host": [ + "https://public.podcastindex.org" + ], + "path": [ + "podcastindex_feeds.db.tgz" + ], + "query": [ + ] + }, + "description": "Compressed database of all non-dead feeds in the Podcast Index database.\n\n\nUpdated daily. Some attributes excluded. No episodes included.\n\n\nDownload from: https://public.podcastindex.org/podcastindex_feeds.db.tgz" + }, + "response": [] + }, + { + "name": "Stats Daily Counts", + "request": { + "auth": { + "type": "noauth" + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://stats.podcastindex.org/daily_counts.json", + "host": [ + "https://stats.podcastindex.org" + ], + "path": [ + "daily_counts.json" + ], + "query": [ + ] + }, + "description": "Report a number of statistics about the feeds in Podcast Index's database. Updated daily.\n\n\nA subset of stats can be retrieved using the API endpoint [stats/current](#get-/stats/current).\n\n\nView at: https://stats.podcastindex.org/daily_counts.json" + }, + "response": [] + }, + { + "name": "Stats Hourly Counts", + "request": { + "auth": { + "type": "noauth" + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://stats.podcastindex.org/hourly_counts.json", + "host": [ + "https://stats.podcastindex.org" + ], + "path": [ + "hourly_counts.json" + ], + "query": [ + ] + }, + "description": "Report a number of statistics about the feeds in Podcast Index's database. Updated hourly.\n\n\nA subset of stats can be retrieved using the API endpoint [stats/current](#get-/stats/current).\n\n\nView at: https://stats.podcastindex.org/hourly_counts.json" + }, + "response": [] + }, + { + "name": "v4v Music Chart JSON", + "request": { + "auth": { + "type": "noauth" + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://stats.podcastindex.org/v4vmusic.json", + "host": [ + "https://stats.podcastindex.org" + ], + "path": [ + "v4vmusic.json" + ], + "query": [ + ] + }, + "description": "Contains the ranking of the music tracks played on podcasts that have been boosted the most over the last 7 days.\n\nEach entry shows the number of listener boosts sent over this time period. The chart is updated hourly.\n\n\nCan be viewed in a browser at https://podcastindex.top/ (https://stats.podcastindex.org/v4vmusic.html).\n\n\nView at: https://stats.podcastindex.org/v4vmusic.json\n\n\nAlso available in [OPML](#get-/static/stats/v4vmusic.opml) and [RSS](#get-/static/stats/v4vmusic.rss)." + }, + "response": [] + }, + { + "name": "v4v Music Chart OPML", + "request": { + "auth": { + "type": "noauth" + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://stats.podcastindex.org/v4vmusic.opml", + "host": [ + "https://stats.podcastindex.org" + ], + "path": [ + "v4vmusic.opml" + ], + "query": [ + ] + }, + "description": "Contains the ranking of the music tracks played on podcasts that have been boosted the most over the last 7 days.\n\nEach entry shows the number of listener boosts sent over this time period. The chart is updated hourly.\n\n\nCan be viewed in a browser at https://podcastindex.top/ (https://stats.podcastindex.org/v4vmusic.html).\n\n\nView at: https://stats.podcastindex.org/v4vmusic.opml\n\n\nAlso available in [JSON](#get-/static/stats/v4vmusic.json) and [RSS](#get-/static/stats/v4vmusic.rss)." + }, + "response": [] + }, + { + "name": "v4v Music Chart RSS", + "request": { + "auth": { + "type": "noauth" + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://stats.podcastindex.org/v4vmusic.rss", + "host": [ + "https://stats.podcastindex.org" + ], + "path": [ + "v4vmusic.rss" + ], + "query": [ + ] + }, + "description": "Contains the ranking of the music tracks played on podcasts that have been boosted the most over the last 7 days.\n\nEach entry shows the number of listener boosts sent over this time period. The chart is updated hourly.\n\n\nCan be viewed in a browser at https://podcastindex.top/ (https://stats.podcastindex.org/v4vmusic.html).\n\n\nView at: https://stats.podcastindex.org/v4vmusic.rss\n\n\nAlso available in [JSON](#get-/static/stats/v4vmusic.json) and [OPML](#get-/static/stats/v4vmusic.opml)." + }, + "response": [] + }, + { + "name": "v4v Sats", + "request": { + "auth": { + "type": "noauth" + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://stats.podcastindex.org/chart-data.json", + "host": [ + "https://stats.podcastindex.org" + ], + "path": [ + "chart-data.json" + ], + "query": [ + ] + }, + "description": "Contains the raw data used to populate the graphs at https://stats.podcastindex.org/v4v.\n\nThis is a look at the total [sats](https://www.investopedia.com/terms/s/satoshi.asp) flowing through the Value4Value\nLightning podcasting economy over various periods of time.\n\nWe calculate this data based on our visibility as a one percent voluntary split on Podcastindex.org api\ncalls. Therefore, the true numbers could be higher, but they cannot be lower than listed here. This represents our\nbest approximation of how many sats are flowing across the entire ecosystem from listeners to creators, guests (via\nepisode splits), platforms, services and apps.\n\n\nView at: https://stats.podcastindex.org/chart-data.json" + }, + "response": [] + }, + { + "name": "Current", + "request": { + "auth": { + "type": "noauth" + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://tracking.podcastindex.org/current", + "host": [ + "https://tracking.podcastindex.org" + ], + "path": [ + "current" + ], + "query": [ + ] + }, + "description": "This call returns every new feed and episode added to the index over the past 24 hours in reverse chronological order.\n\n\nThis is similar to `/recent/feeds` but uses the date the feed was found by the index rather than the feed's\ninternal timestamp.\n\n\nSimilar data can also be retrieved using the API endpoint [recent/data](#get-/recent/data).\n\n\nAccess at: https://tracking.podcastindex.org/current\n\n\nThe prior 24 hours of data (going backwards until all tracked data is received) can be accessed using the timestamp\nof the previous data set. This is found in the `previousTrackingUrl`.\nThe format of these prior data sets follows the format described below." + }, + "response": [] + }, + { + "name": "Episode Value Blocks", + "request": { + "auth": { + "type": "noauth" + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://tracking.podcastindex.org/episodeValueBlocks.json", + "host": [ + "https://tracking.podcastindex.org" + ], + "path": [ + "episodeValueBlocks.json" + ], + "query": [ + ] + }, + "description": "Get all episodes with value blocks.\n\n\nAccess at: https://tracking.podcastindex.org/episodeValueBlocks.json" + }, + "response": [] + }, + { + "name": "Feed Value Blocks", + "request": { + "auth": { + "type": "noauth" + }, + "method": "GET", + "header": [], + "url": { + "raw": "https://tracking.podcastindex.org/feedValueBlocks.json", + "host": [ + "https://tracking.podcastindex.org" + ], + "path": [ + "feedValueBlocks.json" + ], + "query": [ + ] + }, + "description": "Get all feeds with value blocks.\n\n\nAccess at: https://tracking.podcastindex.org/feedValueBlocks.json" + }, + "response": [] + } + ] } ], "event": [ @@ -1846,10 +2104,6 @@ { "key": "baseUrl", "value": "https://api.podcastindex.org/api/1.0" - }, - { - "key": "baseAppleUrl", - "value": "https://api.podcastindex.org/" } ] } diff --git a/api_src/components/properties/data_static.yaml b/api_src/components/properties/data_static.yaml new file mode 100644 index 0000000..f4a8547 --- /dev/null +++ b/api_src/components/properties/data_static.yaml @@ -0,0 +1,18 @@ + # language=Markdown +description: | + Object containing the recent data +type: object +properties: + nextSince: + # language=Markdown + description: | + Value of `since` in next block of data + type: integer + format: Unix Epoch + example: 1613805249 + position: + $ref: '../properties/position.yaml' + feeds: + $ref: '../properties/feeds_data.yaml' + items: + $ref: '../properties/items_data.yaml' diff --git a/api_src/components/properties/episodeCountTotal.yaml b/api_src/components/properties/episodeCountTotal.yaml new file mode 100644 index 0000000..a9c3487 --- /dev/null +++ b/api_src/components/properties/episodeCountTotal.yaml @@ -0,0 +1,5 @@ + # language=Markdown +description: | + Total individual podcast episodes in the index. +type: integer +example: 143953477 diff --git a/api_src/components/properties/episodesWithChapters.yaml b/api_src/components/properties/episodesWithChapters.yaml new file mode 100644 index 0000000..4cfd1d0 --- /dev/null +++ b/api_src/components/properties/episodesWithChapters.yaml @@ -0,0 +1,5 @@ + # language=Markdown +description: | + Number of episodes with [`podcast:chapters`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#chapters) +type: integer +example: 652781 diff --git a/api_src/components/properties/episodesWithTranscripts.yaml b/api_src/components/properties/episodesWithTranscripts.yaml new file mode 100644 index 0000000..836301c --- /dev/null +++ b/api_src/components/properties/episodesWithTranscripts.yaml @@ -0,0 +1,7 @@ + # language=Markdown +description: | + Episodes with a + [`podcast:transcript`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#transcript) + tag. +type: integer +example: 3198597 diff --git a/api_src/components/properties/feedCountTotal.yaml b/api_src/components/properties/feedCountTotal.yaml new file mode 100644 index 0000000..bd1f953 --- /dev/null +++ b/api_src/components/properties/feedCountTotal.yaml @@ -0,0 +1,5 @@ + # language=Markdown +description: | + Total podcast feeds in the index. +type: integer +example: 4257865 diff --git a/api_src/components/properties/feedsWithChapters.yaml b/api_src/components/properties/feedsWithChapters.yaml new file mode 100644 index 0000000..daf4c96 --- /dev/null +++ b/api_src/components/properties/feedsWithChapters.yaml @@ -0,0 +1,7 @@ + # language=Markdown +description: | + Podcast feeds with a + [`podcast:chapters`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#chapters) + tag in at least 1 episode. +type: integer +example: 35582 diff --git a/api_src/components/properties/feedsWithFundingTag.yaml b/api_src/components/properties/feedsWithFundingTag.yaml new file mode 100644 index 0000000..b422e49 --- /dev/null +++ b/api_src/components/properties/feedsWithFundingTag.yaml @@ -0,0 +1,7 @@ + # language=Markdown +description: | + Podcast feeds with a + [`podcast:funding`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#funding) + tag in at least 1 episode. +type: integer +example: 57582 diff --git a/api_src/components/properties/feedsWithMediumMusic.yaml b/api_src/components/properties/feedsWithMediumMusic.yaml new file mode 100644 index 0000000..d393b71 --- /dev/null +++ b/api_src/components/properties/feedsWithMediumMusic.yaml @@ -0,0 +1,7 @@ + # language=Markdown +description: | + Podcast feeds with a + [`podcast:medium`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#medium) + tag with a value of `music`. +type: integer +example: 3700 diff --git a/api_src/components/properties/feedsWithMediumVideo.yaml b/api_src/components/properties/feedsWithMediumVideo.yaml new file mode 100644 index 0000000..8edbef7 --- /dev/null +++ b/api_src/components/properties/feedsWithMediumVideo.yaml @@ -0,0 +1,7 @@ + # language=Markdown +description: | + Podcast feeds with a + [`podcast:medium`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#medium) + tag with a value of `video`. +type: integer +example: 1288 diff --git a/api_src/components/properties/feedsWithNewEpisodes10days.yaml b/api_src/components/properties/feedsWithNewEpisodes10days.yaml new file mode 100644 index 0000000..2a3d025 --- /dev/null +++ b/api_src/components/properties/feedsWithNewEpisodes10days.yaml @@ -0,0 +1,5 @@ + # language=Markdown +description: | + Podcast feeds with a new episode released in the last 10 days. +type: integer +example: 212322 diff --git a/api_src/components/properties/feedsWithNewEpisodes14days.yaml b/api_src/components/properties/feedsWithNewEpisodes14days.yaml new file mode 100644 index 0000000..c6ff5fc --- /dev/null +++ b/api_src/components/properties/feedsWithNewEpisodes14days.yaml @@ -0,0 +1,5 @@ + # language=Markdown +description: | + Podcast feeds with a new episode released in the last 14 days. +type: integer +example: 239664 diff --git a/api_src/components/properties/feedsWithNewEpisodes30days.yaml b/api_src/components/properties/feedsWithNewEpisodes30days.yaml new file mode 100644 index 0000000..a2b210f --- /dev/null +++ b/api_src/components/properties/feedsWithNewEpisodes30days.yaml @@ -0,0 +1,5 @@ + # language=Markdown +description: | + Podcast feeds with a new episode released in the last 30 days. +type: integer +example: 306748 diff --git a/api_src/components/properties/feedsWithNewEpisodes3days.yaml b/api_src/components/properties/feedsWithNewEpisodes3days.yaml new file mode 100644 index 0000000..7fe5075 --- /dev/null +++ b/api_src/components/properties/feedsWithNewEpisodes3days.yaml @@ -0,0 +1,5 @@ + # language=Markdown +description: | + Podcast feeds with a new episode released in the last 3 days. +type: integer +example: 97522 diff --git a/api_src/components/properties/feedsWithNewEpisodes60days.yaml b/api_src/components/properties/feedsWithNewEpisodes60days.yaml new file mode 100644 index 0000000..d6b24b8 --- /dev/null +++ b/api_src/components/properties/feedsWithNewEpisodes60days.yaml @@ -0,0 +1,5 @@ + # language=Markdown +description: | + Podcast feeds with a new episode released in the last 60 days. +type: integer +example: 382945 diff --git a/api_src/components/properties/feedsWithNewEpisodes7days.yaml b/api_src/components/properties/feedsWithNewEpisodes7days.yaml new file mode 100644 index 0000000..d3e877b --- /dev/null +++ b/api_src/components/properties/feedsWithNewEpisodes7days.yaml @@ -0,0 +1,5 @@ + # language=Markdown +description: | + Podcast feeds with a new episode released in the last 7 days. +type: integer +example: 179043 diff --git a/api_src/components/properties/feedsWithNewEpisodes90days.yaml b/api_src/components/properties/feedsWithNewEpisodes90days.yaml new file mode 100644 index 0000000..2145e98 --- /dev/null +++ b/api_src/components/properties/feedsWithNewEpisodes90days.yaml @@ -0,0 +1,5 @@ + # language=Markdown +description: | + Podcast feeds with a new episode released in the last 90 days. +type: integer +example: 436933 diff --git a/api_src/components/properties/feedsWithTranscripts.yaml b/api_src/components/properties/feedsWithTranscripts.yaml new file mode 100644 index 0000000..71768e9 --- /dev/null +++ b/api_src/components/properties/feedsWithTranscripts.yaml @@ -0,0 +1,7 @@ + # language=Markdown +description: | + Podcast feeds with a + [`podcast:transcript`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#transcript) + tag in at least 1 episode. +type: integer +example: 61385 diff --git a/api_src/components/properties/feedsWithValueBlocks.yaml b/api_src/components/properties/feedsWithValueBlocks.yaml new file mode 100644 index 0000000..9ba3147 --- /dev/null +++ b/api_src/components/properties/feedsWithValueBlocks.yaml @@ -0,0 +1,7 @@ + # language=Markdown +description: | + Podcast feeds with a + [`podcast:value`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#value) + tag in at least 1 episode. +type: integer +example: 21916 diff --git a/api_src/components/properties/newEpisodes10days.yaml b/api_src/components/properties/newEpisodes10days.yaml new file mode 100644 index 0000000..d1d1311 --- /dev/null +++ b/api_src/components/properties/newEpisodes10days.yaml @@ -0,0 +1,5 @@ + # language=Markdown +description: | + Podcast feeds with a new episode containing a released in the last 10 days. +type: integer +example: 684833 diff --git a/api_src/components/properties/newEpisodes14days.yaml b/api_src/components/properties/newEpisodes14days.yaml new file mode 100644 index 0000000..37bb8dd --- /dev/null +++ b/api_src/components/properties/newEpisodes14days.yaml @@ -0,0 +1,5 @@ + # language=Markdown +description: | + Podcast feeds with a new episode containing a released in the last 14 days. +type: integer +example: 907203 diff --git a/api_src/components/properties/newEpisodes30days.yaml b/api_src/components/properties/newEpisodes30days.yaml new file mode 100644 index 0000000..6d79911 --- /dev/null +++ b/api_src/components/properties/newEpisodes30days.yaml @@ -0,0 +1,5 @@ + # language=Markdown +description: | + Podcast feeds with a new episode containing a released in the last 30 days. +type: integer +example: 1901547 diff --git a/api_src/components/properties/newEpisodes3days.yaml b/api_src/components/properties/newEpisodes3days.yaml new file mode 100644 index 0000000..bd350a6 --- /dev/null +++ b/api_src/components/properties/newEpisodes3days.yaml @@ -0,0 +1,5 @@ + # language=Markdown +description: | + Podcast feeds with a new episode containing a released in the last 3 days. +type: integer +example: 212324 diff --git a/api_src/components/properties/newEpisodes60days.yaml b/api_src/components/properties/newEpisodes60days.yaml new file mode 100644 index 0000000..859ba73 --- /dev/null +++ b/api_src/components/properties/newEpisodes60days.yaml @@ -0,0 +1,5 @@ + # language=Markdown +description: | + Podcast feeds with a new episode containing a released in the last 60 days. +type: integer +example: 3710750 diff --git a/api_src/components/properties/newEpisodes7days.yaml b/api_src/components/properties/newEpisodes7days.yaml new file mode 100644 index 0000000..e07875a --- /dev/null +++ b/api_src/components/properties/newEpisodes7days.yaml @@ -0,0 +1,5 @@ + # language=Markdown +description: | + Podcast feeds with a new episode containing a released in the last 7 days. +type: integer +example: 442061 diff --git a/api_src/components/properties/newEpisodes90days.yaml b/api_src/components/properties/newEpisodes90days.yaml new file mode 100644 index 0000000..4dbf144 --- /dev/null +++ b/api_src/components/properties/newEpisodes90days.yaml @@ -0,0 +1,5 @@ + # language=Markdown +description: | + Podcast feeds with a new episode containing a released in the last 90 days. +type: integer +example: 5498580 diff --git a/api_src/components/properties/paidFeedsWithNewEpisodes10days.yaml b/api_src/components/properties/paidFeedsWithNewEpisodes10days.yaml new file mode 100644 index 0000000..9c2f5ec --- /dev/null +++ b/api_src/components/properties/paidFeedsWithNewEpisodes10days.yaml @@ -0,0 +1,7 @@ + # language=Markdown +description: | + Podcast feeds with a new episode containing a + [`podcast:value`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#value) + block released in the last 10 days. +type: integer +example: 165789 diff --git a/api_src/components/properties/paidFeedsWithNewEpisodes14days.yaml b/api_src/components/properties/paidFeedsWithNewEpisodes14days.yaml new file mode 100644 index 0000000..bba0a7d --- /dev/null +++ b/api_src/components/properties/paidFeedsWithNewEpisodes14days.yaml @@ -0,0 +1,7 @@ + # language=Markdown +description: | + Podcast feeds with a new episode containing a + [`podcast:value`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#value) + block released in the last 14 days. +type: integer +example: 186602 diff --git a/api_src/components/properties/paidFeedsWithNewEpisodes30days.yaml b/api_src/components/properties/paidFeedsWithNewEpisodes30days.yaml new file mode 100644 index 0000000..86186d8 --- /dev/null +++ b/api_src/components/properties/paidFeedsWithNewEpisodes30days.yaml @@ -0,0 +1,7 @@ + # language=Markdown +description: | + Podcast feeds with a new episode containing a + [`podcast:value`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#value) + block released in the last 30 days. +type: integer +example: 237389 diff --git a/api_src/components/properties/paidFeedsWithNewEpisodes3days.yaml b/api_src/components/properties/paidFeedsWithNewEpisodes3days.yaml new file mode 100644 index 0000000..824f9f8 --- /dev/null +++ b/api_src/components/properties/paidFeedsWithNewEpisodes3days.yaml @@ -0,0 +1,7 @@ + # language=Markdown +description: | + Podcast feeds with a new episode containing a + [`podcast:value`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#value) + block released in the last 3 days. +type: integer +example: 77638 diff --git a/api_src/components/properties/paidFeedsWithNewEpisodes60days.yaml b/api_src/components/properties/paidFeedsWithNewEpisodes60days.yaml new file mode 100644 index 0000000..ca93291 --- /dev/null +++ b/api_src/components/properties/paidFeedsWithNewEpisodes60days.yaml @@ -0,0 +1,7 @@ + # language=Markdown +description: | + Podcast feeds with a new episode containing a + [`podcast:value`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#value) + block released in the last 60 days. +type: integer +example: 77632 diff --git a/api_src/components/properties/paidFeedsWithNewEpisodes7days.yaml b/api_src/components/properties/paidFeedsWithNewEpisodes7days.yaml new file mode 100644 index 0000000..0b48728 --- /dev/null +++ b/api_src/components/properties/paidFeedsWithNewEpisodes7days.yaml @@ -0,0 +1,7 @@ + # language=Markdown +description: | + Podcast feeds with a new episode containing a + [`podcast:value`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#value) + block released in the last 7 days. +type: integer +example: 140275 diff --git a/api_src/components/properties/paidFeedsWithNewEpisodes90days.yaml b/api_src/components/properties/paidFeedsWithNewEpisodes90days.yaml new file mode 100644 index 0000000..ebf4f18 --- /dev/null +++ b/api_src/components/properties/paidFeedsWithNewEpisodes90days.yaml @@ -0,0 +1,7 @@ + # language=Markdown +description: | + Podcast feeds with a new episode containing a + [`podcast:value`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#value) + block released in the last 90 days. +type: integer +example: 335380 diff --git a/api_src/components/properties/stats.yaml b/api_src/components/properties/stats.yaml index 57c3f57..5e593c0 100644 --- a/api_src/components/properties/stats.yaml +++ b/api_src/components/properties/stats.yaml @@ -4,37 +4,16 @@ description: | type: object properties: feedCountTotal: - # language=Markdown - description: Total podcast feeds in the index. - type: integer - example: 4048514 + $ref: "feedCountTotal.yaml" episodeCountTotal: - # language=Markdown - description: Total individual podcast episodes in the index. - type: integer - example: 112890355 + $ref: "episodeCountTotal.yaml" feedsWithNewEpisodes3days: - # language=Markdown - description: Podcast feeds with a new episode released in the last 3 days. - type: integer - example: 87369 + $ref: "feedsWithNewEpisodes3days.yaml" feedsWithNewEpisodes10days: - # language=Markdown - description: Podcast feeds with a new episode released in the last 10 days. - type: integer - example: 242922 + $ref: "feedsWithNewEpisodes10days.yaml" feedsWithNewEpisodes30days: - # language=Markdown - description: Podcast feeds with a new episode released in the last 30 days. - type: integer - example: 352744 + $ref: "feedsWithNewEpisodes30days.yaml" feedsWithNewEpisodes90days: - # language=Markdown - description: Podcast feeds with a new episode released in the last 90 days. - type: integer - example: 478568 + $ref: "feedsWithNewEpisodes90days.yaml" feedsWithValueBlocks: - # language=Markdown - description: Podcast feeds with a value block - type: integer - example: 9772 + $ref: "feedsWithValueBlocks.yaml" diff --git a/api_src/components/responses/400_static.yaml b/api_src/components/responses/400_static.yaml new file mode 100644 index 0000000..ca9ad99 --- /dev/null +++ b/api_src/components/responses/400_static.yaml @@ -0,0 +1,18 @@ +description: Invalid request +content: + application/xml: + schema: + type: object + properties: + Error: + type: object + properties: + Code: + type: string + RequestId: + type: string + HostId: + type: string + example: + status: "false" + description: "Invalid parameters" diff --git a/api_src/components/responses/404.yaml b/api_src/components/responses/404.yaml new file mode 100644 index 0000000..9f81352 --- /dev/null +++ b/api_src/components/responses/404.yaml @@ -0,0 +1 @@ +description: Not found diff --git a/api_src/components/responses/static_current.yaml b/api_src/components/responses/static_current.yaml new file mode 100644 index 0000000..f00aec9 --- /dev/null +++ b/api_src/components/responses/static_current.yaml @@ -0,0 +1,24 @@ + # language=markdown +description: | + The feed and episode data seen by the Podcast Index. +content: + application/json: + schema: + type: object + properties: + status: + $ref: '../properties/status.yaml' + feedCount: + $ref: '../properties/feedCount.yaml' + itemCount: + $ref: '../properties/itemCount.yaml' + max: + $ref: '../properties/max.yaml' + since: + $ref: '../properties/since.yaml' + previousTrackingUrl: + description: URL to previous set of data + type: string + example: "https://tracking.podcastindex.org/1724468201" + data: + $ref: '../properties/data_static.yaml' diff --git a/api_src/components/responses/static_dead_feeds.yaml b/api_src/components/responses/static_dead_feeds.yaml new file mode 100644 index 0000000..e5b795e --- /dev/null +++ b/api_src/components/responses/static_dead_feeds.yaml @@ -0,0 +1,22 @@ + # language=markdown +description: | + Feed Ids in CSV file format. + + + Each row is the feed id. No Header. + + + Example: + + + ```csv + 3, + 38, + 43, + 45, + 56, + ``` +content: + application/csv: + schema: + type: object diff --git a/api_src/components/responses/static_feeds_db.yaml b/api_src/components/responses/static_feeds_db.yaml new file mode 100644 index 0000000..3687af9 --- /dev/null +++ b/api_src/components/responses/static_feeds_db.yaml @@ -0,0 +1,7 @@ + # language=markdown +description: | + Podcast Index Feeds Database +content: + application/gzip: + schema: + type: object diff --git a/api_src/components/responses/static_music_json.yaml b/api_src/components/responses/static_music_json.yaml new file mode 100644 index 0000000..64a9fd8 --- /dev/null +++ b/api_src/components/responses/static_music_json.yaml @@ -0,0 +1,45 @@ +description: The hourly Top X music +content: + application/json: + schema: + type: object + properties: + title: + description: Title of music + type: string + example: "Podcasting 2.0 Top 100 (Music)" + description: + description: Description of object + type: string + example: "An hourly Top 100 music playlist." + timestamp: + description: Date updated + type: integer + example: 1724465107 + items: + description: Array of top X music feeds + type: object + properties: + rank: + description: Rank in chart + type: integer + example: 1 + boosts: + description: Number of boosts + type: string + example: "42" + title: + description: Title of Track + type: string + example: "To be in Nashville" + image: + $ref: "../properties/image_episode.yaml" + feedId: + $ref: "../properties/id_feed.yaml" + feedUrl: + $ref: "../properties/url_feed.yaml" + feedGuid: + $ref: "../properties/podcastguid.yaml" + itemGuid: + $ref: "../properties/guid.yaml" + diff --git a/api_src/components/responses/static_music_opml.yaml b/api_src/components/responses/static_music_opml.yaml new file mode 100644 index 0000000..9b90d39 --- /dev/null +++ b/api_src/components/responses/static_music_opml.yaml @@ -0,0 +1,34 @@ + # language=markdown +description: | + The hourly Top X music + + + Data follows the [OPML spec](https://opml.org/spec2.opml) with additions of + [Podcast Namespace](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md) attributes. + + + Example `outline` entry: + + ```xml + + ``` + + Attributes: + + - `text` + - Title of Track + - Example: `"To be in Nashville"` + - `xmlUrl` + - Feed URL track is in + - Example: `"https://files.heycitizen.xyz/Songs/Albums/The-Heycitizen-Experience/the heycitizen experience.xml"` + - `podcast:feedGuid` + - The GUID from the `podcast:guid` tag in the feed. This value is a unique, global identifier for the podcast. + - See the namespace spec for [guid](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#guid) for details. + - Example: `"a2d2e313-9cbd-5169-b89c-ab07b33ecc33"` + - `podcast:itemGuid` + - The unique identifier for the episode + - Example: `"ac34129c-c78a-463e-a64f-01405e1f2be4"` +content: + application/xml: + schema: + type: object diff --git a/api_src/components/responses/static_music_rss.yaml b/api_src/components/responses/static_music_rss.yaml new file mode 100644 index 0000000..2ffa895 --- /dev/null +++ b/api_src/components/responses/static_music_rss.yaml @@ -0,0 +1,15 @@ + # language=markdown +description: | + The hourly Top X music + + + Data follows the RSS XML spec with additions of + [Podcast Namespace](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md) attributes. + + + The [`podcast:remoteItem`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#remote-item) + is used to reference the episodes in the music chart. +content: + "application/rss+xml": + schema: + type: object diff --git a/api_src/components/responses/static_sats_data.yaml b/api_src/components/responses/static_sats_data.yaml new file mode 100644 index 0000000..c9280b6 --- /dev/null +++ b/api_src/components/responses/static_sats_data.yaml @@ -0,0 +1,70 @@ +description: Object containing the number of sats, transactions, and senders. +content: + application/json: + schema: + type: object + properties: + sats: + description: Array of sats seen in transactions on the specified date (x) + type: array + items: + type: object + properties: + x: + description: Date in YYYY-M-D format. + type: string + example: "2024-5-24" + y: + description: Number of sats transacted + type: integer + example: 629594 + senders: + description: Array of senders (supporters) seen in transactions on the specified date (x) + type: array + items: + type: object + properties: + x: + description: Date in YYYY-M-D format. + type: string + example: "2024-5-24" + y: + description: Number of senders + type: integer + example: 238 + txs: + description: Array of transactions on the specified date (x) + type: array + items: + type: object + properties: + x: + description: Date in YYYY-M-D format. + type: string + example: "2024-5-24" + y: + description: Number of transactions + type: integer + example: 8212 + colors: + description: Colors used in graphs + type: object + properties: + txcolor: + type: string + example: "#ff3333" + color14: + type: string + example: "#9370db" + color30: + type: string + example: "#58d68d" + color60: + type: string + example: "#0088cc" + color7: + type: string + example: "#fffa90" + color90: + type: string + example: "#ff8800" diff --git a/api_src/components/responses/static_stats_counts.yaml b/api_src/components/responses/static_stats_counts.yaml new file mode 100644 index 0000000..bff2ac9 --- /dev/null +++ b/api_src/components/responses/static_stats_counts.yaml @@ -0,0 +1,68 @@ +description: Object containing the statistics for the Podcast Index feed data +content: + application/json: + schema: + type: object + properties: + feedCountTotal: + $ref: "../properties/feedCountTotal.yaml" + episodeCountTotal: + $ref: "../properties/episodeCountTotal.yaml" + feedsWithNewEpisodes3days: + $ref: "../properties/feedsWithNewEpisodes3days.yaml" + feedsWithNewEpisodes7days: + $ref: "../properties/feedsWithNewEpisodes7days.yaml" + feedsWithNewEpisodes10days: + $ref: "../properties/feedsWithNewEpisodes10days.yaml" + feedsWithNewEpisodes14days: + $ref: "../properties/feedsWithNewEpisodes14days.yaml" + feedsWithNewEpisodes30days: + $ref: "../properties/feedsWithNewEpisodes30days.yaml" + feedsWithNewEpisodes60days: + $ref: "../properties/feedsWithNewEpisodes60days.yaml" + feedsWithNewEpisodes90days: + $ref: "../properties/feedsWithNewEpisodes90days.yaml" + paidFeedsWithNewEpisodes3days: + $ref: "../properties/paidFeedsWithNewEpisodes3days.yaml" + paidFeedsWithNewEpisodes7days: + $ref: "../properties/paidFeedsWithNewEpisodes7days.yaml" + paidFeedsWithNewEpisodes10days: + $ref: "../properties/paidFeedsWithNewEpisodes10days.yaml" + paidFeedsWithNewEpisodes14days: + $ref: "../properties/paidFeedsWithNewEpisodes14days.yaml" + paidFeedsWithNewEpisodes30days: + $ref: "../properties/paidFeedsWithNewEpisodes30days.yaml" + paidFeedsWithNewEpisodes60days: + $ref: "../properties/paidFeedsWithNewEpisodes60days.yaml" + paidFeedsWithNewEpisodes90days: + $ref: "../properties/paidFeedsWithNewEpisodes90days.yaml" + newEpisodes3days: + $ref: "../properties/newEpisodes3days.yaml" + newEpisodes7days: + $ref: "../properties/newEpisodes7days.yaml" + newEpisodes10days: + $ref: "../properties/newEpisodes10days.yaml" + newEpisodes14days: + $ref: "../properties/newEpisodes14days.yaml" + newEpisodes30days: + $ref: "../properties/newEpisodes30days.yaml" + newEpisodes60days: + $ref: "../properties/newEpisodes60days.yaml" + newEpisodes90days: + $ref: "../properties/newEpisodes90days.yaml" + feedsWithValueBlocks: + $ref: "../properties/feedsWithValueBlocks.yaml" + feedsWithFundingTag: + $ref: "../properties/feedsWithFundingTag.yaml" + feedsWithTranscripts: + $ref: "../properties/feedsWithTranscripts.yaml" + episodesWithTranscripts: + $ref: "../properties/episodesWithTranscripts.yaml" + feedsWithChapters: + $ref: "../properties/feedsWithChapters.yaml" + episodesWithChapters: + $ref: "../properties/episodesWithChapters.yaml" + feedsWithMediumMusic: + $ref: "../properties/feedsWithMediumMusic.yaml" + feedsWithMediumVideo: + $ref: "../properties/feedsWithMediumVideo.yaml" diff --git a/api_src/components/responses/static_tracking_episode_value_blocks.yaml b/api_src/components/responses/static_tracking_episode_value_blocks.yaml new file mode 100644 index 0000000..392ac0b --- /dev/null +++ b/api_src/components/responses/static_tracking_episode_value_blocks.yaml @@ -0,0 +1,24 @@ +description: Array of episodes containing value blocks +content: + application/json: + schema: + type: array + items: + type: object + properties: + episodeGuid: + $ref: "../properties/guid.yaml" + episodeId: + $ref: "../properties/id_episode.yaml" + feedId: + $ref: "../properties/id_feed.yaml" + feedUrl: + $ref: "../properties/url_feed.yaml" + itunesId: + $ref: "../properties/itunesId_feed.yaml" + podcastGuid: + $ref: "../properties/podcastguid.yaml" + value: + $ref: "../properties/value.yaml" + valueCreatedOn: + $ref: "../properties/valueCreatedOn.yaml" diff --git a/api_src/components/responses/static_tracking_feed_value_blocks.yaml b/api_src/components/responses/static_tracking_feed_value_blocks.yaml new file mode 100644 index 0000000..7c9cb32 --- /dev/null +++ b/api_src/components/responses/static_tracking_feed_value_blocks.yaml @@ -0,0 +1,20 @@ +description: Array of episodes containing value blocks +content: + application/json: + schema: + type: array + items: + type: object + properties: + id: + $ref: "../properties/id_feed.yaml" + itunesId: + $ref: "../properties/itunesId_feed.yaml" + podcastGuid: + $ref: "../properties/podcastguid.yaml" + url: + $ref: "../properties/url_feed.yaml" + value: + $ref: "../properties/value.yaml" + valueCreatedOn: + $ref: "../properties/valueCreatedOn.yaml" diff --git a/api_src/paths/podcasts/dead.yaml b/api_src/paths/podcasts/dead.yaml index 883db70..6929596 100644 --- a/api_src/paths/podcasts/dead.yaml +++ b/api_src/paths/podcasts/dead.yaml @@ -5,9 +5,10 @@ get: # language=Markdown description: | This call returns all feeds that have been marked dead (`dead` == 1) - - - Dead feeds can also be accessed from object storage at https://public.podcastindex.org/podcastindex_dead_feeds.csv + + + Hourly statistics can also be access at https://public.podcastindex.org/podcastindex_dead_feeds.csv + For details, see [Dead Feeds](#get-/static/public/podcastindex_dead_feeds.csv). Example: https://api.podcastindex.org/api/1.0/podcasts/dead?pretty diff --git a/api_src/paths/recent/data.yaml b/api_src/paths/recent/data.yaml index 17471d3..389c4c4 100644 --- a/api_src/paths/recent/data.yaml +++ b/api_src/paths/recent/data.yaml @@ -5,17 +5,18 @@ get: # language=Markdown description: | This call returns every new feed and episode added to the index over the past 24 hours in reverse chronological order. - - + + This is similar to `/recent/feeds` but uses the date the feed was found by the index rather than the feed's internal timestamp. - - + + Similar data can also be accessed using object storage root url https://tracking.podcastindex.org/current - - + For details, see [Current](#get-/static/tracking/current). + + Examples: - + - https://api.podcastindex.org/api/1.0/recent/data?pretty - https://api.podcastindex.org/api/1.0/recent/data?pretty&max=10 - https://api.podcastindex.org/api/1.0/recent/data?pretty&max=10&since=1671164867 diff --git a/api_src/paths/static/public/podcastindex_dead_feeds.yaml b/api_src/paths/static/public/podcastindex_dead_feeds.yaml new file mode 100644 index 0000000..2449941 --- /dev/null +++ b/api_src/paths/static/public/podcastindex_dead_feeds.yaml @@ -0,0 +1,25 @@ +get: + tags: + - Static Data + summary: Dead Feeds + # language=Markdown + description: | + Lists all feed Ids that have been marked dead in the Podcast Index database. The list is updated every X hours. + + + A subset of stats can be retrieved using the API endpoint [podcasts/dead](#get-/podcasts/dead). + + + Download from: https://public.podcastindex.org/podcastindex_dead_feeds.csv + operationId: podcastindex_dead_feeds.csv + security: [] # no security required + servers: + - url: 'https://public.podcastindex.org' + description: "Podcast Index Public" + responses: + '200': + $ref: '../../../components/responses/static_dead_feeds.yaml' + '400': + $ref: '../../../components/responses/400_static.yaml' + '404': + $ref: '../../../components/responses/404.yaml' diff --git a/api_src/paths/static/public/podcastindex_feeds_db.yaml b/api_src/paths/static/public/podcastindex_feeds_db.yaml new file mode 100644 index 0000000..55a9440 --- /dev/null +++ b/api_src/paths/static/public/podcastindex_feeds_db.yaml @@ -0,0 +1,25 @@ +get: + tags: + - Static Data + summary: Feeds Database + # language=Markdown + description: | + Compressed database of all non-dead feeds in the Podcast Index database. + + + Updated daily. Some attributes excluded. No episodes included. + + + Download from: https://public.podcastindex.org/podcastindex_feeds.db.tgz + operationId: podcastindex_feeds_db.tgz + security: [] # no security required + servers: + - url: 'https://public.podcastindex.org' + description: "Podcast Index Public" + responses: + '200': + $ref: '../../../components/responses/static_feeds_db.yaml' + '400': + $ref: '../../../components/responses/400_static.yaml' + '404': + $ref: '../../../components/responses/404.yaml' diff --git a/api_src/paths/static/stats/daily_counts.yaml b/api_src/paths/static/stats/daily_counts.yaml new file mode 100644 index 0000000..5d9fdcc --- /dev/null +++ b/api_src/paths/static/stats/daily_counts.yaml @@ -0,0 +1,25 @@ +get: + tags: + - Static Data + summary: Stats Daily Counts + # language=Markdown + description: | + Report a number of statistics about the feeds in Podcast Index's database. Updated daily. + + + A subset of stats can be retrieved using the API endpoint [stats/current](#get-/stats/current). + + + View at: https://stats.podcastindex.org/daily_counts.json + operationId: daily_counts.json + security: [] # no security required + servers: + - url: 'https://stats.podcastindex.org' + description: "Podcast Index Stats" + responses: + '200': + $ref: '../../../components/responses/static_stats_counts.yaml' + '400': + $ref: '../../../components/responses/400_static.yaml' + '404': + $ref: '../../../components/responses/404.yaml' diff --git a/api_src/paths/static/stats/hourly_counts.yaml b/api_src/paths/static/stats/hourly_counts.yaml new file mode 100644 index 0000000..3884593 --- /dev/null +++ b/api_src/paths/static/stats/hourly_counts.yaml @@ -0,0 +1,25 @@ +get: + tags: + - Static Data + summary: Stats Hourly Counts + # language=Markdown + description: | + Report a number of statistics about the feeds in Podcast Index's database. Updated hourly. + + + A subset of stats can be retrieved using the API endpoint [stats/current](#get-/stats/current). + + + View at: https://stats.podcastindex.org/hourly_counts.json + operationId: hourly_counts.json + security: [] # no security required + servers: + - url: 'https://stats.podcastindex.org' + description: "Podcast Index Stats" + responses: + '200': + $ref: '../../../components/responses/static_stats_counts.yaml' + '400': + $ref: '../../../components/responses/400_static.yaml' + '404': + $ref: '../../../components/responses/404.yaml' diff --git a/api_src/paths/static/stats/music_json.yaml b/api_src/paths/static/stats/music_json.yaml new file mode 100644 index 0000000..d55258a --- /dev/null +++ b/api_src/paths/static/stats/music_json.yaml @@ -0,0 +1,30 @@ +get: + tags: + - Static Data + summary: v4v Music Chart JSON + # language=Markdown + description: | + Contains the ranking of the music tracks played on podcasts that have been boosted the most over the last 7 days. + + Each entry shows the number of listener boosts sent over this time period. The chart is updated hourly. + + + Can be viewed in a browser at https://podcastindex.top/ (https://stats.podcastindex.org/v4vmusic.html). + + + View at: https://stats.podcastindex.org/v4vmusic.json + + + Also available in [OPML](#get-/static/stats/v4vmusic.opml) and [RSS](#get-/static/stats/v4vmusic.rss). + operationId: v4vmusic.json + security: [ ] # no security required + servers: + - url: 'https://stats.podcastindex.org' + description: "Podcast Index Stats" + responses: + '200': + $ref: '../../../components/responses/static_music_json.yaml' + '400': + $ref: '../../../components/responses/400_static.yaml' + '404': + $ref: '../../../components/responses/404.yaml' diff --git a/api_src/paths/static/stats/music_opml.yaml b/api_src/paths/static/stats/music_opml.yaml new file mode 100644 index 0000000..8fa2b07 --- /dev/null +++ b/api_src/paths/static/stats/music_opml.yaml @@ -0,0 +1,30 @@ +get: + tags: + - Static Data + summary: v4v Music Chart OPML + # language=Markdown + description: | + Contains the ranking of the music tracks played on podcasts that have been boosted the most over the last 7 days. + + Each entry shows the number of listener boosts sent over this time period. The chart is updated hourly. + + + Can be viewed in a browser at https://podcastindex.top/ (https://stats.podcastindex.org/v4vmusic.html). + + + View at: https://stats.podcastindex.org/v4vmusic.opml + + + Also available in [JSON](#get-/static/stats/v4vmusic.json) and [RSS](#get-/static/stats/v4vmusic.rss). + operationId: v4vmusic.opml + security: [ ] # no security required + servers: + - url: 'https://stats.podcastindex.org' + description: "Podcast Index Stats" + responses: + '200': + $ref: '../../../components/responses/static_music_opml.yaml' + '400': + $ref: '../../../components/responses/400_static.yaml' + '404': + $ref: '../../../components/responses/404.yaml' diff --git a/api_src/paths/static/stats/music_rss.yaml b/api_src/paths/static/stats/music_rss.yaml new file mode 100644 index 0000000..c739d85 --- /dev/null +++ b/api_src/paths/static/stats/music_rss.yaml @@ -0,0 +1,30 @@ +get: + tags: + - Static Data + summary: v4v Music Chart RSS + # language=Markdown + description: | + Contains the ranking of the music tracks played on podcasts that have been boosted the most over the last 7 days. + + Each entry shows the number of listener boosts sent over this time period. The chart is updated hourly. + + + Can be viewed in a browser at https://podcastindex.top/ (https://stats.podcastindex.org/v4vmusic.html). + + + View at: https://stats.podcastindex.org/v4vmusic.rss + + + Also available in [JSON](#get-/static/stats/v4vmusic.json) and [OPML](#get-/static/stats/v4vmusic.opml). + operationId: v4vmusic.rss + security: [ ] # no security required + servers: + - url: 'https://stats.podcastindex.org' + description: "Podcast Index Stats" + responses: + '200': + $ref: '../../../components/responses/static_music_rss.yaml' + '400': + $ref: '../../../components/responses/400_static.yaml' + '404': + $ref: '../../../components/responses/404.yaml' diff --git a/api_src/paths/static/stats/v4v.yaml b/api_src/paths/static/stats/v4v.yaml new file mode 100644 index 0000000..843e77c --- /dev/null +++ b/api_src/paths/static/stats/v4v.yaml @@ -0,0 +1,30 @@ +get: + tags: + - Static Data + summary: v4v Sats + # language=Markdown + description: | + Contains the raw data used to populate the graphs at https://stats.podcastindex.org/v4v. + + This is a look at the total [sats](https://www.investopedia.com/terms/s/satoshi.asp) flowing through the Value4Value + Lightning podcasting economy over various periods of time. + + We calculate this data based on our visibility as a one percent voluntary split on Podcastindex.org api + calls. Therefore, the true numbers could be higher, but they cannot be lower than listed here. This represents our + best approximation of how many sats are flowing across the entire ecosystem from listeners to creators, guests (via + episode splits), platforms, services and apps. + + + View at: https://stats.podcastindex.org/chart-data.json + operationId: chart-data.json + security: [ ] # no security required + servers: + - url: 'https://stats.podcastindex.org' + description: "Podcast Index Stats" + responses: + '200': + $ref: '../../../components/responses/static_sats_data.yaml' + '400': + $ref: '../../../components/responses/400_static.yaml' + '404': + $ref: '../../../components/responses/404.yaml' diff --git a/api_src/paths/static/tracking/current.yaml b/api_src/paths/static/tracking/current.yaml new file mode 100644 index 0000000..d3032c7 --- /dev/null +++ b/api_src/paths/static/tracking/current.yaml @@ -0,0 +1,34 @@ +get: + tags: + - Static Data + summary: Current + # language=Markdown + description: | + This call returns every new feed and episode added to the index over the past 24 hours in reverse chronological order. + + + This is similar to `/recent/feeds` but uses the date the feed was found by the index rather than the feed's + internal timestamp. + + + Similar data can also be retrieved using the API endpoint [recent/data](#get-/recent/data). + + + Access at: https://tracking.podcastindex.org/current + + + The prior 24 hours of data (going backwards until all tracked data is received) can be accessed using the timestamp + of the previous data set. This is found in the `previousTrackingUrl`. + The format of these prior data sets follows the format described below. + operationId: current + security: [] # no security required + servers: + - url: 'https://tracking.podcastindex.org' + description: "Podcast Index Tracking" + responses: + '200': + $ref: '../../../components/responses/static_current.yaml' + '400': + $ref: '../../../components/responses/400_static.yaml' + '404': + $ref: '../../../components/responses/404.yaml' diff --git a/api_src/paths/static/tracking/episodeValueBlocks.yaml b/api_src/paths/static/tracking/episodeValueBlocks.yaml new file mode 100644 index 0000000..4ee76b1 --- /dev/null +++ b/api_src/paths/static/tracking/episodeValueBlocks.yaml @@ -0,0 +1,22 @@ +get: + tags: + - Static Data + summary: Episode Value Blocks + # language=Markdown + description: | + Get all episodes with value blocks. + + + Access at: https://tracking.podcastindex.org/episodeValueBlocks.json + operationId: episodeValueBlocks.json + security: [] # no security required + servers: + - url: 'https://tracking.podcastindex.org' + description: "Podcast Index Tracking" + responses: + '200': + $ref: '../../../components/responses/static_tracking_episode_value_blocks.yaml' + '400': + $ref: '../../../components/responses/400_static.yaml' + '404': + $ref: '../../../components/responses/404.yaml' diff --git a/api_src/paths/static/tracking/feedValueBlocks.yaml b/api_src/paths/static/tracking/feedValueBlocks.yaml new file mode 100644 index 0000000..aa3538f --- /dev/null +++ b/api_src/paths/static/tracking/feedValueBlocks.yaml @@ -0,0 +1,22 @@ +get: + tags: + - Static Data + summary: Feed Value Blocks + # language=Markdown + description: | + Get all feeds with value blocks. + + + Access at: https://tracking.podcastindex.org/feedValueBlocks.json + operationId: feedValueBlocks.json + security: [] # no security required + servers: + - url: 'https://tracking.podcastindex.org' + description: "Podcast Index Tracking" + responses: + '200': + $ref: '../../../components/responses/static_tracking_feed_value_blocks.yaml' + '400': + $ref: '../../../components/responses/400_static.yaml' + '404': + $ref: '../../../components/responses/404.yaml' diff --git a/api_src/paths/stats/current.yaml b/api_src/paths/stats/current.yaml index 55fc996..fb64b0a 100644 --- a/api_src/paths/stats/current.yaml +++ b/api_src/paths/stats/current.yaml @@ -7,7 +7,12 @@ get: Return the most recent index statistics. - Hourly statistics can also be access at https://stats.podcastindex.org/daily_counts.json + Hourly statistics can also be access at https://stats.podcastindex.org/hourly_counts.json + For details, see [Stats Hourly Counts](#get-/static/stats/hourly_counts.json). + + + Daily statistics can also be access at https://stats.podcastindex.org/daily_counts.json. + For details, see [Stats Daily Counts](#get-/static/stats/daily_counts.json). Example: https://api.podcastindex.org/api/1.0/stats/current?pretty diff --git a/api_src/root.yaml b/api_src/root.yaml index b437149..b2abc3e 100644 --- a/api_src/root.yaml +++ b/api_src/root.yaml @@ -80,7 +80,7 @@ info: 3. Import the `PodcastIndexOrgEnvironment.postman_environment.json` to Postman 4. Click "Environments" on the left sidebar 5. Select the checkbox next to the PodcastIndexOrgEnvironment entry - 6. Set `AuthKey` and `SeceretKey` values under the "Current Value" column using your API information + 6. Set `AuthKey` and `SeceretKey` values under the "Current Value" column using your API information 7. Click "Collections" from the sidebar 8. Select PodcastIndex 9. Select and run the endpoint to test @@ -105,7 +105,7 @@ info: See [Authentication](#auth) for description of parameters. # Legal - + Legal - [Privacy Policy](https://github.com/Podcastindex-org/legal/blob/main/PrivacyPolicy.md) @@ -243,6 +243,28 @@ paths: $ref: 'paths/add/byfeedurl.yaml' '/add/byitunesid': $ref: 'paths/add/byitunesid.yaml' + '/static/stats/daily_counts.json': + $ref: 'paths/static/stats/daily_counts.yaml' + '/static/stats/hourly_counts.json': + $ref: 'paths/static/stats/hourly_counts.yaml' + '/static/stats/chart-data.json': + $ref: 'paths/static/stats/v4v.yaml' + '/static/stats/v4vmusic.json': + $ref: 'paths/static/stats/music_json.yaml' + '/static/stats/v4vmusic.opml': + $ref: 'paths/static/stats/music_opml.yaml' + '/static/stats/v4vmusic.rss': + $ref: 'paths/static/stats/music_rss.yaml' + '/static/tracking/current': + $ref: 'paths/static/tracking/current.yaml' + '/static/tracking/feedValueBlocks': + $ref: 'paths/static/tracking/feedValueBlocks.yaml' + '/static/tracking/episodeValueBlocks': + $ref: 'paths/static/tracking/episodeValueBlocks.yaml' + '/static/public/podcastindex_dead_feeds.csv': + $ref: 'paths/static/public/podcastindex_dead_feeds.yaml' + '/static/public/podcastindex_feeds.db.tgz': + $ref: 'paths/static/public/podcastindex_feeds_db.yaml' # currently not used and has some bugs. leaving off for now #'/add/batch/byfeedurl': # $ref: 'paths/add/batch/byfeedurl.yaml' diff --git a/docs/pi_api.yaml b/docs/pi_api.yaml index 54e3193..0d7ad67 100644 --- a/docs/pi_api.yaml +++ b/docs/pi_api.yaml @@ -79,7 +79,7 @@ info: 3. Import the `PodcastIndexOrgEnvironment.postman_environment.json` to Postman 4. Click "Environments" on the left sidebar 5. Select the checkbox next to the PodcastIndexOrgEnvironment entry - 6. Set `AuthKey` and `SeceretKey` values under the "Current Value" column using your API information + 6. Set `AuthKey` and `SeceretKey` values under the "Current Value" column using your API information 7. Click "Collections" from the sidebar 8. Select PodcastIndex 9. Select and run the endpoint to test @@ -698,7 +698,8 @@ paths: This call returns all feeds that have been marked dead (`dead` == 1) - Dead feeds can also be accessed from object storage at https://public.podcastindex.org/podcastindex_dead_feeds.csv + Hourly statistics can also be access at https://public.podcastindex.org/podcastindex_dead_feeds.csv + For details, see [Dead Feeds](#get-/static/public/podcastindex_dead_feeds.csv). Example: https://api.podcastindex.org/api/1.0/podcasts/dead?pretty @@ -1156,6 +1157,7 @@ paths: Similar data can also be accessed using object storage root url https://tracking.podcastindex.org/current + For details, see [Current](#get-/static/tracking/current). Examples: @@ -1389,7 +1391,12 @@ paths: Return the most recent index statistics. - Hourly statistics can also be access at https://stats.podcastindex.org/daily_counts.json + Hourly statistics can also be access at https://stats.podcastindex.org/hourly_counts.json + For details, see [Stats Hourly Counts](#get-/static/stats/hourly_counts.json). + + + Daily statistics can also be access at https://stats.podcastindex.org/daily_counts.json. + For details, see [Stats Daily Counts](#get-/static/stats/daily_counts.json). Example: https://api.podcastindex.org/api/1.0/stats/current?pretty @@ -1587,6 +1594,304 @@ paths: $ref: '#/components/responses/400' '401': $ref: '#/components/responses/401' + /static/stats/daily_counts.json: + get: + tags: + - Static Data + summary: Stats Daily Counts + description: | + Report a number of statistics about the feeds in Podcast Index's database. Updated daily. + + + A subset of stats can be retrieved using the API endpoint [stats/current](#get-/stats/current). + + + View at: https://stats.podcastindex.org/daily_counts.json + operationId: daily_counts.json + security: [] + servers: + - url: https://stats.podcastindex.org + description: Podcast Index Stats + responses: + '200': + $ref: '#/components/responses/static_stats_counts' + '400': + $ref: '#/components/responses/400_static' + '404': + $ref: '#/components/responses/404' + /static/stats/hourly_counts.json: + get: + tags: + - Static Data + summary: Stats Hourly Counts + description: | + Report a number of statistics about the feeds in Podcast Index's database. Updated hourly. + + + A subset of stats can be retrieved using the API endpoint [stats/current](#get-/stats/current). + + + View at: https://stats.podcastindex.org/hourly_counts.json + operationId: hourly_counts.json + security: [] + servers: + - url: https://stats.podcastindex.org + description: Podcast Index Stats + responses: + '200': + $ref: '#/components/responses/static_stats_counts' + '400': + $ref: '#/components/responses/400_static' + '404': + $ref: '#/components/responses/404' + /static/stats/chart-data.json: + get: + tags: + - Static Data + summary: v4v Sats + description: | + Contains the raw data used to populate the graphs at https://stats.podcastindex.org/v4v. + + This is a look at the total [sats](https://www.investopedia.com/terms/s/satoshi.asp) flowing through the Value4Value + Lightning podcasting economy over various periods of time. + + We calculate this data based on our visibility as a one percent voluntary split on Podcastindex.org api + calls. Therefore, the true numbers could be higher, but they cannot be lower than listed here. This represents our + best approximation of how many sats are flowing across the entire ecosystem from listeners to creators, guests (via + episode splits), platforms, services and apps. + + + View at: https://stats.podcastindex.org/chart-data.json + operationId: chart-data.json + security: [] + servers: + - url: https://stats.podcastindex.org + description: Podcast Index Stats + responses: + '200': + $ref: '#/components/responses/static_sats_data' + '400': + $ref: '#/components/responses/400_static' + '404': + $ref: '#/components/responses/404' + /static/stats/v4vmusic.json: + get: + tags: + - Static Data + summary: v4v Music Chart JSON + description: | + Contains the ranking of the music tracks played on podcasts that have been boosted the most over the last 7 days. + + Each entry shows the number of listener boosts sent over this time period. The chart is updated hourly. + + + Can be viewed in a browser at https://podcastindex.top/ (https://stats.podcastindex.org/v4vmusic.html). + + + View at: https://stats.podcastindex.org/v4vmusic.json + + + Also available in [OPML](#get-/static/stats/v4vmusic.opml) and [RSS](#get-/static/stats/v4vmusic.rss). + operationId: v4vmusic.json + security: [] + servers: + - url: https://stats.podcastindex.org + description: Podcast Index Stats + responses: + '200': + $ref: '#/components/responses/static_music_json' + '400': + $ref: '#/components/responses/400_static' + '404': + $ref: '#/components/responses/404' + /static/stats/v4vmusic.opml: + get: + tags: + - Static Data + summary: v4v Music Chart OPML + description: | + Contains the ranking of the music tracks played on podcasts that have been boosted the most over the last 7 days. + + Each entry shows the number of listener boosts sent over this time period. The chart is updated hourly. + + + Can be viewed in a browser at https://podcastindex.top/ (https://stats.podcastindex.org/v4vmusic.html). + + + View at: https://stats.podcastindex.org/v4vmusic.opml + + + Also available in [JSON](#get-/static/stats/v4vmusic.json) and [RSS](#get-/static/stats/v4vmusic.rss). + operationId: v4vmusic.opml + security: [] + servers: + - url: https://stats.podcastindex.org + description: Podcast Index Stats + responses: + '200': + $ref: '#/components/responses/static_music_opml' + '400': + $ref: '#/components/responses/400_static' + '404': + $ref: '#/components/responses/404' + /static/stats/v4vmusic.rss: + get: + tags: + - Static Data + summary: v4v Music Chart RSS + description: | + Contains the ranking of the music tracks played on podcasts that have been boosted the most over the last 7 days. + + Each entry shows the number of listener boosts sent over this time period. The chart is updated hourly. + + + Can be viewed in a browser at https://podcastindex.top/ (https://stats.podcastindex.org/v4vmusic.html). + + + View at: https://stats.podcastindex.org/v4vmusic.rss + + + Also available in [JSON](#get-/static/stats/v4vmusic.json) and [OPML](#get-/static/stats/v4vmusic.opml). + operationId: v4vmusic.rss + security: [] + servers: + - url: https://stats.podcastindex.org + description: Podcast Index Stats + responses: + '200': + $ref: '#/components/responses/static_music_rss' + '400': + $ref: '#/components/responses/400_static' + '404': + $ref: '#/components/responses/404' + /static/tracking/current: + get: + tags: + - Static Data + summary: Current + description: | + This call returns every new feed and episode added to the index over the past 24 hours in reverse chronological order. + + + This is similar to `/recent/feeds` but uses the date the feed was found by the index rather than the feed's + internal timestamp. + + + Similar data can also be retrieved using the API endpoint [recent/data](#get-/recent/data). + + + Access at: https://tracking.podcastindex.org/current + + + The prior 24 hours of data (going backwards until all tracked data is received) can be accessed using the timestamp + of the previous data set. This is found in the `previousTrackingUrl`. + The format of these prior data sets follows the format described below. + operationId: current + security: [] + servers: + - url: https://tracking.podcastindex.org + description: Podcast Index Tracking + responses: + '200': + $ref: '#/components/responses/static_current' + '400': + $ref: '#/components/responses/400_static' + '404': + $ref: '#/components/responses/404' + /static/tracking/feedValueBlocks: + get: + tags: + - Static Data + summary: Feed Value Blocks + description: | + Get all feeds with value blocks. + + + Access at: https://tracking.podcastindex.org/feedValueBlocks.json + operationId: feedValueBlocks.json + security: [] + servers: + - url: https://tracking.podcastindex.org + description: Podcast Index Tracking + responses: + '200': + $ref: '#/components/responses/static_tracking_feed_value_blocks' + '400': + $ref: '#/components/responses/400_static' + '404': + $ref: '#/components/responses/404' + /static/tracking/episodeValueBlocks: + get: + tags: + - Static Data + summary: Episode Value Blocks + description: | + Get all episodes with value blocks. + + + Access at: https://tracking.podcastindex.org/episodeValueBlocks.json + operationId: episodeValueBlocks.json + security: [] + servers: + - url: https://tracking.podcastindex.org + description: Podcast Index Tracking + responses: + '200': + $ref: '#/components/responses/static_tracking_episode_value_blocks' + '400': + $ref: '#/components/responses/400_static' + '404': + $ref: '#/components/responses/404' + /static/public/podcastindex_dead_feeds.csv: + get: + tags: + - Static Data + summary: Dead Feeds + description: | + Lists all feed Ids that have been marked dead in the Podcast Index database. The list is updated every X hours. + + + A subset of stats can be retrieved using the API endpoint [podcasts/dead](#get-/podcasts/dead). + + + Download from: https://public.podcastindex.org/podcastindex_dead_feeds.csv + operationId: podcastindex_dead_feeds.csv + security: [] + servers: + - url: https://public.podcastindex.org + description: Podcast Index Public + responses: + '200': + $ref: '#/components/responses/static_dead_feeds' + '400': + $ref: '#/components/responses/400_static' + '404': + $ref: '#/components/responses/404' + /static/public/podcastindex_feeds.db.tgz: + get: + tags: + - Static Data + summary: Feeds Database + description: | + Compressed database of all non-dead feeds in the Podcast Index database. + + + Updated daily. Some attributes excluded. No episodes included. + + + Download from: https://public.podcastindex.org/podcastindex_feeds.db.tgz + operationId: podcastindex_feeds_db.tgz + security: [] + servers: + - url: https://public.podcastindex.org + description: Podcast Index Public + responses: + '200': + $ref: '#/components/responses/static_feeds_db' + '400': + $ref: '#/components/responses/400_static' + '404': + $ref: '#/components/responses/404' components: securitySchemes: User-Agent: @@ -4633,39 +4938,62 @@ components: type: array items: $ref: '#/components/schemas/value_byepisodeguid_batch' + feedCountTotal: + description: | + Total podcast feeds in the index. + type: integer + example: 4257865 + episodeCountTotal: + description: | + Total individual podcast episodes in the index. + type: integer + example: 143953477 + feedsWithNewEpisodes3days: + description: | + Podcast feeds with a new episode released in the last 3 days. + type: integer + example: 97522 + feedsWithNewEpisodes10days: + description: | + Podcast feeds with a new episode released in the last 10 days. + type: integer + example: 212322 + feedsWithNewEpisodes30days: + description: | + Podcast feeds with a new episode released in the last 30 days. + type: integer + example: 306748 + feedsWithNewEpisodes90days: + description: | + Podcast feeds with a new episode released in the last 90 days. + type: integer + example: 436933 + feedsWithValueBlocks: + description: | + Podcast feeds with a + [`podcast:value`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#value) + tag in at least 1 episode. + type: integer + example: 21916 stats: description: | An array statistic properties type: object properties: feedCountTotal: - description: Total podcast feeds in the index. - type: integer - example: 4048514 + $ref: '#/components/schemas/feedCountTotal' episodeCountTotal: - description: Total individual podcast episodes in the index. - type: integer - example: 112890355 + $ref: '#/components/schemas/episodeCountTotal' feedsWithNewEpisodes3days: - description: Podcast feeds with a new episode released in the last 3 days. - type: integer - example: 87369 + $ref: '#/components/schemas/feedsWithNewEpisodes3days' feedsWithNewEpisodes10days: - description: Podcast feeds with a new episode released in the last 10 days. - type: integer - example: 242922 + $ref: '#/components/schemas/feedsWithNewEpisodes10days' feedsWithNewEpisodes30days: - description: Podcast feeds with a new episode released in the last 30 days. - type: integer - example: 352744 + $ref: '#/components/schemas/feedsWithNewEpisodes30days' feedsWithNewEpisodes90days: - description: Podcast feeds with a new episode released in the last 90 days. - type: integer - example: 478568 + $ref: '#/components/schemas/feedsWithNewEpisodes90days' feedsWithValueBlocks: - description: Podcast feeds with a value block - type: integer - example: 9772 + $ref: '#/components/schemas/feedsWithValueBlocks' id_category: description: | The internal PodcastIndex.org category ID. @@ -4698,6 +5026,169 @@ components: - 'true' - 'false' example: 'true' + feedsWithNewEpisodes7days: + description: | + Podcast feeds with a new episode released in the last 7 days. + type: integer + example: 179043 + feedsWithNewEpisodes14days: + description: | + Podcast feeds with a new episode released in the last 14 days. + type: integer + example: 239664 + feedsWithNewEpisodes60days: + description: | + Podcast feeds with a new episode released in the last 60 days. + type: integer + example: 382945 + paidFeedsWithNewEpisodes3days: + description: | + Podcast feeds with a new episode containing a + [`podcast:value`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#value) + block released in the last 3 days. + type: integer + example: 77638 + paidFeedsWithNewEpisodes7days: + description: | + Podcast feeds with a new episode containing a + [`podcast:value`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#value) + block released in the last 7 days. + type: integer + example: 140275 + paidFeedsWithNewEpisodes10days: + description: | + Podcast feeds with a new episode containing a + [`podcast:value`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#value) + block released in the last 10 days. + type: integer + example: 165789 + paidFeedsWithNewEpisodes14days: + description: | + Podcast feeds with a new episode containing a + [`podcast:value`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#value) + block released in the last 14 days. + type: integer + example: 186602 + paidFeedsWithNewEpisodes30days: + description: | + Podcast feeds with a new episode containing a + [`podcast:value`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#value) + block released in the last 30 days. + type: integer + example: 237389 + paidFeedsWithNewEpisodes60days: + description: | + Podcast feeds with a new episode containing a + [`podcast:value`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#value) + block released in the last 60 days. + type: integer + example: 77632 + paidFeedsWithNewEpisodes90days: + description: | + Podcast feeds with a new episode containing a + [`podcast:value`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#value) + block released in the last 90 days. + type: integer + example: 335380 + newEpisodes3days: + description: | + Podcast feeds with a new episode containing a released in the last 3 days. + type: integer + example: 212324 + newEpisodes7days: + description: | + Podcast feeds with a new episode containing a released in the last 7 days. + type: integer + example: 442061 + newEpisodes10days: + description: | + Podcast feeds with a new episode containing a released in the last 10 days. + type: integer + example: 684833 + newEpisodes14days: + description: | + Podcast feeds with a new episode containing a released in the last 14 days. + type: integer + example: 907203 + newEpisodes30days: + description: | + Podcast feeds with a new episode containing a released in the last 30 days. + type: integer + example: 1901547 + newEpisodes60days: + description: | + Podcast feeds with a new episode containing a released in the last 60 days. + type: integer + example: 3710750 + newEpisodes90days: + description: | + Podcast feeds with a new episode containing a released in the last 90 days. + type: integer + example: 5498580 + feedsWithFundingTag: + description: | + Podcast feeds with a + [`podcast:funding`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#funding) + tag in at least 1 episode. + type: integer + example: 57582 + feedsWithTranscripts: + description: | + Podcast feeds with a + [`podcast:transcript`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#transcript) + tag in at least 1 episode. + type: integer + example: 61385 + episodesWithTranscripts: + description: | + Episodes with a + [`podcast:transcript`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#transcript) + tag. + type: integer + example: 3198597 + feedsWithChapters: + description: | + Podcast feeds with a + [`podcast:chapters`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#chapters) + tag in at least 1 episode. + type: integer + example: 35582 + episodesWithChapters: + description: | + Number of episodes with [`podcast:chapters`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#chapters) + type: integer + example: 652781 + feedsWithMediumMusic: + description: | + Podcast feeds with a + [`podcast:medium`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#medium) + tag with a value of `music`. + type: integer + example: 3700 + feedsWithMediumVideo: + description: | + Podcast feeds with a + [`podcast:medium`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#medium) + tag with a value of `video`. + type: integer + example: 1288 + data_static: + description: | + Object containing the recent data + type: object + properties: + nextSince: + description: | + Value of `since` in next block of data + type: integer + format: Unix Epoch + example: 1613805249 + position: + $ref: '#/components/schemas/position' + feeds: + $ref: '#/components/schemas/feeds_data' + items: + $ref: '#/components/schemas/items_data' responses: '400': description: Invalid request @@ -4720,6 +5211,8 @@ components: schema: type: string example: Authorization header value either not set or blank. + '404': + description: Not found itunes_replacement: description: Success content: @@ -5291,3 +5784,355 @@ components: $ref: '#/components/schemas/status' description: $ref: '#/components/schemas/description_response' + static_stats_counts: + description: Object containing the statistics for the Podcast Index feed data + content: + application/json: + schema: + type: object + properties: + feedCountTotal: + $ref: '#/components/schemas/feedCountTotal' + episodeCountTotal: + $ref: '#/components/schemas/episodeCountTotal' + feedsWithNewEpisodes3days: + $ref: '#/components/schemas/feedsWithNewEpisodes3days' + feedsWithNewEpisodes7days: + $ref: '#/components/schemas/feedsWithNewEpisodes7days' + feedsWithNewEpisodes10days: + $ref: '#/components/schemas/feedsWithNewEpisodes10days' + feedsWithNewEpisodes14days: + $ref: '#/components/schemas/feedsWithNewEpisodes14days' + feedsWithNewEpisodes30days: + $ref: '#/components/schemas/feedsWithNewEpisodes30days' + feedsWithNewEpisodes60days: + $ref: '#/components/schemas/feedsWithNewEpisodes60days' + feedsWithNewEpisodes90days: + $ref: '#/components/schemas/feedsWithNewEpisodes90days' + paidFeedsWithNewEpisodes3days: + $ref: '#/components/schemas/paidFeedsWithNewEpisodes3days' + paidFeedsWithNewEpisodes7days: + $ref: '#/components/schemas/paidFeedsWithNewEpisodes7days' + paidFeedsWithNewEpisodes10days: + $ref: '#/components/schemas/paidFeedsWithNewEpisodes10days' + paidFeedsWithNewEpisodes14days: + $ref: '#/components/schemas/paidFeedsWithNewEpisodes14days' + paidFeedsWithNewEpisodes30days: + $ref: '#/components/schemas/paidFeedsWithNewEpisodes30days' + paidFeedsWithNewEpisodes60days: + $ref: '#/components/schemas/paidFeedsWithNewEpisodes60days' + paidFeedsWithNewEpisodes90days: + $ref: '#/components/schemas/paidFeedsWithNewEpisodes90days' + newEpisodes3days: + $ref: '#/components/schemas/newEpisodes3days' + newEpisodes7days: + $ref: '#/components/schemas/newEpisodes7days' + newEpisodes10days: + $ref: '#/components/schemas/newEpisodes10days' + newEpisodes14days: + $ref: '#/components/schemas/newEpisodes14days' + newEpisodes30days: + $ref: '#/components/schemas/newEpisodes30days' + newEpisodes60days: + $ref: '#/components/schemas/newEpisodes60days' + newEpisodes90days: + $ref: '#/components/schemas/newEpisodes90days' + feedsWithValueBlocks: + $ref: '#/components/schemas/feedsWithValueBlocks' + feedsWithFundingTag: + $ref: '#/components/schemas/feedsWithFundingTag' + feedsWithTranscripts: + $ref: '#/components/schemas/feedsWithTranscripts' + episodesWithTranscripts: + $ref: '#/components/schemas/episodesWithTranscripts' + feedsWithChapters: + $ref: '#/components/schemas/feedsWithChapters' + episodesWithChapters: + $ref: '#/components/schemas/episodesWithChapters' + feedsWithMediumMusic: + $ref: '#/components/schemas/feedsWithMediumMusic' + feedsWithMediumVideo: + $ref: '#/components/schemas/feedsWithMediumVideo' + 400_static: + description: Invalid request + content: + application/xml: + schema: + type: object + properties: + Error: + type: object + properties: + Code: + type: string + RequestId: + type: string + HostId: + type: string + example: + status: 'false' + description: Invalid parameters + static_sats_data: + description: Object containing the number of sats, transactions, and senders. + content: + application/json: + schema: + type: object + properties: + sats: + description: Array of sats seen in transactions on the specified date (x) + type: array + items: + type: object + properties: + x: + description: Date in YYYY-M-D format. + type: string + example: 2024-5-24 + 'y': + description: Number of sats transacted + type: integer + example: 629594 + senders: + description: Array of senders (supporters) seen in transactions on the specified date (x) + type: array + items: + type: object + properties: + x: + description: Date in YYYY-M-D format. + type: string + example: 2024-5-24 + 'y': + description: Number of senders + type: integer + example: 238 + txs: + description: Array of transactions on the specified date (x) + type: array + items: + type: object + properties: + x: + description: Date in YYYY-M-D format. + type: string + example: 2024-5-24 + 'y': + description: Number of transactions + type: integer + example: 8212 + colors: + description: Colors used in graphs + type: object + properties: + txcolor: + type: string + example: '#ff3333' + color14: + type: string + example: '#9370db' + color30: + type: string + example: '#58d68d' + color60: + type: string + example: '#0088cc' + color7: + type: string + example: '#fffa90' + color90: + type: string + example: '#ff8800' + static_music_json: + description: The hourly Top X music + content: + application/json: + schema: + type: object + properties: + title: + description: Title of music + type: string + example: Podcasting 2.0 Top 100 (Music) + description: + description: Description of object + type: string + example: An hourly Top 100 music playlist. + timestamp: + description: Date updated + type: integer + example: 1724465107 + items: + description: Array of top X music feeds + type: object + properties: + rank: + description: Rank in chart + type: integer + example: 1 + boosts: + description: Number of boosts + type: string + example: '42' + title: + description: Title of Track + type: string + example: To be in Nashville + image: + $ref: '#/components/schemas/image_episode' + feedId: + $ref: '#/components/schemas/id_feed' + feedUrl: + $ref: '#/components/schemas/url_feed' + feedGuid: + $ref: '#/components/schemas/podcastguid' + itemGuid: + $ref: '#/components/schemas/guid' + static_music_opml: + description: | + The hourly Top X music + + + Data follows the [OPML spec](https://opml.org/spec2.opml) with additions of + [Podcast Namespace](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md) attributes. + + + Example `outline` entry: + + ```xml + + ``` + + Attributes: + + - `text` + - Title of Track + - Example: `"To be in Nashville"` + - `xmlUrl` + - Feed URL track is in + - Example: `"https://files.heycitizen.xyz/Songs/Albums/The-Heycitizen-Experience/the heycitizen experience.xml"` + - `podcast:feedGuid` + - The GUID from the `podcast:guid` tag in the feed. This value is a unique, global identifier for the podcast. + - See the namespace spec for [guid](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#guid) for details. + - Example: `"a2d2e313-9cbd-5169-b89c-ab07b33ecc33"` + - `podcast:itemGuid` + - The unique identifier for the episode + - Example: `"ac34129c-c78a-463e-a64f-01405e1f2be4"` + content: + application/xml: + schema: + type: object + static_music_rss: + description: | + The hourly Top X music + + + Data follows the RSS XML spec with additions of + [Podcast Namespace](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md) attributes. + + + The [`podcast:remoteItem`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#remote-item) + is used to reference the episodes in the music chart. + content: + application/rss+xml: + schema: + type: object + static_current: + description: | + The feed and episode data seen by the Podcast Index. + content: + application/json: + schema: + type: object + properties: + status: + $ref: '#/components/schemas/status' + feedCount: + $ref: '#/components/schemas/feedCount' + itemCount: + $ref: '#/components/schemas/itemCount' + max: + $ref: '#/components/schemas/max' + since: + $ref: '#/components/schemas/since' + previousTrackingUrl: + description: URL to previous set of data + type: string + example: https://tracking.podcastindex.org/1724468201 + data: + $ref: '#/components/schemas/data_static' + static_tracking_feed_value_blocks: + description: Array of episodes containing value blocks + content: + application/json: + schema: + type: array + items: + type: object + properties: + id: + $ref: '#/components/schemas/id_feed' + itunesId: + $ref: '#/components/schemas/itunesId_feed' + podcastGuid: + $ref: '#/components/schemas/podcastguid' + url: + $ref: '#/components/schemas/url_feed' + value: + $ref: '#/components/schemas/value' + valueCreatedOn: + $ref: '#/components/schemas/valueCreatedOn' + static_tracking_episode_value_blocks: + description: Array of episodes containing value blocks + content: + application/json: + schema: + type: array + items: + type: object + properties: + episodeGuid: + $ref: '#/components/schemas/guid' + episodeId: + $ref: '#/components/schemas/id_episode' + feedId: + $ref: '#/components/schemas/id_feed' + feedUrl: + $ref: '#/components/schemas/url_feed' + itunesId: + $ref: '#/components/schemas/itunesId_feed' + podcastGuid: + $ref: '#/components/schemas/podcastguid' + value: + $ref: '#/components/schemas/value' + valueCreatedOn: + $ref: '#/components/schemas/valueCreatedOn' + static_dead_feeds: + description: | + Feed Ids in CSV file format. + + + Each row is the feed id. No Header. + + + Example: + + + ```csv + 3, + 38, + 43, + 45, + 56, + ``` + content: + application/csv: + schema: + type: object + static_feeds_db: + description: | + Podcast Index Feeds Database + content: + application/gzip: + schema: + type: object From 41abd73bf48211d256bb0e9be15c52580cbb72b7 Mon Sep 17 00:00:00 2001 From: Steven Crader Date: Tue, 4 Feb 2025 22:59:15 -0800 Subject: [PATCH 06/11] Missed updated yaml/json --- docs/pi_api.json | 972 +++++++++++++++++++++++++++++++++++++++++++++-- docs/pi_api.yaml | 3 +- 2 files changed, 945 insertions(+), 30 deletions(-) diff --git a/docs/pi_api.json b/docs/pi_api.json index 3dad307..26eb88f 100644 --- a/docs/pi_api.json +++ b/docs/pi_api.json @@ -16,7 +16,7 @@ "url": "logo.svg", "href": "/" }, - "description": "Download the openapi spec in [json](pi_api.json) or [yaml](pi_api.yaml) format.\n\n# Overview\n\nThe Podcast Index (Podcast Index LLC) is a software developer focused partnership that provides tools and data to\nanyone who aspires to create new and exciting Podcast experiences without the heavy lifting of indexing,\naggregation and data management.\n\n# Example Code\n\nUsers have provided example code for working the API in the following languages:\n\n - [AWS Lambda - python](https://github.com/tbowers/python-podcastindex-org-lambda)\n - [Bash](https://github.com/suorcd/Bash-podcastindex-org-example)\n - [C#](https://github.com/ComicStrip/csharp-podcastindex-org-example)\n - [Elisp](https://github.com/sabexx/elisp-example)\n - [Flutter/Dart](https://github.com/crediblecreative/flutter-dart-podcastindex-org-example)\n - [Go](https://github.com/ComicStrip/Go-podcastindex-org-example)\n - [Go](https://github.com/kilobit/podcast-index-client)\n - [Java](https://github.com/ComicStrip/Java-podcastindex-org-example)\n - [Java](https://github.com/stucoates/PodcastIndexJavaClient)\n - [Node.js](https://github.com/ComicStrip/node.js-podcastindex-org-example)\n - [PHP](https://github.com/Podcastindex-org/example-code)\n - [Python](https://github.com/tbowers/python-podcastindex-org-example)\n - [Swift](https://github.com/ComicStrip/Swift-podcastindex-org-example)\n - ... [More](https://github.com/Podcastindex-org-Examples)\n\nDon't see your desired language, create an example repo and create a\n[Pull Request](https://github.com/Podcastindex-org/docs-api/pulls) with a link to your example code project!\n\n# Libraries\n\nUser created libraries for working with the API:\n\n - Java\n - [podcast4j](https://github.com/yusufyilmazfr/podcast4j)\n - .NET\n - [PodcastIndexSharp](https://www.nuget.org/packages/PodcastIndexSharp)\n - Node.js/npm/yarn\n - [podcast-index-api](https://www.npmjs.com/package/podcast-index-api)\n - [podcastdx-client](https://www.npmjs.com/package/podcastdx-client)\n - PHP\n - [podcastindex-php](https://github.com/LowSociety/podcastindex-php)\n - Python/pip\n - [python-podcastindex](https://pypi.org/project/python-podcastindex/)\n - R\n - [podindexr](https://github.com/rpodcast/podindexr)\n - Ruby\n - [podcast-index](https://github.com/jasonyork/podcast-index)\n - Swift\n - [PodcastIndexKit](https://github.com/SparrowTek/PodcastIndexKit)\n - Kotlin\n - [PodcastIndex-SDK](https://github.com/mr3y-the-programmer/PodcastIndex-SDK)\n\nAre we missing a library? Did you create one for a different language? Create a\n[Pull Request](https://github.com/Podcastindex-org/docs-api/pulls) with a link to the new library!\n\n# Postman\n\nA collection file for use in the [Postman](https://www.postman.com/) application is available for this API.\n\n 1. Download the contents of the [Postman Docs](https://github.com/Podcastindex-org/docs-api/tree/master/Postman%20Docs) folder.\n 2. Import the `PodcastIndex.postman_collection.json` collection to Postman\n 3. Import the `PodcastIndexOrgEnvironment.postman_environment.json` to Postman\n 4. Click \"Environments\" on the left sidebar\n 5. Select the checkbox next to the PodcastIndexOrgEnvironment entry\n 6. Set `AuthKey` and `SeceretKey` values under the \"Current Value\" column using your API information \n 7. Click \"Collections\" from the sidebar\n 8. Select PodcastIndex\n 9. Select and run the endpoint to test\n\n# Contributing\n\nThe source for this API documentation is available at\n[https://github.com/Podcastindex-org/docs-api](https://github.com/Podcastindex-org/docs-api).\nSubmit an Issue or create a Pull Request.\n\n# Authentication Details\n\nSending an API request is easy. We use an Amazon-style request authorization token to secure each request.\n\n\nRegister for a free API key at https://api.podcastindex.org/\n\n\nThese headers parameters are required for each request: `User-Agent`, `X-Auth-Date`, `X-Auth-Key`, `Authorization`\n\n\nSee [Authentication](#auth) for description of parameters.\n\n# Legal\n\nLegal\n\n - [Privacy Policy](https://github.com/Podcastindex-org/legal/blob/main/PrivacyPolicy.md)\n - [Terms of Service](https://github.com/Podcastindex-org/legal/blob/main/TermsOfService.md)\n - [License](https://github.com/Podcastindex-org/docs-api/blob/master/LICENSE)\n" + "description": "Download the openapi spec in [json](pi_api.json) or [yaml](pi_api.yaml) format.\n\n# Overview\n\nThe Podcast Index (Podcast Index LLC) is a software developer focused partnership that provides tools and data to\nanyone who aspires to create new and exciting Podcast experiences without the heavy lifting of indexing,\naggregation and data management.\n\n# Example Code\n\nUsers have provided example code for working the API in the following languages:\n\n - [AWS Lambda - python](https://github.com/tbowers/python-podcastindex-org-lambda)\n - [Bash](https://github.com/suorcd/Bash-podcastindex-org-example)\n - [C#](https://github.com/ComicStrip/csharp-podcastindex-org-example)\n - [Elisp](https://github.com/sabexx/elisp-example)\n - [Flutter/Dart](https://github.com/crediblecreative/flutter-dart-podcastindex-org-example)\n - [Go](https://github.com/ComicStrip/Go-podcastindex-org-example)\n - [Go](https://github.com/kilobit/podcast-index-client)\n - [Java](https://github.com/ComicStrip/Java-podcastindex-org-example)\n - [Java](https://github.com/stucoates/PodcastIndexJavaClient)\n - [Node.js](https://github.com/ComicStrip/node.js-podcastindex-org-example)\n - [PHP](https://github.com/Podcastindex-org/example-code)\n - [Python](https://github.com/tbowers/python-podcastindex-org-example)\n - [Swift](https://github.com/ComicStrip/Swift-podcastindex-org-example)\n - ... [More](https://github.com/Podcastindex-org-Examples)\n\nDon't see your desired language, create an example repo and create a\n[Pull Request](https://github.com/Podcastindex-org/docs-api/pulls) with a link to your example code project!\n\n# Libraries\n\nUser created libraries for working with the API:\n\n - Java\n - [podcast4j](https://github.com/yusufyilmazfr/podcast4j)\n - .NET\n - [PodcastIndexSharp](https://www.nuget.org/packages/PodcastIndexSharp)\n - Node.js/npm/yarn\n - [podcast-index-api](https://www.npmjs.com/package/podcast-index-api)\n - [podcastdx-client](https://www.npmjs.com/package/podcastdx-client)\n - PHP\n - [podcastindex-php](https://github.com/LowSociety/podcastindex-php)\n - Python/pip\n - [python-podcastindex](https://pypi.org/project/python-podcastindex/)\n - R\n - [podindexr](https://github.com/rpodcast/podindexr)\n - Ruby\n - [podcast-index](https://github.com/jasonyork/podcast-index)\n - Swift\n - [PodcastIndexKit](https://github.com/SparrowTek/PodcastIndexKit)\n - Kotlin\n - [PodcastIndex-SDK](https://github.com/mr3y-the-programmer/PodcastIndex-SDK)\n\nAre we missing a library? Did you create one for a different language? Create a\n[Pull Request](https://github.com/Podcastindex-org/docs-api/pulls) with a link to the new library!\n\n# Postman\n\nA collection file for use in the [Postman](https://www.postman.com/) application is available for this API.\n\n 1. Download the contents of the [Postman Docs](https://github.com/Podcastindex-org/docs-api/tree/master/Postman%20Docs) folder.\n 2. Import the `PodcastIndex.postman_collection.json` collection to Postman\n 3. Import the `PodcastIndexOrgEnvironment.postman_environment.json` to Postman\n 4. Click \"Environments\" on the left sidebar\n 5. Select the checkbox next to the PodcastIndexOrgEnvironment entry\n 6. Set `AuthKey` and `SeceretKey` values under the \"Current Value\" column using your API information\n 7. Click \"Collections\" from the sidebar\n 8. Select PodcastIndex\n 9. Select and run the endpoint to test\n\n# Contributing\n\nThe source for this API documentation is available at\n[https://github.com/Podcastindex-org/docs-api](https://github.com/Podcastindex-org/docs-api).\nSubmit an Issue or create a Pull Request.\n\n# Authentication Details\n\nSending an API request is easy. We use an Amazon-style request authorization token to secure each request.\n\n\nRegister for a free API key at https://api.podcastindex.org/\n\n\nThese headers parameters are required for each request: `User-Agent`, `X-Auth-Date`, `X-Auth-Key`, `Authorization`\n\n\nSee [Authentication](#auth) for description of parameters.\n\n# Legal\n\nLegal\n\n - [Privacy Policy](https://github.com/Podcastindex-org/legal/blob/main/PrivacyPolicy.md)\n - [Terms of Service](https://github.com/Podcastindex-org/legal/blob/main/TermsOfService.md)\n - [License](https://github.com/Podcastindex-org/docs-api/blob/master/LICENSE)\n" }, "servers": [ { @@ -642,7 +642,7 @@ "Podcasts" ], "summary": "Dead", - "description": "This call returns all feeds that have been marked dead (`dead` == 1)\n\n\nDead feeds can also be accessed from object storage at https://public.podcastindex.org/podcastindex_dead_feeds.csv\n\n\nExample: https://api.podcastindex.org/api/1.0/podcasts/dead?pretty\n", + "description": "This call returns all feeds that have been marked dead (`dead` == 1)\n\n\nHourly statistics can also be access at https://public.podcastindex.org/podcastindex_dead_feeds.csv\nFor details, see [Dead Feeds](#get-/static/public/podcastindex_dead_feeds.csv).\n\n\nExample: https://api.podcastindex.org/api/1.0/podcasts/dead?pretty\n", "operationId": "podcasts/dead", "security": [ { @@ -1270,7 +1270,7 @@ "Recent" ], "summary": "Recent Data", - "description": "This call returns every new feed and episode added to the index over the past 24 hours in reverse chronological order.\n\n\nThis is similar to `/recent/feeds` but uses the date the feed was found by the index rather than the feed's\ninternal timestamp.\n\n\nSimilar data can also be accessed using object storage root url https://tracking.podcastindex.org/current\n\n\nExamples:\n\n - https://api.podcastindex.org/api/1.0/recent/data?pretty\n - https://api.podcastindex.org/api/1.0/recent/data?pretty&max=10\n - https://api.podcastindex.org/api/1.0/recent/data?pretty&max=10&since=1671164867\n", + "description": "This call returns every new feed and episode added to the index over the past 24 hours in reverse chronological order.\n\n\nThis is similar to `/recent/feeds` but uses the date the feed was found by the index rather than the feed's\ninternal timestamp.\n\n\nSimilar data can also be accessed using object storage root url https://tracking.podcastindex.org/current\nFor details, see [Current](#get-/static/tracking/current).\n\n\nExamples:\n\n - https://api.podcastindex.org/api/1.0/recent/data?pretty\n - https://api.podcastindex.org/api/1.0/recent/data?pretty&max=10\n - https://api.podcastindex.org/api/1.0/recent/data?pretty&max=10&since=1671164867\n", "operationId": "recent/data", "security": [ { @@ -1508,7 +1508,7 @@ "Stats" ], "summary": "Current", - "description": "Return the most recent index statistics.\n\n\nHourly statistics can also be access at https://stats.podcastindex.org/daily_counts.json\n\n\nExample: https://api.podcastindex.org/api/1.0/stats/current?pretty\n", + "description": "Return the most recent index statistics.\n\n\nHourly statistics can also be access at https://stats.podcastindex.org/hourly_counts.json\nFor details, see [Stats Hourly Counts](#get-/static/stats/hourly_counts.json).\n\n\nDaily statistics can also be access at https://stats.podcastindex.org/daily_counts.json.\nFor details, see [Stats Daily Counts](#get-/static/stats/daily_counts.json).\n\n\nExample: https://api.podcastindex.org/api/1.0/stats/current?pretty\n", "operationId": "stats/current", "security": [ { @@ -1767,6 +1767,314 @@ } } } + }, + "/static/stats/daily_counts.json": { + "get": { + "tags": [ + "Static Data" + ], + "summary": "Stats Daily Counts", + "description": "Report a number of statistics about the feeds in Podcast Index's database. Updated daily.\n\n\nA subset of stats can be retrieved using the API endpoint [stats/current](#get-/stats/current).\n\n\nView at: https://stats.podcastindex.org/daily_counts.json\n", + "operationId": "daily_counts.json", + "security": [], + "servers": [ + { + "url": "https://stats.podcastindex.org", + "description": "Podcast Index Stats" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/static_stats_counts" + }, + "400": { + "$ref": "#/components/responses/400_static" + }, + "404": { + "$ref": "#/components/responses/404" + } + } + } + }, + "/static/stats/hourly_counts.json": { + "get": { + "tags": [ + "Static Data" + ], + "summary": "Stats Hourly Counts", + "description": "Report a number of statistics about the feeds in Podcast Index's database. Updated hourly.\n\n\nA subset of stats can be retrieved using the API endpoint [stats/current](#get-/stats/current).\n\n\nView at: https://stats.podcastindex.org/hourly_counts.json\n", + "operationId": "hourly_counts.json", + "security": [], + "servers": [ + { + "url": "https://stats.podcastindex.org", + "description": "Podcast Index Stats" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/static_stats_counts" + }, + "400": { + "$ref": "#/components/responses/400_static" + }, + "404": { + "$ref": "#/components/responses/404" + } + } + } + }, + "/static/stats/chart-data.json": { + "get": { + "tags": [ + "Static Data" + ], + "summary": "v4v Sats", + "description": "Contains the raw data used to populate the graphs at https://stats.podcastindex.org/v4v.\n\nThis is a look at the total [sats](https://www.investopedia.com/terms/s/satoshi.asp) flowing through the Value4Value\nLightning podcasting economy over various periods of time.\n\nWe calculate this data based on our visibility as a one percent voluntary split on Podcastindex.org api\ncalls. Therefore, the true numbers could be higher, but they cannot be lower than listed here. This represents our\nbest approximation of how many sats are flowing across the entire ecosystem from listeners to creators, guests (via\nepisode splits), platforms, services and apps.\n\n\nView at: https://stats.podcastindex.org/chart-data.json\n", + "operationId": "chart-data.json", + "security": [], + "servers": [ + { + "url": "https://stats.podcastindex.org", + "description": "Podcast Index Stats" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/static_sats_data" + }, + "400": { + "$ref": "#/components/responses/400_static" + }, + "404": { + "$ref": "#/components/responses/404" + } + } + } + }, + "/static/stats/v4vmusic.json": { + "get": { + "tags": [ + "Static Data" + ], + "summary": "v4v Music Chart JSON", + "description": "Contains the ranking of the music tracks played on podcasts that have been boosted the most over the last 7 days.\n\nEach entry shows the number of listener boosts sent over this time period. The chart is updated hourly.\n\n\nCan be viewed in a browser at https://podcastindex.top/ (https://stats.podcastindex.org/v4vmusic.html).\n\n\nView at: https://stats.podcastindex.org/v4vmusic.json\n\n\nAlso available in [OPML](#get-/static/stats/v4vmusic.opml) and [RSS](#get-/static/stats/v4vmusic.rss).\n", + "operationId": "v4vmusic.json", + "security": [], + "servers": [ + { + "url": "https://stats.podcastindex.org", + "description": "Podcast Index Stats" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/static_music_json" + }, + "400": { + "$ref": "#/components/responses/400_static" + }, + "404": { + "$ref": "#/components/responses/404" + } + } + } + }, + "/static/stats/v4vmusic.opml": { + "get": { + "tags": [ + "Static Data" + ], + "summary": "v4v Music Chart OPML", + "description": "Contains the ranking of the music tracks played on podcasts that have been boosted the most over the last 7 days.\n\nEach entry shows the number of listener boosts sent over this time period. The chart is updated hourly.\n\n\nCan be viewed in a browser at https://podcastindex.top/ (https://stats.podcastindex.org/v4vmusic.html).\n\n\nView at: https://stats.podcastindex.org/v4vmusic.opml\n\n\nAlso available in [JSON](#get-/static/stats/v4vmusic.json) and [RSS](#get-/static/stats/v4vmusic.rss).\n", + "operationId": "v4vmusic.opml", + "security": [], + "servers": [ + { + "url": "https://stats.podcastindex.org", + "description": "Podcast Index Stats" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/static_music_opml" + }, + "400": { + "$ref": "#/components/responses/400_static" + }, + "404": { + "$ref": "#/components/responses/404" + } + } + } + }, + "/static/stats/v4vmusic.rss": { + "get": { + "tags": [ + "Static Data" + ], + "summary": "v4v Music Chart RSS", + "description": "Contains the ranking of the music tracks played on podcasts that have been boosted the most over the last 7 days.\n\nEach entry shows the number of listener boosts sent over this time period. The chart is updated hourly.\n\n\nCan be viewed in a browser at https://podcastindex.top/ (https://stats.podcastindex.org/v4vmusic.html).\n\n\nView at: https://stats.podcastindex.org/v4vmusic.rss\n\n\nAlso available in [JSON](#get-/static/stats/v4vmusic.json) and [OPML](#get-/static/stats/v4vmusic.opml).\n", + "operationId": "v4vmusic.rss", + "security": [], + "servers": [ + { + "url": "https://stats.podcastindex.org", + "description": "Podcast Index Stats" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/static_music_rss" + }, + "400": { + "$ref": "#/components/responses/400_static" + }, + "404": { + "$ref": "#/components/responses/404" + } + } + } + }, + "/static/tracking/current": { + "get": { + "tags": [ + "Static Data" + ], + "summary": "Current", + "description": "This call returns every new feed and episode added to the index over the past 24 hours in reverse chronological order.\n\n\nThis is similar to `/recent/feeds` but uses the date the feed was found by the index rather than the feed's\ninternal timestamp.\n\n\nSimilar data can also be retrieved using the API endpoint [recent/data](#get-/recent/data).\n\n\nAccess at: https://tracking.podcastindex.org/current\n\n\nThe prior 24 hours of data (going backwards until all tracked data is received) can be accessed using the timestamp\nof the previous data set. This is found in the `previousTrackingUrl`.\nThe format of these prior data sets follows the format described below.\n", + "operationId": "current", + "security": [], + "servers": [ + { + "url": "https://tracking.podcastindex.org", + "description": "Podcast Index Tracking" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/static_current" + }, + "400": { + "$ref": "#/components/responses/400_static" + }, + "404": { + "$ref": "#/components/responses/404" + } + } + } + }, + "/static/tracking/feedValueBlocks": { + "get": { + "tags": [ + "Static Data" + ], + "summary": "Feed Value Blocks", + "description": "Get all feeds with value blocks.\n\n\nAccess at: https://tracking.podcastindex.org/feedValueBlocks.json\n", + "operationId": "feedValueBlocks.json", + "security": [], + "servers": [ + { + "url": "https://tracking.podcastindex.org", + "description": "Podcast Index Tracking" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/static_tracking_feed_value_blocks" + }, + "400": { + "$ref": "#/components/responses/400_static" + }, + "404": { + "$ref": "#/components/responses/404" + } + } + } + }, + "/static/tracking/episodeValueBlocks": { + "get": { + "tags": [ + "Static Data" + ], + "summary": "Episode Value Blocks", + "description": "Get all episodes with value blocks.\n\n\nAccess at: https://tracking.podcastindex.org/episodeValueBlocks.json\n", + "operationId": "episodeValueBlocks.json", + "security": [], + "servers": [ + { + "url": "https://tracking.podcastindex.org", + "description": "Podcast Index Tracking" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/static_tracking_episode_value_blocks" + }, + "400": { + "$ref": "#/components/responses/400_static" + }, + "404": { + "$ref": "#/components/responses/404" + } + } + } + }, + "/static/public/podcastindex_dead_feeds.csv": { + "get": { + "tags": [ + "Static Data" + ], + "summary": "Dead Feeds", + "description": "Lists all feed Ids that have been marked dead in the Podcast Index database. The list is updated every X hours.\n\n\nA subset of stats can be retrieved using the API endpoint [podcasts/dead](#get-/podcasts/dead).\n\n\nDownload from: https://public.podcastindex.org/podcastindex_dead_feeds.csv\n", + "operationId": "podcastindex_dead_feeds.csv", + "security": [], + "servers": [ + { + "url": "https://public.podcastindex.org", + "description": "Podcast Index Public" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/static_dead_feeds" + }, + "400": { + "$ref": "#/components/responses/400_static" + }, + "404": { + "$ref": "#/components/responses/404" + } + } + } + }, + "/static/public/podcastindex_feeds.db.tgz": { + "get": { + "tags": [ + "Static Data" + ], + "summary": "Feeds Database", + "description": "Compressed database of all non-dead feeds in the Podcast Index database.\n\n\nUpdated daily. Some attributes excluded. No episodes included.\n\n\nDownload from: https://public.podcastindex.org/podcastindex_feeds.db.tgz\n", + "operationId": "podcastindex_feeds_db.tgz", + "security": [], + "servers": [ + { + "url": "https://public.podcastindex.org", + "description": "Podcast Index Public" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/static_feeds_db" + }, + "400": { + "$ref": "#/components/responses/400_static" + }, + "404": { + "$ref": "#/components/responses/404" + } + } + } } }, "components": { @@ -2740,9 +3048,8 @@ "example": 0 }, "imageUrlHash": { - "description": "A CRC32 hash of the `image` URL with the protocol (`http://`, `https://`) removed.\n", + "description": "A CRC32 hash of the `image` URL with the protocol (`http://`, `https://`) removed. 64bit integer.\n", "type": "integer", - "format": "int64", "example": 3969216649 }, "newestItemPublishTime": { @@ -5189,44 +5496,65 @@ "$ref": "#/components/schemas/value_byepisodeguid_batch" } }, + "feedCountTotal": { + "description": "Total podcast feeds in the index.\n", + "type": "integer", + "example": 4257865 + }, + "episodeCountTotal": { + "description": "Total individual podcast episodes in the index.\n", + "type": "integer", + "example": 143953477 + }, + "feedsWithNewEpisodes3days": { + "description": "Podcast feeds with a new episode released in the last 3 days.\n", + "type": "integer", + "example": 97522 + }, + "feedsWithNewEpisodes10days": { + "description": "Podcast feeds with a new episode released in the last 10 days.\n", + "type": "integer", + "example": 212322 + }, + "feedsWithNewEpisodes30days": { + "description": "Podcast feeds with a new episode released in the last 30 days.\n", + "type": "integer", + "example": 306748 + }, + "feedsWithNewEpisodes90days": { + "description": "Podcast feeds with a new episode released in the last 90 days.\n", + "type": "integer", + "example": 436933 + }, + "feedsWithValueBlocks": { + "description": "Podcast feeds with a\n[`podcast:value`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#value)\ntag in at least 1 episode.\n", + "type": "integer", + "example": 21916 + }, "stats": { "description": "An array statistic properties\n", "type": "object", "properties": { "feedCountTotal": { - "description": "Total podcast feeds in the index.", - "type": "integer", - "example": 4048514 + "$ref": "#/components/schemas/feedCountTotal" }, "episodeCountTotal": { - "description": "Total individual podcast episodes in the index.", - "type": "integer", - "example": 112890355 + "$ref": "#/components/schemas/episodeCountTotal" }, "feedsWithNewEpisodes3days": { - "description": "Podcast feeds with a new episode released in the last 3 days.", - "type": "integer", - "example": 87369 + "$ref": "#/components/schemas/feedsWithNewEpisodes3days" }, "feedsWithNewEpisodes10days": { - "description": "Podcast feeds with a new episode released in the last 10 days.", - "type": "integer", - "example": 242922 + "$ref": "#/components/schemas/feedsWithNewEpisodes10days" }, "feedsWithNewEpisodes30days": { - "description": "Podcast feeds with a new episode released in the last 30 days.", - "type": "integer", - "example": 352744 + "$ref": "#/components/schemas/feedsWithNewEpisodes30days" }, "feedsWithNewEpisodes90days": { - "description": "Podcast feeds with a new episode released in the last 90 days.", - "type": "integer", - "example": 478568 + "$ref": "#/components/schemas/feedsWithNewEpisodes90days" }, "feedsWithValueBlocks": { - "description": "Podcast feeds with a value block", - "type": "integer", - "example": 9772 + "$ref": "#/components/schemas/feedsWithValueBlocks" } } }, @@ -5267,6 +5595,147 @@ "false" ], "example": "true" + }, + "feedsWithNewEpisodes7days": { + "description": "Podcast feeds with a new episode released in the last 7 days.\n", + "type": "integer", + "example": 179043 + }, + "feedsWithNewEpisodes14days": { + "description": "Podcast feeds with a new episode released in the last 14 days.\n", + "type": "integer", + "example": 239664 + }, + "feedsWithNewEpisodes60days": { + "description": "Podcast feeds with a new episode released in the last 60 days.\n", + "type": "integer", + "example": 382945 + }, + "paidFeedsWithNewEpisodes3days": { + "description": "Podcast feeds with a new episode containing a\n[`podcast:value`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#value)\nblock released in the last 3 days.\n", + "type": "integer", + "example": 77638 + }, + "paidFeedsWithNewEpisodes7days": { + "description": "Podcast feeds with a new episode containing a\n[`podcast:value`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#value)\nblock released in the last 7 days.\n", + "type": "integer", + "example": 140275 + }, + "paidFeedsWithNewEpisodes10days": { + "description": "Podcast feeds with a new episode containing a\n[`podcast:value`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#value)\nblock released in the last 10 days.\n", + "type": "integer", + "example": 165789 + }, + "paidFeedsWithNewEpisodes14days": { + "description": "Podcast feeds with a new episode containing a\n[`podcast:value`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#value)\nblock released in the last 14 days.\n", + "type": "integer", + "example": 186602 + }, + "paidFeedsWithNewEpisodes30days": { + "description": "Podcast feeds with a new episode containing a\n[`podcast:value`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#value)\nblock released in the last 30 days.\n", + "type": "integer", + "example": 237389 + }, + "paidFeedsWithNewEpisodes60days": { + "description": "Podcast feeds with a new episode containing a\n[`podcast:value`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#value)\nblock released in the last 60 days.\n", + "type": "integer", + "example": 77632 + }, + "paidFeedsWithNewEpisodes90days": { + "description": "Podcast feeds with a new episode containing a\n[`podcast:value`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#value)\nblock released in the last 90 days.\n", + "type": "integer", + "example": 335380 + }, + "newEpisodes3days": { + "description": "Podcast feeds with a new episode containing a released in the last 3 days.\n", + "type": "integer", + "example": 212324 + }, + "newEpisodes7days": { + "description": "Podcast feeds with a new episode containing a released in the last 7 days.\n", + "type": "integer", + "example": 442061 + }, + "newEpisodes10days": { + "description": "Podcast feeds with a new episode containing a released in the last 10 days.\n", + "type": "integer", + "example": 684833 + }, + "newEpisodes14days": { + "description": "Podcast feeds with a new episode containing a released in the last 14 days.\n", + "type": "integer", + "example": 907203 + }, + "newEpisodes30days": { + "description": "Podcast feeds with a new episode containing a released in the last 30 days.\n", + "type": "integer", + "example": 1901547 + }, + "newEpisodes60days": { + "description": "Podcast feeds with a new episode containing a released in the last 60 days.\n", + "type": "integer", + "example": 3710750 + }, + "newEpisodes90days": { + "description": "Podcast feeds with a new episode containing a released in the last 90 days.\n", + "type": "integer", + "example": 5498580 + }, + "feedsWithFundingTag": { + "description": "Podcast feeds with a\n[`podcast:funding`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#funding)\ntag in at least 1 episode.\n", + "type": "integer", + "example": 57582 + }, + "feedsWithTranscripts": { + "description": "Podcast feeds with a\n[`podcast:transcript`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#transcript)\ntag in at least 1 episode.\n", + "type": "integer", + "example": 61385 + }, + "episodesWithTranscripts": { + "description": "Episodes with a\n[`podcast:transcript`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#transcript)\ntag.\n", + "type": "integer", + "example": 3198597 + }, + "feedsWithChapters": { + "description": "Podcast feeds with a\n[`podcast:chapters`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#chapters)\ntag in at least 1 episode.\n", + "type": "integer", + "example": 35582 + }, + "episodesWithChapters": { + "description": "Number of episodes with [`podcast:chapters`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#chapters)\n", + "type": "integer", + "example": 652781 + }, + "feedsWithMediumMusic": { + "description": "Podcast feeds with a\n[`podcast:medium`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#medium)\ntag with a value of `music`.\n", + "type": "integer", + "example": 3700 + }, + "feedsWithMediumVideo": { + "description": "Podcast feeds with a\n[`podcast:medium`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#medium)\ntag with a value of `video`.\n", + "type": "integer", + "example": 1288 + }, + "data_static": { + "description": "Object containing the recent data\n", + "type": "object", + "properties": { + "nextSince": { + "description": "Value of `since` in next block of data\n", + "type": "integer", + "format": "Unix Epoch", + "example": 1613805249 + }, + "position": { + "$ref": "#/components/schemas/position" + }, + "feeds": { + "$ref": "#/components/schemas/feeds_data" + }, + "items": { + "$ref": "#/components/schemas/items_data" + } + } } }, "responses": { @@ -5303,6 +5772,9 @@ } } }, + "404": { + "description": "Not found" + }, "itunes_replacement": { "description": "Success", "content": { @@ -6215,7 +6687,451 @@ } } } + }, + "static_stats_counts": { + "description": "Object containing the statistics for the Podcast Index feed data", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "feedCountTotal": { + "$ref": "#/components/schemas/feedCountTotal" + }, + "episodeCountTotal": { + "$ref": "#/components/schemas/episodeCountTotal" + }, + "feedsWithNewEpisodes3days": { + "$ref": "#/components/schemas/feedsWithNewEpisodes3days" + }, + "feedsWithNewEpisodes7days": { + "$ref": "#/components/schemas/feedsWithNewEpisodes7days" + }, + "feedsWithNewEpisodes10days": { + "$ref": "#/components/schemas/feedsWithNewEpisodes10days" + }, + "feedsWithNewEpisodes14days": { + "$ref": "#/components/schemas/feedsWithNewEpisodes14days" + }, + "feedsWithNewEpisodes30days": { + "$ref": "#/components/schemas/feedsWithNewEpisodes30days" + }, + "feedsWithNewEpisodes60days": { + "$ref": "#/components/schemas/feedsWithNewEpisodes60days" + }, + "feedsWithNewEpisodes90days": { + "$ref": "#/components/schemas/feedsWithNewEpisodes90days" + }, + "paidFeedsWithNewEpisodes3days": { + "$ref": "#/components/schemas/paidFeedsWithNewEpisodes3days" + }, + "paidFeedsWithNewEpisodes7days": { + "$ref": "#/components/schemas/paidFeedsWithNewEpisodes7days" + }, + "paidFeedsWithNewEpisodes10days": { + "$ref": "#/components/schemas/paidFeedsWithNewEpisodes10days" + }, + "paidFeedsWithNewEpisodes14days": { + "$ref": "#/components/schemas/paidFeedsWithNewEpisodes14days" + }, + "paidFeedsWithNewEpisodes30days": { + "$ref": "#/components/schemas/paidFeedsWithNewEpisodes30days" + }, + "paidFeedsWithNewEpisodes60days": { + "$ref": "#/components/schemas/paidFeedsWithNewEpisodes60days" + }, + "paidFeedsWithNewEpisodes90days": { + "$ref": "#/components/schemas/paidFeedsWithNewEpisodes90days" + }, + "newEpisodes3days": { + "$ref": "#/components/schemas/newEpisodes3days" + }, + "newEpisodes7days": { + "$ref": "#/components/schemas/newEpisodes7days" + }, + "newEpisodes10days": { + "$ref": "#/components/schemas/newEpisodes10days" + }, + "newEpisodes14days": { + "$ref": "#/components/schemas/newEpisodes14days" + }, + "newEpisodes30days": { + "$ref": "#/components/schemas/newEpisodes30days" + }, + "newEpisodes60days": { + "$ref": "#/components/schemas/newEpisodes60days" + }, + "newEpisodes90days": { + "$ref": "#/components/schemas/newEpisodes90days" + }, + "feedsWithValueBlocks": { + "$ref": "#/components/schemas/feedsWithValueBlocks" + }, + "feedsWithFundingTag": { + "$ref": "#/components/schemas/feedsWithFundingTag" + }, + "feedsWithTranscripts": { + "$ref": "#/components/schemas/feedsWithTranscripts" + }, + "episodesWithTranscripts": { + "$ref": "#/components/schemas/episodesWithTranscripts" + }, + "feedsWithChapters": { + "$ref": "#/components/schemas/feedsWithChapters" + }, + "episodesWithChapters": { + "$ref": "#/components/schemas/episodesWithChapters" + }, + "feedsWithMediumMusic": { + "$ref": "#/components/schemas/feedsWithMediumMusic" + }, + "feedsWithMediumVideo": { + "$ref": "#/components/schemas/feedsWithMediumVideo" + } + } + } + } + } + }, + "400_static": { + "description": "Invalid request", + "content": { + "application/xml": { + "schema": { + "type": "object", + "properties": { + "Error": { + "type": "object", + "properties": { + "Code": { + "type": "string" + }, + "RequestId": { + "type": "string" + }, + "HostId": { + "type": "string" + } + } + } + } + }, + "example": { + "status": "false", + "description": "Invalid parameters" + } + } + } + }, + "static_sats_data": { + "description": "Object containing the number of sats, transactions, and senders.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "sats": { + "description": "Array of sats seen in transactions on the specified date (x)", + "type": "array", + "items": { + "type": "object", + "properties": { + "x": { + "description": "Date in YYYY-M-D format.", + "type": "string", + "example": "2024-5-24" + }, + "y": { + "description": "Number of sats transacted", + "type": "integer", + "example": 629594 + } + } + } + }, + "senders": { + "description": "Array of senders (supporters) seen in transactions on the specified date (x)", + "type": "array", + "items": { + "type": "object", + "properties": { + "x": { + "description": "Date in YYYY-M-D format.", + "type": "string", + "example": "2024-5-24" + }, + "y": { + "description": "Number of senders", + "type": "integer", + "example": 238 + } + } + } + }, + "txs": { + "description": "Array of transactions on the specified date (x)", + "type": "array", + "items": { + "type": "object", + "properties": { + "x": { + "description": "Date in YYYY-M-D format.", + "type": "string", + "example": "2024-5-24" + }, + "y": { + "description": "Number of transactions", + "type": "integer", + "example": 8212 + } + } + } + }, + "colors": { + "description": "Colors used in graphs", + "type": "object", + "properties": { + "txcolor": { + "type": "string", + "example": "#ff3333" + }, + "color14": { + "type": "string", + "example": "#9370db" + }, + "color30": { + "type": "string", + "example": "#58d68d" + }, + "color60": { + "type": "string", + "example": "#0088cc" + }, + "color7": { + "type": "string", + "example": "#fffa90" + }, + "color90": { + "type": "string", + "example": "#ff8800" + } + } + } + } + } + } + } + }, + "static_music_json": { + "description": "The hourly Top X music", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "title": { + "description": "Title of music", + "type": "string", + "example": "Podcasting 2.0 Top 100 (Music)" + }, + "description": { + "description": "Description of object", + "type": "string", + "example": "An hourly Top 100 music playlist." + }, + "timestamp": { + "description": "Date updated", + "type": "integer", + "example": 1724465107 + }, + "items": { + "description": "Array of top X music feeds", + "type": "object", + "properties": { + "rank": { + "description": "Rank in chart", + "type": "integer", + "example": 1 + }, + "boosts": { + "description": "Number of boosts", + "type": "string", + "example": "42" + }, + "title": { + "description": "Title of Track", + "type": "string", + "example": "To be in Nashville" + }, + "image": { + "$ref": "#/components/schemas/image_episode" + }, + "feedId": { + "$ref": "#/components/schemas/id_feed" + }, + "feedUrl": { + "$ref": "#/components/schemas/url_feed" + }, + "feedGuid": { + "$ref": "#/components/schemas/podcastguid" + }, + "itemGuid": { + "$ref": "#/components/schemas/guid" + } + } + } + } + } + } + } + }, + "static_music_opml": { + "description": "The hourly Top X music\n\n\nData follows the [OPML spec](https://opml.org/spec2.opml) with additions of\n[Podcast Namespace](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md) attributes.\n\n\nExample `outline` entry:\n\n```xml\n\n```\n\nAttributes:\n\n - `text`\n - Title of Track\n - Example: `\"To be in Nashville\"`\n - `xmlUrl`\n - Feed URL track is in\n - Example: `\"https://files.heycitizen.xyz/Songs/Albums/The-Heycitizen-Experience/the heycitizen experience.xml\"`\n - `podcast:feedGuid`\n - The GUID from the `podcast:guid` tag in the feed. This value is a unique, global identifier for the podcast.\n - See the namespace spec for [guid](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#guid) for details.\n - Example: `\"a2d2e313-9cbd-5169-b89c-ab07b33ecc33\"`\n - `podcast:itemGuid`\n - The unique identifier for the episode\n - Example: `\"ac34129c-c78a-463e-a64f-01405e1f2be4\"`\n", + "content": { + "application/xml": { + "schema": { + "type": "object" + } + } + } + }, + "static_music_rss": { + "description": "The hourly Top X music\n\n\nData follows the RSS XML spec with additions of\n[Podcast Namespace](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md) attributes.\n\n\nThe [`podcast:remoteItem`](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md#remote-item)\nis used to reference the episodes in the music chart.\n", + "content": { + "application/rss+xml": { + "schema": { + "type": "object" + } + } + } + }, + "static_current": { + "description": "The feed and episode data seen by the Podcast Index.\n", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "status": { + "$ref": "#/components/schemas/status" + }, + "feedCount": { + "$ref": "#/components/schemas/feedCount" + }, + "itemCount": { + "$ref": "#/components/schemas/itemCount" + }, + "max": { + "$ref": "#/components/schemas/max" + }, + "since": { + "$ref": "#/components/schemas/since" + }, + "previousTrackingUrl": { + "description": "URL to previous set of data", + "type": "string", + "example": "https://tracking.podcastindex.org/1724468201" + }, + "data": { + "$ref": "#/components/schemas/data_static" + } + } + } + } + } + }, + "static_tracking_feed_value_blocks": { + "description": "Array of episodes containing value blocks", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "$ref": "#/components/schemas/id_feed" + }, + "itunesId": { + "$ref": "#/components/schemas/itunesId_feed" + }, + "podcastGuid": { + "$ref": "#/components/schemas/podcastguid" + }, + "url": { + "$ref": "#/components/schemas/url_feed" + }, + "value": { + "$ref": "#/components/schemas/value" + }, + "valueCreatedOn": { + "$ref": "#/components/schemas/valueCreatedOn" + } + } + } + } + } + } + }, + "static_tracking_episode_value_blocks": { + "description": "Array of episodes containing value blocks", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "episodeGuid": { + "$ref": "#/components/schemas/guid" + }, + "episodeId": { + "$ref": "#/components/schemas/id_episode" + }, + "feedId": { + "$ref": "#/components/schemas/id_feed" + }, + "feedUrl": { + "$ref": "#/components/schemas/url_feed" + }, + "itunesId": { + "$ref": "#/components/schemas/itunesId_feed" + }, + "podcastGuid": { + "$ref": "#/components/schemas/podcastguid" + }, + "value": { + "$ref": "#/components/schemas/value" + }, + "valueCreatedOn": { + "$ref": "#/components/schemas/valueCreatedOn" + } + } + } + } + } + } + }, + "static_dead_feeds": { + "description": "Feed Ids in CSV file format.\n\n\nEach row is the feed id. No Header.\n\n\nExample:\n\n\n```csv\n3,\n38,\n43,\n45,\n56,\n```\n", + "content": { + "application/csv": { + "schema": { + "type": "object" + } + } + } + }, + "static_feeds_db": { + "description": "Podcast Index Feeds Database\n", + "content": { + "application/gzip": { + "schema": { + "type": "object" + } + } + } } } } -} +} \ No newline at end of file diff --git a/docs/pi_api.yaml b/docs/pi_api.yaml index 0d7ad67..bf1f272 100644 --- a/docs/pi_api.yaml +++ b/docs/pi_api.yaml @@ -2970,9 +2970,8 @@ components: example: 0 imageUrlHash: description: | - A CRC32 hash of the `image` URL with the protocol (`http://`, `https://`) removed. + A CRC32 hash of the `image` URL with the protocol (`http://`, `https://`) removed. 64bit integer. type: integer - format: int64 example: 3969216649 newestItemPublishTime: description: | From 2cb1797560405711d4a754693145e99ca89f2d5a Mon Sep 17 00:00:00 2001 From: James McKenzie Date: Fri, 18 Apr 2025 15:47:39 -0700 Subject: [PATCH 07/11] Update root.yaml --- api_src/root.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/api_src/root.yaml b/api_src/root.yaml index b2abc3e..8dc8430 100644 --- a/api_src/root.yaml +++ b/api_src/root.yaml @@ -67,6 +67,9 @@ info: - [PodcastIndexKit](https://github.com/SparrowTek/PodcastIndexKit) - Kotlin - [PodcastIndex-SDK](https://github.com/mr3y-the-programmer/PodcastIndex-SDK) + - Go + - [podcastindex](https://github.com/jjgmckenzie/podcastindex) + - [podcastindex-go](https://github.com/koalahl/podcastindex-go) Are we missing a library? Did you create one for a different language? Create a [Pull Request](https://github.com/Podcastindex-org/docs-api/pulls) with a link to the new library! From fbe8fb47f01bfae0e84b95c4f167112c746a6b85 Mon Sep 17 00:00:00 2001 From: Steven Crader Date: Fri, 18 Apr 2025 23:11:54 -0700 Subject: [PATCH 08/11] Build files --- Postman Docs/PodcastIndex.postman_collection.json | 2 +- docs/pi_api.json | 2 +- docs/pi_api.yaml | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Postman Docs/PodcastIndex.postman_collection.json b/Postman Docs/PodcastIndex.postman_collection.json index 19bd9bb..83361c3 100644 --- a/Postman Docs/PodcastIndex.postman_collection.json +++ b/Postman Docs/PodcastIndex.postman_collection.json @@ -2,7 +2,7 @@ "info": { "_postman_id": "2b24a533-e8b5-4ae0-973c-94c55ec56a81", "name": "PodcastIndex", - "description": "Download the openapi spec in [json](pi_api.json) or [yaml](pi_api.yaml) format.\n\n# Overview\n\nThe Podcast Index (Podcast Index LLC) is a software developer focused partnership that provides tools and data to\nanyone who aspires to create new and exciting Podcast experiences without the heavy lifting of indexing,\naggregation and data management.\n\n# Example Code\n\nUsers have provided example code for working the API in the following languages:\n\n - [AWS Lambda - python](https://github.com/tbowers/python-podcastindex-org-lambda)\n - [Bash](https://github.com/suorcd/Bash-podcastindex-org-example)\n - [C#](https://github.com/ComicStrip/csharp-podcastindex-org-example)\n - [Elisp](https://github.com/sabexx/elisp-example)\n - [Flutter/Dart](https://github.com/crediblecreative/flutter-dart-podcastindex-org-example)\n - [Go](https://github.com/ComicStrip/Go-podcastindex-org-example)\n - [Go](https://github.com/kilobit/podcast-index-client)\n - [Java](https://github.com/ComicStrip/Java-podcastindex-org-example)\n - [Java](https://github.com/stucoates/PodcastIndexJavaClient)\n - [Node.js](https://github.com/ComicStrip/node.js-podcastindex-org-example)\n - [PHP](https://github.com/Podcastindex-org/example-code)\n - [Python](https://github.com/tbowers/python-podcastindex-org-example)\n - [Swift](https://github.com/ComicStrip/Swift-podcastindex-org-example)\n - ... [More](https://github.com/Podcastindex-org-Examples)\n\nDon't see your desired language, create an example repo and create a\n[Pull Request](https://github.com/Podcastindex-org/docs-api/pulls) with a link to your example code project!\n\n# Libraries\n\nUser created libraries for working with the API:\n\n - Java\n - [podcast4j](https://github.com/yusufyilmazfr/podcast4j)\n - .NET\n - [PodcastIndexSharp](https://www.nuget.org/packages/PodcastIndexSharp)\n - Node.js/npm/yarn\n - [podcast-index-api](https://www.npmjs.com/package/podcast-index-api)\n - [podcastdx-client](https://www.npmjs.com/package/podcastdx-client)\n - PHP\n - [podcastindex-php](https://github.com/LowSociety/podcastindex-php)\n - Python/pip\n - [python-podcastindex](https://pypi.org/project/python-podcastindex/)\n - R\n - [podindexr](https://github.com/rpodcast/podindexr)\n - Ruby\n - [podcast-index](https://github.com/jasonyork/podcast-index)\n - Swift\n - [PodcastIndexKit](https://github.com/SparrowTek/PodcastIndexKit)\n - Kotlin\n - [PodcastIndex-SDK](https://github.com/mr3y-the-programmer/PodcastIndex-SDK)\nAre we missing a library? Did you create one for a different language? Create a\n[Pull Request](https://github.com/Podcastindex-org/docs-api/pulls) with a link to the new library!\n\n# Postman\n\nA collection file for use in the [Postman](https://www.postman.com/) application is available for this API.\n\n 1. Download the contents of the [Postman Docs](https://github.com/Podcastindex-org/docs-api/tree/master/Postman%20Docs) folder.\n 2. Import the `PodcastIndex.postman_collection.json` collection to Postman\n 3. Import the `PodcastIndexOrgEnvironment.postman_environment.json` to Postman\n 4. Click \"Environments\" on the left sidebar\n 5. Select the checkbox next to the PodcastIndexOrgEnvironment entry\n 6. Set `AuthKey` and `SeceretKey` values under the \"Current Value\" column using your API information \n 7. Click \"Collections\" from the sidebar\n 8. Select PodcastIndex\n 9. Select and run the endpoint to test\n\n# Contributing\n\nThe source for this API documentation is available at\n[https://github.com/Podcastindex-org/docs-api](https://github.com/Podcastindex-org/docs-api).\nSubmit an Issue or create a Pull Request.\n\n# Authentication Details\n\nSending an API request is easy. We use an Amazon-style request authorization token to secure each request.\n\nRegister for a free API key at https://api.podcastindex.org/\n\nThese headers parameters are required for each request: `User-Agent`, `X-Auth-Date`, `X-Auth-Key`, `Authorization`\n\nSee [Authentication](#auth) for description of parameters.\n\n# Legal\n\nLegal\n\n - [Privacy Policy](https://github.com/Podcastindex-org/legal/blob/main/PrivacyPolicy.md)\n - [Terms of Service](https://github.com/Podcastindex-org/legal/blob/main/TermsOfService.md)\n - [License](https://github.com/Podcastindex-org/docs-api/blob/master/LICENSE)\n", + "description": "Download the openapi spec in [json](pi_api.json) or [yaml](pi_api.yaml) format.\n\n# Overview\n\nThe Podcast Index (Podcast Index LLC) is a software developer focused partnership that provides tools and data to\nanyone who aspires to create new and exciting Podcast experiences without the heavy lifting of indexing,\naggregation and data management.\n\n# Example Code\n\nUsers have provided example code for working the API in the following languages:\n\n - [AWS Lambda - python](https://github.com/tbowers/python-podcastindex-org-lambda)\n - [Bash](https://github.com/suorcd/Bash-podcastindex-org-example)\n - [C#](https://github.com/ComicStrip/csharp-podcastindex-org-example)\n - [Elisp](https://github.com/sabexx/elisp-example)\n - [Flutter/Dart](https://github.com/crediblecreative/flutter-dart-podcastindex-org-example)\n - [Go](https://github.com/ComicStrip/Go-podcastindex-org-example)\n - [Go](https://github.com/kilobit/podcast-index-client)\n - [Java](https://github.com/ComicStrip/Java-podcastindex-org-example)\n - [Java](https://github.com/stucoates/PodcastIndexJavaClient)\n - [Node.js](https://github.com/ComicStrip/node.js-podcastindex-org-example)\n - [PHP](https://github.com/Podcastindex-org/example-code)\n - [Python](https://github.com/tbowers/python-podcastindex-org-example)\n - [Swift](https://github.com/ComicStrip/Swift-podcastindex-org-example)\n - ... [More](https://github.com/Podcastindex-org-Examples)\n\nDon't see your desired language, create an example repo and create a\n[Pull Request](https://github.com/Podcastindex-org/docs-api/pulls) with a link to your example code project!\n\n# Libraries\n\nUser created libraries for working with the API:\n\n - Java\n - [podcast4j](https://github.com/yusufyilmazfr/podcast4j)\n - .NET\n - [PodcastIndexSharp](https://www.nuget.org/packages/PodcastIndexSharp)\n - Node.js/npm/yarn\n - [podcast-index-api](https://www.npmjs.com/package/podcast-index-api)\n - [podcastdx-client](https://www.npmjs.com/package/podcastdx-client)\n - PHP\n - [podcastindex-php](https://github.com/LowSociety/podcastindex-php)\n - Python/pip\n - [python-podcastindex](https://pypi.org/project/python-podcastindex/)\n - R\n - [podindexr](https://github.com/rpodcast/podindexr)\n - Ruby\n - [podcast-index](https://github.com/jasonyork/podcast-index)\n - Swift\n - [PodcastIndexKit](https://github.com/SparrowTek/PodcastIndexKit)\n - Kotlin\n - [PodcastIndex-SDK](https://github.com/mr3y-the-programmer/PodcastIndex-SDK)\n - Go\n - [podcastindex](https://github.com/jjgmckenzie/podcastindex)\n - [podcastindex-go](https://github.com/koalahl/podcastindex-go)\nAre we missing a library? Did you create one for a different language? Create a\n[Pull Request](https://github.com/Podcastindex-org/docs-api/pulls) with a link to the new library!\n\n# Postman\n\nA collection file for use in the [Postman](https://www.postman.com/) application is available for this API.\n\n 1. Download the contents of the [Postman Docs](https://github.com/Podcastindex-org/docs-api/tree/master/Postman%20Docs) folder.\n 2. Import the `PodcastIndex.postman_collection.json` collection to Postman\n 3. Import the `PodcastIndexOrgEnvironment.postman_environment.json` to Postman\n 4. Click \"Environments\" on the left sidebar\n 5. Select the checkbox next to the PodcastIndexOrgEnvironment entry\n 6. Set `AuthKey` and `SeceretKey` values under the \"Current Value\" column using your API information \n 7. Click \"Collections\" from the sidebar\n 8. Select PodcastIndex\n 9. Select and run the endpoint to test\n\n# Contributing\n\nThe source for this API documentation is available at\n[https://github.com/Podcastindex-org/docs-api](https://github.com/Podcastindex-org/docs-api).\nSubmit an Issue or create a Pull Request.\n\n# Authentication Details\n\nSending an API request is easy. We use an Amazon-style request authorization token to secure each request.\n\nRegister for a free API key at https://api.podcastindex.org/\n\nThese headers parameters are required for each request: `User-Agent`, `X-Auth-Date`, `X-Auth-Key`, `Authorization`\n\nSee [Authentication](#auth) for description of parameters.\n\n# Legal\n\nLegal\n\n - [Privacy Policy](https://github.com/Podcastindex-org/legal/blob/main/PrivacyPolicy.md)\n - [Terms of Service](https://github.com/Podcastindex-org/legal/blob/main/TermsOfService.md)\n - [License](https://github.com/Podcastindex-org/docs-api/blob/master/LICENSE)\n", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, "item": [ diff --git a/docs/pi_api.json b/docs/pi_api.json index 26eb88f..d326b22 100644 --- a/docs/pi_api.json +++ b/docs/pi_api.json @@ -16,7 +16,7 @@ "url": "logo.svg", "href": "/" }, - "description": "Download the openapi spec in [json](pi_api.json) or [yaml](pi_api.yaml) format.\n\n# Overview\n\nThe Podcast Index (Podcast Index LLC) is a software developer focused partnership that provides tools and data to\nanyone who aspires to create new and exciting Podcast experiences without the heavy lifting of indexing,\naggregation and data management.\n\n# Example Code\n\nUsers have provided example code for working the API in the following languages:\n\n - [AWS Lambda - python](https://github.com/tbowers/python-podcastindex-org-lambda)\n - [Bash](https://github.com/suorcd/Bash-podcastindex-org-example)\n - [C#](https://github.com/ComicStrip/csharp-podcastindex-org-example)\n - [Elisp](https://github.com/sabexx/elisp-example)\n - [Flutter/Dart](https://github.com/crediblecreative/flutter-dart-podcastindex-org-example)\n - [Go](https://github.com/ComicStrip/Go-podcastindex-org-example)\n - [Go](https://github.com/kilobit/podcast-index-client)\n - [Java](https://github.com/ComicStrip/Java-podcastindex-org-example)\n - [Java](https://github.com/stucoates/PodcastIndexJavaClient)\n - [Node.js](https://github.com/ComicStrip/node.js-podcastindex-org-example)\n - [PHP](https://github.com/Podcastindex-org/example-code)\n - [Python](https://github.com/tbowers/python-podcastindex-org-example)\n - [Swift](https://github.com/ComicStrip/Swift-podcastindex-org-example)\n - ... [More](https://github.com/Podcastindex-org-Examples)\n\nDon't see your desired language, create an example repo and create a\n[Pull Request](https://github.com/Podcastindex-org/docs-api/pulls) with a link to your example code project!\n\n# Libraries\n\nUser created libraries for working with the API:\n\n - Java\n - [podcast4j](https://github.com/yusufyilmazfr/podcast4j)\n - .NET\n - [PodcastIndexSharp](https://www.nuget.org/packages/PodcastIndexSharp)\n - Node.js/npm/yarn\n - [podcast-index-api](https://www.npmjs.com/package/podcast-index-api)\n - [podcastdx-client](https://www.npmjs.com/package/podcastdx-client)\n - PHP\n - [podcastindex-php](https://github.com/LowSociety/podcastindex-php)\n - Python/pip\n - [python-podcastindex](https://pypi.org/project/python-podcastindex/)\n - R\n - [podindexr](https://github.com/rpodcast/podindexr)\n - Ruby\n - [podcast-index](https://github.com/jasonyork/podcast-index)\n - Swift\n - [PodcastIndexKit](https://github.com/SparrowTek/PodcastIndexKit)\n - Kotlin\n - [PodcastIndex-SDK](https://github.com/mr3y-the-programmer/PodcastIndex-SDK)\n\nAre we missing a library? Did you create one for a different language? Create a\n[Pull Request](https://github.com/Podcastindex-org/docs-api/pulls) with a link to the new library!\n\n# Postman\n\nA collection file for use in the [Postman](https://www.postman.com/) application is available for this API.\n\n 1. Download the contents of the [Postman Docs](https://github.com/Podcastindex-org/docs-api/tree/master/Postman%20Docs) folder.\n 2. Import the `PodcastIndex.postman_collection.json` collection to Postman\n 3. Import the `PodcastIndexOrgEnvironment.postman_environment.json` to Postman\n 4. Click \"Environments\" on the left sidebar\n 5. Select the checkbox next to the PodcastIndexOrgEnvironment entry\n 6. Set `AuthKey` and `SeceretKey` values under the \"Current Value\" column using your API information\n 7. Click \"Collections\" from the sidebar\n 8. Select PodcastIndex\n 9. Select and run the endpoint to test\n\n# Contributing\n\nThe source for this API documentation is available at\n[https://github.com/Podcastindex-org/docs-api](https://github.com/Podcastindex-org/docs-api).\nSubmit an Issue or create a Pull Request.\n\n# Authentication Details\n\nSending an API request is easy. We use an Amazon-style request authorization token to secure each request.\n\n\nRegister for a free API key at https://api.podcastindex.org/\n\n\nThese headers parameters are required for each request: `User-Agent`, `X-Auth-Date`, `X-Auth-Key`, `Authorization`\n\n\nSee [Authentication](#auth) for description of parameters.\n\n# Legal\n\nLegal\n\n - [Privacy Policy](https://github.com/Podcastindex-org/legal/blob/main/PrivacyPolicy.md)\n - [Terms of Service](https://github.com/Podcastindex-org/legal/blob/main/TermsOfService.md)\n - [License](https://github.com/Podcastindex-org/docs-api/blob/master/LICENSE)\n" + "description": "Download the openapi spec in [json](pi_api.json) or [yaml](pi_api.yaml) format.\n\n# Overview\n\nThe Podcast Index (Podcast Index LLC) is a software developer focused partnership that provides tools and data to\nanyone who aspires to create new and exciting Podcast experiences without the heavy lifting of indexing,\naggregation and data management.\n\n# Example Code\n\nUsers have provided example code for working the API in the following languages:\n\n - [AWS Lambda - python](https://github.com/tbowers/python-podcastindex-org-lambda)\n - [Bash](https://github.com/suorcd/Bash-podcastindex-org-example)\n - [C#](https://github.com/ComicStrip/csharp-podcastindex-org-example)\n - [Elisp](https://github.com/sabexx/elisp-example)\n - [Flutter/Dart](https://github.com/crediblecreative/flutter-dart-podcastindex-org-example)\n - [Go](https://github.com/ComicStrip/Go-podcastindex-org-example)\n - [Go](https://github.com/kilobit/podcast-index-client)\n - [Java](https://github.com/ComicStrip/Java-podcastindex-org-example)\n - [Java](https://github.com/stucoates/PodcastIndexJavaClient)\n - [Node.js](https://github.com/ComicStrip/node.js-podcastindex-org-example)\n - [PHP](https://github.com/Podcastindex-org/example-code)\n - [Python](https://github.com/tbowers/python-podcastindex-org-example)\n - [Swift](https://github.com/ComicStrip/Swift-podcastindex-org-example)\n - ... [More](https://github.com/Podcastindex-org-Examples)\n\nDon't see your desired language, create an example repo and create a\n[Pull Request](https://github.com/Podcastindex-org/docs-api/pulls) with a link to your example code project!\n\n# Libraries\n\nUser created libraries for working with the API:\n\n - Java\n - [podcast4j](https://github.com/yusufyilmazfr/podcast4j)\n - .NET\n - [PodcastIndexSharp](https://www.nuget.org/packages/PodcastIndexSharp)\n - Node.js/npm/yarn\n - [podcast-index-api](https://www.npmjs.com/package/podcast-index-api)\n - [podcastdx-client](https://www.npmjs.com/package/podcastdx-client)\n - PHP\n - [podcastindex-php](https://github.com/LowSociety/podcastindex-php)\n - Python/pip\n - [python-podcastindex](https://pypi.org/project/python-podcastindex/)\n - R\n - [podindexr](https://github.com/rpodcast/podindexr)\n - Ruby\n - [podcast-index](https://github.com/jasonyork/podcast-index)\n - Swift\n - [PodcastIndexKit](https://github.com/SparrowTek/PodcastIndexKit)\n - Kotlin\n - [PodcastIndex-SDK](https://github.com/mr3y-the-programmer/PodcastIndex-SDK)\n - Go\n - [podcastindex](https://github.com/jjgmckenzie/podcastindex)\n - [podcastindex-go](https://github.com/koalahl/podcastindex-go)\n\nAre we missing a library? Did you create one for a different language? Create a\n[Pull Request](https://github.com/Podcastindex-org/docs-api/pulls) with a link to the new library!\n\n# Postman\n\nA collection file for use in the [Postman](https://www.postman.com/) application is available for this API.\n\n 1. Download the contents of the [Postman Docs](https://github.com/Podcastindex-org/docs-api/tree/master/Postman%20Docs) folder.\n 2. Import the `PodcastIndex.postman_collection.json` collection to Postman\n 3. Import the `PodcastIndexOrgEnvironment.postman_environment.json` to Postman\n 4. Click \"Environments\" on the left sidebar\n 5. Select the checkbox next to the PodcastIndexOrgEnvironment entry\n 6. Set `AuthKey` and `SeceretKey` values under the \"Current Value\" column using your API information\n 7. Click \"Collections\" from the sidebar\n 8. Select PodcastIndex\n 9. Select and run the endpoint to test\n\n# Contributing\n\nThe source for this API documentation is available at\n[https://github.com/Podcastindex-org/docs-api](https://github.com/Podcastindex-org/docs-api).\nSubmit an Issue or create a Pull Request.\n\n# Authentication Details\n\nSending an API request is easy. We use an Amazon-style request authorization token to secure each request.\n\n\nRegister for a free API key at https://api.podcastindex.org/\n\n\nThese headers parameters are required for each request: `User-Agent`, `X-Auth-Date`, `X-Auth-Key`, `Authorization`\n\n\nSee [Authentication](#auth) for description of parameters.\n\n# Legal\n\nLegal\n\n - [Privacy Policy](https://github.com/Podcastindex-org/legal/blob/main/PrivacyPolicy.md)\n - [Terms of Service](https://github.com/Podcastindex-org/legal/blob/main/TermsOfService.md)\n - [License](https://github.com/Podcastindex-org/docs-api/blob/master/LICENSE)\n" }, "servers": [ { diff --git a/docs/pi_api.yaml b/docs/pi_api.yaml index bf1f272..245b4de 100644 --- a/docs/pi_api.yaml +++ b/docs/pi_api.yaml @@ -66,6 +66,9 @@ info: - [PodcastIndexKit](https://github.com/SparrowTek/PodcastIndexKit) - Kotlin - [PodcastIndex-SDK](https://github.com/mr3y-the-programmer/PodcastIndex-SDK) + - Go + - [podcastindex](https://github.com/jjgmckenzie/podcastindex) + - [podcastindex-go](https://github.com/koalahl/podcastindex-go) Are we missing a library? Did you create one for a different language? Create a [Pull Request](https://github.com/Podcastindex-org/docs-api/pulls) with a link to the new library! From 9fa606bed6ffbb7c44389519812d4e88d411f354 Mon Sep 17 00:00:00 2001 From: David Marzal <2069735+Marzal@users.noreply.github.com> Date: Mon, 1 Sep 2025 19:55:12 +0200 Subject: [PATCH 09/11] Update transcript.yaml AS per #147 --- api_src/components/schemas/transcript.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api_src/components/schemas/transcript.yaml b/api_src/components/schemas/transcript.yaml index faab4a8..cb7c360 100644 --- a/api_src/components/schemas/transcript.yaml +++ b/api_src/components/schemas/transcript.yaml @@ -2,7 +2,7 @@ description: | This tag is used to link to a transcript or closed captions file. Multiple tags can be present for multiple transcript formats. - Detailed file format information and example files are [here](https://github.com/Podcastindex-org/podcast-namespace/blob/main/transcripts/transcripts.md). + Detailed file format information and example files are [here](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/tags/transcript.md). type: object properties: url: From 429f35bf5786197d1710ecf96f6190b360a7f003 Mon Sep 17 00:00:00 2001 From: David Marzal <2069735+Marzal@users.noreply.github.com> Date: Mon, 1 Sep 2025 19:56:51 +0200 Subject: [PATCH 10/11] Update pi_api.json As per https://github.com/Podcastindex-org/docs-api/issues/147 --- docs/pi_api.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/pi_api.json b/docs/pi_api.json index d326b22..e87fc0b 100644 --- a/docs/pi_api.json +++ b/docs/pi_api.json @@ -3282,7 +3282,7 @@ "example": "https://mp3s.nashownotes.com/NA-1322-Captions.srt" }, "transcript": { - "description": "This tag is used to link to a transcript or closed captions file. Multiple tags can be present for multiple transcript formats.\n\nDetailed file format information and example files are [here](https://github.com/Podcastindex-org/podcast-namespace/blob/main/transcripts/transcripts.md).\n", + "description": "This tag is used to link to a transcript or closed captions file. Multiple tags can be present for multiple transcript formats.\n\nDetailed file format information and example files are [here](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/tags/transcript.md).\n", "type": "object", "properties": { "url": { @@ -7134,4 +7134,4 @@ } } } -} \ No newline at end of file +} From 7a477d5731d34151e3a8461f0a4d05c427c202d6 Mon Sep 17 00:00:00 2001 From: David Marzal <2069735+Marzal@users.noreply.github.com> Date: Mon, 1 Sep 2025 19:57:47 +0200 Subject: [PATCH 11/11] Update pi_api.yaml As per https://github.com/Podcastindex-org/docs-api/issues/147 --- docs/pi_api.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/pi_api.yaml b/docs/pi_api.yaml index 245b4de..15bba08 100644 --- a/docs/pi_api.yaml +++ b/docs/pi_api.yaml @@ -3186,7 +3186,7 @@ components: description: | This tag is used to link to a transcript or closed captions file. Multiple tags can be present for multiple transcript formats. - Detailed file format information and example files are [here](https://github.com/Podcastindex-org/podcast-namespace/blob/main/transcripts/transcripts.md). + Detailed file format information and example files are [here](https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/tags/transcript.md). type: object properties: url: