BBC My Sounds, hiding podcasts behind a 'Beware of the Leopard' sign.

Updated on Friday, June 10, 2022

BBC My Sounds, hiding podcasts behind a 'Beware of the Leopard' sign.

I just want to listen to Friday Night Comedy on Radio 4.

It used to be the case that this was safely subscribed in my podcast app (I use Podkicker Pro) and so each new episode would download to my feed when released.

The BBC has decided to fix the problem of me getting the program I want to listen to automatically and conveniently. If I want my comedy I have to install My Sounds. When Spotify tried this with Science Vs I just stopped listening. I have plenty of other science podcasts but The Now Show and the News Quiz are irreplaceable. So maybe I could cope with one walled garden.

My Sounds says it will notify you when new episodes are available. It does not.

My Sounds has a My Sounds tab which lists Latest programs. I'm writing this on April 2 and the most recent episode of Friday Night Comedy is from March 25.

BBC My Sounds, hiding podcasts behind a 'Beware of the Leopard' sign.

Only if I go into Subscribed, and then the program page for Friday Night Comedy does it finally admit that there is an episode from April 1.

BBC My Sounds, hiding podcasts behind a 'Beware of the Leopard' sign.

So I'm forced to install an app that not only fails to notify me of new episodes of subscribed programs but actively hides them in the basement behind a beware of the leopard sign. BBC, maybe get the app working before forcing me into it? I would rather pay to subscribe to an RSS feed than deal with My Sounds.

I'd take the time to leave a one star review, but in its infinite wisdom Google doesn't allow paying customers to leave app reviews.

Updated 2022-05-06 11:32:

BBC My Sounds, hiding podcasts behind a 'Beware of the Leopard' sign.

Having been forced into the excreable BBC My Sounds at least it supports downloading an episode to listen to on the plane right?

Updated 2022-05-06 11:33:

BBC My Sounds, hiding podcasts behind a 'Beware of the Leopard' sign.

Does it fuck. BBC, please fix this and then try asking nicely?

(Related: Doing news right with Feedly and Google News; Radio 4: Can I buy you a new hard drive?; Leaving the Nest)

(You might also like: Lightfield Tree; Vernal (Spring) Equinox 2019; Great Horned Owlets)

(All Marketing Posts)

Using the Todoist API to set a due date on the Alexa integration to-do list (with Apps Script)

Todoist Alexa Fix

I love almost everything about Todoist. It's rich enough to scratch all my productivity itches while also being basic enough that I don't spend time gardening my tasks. Also, their Android app is just gorgeous, the exact opposite of Google's ascetic descent into identical lists of black in Material Design.

The one problem is the Alexa integration. You can add tasks to your shopping list or your to do list. The shopping list works great for me. I check it once a week when I do my grocery shopping and everyone knows to just tell Alexa when they need something. The to-do list is a disaster. These go to a separate to-do list project without a due date and I will never ever find them there. Anything else I add will end up in the Inbox with a due date of today so I'm forced to classify and if necessary reschedule it. Which is exactly what I want.

When I say 'Alexa, add x to my to-do list' I want that task to be visible. This integration design flaw could lead to at least one child growing up in an unfamiliar part of town without parents, or worse.

I emailed Todoist and they politely declined to change the way the integration works. After a brief period of steaming I've rolled up my sleeves and fixed it with their API. Which doesn't use OAuth so now I love them even more.

The script is below. Create a new Apps Script project in Google Drive (New and then choose More to find this) and copy in the code. You can get the API token from the bottom of the Integrations section in Todoist settings. Then just click the clock in the Apps Script project and schedule checkForAlexaTasksWithNoDate() to run as often as you need. The script will check the Alexa To-do List project and if anything is in there without a due date it will set it to today to force you to deal with it.

More Google Apps Script Projects

(All Code Posts)

Monitor page index status with Google Sheets, Apps Script and the Google Search Console API

Updated on Friday, May 20, 2022

GSC Monitor

Overview

Google just released URL inspection as part of the Search Console API. I check for issues periodically in Search Console but it would be great to just get an email when an issue crops up. The Apps Script project below does just that by monitoring URLs from your sitemap for changes and sending an email whenever anything is detected. The Search Console API has a limit of 2,000 calls per day and Apps Script also imposes a time limit on scripts. The approach I take below assigns a random day of the week to each URL to limit the number checked on each run. Depending on the size of your site you may want to remove this check (or go the other way if you have a large number of URLs to monitor). Follow the steps below to get your own monitoring spreadsheet up and running.

Google Sheet

Create a new spreadsheet in Google Drive and call it anything you want. Rename an empty sheet to 'gsc', this sheet will store the index data. You don't need to make any other changes to this sheet.

Choose Apps Script from the Extensions menu. This will open up the script editor for your spreadsheet. I find that sometimes the editor opens with the wrong account if you're signed into more than one. If that applies to you, check quickly to make sure the right account is selected. With Code.gs selected copy and paste the script below replacing the default function:

There are a few configuration variables to enter at the top. AlertEmail is the email address to notify when index status changes are detected. SitemapUrl is the full URL of your sitemap. The current implementation does not support sitemap index files, this needs to be a regular sitemap containing URLs. SearchConsoleProperty should be the URL of the site to monitor, or sc-domain: followed by the domain for domain properties (for this site sc-domain:ithoughthecamewithyou.com).

Click Project Settings (the cog in the left hand menu of the script editor) and copy the Script ID. Make a note of this for later.

API Console

Next we need to configure the Search Console API in the Google Cloud Platform Console.

  1. Create  a new project (click the drop down to the right of 'Google Cloud Platform Console' and then New Project). Pick any name you like. 
  2. Once the project is created, find APIs and Services in the left hand menu and choose Library.
  3. Search for Search Console, click on the Search Console API and then click Enable. 
  4. A new screen will load, click Credentials in the left hand menu. 
  5. Click Configure Consent Screen and choose the internal type.
  6. Fill in the required fields - application name and contact emails. 
  7. Add the ./auth/webmasters.readonly scope for readonly access to Search Console data.
  8. Once the consent screen is complete click Credentials in the left hand menu again.
  9. Click Create Credentials at the top and choose OAuth Client ID. 
  10. Choose Web Application.
  11. Add https://script.google.com/macros/d/{SCRIPTID}/usercallback to authorized redirect URLs, replacing {SCRIPTID} including the brackets with the Apps Script ID you noted above. 
  12. Make a note of the Project ID.

Complete the Apps Script

Return to the Apps Script project and find the settings page. Set the GCP project to the project ID you noted above. Also on this page check the Show "appsscript.json" manifest file in editor option.

Go to the code editor and open appsscript.json. Add the following line:

"oauthScopes": ["https://www.googleapis.com/auth/script.external_request", "https://www.googleapis.com/auth/webmasters.readonly", "https://www.googleapis.com/auth/spreadsheets.currentonly", "https://www.googleapis.com/auth/script.send_mail"],

Make sure the script is saved and close the script editor window. Reload the spreadsheet. Once the reload completes you should have a Search Console menu at the top of the spreadsheet. Choose Update Data from the Search Console menu. This will run for a few minutes and then populate the 'gsc' sheet with your URL data. See UrlInspectionResult in the API documentation for more information about the meaning of each field. You should also get a lengthy email with a notification for each URL that was inspected. This will continue for the first week and then you'll only get updates for interesting status changes.

Scheduling

Now the project is working, open the script editor again (Apps Script from the Extensions menu) and open Triggers (the clock icon in the left hand menu). Click Add Trigger at the very bottom right of the window. Select runUpdate as the function to run. Change event source to time-driven, and then select day timer and an hour to run the script. Lastly click Save. Your Google Search Console monitor will now run every day, and if the index status of a page changes you'll get an email about it within a week. The spreadsheet will also come in handy for other analysis and reporting.

Troubleshooting

You might need to tweak the script if you start hitting limits. The URL inspection API currently has a 2,000 call / day quota. Apps Script will only run for around 7 mins on a free account and 20 mins if you have Google Workspace. If either of these limits apply you could modify the 'checkDay' logic to use day of the month (or year, or ...) to reduce the number of URLs inspected on each run. If you need to do this remember to update the Check Day column on the 'gsc' sheet as well.

The script assumes that the URLs you want to monitor are in your sitemap. If this is not the case you can add URLs to the sheet directly. As long as they are part of the configured property you will still get results. If you use this method you might want to comment out the updatePagesFromSitemap() call in runUpdate() to save time.

If anything else goes wrong please leave a comment below and I'll do my best to help you.

Updated 2022-02-08 17:40:

Monitor page index status with Google Sheets, Apps Script and the Google Search Console API

After a couple of days I have a full dump of my sitemap from the page index status API. I wrote this script for the alerting possibilities but couldn't resist some analytics once the dataset was complete.

The chart above shows sessions vs days since the last Google Crawl. Pretty stark - Google keeps a close eye on the pages it sends traffic to and not so much on the others.

I set lastmod honestly and there is good news here. I could only find two cases where Google had not crawled the page since the last modified date. So when the sitemap says a page has changed the odds are good that it will get another crack at the index. The two exceptions are unusual posts that are updated hourly and weekly respectively and both have been crawled recently.

The breakdown of index status matches Google Search Console pretty well but I have a handful of pages that are 'Indexed, not submitted in sitemap', even though they are in the sitemap and no such status is shown on Search Console. I don't know if this is a glitch in the index status API or something to do with how the pages were discovered. Some light searching suggests that this message is usually what you would expect it to be.

Lastly, updating the sheet for my site is more bound by script execution time than the API limits. I changed it to run every hour and instead of partitioning by day of week I used a random hour of the day which means I check every URL at least once every 24 hours.

Updated 2022-04-24 10:50:

I just updated the code and post above. I've had occasional issues where updating the sheet failed which caused the next run to go back to the beginning with no saved index status. To reduce the chance of this happening I've added some retry logic and also improved the speed of the sheet load and save functions. I also had a comment on the code that suggested an easier way to handle OAuth and have incorporated this in the new version.

More Google Apps Script Projects

(All Code Posts)

Doing news right with Feedly and Google News

Read all about it

Get rid of social

I want to be well informed and, to the greatest extent possible, free from any kind of filter bubble. Hard to do that on Facebook. So the first step is to delete Facebook and Twitter. Now you have some time to design your news consumption.

Feedly

To me the very best part of the web is RSS feeds so I can quickly skim through hundreds of sites with a consistent interface and no ads. I used to do this with Google Reader but since that was killed I've found Feedly to be an awesome tool and I happily pay for the Pro version. The Android app is great. The web version sometimes gets lost in the list but is fast to use with keyboard shortcuts for cruising through your list. I keep Feedly stocked with news sites, hobbies, work related niche publications and everything I know I want to keep an eye on. The only gap is those unknown unknowns.

Google News

Google News is my current fix for finding the stories and context that I don't get through RSS.

What works

As a learning system Google News pretty quickly figures out what you're interested in. It's not perfect so you have to spend some time training it. Once in a while it will decide you need every word written about Ina Garten, but you can easily tell it that it's wrong. A more subtle tip is to often click sources that you violently disagree with. Google News has some tendency to surface different angles but it definitely helps to signal that you are open to uncomfortable takes on a story. This is a powerful filter bubble burster.

Feed mechanics

Having escaped most social media (I still have LinkedIn which is the cockroach of platforms) I really hate the feed based approach that Google takes with News. I understand it but I hate it. Probably the worst usability crime is that it will often refresh without being asked. I'll be halfway down the list, spot an interesting article, get distracted, and then when I switch back I see that tempting story for a fraction of a second before the whole feed reloads. Often that story is then nowhere to be found. There is a feature to save for later, but I try to avoid this because future me isn't likely to have time either and it adds the burden of yet another to-do list to keep track of.

Don't make me read it twice

Related to the feed is the tendency to show me the same story again, and again, and again. Other than ignoring a topic or publication there is no mechanism to just dismiss a story. I know that the algorithm has worked really really hard to find it but I don't need to see it every day for a week or more. It's OK, in fact desirable, to be done with the news. As with the feed I know that it's someone's job at Google to work on engagement and my time is an externality to their optimization algorithm. It's a big irritation all the same.

Podcasts

Lastly for me I also get a lot of context from podcasts. I use Podkicker Pro on Android (also worth paying for). We live in peak podcast times and I don't have enough time to listen to everything that I want to.

(Related: The Trust Project, Fake News and a Partial Facebook Uninstall; I didn't think I'd ever fall for fake news on Facebook; Got It)

(You might also like: News: California may end tyrannical daylight savings; Stars over Pinnacles; Petrol & Marks & Spencer)

(All Etc Posts)

Leaving the Nest

Updated on Saturday, May 15, 2021

NOPE

I migrated from Nest to Google Home today to save a few bucks and while eventually inevitable it was a really dumb move.

The first thing is that it doesn't work with your Google Workspace / G Suite account because of course it doesn't. So you need an unpaid Google account to move to. Luckily I already have one from that time that G Suite didn't support Google Fi. Interestingly while Google Home won't work with your paid account it has no problem reaching over to grab credit card information from it.

The next thing is goodbye Works with Nest, hello Works with Hey Google. So there goes my IFTTT integration. Because I can't use my main Google account it's kind of useless to me that this might work with Google Assistant. There is still Alexa integration though so I can play my Nest stream on the Echo Show once a year or so as a connected home party trick.

Having not read the changed terms of service I downloaded the Google Home app which a few minutes in I've take to calling Google Nope.

Nest Protect is not supported! This is my favorite smart home device just because when the battery runs out it can tell you which one to change. It's worth almost any amount of money to not spend several hours figuring out where in the house the omnidirectional smoke detector chirp is coming from. But for some reason Google Home doesn't integrate with Google Nest Protect so you need to keep the Nest app as well. Understandable, they only have several tens of thousands of engineers.

So they nailed the camera experience at least, right? Nope. In Nest there are about a hundred settings to play with. In Google Home you can change the name of the camera. In Nest you can scroll through all of your recorded history. In Google Home, despite specifically paying for the plan with 10 days of history you can't. It has a pre-Alpha feel to it. Good for a 'hey, we got the skeleton of an app thrown together' kind of internal demo but it feels like they probably should have added the things you've paid for before shipping it to anyone, let alone bribing them to go through a feature shredding 'migration' process.

My smart home ambitions are not that great. I had a nice little setup that switched some lights on and off around dawn and dusk, but Philips end-of-lifed the bridge and I'm not about to buy a new one. I had some fun making dropcam timelapses but Google broke the public cam URL. And thank goodness I didn't get the alarm system.

Lesson (eventually) learned. The only new smart home devices I'll install are the ones that I build myself.

(Related: Capture DropCam (Nest Cam) frames to Google Drive; Export Google Fit Daily Steps, Weight and Distance to a Google Sheet; Chromecast won't connect to wifi - finally found the fix)

(You might also like: Full Outlook Web Access on Chromebook; Think before you print?; Merging Resource Dictionaries for fun and profit)

(All Etc Posts)

Android 11 Gripes

Updated on Thursday, August 26, 2021

11

You have to make allowances for the fact that many people are working from home (where maybe it's harder to test code and you certainly can't do hallway usability testing). Things also improved somewhat with the October patch. But Android 11 was a Windows ME level disaster. Google says that they dropped the desserts to make Android 'more accessible to a global audience' but I think it's probably because they know that new updates are no longer sweet.

Multi-tasking is completely broken. In pandemic mode I'm on video calls all day, and dodging the 2-3 video calls that are usually going on elsewhere in my house. Being able to have Teams and notes running at the same time is pretty important right now and with 11 it's not possible.

Other than conference calls and Kindle the other main use I have for my phone is podcasts. Android 11 improved the media controls by moving them to the quick settings area of the notification shade, providing easy switching between playback devices and allowing you to swipe through recent playback apps. All good, except that none of it works. The controls are there but do nothing so I have to run the app to pause. Also, there is a weird ghost of a previous media playback that shows up and then disappears when pulling down the notification shade. And as for dismissing previous sessions that seems to require a reboot.

Multi-tasking and media were fixed in the most recent patch, but there is also some new notification system to separate out conversations. In practice this seems to mean I get multiple groups of Gmail and Teams notifications instead of a single cluster per app. This isn't what I want, gives me more work to do and so far I haven't found a way to turn it off. Notifications have steadily improved over the last few major Android releases so it's upsetting to see them becoming worse.

This is all on a Pixel 4XL which you would assume would get some level of testing love. It used to be that the main advantage of a Pixel was getting new versions of Android quickly. With 11 I'm for the first time wishing I was waiting a few months while the kinks were worked out.

(Related: Skype for Android - Getting Closer; Export Google Fit Daily Steps, Weight and Distance to a Google Sheet; The Secret Diary of a Xamarin Android Developer, Aged 48 1/3)

(You might also like: Stumpoceros; Sierra Nevada; Game of Death)

(All Etc Posts)

Did anyone tell Material Design about Gesture Navigation?

Did anyone tell Material Design about Gesture Navigation?

The screen shot above is from Google Fit. Which icon is active? I can't tell any more. Is it the blue one or the underlined one which is a much stronger cue?

Of course none of the icons are underlined. This is a bottom navigation bar on top of the Android navigation bar on Android 10 with gesture navigation enabled. My brain knows this but my finger still tries to click on Home. Journal just looks so much more active I can't help it. This friction is also in Google Photos and Google Maps and presumably Google everything before too long.

Maybe the Google app developers don't have access to recent Pixels, or maybe the Material Design team all have iPhones?

(Previously: Material Design 3)

(Related: Material Design 3; Top 5 reasons to hate the Facebook like button; Capture DropCam (Nest Cam) frames to Google Drive)

(You might also like: Photo Sorter 1.00; Coronavirus Hikes: Done; Sending email via GMail in C#/.NET using SmtpClient)

(All Marketing Posts)

Google search-for-your-own-verified-sites Console

Google Search Console

I don't know about you, but when it comes to Google Search Console I spend about 0.01% of the time adding sites and 99.99% analyzing existing ones. And yet when signing into Search Console with many verified sites the interface is ALL about adding a new one. Maybe 10% of the UX would be reasonable but it looks for all the world like I have nothing added.

To get to my sites I need to click the hamburger. Come on Google, being mobile first doesn't have to mean being desktop hostile.

Clicking the hamburger isn't even enough. This just brings up a practically blank sidebar. I then need to expand the 'Search property' drop down. Finally I get a needlessly scrolling list of my sites.

(Related: Export Google Fit Daily Steps, Weight and Distance to a Google Sheet; Monitor page index status with Google Sheets, Apps Script and the Google Search Console API; Capture DropCam (Nest Cam) frames to Google Drive)

(You might also like: 2017 Total Solar Eclipse from Madras, OR; Recount; Transit of Mercury)

(All Marketing Posts)

Using the Azure Monitor REST API from Google Apps Script

Updated on Saturday, February 12, 2022

Average Server Response Time in Azure Metrics

This post describes how to get metrics (in this case average response time) from an Azure App Service into a Google Sheet. I’m doing this so I can go from the sheet to a Data Studio dashboard. I already have a report in Data Studio that pulls from Ads, Analytics and other sources. I’d rather spend hours adding Azure there than be forced to have one more tab open. You might have different reasons. Read on. 

  1. Create a Google Sheet and give it a memorable name. Rename the first sheet to AvgResponseTime and put ‘Date’ in A1 and ‘Average Response Time’ in B1.
  2. Create a script (Script editor from the Tools menu) and give that a good name as well.
  3. In the script editor pick Libraries from the Resources menu. Enter 1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF which is the Google OAuth library, pick the latest version and click Save.
  4. Select Project properties from the File menu and make a note of the Script ID.
  5. Log into your Azure Console and then go to https://resources.azure.com/. You are looking for a metricdefinitions node for the resource that you want to monitor. In my case it’s subscriptions / MyName Subscription / resourceGroups / providers / Microsoft.Web / sites / MySite / metricdefintions. Browse through this list to find the id of the metric you’re interested in. For me it’s AverageResponseTime. Finding this was the hardest part. Microsoft’s documentation for resourceUri is literally ‘The identifier of the resource.’ Why even bother Microsoft? Make a note of the id and remove the ‘metricDefinitions/AverageResponseTime’ from the end, because of course the ID isn’t quite right for some reason. Mine looks something like this: /subscriptions/mylongid/resourceGroups/mysomethingResourceGroup/providers/Microsoft.Web/sites/mysiteid
  6. Go back to the Azure Console and open Azure Active Directory. Select App registrations under Manage and create a New registration. Time to come up with another name. You probably want ‘Accounts in this organizational directory only’. The redirect URL is https://script.google.com/macros/d/SCRIPTID/usercallback - replace SCRIPTID with the Script ID you made a note of in step 4.
  7. Click the View API permissions button, then Add a permission and then pick Azure Service Management. I’m using Delegated permissions and the user_impersonation permission. Then click Grant admin consent for Default Directory.
  8. Go to Certificates & secrets (under manage) and create a new client secret. Make a careful note of it.
  9. Go to Authentication (under Manage), check Access tokens under Implicit grant and then click Save at the top of the page.
  10. Go to Overview and make a note of your Application (client) ID and Directory (tennant) ID.
  11. You are getting close! Go to the script editor (from step 2) and paste in the code at the bottom of this post. There are four variables to enter at the top of the script. ClientID and TennantID are from step 10. ClientSecret is from step 8. ResourceID is from step 5. Save the script.
  12. Reload the spreadsheet (back from step 1). You should get an Azure Monitor menu item. Choose Authorize from this menu. Google will ask you to authorize the script, do this for the Google account you’re using. Choose Authorize again, this time a sidebar will appear with a link. Follow the link and authorize against Azure (if you’re logged in this might just go directly to success). If you get authorization errors in the future run this step again. If that does help use Reset Settings and then try again.
  13. You should be ready to get data. Choose Fetch Data from the Azure Monitor menu. If this doesn’t work check through steps 1-12 carefully again!
  14. Last step - automate. Go back to the script editor. Choose Current project’s triggers from the Edit menu. Add a trigger (the small blue button hidden at the bottom right of the screen - not everything needs a floating action button Google!) to run fetchData daily at some reasonable time.
You should now have a daily record of average response time flowing to a Google sheet. This can easily be extended to support other metrics, and other time periods (you could get data by minute and run the script hourly for instance. See the metrics documentation for more ideas. I got this working for an App Service but it should be roughly the same flow for anything that supports metrics, you’ll just need to work on finding the right resourceUri / ID.

More Google Apps Script Projects

(All Code Posts)

Please fix phone spam Google!

95% of my incoming calls are now spam. Most of them are some strange pre-recorded Chinese voice with music playing in the background but I occasionally get a free hotel stay as well.

So far Google has rolled out Call Screen. This means I can waste my time watching Google Assistant talk to the spammer. It's way faster not to bother, hang up all calls and delete the voicemails later.

It seems like instead of Call Screen there could be a better way to deal with this.

Firstly, send any call not from someone in my contacts directly to voice mail. This would actually solve a lot of the problem.

Next, for extra credit, run spam detection on the voice mail before sending it to me. If it's two seconds long and blank then just bin it. If it's Chinese with music bin it. Only if it passes the smell test should it appear in my actual voice mail. Google is very good at this for Gmail.

Please!

(Related: Chromecast won't connect to wifi - finally found the fix; Skype for Android - Getting Closer; Leaving the Nest)

(You might also like: Fallen Leaf Lake; Air Gap; Republicans and Democrats: Too big to succeed)

(All Marketing Posts)

I Thought He Came With You is Robert Ellison's blog.

Newsletter