loudbanner

LOUD Feed Format v0.0.2

Proposal for a podcasting-first feed syndication protocol

File Extensions

LOUD feeds are published in .loud or .lff files. LFF stands for LOUD Feed Format. The default file extension is .loud.

File Format

LOUD feeds are UTF8 and made of JSON.

Enhanced Discovery

Feeds can contain one or more shows for the purposes of show discovery within a podcast network. Podcast networks often have different “shows” or concepts under the same network or publisher, but no good way to foster ‘connectivity’ between each different show concept. Users have to be told to find and subscribe to the new show, when it could be simply added to their existing subscription, giving you a complete built-in audience with nobody left behind.

Chaptered Episodes

Timestamped chapters with names and descriptions for each segment facilitate labeling the timeline with linked portions of the content.

Multiple Format Audio

Each episode can have multiple listed audio files for different qualities and file formats.

Credit Everyone

Credits for staff, producers, creators and editors have a dedicated field for acknowledging their contributions

References Citations

Sources, citations, and links to further reading are included in the episode object for providing relevant information to the listener

FAQ

Why not use RSS?

The internet is a big place with room for many ideas. RSS and Atom are great general syndication formats, but lack features that matter to podcasts specifically like chapters, proper credits and citations, and multiple format audio. The RSS specification states that it is no longer in development and should be considered to be in a frozen state, and it is suggested to build a new format with a different name if change is desired. https://cyber.harvard.edu/rss/rss.html#roadmap

Why not improve an existing protocol?

RSS and Atom are great formats that provide more value every day to blog articles and news feeds than podcasts. Podcasts are a rapidly growing medium that require a more purposeful solution. Ratifying well-established protocols are an exercise in patience and moderation. Some of these ideas will be radical in nature, and it is this project’s goal to thrive in a cooperational and non-confrontational manner with other projects and existing standards.

Why multiple shows in the same feed?

The process of discovery is often limited by the capabilities of the podcast directory. Putting multiple shows into a parent-network format allows users to be introduced to new shows via the same feed, with one subscription and a single polling for new episodes.

Is LOUD an IETF standard?

No, but that would be nice.

How can I help?

Port .loud format feeds to your favorite podcast client! Publish your feeds in LOUD Feed Format along side your RSS or Atom feed! The spec is simple, and easy to implement.

License

The MIT License (MIT)
Copyright © 2021 The TurtleCoin Developers

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Example

JSON

{ "Protocol": "LOUD", "Version": 1, "NetworkName": "The LOUD Podcast Network", "NetworkDescription": "A network of LOUD syndicated podcasts", "WebsiteURL": { "URL": "https://readme.loud.so", "Description": "The LOUD feed spec documentation link" }, "FeedURL": { "URL": "https://raw.githubusercontent.com/turtlecoin/podcast.turtlecoin.com/master/public/feed.loud", "Description": "The LOUD Network feed" }, "DateCreated": "2021-06-04", "BannerURL": { "URL": "https://user-images.githubusercontent.com/34389545/120880895-cc64fe80-c592-11eb-963f-068474c916da.jpg", "Description": "Banner graphic for The LOUD Network" }, "AvatarURL": { "URL": "https://avatars.githubusercontent.com/u/85380723", "Description": "Avatar graphic for The LOUD Network" }, "FavIcoURL": { "URL": "https://user-images.githubusercontent.com/34389545/121786753-9671dc80-cb87-11eb-8e76-aef2804e5b21.png", "Description": "Favicon for The LOUD Network" }, "Tags": [ "LOUD", "Feed", "Syndication" ], "FeedCredit": [ { "Name": "RockSteadyTC", "Role": "Creator", "Links": [ { "URL": "https://github.com/rocksteadytc", "Description": "RockSteadyTC's profile page" } ] }, { "Name": "IBurnMyCD", "Role": "Creator, Editor", "Links": [ { "URL": "https://github.com/brandonlehmann", "Description": "IBurnMyCD's profile page" } ] } ], "Shows": [ { "ShowName": "The TurtleCoin Podcast", "ShowDescription": "Discussing cryptocurrency, decentralization, privacy and best of all, TurtleCoin!", "WebsiteURL": { "URL": "https://turtlecoin.com", "Description": "The TurtleCoin website link" }, "DateCreated": "2021-06-01", "BannerURL": { "URL": "https://i.imgur.com/E678Fbp.jpg", "Description": "Banner graphic for The TurtleCoin Podcast" }, "AvatarURL": { "URL": "https://avatars.githubusercontent.com/u/34389551", "Description": "Avatar graphic for The TurtleCoin Podcast" }, "FavIcoURL": { "URL": "https://avatars.githubusercontent.com/u/34389551?s=64\u0026v=4", "Description": "Favicon for The TurtleCoin Podcast" }, "Tags": [ "TurtleCoin", "Cryptocurrency", "Privacy" ], "ShowCredit": [ { "Name": "RockSteadyTC", "Role": "Creator", "Links": [ { "URL": "https://github.com/rocksteadytc", "Description": "RockSteadyTC's profile page" } ] }, { "Name": "IBurnMyCD", "Role": "Creator, Editor", "Links": [ { "URL": "https://github.com/brandonlehmann", "Description": "IBurnMyCD's profile page" } ] } ], "Episodes": [ { "SeriesNumber": 0, "EpisodeName": "How did you hear about TurtleCoin", "EpisodeDescription": "This was our first episode of the podcast, we didn't intend for it to be a podcast, but we had so much fun making it we decided to make podcasting one of the things we do. This one has some rough audio, but if you can stomache it, it's a good show.", "WebsiteURL": { "URL": "https://www.youtube.com/watch?v=0n9bjuEETlM", "Description": "Link to this episode's video" }, "ImageURL": { "URL": "hhttps://avatars.githubusercontent.com/u/34389551", "Description": "Episode art image thumbnail" }, "AudioURL": [ { "URL": "https://gateway.pinata.cloud/ipfs/QmXsz4VSG3a9TdDtMXRd9qpxaFpPBkHzcq1aM1TQZtypF9", "Description": "High quality audio file, mp3" } ], "DateCreated": "2021-05-16", "DateUpdated": "2021-05-16", "DurationSeconds": 5980, "CitedURL": [ { "URL": "https://youtube.com/turtlecoin", "Description": "This is our YouTube channel, subscribe for more podcasts!" } ], "TranscriptionURL": [], "EpisodeCredit": [ { "Name": "RockSteadyTC", "Role": "Creator", "Links": [ { "URL": "https://github.com/rocksteadytc", "Description": "RockSteadyTC's profile page" } ] }, { "Name": "IBurnMyCD", "Role": "Creator, Editor", "Links": [ { "URL": "https://github.com/brandonlehmann", "Description": "IBurnMyCD's profile page" } ] } ], "Chapters": [ { "StartTimeSeconds": 0, "ChapterName": "Intro", "ChapterDescription": "Finding our feet live on stream", "ChapterCredit": null }, { "StartTimeSeconds": 270, "ChapterName": "Metaprinter", "ChapterDescription": "Metaprinters entrance into mining and turtlecoin", "ChapterCredit": null }, { "StartTimeSeconds": 580, "ChapterName": "User stories", "ChapterDescription": "Users describe how they entered the TurtleCoin community", "ChapterCredit": null }, { "StartTimeSeconds": 1650, "ChapterName": "Sektion F", "ChapterDescription": "Or is it Sektion 8? :)", "ChapterCredit": null }, { "StartTimeSeconds": 2790, "ChapterName": "Blue whale", "ChapterDescription": "The blue whales club and the early illuminati origins of TurtleCoin", "ChapterCredit": null }, { "StartTimeSeconds": 3300, "ChapterName": "Raspberry pi mining", "ChapterDescription": "Humble beginnings in mining TurtleCoin", "ChapterCredit": null }, { "StartTimeSeconds": 3850, "ChapterName": "More shilling", "ChapterDescription": "The same gambling site keeps coming up", "ChapterCredit": null }, { "StartTimeSeconds": 3917, "ChapterName": "Forknote", "ChapterDescription": "The humble beginnings of TurtleCoin as a forknote project.", "ChapterCredit": null }, { "StartTimeSeconds": 5727, "ChapterName": "The Truth", "ChapterDescription": "The best story of them all", "ChapterCredit": null } ] }, { "SeriesNumber": 1, "EpisodeName": "Decimals and Dusty Shells", "EpisodeDescription": "A question we get a lot pertains to the 2 digits after the decimal point, and even more now since in v2 we have a supply reduction of 100,000:1. In this episode we address that question and more!", "WebsiteURL": { "URL": "https://www.youtube.com/watch?v=fRRg_vmfchI", "Description": "Link to this episode's video" }, "ImageURL": { "URL": "hhttps://avatars.githubusercontent.com/u/34389551", "Description": "Episode art image thumbnail" }, "AudioURL": [ { "URL": "https://gateway.pinata.cloud/ipfs/QmY1iVSWep8h4ZPyKWihZj2cuneccpT9utANC7zao4ujtZ", "Description": "High quality audio file, mp3" } ], "DateCreated": "2021-05-17", "DateUpdated": "2021-05-17", "DurationSeconds": 6142, "CitedURL": [ { "URL": "https://youtube.com/turtlecoin", "Description": "This is our YouTube channel, subscribe for more podcasts!" } ], "TranscriptionURL": [], "EpisodeCredit": [ { "Name": "RockSteadyTC", "Role": "Creator", "Links": [ { "URL": "https://github.com/rocksteadytc", "Description": "RockSteadyTC's profile page" } ] }, { "Name": "IBurnMyCD", "Role": "Creator, Editor", "Links": [ { "URL": "https://github.com/brandonlehmann", "Description": "IBurnMyCD's profile page" } ] } ], "Chapters": [ { "StartTimeSeconds": 0, "ChapterName": "Intro", "ChapterDescription": "nobody responded when we asked who had questions about TurtleCoin", "ChapterCredit": null }, { "StartTimeSeconds": 105, "ChapterName": "decimals", "ChapterDescription": "the two decimal points thing ", "ChapterCredit": null }, { "StartTimeSeconds": 325, "ChapterName": "dust", "ChapterDescription": "reducing dust through reduction in supply ", "ChapterCredit": null }, { "StartTimeSeconds": 422, "ChapterName": "elders", "ChapterDescription": "technical difficulties on the keyboard of ibmcd ", "ChapterCredit": null }, { "StartTimeSeconds": 463, "ChapterName": "v1", "ChapterDescription": "the cost of a realistic TRTL v1 transaction", "ChapterCredit": null }, { "StartTimeSeconds": 690, "ChapterName": "microtrashin'", "ChapterDescription": "the infeasibility of microtransactions becomes apparent", "ChapterCredit": null }, { "StartTimeSeconds": 750, "ChapterName": "technical break", "ChapterDescription": "this music got us a copyright claim by UMG ", "ChapterCredit": null }, { "StartTimeSeconds": 788, "ChapterName": "we're back", "ChapterDescription": "welcome back craig ", "ChapterCredit": null }, { "StartTimeSeconds": 805, "ChapterName": "reduction", "ChapterDescription": "100,000:1 swap rate", "ChapterCredit": null }, { "StartTimeSeconds": 939, "ChapterName": "Canti", "ChapterDescription": "cantipixels and the pixel era", "ChapterCredit": null }, { "StartTimeSeconds": 1380, "ChapterName": "Mining", "ChapterDescription": "the downfall of herominers", "ChapterCredit": null }, { "StartTimeSeconds": 1570, "ChapterName": "ASIC", "ChapterDescription": "mining fairness, the fight against ASIC ", "ChapterCredit": null }, { "StartTimeSeconds": 1985, "ChapterName": "Old Days", "ChapterDescription": "the hard beginnings of the TRTL software", "ChapterCredit": null }, { "StartTimeSeconds": 2452, "ChapterName": "FAQ", "ChapterDescription": "the v2 FAQ - but pronounced FACK apparently ", "ChapterCredit": null }, { "StartTimeSeconds": 2500, "ChapterName": "Jerks", "ChapterDescription": "speculators abound", "ChapterCredit": null }, { "StartTimeSeconds": 2640, "ChapterName": "commerce", "ChapterDescription": "what is turtleshop", "ChapterCredit": null }, { "StartTimeSeconds": 2880, "ChapterName": "Boats", "ChapterDescription": "Cisions boat that was purchased for 1 billion TurtleCoin", "ChapterCredit": null }, { "StartTimeSeconds": 3121, "ChapterName": "Ideas", "ChapterDescription": "OnlyTurtles", "ChapterCredit": null }, { "StartTimeSeconds": 3300, "ChapterName": "shitcoins", "ChapterDescription": "the rise of shitcoiners", "ChapterCredit": null }, { "StartTimeSeconds": 3450, "ChapterName": "derogold", "ChapterDescription": "forks and fast blocks ", "ChapterCredit": null }, { "StartTimeSeconds": 4020, "ChapterName": "shitcoins, pt 2", "ChapterDescription": "how to identify a shitcoiner", "ChapterCredit": null }, { "StartTimeSeconds": 4605, "ChapterName": "arcturus", "ChapterDescription": "the issue with privacy", "ChapterCredit": null }, { "StartTimeSeconds": 5380, "ChapterName": "V3", "ChapterDescription": "whats in store for v3?", "ChapterCredit": null }, { "StartTimeSeconds": 5640, "ChapterName": "Quantum", "ChapterDescription": "the rise of quantum computers vs crypto", "ChapterCredit": null }, { "StartTimeSeconds": 5970, "ChapterName": "Fin", "ChapterDescription": "wrapping it up ", "ChapterCredit": null } ] } ] } ] }

Type Objects

Objects are described as Go structs for the purposes of this document.

Feed

type Feed struct {
	Protocol           string
	Version            int
	NetworkName        string
	NetworkDescription string
	WebsiteURL         WebURL
	FeedURL            WebURL
	DateCreated        string
	BannerURL          WebURL
	AvatarURL          WebURL
	FavIcoURL          WebURL
	Tags               []string
	FeedCredit         []Credit
	Shows              []Show
}

Show

type Show struct {
	ShowName        string
	ShowDescription string
	WebsiteURL      WebURL
	DateCreated     string
	BannerURL       WebURL
	AvatarURL       WebURL
	FavIcoURL       WebURL
	Tags            []string
	ShowCredit      []Credit
	Episodes        []Episode
}

Episode

type Episode struct {
	SeriesNumber       int
	EpisodeName        string
	EpisodeDescription string
	WebsiteURL         WebURL
	ImageURL           WebURL
	AudioURL           []WebURL
	DateCreated        string
	DateUpdated        string
	DurationSeconds    int
	CitedURL           []WebURL
	TranscriptionURL   []WebURL
	EpisodeCredit      []Credit
	Chapters           []Chapter
}

Chapter

type Chapter struct {
	StartTimeSeconds   int
	ChapterName        string
	ChapterDescription string
	ChapterCredit      []Credit
}

Credit

type Credit struct {
	Name  string
	Role  string
	Links []WebURL
}

WebURL

type WebURL struct {
	URL         string
	Description string
}

Type Object Definitions

Feed Object

type Feed struct {
	Protocol           string
	Version            int
	NetworkName        string
	NetworkDescription string
	WebsiteURL         WebURL
	FeedURL            WebURL
	DateCreated        string
	BannerURL          WebURL
	AvatarURL          WebURL
	FavIcoURL          WebURL
	Tags               []string
	FeedCredit         []Credit
	Shows              []Show
}

Feed Object Description

Feed is the root object. It encapsulates the other types.

Protocol

string required

The protocol identifier string informs any parsers that the following data conforms to the LOUD Syndication Protocol

Version

int required

The version identifier corresponds to protocol version revisions. Each new build increments the version.

NetworkName

string required

The name of the network

NetworkDescription

string

The network’s description

WebsiteURL

WebURL

WebURL hyperlink to this show’s webpage

FeedURL

WebURL required

WebURL hyperlink to this network’s .loud file

DateCreated

string

ISO 8601 Date when the show was created

BannerURL

WebURL

Horizontal header banner, recommended 2:1 aspect ratio

AvatarURL

WebURL

Square network avatar, recommended 1:1 aspect ratio

FavIcoURL

WebURL

Favicon, recommended 1:1 aspect ratio

FeedCredit

[]Credit

Credits for participants of this Feed

Show

[]Show required

Show is the last item in the Feed object. Feed can have multiple Shows

Show Object

type Show struct {
	ShowName        string
	ShowDescription string
	WebsiteURL      WebURL
	DateCreated     string
	BannerURL       WebURL
	AvatarURL       WebURL
	FavIcoURL       WebURL
	Tags            []string
	ShowCredit      []Credit
	Episodes        []Episode
}

Show Object Description

Shows contain episodes and associated metadata.

ShowName

string required

The name of the show

ShowDescription

string

The show’s description

WebsiteURL

WebURL

WebURL hyperlink to this show’s webpage

DateCreated

string

ISO 8601 Date when the show was created

BannerURL

WebURL

Horizontal header banner, recommended 4000x2000px minimum size, 2:1 aspect ratio

AvatarURL

WebURL

Square show avatar, recommended 2000x2000px minimum size, 1:1 aspect ratio

FavIcoURL

WebURL

Favicon, recommended 512x512px minimum size, 1:1 aspect ratio

CreatorName

[]string required

List of show creators, staff, credited help

Tags

[]string

List of associated keywords, related to this show

ShowCredit

[]Credit

Credits for participants of this Show

Episodes

[]Episode required

List of episode objects, in series order

Episode Object

type Episode struct {
	SeriesNumber       int
	EpisodeName        string
	EpisodeDescription string
	WebsiteURL         WebURL
	ImageURL           WebURL
	AudioURL           []WebURL
	DateCreated        string
	DateUpdated        string
	DurationSeconds    int
	CitedURL           []WebURL
	TranscriptionURL   []WebURL
	EpisodeCredit      []Credit
	Chapters           []Chapter
}

Episode Object Description

Episodes contain chapters and metadata

SeriesNumber

int required

This number corresponds to the chronological position of this episode in the show’s timeline.

EpisodeName

string required

Name of the episode

EpisodeDescription

string

Description of the episode

WebsiteURL

WebURL

WebURL pointing to the webpage for this episode

ImageURL

WebURL

Episode image, 4000x2000px recommended, 2:1 aspect ratio

AudioURL

[]WebURL required

List of audio WebURLs, in order of quality or filesize, from first to last with the biggest or highest quality at the top

DateCreated

string

ISO 8601 Date when the show was created

DateUpdated

string

ISO 8601 Date when the show was last updated

DurationSeconds

int

Number of seconds long total for the episode

EpisodeHost

[]string

List of episode hosts

EpisodeGuest

[]string

List of episode guests

CitedURL

[]WebURL

List of WebURLs for citations or references in this episode

TranscriptionURL

[]WebURL

List of transcription WebURLs, with the primary translation / transcription first

EpisodeCredit

[]Credit

Credits for Episode participants

Chapters

[]Chapter

List of episode chapters

Chapter Object

type Chapter struct {
	StartTimeSeconds   int
	ChapterName        string
	ChapterDescription string
	ChapterCredit      []Credit
}

Chapter Object Description

Chapters are subsections of a show, broken down by topic or segment

StartTimeSeconds

int required in chapters

Start time for this chapter, measured in seconds. If the first chapter listed has a StartTime of greater than 0, the previous chapter will be labeled with a chapter name of ‘intro’

ChapterName

string required in chapters

Name of this chapter

ChapterDescription

string

Description of this chapter

ChapterCredit

[]Credit

Credits for Chapter participants

Credit Object

type Credit struct {
	Name  string
	Role  string
	Links []WebURL
}

Credit Object Description

Credits are a way to credit a person with proper attribution

Name

string required

The name of this content creator

Role

string

The role of this content creator within context of this Credit

[]WebURL

A list of contact WebURLs whether they be mailto links or links to social media profiles or personal projects

WebURL Object

type WebURL struct {
	URL         string
	Description string
}

WebURL Object Description

WebURLs are hyperlinks with a description.

URL

string required

A hyperlink

Description

string

Short description of the content linked to by the URL.