The Changelog: Software Development, Open Source - A guided tour through ID3 esoterica (Interview)
Episode Date: September 30, 2022This week we turn the mics on ourselves, kind of. Lars Wikman joins the show to give us a guided tour through ID3 esoterica and the shiny new open source Elixir library he developed for us. We talk ab...out what ID3 is, its many versions, what it aims to be and what it could have been, how our library project got started, all the unique features and failed dreams of the ID3v2 spec, how ID3v2 and Podcasting 2.0 are solving the problem differently, and how all of this maps back to us giving you (our listeners) a better experience while listening to our shows.
Transcript
Discussion (0)
This week on The Change Law, we turn the mic on ourselves, kind of.
Lash Vickman joined the show today to give us a guided tour through ID3, Esoterica, and the it aims to be and what it could have been, how our library project got started, all the unique features and field dreams of the ID3v2 spec, how ID3v2 and Podcast 2.0 are solving the problem differently, and how all this maps back to us giving you, our listener, a better experience while listening to our shows.
A big thanks to our friends and our partners at Fastly and Fly.
Bandwidth for ChangeLog is provided by Fastly.
Learn more at Fastly.com.
And our friends at Fly let you run your app and your database closer to users all over the world.
The best part, no ops required.
Check them out at Fly.io. This episode is brought to you by Influx Data,
the makers of the time-series data platform, InfluxDB.
Influx Data believes in putting the developer first.
That's why they built their time-series platform with tools
so you don't have to make wholesale changes to your product or your application
just to use InfluxDB.
You can code in your language of choice using your preferred tools
and wherever you're building applications in the cloud, on-premise, or locally.
So if you build IoT, analytics, or cloud applications,
you might want to check out InfluxDB.
It has a powerful API and tool set, a high-performance time series engine,
and a community of developers in both cloud and open source.
InfluxDB delivers visibility with real-time analytics so you can quickly act on your data,
identify patterns, predict future outcomes, and turn insights into action.
Check it out and start free at influxdata.com slash changelog.
Again, influxdata.com slash changelog. log. Let's come closer to center.
We're podcasters.
We do audio pretty much for a living.
Why not talk about the thing that sort of powers the metadata of, not sort of, but totally does power the metadata of the MP3 that we famously ship around the world for people to listen to, the ID3 tag.
So Lars is here.
Lars, hey,
good to see you. Good to have you back on one of our shows. You've been on Ship It recently,
now on the changelog talking about this dive into ID3, V2, and V3, and V1, and VX, I guess,
with your, what is it, a plugin? Is it, what is what you created called so for your needs to ship chapters i built out a library for decoding and encoding id3 tags and we focused on the 2.3 spec i can enumerate the specs that you
could possibly deal with it's id3 also known as id3 v1 okay the first version before they had a versioning scheme
then you have id3 v 2.2 i haven't seen 2.0 or 2.1 so i don't know if they ever shipped
maybe in quick iterations maybe while they're drafting then there's 2.3 and 2.4 being the most recent one and i get the sense that it didn't get the
full-on adoption of 2.3 so 2.3 seems like the gold standard right now that's the one that we're using
yeah 2.3 it's kind of like star wars remember star wars episode 4 a new hope you know when
george lucas first released Star Wars Episode 4,
it was just called Star Wars.
Well, they didn't call it ID1.
That's right.
ID3, V1.
So was there an ID2?
Was there an ID1?
These things we'll never know.
We'll never know the answer to these things.
It was always challenging for them to start, I guess,
four episodes into a six episode
non-trilogy sixology i don't know what would you call it septology that would be seven septology
right seven except it ended up being three trilogies but i'm not sure what you'd call
that either nintology that's what i'd call it it's kind of like scientology only different
let's not all do that but hey id3 is guess, interesting, non-interesting thing that has very unique takes.
You wrote a blog post titled, What ID3 V2 Could Have Been.
Very good deep dive.
We tasked you with writing this library so that we can finally have chapters.
Which, Jared, you got a blog post pending.
I don't know if it's going to go out before with this episode we don't know but check the show notes
there there might be a link there worst case follow it should be out by the time this goes out
unless something goes terribly wrong so we tasked lars larch with since i'm having to say his name
correctly since i'm american we get lazy we say l Lars instead of Lars. But ID3v2, what could have been.
But before this task, you had not looked into this spec.
Had you messed with audio at all, really?
I mean, I know you've done some stuff behind the scenes
with Sonic Pi and stuff like that.
But at this level, messing with a file, writing its metadata,
had you looked into ID3 at all ever before this task?
So I was familiar with the format,
because growing up in the 90s and 2000s, it's like, oh,
this MP3 file doesn't show the right artist and title.
So I try to go into properties in Winamp or whatever and yes like this id3 okay
but i can set artist and the title and if i set those they will be shown instead of whatever's
in the file name that was sort of where i started with id3 and after a while, Winamp started to support more fields and two different tabs.
That was ID3 v2.
Yeah, it got complicated.
And that was probably the extent of my use of it.
I didn't really spend any time with the binaries of it
up until this point, really.
I had a similar past then too with Winamp
and then also iTunes.
I'd done a lot of
futzing with back in the day when you used to have itunes and actually have mp3s or potentially
actual wav files that you've i would rip my own cds to digital so i can listen to them anywhere
this is when you had your own cds basically that you would swap out like a like a i don't know
what i'd call myself then but like this manual process who wants
to do that right to have this digital phone take it anywhere with you to be clear ripping our own
cds that we purchased legally is the only way that any of us ever acquired any sort of audio files
true yes back in the 90s yes because there was not a widely spread practice of carrying computers
to other people's houses and downloading their sort of wandering MP3 collection
that for some reason had disproportionate amounts
of Enya in it.
Everybody loves Enya.
You gotta love Enya.
Here's what was interesting about that was for me,
and I had the exact same introduction to ID3 tags
through wanting a more pristine music library.
Yeah.
But having gathered said library from the four winds.
Friends.
Friends.
Yeah, wherever that you get them.
And if there was any sort of discrepancy, for instance, in the album title between two
MP3s that are on the same album, would list duplicate in my player whether it was win
amp or even itunes in the same way but there was a satisfying moment when you took those duplicates
and you reconciled to a single album title without whatever punctuation or white space at the end or
you got rid of that weird unicode character that wouldn't render properly anyways, that they would
collapse down and be considered
part of their own album instead of being two
separate albums. So that
very much tickles the nerd in my
body.
Weird sentence. And my
completionist body as well
just like, I gotta do this for all my
MP3s. So I spent lots
of time inside those editors.
Yes.
Just tweaking 93 tags and just trying to get them all to be awesome.
I am not a completionist nor a perfectionist.
Well, you're not a completionist.
Adam?
Very much so.
Yeah, very much.
I guess the ones that drove me most nuts was when it was a compilation.
Yeah.
Like it was multiple artists, so you couldn't group by artists.
You had to go by album.
And then even you want to listen to, it was just a mess.
So I would always be tweaking albums, artists, songs.
It's just a never ending battle.
And I guess that's the beauty of the cloud, really.
The music in the cloud is it kind of does it for you and you never have to do it again
because I haven't done it since pretty much right but but it also takes away the possibility of having a
correct music collection because spotify will not give you the correct thing it's like oh this is a
great playlist i used to play and now that i play it they have a weird live cover of this entire band
instead of the original songs because they lost them
oh spotify doesn't have this track anymore they'll just substitute something a small
tangent on that note like how interesting is it that we could be having a conversation here
we can remember a song from back in our heritage our young years or whatever 20 years ago and for the most part we can probably
pull up spotify or some version of spotify out there to like itunes music etc and can probably
play that song in a matter of seconds like you would have to go out and own that music which
isn't like bad or good for the artist but like you'd have to have owned the thing maybe have
to go traverse and find the disc put it into the disc player you don't own anymore using old you
know rca cables plug to a stick like now it's all digital it's hdmi it's you know optical digital
etc to you know plug these components in together like we have in a moment's notice we can
play you know offspring from back in the day right now that's hilarious because that's the exact band
i thought of when you said that i was like you could play an offspring track and you just went
to the exact same place offspring was my first cool album i had some uncool ones before but smash
that's a good album.
Oh, can we play this? Why not?
You've got to love self-esteem, right? I mean, in a moment's notice, we can play that.
Isn't that crazy?
Well, go back even further, and they had to wait for songs to come out of the radio.
And if you wanted to hear a certain song, you have to call in and ask them to play it for you.
And sit there all day listening to the radio.
With a tape deck ready.
Exactly.
And you'd have like a little bit of the previous song,
the DJ, some sort of bit, and then the song.
Wow.
Well, same thing.
Now looping back to Star Wars,
the same thing when I was a kid to see Star Wars,
like we had to wait for it to come on.
Or we had to have a friend who had a,
not even a DVD, they had a... Laser disc.
No, not laser disc.
What was the previous, not Betamax, VHS tape.
VHS tape, yeah.
Right, their parents were wise enough to tape it
when it came on that one time that year
and have a recording of it.
That particular family that you knew that year and have a recording of it. That particular family
that you knew that had two
VHS players.
It's all
piracy.
It's piracy all the way down.
Yes.
So times certainly have changed.
When we get back to changing things,
the spec change, if we talk about
ID3V1, which we all have nostalgic
90s memories of
there's an aspect of it which plays into this conversation
which is
it's a fixed width format
it's 128 bytes
and only so much is going to fit inside of those bytes
and inside of that
there's a specific number of bytes
allocated for each field
and so I think the album title could
only be like 30 characters or something now maybe depends on 30 bytes okay 30 bytes each yeah so 30
bytes 30 characters yeah exactly for title artist album and comment and that also means that a bunch
of characters were off limits because i think everything was latin one or iso 88 59 one right yeah no utf-8
back then for that particular thing so if your album title was too long like you just had to
decide where you were going to truncate it so you have a bunch of like just partial titles like the
the titles for a lot of our episodes adam wouldn't fit in 93 v1 you have to just truncate it how you
know maybe throw the ellipses in there
at the end total sadness total sadness so there's obvious limitations that being said pretty cool
how simple it is like large maybe you remember or you you know why it's at the end of the file
though it's like 128 bytes at the end of the mp3 file i'm pretty sure that was done to avoid tripping up the mpeg parsers i recall having
seen something about why it was there but i don't recall yeah okay wikipedia tells me some players
would play a small burst of static when they're ready to attack so yeah probably not have it at
the start so the first second of your song is like you and you're like, what? And then it starts.
It's not an ideal listening experience, that's for sure.
So that's kind of like a backwards compatibility thing.
Yeah, but more modern players will correctly skip it.
And that's good because ID3V2 moves it to the start of the file,
which makes it better when you're streaming the audio, for one thing,
which means you can read all the metadata and then start playing it and i
think that's what most sort of pocket mp3 players the that existed for a long while but no longer
no longer do they don't keep this whole song in memory i don't think they're very very dumb little
machines but they can probably read the id3 tag to show the title and keep that in memory.
But yeah, if we were only supporting ID3v1,
this would have been a two-day project, I think.
Maybe less.
I mean, tests and then documentation.
So one part of this,
so we hired Lars to do this work
and he did a great job over the summer of getting this done.
This is so that I wouldn't have to do a much slower, much worse job of trying to accomplish the same thing
and never actually get it done, which is historically what we had done with chapters.
And part of that was me being your customer.
You got to do all of the standard consultant-customer relations.
It's fun
for me to be the customer because i can ignore you for a long time and then suddenly be like
let's work on this and you're supposed to be nice to me anyways and be like yes sir let's work on
it right now when you want to because i'm the customer so we've had we can maybe we can talk
about that dynamic but part of this was like me well, our specific needs are important here. One of the tiny little things that I wanted it to do was,
when we mix down a WAV file into an MP3 file inside of Adobe Audition,
which is our workflow, Audition adds some lame ID3V1 stuff.
Then when you throw that through some sort of a parser,
such as a command line tool like the ID3V2 command line tool that we were using to test, it would display that stuff even after we've written
our own good ones.
And I was like, can it just also strip that?
And you're like, well, it's at the end of the file.
Does it really matter?
And I was like, no, not really.
And then the nerdy completionist in me was like, yeah, but I really do want it to be
out of there.
So I wrote this little function.
You can see it in our MP3 kit,
that just removes V1 tags.
And it's like seven lines of code, and it took me like 25 minutes.
And sure, I'm just removing that, I'm not writing that.
But it was like literally a 15-minute deal.
And so I think if that was the goal, I think A, we probably wouldn't have hired you.
But B, you probably would have accomplished it in the time it would take to eat lunch.
I mean, it's a pattern match.
It's one pattern match in Elixir.
Since it's a static length,
it's always 128 bytes.
So that's one line of Elixir.
Yeah, it really is nothing in Elixir.
Elixir is really well suited for this kind of work.
Maybe you can speak to that as well at some point.
Does an MP3 have to have one of these tags?
So if Adobe Audition takes a WAV file,
makes it down to an MP3,
and then puts this lean ID3v1 version in it,
does an MP3 have to have ID3 at all?
No.
The MP3 MPEG standard has no metadata system.
That's why ID3 was introduced by some enthusiasts.
So why?
I mean, we don't ask Adobe to put anything in there.
No, they just want to.
No, I think Adobe Audition writes two things.
So it probably does an ID3 version one that Jared removes,
but it also does an ID3 version two.
Correct.
With proper, like the more likely metadata but you can have
both so it probably adds both for for safety it does and then your your library overwrites theirs
on the v2 but would let the v1 via dangling 128 bytes yeah and the library can overwrite both the
2.2 and 2.4 because it's very easy to to parse the parts that are required
to sort of capture the tag and and strip it out but there's a bit more nuance when you start
parsing version 2.4 and it wasn't since you didn't need it it wasn't worth putting the time in right
welcome contribution though since it's open source it is open source you can go out and
you can install it in your mix file.
And it's out there on hex PM.
It's also out there on GitHub for the source code.
And so encourage people to use it.
And I think that's a very classy approach of y'all
to actually hire someone to do the job,
but turn it open source and take on maintenance.
Yeah.
Well, it's basically just replacing me with you
on the bootstrap, you know, like on the parts that you're good at and I would be less good at. And then just like treating it like it's basically just replacing me with you on the bootstrap you know like on the parts
that you're good at and i would be less good at and then just like treating it like it's our own
thing which is exactly what we would have done without you is like i would have built a library
release it open source and maintained it and so happy to just bring you along for the ride
get a better library than i could have written faster while i'm also working on other stuff
you know you get some business out of it. So that's good for you and your consulting firm.
And we all get the benefit. I mean, why not? Right.
I think it's a classy move.
Yeah. I try to keep it classy around here. Appreciate that.
But we all only mentioned sort of titles and albums and artists.
True. and albums and artists true and like id3 version one only had that and some genre and a comment of
30 bites i guess but id3 v2 added so much more and a bunch of the things are just very reasonable
things like oh the year it was released and published and who
the publisher was and who the composer and who the composer and the writer and the lyrics by
sort of things so just more metadata that you could add that were simple text fields but then
you start getting things like artwork you You can bring some artwork in there.
Pictures, URLs.
But as you go into implementing this stuff,
you find the fun and weird tags.
And that's sort of what prompted this blog post because it's some absolutely fabulous stuff in there.
Yes, there is fabulously interesting stuff in there.
And I wish we were like a fly on the wall of the meetings of the spec writers.
Because it seems like to me, as I read your post, I'm like, this seems like almost like maybe ID3V1 was just written maybe in a weekend by some enthusiasts.
And then like serious business people came along and was like, and I'm just completely making this up.
I don't know the history.
And then it's like, you know what we need
is everything in the kitchen sink.
And it's almost like all these different frames or tags,
these specific types of frames you can put in your tag,
they're like, each one seems like somebody's pet project.
Like star ratings, isn't that in there?
Well, if we want to talk ratings we should probably
first talk about the play counter okay because the ratings build on the concept of the play
counter and the play counters the play counter is actually the funniest one it tells more so that's
the pcnt frame so every every field in 93 version 2 is a frame and you can have an arbitrary number of them up to like 256 megabytes
of tag wow which will outstrip most audio files you've ever seen and say if you had like 192 kbps
song how long would that song have to be to be 256 megabytes like Like five, six hours maybe.
It'd be a chunk of a song.
It's a decent podcast.
It'd be like a Grateful Dead concert.
Sure.
Like a whole concert from the Grateful Dead.
I don't know, just guessing.
Yeah, but the play counter frame is a very, very short frame.
It has to identify that it's the play counter
and that it has a number.
And the idea was that the player you use
to play your file would increment
that with one when you've started playing the song changing the file forever changing the file
forever yeah so this is like uh this is like when you almost feel violated like this thing changed
me you know like like shouldn't a audio player be like read onlyonly on a file? I just feel like that's just classy.
It's talking about keeping it classy.
It's just weird, you're going to change the actual thing.
But it was also a different time.
Yeah, I was going to say, what's the time frame of the implementation of this?
Because this is probably back in the day when I was managing my own iTunes library
and it was mainly me listening to my MP3s.
And if you look at those types of libraries,
they would have like a SQLite
or other metadata database
where they kept their play counts.
I don't think iTunes wrote
the ID3 play count.
It might have, but I doubt it.
I doubt it, yeah.
But you've got to wonder where the spec was trying to go.
What it was trying to solve.
Somebody put this out, like you said,
maybe some programmers initially then business and kids how can we put
our composer in there and you know give everybody credits and how can we get credit for the what do
you call those the record label so to speak you know how can we get all our names in this file
so that we get marketing you know this may have been like the old not so much social network by
any means but like how do you distribute who you
are to the world and you embed it in these mp3s on the internet yeah and it's clear if you read
through the spec that they considered this metadata to be sort of a significant thing that
would communicate a ton of information and potentially carry data like this play counter
is a weird one because almost no one can see how that would be good i speculate in the blog post
that it might turn out to be sort of a cool hipster thing if this had caught on so that all
the mp3 files out there had play counts could you find that enya song
really close to the source could you find a an og like is it to play count then it's probably
close to the rip right and or just somebody that didn't like the song very much you know yeah yeah
yeah i listened to it once and bounced. I accidentally hit on a repeat. It definitely feels like a sort of silly frame,
but then we have one that is actually used
when reading songs.
I think Windows File Explorer Preview
can actually show the Popularimeter stars.
Is that how you say that?
I've been reading that, and I've been reading it.
The Popularimeter.
Popularimeter.
I don't know. Popularimeter is what I'm going for. I like the been reading it. The Popularimeter. Popularimeter. I don't know.
Popularimeter is what I'm going for.
I like the way you said it.
Popularimeter.
It allows storing an arbitrary number of,
up to the max frame size of 16 megabytes, probably,
email and rating pairs.
So this is personally identifiable information.
Oh, it's your email alongside with your rating.
I didn't realize it's all your email.
Wow.
So we can get a Jared rating.
We could get an Adam rating.
We could get a Lars rating.
And that's fantastic.
That's fantastic.
And it also bundles in a personal play counter.
So you can know, was this rating all BS?
Have they even played the song?
Oh, they never even actually played it.
I mean, you'd care more what someone who plays the song a hundred times
has to say about it, I think.
That's similar to the Amazon Reviews certified purchaser tag.
You know, like, well, this person reviewed it
and we can verify that they purchased it,
which is a nice little added information.
Here it's like this person rated it five stars
but they never actually listened to the song.
Of course there's nothing to stop Winamp
from showing a UI where you can just edit your play counts.
Right.
My favorite part about this whole thing
is it relies upon this concept I guess.
If this was going to finally make its
way back around to the record label or the artist it assumes that it had some sort of mechanism by
which they could collect all of these mp3 files right so i don't think this is signal back i don't
think this is feedback i can only imagine it being a sort of trading thing where files have passed
around yeah but you can just write
whatever you want into the, you can just download
Lars' open source Elixir library
and just change the values. Yeah, because there's nobody
saying you can't change the value.
You can go ahead and if you can edit the thing,
the metadata, you can. Well, if it makes it more collectible,
why wouldn't I just do that? Right. Well, I mean,
I can change your rating. You could have put a
five-star rating or whatever the,
is it zero through two five five? Oh yeah, zero to two five five. That's a your rating. You could have put a five-star rating or whatever the... Is it zero through 255?
Oh, yeah.
Zero to 255.
That's a good rating system, right?
That's a massive range.
If I rated it 100 out of 255,
is that good or bad?
I don't know.
This song is clearly a 143.
Right.
Well, I disagree.
It's more of a 144.
It's a wide range that's for sure don't
get brett kahn on that range he'll be upset i was gonna say we need somebody who could formalize
what each value means so that we can actually have an objective measure well you really got
to think about what the idea was though because if this could be edited by anybody right if in
the spec process and this is before the times of ubiquity of spotify and streaming music versus shared files
via unknown places to share files etc what was the idea you know like what they're trying to
solve for really i mean it seems to have no utility in retrospect so i imagine this is a
speculative feature 100 where they figured, if something like Winamp
implements this, because this was probably launched around the heyday of MP3 exchanging
in the more manual sense, then if Winamp displayed these things, or you could build a way of
exchanging these and seeing these ratings like let's say napster
would show these ratings then suddenly you'd actually see you get some signal you could index
on this and see oh i only want five star songs essentially or yeah 255 rating songs you know
that's right so just to pin this to a time frame because we're kind of guesstimating around, according to ID3.org, the version 2.3 was authored in February 1999.
Oh, yeah.
1999.
So even maybe older than I was thinking.
Maybe it wasn't at that point being used yet.
Maybe it was just finalized and then people had to start implementing it.
But it goes way back.
We're talking 25 years.
Yeah, so it's not new so it is really
predating a lot of our conceptions of what an audio file should act like i think This episode is brought to you by Sentry.
Build better software faster,
diagnose, fix, and optimize
the performance of your code.
More than a million developers
in 68,000 organizations
already use Sentry,
and that includes us.
Here's the easiest way to try Sentry. Head to Sentry.io
slash demo slash sandbox.
That is a fully functional
version of Sentry that you can poke at.
And best of all, our listeners get the team
plan for free for three months. Head to Sentry.io
and use the code changelog when you
sign up. Again, Sentry.io
and use the code changelog.
So the correlation to a well-known exchange of MP3 platform was June 1st, 1999.
So timeframes was pretty close.
Maybe they were both speculating on where this file format could go, would go.
I don't know.
And a lot of the frames that are slightly unusual in this spec are also
pretty decent web citizens so in many cases they are required to reference either a url where you
should find a contact email or directly a contact email when there is a source that they want to reference so
no go here because we can't really just include a ton of information in this but over here like
this is where you find the information about who this is from for example the commercial frame and
this this should be interesting to you. Monetization.
This is something that podcasts work hard at.
Okay, now you're talking my language.
The commercial frame. This frame enables several competing offers in the same tag by bundling all needed information.
So every offer has a price specified in any number of currencies.
Oh, wow.
A date for how long this offer is valid,
a contact URL for reaching the seller,
and a received as field that can indicate if it's delivered as,
for example, a standard CD with other songs,
a file over the internet or stream over the internet or a ton of other things they
had some high hopes for this file format this spec i mean there was some far-fetching ideas here
so this is definitely where the business guy came in and decided he needed his frame yeah
which this made me think a little bit like could this could the mp3 format and this id3 version 2.3 be used to
share information under the radar you know like ship mp3s around this world where people are
exchanging mp3s maybe there's a trojan horse in there maybe there's a a virus in there maybe
that's espionage maybe it's corporate secrets i don't know
is there you know could you shove information in what you think is an mp3 but it's not it is
an mp3 and you can play it as an mp3 but it's really meant to deliver something else so you
have for one thing attached file as a frame and you can can go up to 256 megabytes.
Yeah. This is a really big MP3.
Wow. Does the length
of the MP3 suit the file size
of the MP3? How many MP3s can we
nest? Oh, that's
an interesting experiment. That'd be a good
way of smuggling. You could smuggle
a whole album by just putting all of the other
songs into the one song's
attached files. That's true. You could definitely fit a whole album into just putting all of the other songs into the one song's attached files.
That's true. You could definitely fit a whole album into a song.
But how would you extract an album out of the tag, the frame?
Well, you'd need to use a library, wouldn't you?
Yeah.
So you'd have to have some programming skills or some access.
Or a tool that parses for that particular tag,
but I don't think anyone uses that for anything.
There's also custom comment,
which you could use and abuse for many things.
Custom URLs.
You could ship anything in this.
So you could do a lot, really.
You could put a database in there.
I think you said an SQLite database can go in there.
Oh yeah, that would be convenient. An MP3 file, an ISO.
Could you put an ISO in there? Yeah, I mean it's an arbitrary file.
You could do anything. As long as it's under that file size, you're good to go. 256 megabytes, yeah, I guess it's small enough.
And I wonder if many parsers actually enforce that.
Because there's no reason to enforce the file size of the tag you're trying to read right
all you want to do is get to the part that you're interested in right that's a parser yeah and you
read the fix so when you're parsing these frames you look for a frame header and in that frame
header you have like oh what kind of frame is this how big is this frame so if it's a frame you don't understand you can just skip
that number of bytes from the frame header and then you're at the next frame and can read that
instead gotcha and take it to the next one so i think any parser implemented for this would
honestly just look at those sizes and probably not care about the size of the actual tag there's
nothing fundamentally stopping it.
You could break the rule then.
I would expect most parsers break the rule
because there's no...
Oh, I wonder if it's actually the size field of...
This is probably it.
It's probably the size field of the tag header.
So the first piece of the ID3 tag
indicates how big is this tag.
Which lets you skip the whole thing if you're not interested in it.
Yeah, so that's what we do when we're parsing.
We know that we don't need to read more than that length of file.
I don't think we actually read the full file
because we just start looking at frames and then read as much as we need.
But we use it, for example, when we need to replace a tag
because then we can see how far do we need but we use it for example when we need to replace a tag because then we can see oh how
far do we need to skip and how much do we need to throw away to slice off the front yeah but i mean
this commercial frame also lets you include the seller's name and an embedded logo i love it and
i mean i could see this as a use case if there was an MP3 player that really respected this.
Where, oh, we're selling MP3s online.
I mean, there have been a ton of businesses that do that.
Oh, here's the sample.
So you can get a sample of the song.
And then you embed this commercial data in it for buying the full thing.
And then you could get that offer right in your
client right i don't think anyone ever implemented this but i hope i hope someone did yeah and then
when you bought the song you could get offers for the shirt oh an upsell yeah i mean you could get
current offers you could get at the time of purchase relevant offers but at least there's
an expiry date yeah you guys yeah you'll be able to expire that sucker it's interesting that we
don't even think about like this kind of going back to adam's thing with his immediate access
to a song from the 90s is like except for maybe some of us nerds and people in the audio world
like we don't think about the files so much anymore when it
comes to listening to music or listening to podcasts. I mean, we wouldn't even care if our
job wasn't to write MP3s out and ship them around the world as podcasters, right? That makes us care.
And we wouldn't care about any of the stuff, except for that it's just interesting intellectually,
if we didn't want to add chapters to our podcasts. We don't want to add chapters to our MP3 files. We couldn't care less.
But we do want chapters in our podcasts, which means we have to add them to our MP3 files.
It's a means to an end, for us even. But most people don't even think about
my new episode of Beam Radio
showed up. I'm so glad that I downloaded the MP3.
I mean, even in site podcasting,
they're not all MP3s. You can ship AAC, you can ship MP3, depends on what the player supports.
You can probably ship FLAC.
Aug Vorbis.
Aug Vorbis. Many of our listeners probably exclusively listen to Aug Vorbis based podcasts.
I guess that can't be true because they're listening to this one right here. So that's a,
that's a bad speculation.
But point being is like we've kind of, at least when it comes to audio,
to a certain extent, culturally we've kind of transcended the file paradigm.
Isn't that the case for most things though, really?
I mean you take pictures all day long on your phone
and you don't think of them as files necessarily.
You think of them as an image.
You upload it to whatever platform you prefer
or share it via iMessage or AirDrop or whatever.
You don't think of it as a file, really.
I think the file paradigm really is becoming erased.
I think files exist for PDFs.
I was going to say business stuff.
I was kind of thinking, where does it,
you still think about files.
Will you send me the attachment to that Word doc
or to that PDF?
And now we're thinking files, aren't we?
But I agree with you, images, you kind of don't think about it that way very often.
Now it's really getting lost, the whole idea of a file.
At least the file you edit.
Because a PDF is typically still a file,
still a document, but you don't edit it.
And edited documents getting rarer
with things like Google Drive
and Office 365 and the cloud.
Like docx is still a thing,
but it's less of a thing than it has ever been before.
I love it when people send me a docx file
which is editable and say, fill this out.
It's like, well, I don't have the fonts you had andx file which is editable and say fill this out. It's like well I don't
have the fonts you had and
you're going to get it back all jacked up.
Plus I'm on a Mac you're on a PC
or something like that. Did you think this through?
I can add my signature in my
PDFs via preview which is
I love that feature. You
scribble your own signature and you drop it on any PDF
you want. It's mainly
contracts, PDFs the occasional docx file where they're like,
fill this out.
And it's like, why?
Just give me a PDF or send me the docu sign.
Who in this world sends somebody a font that says, take this thing and sign it
and then send the file back to me, signed.
I had a background check run on me by a client at some point and they needed me to send a
release to the swedish police authority because as they're they're fintech so it was sort of normal
but i mean i had to print a form sign it sticking in the mail it's like them and the swedish irs are
the only people that get me to do that these days
and the irs my wife takes care of thankfully it's the best cfo i could imagine i love when they say
we need real ink on this thing really like what i mean i guess if you can't prove i did it
you know like real ink back in the day weren't there like people that actually would
forge other people's signatures like you and maybe it was just in the movies but like you
would hire somebody who would they would study a signature and they would forge it and you could
like compare it like the judge or the jury would always compare the signature and be like is this
really adam sokoowiak's signature?
And it's like, well, here's a comparison.
That always struck me as weird because like my signature is never the same.
Every time I sign it, there's like these subtle differences.
And like, we're getting to the point where I have it saved inside of preview.
And so I can just slap it on stuff.
It's like, it's never been less representative of a person than a signature.
And yet we still like, at least here in the States,
we're still asked to sign for stuff
if we don't have Apple Pay or whatever
on a credit card deal.
Usually at restaurants because they want a tip,
so you got to write the tip, then add your signature.
And it's like, you can just do squiggly marks.
It doesn't matter.
And I do.
Is forgery dead?
It's never my real signature.
It's always some sort of scribble.
Can you not be a professional forger anymore?
Is that business gone by the wayside?
I think they get into NFTs now.
That's funny.
I mean, there is NFT vibes here, isn't there?
I mean, going back to the spec, isn't there like NFT vibes going on?
Yeah.
So this is actually something we could pitch for your subscribers because I've seen that
in my changelog plus plus subscription
it says for lars wickman oh nice and you could also additionally tag my mp3s with the ownership
frame oh then you could put the name in there we could make you the owner of that particular MP3. Yeah, you could even ship a user frame, which is the
terms of use.
Do you have to sign it before it'll play? Before you listen to this podcast, please click
you agree to these terms. There's a terms frame.
Okay, owner frame is kind of cool.
What if we do that just because?
I don't think you want extra copies of your MP3s
for every one of your subscribers, though.
Right, but if we're doing dynamic ad insertion style moves,
there's people that are actually stitching their MP3s
live on request, we could certainly do that.
I agree, we do not want to do this,
but you can get it done if you're serving a new MP3
for each Changelog++ member,
that would feel concierge, wouldn't it, Lars?
Yeah, yeah, yeah.
I just wish we could get the parsing
into all the podcatchers then.
Yeah, true.
So it would show your MP3.
Yeah, you could even match it with your SSH public key
and be like, wow, this really was signed, sealed, and delivered.
Well, actually, that's a good idea, Jared.
If you put the public key in there,
you could ensure that only Lars could listen to the file.
So there are cryptographic mechanisms
for encrypting the entire file using ID3.
There's also methods for just signing
a group of frames or part of a file
to ensure that the ownership, for example,
hasn't been tampered with.
And I guess that's sort of where you get into NFT territory,
aside from not being uploaded anywhere.
I love how we can make up ridiculous things
and Lars is like, actually, there is a frame for that.
Everything that we think of, they got it covered.
More useful maybe would be synchronized or unsynchronized lyrics,
which you could use for your transcriptions.
Unsynchronized, probably.
I don't know if you have timestamps in your transcripts.
Not as granular as we'd want.
We have timestamps that are just like every once in a while,
but they're not like phrase by phrase or word by word.
Yeah.
I think you could probably use synchronized then.
You would probably want to use both.
But yeah, I'm not sure anyone uses these.
But there is room then in there for a transcription?
Oh yeah.
Oh yeah. That's just text text that's plenty of room yeah i think there's an extension spec that covers more
accessibility features and i think that one has specifically captions so maybe that's what you're
you'd want to go for chapters is an extension chapters and table of contents those belong
together and those are an extension of the ID3V2 series of specs.
All this assumes there's a client that could,
or a parser, or a library,
something out there that can consume it.
It's one thing to put it in there,
but it's another thing to make it useful
by having software that can render it, use it,
make smarts around it.
Almost all these frames are dead in the water.
You know what would be
a really cool hack project?
Build a cross-platform
use Towery or something.
Build a cross-platform MP3 player
that just supports every ridiculous
frame in the ID3V2
spec.
It has all the features. That would be so
cool. I've been so keen to try yeah i would
use it for 10 minutes for sure 10 minutes well listen my idea is even even more grand because
okay it could be backed by mp3s that are only on the server and this mp3 would be the database for ratings for play counts so you get this single source of truth
and it would of course be able to show the commercial options so you can monetize this
player and okay you could even add so there are audio events so there are ways to embed cues in the metadata like this
for example fire the fireworks here effects i think that might be used in certain types of
stage productions i'm not sure it's the capabilities there at least wow so much so much just so much
you just said fireworks and You just said fireworks.
Completely straight face too.
Like an MP3 having an event that fires fireworks.
So I think that part, like that frame has wide use.
It also has very simple uses.
Like this is the chorus.
This is the bridge.
Oh, guitar solo like you can specify things that happen in the audio but you can also add cues if you want to provide cues for
something else and this is where monetization really comes in because then you can actually
decide which commercial frames and this
is not in the spec but i see no reason why you couldn't sort of build a slightly ad hoc solution
for this but you could queue up your advertisements for uh for the from the commercial frame based on
these events throughout the file is this the best place for this data?
You know, I'm thinking like...
In the MP3 file.
Yeah, because like...
Well, of course.
That's why they put the frame in there for it.
Well, I guess I'm thinking maybe this is wrong.
Spotify is obviously the most ubiquitous place
you can listen to music.
That and Apple Music, of course.
Because Jared's an Apple Music person.
Every time I say Spotify, he's like, cringe.
I don't use that. I use Apple Music. Anyways, of course, because Jared's an Apple Music person. Every time I say Spotify, he's like, cringe. I don't use that.
I use Apple Music.
Anyways, platform aside, would they be interested in using these frames in those ways?
Because wouldn't their individual MP3 somewhere on disk be what you say, which is their database?
Is that the best place to store the data to do these things?
Is that even a good use case for them?
I'm just trying to find
how could you actually provide usefulness around this?
I would totally assume
on Spotify every song
is backed by one single
mp3 on one disc somewhere
and the play count
and everything that's used to calculate
how much they owe artists and all of that
that's just stored in id3 I assume that's used to calculate how much the artists and all of that that's just
stored in id3 i assume that's the case and that sounds like the optimal no way you think they're
doing this no i absolutely do not think they're doing this and it would be absurd exactly like
this is the worst place to put the data right one of the things i find delightful about the play count is that if you have a practice of hashing your file to keep
track of whether it bit brots or if anything's wrong with it i mean it would change the hash
every time every time you add one to the play count yeah that's why i was going back to like
you don't mutate my files you're just an mp3 player right just read only please please don't
change my md5 sum or whatever but maybe winamp wants to add
some commercial offerings into your mp3 files he's really on this commercial kick isn't he jerry he's
just really pushing this commercial kick he is he's trying to he's trying to find a way of making
this viable yeah i actually like the idea of spotify slash apple music backing their entire
play counts and ratings
by modifying their MP3 files.
Because what they're doing is they're introducing bloat
into their network fees, right?
Because they're actually increasing the size of the audio
by modifying the ID3 tags each time.
I mean, once you hit that 255 limit,
where are you going to go from there?
Are we going to have to create another frame?
I don't know.
I don't know how it works, but...
Yeah, you have to stream 256 megabytes
before you get to the audio.
Exactly.
So that is, to me, I think the best place to...
So is this a culmination of just failed dreams
on the ID3 spec writers?
Like they had a lot of vision for where it could go
and they were just way off.
The usefulness of these features just not there many of the frames are perfectly useful so the
absolute majority of frames are text frames which is just a general like this can be a string and
from id3 version 2.4 yeah it can be multiple strings so if you for some reason suddenly you support multiple titles which is
either great or terrible any number of titles we really couldn't choose the right town so we just
give it two i can see us doing that one time jared or you get ab tested which one gets played more
i do like that they have a frame for mood now so not only can you apply a genre like blues but you can apply a mood
like blues i don't know sad i've got the blues not listening to the blues right so that's cool
but yeah most of them are just text and most more i mean i guess the interesting one that isn't just
text we talked about attached a picture so that's what people use for putting their cover art,
their album art, shipping that with the file,
which is nice, that's useful.
But really chapters is the one that actually is like,
people use this, this is cool.
A lot of clients or a lot of encoders
also add some kind of comments,
like this was encoded using blah, blah, blah.
Isn't there an actual field for that? that well there is a comment you can add and then there's probably also one for the
tool i don't remember but i bet there is i think i think we're doing that one if i recall let me
pop open the code software hardware and settings used for encoding would be one so the ones that we are setting are artist title subtitle album year date genre
publisher and encoder so one of the good things about these frames is the frames you're not using
you don't add to the tag at all so there's no dead usage and that way they could take a stab
at a bunch of frames that were maybe not realistically going to work.
We try to support them in our encoder and decoder regardless.
Do you have 100% coverage on that?
Do you have a commercial frame?
I believe we have the commercial frame.
There are some frames that I don't think we've merged yet or added yet.
But the tricky thing is we haven't been able to test these frames
because there's no other implementations that I know of that do these. Right. yet or added yet. But the tricky thing is we haven't been able to test these frames because
there's no other implementations that I know of that do these. Right. Well, even with the chapters,
I guess, you know, some of that we did talk through on ShipIt. So for those who are curious,
ShipIt 70 has some more details on more of the chapters and changelog side of things. But
we definitely did hit, I guess that's where I came back in,
was like you were kind of building this thing
in a vacuum, an Elixir vacuum,
where you would encode it in Elixir
and decode in Elixir
and test it with your encode and decode,
doing your best.
But it actually hit reality of,
will other tools parse this?
Will podcast apps parse this?
That's when we actually had to do some QA and some bug fixes
and realize that I guess maybe the test suite wasn't quite as comprehensive
or would you describe it as rigorous as it needed to be?
Yeah, so when we implement a test,
which is we use the library to encode this
and then we check that it's the
binary we expect in the end that just means that we read the spec twice and ideally those two
readings match up with our implementation the problem is we could introduce the same bug twice
and that can fairly trivially happen most of the issues we've had to track down a fix have been
one stray null bytes those are the track down and fix have been one stray
null byte. Those are the easiest ones to find, right? The one stray null byte, at least it's
easy to see. How would you go about finding one stray null byte? Like what were you actually,
were you going frame by frame? Were you reading, was it like the matrix where everything merges
into one to you now? Yeah, yeah. So I just looked at the hex and just feel it no yeah just kind of feel
where the like in severance you can just feel where the bad ones are i don't have a ton of
experience with hex editors and sort of staring at that and figuring it out so what i ended up doing
was typically trying to figure out trying to drill down to okay this is the problem area where our encoding differs from for example
whatever forecast has encoded this episode of atp that we used a lot for comparison because they
have chapters so in some cases i decode that their implementation re-encoded the results with ours and checked the differences after a while i
started building out a whole slew of small functions that just stepped through the binary
and gave me the differences and helped me sort through them and sort of oh i know it's after
the first thousand bytes so let's hop to that.
And then it's a lot of drilling down and just figuring out like, oh, this is the problem frame.
And then finding, oh, the only difference in this one
is that we encode it correctly with UTF-16
and they encode it correctly with ISO 8859-1.
It should support both according to spec.
But if you do it this way,
Overcast just won't show it
at all. Then your chapters don't exist.
Yeah. Thankfully we didn't run into any sort of mutually
exclusive encodings where one app would
support this and not the other and vice versa.
What if Apple Podcasts requires UTF-16 in that particular
frame?
We didn't run into any of those, thankfully.
And we tested it in probably half a dozen or so actual apps
to make sure that it was working.
Yeah, after we had it working in Overcast and Pocket Casts,
I haven't seen any others that had issues.
No, and I've been asking people to report
if it doesn't render in their particular podcast app,
and no one has said that.
One person confirmed it worked in Podverse.
I'm going from memory now.
But nobody has confirmed it doesn't work in theirs.
And after this process, we also introduced a tool called ID3V2.
That's a command line tool and FFmpeg into the test suite.
Now, both of those cover a subset of the frames,
so we still don't have a comprehensive test suite
because there's simply no implementations that I know of
that we can rely on.
But for example, FFmpeg covers chapters pretty well,
and ID3v2 covers a lot of things that are not chapters quite well,
at least decently.
So yeah, that's about what we can do
to ensure that we're doing the right thing.
If you know of reference implementations
or good test suites,
please do chime in on the issues
because it would be sweet to have more reference.
Or if you do build that cross-platform
Towery-based MP3 player
app, that would be a great reference because
you're going to implement all these features.
Maybe if it has a command line,
if we can shell out to it.
Also have a command line, please. this episode is brought to you by our friends at fly fly lets you deploy full stack apps and
databases closer users and they make it too easy no No ops are required. And I'm here with Chris
McCord, the creator of Phoenix Framework for Elixir and staff engineer at Fly. Chris, I know you've
been working hard for many years to remove the complexity of running full stack apps in production.
So now that you're at Fly solving these problems at scale, what's the challenge you're facing?
One of the challenges we've had at Fly is getting people to really understand the benefits of
running close to a user because I think as developers,
we internalize as a CDN, people get it.
They're like, oh yeah,
you want to put your JavaScript close to a user
and your CSS.
But then for some reason,
we have this mental block
when it comes to our applications.
And I don't know why that is
and getting people past that block is really important
because a lot of us are privileged
that we live in North America
and we deploy 50 milliseconds a hop away.
So things go fast.
Like when GitHub, maybe they're deploying regionally now, but for the first 12 years of their existence, GitHub worked great if you lived in North America.
If you lived in Europe or anywhere else in the world, you had to hop over the ocean and it was actually a pretty slow experience.
So one of the things with Fly is it runs your app code close to users.
So it's the same mental model of like, hey, it's really important to put our images and our CSS close to users. But like, what if your
app could run there as well, API requests can be super fast. What if your data was replicated,
their database requests can be super fast. So I think the challenge for fly is to get people to
understand that the CDN model maps exactly to your application code. And it's even more important for
your app to be running close to a user because it's not just requesting a file.
It's like your data and saving data to disk,
batching data for disk.
That all needs to live close to the user
for the same reason that your JavaScript assets
should be close to a user.
Very cool. Thank you, Chris.
So if you understand why you CDN your CSS
and your JavaScript,
then you understand why you should do the same
for your full stack app code.
And Fly makes it too easy to launch most apps
in about three minutes.
Try it free today at fly.io again fly.io
how does any of this change if as we look look at podcasting 2.0 initiatives?
Does any of this current or future stuff play into that?
So they jam most of their stuff into the RSS feed, right?
Yeah, so they have chapters in the RSS feed.
And that's probably a good approach, honestly.
I don't think they want to extend
ID3 or hack things into ID3. Now, I think ID3 has absolutely served many more purposes than they
intended building it in the late 90s. I mean, many of the frames that are currently used with
great success by podcasts were established in the late 90s like album art and
all that chapters are later but still um it has served podcasting well yeah but not everything
needs to live in the file i mean for me you know i watch a lot of youtube stuff and i absolutely
love when they have chaptering in YouTube videos especially when it's
like at least 10 minutes or more like who wants to listen to the whole thing just let me go to
the thing that is the point I use YouTube in a lot of cases for awareness reviews how to's so
knowledge-based you know gathering whether's financial, whether it's software,
whether it's tech or hardware or networking, whatever it might be.
I'm always thankful.
So having this in our MP, I personally have enjoyed it tremendously.
And the one thing, I'm not sure this is a byproduct, Jared,
of us doing start and ends for our chapters.
You remember when we speculated, like, should we just put the start time of the chapter and never worry about the end?
Because obviously the beginning of the next chapter is theoretically the end of the previous one.
In at least Overcast, I like the visual of knowing how long a chapter is. Is that a byproduct of the start to end, or is it just
assuming that based on the start of every chapter? What do you know
about that? I haven't actually tested it.
I assume it's there every time. So start times to chapters are required,
end times are not required,
which makes sense. We include both both and i would assume if i was
writing that app i would say okay if i have the metadata that shows me the start and the end time
i'm going to use that for my calculations but if i don't i'm going to use the start time and i'm
going to use the start time of the next chapter and use that for my calculation so i would use
the end time if it was there and fall back yeah I don't know if that's how it's doing
it, but that's how I would do it.
But I've been appreciating that. Just going back
to some of the conversations we have on our shows and just knowing
like, okay, this segment is
2 minutes and 32 seconds. That's
pretty interesting, how we can
break it down. And then it also is a feedback
loop for us as creators, I think. Because when you
think about respecting
your listeners listeners time,
being concise in your thinking, conducting a good show, it's evident in the length of the segment,
right? If it's, if you've got one that's six minutes, it doesn't mean it's bad, but like when
you're listening to it, you're like, is all those six minutes pretty good signal? Or was there a lot
of like side tangent stuff that really didn't belong?
Maybe it's the culture and love of our show.
Who knows?
But it just makes you look at your production differently when you know the length of each segment or chapter.
At least that's what it's been for me.
It's like, how long is this intro?
How long is that ad spot?
How long are all these parts?
Does it really make sense to be that length?
Could we be more concise?
Could we be more listener first, aware of time?
How long are they going to talk about HBO's Silicon Valley?
You know?
That's right.
When are they going to change subjects here?
Please.
Why does Jared keep bringing up Star Wars?
You know, it doesn't make any sense.
No, I think it does as creators.
It is a signal back to us, I guess, to tighten things up maybe.
And to also realize that
some shows are way different than other shows like this one's i would say meandering and for
me in a good way but like it's gonna be hard to chapter this because like we just kind of talk
about stuff and like other shows it's like there's this part then there's this part then there's this
part and so the actual chapter creation process which I do write about somewhat in the announcement blog post,
because it's interesting if you're into the inside baseball,
and if not, then it's not.
But it's a challenge, and it's an interesting part of it.
It's like you can't just add chapters and then it's good.
You have to actually make them good chapters,
otherwise they're not worth anything.
In fact, I haven't added the chapters into Practical AI yet
just because of the way our production flow works.
We don't have good contextual chapters there.
They're just kind of like, here's the first segment,
here's the second segment, here's the third.
And for me, it's like, that's not even good enough
to be worth putting them in.
And so as of today, that's our only show
that does not have chapters
just because we got to get it to a place
where our editor can actually put those in there
in a way that's meaningful.
So the creation process for chapters
is an interesting one as a creator.
I don't know, as a listener, I appreciate being able
to skip down to that one part I was curious about
and not listen to the part about Silicon Valley or whatever.
I don't know, Lars, do you use chapters
as your podcast listener?
Not very often because most of the podcasts I listen to,
I both want to hear what everyone's saying.
Some of them are straight-up conversational,
and some are more sort of guest interview.
But then it's still, I feel like I lose track if I skip around.
If it's a multi-guest podcast,
then I wouldn't mind skipping, probably.
I actually listened to a sort of mainstream podcast today,
non-tech nerdy, or I guess cyber.
I guess it's tech nerdy,
but I think it's targeted at the mainstream.
And this is the first time in ages that I heard dynamic ad insertion.
So jarring.
Oh, yeah.
It switched to Swedish and started talking about a local electronics chain.
Oh, wow.
Or Swedish electronics chain, not that local.
That would be jarring.
It switches languages on you.
Yeah, that was so weird.
I was like, ah, is this what podcasts are to people?
Because I just listened to this artisanal
silliness like right we're definitely in that same bubble with you i think i think there's one or two
podcasts where i listen to them and i know they're doing dynamic ad insertion but i assume your ad
rates are going to go up now that you can add a link and a logo to the ad read. We haven't added the logo yet,
but we've done obviously the link and the chapter for it.
Incredible cash flow options.
Yeah, I don't know if the ad rate's going up,
but it's definitely a value add.
I think it definitely is something
that our advertisers would like to have,
especially if you're sitting there listening to it
and you can click over and check it out right there
while you're listening. I mean, I do that all the time when people put
the links in. It's nice. I don't think anyone thinks it'll move the needle much, but.
No, this is definitely a sweat the details kind of move. You know, when we've wanted this for years,
it's one thing you said, Jared, to put non-useful chapters in, in Practical AI's example. It's just
challenging right now to get that in there, workflow-wise and editor-wise and context-wise.
But this, to me, is like a sweat-the-details move. And I think, more than anything,
one, getting a chance to buddy up with Lars
and have this kind of feedback loop and open source out there, and then
this conversation from it, and then finally get to having chapters
and then executing on those chapters.
Like I've enjoyed the process of chaptering our shows,
even though as part of the process of creating these podcasts,
there's that, you know, here's the record time.
We're all here, hour-ish, right?
There's that time involved.
Then there's the mastering time and putting the show together and tiling the the episode online a lot of moving
parts and then to bolt on or add on one more highly visible to a listener and a ux factor
really to a listener to the listener to us and to the listeners is this chaptering part.
You know, at first I've always wanted, but I thought, man, when we get there, it's like,
it's one more thing to do in the, all the process to get to an ending artifact of producing a show and shipping around the world.
Wow.
It's going to be a lot of work getting there, but now I've really enjoyed that process.
Cause like we, we truly are a a I would say that not just because
we say this but we actually follow through on it is we sweat the details and this to me is one of
those details where like when we're doing the chaptering of a show at least for me and you
can speak to your your process Jared and how you do it and how you feel about what you're doing
I really enjoy it because I feel like I'm giving a listener a superpower into listening to our shows, like a secret key.
Should their client just support the feature into the good parts of the show if they want to just jump around or jump to their favorite part of that episode?
Because there's a lot of shows people go back to and listen to again and again, at least maybe twice or three times.
Like if you do that, then here's these really good waypoints.
Hopefully we've done our job good and give us feedback
if you don't think we have.
But I think it's a sweat the details kind of move.
Yeah, and because we implemented them in the admin
versus only in the MP3s and WAV files,
because we could have done this as just one step in post-production
and used a tool like Forecast or something to write those tags and then upload the file from there
and be done.
But because we do it in the admin,
it's a centralized source of truth
for the chaptering information for an episode.
And so we can emit that in multiple places.
And why that's cool is that you have the exact same chapters
on the web site.
So if you want a deep link to a chapter,
like you really like this conversation we had, or this thing this person said was interesting and you want to deep link to a chapter like you really like this conversation we had
or this thing this person said was
interesting and you want to link to that like there's deep links
on the webpage directly into that
chapter that you can share so now chapters
are shareable which is just
neat little byproduct of having it there
versus having it somewhere else is we can put it
there we can do the podcasting 2.0
RSS feed style which we support
as well we can put it in the m can do the podcasting 2.0 RSS feed style, which we support as well. We can put it in the
MP3 via Lars'
library, which we do as well. And we
can also put it in our email that goes out
as we do it. So it's just like, that's
cool. Yeah. So it's
a cool thing. We couldn't have done it without you, man.
We really appreciate the work you put in on it
and the quality that
came out of it, the fact that it works.
And for you, putting up with me as a customer,
do you have any comments on me as a client?
I did client work for a decade, so I know what a client should be like.
Your description about going away and showing up checks out,
but it's also weirdly that you reach out about these projects.
So the last time we worked together on some projects
was also when i was just heading into parental leave it was this time as well and when you get
really really busy so you surface like once a week at best and usually you're quite responsive
in general but but yeah during these projects that's also during your crunch
time i think adam was on leave and you were handling a lot of production and all that so
ideal client in the sense that not particularly hanging on my shoulder or getting too involved
but also maybe not the quickest turnaround on responses,
which has been fine.
Yeah, which is fine.
That's my luxury.
That's my prerogative as the customer
is to be less concerned with your time
and more concerned with mine,
even though I don't want to be like that.
But I think the only feedback I gave you code-wise
was at one point I said,
I would like this to be a little bit higher level API like that was pretty much all I ever said in terms of the end product and then
obviously tried to use it and was like hey how do I use this you know it's not working you know
saying stuff like that but I tried to provide as much information as I could as like a good
technical client yeah yeah I think you once you were available and actually trying
to use the thing which right which took a little bit but i think we were both quite busy so i was
happy not to not to get too much feedback too early because i had a one month old kid then
it was easier when he was two yeah so you got you got the bulk of the work done by mid july maybe
early july and i literally didn't touch it until like the first or second week in August.
I just was like, cool, I'll take a look.
And I just never took a look.
And I was building out the back end too.
I really wanted to be able to have the data in there so we could start capturing it.
And we actually captured the chapter data for a month and a half or so before we had
the feature so that we could go back and just like
retrofit, which I've done now, Adam, that's all those old MP3s old as in going back to June,
all have chapters in them. And so I wanted to get that done fast so we could start adding the
chapters and figure out the workflow. And then I wanted to actually get around to your tool.
And so I sat on my hands for a while doing that. And then I was like, Ship It was coming up, Kaizen 70.
I'm like, we got to have this sucker done
so we have something to talk about.
And then I was like, Lars, where are you?
I have questions, I have problems.
Answer me immediately.
Hopefully it wasn't too bad.
No, no, it was all good.
It shows that you've dealt with clients
because the information I get out of you
is much, much better than the average level of a non-technical client.
I even submitted a pull request at one point.
Yeah, pull requests, GitHub issues.
I actually fixed a bug, but then you didn't like it.
You did it yourself anyways.
I think I rewrote most of what you had touched at that point.
Yeah, you already touched that.
But I was like, you know what? I'm sick of just complaining.
I'm going to actually contribute a fix.
And I did.
The spirit of it has been merged.
The spirit of it has been merged.
Is that like a non-code contribution?
Do I get any credit for that in the readme?
Jared, the spirit of Jared's code exists.
I mean, you're listed as the maintainer.
That's only nominal
you're going to have to sign up for my GitHub sponsors
if you want any bug fixes, just kidding
will this become a slash the changelog library
what's the plan for the actual code long term
it's going on the changelog repos
and it's already owned by the changelog org on hex.pm
which is the Elixir package repository
we have tried listeners to get slash changelog on github we've talked to all the right people
sadly it's probably never going to happen so we we have to be the changelog on github sadly
it is a hard life and you can't get just slash changelog somewhere. We've got it on YouTube.
We almost have it on Instagram.
Yeah, if you want to check out all the new stuff on YouTube,
go to youtube.com slash changelog.
You can check out their changelog highlights.
Well, anything left uncovered?
Anything we should say before we call it a show?
I think I can just add that we are planning a bit of a technical dive
into the structure of id3 tags and how we
tackle the parsing and encoding of them so there should be another changelog blog post covering
that if you want to read the blog post we're talking about that's a lot fluffier and mostly
about the thoughts that that we've discussed here which were awoken in me while I was reading the spec.
Well, it was a fun, nostalgic, deep dive
into some ID3 esoterica, as I called it in the working title.
Lots of fun chatting with you, Lars.
Like I said before, appreciate your work you've done on this.
Really cool.
It's got to feel good, at least as a listener of our shows,
at least when you glance
at the chapters
in your app,
even if you're not using them,
be like, hey, my code.
My code does that.
It always feels nice.
Not just a listener,
but a plus plus subscriber.
That's true.
Of course.
I want to be closer
to the metal.
And a fellow podcaster.
Give a quick shout out
to your podcast, Lars.
Yeah, so the one
I should shout out
is Beam Radio.
So beamrad.io.
I came up with the domain
and I'm slightly proud of it.
That covers Elixir and Erlang
and the ecosystem overall.
And it's me and a number of much,
much more fantastic co-hosts.
And then I have a podcast,
Regular Programming.
But that one, regprog.com
is currently sort of on hiatus but if you want to if you want to hear me talk about programming in
the very general sense there's a bit of a backlog that you can go through otherwise it's blogging
and newsletters and the youtube channel right now. Oh yeah. Popping off.
What's the handle?
How do you search for,
is it under George?
Yeah.
I go by under you.
Dot.
I owe under your,
dot.
I owe.
Say it again.
Under you would.
I won't try.
I like it.
It means underground in Swedish.
Oh,
okay.
Very suspicious.
My mother had notes on my company name.
Ah,
who's going to trust you?
Yeah, exactly.
It's like, mom, I'm being cool on the internet.
Yeah.
Classic, classic.
Well, speaking of the plus plus subscribers,
I do want to mention something.
So we often ship bonuses to our shows.
And so what I love most about this new feature is it lets us give you a direct click or tap,
depending upon your platform, right into those bonuses.
So we have a chapter called out for the bonus.
And then for the more recent episode, there's another chapter after the bonus,
which is a thank you chapter.
So if you want to go find that one, the most recent episode that I'm talking about
is episode 506.
So special chapters just for Plus Plus members directly to the bonus
and the good stuff.
And a personal thank you, did you embed each person's name
into their own MP3 file by way of dynamic thank you insertion?
That would be amazing, honestly.
Yes, dynamic thank you insertions.
I'll do a thank you in my voice
and then stable diffusion in other voices
because that's a thing coming for each.
And I can do it accent or dialect or language.
That'd be...
Oh, and if you fill out your language of choice
in your profile,
we could send you via OpenAI's Whisper library, we can send you
a thank you in your own language.
That's right. Yes, more.
More stuff to hire Lars
to build for us.
Yeah, so I'll clear my calendar.
Anything else, Lars?
Anything left, unturned,
unsaid?
No, I think we've thoroughly covered
what needs to be covered about ID3 tags.
Also sure that there will be people
who spend their whole lives
focusing on the perfect curated MP3 collection
that are like,
you've missed the most important part.
But that's okay.
I really only care about the podcast thing.
If people are interested in hiring you should we send them to pronounce in english terms under jord.io under j-o-r-d.io is that the
best place to send folks yeah sure and probably the most appropriate thing to send my way right now is companies that are looking to hire elixir
developers not necessarily to hire me but hire others i've been helping a number of companies
recruit which is an interesting thing to do as a developer rather than a recruiter because
many developers don't like recruiters right so you're saying you're a recruiter now?
Technically, yes.
Technically, yes, which is the worst kind of technically, yes.
Yeah, you started off trying to be cool on the internet
and you ended up a recruiter.
So maybe your mom was right the whole time.
But I seem to have a decent approach to it
because the developers come to me.
I don't actually hunt people down on LinkedIn.
It's more that I post a job posting and then people reach out and then I come to me. I don't actually hunt people down on LinkedIn. It's more that I post a job posting
and then people reach out and then I talk to them.
So on the other side of the coin then,
if you are an elixirist who wants some work,
maybe reach out to you as well.
Yeah, you can also check out the site.
There are postings under the job section.
Very cool.
We'll link all that up.
Check the show notes for those links for jobs
or for hiring Lars and team for consulting.
But Lars, hey, thank you so much for working with us.
I've been mainly on air support for Jared and the rest of everybody involved in this.
The desire, I suppose, of this feature for many years now.
But it's nice to see it actually in production, in use, being using it every single week to deliver chapters to our listeners.
And we couldn't have done it without you.
Thank you so much.
And it's been awesome talking through what could have been with ID3V2.
It's been a pleasure.
Thanks, Lars.
Yes, years in the making.
ID3, many, many years in the making. ID3, many, many years in the making. And this library to support ID3 tags in
our MP3s to enable chapters to improve the listening experience of our podcast. What a
journey. I've been wanting this for so long and it's finally here. If you're as excited or just
a little bit less than Jared and I about this feature, let us know in the comments. We want
to hear from you. How do you feel about chapters in our podcast now?
The link to the comments is in the show notes.
And a big, big thank you to our friends
and our partners at Fastly and Fly.
They indirectly make things like this happen
because they are partners of ours
and they're so committed to our mission.
Check them out at fastly.com and fly.io.
And of course, to Breakmaster Cylinder, those beats are banging. We love them. I hope out at fastly.com and fly.io. And of course, to break Madison's cylinder,
those beats are banging. We love them. I hope you love them too. And last but not least,
with all the excitement, I forgot to mention there is a bonus on this episode for our plus plus
subscribers. If you're not a plus plus subscriber, hey, check it out at changelog.com slash plus plus.
You can directly support us. You can make the ads disappear and get access to bonus content on all our podcasts.
All right.
That's it.
This show's done.
Thank you again.
We will see you on Monday. Game on.