How to create enhanced audio podcast episodes featuring images and chapters (How the itunes:image tag really works)

Since I released the latest version of Podcast Generator (which includes the support for embedded images for individual podcast episodes),  one of the most recurring questions has been why iTunes and the iOS Podcast app don’t show the artwork associated to single audio episodes yet keep displaying the main podcast artwork/cover art.

Apple’s technical specifications for podcasts state that the iTunes-specific tag <itunes:image> allows to associate a cover art to the podcast feed but also at the episode level. However, this information is currently not fully implemented by Apple since it works only for the general podcast cover art, but not for single episodes, i.e. if an image is specified using the tag <itunes:image> for a single episode (<item>), this is simply ignored by iTunes and the iOS podcast app, which keep displaying the general cover art.

To the best of my knowledge, the only way to show artwork (one or more images) associated to a single podcast episode is to use GarageBand for Mac and create an “enhanced podcast”.

To do so, simply import your audio files using GarageBand (optionally, you can edit them by adding jingles or sound FX etc.) and directly drag an image on top of the audio track. This will result in the creation of a Podcast chapter that can be moved along the timeline to be shown at a specific point during the reproduction of the audio file. This operation can be repeated to create more chapters for the same episode, each of which will consists of its own image and title:Creation of enhanced audio podcast with chapters using Garage Band


Once the enhanced audio podcast is ready, it is possible to export it by selecting Share -> Export Podcast to Disk:

Export audio podcast with chapters and images to disk


The enhanced episode must be compressed using the AAC Encoder (which will produce an .m4a audio file). Be sure also to select the option “Set artwork to recommended size for podcasts when exporting”:Export podcast file from GarageBand including artwork and chapters


et voilà! You will obtain an enhanced audio podcast episode!

This is the result in the Podcast app for iOS (iPhone):

Enhanced audio episode in iOS podcast app


You can download our example enhanced audio podcast episode (embedding 3 different images and chapters)and try it yourself. To do so, feel free to use the demo of Podcast Generator: there you can upload test files and play without limitations. Once you have uploaded your test file, subscribe to the demo feed using the podcast app for iOS and see the result :)

Do you need help to publish your podcast? Check out my web-application called Podcast Generator. It’s free, open source and very intuitive to use. Many hosting and NAS services worldwide offer Podcast Generator as a preinstalled package in their control panel so no effort is required for the installation.

Happy Podcasting!

This post also appeared on LinkedIN.

Real-time plots using websockets, python, javascript and Google Charts

There are many examples of use of websockets out there, however most of them are cumbersome or too complex for newbies.

Here is an extremely simple example of websockets I made, which consists of a server (implemented both in PERL and Python, up to you the choice) that pushes a message (i.e. randomly generated values) to the client upon a fixed time interval:

Two clients are available in this example:

  • client-JustLog.html displays on screen the log with the messages received;
  • client-Chart.html shows a bar chart (based on Google Charts) which updates in real time with the data received.


If you are running this code in a local host (i.e. your local machine) no configuration is needed. Otherwise, you can change ports and host from the config sections in the code.


  1. SERVER: choose either (PERL) or (Python) and run ONE of them from the terminal: type eitherperl or python
  2. CLIENT: Open one of the two clients (but they also work at the same time in two separate tabs) using a modern browser (e.g. tested and working with Chrome v.42+). Notice that the client must be opened after the server is running (otherwise, you will have to push the “reconnect” button).
  3. See the data pushed automatically from the server to the client via websockets :bowtie: (Optionally, you might want to use Firebug with client-Chart.html to see the console logs)


  • PERL or Python
  • A modern browser that supports websockets (e.g. Chrome v.42+)


  • The PERL implementation of the server requires Net::WebSocket::Server. In Mac OSX it can be installed using the command: sudo perl -MCPAN -e 'install Net::WebSocket::Server'
  • The Python implementation of the server requires Tornado that can be installed using pip (pip install tornado) or manually:
tar xvzf tornado-4.1.tar.gz
cd tornado-4.1
python build
sudo python install

Why user reviews visualization needs emotion: a proof of concept.

In the last decade many popular web and mobile services have collected huge (and precious) amounts of data about users’ opinions, which are generally expressed in form of ratings and reviews. However, the way most of these services present the data collected to their end-users is often old-fashioned and mainly consists of simple numbers and plain charts.

For instance, let’s take TripAdvisor as a test case. TripAdvisor is one of the main references worldwide for hotels and restaurants reviews, which can drive the choices of millions of travelers when visiting a new location, hence leading to a significant real-world economic impact for local businesses and associated services.

Nonetheless, the way content is presented by TripAdvisor can sometimes be confusing to the general audience. Despite having collected a considerably rich amount of data, in fact, these information are displayed using tens of numeric values associated to basic plots such as horizontal bar charts:


These visualization choices are not as immediate as they could be, and require further interpretation by the user (e.g. having 54 terrible reviews on a total of 1200 is different than having 54 terrible reviews on a total of 100, and this is not immediately reflected in the information displayed).

In the era of new data visualization techniques and infographics, something better can be done. This is precisely the motivation behind the creation of MoodAdvisor, a free web & mobile app that allows travellers to quickly visualize in a very graphical and straightforward fashion the excellency of a hotel and the the happiness of previous travelers who left a review. The former measure is based on the number of excellent and very good reviews normalized according to the total number of reviews and converted into a percentage, while the latter measure is based on state-of-the-art algorithms of sentiment analysis to interpret the affect in the reviews left on TripAdvisor for a certain location.

MoodAdvisor allows the user to search for any hotel worldwide through a simple form, then retrieves the data from TripAdvisor, computes in real-time the aforementioned values of excellency and happiness, and visualizes the results using gauges followed by colored boxes representing the latest reviews associated to simple emotions (happy, neutral, sad):


For the front end, MoodAdvisor makes use of jQuery UI + Javascript to asynchronously retrieve data and of HTML5 + Google charts to visualize the results. The back-end (data scraping and sentiment analysis) is developed using PHP.

Unfortunately, when requesting to access the official API, TripAdvisor did not approve the use MoodAdvisor did of their data since it was in violation of their Terms of Use and I was explicitly requested not to go live with my service. For this reason, MoodAdvisor was never officially launched :( However, the technology behind MoodAdvisor is fully functional and can be applied to many other web services and datasets (e.g. reviews of products on Amazon etc…). Moreover it constitutes a proof of concept on how the visualization of user ratings and reviews not only could be graphically more informative, but also should introduce novel measures, such as emotion, which are intrinsic to human communication capabilities and therefore convey information in a more efficient and straightforward way.

MoodAvisor can still be tried at, even though the results presented now are based on dummy data. I also released part of the code (data scraping from a webpage using regular expressions) on GitHub.

This post originally appeared on LinkedIN.