Monitor performance issues & errors in your code

#327: Little Automation Tools in Python Transcript

Recorded on Thursday, Jul 15, 2021.

00:00 You've heard me talk to a wide cast of people building amazing things with Python. Some of them are building bio reactors to remove carbon from the air with artificial intelligence and Python. Others are optimizing the aerodynamics and race strategy at the highest level of automobile racing. This episode is different. Rather than seeing how far we can push Python to the edges of technology, we're diving into the tiny Python applications that might never be released publicly, and yet can transform our day to day lives with simple automation on an individual level. We have 4 great guests here today, Rivers Cuomo, Jay Miller, Kim van Wyk, and Rusti Gregory. They'll each share a couple of apps and the underlying packages they use to build them. I know this will be a super motivational episode for many of you. And I hope that after listening, you'll transform something tedious and error prone in your life to an instantaneous button click solution with Python. This is 'Talk Python to Me' Episode 327 recorded July 15 2021.

01:12 Welcome to talk Python to me, a weekly podcast on Python, the language, the libraries, the ecosystem and the personalities. This is your host, Michael Kennedy, follow me on twitter where I'm @mkennedy and keep up with the show and listen to past episodes at '' and follow the show on Twitter via '@talkpython'. This episode is brought to you by 'Linode' & Us over at Talk Python Training and the transcripts are brought to you by 'AssemblyAI', please check out what we're offering during our segments. It really helps support the show, Rusty,Kim,Jay and Rivers. Welcome all of you to talk Python to me. Thanks. Great to be here. Thanks, thanks. Happy to be here. It's really excellent to have you here to share this topic. A lot of times I have people on the show like oh, here's how we built Instagram, or we're using this cool library to scale like the largest Django deployment or here's how I built Flask and, and how we're evolving it and or something like that in data science. And that's great. But I think so many people out there listening are like, Well, I'm not building those kinds of apps, I'm building something entirely different, or I don't build little things. And I think actually, that's where a lot of the magic is, for everyone out there listening, you know, we all have these things that are in our day to day. And it's just like, you know, that is I'm not looking forward to that, but so many times a couple hours of Python, or other coding and a little automation, and then that becomes automatic. And life is just, you know, it's so rewarding to do those little things. I am excited to share the ones that I did. They're incredibly simple. But they're they just make me smile so much as I do them. So really looking forward to doing that. But before we get into the apps in the details, you know, let's maybe go around the YouTube stream picture here and let you all quickly introduce yourself. Three, the four of you have been on the show before but just you know a quick introduction. Rusty, let's start with you.

02:57 Okay, I'll be I gave my long introduction last time. So I'll just say that I'm a reformed teacher. About two years ago, I or maybe three years ago, I started coding and then I had an opportunity to kind of become the data manager at my school district. So I'm trying to build pathways between all the various services that we use and keep our data clean.

03:16 And that's super cool. Because it's not like you had to leave the education space or the public school space. You just sort of transitioned into this world where you can take what you're really into and like, help everyone with it. Right? Yeah,

03:27 it was a great move. For me. I was actually trying to learn how to teach coding to the kids. And then I just really enjoyed it. So yeah, so it was a great to see more of that just just at the same time Big Data hit. So it was good.

03:38 Yeah. Fantastic. Jim,

03:39 if I can borrow a phrase from Rusty. I'm a reformed embedded software engineer. So moved from C a couple of years ago to doing many DevOps work for a financial services organization here in South Africa,

03:51 where I'm best. Yeah. Fantastic. And you also hosting the Ask me anything? Not long ago. Was there? Thank you for that. Yeah, that was great. Yes, it was. Not that long ago. Yeah. That was really good. Yeah. Yeah. It was fun. Jay. Hello, hello. I just saw you over on Python bytes not long ago, but happy to have you here.

04:06 Happy to be back. I will crip everyone and say I am also a reformed marketer, veteran, now developer advocate and spend a lot of my time just talking to the community and learning from folks that are a lot smarter than I am like the four people on this panel. Yeah, good

04:23 stuff with Elasticsearch and some cool database like things right. Absolutely. Yeah. Rivers, You first time on the show. Thank you so much for coming in. It's really great to have you here. Tell people real quickly about yourself.

04:33 My name is Rivers Cuomo, I'm the singer and songwriter for the band Weezer. Our first album came out in 94. And we've been touring and making records on and off ever since.

04:44 I'm such a fan of your music. It came out when I was in college, and I've been a fan of what you're doing longer than I've been a fan of Python, which is crazy. That's so awesome. So thank you for that.

04:53 Yeah, I'm a huge fan of your show. Michael I listen every morning and of course I've learned so much and gotten turned on to some So many cool packages. But also, it's just nice to get that human connection in the midst of a few hours of coding every morning to hear a theory. All you guys talking about, it's really warms the heart. Awesome.

05:13 Thank you. You know, I think a lot of people who have told me they listen to the show and some of the guests as well, they don't work in like a startup tech place environment, but being able to listen to podcasts like Talk Python to me and others, it kind of brings that community to them, even though they're not necessarily like everyday showing up with a group of people who would be that community.

05:34 Yeah, that's exactly my situation. I'm working on my own here. And I don't know anybody who is into coding. So it's great to know you.

05:42 Yeah. Awesome. Yeah, you as well. So, as you said, people will know you from Weezer. And that's amazing. But you are doing such cool stuff with automation, and Python and code. And so I think people are really going to be blown away by what you're doing as well. So I'm super excited to get into that, let's just sort of go down, we all put together a couple of things that we're working on in a shared doc here. And it looks like Rusty, I put you first. So Rusty, you want to kick us off with the first sort of automation thing that you built? Sure.

06:10 So when COVID hit, we had to change a lot of different things and you know, adjust like everybody else did in the world. And we send ended up sending out a lot of notifications from our school district when an infection would happen at a school and we'd have to notify people and it was this huge thing. And we're, you know, at the height, we're getting lots of these things a day. And so schools started to put the information up on their website, so that you could just go and refer to the website, instead of get a wall of text every time something happened. So my Superintendent came in and said, she wanted to put this dashboard up. And then she showed me some other schools that had done it. And I looked at what they were doing, and just knowing how the web works and schools work, I knew that somebody who's gonna have to update this information every single day or every other day on the website, it was something that could easily fall by the wayside. So I thought to myself, you know, who's going to be updating this and then she's like, don't worry about it, I'll update it. You know, you've got so much to worry about, like, that's not what you want your Superintendent doing, right? You updating the website, you know, once a day or whatever. So it's like, I should be able to handle this with Python somehow. So I hit read it. And I just asked kind of, you know, or Well, first off, I had to find out where she was getting information. So the health department put it up on the website, but it was a PDF, and I was like, Oh, that's crazy. Oh, God. Yeah. So I can't scrape that. So maybe I'll just update it every day. All right. So they read it. And I was like, is there a way to turn you know, a PDF into a CSV with Python, of course, there was. So about two or three different packages got recommended, I played around with them for about a half an hour. And this one called 'Tabula', which I wasn't crazy about because it depends on Java underneath. So it uses Java to kind of like recognize patterns on there, and it'll so it'll it'll turn your your PDF, pull out just the the Tabular data and stick it into a CSV for you. So I was able to just with a bit of requests go up, grab that every time save it process, it wrote a really gnarly little loop that finds my four schools, and then puts those into my own CSV. And then I use Python again, yeah, Yagmail to just send it to myself, I did it twice a day, because it was updated at different times. And then, on the other end, with a little JavaScript, I just went into my email, and I find that and I just update a Google Sheet that's embedded on the on the website. So there's a bunch of little parts on it. But literally, the Python was about 96 lines of code, go with comments and stuff and accomplish this. And

08:22 that's super cool. And it's really valuable, right? That if something like that gets missed, exactly, you know, it could make a big deal. Or it could be kind of some kind of outbreak.

08:30 Yeah. And I can apply that to just about, you know, to so many other things as well. So the time all the time I invested in learning how that wasn't, it was an afternoon, and I was able to figure that out and impress my immediate boss, which was really cool. He enjoys those types of things. So I was good.

08:45 I bet Paul out there in the live stream. Hey, Paul says I use Yag mail to automate sending out emails for the SciPy conference, very cool. Rivers, it sounds like you and Rusty , share some of the same tool said there like it turns with like web scraping PDFs, Google Sheets, that kind of stuff. Yeah, I

09:00 was just remembering. In fact, I emailed you a few years ago in desperation, because I was trying to get some data from our agents. They have a web service where they give you the artists, tons of details about their upcoming shows, attendance and tickets sold and gross income, all this stuff. So I wanted to get all that and I had to, I had to deal with Pete like it's rendered as a PDF. I made the mistake of going to stack overflow first I read it. And my question is getting all these down votes. So Oh, yeah. You've got to find time to Michael. Yeah. Yeah. Michael, help me out.

09:39 Yeah, that's awesome. I remember you were really frustrated because somehow the wrong information had been given to you when you showed up like this. This was supposed to be one hour and it's two hours and I was at the wrong Yeah, I just I could see him at I imagine you're like how do I get this table or, or this part of the information out of the PDF? And yeah, that was perfect. Yeah, but what does that package 'Yagmail' I think I think I ought to try that one. Yep.

09:59 Yep, 'yagmail'. It's really simple. The toughest part is going through the hoops with Google. But once you get your little file back from them, you can use it for everything. So very cool.

10:09 All right, thanks, Rusty . Kim, yours first ones up next,

10:13 just remind myself which one I wrote down is my first one. That was it. Yeah, this little one did, there's no link to it doesn't have a name or anything. It's just a little small script that one of the many that sits on my harddrive. And this I think, is really kind of an epitome of small time or very small Python writing small tool I wrote basically, as my the team, I work with a week there's about five or six of us, we kind of as agile as we need to be, which includes a Trello board, because we're no longer standing in front of a whiteboard in the office. We're all in our own homes. So basically tracking cards of what we're doing for the week. And we include in our team, people who have from day to day responsibilities for deployment to some of our environments that one of the guys will push changes to staging when a different guy was dangerous to our production environment. And then that thought kind of boring setup. But effectively, what it means is at the start of the week, I need to generate 10 columns. So who's doing what? So I used to get an email from one of our administrators to say, Here's the schedule for the week. You know, Bob's doing the staging on Monday and Fred's doing production on Tuesday. And I want to track those on my Trello board. And I reached the point where it shouldn't be a big deal. It took me about 10 minutes on Monday morning, I would make 10 cards and I'd write down Fred Monday, Bob Tuesday. But it was tedious. And it was fiddly. And I was putting it off. Because it was 10 minutes, I'd rather not spin and it's only 10 minutes. But still it was irritating into that this kind of Yeah, not the thing I wanted to do on Monday morning. So basically, I have sitting on my harddrive about 150 lines of Python purely to to ask me interrogate when I run it, who's doing what or basically I've now got it set up. So this is for staging on Monday, which of these six people is the deployer, then we'll just repeat for each of those cards. And that was literally it takes me 20 seconds to run it. Now I just have to read the email I get on Monday morning to say, you know who's doing when, and then it all does it for me. And it's incredibly daft. I mean, I saved myself 10 minutes a week, it's no big deal. But I also saved myself in the rotation and stretches that little edge. And that's the only thing I really love about a really small Python tool. It took me a couple hours to write. So it's not like it costs the company days of my time. Yeah,

12:17 yeah, I probably saved on some mistake or some forgotten Exactly, yeah. Yeah. What's the Trello communication, bit, that's all REST API

12:24 on Trello. So like, most similar REST API services, you go along to your Trello's side, you identify yourself, you get back a token from them. And then that's all API queries. So the 150 lines of Python about 40 are just config files. For me mapping the names of my team members and various bits of information about the trailer to ID numbers. I have'nt seen back to Trello. Yes, very cool even less actual code. That's fantastic.

12:47 So I don't know how we managed to pull this together. And when you all arrived for the meeting, but we're exactly sort of in the loop of the same order in the docs. So awesome Jay

12:58 your next that'll keep it easy. Awesome. Well, as I mentioned before, I work as a developer advocate, and I work for elastic. We do search stuff and search things. I'm sure any of my co workers listening, like that's it. That's all you're gonna say. Yes. But one of the things that we have done because we do a lot of visualization as we build dashboards for like everything, there's so many dashboards, I have actually built a series of my own set of dashboards using one of my new favorite tools called Ilan, which is like a Pandas like data framing tool, but for Elasticsearch and it's great because it's designed to work with pandas, but it's also designed to work like Pandas. So if you've ever done any type of data, framing, any type of dealing with big numbers, big any type of information like that, and you're used to those commands, you can just try them and usually they work and what I've learned is Ilan is amazing for like parsing CSV files, parsing JSON files, you don't have to do like the for or with open whatever the CSV file is as treater and like all this, like that whole pattern, you just do. You know, in pandas, you would just do pandas read CSV or an Ilan, you and say, Ilan, CSV to Ilan, and then it just loads that information into your database, no questions asked. And it just go. That's super cool.

14:19 So instead of trying to work with it directly with pandas, you put it into the database. So you can do queries and reporting and stuff like that driven off of it. Right,

14:26 exactly. Instead of like having a database company, all of the mutations that you find exactly what you need, you just do a general elastic search query. And then it shows you the information you're looking for, but in like a data frame format, which is sweet, and I've used that for a couple of projects. I built a tool in react Sorry, I know it's a Python podcast, but it's called "". I do a lot of diversity work in my job connecting with organizations that work with underrepresented folks. And this has been a way for me to collect like a At this point, like over 500 different organizations that work with underrepresented folks in tech and put it in like its own little mini search engine, its own like small meetup and updating it. I actually just use flask, which I think is funny because you have that is not it. I wish that was it. "". I was like their design work much better than mine.

15:23 There we go. Yeah.

15:25 Man, your message is clean and simple. Yeah.

15:29 So you can just search for it and like, but yeah, like, it's cool that like, you can just use things like flask on the back end and build your own little admin portal. And you don't have to worry about spinning up a server or like being worried that someone's gonna try to brute force your back end or anything, you're just like, oh, let me start my flask engine run. It's sending REST API calls to Elastic Search. And then it just works, which is great. That's really cool.

15:55 This portion of "Talk Python to Me" is sponsored by Linode. Visit ''. To see why Linode has been voted the top infrastructure as a service provider by both G2 and TrustRadius. From their award winning support, which is offered 24/7, 365 to every level of user, the ease of use and setup. It's clear why developers have been trusting Linode for projects both big and small, since 2003. deploy your entire application stack with all the nodes one click app marketplace, or build it all from scratch and manage everything yourself with supported centralized tools like Terraform. The Linode offers the best price performance value for all compute instances, including GPUs, as well as block storage Kubernetes. And their upcoming Bare Metal release. Linode makes cloud computing fast, simple and affordable, allowing you to focus on your projects, not your infrastructure, visit ''. and sign up with your Google account, your GitHub account or your email address. And you'll get $100 in credit, as ''. Or just click the link in your podcast player show notes. And thank them for supporting talk Python. I think this whole "" places is really cool. So the idea is basically you're trying to create groups of that people can reach out to you because if you see people like you, you feel way more like you should be part of that community right way more part of technology or whatever.

17:23 Just try it out. Just type in Portland and hit Search and see what comes up like there should be groups in Portland, there'll definitely be groups.

17:30 Yeah. Oh, yeah. PyLadies, Djacks in technologies, Django girls rolling more. There's more. Yeah, there you go. Oh, yeah,

17:40 This is less than UI. So this is all running react. But the way that I update this, like if someone messaged me and says, Oh, hey, I want my my organization added to this list, I just have a flask site that I just spin up locally on my machine that sends all that like, it's just a quick form with you.

17:55 And then it sends all the data to my server in elastic cloud. And then it's up on the website instantly, I was just going to point out one of the powerful things that you can do that I'd only occurred to me much later than I wish it had done is a very fast way to get a gooey tool for something you're only ever going to use for yourself is something like Flask or Django or something like that doesn't have to be pretty, it doesn't have to look good. The only place it's ever going to run is on your own machine. But you get all the HTML, gooey stuff, basically, for free. You're not writing anything, you're not writing a desktop for buttons to click it just firing up some HTML. So that's actually quite a useful thing to do. You don't have to worry about deployment, there's no security issues, etc. It never leaves your hard drive. But yeah,

18:33 yeah, absolutely. You know, another one. That's pretty good at the 'Anvil'. Yeah, in terms of I was gonna want something probably misspelling. Again, we're watching Mike Google, which is, yeah, there we go. There we go. I thought that's what I typed. But that's okay. It's interesting, because you write Python, even on the front end, and it runs in your browser, but it takes care of the hosting. And yeah, what you don't have to share it publicly. So it's kind of you know, if you want to have a semi hosted one, that's also a pretty decent option. But yeah, give me right that if you're looking for a UI, sometimes the right thing might be just a private flask app for you. Or maybe just for like your people who are going to work with behind the scenes. It doesn't have to be pretty.

19:08 Yeah, it doesn't have to be pretty, you're not selling it or anything. It has all the buttons in the right places, or for that matter if it's the only people you know, they can ask you What do I do? And you can tell them, it doesn't have to even be particularly attractive or easy to use if it gets the job done.

19:20 Yeah, absolutely. Absolutely. Very cool. All right. Thanks. Thanks, Jay. That's a good one Rivers, what's the first one you want to share?

19:26 first one I want to share is an app called 'demolisher'. And I made this because when I'm writing songs, I very often like to Frankenstein, unrelated bits together, that ends up sounding like a coherent song. But for me, it feels like the song feels fresher when I have these unrelated bits, where when I was writing each bit, it was like this is the only thing in my mind. I'm just making this as good as possible. So I stick the few of those together and it turns into a song. However, when I when I'm looking for a bit to attach to the previous bit, I usually have some idea of What I'm looking for,

20:01 right? They can just be random combination of different types of music or riffs.

20:06 Yeah, at some point, even if it's a very contrasting bit, it's still something somewhat specific. So I don't want to have to look through all 1500 of my old unused demos. So I needed some kind of filter. There's a Windows out called 'MP3TAG', which I highly recommend for, for tagging, music files, there's a search bar in there. And I'm not sure exactly what the languages for that search where it's some kind of sequel looking thing. But I would write these filter queries. And they'd get quite complicated and long and like all these nests with parentheses, there's the filter bar down at the very bottom gotcha, I think I was using this app in a way that most people weren't, because my filters were just gigantic and unmanageable. I wrote this this app called demolisher, which is tkinter window with a bunch of switches that you set all the switches, and then you hit a filter, and it will copy this long string into that filter bar there. And you end up with the demos that only match the criteria you're looking for.

21:13 Oh, how interesting. So it basically develops this the SQL query type thing? Yeah. For this app, is it okay, if I put it up on the screen? Do you mind the screenshot?

21:22 Oh, yeah, sure. There we go. I don't know if you can see, but there's just a bunch of switches here. So

21:27 tell us about the switches. I'm not very musical. So you could help me out here

21:31 on the far right, this is pretty easy to understand. It's just a range of BPM, I often I'm looking for pretty specific BPM for a bit to Frankenstein in and then below the BPM range, you see like a more human readable version of the filter string that this app has produced. So then each column to the left, there is a different parameter, far left, I can select which folder I want to select from or not select from.

21:59 So you've got things like feel section, masterpiece mode, melody,

22:05 some of these you guys would probably recognize, but others are just particular to me. But there are different tags I put on my demo. Genesis, for example, on the far right, that's how I started writing the song, whether I started on a piano, or started with a lyric and then piano or just started with lyrics, and so on. Because I found that those are useful tags, they kind of set the direction of how that little composition is going to go.

22:29 This reminds me of like, like, almost like a Moog synthesizer, like those giant patch panels you see in studios were just like, I need to find the perfect sound. Let me just unplug this wire, plug it in over here and see what happens. And then it's like that, but developing like a query for the right track that you're at. That's all your

22:46 own stuff as well and intensely personal, because you built it exactly to your needs. So very neat. Yeah.

22:51 And it's quite easy to add or remove parameters. There's a file in this package called sections. And each section is one of these columns. So it's basically just the dictionary. That is so cool. works perfectly fine. Yeah. Excellent. I love that there's a field there like I would add fiddly to think I've ever tried to do. That's how it always feels. I think you have the poetry guy on the podcast. So I've just tried to start converting a bunch of these to real packages. And then I could put them up on GitHub. So other mp3 tag users could download this and and use it themselves.

23:28 Oh, yeah, that'd be really neat. And maybe they can add some extra features and stuff as well. Yeah, yeah. I love this. I love how you brought all this stuff together. And it's just, it's so exactly what you need to make your life better. And like you said, you had 1000s of these demos and these pieces you want to bring together and it's just such a challenging format to combined. And then here's how you just bring it all together. Right?

23:50 Yeah. So typically, I'll end up with a it'll return about 10 demos that are, you know, very likely to work for what I'm looking for. And then I just picked my favorite one.

23:59 Yeah, fantastic. Can you share any of the songs that maybe you sort of inspired to you created through this thing?

24:05 Well, probably not anything you guys would know, because this is only I've only been using this the last few years. And sadly, none of those songs have become massively well known. So like, if you go back to the old Weezer classics, I was cutting and pasting, but I didn't have 1500 demos back then it was just you know,

24:24 I had a cassette tape, I could look through awesome. the live stream Zacker the Hacker nice username there. So if I use this, and it made us came up with a search, and it didn't return a sound, I couldn't help but to see that as a challenge to myself to come up with a sound that matched that query. That's a great idea.

24:43 random things and see what comes up and then from those searches, just notice, one of the things I think is very kind of recall about your approach to rivers, particularly in a small tool approaches you didn't even sit down and write yourself a replacement, mp3 file player or what have you. You're quite happy with the two of you here, but Once you have the filter query, you're quite happy with the existing tool to find them and play them and so forth. So you just write yourself a filter maker. Basically, there's a, there can be a strong temptation, or if he's I would be tempted to go too far, and then throw in foul playing and media playback and so forth. And you don't need any of that. You've got it too, right. You just need something to make you a filter. Yeah, yeah. Yeah. Good point.

25:17 Yeah, I was talking to Matthew Rocklin from Dask and 'Coil' a little while ago. And he said that they have this interesting philosophy, I have probably misquoted just a little bit but something of the principle of minimum or minimal innovation, or like, what is the least thing we can introduce? And what is, what other pieces can we combine that everyone is already using? And knowing about and yeah, I think this sort of matches that. Oh,

25:42 so I should add that one of the packages I use then is called py win auto. So when I start demolisher. The first thing it does is it 'pywin auto' opens up the mp3 tag Windows app. And then when I'm done with the creating the filter, 'pywinauto' copies and pastes it into the filter bar on mp3 tag, oh, how cool.

26:04 Yeah, so basically, the use case is you import the application from it, you can tell it to start some EXE on Windows, and then just tell it to start typing. He's into it. Yeah. It's awesome. It's very cool. It's a really cool way to combine. Yeah, yeah. Fantastic.

26:20 If I can just maybe make a note, you've reminded me about "Pywinauto", and I'd forgotten about a career episode from my career of 10 years plus ago, 'pywinauto' is also very useful if anybody's looking for well, exactly what does windows automation, what the kind of thing I'm thinking of is that more than once, in my previous work, we got the tools custom made by the supplier, a particular vendor in and somebody was asked to knock together in a day. So it was terrible to use, you have to click 50 buttons to get what you wanted, it didn't remember any settings, every time you fired it up, you had to click all the boxes, again, for exactly what you need for your output. And it also means your factory work you wanted as automated as possible, you want the soul to be running as part of a bigger stream of work. And you, you can't really say well do all these automated tasks, then send somebody to the computer, take this piece of paper, click these five or 15 sections, and then take the resulting file. And 'pywinauto' was fantastic for that kind of thing. Because you've got I actually wrote some Python basically remembered what the tool should be set to do, by as the tool makes those settings, runs it and grabs the resulting file.

27:20 Yeah, that's super neat. Because if you want to automate something on the web, you could use something like Selenium. But if you want to automate, like a custom VB 6 app that somebody wrote, 20 years ago, there's no API. Well, exactly. Yeah. And when you open these tools

27:31 up these things like, you know, you need to tick a box 27. And, you know, drop down to this. It's not, it's like not they haven't been designed to be particularly well written. But the 'pywinauto' doesn't care it's happy enough to use dodgy variable names and so forth. Yeah.

27:45 Yeah, for sure.

27:46 Yeah. Because a lot of folks that get their Python start doing little like computer automation bets like that. So I think having those tools like one, like you said, starting out, it's never going to be perfect. I mean, I think probably the hardest part is when you show people code you've written and they go, that's not pythonic. Well, for stuff like this, it's probably not going to be because it's you're not working in Python, you're just using Python to work in something else. And it allows people to make messy code and just figure it out and hack at it. And then over time, you just get better as you get it until your code does start to look more pythonic.

28:23 I think Exactly. Yeah. On one hand, you have pythonic, on the other hand, is I pressed a button and it happened automatically. So I when

28:29 the toughest parts about getting people to understand you know how to get into Python is you don't really know the little tasks that you can do that you can solve with it until you get in and you can do a few things. So little things like that open the door for you.

28:40 Yeah, just like a comment on Livestream. Brian has never heard of 'pywinauto'. This has just opened a lot of quasi RPA doors. For me. Fantastic. Alright, so I wanted to talk about one as well. So I'm going to throw out this one that I have to do, so, over on the course website, we have literally 1000s of videos. And these are MP4's. There's a whole bunch of really cool automation about like geo distributed in them and all sorts of stuff that I wrote, during a break at my hotel at PyCon one year when I got caught. I needed just a break from humanity. But the thing I wanted to highlight is I end up with a folder full of folders will have hundreds of MP fours and I need to come up with some way to import those into the database. And I was going through bigger on how long is this video, I'd go in my Mac finder as hard as three minutes and 20 seconds. So what is that that's 200 seconds. And I would put that into the database and the file name is this and that would do it again and again. And after a couple of those and a couple of mistakes and similar stuff with the podcast, I would just go crazy. I'm like I can't take this. Maybe I have to hire somebody because I make too many mistakes. And it's not useful for me to spend so much time converting minutes and seconds, two seconds and trying to do this. So what I ended up doing is writing a little script I just go to a directory type JSON to find the videos I get a giant JSON document that I can just import into MongoDB Boom, and it goes through. And it finds it does two things that are really fun. One is it goes through and it uses a little bit like what rivers was talking about uses FF probe, not the same thing. But it goes in and figures out information about the audio stream, or the video stream. And it'll give me back the time and information. And the way it works is I'm not using some API for this, I'm actually using sub process. And then there's an output format for JSON. And I just capture the standard out, and then read it into a Python dictionary. And then boom, I have all that information. It's as if FFmpeg had an API for Python. So that's really fun. And then I want to not bother to scroll back and copy it. So I use 'pyperclip', I was wondering how you're gonna say that. I've used it, quite hard to pronounce it. And so then I just I generate this huge thing, this composition of all these video files, and then I just use pyperclip to copy it to the clipboard. And then I just paste it in to the tool that is editing the JSON and like, does all the important stuff, and boom, off it goes. So real simple, but this thing was like, it's no big deal to say I just want to, you know, sort of get the right file name relative to each other and get the time and convert it. But boy, did it save me a lot of frustration. So I want to recommend those two things, especially pyperclip, that's a cool one.

31:14 Yeah, pyperclip is very nifty. The other thing I would just pick up from what you said they've Michael is the point that you don't have to use Python to solve all the problems. If If probe exists, it's perfectly good at getting you the data you want. subprocesses are perfectly reasonable way, let the expert to get you to do the difficult thing. If If probes already on your system, it knows how to get to the data, you want to get to the data and the format you can use just use it to do it. You don't have to fight them to do everything perfectly. There's lots of very useful tools out there that are literally using Python to glue three other other tools together. And that's fine. And that works perfectly.

31:46 It works great. I'm sure you see this a lot in your world where there's a lot of sort of stuff that is more like desktop apps or CLI apps meant to automate things. But maybe there's not a programming API for Python to it , it is often that kind of thing. Yeah, yeah. Fantastic. All right. I think we've looped around our group here. So rusty, what I'm picking up on the next thing you wanted to share?

32:07 Yeah. So the next thing I needed to do at work was that I was going to automate was, we have to do state reporting. And it's this big year long thing. And it's basically what's caused my position to pop up all over the state. So it's to keep giving the state information about our students and what's going on all the time. And it was a horrible process that they decided to automate. It used to be people filling out papers and sending it in, and then all of a sudden, it just became this computer thing. And then computer people had to do it. But it really wasn't their area of expertise before. So we have to send our files and CSV files in and then they get checked, we get errors back that we have to fix that and do whatever. So we're given an automated way to do it. So if we can get the files there overnight, we get the time slot, and then we get everything back. But eventually these errors creep in. It's a flawed system. And they know it's flawed. But since it's a government agency, there's like nothing that can be done about it for multiple years, or whatever. So we're looking something different to kind of combat that. Basically, I would get back errors every day. And then I would have to go and hunt them down. They wouldn't actually be errors that be false errors. Oh, man. So what you have to do is upload three sets of blanks, and then boom, then you can start over and that now your files are clean, and they can it can work. So what I just did was I was like, well, we only have the one automated spot. So I whipped up a little program in selenium, that goes in and submits my blinks every night, at nine o'clock at night. So I'm always working off of the clean files. Maybe that's something I would never think of to do. But I could do it's it's a bit like Kim's project, you know, I could have done that take five minutes at the end of every night and submitted my blanks and then let everything else happen afterwards. But it just seemed really easy for me to go ahead. It was a it was a great puzzle to find out, you know how to navigate around inside Selenium inside this older looking website. But it was a it was a great solution for me. And I don't really get the errors anymore. And because we can address things, you know, that day, it's really improved my job tremendously. So I'd say it takes I would say it saves me hours a week, just being able to have this little tool automated. Fantastic to just like reset

34:06 the errors. Yep. Talk Python to Me is partially supported by our training courses. Do you want to learn Python, but you can't bear to subscribe to yet another service. At Talk Python Training we hate subscriptions to that's where our course bundle gives you full access to the entire library of courses. But one fair price. That's right, with the course bundle, you save 70% off the full price of our courses, and you own them all forever. That includes courses published at the time of the purchase, as well as courses released within about a year of the bundle so stop subscribing and start learning at "". So I would say Selenium is the 'pywinauto' but for the web, right? The equivalent of that is such an amazing tool for that kind of automation. Yeah, because we've got things like beautifulsoup we've got requests and scrapey and stuff but they don't so easily. scarer let me go over here, log in, you know, enter my username and password here, click the button called login, then go to this page and then do that thing. It's It's amazing, right? I think that's definitely one of the secrets, select these 10 files and

35:13 really good. That was one of the reasons why, you know, with my previous one, the dashboards, I had to create that web app, that simple web app to like upload stuff, because at first my first thought was like, well, I'll just go to the website and scrape it with like beautifulsoup. But then when you start getting like JavaScript frameworks and things like that, that come into play, you're just you can't get that

35:35 curly braces that are just where the data would go. Yeah,

35:38 I cycle it in my spare time. So they came up with these velo sambas from the Adidas, which were like soccer shoes, but they look like soccer shoes, which I was like instantly alert with, they sold out within seconds every time they put a new batch up. So I actually use Selenium and I kind of automated check every three hours to kind of go in and scrape it and send me an email. If my size was then and I eventually got him. But yeah, so that it was a really cool little fun project that I just kind of used everything I learned on this to go ahead and make that happen. I thought I should do that for they, they build everything out of JavaScript. So it's really hard to get so you couldn't do it with beautifulsoup. I had to go in and grab it this way.

36:15 Yeah, yeah. Very cool. Rivers. Did you use Selenium? When you were getting that schedule for your when you're touring?

36:21 I definitely use Selenium a lot. I think I use it in the app. I'm going to mention next. I think so.

36:29 Yeah, that's awesome.

36:31 Yeah. When I was trying to scrape from our agents web service, I was trying to use Selenium. Yeah, very cool.

36:37 I kind of wanted to just mention one other thing, Michael, I had the mic here, just the way that I've been automating things, I use a lot of Raspberry Pi's in the early days to use crown jobs to kind of fire these off, because I know that's something that I had trouble figuring out when I wanted to start automating things was how to make it happen when you want it. And I had a guy that was a heavy Linux guy was able to help me figure out, you know, kind of how to do that with cron jobs and things then I moved on to an app on my Mac called Launch Control, that helps create demons and things like that, which is usually I found really helpful. So those are some great tools to help make these things happen on the time that you want it. Yeah,

37:13 that's really neat. on my Mac, I install stuff with homebrew. And a lot of times you can install it as a service as well. And it behind the scenes will basically run the Launch Control stuff, install something like MongoDB or something on your Mac, which gives you slightly simpler commands to do it. But it's got to have been like lined up just like that. That's cool. Now, this is actually quite dandy. The other thing that is maybe worth looking at, if you wanted to do that kind of automation for stuff that's not just on your own machine, the GitHub actions, which are not particularly familiar with, oh yeah itself has got some very powerful, effectively free to use until you get quite heavily involved, CI and I've forgotten what CI stands for right now.

37:49 Continuous integration, that's the word but really, it's just automation at a particular time do this thing like that can be quite powerful.

37:55 I really want to try and figure this out. Because what I want to do is I put everything on GitHub, and then I just you know, get up pull it on the on the road computer. That's actually that's on all the time, but I want to be able to figure out how to make it update when I when you know when I push, just make it auto updates. That should be fairly does whatever he says, again, my

38:13 my GitHub action experiences not great, but certainly if you can do it on Git lab, I'm sure you can do the CI tools are all geared around this guy. I've heard whispers but something's changed in the chatter do something.

38:24 Yeah. Let's chat, Rusty, because my topic is actually designed for git hub actions

38:29 fantastic. I'm glad I shaved today. Yeah,

38:34 yeah, I can I put my DevOps on that, that ci kind of stuff is spreading better for us, it's it makes a heck of a difference. Because it means when the developers make changes to the code, they don't have to know how to go about and deploy things or build things and so forth. It just happens. It basically happens folding,

38:51 that's fantastic. I also set up an automation. So if I get pushed to a certain branch, I'll just automatically do a zero downtime, redeploy of like the Talk Python Training, yeah, infrastructure and stuff like that, which it's so fantastic. Rivers, you mentioned source code before you guys are using GitHub for your kind of stuff is there like source control plus music going on here?

39:11 That's one of my many weaknesses, because I'm usually just working on my own, I haven't had much use for that sort of collaboration tool. I do have my own website. So it does go through GitHub. I've recently started volunteering, like a volunteer coder with this other group of people. And I'm gonna have to learn a lot more this git of these git tools, push pull all that.

39:35 Once you have a need for it. I think it's easier to learn, you know, until then, it's all just something you hear about, but then it's like, oh, now I need this. Now I can dig in and figure it out.

39:44 Yeah, if I can basically have one suggestion. If you are currently making changes to your software by making final final.version.2 kinds of files on your hard drive, look into Visual control doesn't have to be good, but Git as effectively won this argument. It really is by far the the most well used one Even if you never collaborate with it, just the ability to use a version control system to basically see what your code looked like yesterday, or when you made the last, the change, you made three changes ago, compare them to each other, those kinds of things. Until you have that capacity, you don't really kind of think about how you thought it would be once you are able to do it, you cannot really imagine not being able to do it.

40:21 You're saying, even if I'm not collaborating with anyone, it's still very useful. See, do so involve give? Yeah,

40:28 I think I've been liberated in my personal projects once with someone, but I wouldn't dream of not using something like Git for anything I've ever written. Just because I'm not I know, I'm not going to remember, I'll have this vague memory that a week ago, I made some change that actually would be useful to have back now. And it's got that kind of history. It'll show me that a week ago, I made a push that said, you know, tweaks the prognosticator knob or something like that. And I'll go and look at that and do a comparison against what I've got. Now.

40:54 That sounds great. I've been using the the poor man's version control, which is by Dropbox history. I just saw the state of the folder three months ago.

41:05 Yeah, that is super handy. But like, just the ability to see like, I want to see how it was two weeks ago when it worked. Like I expected, and now it doesn't anymore. Tell me? Why did I break it? What did I do? Right? And then you don't make it public? Right? No, definitely. No, no, definitely not. Yeah, yeah. I feel like we all have been there with Zack the hacker, like once you've accidentally lost eight hours worth of work because of misunderstanding a get you probably that's when you

41:31 I've talked on the data I've lost from bad git commands

41:35 or because you didn't commit something. And you really, really wish you did. Yeah, if we had more time and some beers, I would definitely be able to tell some good horror stories of that. But I think it's Kim, you're up next on the sharing. All right,

41:48 I just wanted to just finish off that git discussion. Just another just to comment on what you were saying there rivers in terms of making it public, git itself never needs to necessarily needs to leave your hard drive, you could run git entirely locally, if you want to do and it's still useful as a version control system. GitHub is just a publicly accessible Git tool. And it's not the only one Git lab exists as well. But even then, you don't have to share anything, you can do it all privately. And as long as you're the only person overseeing it, that is still useful, right?

42:17 I never do that. Right? You could just do get in it and just save it there. Right? Is something you could do if you wanted to. Yeah, Yeah, I did. If it were in Dropbox, it'd be backed up even Yeah, exactly.

42:26 A lot of us are using git lab, git lab and GitHub as off site backups of our files, not necessarily to collaborate with anyone on them. Oh, yeah, that's absolutely true. In my case, we're back to PDFs, actually, and manipulating the data in them, although not csvs. This time. The second little tool I wanted to talk about was, again, doesn't have a name. And in fact, this is ties into a previous example, this, this is in my Git lab. But it's one of my private GitHub repos, because it involves some kind of data that the world doesn't need to see, that has basically, my wife and several other colleagues regularly receive large PDF documents, and she's in the financial services industry, that's got 60 to 70 people's account details in them. So it's three, three pages per person. So you could get a 200 page document. And they then basically need to split those up and send them to each of the individual recipients. And similar to what you were saying earlier, Rusty you get your CSV doctor and a PDF be much more convenient if you could get that CSV directly, in this case would be much more convenient if you could get 70 people separate files, but that's just not how they come. It's just that there is no, you can't go to the provider generally and say do something else, you know, what you get is what you get. And from various cries of anguish on my life of hours of doing this, and it's error prone and you opening up a PDF GUI tool, selecting the first three pages and saying save these three years, this person's name, then the next three and save these three is this person's name, that kind of thing. It was actually surprisingly easy to use some Python to write them a tool to make life a lot easier on their side, which effectively opened the PDF. And I had a comment of the name of it. What did I use 'PyMuPDF', which I had never heard of before. I said, You've never heard of that either. I don't know I in fact, I haven't looked at it. Since I wrote this thing. I forgotten what it was called. It used to be called Fitz. There's something called fitz if it said, which this has become, which is what was confusing because Fitz, what's his what's in my poetry history in my project at amo file, and this is actually a it's a remarkable project, because you split up everything in in your PDF, you can basically access all the text fields. And once I done that, it was a lot of kind of trial and error, I split up each page, printed out all the fields until it looked like the one I wanted. And when I had that now, it's just a simple loop that goes through each page. And if the page happens to have the details of an account holder on it, then that's a new document. Take the ones I've seen before then and save those three pages or four pages as the person's name that I found in that PDF and repeat and within seconds, it's spitting out in 70. pdf files with automated names, so maybe not the most best way to do it. If particularly if you've got as is common in South Africa, two or three surname, two or three words and you'll soon It's trying to be smart divided. But ultimately, it's easy enough to identify who's due the file belongs to. And that was saving hours and hours on of time.

45:08 Yeah. And that's really rough error prone work that you go to this big PDF and break it up PDFs.

45:15 Yeah, once you use a tool like primary, if you break the PDF app, I mean, it's all the little bits of text as a full stop here. And there's two commas in separate text fields, they look perfectly fine when rendered, but when broken up that terrible data format. But the beauty is if for work like this, if a tool made it in the first place, it's likely to be consistent enough that you can break it up and expect to find the same data in the same places because it wasn't written by human in the first place. Yeah,

45:40 yeah. That's super neat. Another thing you mentioned in the notes is

45:44 gooey, gooey. Yes, Gooey is a beautiful thing.

45:47 I think it was really interesting.

45:49 I vaguely mentioned I vaguely recall living now. And then on python bites, he brought them up briefly, you don't discuss gooeys much, but every now gooeys magnificant. They come in waves. Yeah.

46:02 Jimmy g o e y as an ooey. gooey by creates a G UI GUI for applications.

46:09 What I really like about gooey is that when I develop things, I'm very much a learning space developer these days, I don't really want to be developing a GUI app at all, if I can avoid command line is perfectly fine for what I want. So I wrote this tool as a command line tool, and then just basically attached gooey to it. And then I think two or three lines of code, I think it's really just a gooey decorator on one of my functions. It produces wonders. If you guys are watching the people on the livestream, you can have this little bit gooey, just makes really basic looking gooeys in form layout that pretty much taking every option you could give on the command line.

46:43 Yeah, if you wanted to create an app that would come up and show like a UI that would have little textfield or even dropdowns or stuff exactly would be the command line arguments like this. Is it and then you package it up with Py2 installers? All right. That's what I did. Yeah, well, py installer,

46:57 I think I saw Yeah, sorry. You're thinking pi two, etc, perhaps, which is I'm thinking pi two. So pi installers is beautiful. So with a bit of I wrote the code, I got it working in the command line, I was happy with it, attached gooey to it. And suddenly I have a gooey, which not isn't a Windows or anything, it works just fine on a Linux box, too. And then py installer to make any exe and I can hand the tool over to somebody else. And they don't know Python, they need not know installation expertise, I'm certainly not going to be able to explain to people who aren't in the technical lead industry, how to open a command prompt on your Windows machine, find where you put this file and then give it command line arguments that that's not reasonable,

47:34 right? Oh, yeah. And also set up a virtual environment. Make sure exactly. Install the requirements, like this is not gonna fly now. Exactly. Like why did you not build me an app

47:43 even if it exceeds its distribution level? I mean, you can make any use that's come on by No need, but no one's going to want to use that. Unless like me now for sure. You prefer not to ever use the mouse. But then most people aren't like me. They wanted to. They understand on the screen. So gooey is beautiful for that. Yeah.

47:57 Yeah, absolutely. That's awesome. Thanks for sharing that. All right, couple livestream comments all throughout here. But what once worked for almost like three weeks on a project and a company that had commissioned me, then the server crashed. My backup got fried, and I lost everything. Yeah, so good reason. So yeah, I've been there. good reason to put stuff up on maybe like GitHub private repos, or something like that. And then also reginal Davis came here to share love to my guy, J. Hey, original. Thanks for being here with all of us. Let's see. So now you're up next Jay. Awesome. So

48:28 like, most of us haven't, at some point in our lives, I built my own website, I would say I don't think the show isn't gonna be sponsored by like Squarespace or anything as it might because I'm gonna, I'm gonna give you the perfect.

48:47 So I built my site, I made the static site generator. And one of the things that my brain is kind of buzzing right now because I actually just launched a new podcast on relay FM called 'Conduit' and like the first episode went live the same time this live stream did. So there's like a bunch of stuff happening in my head. But I say all of that to mention that when you run your own site and you're doing stuff on like other people's podcasts and other people's sites and things like that, and you're doing it consistently, you always forget to put it on your website. So I built a small tool from my little static site generator that uses feed parser to just check the RSS feeds for the shows that I do regularly and then check for certain information if I'm a guest. Like if I'm just a regular guests it'll just check to see if my guests if it's there, then it'll it'll create the blog post for me using the summary for the show. So now I do a show every Tuesday I do you know conduit it's going to be bi weekly. I'm a guest on another show once a month and every once in a while Mike calls me to give me on here to guess share Python tricks and stuff. But I can have all of that running and just have a cron job for through GitHub actions that checks all of these RSS feeds every, you know, six hours or so. And it's perfectly free perfectly within the realm of it. And I don't know, it's just one of those things. It's like I love the idea of taking RSS, which is an amazing but often forgotten format, and just say, let me parse this data, because it, it has a very defined schema on it. And I mean, I love data. And I love data that's well defined. So that's kind of my tool. And feed parser is kind of the thing that that really makes that happen in conjunction with GitHub action

50:38 feed partner of ours are super neat. If you're working with some kind of RSS feed, you could approach it from a like, ground up thing, I'm going to use requests, and I'm going to use elementary and do my XPath queries, you're like, Whoa, but it has just this format, right? So you could use feeds parser. And it just turns us into like a dictionary of dictionaries, which is so much nicer. Yeah. So you don't have to worry about the RSS format. Yeah, it's a quick and easy one. So it's a nice example of taking a higher level Python library, you know, maybe a good place to look would be awesome Python or something like that to go. Instead of just saying, I'm going to start from scratch, you're like, Okay, well, I'm gonna go over here and find the audio section. And then over here, I want to do like lib Rossa for the audio and music analysis. And so we're gonna go with that, and then like, see if that's gonna solve my problem, right? So I'm trying to start with something higher level, you know, something that I forgot. Now this reminds me, I was going to ask you about, have you done anything with 'FoxDot' no. So with FoxDot, basically, you can write little tiny Python things and build up like almost like a growing symphony of times. It's super, super interesting. This like the sort of interactive and not quite IDE like repple. For music, it's something pretty interesting for making music. Yeah, for making for like live performance. So you write these little tiny Python elements to like change the tempo, or bring in like a background drum or like now I want this, this sort of bass guitar to come in and add to it and the performances of it are really, really interesting. I'll check it out.

52:08 I think GitHub universe use this for like their intro this year. Like they had a live DJ that was like writing code to make the actual music live like so now, DJ sets are being controlled via Python. I love that.

52:23 It's fantastic. Yeah, love it.

52:25 Remember, get the end of the 2020 Python day conference, which I was attending was purely online, there was a DJ set by two Brazilian chaps his name I forgotten, I can look up who were also doing basically programmatically controlled with these generated music similar to this. It's actually quite an interesting idea. This is

52:42 something that kind of builds up over like 10 15 minutes, but it's really neat if you just want to like have something in the background, but the fact that the way they do it is really impressive. Yeah, cool. Rivers got a quick shout out in the live stream there. I love rivers. You're pretty epic. The Sierra dm says, awesome. Definitely. We all agree. Speaking of rivers, I think you're next and before we move on, just Jake, congrats on the podcasts. That's cool. I'm already subscribed. Alright, Rivers here. Next,

53:05 Michael hearing. You mentioned librosa. In FF probe reminded me that to maintain the tags of all those 1500 demos, I use a fantastic Python package called 'eyed3'. Oh, yeah. Which makes use of FF probe in lib, Rosa. So you know, every night, my program will run. And using 'eyed3', it opens up the tags of all those files, and does a ton of maintenance. I'll access spreadsheets of my my managers. See what what comments they've left on these demos for ratings. That's awesome. And you have automation back over to Google Sheets as well, right. I mean, that's how I got into coding in the first place was from spreadsheets, but especially Google Sheets, just getting tired of like those trying to work those formulas in those little cells. I went on a was it fiver and and was had some people code code me some, some scripts to to help with the spreadsheets. And then I just started looking at the code. I was like, well, this is pretty interesting. And then I from there, I just got into it on my own.

54:11 Yeah. So what's the last one you want to share? Is that air you

54:14 got another one. I love to listen to a lot of music. But also I feel like it's part of my job is to just be aware of new ideas. And some just constantly listen to music. I feel like I don't need to hear a song more than once or twice. And then I kind of get it and then I don't I just want to hear more new music. And by new I mean new to me. So there's tons of old records, classic records I still haven't heard yet. So it's very tedious to go through the Spotify app every day and try to find stuff for myself. So I have an app called new music that assembles a playlist for me, first of all, using Beautiful Soup. It goes to all the online charts so I can get like the whatever the hot songs and the different formats are get gets a few of those. Uh huh. And using package called Spotipy,

55:01 Spotipy. Okay, yeah,

55:03 it accesses the Spotify API. And I can access any playlists from there. So I go on to all the editorial playlists, like today's top hits, or rap, caviar, whatever, whatever it is. But then I can also access any user playlists, playlists, my manager shared with me or playlists I've created. And I grabbed a random sample from each of those, some of the parameters are hard coded in that script. But then I also came up with the idea of creating a front end with a Google Sheet. So in the Google Sheet, I can see one column is all the different playlists I'm drawing from. And then another column is how many songs I want to pull from there each day. Another column would be like, how long do I have to wait before a song is allowed to come in? Again, that's super cool. I

55:49 love how you've automated this to go basically scrape through that because you know, these streaming services, they're great Boney sort of say, you know, play my channel, they really get in a groove of like, here's the 100 songs, we've decided you don't skip.

56:02 Yeah, I can also control what songs what artists and what genres are banned. And, you know, with Python, I can create more complex algorithms. So like, I only want to hear hip hop from before 1996 except for Kanye and cardi B, I'll let those ones through.

56:20 Yeah, very good. Whatever

56:21 you want. I only go to that same playlist every day makes my life a little simpler.

56:25 Wow, that is so neat. And I you know, I did not plan this. I don't know, this is just sort of some awesome Inception thing. So I pull up the PyPI listing for Spotify. And their documentation shows how to get from rivers from weezer. Think that's a recent change. Yeah. Ryan on the live stream. Also. I noticed that that's awesome. And then Zachary, the hacker says, rivers, please tell me this app is available. This sounds amazing. I needed.

57:02 Yeah, it was one of the very first apps I tried to publish online and so is super janky. And I don't think it works at all anymore. But yeah, maybe I found that people didn't use it in the way I expected them to. Most people, they would say, they would just put in the name of an artist or the name of an album. And really, it's more useful for sampling from playlists, because then you have a much greater variety, people would just go and put in their favorite three bands. And the results weren't all that impressive. And

57:32 guess what, you know, with music from your three favorite bands, like there was a talk

57:36 last year Py Gotham by angelyn Protocio. , called the 'Album discoverer', which was like an album recommendation system that uses something similar to this, but it was it was like going into a deep dive of Spotify API. And I mean, I will give Spotify all the props, because there's just so much information and stuff that is like similar to like your previous example, rivers, where you had these variables that most people who don't think about music wouldn't think about originally. Like, they're like, is it somber? Is have good gut feel like stuff like that? You're just like, I don't know how you quantify that. But at the same time, like the talk was really interesting, because it showed like a comparison of tracks that were in different genres, but had similar feelings. And it was a really cool example. And I've been trying to find it online. Well, while you when you mentioned it, but I can't find it. So I'll have to reach out to the Py Gotham team and see if I can get you to find out where that link is.

58:35 Yeah, I know just what you're talking about. And Spotify gives you access to all that data. That being said, I'm skeptical of a lot of it, because I've seen seen the data on my own songs. And we covered Take on me by aha which is a very danceable song. Especially compared to a regular one. Yeah, especially compared to normal Weezer song, you'd think that would be rated very high on the on the perimeter of danceability. But it's they rated as one of our least danceable songs.

59:07 Oh, interesting. Very cool. I love this. Look into how you're interesting acting with music because it's really different than I think a lot of people out there just looking looking for something in the background. Cool.

59:18 I must have been, I think you're onto something. Yeah, you're saying the Michael. If you just let Spotify do its own thing it'll say to you, here's the things you've listened to again, and again and again, including the things you've always skipped, which will convince you or listen to if you play enough, but I should be doing this. I should craft it more deeply to kind of get exactly what I want to listen to, or at least things that sound like stuff I like to listen to. This is brilliant.

59:38 Yeah, absolutely. And atheists out there in the live stream. Welcome, welcome. There's awesome app reverse please share so I can get it automated. Chimbo Wamba playlist. Yeah, I agree. That's a really really cool and I want to share one I'll be really quick since we're at the end, this is my second one as well. This brings together a lot of pieces. It is ridiculously simple. Like you Almost like why would you ever do this? So I built this app. And it has a screenshot because it's an app that runs in the Mac toolbar in the notification area by the clock. And this is primarily why I even wanted to bother bringing this up. Because if you've got these little scripts, like Jim talked about gooey, which is a cool thing, you package up as an exe, you can share, but sometimes you want like a little notification thing, or something that might listen to a hotkey that it can just like live up there. And so one of the things that I have to do all the time is I'll take the title of a podcast, I will take the title, of course, video, and 1000s of them, and I want to turn that into a file name that will work well. So I have this little app called URLify, which is probably poorly named, but it does like simple little text transforms. So it uses pyperclip again, and I can just click a thing, and it'll turn it into something that would look as like a slug for URL. So like if it was the playlist with spaces and a capital T, it'll be all lowercase with dashes, and it'll strip out symbols that wouldn't it work, right. So that actually turned out to be incredibly helpful, because I can always reliably name stuff the same. And anytime I put something in, I just copy, like the title of a presentation. And then I hit that button and it turns it into the just the right file name. And then that app I talked about before, it will actually read that and then reverse engineer it back into likes, like a title, like with case, the right casing and stuff again. So it actually sort of comes all around about but the thing to build this is there's this app called 'rumps'. And I'm just be careful when you search for this. And I'll link to it rumps. And it's an acronym for ridiculously uncomplicated macOS, Python statusbar apps. Ooh, so caught as a shorter name. But just like gooey, like there is a full on application on the screen here that you can find on the PI listing, which I don't know what's that 1215 lines of code. And you've got a notification app that pops up Little macOS toast runs as a dot txt, and not a die a dot app in your Mac bar there, which I built the dot app with Py2 app. So yeah, that's two really cool things to put together to just like I want something that's always up in my Mac bar. There's probably something like this for the taskbar in Windows, but I haven't found it. So it sounds like a free course. It does. Take a week and fill it down I've actually been thinking about building like little notification app, like a simple simple, gooey, like gooey, gooey at GOY and like this and maybe that taskbar. One

01:02:20 you can fork archive project that I have then because I actually use rumps to make like, like we've all seen those little timer apps where you can put a bunch of dates in and it'll tell you like how soon until that thing was happening. Yes, I made an app called winsat that though just like put on GitHub, and I was just like, I'm not gonna develop this anymore. So I'll send you the link for michael. But the thing I like about this is there's so many tools that just do the thing and do it like really simple really quick. And when you think of stuff like what is it pip x, where you can call a command directly from your command line, and it just runs and does the thing. Like, that's always nice. And then doing things like rumps, where it's like, okay, I want to do this thing normally, but I want to put it up in my menu bar so that I can just take a quick look and see it. I think it's super awesome to you know, we've talked about these big programs or these things that change our lives. But sometimes it's even just like the little things that you can look to see when how you know how soon before your anniversary is coming up, so you don't forget it or like, hey, when is that big meeting that I'm supposed to be preparing for? When is that big conference presentation or when the CFP deadline is due? And you can you can just make a little applet that you just run every now and then and get results like that.

01:03:33 Yeah, you're making me think that the next one that I want to build is one for when I go live stream on recording, I want to send out a tweet, I want to update the website. So I was a little banner. We're live streaming right now all those kinds of things that just seems like another one up there. I just click

01:03:46 I live like a little button that opens up my Jupyter notebooks. You know, like I always have to clear my desktop all over. So I would Yeah, I would take the time to make something like that would be cool.

01:03:55 Yeah, that'd be super neat. Alright guys, looks like we're a little bit over time. But so many interesting things. Thank you all for being here. Now, since there's so many of us, I'm not gonna end I think we've all just this basically been the entire show like these little libraries and normally ask you what's your favorite PyPI package you want to recommend but like we've got 30 of them. So that was the show was awesome, but just really quick. I'll go around for the final question. Favorite editor Rusty VS code again, Rusty. Right on Kim. Emacs. Still on? Probably always Emacs. Right on Yeah. You'd like to type on an operating system that is itself artificial intelligence. Yeah. RiversVS code. Okay, right on. That's a good one. J, the war begins VIM . Can you see using the image neova? Yeah, yeah.

01:04:42 I can I can tolerate them that basically, yeah, I can tolerate it. But if I have to very, very slowly get things done. Because basically the problem and I'm sure you've probably happens list of them guys. If you're an Emacs guy. Then you remember the key bindings for Emacs and VI is what's on the really primitive servers and you cannot remember how to make it. Do things. As you keep pushing the wrong buttons, because your fingers remember, EMACS, the same would have happened to you. But you probably don't necessarily have to use Emacs very often because VI is everywhere.

01:05:08 Yeah, if I have to use a text editor, there will be like hjkl just all over the place. Because I think I'm in normal mode. I'm just like, Oh, no, it's it's just typing. Yeah,

01:05:19 I'm reminded of the joke. Like, how do you generate a random string? You give a first year computer science student vim, and you tell them to exit it. Alright, you guys, thank you so much for being here. It's been really great. Everyone is doing such neat stuff. And I'm sure we're gonna inspire a lot of people, even ourselves like Rusty, like I need a button to launch on my Jupyter notebooks. Right. I'm gonna do one for live streaming. So thank you. Thank you all for being here. It's been great. You. Thanks, Michael. That was fantastic. Thank you, everyone. Yeah, Yeah, you bet. Bye. Bye. This has been another episode of 'Talk Python to me'. Our guests on this episode had been Rivers Cuomo, J. Miller, Kim Van wyk and Rusty Gregory, and it's been brought to you by Linode & Us over at Talk Python Training and the transcripts were provided by 'AssemblyAI'. Simplify your infrastructure and cut your cob bills in half with Linode. Linux virtual machines develop, deploy and scale your modern applications faster and easier. Visit '' and click the Create free account button to get started. Transcripts for this and all of our episodes are brought to you by AssemblyAI. Do you need a great Automatic speech to text API get human level accuracy and just a few lines of code visit ''. One level up your Python we have one of the largest catalogues of Python video courses over at talk Python. Our content ranges from true beginners to deeply advanced topics like memory and async. And best of all, there's not a subscription in sight. Check it out for yourself at "" Be sure to subscribe to the show, open your favorite podcast app and search for Python. We should be right at the top. You can also find the iTunes feed at /iTunes, the Google Play feed at /play and the direct RSS feed at /RSS on We're live streaming most of our recordings these days. If you want to be part of the show and have your comments featured on the air, be sure to subscribe to our YouTube channel at

01:05:19 ''. This is your host Michael Kennedy. Thanks so much for listening. I really appreciate it. Now get out there and write some Python code

Back to show page
Talk Python's Mastodon Michael Kennedy's Mastodon