Cormac McCarthy Is Dead
- Notes
Speaking of having nightmares and living in the moment, my favorite writer, the man I have looked toward for guidance and inspiration during my entire adult life, has died.
I have no words.
Speaking of having nightmares and living in the moment, my favorite writer, the man I have looked toward for guidance and inspiration during my entire adult life, has died.
I have no words.
Bahala na, as taught to Jenny Odell by an artist born in the Philippines, is a Tagalog phrase that translates to “whatever happens, happens”:
That may sound resigned or passive, and indeed, an American psychologist argued in the 1960s that the attitude described by bahala na had similarities with American fatalism. But when the Filipino psychologist Alfredo Lagmay interviewed people around Manila about its usage, a more interesting picture emerged. What he found was a “positive, functional response to uncertainty,” something that meant meeting the present with everything you had at your disposal, a sharp-eyed sallying forth even when you didn’t feel totally prepared or in control. It was a form of acceptance that was actually the opposite of giving up because acceptance was the beginning of observation and response.
Jenny Odell, an author I love, continues to describe bahala na in a way that’s similar to what I’ve learned in my recent adventures with Zen and Stoicism:
Both declinism — the belief that the past was better and the future will be worse, and blind optimism — the belief that the past was worse and the future is inevitably better — absolve us of our responsibility to act now, in this gap between the past and future. In contrast, the improvisational spirit lives inside that gap, and it can be surprisingly full of ingenuity and joy even when the situation is dire. As something we share with our nonhuman brethren, the capacity to form new responses is how you know you’re alive, today, here. So when my mum says, “whatever happens, happens,” what I hear is not resignation but a mix of humility, trust, and curiosity. And I think it’s like this — through love of the present, and of ourselves in it — that we actually win the future.
All we have is now. The past and the future don’t exist, now. We live now. I don’t know how else to describe it. The present moment is the only moment that matters; life is made of the present moment. To live well, live now.
A few weeks ago, I saw this video of Costello the octopus potentially having a nightmare, and I’ve been haunted by it ever since. Ever since becoming vegan in 2017, I’ve become a lot more spiritual when it comes toward animals, nature, and the Universe. I see no need why anyone should kill and eat animals in this modern world of plenty, but that’s a losing battle I won’t fight now.
What has affected me so much right now is that last night before bed, I put on Anthony Bourdain: Parts Unknown on Max, and I watched the season 5 episode where he goes to Hawaii. There’s a segment where he and a few other Hawaiians go hunting for octopuses. They used a sharp spear to coax the octopus out of its hole in the ground, and when it tried to swim away, Anthony grabs it and begins to explain that the way to kill it is to bite the brain. However, he couldn’t find it, so we see him bite the octopus, bite the octopus, bite the octopus, and eventually, the octopus dies from exhaustion.
Seeing the tentacles flair and writhe was one of the most gruesome things I had ever seen. Usually, stuff like this doesn’t affect me much. I was an EMT for many years. I’ve seen some gruesome things in my life, but this, this is haunting me. Octopuses can have nightmares; I’m having a nightmare right now.
One of my favorite YouTube channels is Masahiro Sakurai on Creating Games, and a few days ago, he released this video of some of my favorite video game music (Zelda! Xenoblade Chronicles!) being performed live in Japan by an orchestra as part of the Press Start: Symphony of Games concert series. If you’re a fan of these video games, or really, video games in general, you should definitely watch this. A whole nine plus minutes of Xenoblade Chronicles music? Oh my goodness.
To continue the thought from my previous post, Robin Dunbar explains how friendships die:
Friendships die when we do not see the people concerned often enough to maintain the relationship at its former level of emotional intimacy—and especially so when neither side can quite muster the energy to do anything about it. So the tendency is for such relationships to fade quietly, almost by accident rather than design. The road to friendship is paved with good intentions to meet up again, and no doubt a good bit of guilt—we must get together sometime… but somehow sometime never comes because too many other priorities intervene.
There’s that energy I mentioned before. Friendships die when neither side can quite muster the energy to do anything about it. Don’t want friendships to die? Do something about it.
This reminds me of this New Yorker cartoon from this week’s issue:
In a chapter titled “Why friendships end” in his book Friends, Robin Dunbar writes about a study conducted by Michael Argyle and his collaborator Monika Henderson that examined the rules that underpin friendships. They identified six key rules which were essential for maintaining a stable relationship:
I’m embarrassed to admit this, but I’ve been working hard this year to improve my friendships and my social network as a whole, and I have found Friends by Robin Dunbar to be an invaluable resource to help me understand what makes friendships work and how I can be a better friend to those I care about.
I’ve lost too many friends over the years from the simple fact that neither side devoted enough energy in maintaining the relationship. All it takes is a bit of energy, and that has been where I’ve been trying to redirect my attention and focus onto this year. I can’t say that I’m the most popular person in the world now or anything, but I can say that it has been fun to make plans with my friends, to hang out with them, to confide in them, and to share some part of our lives together.
This has been really tough, though. Even though these people are my friends, I still feel that fear of rejection, of cancelled plans, of maybe mistaking where I think my friends lie in my friend circles and where I lie in theirs. Calibrating that has been interesting. Keeping friendships takes a lot of energy, and I think I’m ready to expend as much of it as possible on them.
This is from a few days ago. I used to think achievements like these were fun, but lately, I’ve been feeling like they’re more a burden than anything else. I’ve been contemplating living life without my Apple Watch, maybe replacing it with an old-school watch, but I’m not sure. The Apple Watch can be useful, but disconnecting from technology might be more useful. Still thinking through this…
School ended on Wednesday, and I saw all the kids head home for the summer. Yesterday I said goodbye to teachers and friends who are moving on to new jobs and new opportunities. I also said goodbye to a 6th grader who transferred to our school last summer and who was as shy and stubborn a kid as I’ve ever met in my life but who slowly opened himself to us throughout the year and became such a loving and overwhelming force in my life that I almost cried as I gave him one last hug and said goodbye to him one last time.
I believe the summer is a time for new beginnings and a time to experiment and have fun. I have plans and ideas and wants and wishes for how I want to spend this summer, and I know life usually has other plans for me, but I feel like I’m in a better place now than I’ve ever been in my life that I know in my bones I will go with the flow and live as best as I can, no matter what life decides to throw at me.
I will miss my friends and I will miss these kids I may never see again, but my life is better because we shared a bit of ours for a brief period of time. “He looks up to you,” a co-worker of mine told me a few weeks ago, referring to the 6th grader. “Doesn’t it feel nice to have someone that looks up to you like he does?” We talked about anime and manga and my love of black coffee and his utter disgust of it. We would tease each other relentlessly, and I’m simply going to miss him. I’m going to miss a lot of things here in the next few days and weeks, but life moves on and I have to, too.
I spent last weekend thinking through and implementing some ideas that have been rattling around my head for months. I wanted a way to automatically download videos from every YouTube channel I followed and to download any ad hoc video I came across in my day-to-day life that I wanted to watch later. What I didn’t want was to manage any of this myself. I had been using my RSS reader to get new videos from the channels I subscribed to, but I had to then use my RSS reader, filter through the items, add each item to my YouTube list, then initiate the download command in the terminal myself. I explained how I did this in this post from November, but again, I wanted something more automated.
So I figured out how to make it more automated… by automating most of it!
Here’s how it works.
I won’t go through what yt-dlp is or why I set it up the way I did because I explained that in my previous post, so please read that if you need a quick explainer. What this post will go through is how to setup yt-dlp to “subscribe” to your own list of YouTube channels and to download your own list of ad hoc (or watch later) videos automatically.
I’m using a 2018 Intel-based Mac mini with yt-dlp
installed per their installation instructions. That means this setup is intended for people with a device running macOS. Optionally, to make this setup just that tad bit more awesome, you will also need:
Before we can automate anything, we have to create a few files first. In my previous post, I created an archive.md
file to log all the videos I’ve downloaded. This is important. The archive file is the most important piece to this process, so create it now. Good? Okay. I then created a file called subscriptions.md
and placed that in my main YouTube
folder where all my files live. In this subscriptions.md
file, I added each channel I wanted to subscribe to, one channel per line. For example, a snippet of my file looks like:
https://www.youtube.com/@PeopleMakeGames
https://www.youtube.com/@PeterMcKinnon
https://www.youtube.com/@PickUpLimes
https://www.youtube.com/@primitivetechnology9550
Essentially, that’s all you need. There’s nothing fancy to this. Keep in mind that this will download all the videos these channels produce, including shorts and other things. I don’t mind that, so this is good enough for me.
The next thing, and this is where the magic happens, is to simulate your yt-dlp
command and add each file to your archive.md
file. To do this, add both the --simulate
and --force-write-archive
commands. --simulate
tells yt-dlp
not to download anything and --force-write-archive
adds all the videos from all your subscriptions to your archive.md
file. Do you see why this is important? When you’re ready, you can now run your command. Mine looks like this:
yt-dlp -P "/path/to/YouTube/" -P "temp:tmp" -P "subtitle:subs" --simulate --force-write-archive -o '%(uploader)s-%(upload_date)s-%(title)s [%(id)s].%(ext)s' --download-archive '/path/to/archive.md' -f 'bestvideo+bestaudio/best' --sub-langs all,-live_chat --embed-subs --yes-playlist --batch-file '/path/to/subscriptions.md'
Depending on how many subscriptions you’ve added, this process could take a long time, so go outside, hang out with friends, read a book, do something else while this process runs. By the end of this, your archive.md
file will most likely be huge. Mine has over 15,000 lines on it but barely cracks 300 KB. So really, you can leave this file alone forever and it’ll never cause you any issues (knock on wood).
This takes care of my subscriptions, but what about any ad hoc videos I may want to download and watch later? Well, I mostly answered that in my previous post (you should really read that post, it’s pretty good). Specifically, the important part is creating a youtube.md
file and including the --batch-file
command that points to it. Then, as I go along with my regular internet surfing life, I add links to any videos I want to watch later to this file using a simple Shortcut and my system automatically downloads it. How?
Well, I’m glad you asked!
Time to create a few more files. I created four and called them: subscriptions.sh
, subscriptions.plist
, youtube.sh
, and youtube.plist
. I placed these files in my main YouTube
folder, but the plist
files can be moved or copied to /Library/LaunchAgents
, which we’ll do later. I’ll focus on my subscriptions first.
In my subscriptions.sh
file, I added:
#!/bin/bash
/usr/local/bin/yt-dlp -P "/path/to/YouTube/" -P "temp:tmp" -P "subtitle:subs" -o '%(uploader)s-%(upload_date)s-%(title)s [%(id)s].%(ext)s' --download-archive '/path/to/archive.md' -f 'bestvideo+bestaudio/best' --sub-langs all,-live_chat --embed-subs --yes-playlist --batch-file '/path/to/subscriptions.md'
This is similar to the code above but without the --simulate
and --force-write-archive
commands. This is the real deal command, so if you haven’t run the --simulate
command, then you will be downloading everything in your subscriptions.md
file. Maybe that’s what you want, so you do you. I’m not your mom.
The subscriptions.plist
file is where the magic happens (lots of magic happening today). This file contains this bit of code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>subscriptions</string>
<key>ProgramArguments</key>
<array>
<string>/path/to/subscriptions.sh</string>
</array>
<key>StartInterval</key>
<integer>21600</integer>
<key>disabled</key>
<false/>
</dict>
</plist>
I’ve simplified my plist
file compared to say, Jason, which I took a lot of inspiration from, but I customized his setup to fit my needs. He includes a few log files that are good practice to include, but I like living on the edge, so I didn’t include them. If you’d like to add them, include something like this in your plist
file:
<key>StandardErrorPath</key>
<string>/path/to/ytdl_error.log</string>
<key>StandardOutPath</key>
<string>/path/to/ytdl_st_out.log</string>
A few things to note:
The Label
key is essential if you plan on adding more than one file to the LaunchAgents
folder. I gave this one a label of subscriptions
to differentiate it from the others.
I set my StartInterval
to 21600, which is 21,600 seconds, or 6 hours. I set it to this because this is not something I want running all the time, and it’s not something I want to be checking my downloads folder for to see if there’s something new. That’s the behavior I wanted to eliminate, so putting it to 6 hours has helped me pull away from my devices while still ensuring I have something new to watch a few times throughout the day. Honestly, I could set this to 24 hours and still be happy, which might be something I do in the future. Stay tuned.
Once this is all done and setup to your liking, navigate to /Library/LaunchAgents
and copy your plist
file into it. macOS might notify you that subscriptions.sh
is an item that can run in the background. That’s exactly what you want. You may also have to add bash
to your Files and Folders
section in the Privacy & Security
pane in your System Preferences
. This ensures bash
has permission to run on your system. Boy did that one have me scratching my head for a while.
And that’s essentially it. Rinse and repeat with the youtube.sh
file:
#!/bin/bash
/usr/local/bin/yt-dlp -P "/path/to/YouTube/" -P "temp:tmp" -P "subtitle:subs" -o '%(uploader)s-%(upload_date)s-%(title)s [%(id)s].%(ext)s' --download-archive '/path/to/archive.md' -f 'bestvideo+bestaudio/best' --sub-langs all,-live_chat --embed-subs --yes-playlist --batch-file '/path/to/youtube.md'
And the youtube.plist
file:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>youtube</string>
<key>ProgramArguments</key>
<array>
<string>/path/to/youtube.sh</string>
</array>
<key>StartInterval</key>
<integer>60</integer>
<key>disabled</key>
<false/>
</dict>
</plist>
And you have a fully automated YouTube setup. Note, I set the StartInterval
to 60 because I don’t mind this running all the time because I don’t add too many ad hoc videos anymore, so when I do, I’d like to watch it sooner rather than later.
Because you took the time to add all your channel videos to your archive.md
file, from this point forward, this setup will ensure you only download new videos as they’re posted to your subscriptions. Pretty nice, right?
But there’s one more piece to this that’s like icing on the cake. It’s not required, but I feel like this really completes the entire setup.
The last thing I did was use a few apps to make this entire experience a tad nicer. First, I launched Hazel and added my YouTube
folder. I then created… many rules:
Kind
to Folder
and selected Run rules on folder contents
. This rule ensures every rule hereafter is run within all the folders contained in my main YouTube
folder. This is important because:Kind
to Folder
, and the Sub-file/folder Count
to 0
. I then Move
any matches to the Trash
. This is very important because:Name
to contains
the name of my subscription, e.g. MKBHD. I then used the Sort into subfolder
option to sort my videos into its own folder. The pattern I used was Subscriptions ▸ <name of subscription>
. Why do this? Because I don’t have time to watch TV all the time, and sometimes I want to binge through one channel’s output, and this makes that easier. After adding a rule for each of my subscriptions, I created my final rule:Recently Added
. Again, this rule is very simple. All it has is Kind
set to Movie
and it Sort[s] into subfolder
any matches to my folder called Recently Added
.Having this run 24/7 removes yet another cognitive weight from my life and just keeps things tidy. Work smarter not harder, right? And finally, on to the final step.
In Plex (you did download and install it, right?), I downloaded the YouTube-Agent.bundle plug-in and installed it per their installation instructions. This plug-in requires a bit of setup before you can take advantage of it. You have to create your own YouTube API key, which isn’t too tough, and each one of your movies needs to have the YouTube ID in its filename. Review my yt-dlp
command and you may notice I’ve added [%(id)s]
to my filename. This option is there to ensure YouTube-Agent.bundle
adds the correct metadata to my movies.
Finally, I created two libraries, one called Subscriptions
and the other called Recently Added
. I pointed each to its respective folder, and in the Advanced
section, I chose the YouTubeMovie
plug-in in the Agent
option. This is also where I added my API key.
If everything went well, then you truly have a (mostly) automated YouTube setup. I say mostly because I still have to add any ad hoc videos to my youtube.md
file, but it literally takes 2 seconds to do so and that’s the only actual work I have to do. For the most part, I haven’t had to troubleshoot this setup yet, but knowing the pace of technology, I will have to sometime in the future.
Until then, I’ve been really enjoying this setup. Dare I say, it feels a tad magical, and I love it. Maybe you will, too.
It was my birthday earlier this week. I’m closer to 40 now than I am to 30, and I don’t know how to feel about that yet. I usually don’t like celebrating my birthday, mostly because it wasn’t something I celebrated much growing up, but this birthday was different. I felt very loved and very lucky. I have good friends and a great mom. My friends bought me a cup of coffee—a black Americano, naturally—and a delicious and very filling vegan chili pie. My mom bought me a Bookshop gift card.
Books, coffee, and vegan food: that sums me up pretty well.
On Thursday, I donated two units of blood to the Red Cross. It was a Power Red Donation, and it was pretty slick. The guy who did the procedure on me had recently gone to San Diego with his wife for their honeymoon, so we talked about my hometown, the Padres, the Dodgers, and good Mexican food. The older I get the more amazed I am at how small the world feels sometimes.
I wished my mom and a few of my friends a Happy Mother’s Day today. I’m just now realizing that most of my good friends are mom’s, including my own. It makes sense: mom’s are the best.
Page 8 of 91