Player Recommendations
Full/Progressive Downloads
For a full download, ask for the entire file in one go. For a progressive download, ask for the file in slices (byte range). This way a full download can be distinguished from a progressive download.
Use header information - located at the start of the podcast - to prevent a full download when not needed.
Automatic Unsubscribe
Employ an “automatic download unsubscribe” behavior (e.g. -stop auto downloads after 5episodes of non-listens).
Avoid Automatic Back-Catalog Downloads
Do not automatically download all episodes (e.g. back catalog episodes) by default. This creates unnecessary drain on the publishers’ servers and consumes users’ bandwidth.
User Agent Structure
Implement the recommendations for user agent structure as found in the IAB Tech Lab Podcast Measurement Technical Guidelines v.2.2, in section 7.2, "Agent Structure".
Autoplay
Flag that indicates if the session has been initiated from a player auto-play. Possible values are autoplay=0 (not initiated via auto-play) and autoplay=1 (initiated via auto-play). Auto-play of audio content is strongly discouraged since in some cases, auto-played streams are not audible as the volume may be muted while the stream continues to be active. Triton Digital recommends that any initiation of audio content playback is determined by an overt user gesture, such as a tap or a click.
Pre-load/Pre-fetch
Pre-fetching of audio content is strongly discouraged. In most situations, the audio stream will not be heard by the listener and therefore should not be counted as a valid session. The best way to avoid measurement issues with pre-fetching is to simply not use it. The recommendations outlined below should work to eliminate the problem.
Preferred: the <audio> element’s preload attribute should be set to none. It should never be set to auto or left blank, as those options transfer the decision to the browser itself. See the Code Example, below.
Alternatively, the <audio> element’s preload attribute includes the metadata option, which fetches/pre-loads only the audio metadata. This might not cause a problem. However, if you choose to use preload="metadata" instead of preload="none" you should thoroughly test the player on multiple platforms and browsers to be sure it’s really needed and behaves as expected.
Pre-load/Pre-fetch Code Examples
Click to expand the code examples
Code Example1: Stopping the Audio
The example code below stops the audio and uses a workaround for the Safari browser "pause" issue.
stop: function () {
var context = this;
if ( fsm.is( STATE.STOPPED ) ) return;
this.audioNode = getAudioNode.call( this );
fsm.stop();
this.audioNode.pause();
if( OsPlatform.name !== 'Safari' || this.audioNode.src.indexOf('m3u8') > -1 || this.useHlsLibrary) {
setTimeout(function(){
context.audioNode.src = '';
context.url = null;
context.resetAudioNode();
}, 300);
}else{
setTimeout(function(){
context.url = null;
context.resetAudioNode();
}, 300);
}
if( OsPlatform.os.family === 'iOS' && OsPlatform.name === 'Chrome Mobile') {
window.stop();
}
if ( this.useHlsLibrary ) {
this.hls.detachMedia();
this.hls.stopLoad();
this.hls.destroy();
}
},
Example 2: Reloading the page
The example code below shows the use of preload="none" and the reloading of the page containing the player.
<audio controls preload="none" height="32" width="300" onpause="location.reload();" src="<PLAYER PAGE URL>" type="audio/mpeg" />
Code notes:
Replace "<PLAYER PAGE URL>" with the actual URL to your player page.
The height and width attributes shown are just examples; use the actual height and width of your player.
Example 3: Using a known valid audio file
The example code below shows the use of preload="none" and the loading of a short MP3 file (a known valid audio file) to stop the background file download.
<audio controls preload="none" height="32" width="300" onplay="startAudio();" onpause="stopAudio();"
src="http://download.andomedia.com/Creative/208/0/2080711_1.mp3" type="audio/mpeg" />
<script>
// -- Set audio source before playing in case the pause/stop button has cleared it
function startAudio()
{
var audio = document.getElementsByTagName("audio")[0];
if (audio.src!="http://<YOUR-AUDIO-STREAM>")
{
audio.src="<YOUR-AUDIO-STREAM>";
if(navigator.userAgent.toLowerCase().indexOf('firefox') > -1){ audio.load(); }
audio.play();
}
}
// -- Clear the audio source - this should stop the download. Pausing alone will not.
function stopAudio()
{
var audio = document.getElementsByTagName("audio")[0];
audio.src="http://download.andomedia.com/Creative/208/0/2080711_1.mp3";
if(navigator.userAgent.toLowerCase().indexOf('firefox') > -1){ audio.load(); }
}
</script>
Code notes:
Replace "http://<YOUR-AUDIO-STREAM>" with the actual URL to your audio stream.
audio.src="http://download.andomedia.com/Creative/208/0/2080711_1.mp3" is a live three-second silent audio file hosted by Triton Digital that you can use while testing. If you choose to use this method after testing, please replace this URL with a link to your own silent audio file. The Triton Digital file could be renamed or removed at any time without notice.
Host, Directory, and Server Recommendations
ID3 Headers
Podcast MP3 files should use ID3v2 tags so that the headers are located at the start of the podcast. This allows players to use the ID3 data before streaming begins and without downloading the full podcast file.
The recommended ID3 tag size is under 300kb with an art size of 800x800 pixels.
Do Not Cache Episodes
Do not cache podcast episodes on your servers. Always download the latest episode from the enclosure URL for every app user wanting to listen.
Use GUID
Use the GUID – as opposed to episode URL, title, publication date, etc. – to identify new episodes in the RSS feed that should be automatically downloaded to a user's device. The GUID is designed to be persistent through changes to hosting environment, titles, etc.