Liking cljdoc? Tell your friends :D

Diagnostics

Generated from dk.simongray.podcast.diagnostics by dev/reference.clj, so don't edit it by hand.

A diagnostic is a map with an :id, a :level and a :message, where the message is the meaning below unless the code gives a more specific one. Other keys give details, such as a :path into the data or the :tag of an element. Use report for the diagnostics of a parsed feed, transcript or chapters document, validate for those of a feed, and summarize to group diagnostics by kind.

The level says how much a diagnostic matters:

  • error: a rule of a spec or of the chosen requirements is broken, so apps or a directory can misread the feed, or refuse it
  • warning: the feed works, but apps are likely to show or treat something worse than the podcaster means
  • info: something worth knowing that needs no change, e.g. a repair that the parse made

The requirements of a directory can raise a level, e.g. a repeated enclosure URL is an error for Apple. An error under Apple's requirements breaks a rule of its guide, though Apple Podcasts Connect doesn't say which rules it refuses a feed for. To tell whether a feed passes, give the diagnostics of validate/report to diagnostics/verdict.

The namespace of an id says which part of podcast-clj found the problem:

  • fetch: the fetch of a feed or a list
  • discovery: finding the feeds of a show from an address
  • repair: the repairs of malformed XML
  • xml: the parse and namespace resolution
  • quirk: the normalisations of the tree
  • feed: the model
  • transcript and chapters: the companion formats
  • mp3, mp4 and file: the media files and the images
  • id3: the ID3v2 tags of media files, through id3-clj
  • validate: the validator
  • check: the checks over the network
  • sync: the sync between devices, through like-minded
  • gpodder: a sync through the gpodder API
  • library: a saved library
  • podping: a poll of the Hive chain
  • comments: the threads of comments
  • value: the records of payments, the remote items of time splits, the Lightning addresses and the wallets
  • analytics: the list of user agents, and the downloads of OP3

A function that sends requests also returns its failures as diagnostics, under the :error of its result.

IdLevelMeaning
:fetch/unreachablewarningThe feed or list couldn't be fetched: the name of its host wasn't found, the host couldn't be reached, the secure connection failed, the request took too long, the answer was too large, or the URL wasn't allowed. The :type of wary-fetch says which, when the platform tells.
:refresh/offlineinfoThe device seems to be offline: :online? said so, or every fetch of the refresh failed before a server answered, at more than one host. No feed counts it as a failure, and each stays due, so the next refresh fetches it.
:refresh/stoppedinfoThe :signal of the refresh stopped it, e.g. as the listener cancelled it. The feeds whose fetch it stopped or kept from starting count no failure, and stay due.
:fetch/malformedwarningThe document isn't an RSS feed, or for a list, an OPML document: it isn't XML, or its root element isn't rss or opml.
:fetch/unsupported-formatwarningThe document is an Atom or RSS 1.0 feed rather than RSS 2.0, so it can't be read. The :format names which.
:fetch/page-failedwarningA page of a paged feed couldn't be fetched or read, so the feed lacks the items of that page and the pages after it.
:fetch/statuswarningThe server answered with a status that isn't a success, such as 404. The feed stays as it was, and the next fetch waits longer after each failure in a row.
:fetch/empty-feedwarningThe feed came back without items, though it had some before, as some hosts answer during an outage. The feed stays as it was, and the next fetch waits as after a failure.
:fetch/gonewarningThe feed is gone: its server answered 410, or it failed many times in a row, as the :failures say. It isn't checked any more, unless a Podping or a refresh of that feed asks for it, and a fetch that succeeds brings it back.
:fetch/move-unverifiedwarningThe feed declares that it moved to the :new-url, but no feed of the show answered there, as the :reason says. So the feed stays at its old URL, and the move is tried again at the next fetch.
:fetch/guid-takenwarningThe feed declares the podcast:guid of another subscription, at another URL, and would take that subscription over, so it isn't added. To replace the other subscription, unsubscribe from it first.
:fetch/guid-changedinfoThe feed gives itself another guid than before, from :old to :new, e.g. a new podcast:guid, or a new URL of a feed that declares none. Its subscription keeps its key, the :feed-guid, and notes the new guid.
:discovery/unreadablewarningThe text isn't a URL, a domain or a link of an app, so there's nothing to fetch. It may be words to search a directory with.
:discovery/not-foundwarningNo feed was found: the page names none that could be read, and none of the other places that were tried has one.
:directory/source-failedwarningA directory gave no answer to a search, a chart, a lookup or a call for the names of its categories, so what it knows is missing from the results. The :source names it, and the :reason says why.
:repair/leading-junkwarningText before the XML declaration or the rss element, such as whitespace, a byte order mark or a PHP warning, was removed.
:repair/trailing-junkwarningText after the end of the rss element, such as a PHP warning, was removed.
:repair/control-characterswarningControl characters that XML forbids, and character references to them, were removed.
:repair/undeclared-prefixeswarningKnown namespace prefixes that were used without a declaration were declared.
:repair/html-entitieswarningHTML entities that XML lacks, such as  , were replaced by character references.
:repair/bare-ampersandswarningBare ampersands were escaped.
:repair/lenient-parserwarningThe document was still malformed after the repairs, so it was parsed leniently, with the parser that the app installed or with jsoup.
:xml/skipped-entitywarningAn entity that only an external DTD could declare was left out of the text, since no external DTD is read. The :entity names it.
:xml/default-namespaceinfoA default namespace isn't known, so the elements in it have no alias, and its declaration stays as an xmlns attribute.
:xml/unknown-namespaceinfoThe namespace URI isn't known, so its prefix is used as the alias.
:xml/undeclared-prefixwarningA prefix was used without a declaration, which only the JVM parser accepts, so the prefix is used as the alias.
:quirk/namespace-variantinfoA namespace was bound to a variant of its URI, such as http for https, another case, a trailing slash or an old URI, and was recognised anyway.
:quirk/rss-default-namespaceinfoThe rss element declared a default namespace, such as that of Atom, though RSS 2.0 has none, so it was ignored.
:quirk/itunes-image-textinfoAn itunes:image gave its URL as text or in a url attribute instead of href.
:quirk/explicit-valueinfoAn itunes:explicit said yes, no, explicit or clean, which was read as true or false.
:quirk/yes-no-valueinfoA yes/no element said true or false, which was read as yes or no.
:quirk/transcript-typeinfoA transcript type was written loosely, as srt, vtt, json or text, or with a parameter such as a charset, and was corrected to its MIME type.
:quirk/attribute-nameinfoAn href attribute was used where the spec asks for url, and was renamed.
:quirk/enclosure-lengthinfoAn enclosure length that wasn't a number was dropped.
:quirk/empty-guidinfoAn empty guid was dropped, so the identity of the item is its enclosure URL.
:quirk/deprecated-imagesinfoA deprecated podcast:images srcset was turned into podcast:image elements.
:quirk/item-imageinfoAn item had an image element with only attributes, which RSS 2.0 lacks, and it was read as the itunes:image that it stands for.
:quirk/podcast-categoryinfoA channel had the non-standard podcast:category elements that Wavlake writes, and no itunes:category, so they were read as itunes:category, whose shape they copy.
:quirk/duration-formatinfoAn itunes:duration was written as a clock time rather than in seconds, and was read as seconds.
:quirk/date-formatinfoA date wasn't in strict RFC 2822 form, but could still be read.
:feed/duplicate-elementwarningAn element that the spec allows once occurred again, and only the first one is kept. The :tag names the element, and the :count is the number of the others.
:feed/empty-elementinfoAn element with a single value had no text, and was left out.
:feed/empty-attributeinfoAn optional attribute was blank, and is left out of the model. A required one that's blank is kept for the validator.
:feed/invalid-valuewarningA value didn't read as its type, and stays a string.
:feed/string-valueinfoA feed built from data held a string where the model takes another type, e.g. a date, and it was read as that type, as parse reads the text of XML. The :value is the string, and the :type the type.
:feed/markup-in-textinfoMarkup appeared where the registry expects text. It's kept as markup in HTML content, and flattened to text elsewhere.
:feed/unexpected-textinfoText inside an element that the spec leaves empty was dropped.
:feed/dropped-attributesinfoAttributes that the model has no place for were dropped: those of an element read as a single value, those of rss other than its version, and those of channel.
:transcript/speaker-prefixesinfoSpeakers were taken from Name: prefixes in the cues, and carried over to the cues that follow.
:transcript/voices-carriedinfoA WebVTT file gives a voice span only where the speaker changes, so the cues without one took the speaker before them. The :count is the number of such cues.
:transcript/cues-droppedwarningCues of a WebVTT file have timings that don't parse, e.g. 1000 milliseconds, so they were left out, as a browser leaves them out. The :count is the number of such cues.
:transcript/srt-tagsinfoSRT cues held the formatting tags of HTML, e.g. for italics or a font, which SRT doesn't define, and the text was read without them. The :count is the number of such cues.
:transcript/string-timeswarningSegment times were given as strings rather than numbers, and were read as numbers.
:transcript/wrapped-srtwarningAn HTML transcript was an SRT file with every line wrapped in an element, and was read as SRT.
:transcript/unknown-typewarningThe declared type isn't one that the spec names, so the format was detected from the file instead.
:transcript/type-mismatchwarningThe declared type doesn't match the file, which was read as the format that it really is.
:transcript/not-an-objectwarningA JSON transcript isn't JSON, or isn't a JSON object, so it holds no segments.
:transcript/malformedwarningSegments of a JSON transcript that aren't JSON objects in a list were left out.
:transcript/not-textwarningSpeakers in a JSON transcript that aren't text, such as a JSON object, were left out.
:chapters/string-timeswarningChapter times were given as strings rather than numbers, and were read as numbers.
:chapters/not-textwarningChapter titles, links or place names that aren't text, such as a JSON object, were left out.
:chapters/missing-start-timewarningChapters without a start time can't be placed.
:chapters/unsortedinfoThe chapters weren't in order of start time, which the format assumes.
:chapters/unknown-keysinfoKeys that the format doesn't define were kept as they are.
:chapters/old-versioninfoThe document was written for an older version of the format.
:chapters/bad-timestampswarningPodlove chapters whose start isn't a timestamp were dropped.
:chapters/inferredinfoThe chapters were read from timestamps in the show notes rather than from a chapters file.
:chapters/not-an-objectwarningThe document isn't JSON, or isn't a JSON object, so it holds no chapters.
:chapters/malformedwarningChapters that aren't JSON objects in a list were left out.
:mp3/junk-before-audioinfoBytes that aren't MPEG audio frames lie between the tags and the first frame, e.g. padding that the size of a tag leaves out, and were skipped.
:mp3/estimated-durationinfoThe MP3 file has no Xing, Info or VBRI header, so the duration was estimated from the bitrate of the first frames and the size of the file. The estimate is exact for a constant bitrate.
:mp3/no-audiowarningNo MPEG audio frame was found after the tags, so the file has no duration.
:mp4/zero-durationinfoThe movie header of the MP4 file gives no duration, so the duration of the longest track was used.
:mp4/fragments-unreadinfoThe MP4 file is in fragments, with no mehd box and no index at its end that gives the duration of all of them, so the file has no duration.
:mp4/no-moviewarningThe MP4 file has no movie box, so it gives no duration and no chapters.
:mp4/chapter-images-skippedinfoThe images of the chapters of the MP4 file are larger than a reading takes, so the chapters have no images.
:ogg/unknown-codecwarningThe Ogg file has no Opus or Vorbis stream, e.g. it holds FLAC or Speex, so nothing was read from it.
:ogg/no-audiowarningThe Opus or Vorbis stream has no audio after its headers, so the file has no duration.
:ogg/no-endinfoNo page of the audio stream ends a packet in the last 64 KB of the file, e.g. because other streams follow it, so the file has no duration.
:ogg/chapter-startwarningA CHAPTERxxx comment doesn't give the start of its chapter as a time, such as 00:05:00.000, so the chapter was left out.
:ogg/image-typeinfoA METADATA_BLOCK_PICTURE gave the type of its picture loosely, such as JPG or image/jpg, or gave none, so the type was taken from the bytes of the image.
:aac/estimated-durationinfoThe duration of the AAC file was estimated from the average length of its first frames and the size of the file, since the whole file wasn't read.
:aac/no-audiowarningNo ADTS frame was found after the tags, so the file has no duration.
:file/unknown-formatwarningThe file isn't in a format that its reader knows, so nothing was read from it. Media files can be MP3, MP4, Ogg with Opus or Vorbis, or AAC in ADTS frames, and images PNG, JPEG, GIF or WebP, while AVIF, HEIC, HEIF, SVG, BMP, TIFF and ICO images are only recognised by their type.
:file/truncatedwarningThe file ends before its structures say it does.
:file/malformedwarningThe file doesn't read as its format says.
:file/durationinfoThe duration of the media file or stream differs from the one that the feed declares by more than 10 seconds and 2 percent. A host that inserts ads can explain it, but then a position in this file may not be the same moment in another file of the episode, such as its video.
:file/incompletewarningThe bytes that the reader needed didn't arrive, or a limit stopped the reading, so nothing was read.
:file/unreachablewarningThe file couldn't be fetched: the request failed, or the server answered with a status that isn't a success.
:file/unverifiableinfoThis podcast:integrity can't be checked. A PGP signature needs the key of the publisher, and an sri value must name a sha256, sha384 or sha512 hash.
:check/unreachableerrorThe file couldn't be fetched: the name of its host wasn't found, the host couldn't be reached, the TLS handshake failed, or the request took too long. The :type of wary-fetch says which, when the platform tells.
:check/statuserrorThe server answered with a status that isn't a success, so a listener doesn't get the file.
:check/downgradeerrorA redirect leads from https to http, which clients refuse to follow.
:check/redirectswarningThe file is more than five redirects away, more than the check and some clients follow.
:check/movedwarningThe file moved for good, with a 301 or 308 redirect, so the feed can name its new URL.
:check/headerrorThe server doesn't answer a HEAD request for the file. RFC 9110 requires HEAD of every general-purpose server, and directories use it to check files.
:check/typewarningThe server gives the file a different media type than the feed declares.
:check/media-typeerrorThe chosen requirements don't take a media file of the :type that the server gives it, e.g. YouTube, which makes its videos from audio files.
:check/no-readerinfoA reading of the file was asked for, but the media reader knows no format of the :type that the feed declares, e.g. audio/x-wav, so its duration and codecs weren't checked.
:check/no-typewarningThe feed declares no media type for the file, which RSS 2.0 and the podcast namespace require. The :served type is the one that the server gives it.
:check/lengthinfoThe size of the file differs from the length that the feed declares. A host that inserts ads sends a file of a different size to each request, so the length can't be exact.
:check/rangeswarningThe server doesn't answer a request for a byte range with that range. RFC 9110 makes ranges optional but recommends them, players need them to seek and resume, and Apple Podcasts requires them.
:check/formatwarningThe media file is in a different format than the type that the feed declares.
:check/durationinfoThe duration of the media file differs from the one that the feed declares by more than 10 seconds and 2 percent, which a host that inserts ads can explain.
:check/slow-startwarningThe movie of the MP4 file comes after its media data, so a player must fetch the end of the file before it can play the start. Writing the movie first fixes it.
:check/codecswarningThe codecs that the alternate enclosure declares are those of neither its file nor any variant of its stream, so an app that asks the platform whether it can play them gets the wrong answer.
:check/heightwarningThe height that the alternate enclosure declares is that of neither its video nor any variant of its stream.
:check/unreadwarningThe file arrived, but its content wasn't read, because a request for more of its bytes failed or its reader failed.
:check/integrityerrorThe media file doesn't match the hash of its podcast:integrity.
:check/unverifiedinfoThe media file wasn't compared with its podcast:integrity, because a PGP signature needs the key of the publisher, the integrity names no hash that Subresource Integrity knows, or the whole file didn't arrive.
:check/image-typeinfoThe server gives the image a different media type than its bytes have, such as image/jpg for a JPEG. Browsers go by the bytes of an image.
:check/image-sizewarningThe size of the image differs from the width, height or aspect ratio that its podcast:image declares.
:check/artwork-sizeerrorThe image of an itunes:image isn't a square of the size that the chosen requirements ask for, e.g. 1400 to 3000 pixels for Apple.
:check/artwork-typeerrorThe image of an itunes:image isn't of a type that the chosen requirements ask for, e.g. JPEG or PNG for Apple, or it's a JPEG that apps and browsers can't decode: lossless, hierarchical, arithmetic-coded, JPEG-LS, or with more than 8 bits per sample.
:check/artwork-colorerrorThe image of an itunes:image isn't in RGB colours, as the chosen requirements ask.
:check/artwork-alphaerrorThe image of an itunes:image has an alpha channel or transparency, which the chosen requirements don't allow.
:check/artwork-extensionwarningThe file extension in the URL of an itunes:image doesn't match the type of its image, as the chosen requirements ask.
:check/last-modifiedwarningThe server answers a HEAD request for the artwork without Last-Modified, which the chosen requirements ask for.
:check/corswarningThe server doesn't let pages on other sites read the file, so web players can't show it. The Access-Control-Allow-Origin header of the answer, or of a redirect on the way, decides this, and the podcast namespace requires CORS for transcripts.
:check/emptyerrorThe transcript or chapters file holds no segments or chapters in the format that the feed declares.
:check/feed-corsinfoThe server doesn't let pages on other sites read the feed, so a web app can't read it without a server of its own.
:check/validatorsinfoThe server sends the feed without ETag or Last-Modified, so a client can't ask whether it changed, and has to fetch it whole every time.
:check/feed-typewarningThe server sends the feed as a media type that isn't one of XML, the :served, e.g. text/html, so a browser can show it as a page and an app or a directory can refuse it. Serve it as application/rss+xml or application/xml.
:check/feed-sizewarningThe feed is larger than the requirements take: its :bytes against their :max-bytes.
:check/uncheckedwarningThe check reached a limit of files or time, and skipped the files after it, which the diagnostic counts.
:validate/rss-versionwarningThe version of the rss element isn't 2.0. The :value is the one it has. A feed built from data has none, which emit writes.
:validate/missing-elementerrorAn element that RSS 2.0 requires is missing.
:validate/missing-enclosurewarningAn item has no enclosure, so there's nothing to play.
:validate/duplicate-guiderrorAn item has the guid of an earlier item, so apps, directories and sync servers take the two for one episode. The :first-path is that of the earlier item.
:validate/duplicate-enclosurewarningAn item has the enclosure URL of an earlier item, e.g. a trailer and the episode it's cut from. Apple keeps only the first, so its requirements make it an error. The :first-path is that of the earlier item.
:validate/unknown-media-typewarningThe type of an enclosure is neither audio, video nor a playlist of either, e.g. application/octet-stream, so apps may not play it. The :value is the type.
:validate/unknown-lengthinfoThe length of an enclosure is 0, which says that it isn't known, e.g. under dynamic ad insertion, so an app can't tell the size of the file before it downloads it.
:validate/unknown-categorywarningApple Podcasts doesn't list the category of a podcast, so the show isn't listed under it. The :value is its name, and the :replacement is the path of the one that Apple lists in another case, if any. The requirements of Apple and PSP-1 make it an error.
:validate/renamed-categorywarningThe category is one that Apple Podcasts renamed or dropped in 2019, which it still reads. The :replacement is the path of the category and perhaps the subcategory that stands for it now.
:validate/escaped-categorywarningThe ampersand of a category's name was escaped twice, e.g. Society & Culture, so it names no category. The :replacement is the name meant. The requirements of Apple and PSP-1 make it an error.
:validate/wrong-subcategorywarningThe subcategory belongs under another category, or stands alone where a category belongs. The :replacement is the path where Apple Podcasts lists it. The requirements of Apple and PSP-1 make it an error.
:validate/category-depthwarningA subcategory holds a third level, which Apple Podcasts doesn't take. The requirements of Apple and PSP-1 make it an error.
:validate/missing-attributeerrorA required attribute is missing.
:validate/wrong-shapeerrorA value doesn't have the shape that its element takes: a bare value where a map of attributes belongs, or a map or sequence where a single value does.
:validate/missing-childerrorA container lacks a child that the spec requires.
:validate/invalid-structureerrorThe children of a container contradict the spec, such as a time split with both recipients and a remote item.
:validate/invalid-valueerrorA value isn't of its type, such as a string where a date belongs or :no where a boolean does, or it's a negative number, which no quantity in a feed can be. The :value is the value.
:validate/invalid-enumwarningA value isn't one of those that the spec lists. The :value is the value.
:validate/invalid-urlwarningA URL isn't absolute. The :value is the URL.
:validate/http-urlinfoA URL uses http where the podcast namespace requires https.
:validate/invalid-languagewarningA language isn't a language tag such as en or en-US, e.g. en_US, en-UK or english. The :value is the value, and the :reason says why: a reason from langtag-clj with its :subtag, e.g. :unregistered-subtag for a subtag that the IANA registry doesn't have, or :not-iso-639 for a language that isn't two or three letters.
:validate/invalid-emailinfoAn email address isn't one, alone or followed by a name in parentheses, e.g. an author given by name alone. The :value is the value.
:validate/invalid-media-typewarningA media type isn't a type and a subtype such as audio/mpeg. The :value is the value.
:validate/invalid-guidwarningA podcast:guid isn't a UUID, so the library, like the Podcast Index, identifies the feed by the guid derived from its URL. The :value is the guid.
:validate/unknown-roleinfoThe role of a person isn't in the Podcast Taxonomy. The :value is the role.
:validate/unknown-elementinfoThe registry doesn't know the element, so it's kept under :xml/unknown.
:validate/unknown-keywarningThe registry doesn't define the :key, e.g. the typo :rss/titel, or a key on the channel that isn't an element, since a parse keeps no attributes there.
:validate/deprecatedinfoThe spec of the element has deprecated it.
:validate/requirederrorA required element of the chosen requirements is missing. The :key is its key in the model.
:validate/recommendedwarningA recommended element of the chosen requirements is missing. The :key is its key in the model. When every item lacks it, it's one diagnostic of all the items, whose :count is the number of items.
:gpodder/unknown-episodesinfoEpisode actions from a gpodder server name episodes of feeds that aren't fetched yet. They wait in the cursor, and the next pull tries them again.
:gpodder/future-actionswarningEpisode actions from a gpodder server name a time more than a minute after the pull, as a device with a fast clock writes them, so they changed nothing.
:gpodder/malformed-actionswarningEpisode actions from a gpodder server name no feed, no media file or no readable time, and were left out.
:gpodder/unnamed-episodesinfoEpisodes changed, but the server wasn't told, because the gpodder API names an episode by the URL of its media, and that URL isn't known.
:gpodder/rejected-urlwarningA gpodder server refused a URL that was sent to it, so it keeps no subscription or episode action for it.
:library/save-failedwarningThe library or its search index couldn't be written to the store in full. The :reason says why.
:library/unreadable-documentwarningA document of the saved library didn't read: library.edn, so none of its parts were restored, or the document of a feed, which is fetched again. The :name says which, and the :reason why.
:library/not-loadedwarningThe feeds that :feed-guids names are due, but the library holds them in their documents alone, and no :store was given to load them from, so they weren't fetched.
:library/newer-formaterrorThe saved library is of a newer version than this one reads, so none of it was restored, and a save won't write over it. The :version says which.
:library/malformed-profilewarningThe saved profile breaks the rules of a profile, so the library kept the profile it had, and the next sync brings back what the other devices hold. The :reason says what's wrong.
:library/index-rebuiltinfoThe search index was built again from the feeds, since some of its documents were missing or didn't read. The :reason says why.
:library/push-not-appliedinfoA WebSub hub pushed a feed that couldn't be applied, so the feed is due at once and the next refresh fetches it. The :reason says why, e.g. that the body isn't a feed, or that the library holds the feed only in its document.
:podping/unavailablewarningNo node of the Hive chain answered a call of the poll. The result has the pings of the blocks that were read before that call.
:podping/not-notifiedwarningThe service didn't take the word that a feed changed: the call failed, as the :reason says, or the service answered with the :status of a failure, e.g. 401 for a token that it doesn't know.
:comments/unsupportedinfoComments over the protocol of the thread can't be read.
:comments/no-appviewwarningAn AT Protocol thread wasn't read, because the options named no AppView.
:comments/no-relaywarningA Nostr thread wasn't read, because neither the options nor the root named a relay.
:comments/malformedwarningThe URI of the root post, or a post, a collection of replies, an author or a thread that a server sent, isn't in a form that can be read.
:comments/unreachablewarningA post, a collection of replies or an author couldn't be fetched: the request failed, or the server answered with an error. With :retry?, the next fetch of the thread asks again.
:comments/refusedwarningA server refused an unsigned request, as a server in secure mode does.
:comments/untrustedwarningA server sent a post or an author from another server, which wasn't used, since a server only speaks for its own posts and authors.
:comments/through-apiinfoActivityPub didn't give the root post, so the thread was read through the Mastodon API of the server of the root post, which can give fewer replies.
:comments/withheldinfoSome replies were left out, because they aren't public, their authors ask apps to show them only to signed-in users, or a moderation service hid them. An AppView also holds back a reply when its author and the author of the post above it block each other.
:comments/unverifiedwarningEvents from a Nostr relay were left out, and the diagnostic counts them. Such an event has a wrong id or signature, or isn't one that the request asked for.
:comments/truncatedwarningA size limit cut some replies, which the diagnostic counts. Its :limit names the limit: :page for the 1,000 items of a page of replies, :id for the 2,048 characters of an id, :thread for the 10,000 comments of a thread, or :depth for the 64 levels of replies of an AT Protocol thread.
:comments/incompleteinfoThe fetch reached a limit before it read the whole thread, or a server didn't answer for a while. Fetch the thread again to read more.
:value/not-an-objectwarningThe record isn't a JSON object, so it describes no payment.
:value/text-for-numberinfoNumbers came as text, as some apps write them, and were read as numbers.
:value/roundedinfoAmounts in millisatoshis had a fraction, and were rounded.
:value/field-aliasinfoFields came under other names, as some apps write them, and were read under their own names.
:value/unreadablewarningSome fields don't hold a value of their type, and were left out.
:value/guid-as-item-idinfoThe itemID holds the guid of the episode, as Breez writes it, and was read as that guid.
:value/action-aliasinfoThe action came as streaming, as Podverse writes it, and was read as stream.
:value/unknown-actionwarningThe action isn't boost, stream or auto, so the payment has no action.
:value/unknown-keysinfoThe record has fields that its format doesn't define, which keep their names.
:value/no-podcastwarningThe record names no podcast: no guid, feed id, feed URL or title.
:value/claimed-amountwarningThe sender claims a different amount than the node received, so the payment keeps the amount of the node.
:value/claimed-recipientwarningThe sender claims that the payment went to a different recipient than the one that received it.
:value/no-metadatawarningThe comment names no URL of metadata, or the URL answered without the x-rss-payment header.
:value/custom-recorderrorThe records of the payment leave out the custom key and value of the recipient, because the key isn't a number, it's a type that the Lightning protocol reserves, or the value is missing. The payment would reach the node but not the wallet of the recipient, so don't send it.
:value/remote-unresolvedwarningThe value block of the remote item of a time split couldn't be fetched, so only the fees of that split are paid until a later fetch finds it. The Podcast Index or the remote feed didn't answer, refused the request or answered with an error, or there were neither credentials for the index nor a feed URL to ask.
:nostr/signer-refusedwarningThe signer didn't sign, e.g. because the listener said no, and :reason is what it said.
:nostr/signer-approvalinfoThe remote signer asks the listener to approve the request on the web page at :url first. Open the page, and ask again once the listener approved.
:nostr/signer-silentwarningThe remote signer didn't answer in time. The request went out, so the signer can still sign it.
:nostr/signer-unreachablewarningNo relay of the connection took the request, so it reached no signer, and :relays says why.
:nostr/signer-unreadableerrorThe answer of the signer can't be read, or the signer signed another event than the one it was asked to, and :reason says which.
:nostr/request-too-largewarningThe request to the remote signer has more bytes than an encrypted payload of NIP-44 holds, so it wasn't sent.
:nostr/not-publishedwarningNo relay took the event, and :relays says why.
:value/no-recipientserrorThe value block names no recipient, so outside its time splits a payment goes to nobody.
:value/fees-overerrorThe fees of the recipients add up to more than 100 percent, so they take the whole of each payment, and the last of them less than it asks.
:value/no-shareserrorNo recipient but those of the fees has a split, so after the fees a payment goes nowhere.
:value/same-recipientwarningTwo recipients have the same address and custom record, so one wallet gets both shares, which is likely a mistake.
:value/recipient-addresserrorThe address of the recipient doesn't have the form of its :type: the public key of a node, hexadecimal text of 33 bytes that starts with 02 or 03, or a Lightning address of the form user@domain on the public internet. No payment can reach it.
:value/empty-time-spliterrorThe time split names neither a remote item nor a recipient, so during it a payment goes to the fees alone.
:value/mixed-time-splitwarningThe time split names a remote item and recipients too, which the podcast namespace doesn't allow, and an app pays the remote item.
:value/time-splits-overlapwarningThe time split starts before the one before it ends, so an app pays the recipients of the earlier one until it ends.
:value/no-methodwarningThe app gave no way to pay a recipient of this :type, so it wasn't paid.
:value/not-an-addresswarningThe text isn't a Lightning address of the form user@domain.
:value/unreachablewarningThe request failed, because the server didn't answer.
:value/lnurl-errorwarningThe service of the Lightning address answered with an error, and said why.
:value/malformedwarningThe service of the Lightning address answered with something that LNURL-pay doesn't define.
:value/amount-out-of-rangewarningThe Lightning address doesn't accept this amount.
:value/wrong-amounterrorThe invoice asks for a different amount than the one requested, so don't pay it.
:value/unknown-success-actionerrorThe answer has a success action that LUD-09 doesn't define, or a URL on another host, so don't pay the invoice.
:value/unverifiableinfoThe service of the Lightning address gave no URL to ask whether the invoice is paid, which LUD-21 defines.
:value/unprovenerrorThe service of the Lightning address says that the invoice is paid, but gives no preimage that proves it.
:value/no-keysendinfoThe domain of the Lightning address names no node for keysend, so pay it with LNURL-pay.
:value/insecureerrorThe answer came over plain http, where anyone on the way can change it, so don't pay with it.
:value/no-wallet-infoinfoNo relay of the connection has the info event of the wallet, so it isn't known which commands the wallet accepts. The wallet says so when it gets a command that it doesn't accept.
:value/wallet-unsupportedwarningThe wallet doesn't accept the command: its :methods don't name the :method of the command, or its :encryption lacks NIP-44 version 2, which is what podcast-clj writes. No request was sent.
:value/command-too-largewarningThe command is larger than the 65,535 bytes that a request to a wallet can hold. The record of a payment includes the titles of the show and the episode, and the message of the listener. No request was sent.
:value/wallet-unreachablewarningNo relay of the connection took the request: each gave no connection, refused the subscription or refused the event, and :relays says why. The request reached no wallet, so it's safe to try again.
:value/wallet-silenterrorThe wallet didn't answer in time. The request went out, so the wallet can still carry out the command until :expires-at. Don't send the payment again before then, and afterwards ask the wallet whether it paid.
:value/wallet-refusedwarningThe wallet answered with an error and didn't carry out the command. The :code is the code of NIP-47, such as INSUFFICIENT_BALANCE, QUOTA_EXCEEDED or PAYMENT_FAILED, and :reason is the text of the wallet. A WebLN provider gives a text and no code, also when the user said no.
:value/wallet-unreadableerrorThe answer can't be read, and :reason says why: it isn't the signed event of the wallet, it isn't encrypted for this connection, or it answers another request. The wallet may have carried out the command, so ask it before paying again.
:value/no-providerinfoThe page has no WebLN provider, which a browser extension or a wallet app gives it.
:value/below-one-satwarningWebLN counts a keysend payment in whole sats, and this payment is below 1 sat, so nothing was sent.
:value/not-a-nodewarningThe recipient isn't a node with a public key, or the payment has no amount, so keysend can't pay it and nothing was sent. Pay a Lightning address with an invoice.
:analytics/unreadable-patternwarningA pattern in the list of user agents doesn't compile on this platform, so its entry was left out.
:analytics/unreadable-linewarningA line of a server log doesn't read as a request in the format of the log, so it counts as no download.
:analytics/unreachablewarningOP3 gave no page of downloads: the request failed, or OP3 answered with an error. The result has the downloads of the pages before it, and its continuation token names that page.
:id3/truncatedwarningThe bytes end before the tag does, so only the frames that fit were read.
:id3/frame-sizeinfoA frame gave its size in the other version's form, a plain number in ID3v2.4 or a syncsafe one in ID3v2.3, so it was read that way.
:id3/text-encodinginfoA frame names a text encoding that ID3 doesn't define, so its text was read as ISO-8859-1.
:id3/utf8-latin1infoA frame declared its text as ISO-8859-1, but the bytes are UTF-8, so the text was read as UTF-8.
:id3/utf16-bominfoA frame declared its text as UTF-16 without a byte order mark, so the byte order was worked out from where the zero bytes are.
:id3/image-typeinfoA picture gave its MIME type loosely, such as JPG or image/jpg, or gave none, so the type was taken from the bytes of the image.
:id3/chapter-endinfoA chapter ends at or before its start, so its end was left out.
:id3/second-taginfoA second tag follows the first, as when a writer adds a tag in front of an existing one, and both tags were read.
:id3/skipped-frameinfoA frame is compressed or encrypted, and wasn't read.
:id3/malformedwarningA frame couldn't be parsed and was left out. When its header couldn't be parsed, the frames after it were left out too.
:id3/padding-junkinfoThe padding after the frames holds bytes that aren't zeros, because a writer didn't clear it or a frame gave a wrong size.
:id3/too-many-frameswarningThe tag holds more frames than the :max-frames option allows, counting those inside chapters, so the frames after the limit were left out.
:id3/too-many-stringswarningThe text frames of the tag hold more strings than the :max-strings option allows, so from the limit on, each text frame kept only its first string.
:id3/too-many-tagswarningMore tags follow each other than the :max-tags option allows, so the tags after the limit were left out.
:sync/backend-failedwarningA backend failed in a pull or a push, so the step went on without it, and it keeps its cursor. The :backend names it, and the :reason says why.
:sync/unreadable-documentwarningA document in the store didn't read as a sync document, and was left out until its device writes one that reads.
:sync/other-kindwarningA document holds another kind of state than the one this device syncs, e.g. that of another app pointed at the same folder, and was left out.
:sync/newer-formatwarningA document was written in a newer version of the state's format than this device reads, and was left out.
:sync/malformed-stateerrorThe state of this device holds a value that the other devices can't merge, e.g. from an assoc, so the step wrote nothing. The :error says where.
:sync/clock-skewwarningA device wrote its document more than a minute ahead of the clock of this device. When every other device is named, the clock of this device is probably behind.
:sync/shared-devicewarningThe document of this device changed without this device writing it, so two installations, or two tabs of one page, use the same device id.
:sync/retired-devicewarningThis device was retired from another device, so nothing was written for it. Its changes no longer reach the other devices, so give the state a new device id to sync again.
:sync/conflictwarningThe shared document changed during every attempt to write it, so the step ended without writing.
:sync/overlapping-stepinfoA step began while another step of this device was still running, in this process or another tab of the page, so it did nothing, since two steps at once can write an older state after a newer one.

Can you improve this documentation?Edit on GitHub

cljdoc builds & hosts documentation for Clojure/Script libraries

Keyboard shortcuts
Ctrl+kJump to recent docs
←Move to previous article
→Move to next article
Ctrl+/Jump to the search field
× close