{"id":68090,"date":"2025-04-18T03:01:00","date_gmt":"2025-04-17T17:01:00","guid":{"rendered":"https:\/\/www.rjmprogramming.com.au\/ITblog\/?p=68090"},"modified":"2025-04-18T09:52:33","modified_gmt":"2025-04-17T23:52:33","slug":"audio-recording-youtube-interfacer-revisit-tutorial","status":"publish","type":"post","link":"https:\/\/www.rjmprogramming.com.au\/ITblog\/audio-recording-youtube-interfacer-revisit-tutorial\/","title":{"rendered":"Audio Recording YouTube Interfacer Revisit Tutorial"},"content":{"rendered":"<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.htm\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Audio Recording YouTube Interfacer Revisit Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_audio_recording.gif\" title=\"Audio Recording YouTube Interfacer Revisit Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">Audio Recording YouTube Interfacer Revisit Tutorial<\/p><\/div>\n<p>Back at the recent <a title='YouTube Video List of Play Supervisor Tutorial' href='#ytvlpst'>YouTube Video List of Play Supervisor Tutorial<\/a> the role of our inhouse YouTube Interfacer web application was as a middle<i>parent<\/i> in a &#8220;grandparent&#8221;\/&#8221;parent&#8221;\/&#8221;grandchild&#8221; web application design, but today we revisit the functionality that motivated us to think &#8220;Karaoke&#8221; when naming it, that being &#8230;<\/p>\n<blockquote><p>\nuser audio recordings\n<\/p><\/blockquote>\n<p> &#8230; via that &#8220;Record&#8221; link, which was due a revisit, for sure!<\/p>\n<p>We discovered a great new &#8220;third party&#8221; resource to record audio and be able to save it in &#8220;Downloads&#8221; on your local device.  Thanks, <a target=\"_blank\" title='https:\/\/online-voice-recorder.com\/' href='\/\/online-voice-recorder.com\/' rel=\"noopener\">Online Voice Recorder<\/a>, for your great resource we appreciate around here.  We wrote this &#8220;splashpage&#8221; <font size=1>(to our inhouse <a target=\"_blank\" href='\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.htm' rel=\"noopener\">Local File Browsing<\/a> interfacer)<\/font> to explain it&#8217;s usage &#8230;<\/p>\n<div>\n<p>At left or above, thanks to <a target=\"_blank\" title='https:\/\/online-voice-recorder.com\/' href='\/\/online-voice-recorder.com\/' rel=\"noopener\">https:\/\/online-voice-recorder.com\/<\/a> &#8230;<\/p>\n<ol>\n<li>Click\/tap <strong><i><font color=red>red<\/font><\/i><\/strong> audio microphone record button &#8230;<\/li>\n<li>Talk or sing or yodel or gargle or recite or &#8230;<\/li>\n<li>Click\/tap <strong><i><font color=black>black<\/font><\/i><\/strong> square within the red button to stop recording<\/li>\n<li>Click\/tap white <strong><i><font color=blue>Save<\/font><\/i><\/strong> button<\/li>\n<li> &#8230; then in what appears here soon &#8230;<!--hr class=\"ybi\"><\/hr--><\/li>\n<li>Click\/tap the Choose files button<\/li>\n<li>Navigate to the <strong><i><font color=blue>Downloads<\/font><\/i><\/strong> folder<\/li>\n<li>Select the most recent audio file (eg. .mp3 .wav)<\/li>\n<li>That audio will be transferred to originator &#8230; and &#8230;<\/li>\n<li>Off to window dedicated to gathering such Audio &#8230;<\/li>\n<li>You can email or SMS media files to a recipient<\/li>\n<\/ol>\n<\/div>\n<p> &#8230; getting us closer to simulating those train announcements!<\/p>\n<p>It panned out, with this work, that our window arrangements were best served &#8230;<\/p>\n<ul>\n<li>on non-mobile, via two new window.open windows &#8230; and &#8230;<\/li>\n<li>on mobile, via one new window.open (for the audio recorder helper) and an iframe hosted client browsing, preceded by &#8220;splashpage&#8221; arrangement &#8230;\n<p><img decoding=\"async\" alt=\"Audio Recording YouTube Interfacer Revisit Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/mobile_karaoke_audio_recording.gif\"><\/img><\/p>\n<\/li>\n<\/ul>\n<p>And so, there was this <font size=1>(hashtag navigation assisted work)<\/font>, in <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.html----------------------------------------------------------GETME\" rel=\"noopener\">a changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.html----------------------------------------------------------GETME\" rel=\"noopener\">karaoke_youtube_api.htm<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.htm\" rel=\"noopener\">inhouse YouTube Informational Organizer and improved Audio Recording Organizer<\/a> web application, as well as rearrangements we think are less annoying by giving the recent <a title='YouTube Video List of Play Supervisor Tutorial' href='#ytvlpst'>Sequential Play<\/a> functionality it&#8217;s own &#8220;Sequentially?&#8221; button the user should now click <font size=1>(if they&#8217;re happy <strong>and<\/strong> they know it, or think <strong>sequential play is the best thing since sliced bread (ie. is the bee&#8217;s knees)<\/strong>)<\/font>, to facilitate less interference with the other button options as well, when a user selects multiple <a target=\"_blank\" title=\"YouTube\" href='\/\/youtube.com' rel=\"noopener\">YouTube<\/a> videos of interest, via a YouTube based search for them.<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=\"_blank\" href='\/\/www.rjmprogramming.com.au\/ITblog\/audio-recording-youtube-interfacer-revisit-tutorial\/' rel=\"noopener\">Audio Recording YouTube Interfacer Revisit Tutorial<\/a>.<\/p-->\n<hr>\n<p id='ytvlpst'>Previous relevant <a target=\"_blank\" title='YouTube Video List of Play Supervisor Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/youtube-video-list-of-play-supervisor-tutorial\/' rel=\"noopener\">YouTube Video List of Play Supervisor Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.htm\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"YouTube Video List of Play Supervisor Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/tokyo_research.png\" title=\"YouTube Video List of Play Supervisor Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">YouTube Video List of Play Supervisor Tutorial<\/p><\/div>\n<p>Today, as far as &#8220;<a target=\"_blank\" title=\"YouTube\" href='https:\/\/youtube.com' rel=\"noopener\">YouTube<\/a> Video List of Play&#8221; supervisors goes, we add to yesterday&#8217;s <a title='Spliced Audio\/Video YouTube Shuffle Tutorial' href='#sa\/vytst'>Spliced Audio\/Video YouTube Shuffle Tutorial<\/a> &#8230;<\/p>\n<ul>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html--------GETME\" rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html--------GETME\" rel=\"noopener\">splice_audio.htm<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.htm\" rel=\"noopener\">Spliced Audio\/Video\/Image web application live run<\/a><\/li>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/esp_ornot_esp.html--------GETME\" rel=\"noopener\">our tweaked<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/esp_ornot_esp.html--------GETME\" rel=\"noopener\">esp_ornot_esp.html<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/esp_ornot_esp.html\" rel=\"noopener\">YouTube API Interfacing web application<\/a><\/li>\n<\/ul>\n<p> &#8230; with &#8230;<\/p>\n<ul>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.html------------------------------------------------------GETME\" rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.html------------------------------------------------------GETME\" rel=\"noopener\">karaoke_youtube_api.htm<\/a> t&#8221; <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.htm\" rel=\"noopener\">inhouse YouTube informational organizer<\/a> web application &#8220;parent&#8221; itself<\/li>\n<\/ul>\n<p> &#8230; which is, of course, your more obvious, and generic, such supervisor, it having a YouTube based search mechanism itself, that the user can use to &#8230;<\/p>\n<ol>\n<li>click <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.htm\" rel=\"noopener\">inhouse YouTube informational organizer<\/a> web application &#8220;parent&#8221; link &#8230;<\/li>\n<li>enter in a search string for YouTube to look for &#8230;<\/li>\n<li>click the &#8220;More Than One to Select&#8221; checkbox &#8230;<\/li>\n<li>select more than one YouTube video &#8230;<\/li>\n<li>click one of the presentation type buttons up the top &#8230; and &#8230;<\/li>\n<li>see your &#8220;<a target=\"_blank\" title=\"YouTube\" href='https:\/\/youtube.com' rel=\"noopener\">YouTube<\/a> Video List of Plays&#8221; presented down the bottom of the original window (you may have to navigate back to)<\/li>\n<\/ol>\n<p>And, from there, you can &#8230;<\/p>\n<ul>\n<li>loop<\/li>\n<li>shuffle<\/li>\n<li>save as &#8230; to a name of your choosing &#8230; then &#8230;\n<ol>\n<li>recall that &#8220;<a target=\"_blank\" title=\"YouTube\" href='https:\/\/youtube.com' rel=\"noopener\">YouTube<\/a> Video List of Plays&#8221;<\/li>\n<li>email or SMS that &#8220;<a target=\"_blank\" title=\"YouTube\" href='https:\/\/youtube.com' rel=\"noopener\">YouTube<\/a> Video List of Plays&#8221; off to somebody<\/li>\n<li>forget that &#8220;<a target=\"_blank\" title=\"YouTube\" href='https:\/\/youtube.com' rel=\"noopener\">YouTube<\/a> Video List of Plays&#8221;<\/li>\n<\/ol>\n<\/li>\n<\/ul>\n<p> &#8230; to be able to play videos in a sequence that is &#8220;there and then&#8221; for non-mobile and &#8220;one tap&#8221; and then there and then for mobile.<\/p>\n<p><video style=\"width:100%;\" controls><source src=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/tokyo_research.mp4\" type=\"video\/mp4\"><\/source><track src=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/tokyo_research.vtt\" kind=\"subtitles\" srclang=\"en\" label=\"English\"><\/track><\/video><\/p>\n<p>Codewise, one new Javascript function intervenes to assist with this work, as per &#8230;<\/p>\n<p><code><br \/>\nfunction lookatmultiple(newsc) {<br \/>\n  var newdefc=0, hvis=[];<br \/>\n  var aot,jaot=0,aotfactor=1.0,iaot,aotdur=0.0,faot=[60.0,60.0,24.0];<br \/>\n  var sin=document.getElementById('ajaxs');<br \/>\n  \/\/alert('' + sin.id);<br \/>\n  var zero=0, lone=1, tod='', iickk;<br \/>\n  var spareanyt='\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.htm?youtubeid=&youtube_duration=&email=&email=&emoji=on&c0=on&i0=0&j0=&rand=' + Math.floor(Math.random() * 1989786);<br \/>\n  for (var ii=0; ii&lt;sin.options.length; ii++) {<br \/>\n    if (sin.options[ii].selected) {<br \/>\n      if (sin.options[ii].value != '') {<br \/>\n        \/\/alert(sin.options[ii].value);<br \/>\n        aotdur=0.0;<br \/>\n        aotfactor=1.0;<br \/>\n        jaot=0;<br \/>\n        aot=sin.options[ii].text.split('(')[eval(-1 + sin.options[ii].text.replace(')',' ').split('(').length)].replace(')',' ').split(':');<br \/>\n        if (aot.length == 1 && aot[0].replace(' second ',',').replace(' seconds ',',').indexOf(',') != -1) {<br \/>\n        hvis=aot[0].split(' hour');<br \/>\n        if (hvis.length != 1) { console.log(hvis[0]); aotdur+=eval(eval('' + hvis[0]) * 60 * 60); aot[0]=aot[0].replace(' hours,',' hour').replace(' hour,',' hour').split(' hour')[1]; }<br \/>\n        hvis=aot[0].split(' minute');<br \/>\n        if (hvis.length != 1) { console.log(hvis[0]); aotdur+=eval(eval('' + hvis[0]) * 60); aot[0]=aot[0].replace(' minutes,',' minute').replace(' minute,',' minute').split(' minute')[1]; }<br \/>\n        hvis=aot[0].split(' second');<br \/>\n        if (hvis.length != 1) { console.log(hvis[0]); aotdur+=eval(eval('' + hvis[0]) * 1);  }<br \/>\n        } else {<br \/>\n        for (iaot=eval(-1 + aot.length); iaot&gt;=0; iaot--) {<br \/>\n          aotdur+=eval(aotfactor * aot[iaot]);<br \/>\n          jaot++;<br \/>\n          aotfactor *= faot[jaot];<br \/>\n        }<br \/>\n        }<br \/>\n        if (aotdur &gt; 0.0) {<br \/>\n          if (spareanyt.indexOf('youtubeid=&') != -1) {<br \/>\n            spareanyt=spareanyt.replace('youtubeid=&', 'youtubeid=' + sin.options[ii].value + '&').replace('youtube_duration=&', 'youtube_duration=' + encodeURIComponent(Math.ceil(eval('' + aotdur)) + '.000') + '&').replace('j0=', 'j0=' + Math.ceil(eval('' + aotdur)) + '');<br \/>\n          } else {<br \/>\n            spareanyt+='&c' + lone + '=on&i' + lone + '=0|' + sin.options[ii].value + '&j' + lone + '=' + Math.ceil(eval('' + aotdur));<br \/>\n            lone++;<br \/>\n            tod=' ';<br \/>\n          }<br \/>\n          newdefc++;<br \/>\n          \/\/alert('' + newdefc + ': ' + spareanyt);<br \/>\n        }<br \/>\n      }<br \/>\n    }<br \/>\n  }<br \/>\n  if (newdefc &gt; 1) {<br \/>\n      for (iickk=lone; iickk&lt;=29; iickk++) {<br \/>\n          spareanyt+='&c' + iickk + '=off&i' + iickk + '=&j' + iickk + '=';<br \/>\n      }<br \/>\n      \/\/alert(spareanyt + tod.replace(' ','#' + encodeURIComponent(document.URL.split(':')[0] + ':' + spareanyt + '&loop=y')).trim());<br \/>\n      if (newsc == 0) {<br \/>\n        document.getElementById('myform').target='_blank';<br \/>\n        \/\/document.getElementById('myform').action=document.getElementById('myform').action.split('#')[0] + '#' + encodeURIComponent(document.URL.split(':')[0] + ':' + spareanyt + '&loop=y');<br \/>\n        document.getElementById('sumlist').innerHTML=document.getElementById('youtubeid').value.trim();<br \/>\n        document.getElementById('iflist').src=spareanyt + tod.replace(' ','#' + encodeURIComponent(document.URL.split(':')[0] + ':' + spareanyt + '&loop=y')).trim();<br \/>\n        document.getElementById('detlist').style.display='block';<br \/>\n        setTimeout(function(){ document.getElementById('detlist').scrollIntoView(); }, 2000); \/\/location.href='#detlist';<br \/>\n      } else if (1 == 1) {<br \/>\n        document.getElementById('myform').target='_blank';<br \/>\n        document.getElementById('myform').action=document.getElementById('myform').action.split('#')[0] + '#' + encodeURIComponent(document.URL.split(':')[0] + ':' + spareanyt + '&loop=y');<br \/>\n      } else {<br \/>\n        wowowo=window.open(spareanyt + tod.replace(' ','#' + encodeURIComponent(document.URL.split(':')[0] + ':' + spareanyt + '&loop=y')).trim(), '_blank'); \/\/, 'top=100,left=100,width=1000,height=800');<br \/>\n      }<br \/>\n  }<br \/>\n  return true;<br \/>\n}<br \/>\n<\/code><\/p>\n<p> &#8230; or watch on <a target=\"_blank\" title='YouTube' href='\/\/youtube.com' rel=\"noopener\">YouTube<\/a> itself &#8230;<\/p>\n<p><iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/ZNgN2AeRq7Y?si=FbkG3MuvQtUnTEg5\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=\"_blank\" href='\/\/www.rjmprogramming.com.au\/ITblog\/youtube-video-list-of-play-supervisor-tutorial\/' rel=\"noopener\">YouTube Video List of Play Tutorial<\/a>.<\/p-->\n<hr>\n<p id='sa\/vytst'>Previous relevant <a target=\"_blank\" title='Spliced Audio\/Video YouTube Shuffle Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/spliced-audio\/video-youtube-shuffle-tutorial\/' rel=\"noopener\">Spliced Audio\/Video YouTube Shuffle Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.htm\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Spliced Audio\/Video YouTube Shuffle Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_shuffle.jpg\" title=\"Spliced Audio\/Video YouTube Shuffle Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">Spliced Audio\/Video YouTube Shuffle Tutorial<\/p><\/div>\n<p>Some of the motivation for today&#8217;s addition of <i>Shuffle<\/i> logic to the &#8220;<a target=\"_blank\" title=\"YouTube\" href='https:\/\/youtube.com' rel=\"noopener\">YouTube<\/a> Video List of Plays&#8221; work we last mentioned with <a title='Spliced Audio\/Video YouTube Mobile Recall Tutorial' href='#sa\/vytmrt'>Spliced Audio\/Video YouTube Mobile Recall Tutorial<\/a> of recent times is to do with the huge percentage of time spent, in such a project, running the same test conditions again and again and again, and we were getting a bit bored with the same order of songs each time, for hundreds of tests.<\/p>\n<p>We thought it would be pretty easy to do, but strangely, there were timing issues making it more complicated than we thought it would be for a user who clicks the new <i>Shuffle<\/i> checkbox that appears when a &#8220;YouTube Video List of Plays&#8221; is detected.  For the non-mobile side of the work, we can point to a new Javascript function that helps with most of the work &#8230;<\/p>\n<p><code><br \/>\nfunction mixitup(mwhat, doitnow) {<br \/>\n  var outwhat=mwhat, elwhat='', durwhat='0', durlong='0.000', startwhat='0';<br \/>\n  \/\/alert(comingurl);<br \/>\n  if (outwhat == '') { return outwhat;  }<br \/>\n  \/\/alert(mwhat);<br \/>\n  var tonum=eval('' + Math.floor(Math.random() * 30));<br \/>\n  elwhat='';<br \/>\n  if (!document.getElementById('c' + tonum)) {<br \/>\n    elwhat='';<br \/>\n  } else if (!document.getElementById('c' + tonum).checked) {<br \/>\n    elwhat='';<br \/>\n  } else if (tonum == 0) {<br \/>\n    elwhat=decodeURIComponent(decodeURIComponent(mwhat.split(encodeURIComponent('youtubeid='))[1].split(encodeURIComponent('&'))[0].split(encodeURIComponent('#'))[0]));<br \/>\n  } else if (mwhat.indexOf('&i' + tonum + '=') != -1) {<br \/>\n    elwhat=newereval(decodeURIComponent(decodeURIComponent(mwhat.split(encodeURIComponent('&i' + tonum + '='))[1].split(encodeURIComponent('&'))[0].split(encodeURIComponent('#'))[0])));<br \/>\n  } else {<br \/>\n    elwhat='';<br \/>\n  }<br \/>\n  while (mwhat.indexOf(encodeURIComponent('&c' + tonum + '=on')) == -1 || elwhat == '' || document.URL.indexOf('youtubeid=' + elwhat + '&') != -1) {<br \/>\n    tonum=eval('' + Math.floor(Math.random() * 30));<br \/>\n    if (!document.getElementById('c' + tonum)) {<br \/>\n      elwhat='';<br \/>\n    } else if (!document.getElementById('c' + tonum).checked) {<br \/>\n      elwhat='';<br \/>\n    } else if (tonum == 0) {<br \/>\n      elwhat=decodeURIComponent(decodeURIComponent(mwhat.split(encodeURIComponent('youtubeid='))[1].split(encodeURIComponent('&'))[0].split(encodeURIComponent('#'))[0]));<br \/>\n    } else if (mwhat.indexOf('&i' + tonum + '=') != -1) {<br \/>\n      elwhat=newereval(decodeURIComponent(decodeURIComponent(mwhat.split(encodeURIComponent('&i' + tonum + '='))[1].split(encodeURIComponent('&'))[0].split(encodeURIComponent('#'))[0])));<br \/>\n    } else {<br \/>\n      elwhat='';<br \/>\n    }<br \/>\n  }<br \/>\n  startwhat=neweval(decodeURIComponent(decodeURIComponent(mwhat.split(encodeURIComponent('&i' + tonum + '='))[1].split(encodeURIComponent('&'))[0].split(encodeURIComponent('#'))[0])));<br \/>\n  durwhat=decodeURIComponent(decodeURIComponent(mwhat.split(encodeURIComponent('&j' + tonum + '='))[1].split(encodeURIComponent('&'))[0].split(encodeURIComponent('#'))[0])).replace(\/\\+\/g,'');<br \/>\n  if (durwhat.indexOf('.') != -1) {<br \/>\n    durlong='' + durwhat;<br \/>\n    durwhat=durlong.split('.')[0];<br \/>\n  } else {<br \/>\n    durlong='' + durwhat + '.000';<br \/>\n  }<br \/>\n  \/\/alert('tonum=' + tonum + ' and elwhat=' + elwhat + ' and outwhat=' + outwhat);<br \/>\n  if (elwhat != '') {<br \/>\n    mwhat=document.URL.split(encodeURIComponent('&shuffle='))[0];<br \/>\n    if (doitnow) {<br \/>\n      \/\/alert(outwhat.replace('youtubeid=' + mwhat.split('youtubeid=')[1].split('&')[0].split('#')[0], 'youtubeid=' + elwhat).replace('youtube_duration=' + mwhat.split('youtube_duration=')[1].split('&')[0].split('#')[0], 'youtube_duration=' + encodeURIComponent(durlong)).replace('c0=' + mwhat.split('c0=')[1].split('&')[0].split('#')[0], 'c0=on').replace('j0=' + mwhat.split('j0=')[1].split('&')[0].split('#')[0], 'j0=' + encodeURIComponent(durwhat)).replace('i0=' + mwhat.split('i0=')[1].split('&')[0].split('#')[0], 'i0=' + encodeURIComponent(startwhat)) + encodeURIComponent('&shuffle=y'));<br \/>\n      location.href=mwhat.replace('youtubeid=' + mwhat.split('youtubeid=')[1].split('&')[0].split('#')[0], 'youtubeid=' + elwhat).replace('youtube_duration=' + mwhat.split('youtube_duration=')[1].split('&')[0].split('#')[0], 'youtube_duration=' + encodeURIComponent(durlong)).replace('c0=' + mwhat.split('c0=')[1].split('&')[0].split('#')[0], 'c0=on').replace('j0=' + mwhat.split('j0=')[1].split('&')[0].split('#')[0], 'j0=' + encodeURIComponent(durwhat)).replace('i0=' + mwhat.split('i0=')[1].split('&')[0].split('#')[0], 'i0=' + encodeURIComponent(startwhat)) + encodeURIComponent('&shuffle=y');<br \/>\n    }<br \/>\n    return mwhat.replace('youtubeid=' + mwhat.split('youtubeid=')[1].split('&')[0].split('#')[0], 'youtubeid=' + elwhat).replace('youtube_duration=' + mwhat.split('youtube_duration=')[1].split('&')[0].split('#')[0], 'youtube_duration=' + encodeURIComponent(durlong)).replace('c0=' + mwhat.split('c0=')[1].split('&')[0].split('#')[0], 'c0=on').replace('j0=' + mwhat.split('j0=')[1].split('&')[0].split('#')[0], 'j0=' + encodeURIComponent(durwhat)).replace('i0=' + mwhat.split('i0=')[1].split('&')[0].split('#')[0], 'i0=' + encodeURIComponent(startwhat));<br \/>\n  }<br \/>\n  return outwhat;<br \/>\n}<br \/>\n<\/code><\/p>\n<p> &#8230; within the <i>parent<\/i> level in &#8230;<\/p>\n<ol>\n<li>&#8220;playlist&#8221; supervisors &#8230; so far just &#8230;\n<ul>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html--------GETME\" rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html--------GETME\" rel=\"noopener\">splice_audio.htm<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.htm\" rel=\"noopener\">Spliced Audio\/Video\/Image web application live run<\/a><\/li>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/esp_ornot_esp.html--------GETME\" rel=\"noopener\">our tweaked<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/esp_ornot_esp.html--------GETME\" rel=\"noopener\">esp_ornot_esp.html<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/esp_ornot_esp.html\" rel=\"noopener\">YouTube API Interfacing web application<\/a><\/li>\n<\/ul>\n<p> &#8230; grandparents &#8230; calling &#8230;<\/li>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.html------------------------------------------------------GETME\" rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.html------------------------------------------------------GETME\" rel=\"noopener\">karaoke_youtube_api.htm<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.htm\" rel=\"noopener\">inhouse YouTube informational organizer<\/a> web application &#8230; parent &#8230; calling &#8230;<\/li>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/stop_start_youtube.html---------------------------GETME\" rel=\"noopener\">the reworked<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/stop_start_youtube.html---------------------------GETME\" rel=\"noopener\">stop_start_youtube.html<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/stop_start_youtube.html\" rel=\"noopener\">inhouse YouTube API interfacer<\/a> (we&#8217;re talking about with all the blurb above) &#8230; grandchild<\/li>\n<\/ol>\n<p> &#8230; with us still differentiating the workflow logic between non-mobile and mobile &#8220;YouTube Video List of Plays&#8221;, though it was tempting to adopt yesterday&#8217;s mobile logic for non-mobile!   Maybe we will into the future!<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=\"_blank\" href='\/\/www.rjmprogramming.com.au\/ITblog\/spliced-audio\/video-youtube-shuffle-tutorial\/' rel=\"noopener\">Spliced Audio\/Video YouTube Shuffle Tutorial<\/a>.<\/p-->\n<hr>\n<p id='sa\/vytmrt'>Previous relevant <a target=\"_blank\" title='Spliced Audio\/Video YouTube Mobile Recall Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/spliced-audio\/video-youtube-mobile-recall-tutorial\/' rel=\"noopener\">Spliced Audio\/Video YouTube Mobile Recall Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.htm\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Spliced Audio\/Video YouTube Mobile Recall Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_mobile_recall.gif\" title=\"Spliced Audio\/Video YouTube Mobile Recall Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">Spliced Audio\/Video YouTube Mobile Recall Tutorial<\/p><\/div>\n<p>Of course we want to be like <a target=\"_blank\" title=\"Spotify\" href='https:\/\/spotify.com' rel=\"noopener\">Spotify<\/a>, with the one tap meaning peace for long periods playing music, as it is with <a target=\"_blank\" title=\"YouTube\" href='https:\/\/youtube.com' rel=\"noopener\">YouTube<\/a> playlists on mobile platforms.  God knows, we&#8217;ve winged enough about this mobile requirement to have a real user tap precede media play.  And so, in this context, yesterday&#8217;s <a title='Spliced Audio\/Video YouTube Recall Tutorial' href='#sa\/vytrt'>Spliced Audio\/Video YouTube Recall Tutorial<\/a>&#8216;s non-mobile &#8220;playlist&#8221; style YouTube video playing was a &#8220;walk in the park&#8221;.<\/p>\n<p>The good news today, thanks to great advice from <a target=\"_blank\" href='https:\/\/stackoverflow.com\/questions\/31510351\/youtube-iframe-api-loadvideobyid-skips-the-video' title='Thanks to Youtube Iframe API loadVideoById() skips the video' rel=\"noopener\">Youtube Iframe API loadVideoById() skips the video<\/a>, though, is that using the <a target=\"_blank\" title='YouTube API for Iframe embedded videos' href='https:\/\/developers.google.com\/youtube\/iframe_api_reference' rel=\"noopener\">YouTube API<\/a>, and finding the proper interception point, that being <font color=blue>YT.PlayerState.ENDED<\/font> YouTube API event as below &#8230;<\/p>\n<p><code><br \/>\n      function onPlayerStateChange(event) {<br \/>\n             if (event.data == YT.PlayerState.PLAYING) {<br \/>\n                   <font color=magenta>if (ismobileplaylistplay) {<br \/>\n                     if (firstdelay &lt; 0) {<br \/>\n                        firstdelay=eval(eval(parent.document.URL.split('&j0=')[1].split('&')[0].split('#')[0]) - eval(parent.document.URL.split('&i0=')[1].split(';')[0].split('&')[0].split('#')[0]));<br \/>\n                     }<br \/>\n                     if (!firststdone) {  firststdone=true; setTimeout(preparentlook, eval(1000 * firstdelay)); }<br \/>\n                   } <\/font><br \/>\n\/\/<br \/>\n\/\/ blah blah blah ... regarding other event types ... blah blah blah<br \/>\n\/\/<br \/>\n       <font color=blue>} else if (event.data == YT.PlayerState.ENDED) {  <\/font><br \/>\n                   <font color=purple>if (ismobileplaylistplay) {<br \/>\n                   \/\/alert('here');<br \/>\n        firstdelay=-1;<br \/>\n        if (ivid &lt; eval('' + vidarrv.length)) {<br \/>\n        console.log('0:' + ivid);<br \/>\n           while (!parent.document.getElementById('c' + ivid).checked) {<br \/>\n             ivid++;<br \/>\n             if (ivid &gt;= eval('' + vidarrv.length)) {<br \/>\n              if (!parent.document.getElementById('loopchk')) {<br \/>\n               ivid=-1;<br \/>\n              } else if (parent.document.getElementById('loopchk').checked) {<br \/>\n               ivid=0;<br \/>\n              } else {<br \/>\n               ivid=-1;<br \/>\n              }<br \/>\n             }<br \/>\n           }<br \/>\n        console.log('00:' + ivid);<br \/>\n           if (ivid &gt;= 0) {<br \/>\n        console.log('000:' + ivid + ' ' + vidarrv[ivid]);<br \/>\n            if (1 == 1) {<br \/>\n            ivid=ivid;<br \/>\n            } else {<br \/>\n            event.target.cueVideoById(vidarrv[ivid], eval('' + vidstarts[ivid]), eval(eval('' + viddurs[ivid]) - eval('' + vidstarts[ivid])), \"medium\");<br \/>\n            }<br \/>\n            if (firstdelay &lt; 0) {<br \/>\n              firststdone=false;<br \/>\n              firstdelay=eval(eval('' + viddurs[eval(eval(1 + ivid) % viddurs.length)]) - eval('' + vidstarts[eval(eval(1 + ivid) % vidstarts.length)]));<br \/>\n            }<br \/>\n            if (1 == 1) {<br \/>\n            vid=vidarrv[ivid];<br \/>\n            secscnt='' + eval('' + vidstarts[ivid]);<br \/>\n            vidarr=vid.split(',');<br \/>\n            playtime=eval(eval('' + viddurs[ivid]) - eval('' + vidstarts[ivid]));<br \/>\n            event.target.loadVideoById(vidarrv[ivid], eval('' + vidstarts[ivid]), eval(eval('' + viddurs[ivid]) - eval('' + vidstarts[ivid])));<br \/>\n            parent.document.getElementById('youtubeid').value=vid;<br \/>\n            parent.document.getElementById('youtube_duration').value='' + viddurs[ivid];<br \/>\n            setTimeout(function(){ parent.document.getElementById('myh1').innerHTML=event.target.getVideoData().title;  top.document.title=event.target.getVideoData().title;  }, 2000);<br \/>\n            } else {<br \/>\n            event.target.playVideo();<br \/>\n            }<br \/>\n           }<br \/>\n           ivid++;<br \/>\n           if (ivid &gt;= eval('' + vidarrv.length)) {<br \/>\n               ivid=0;<br \/>\n           }<br \/>\n           if (ivid &lt; eval('' + vidarrv.length)) {<br \/>\n        console.log(eval(1000 *  eval(eval('' + viddurs[ivid]) - eval('' + vidstarts[ivid]))));<br \/>\n              if ('sadnews' == 'sadnews') {<br \/>\n              if (firstdelay &lt; 0) {<br \/>\n              firststdone=false;<br \/>\n              firstdelay=eval(eval('' + viddurs[ivid]) - eval('' + vidstarts[ivid]));<br \/>\n              }<br \/>\n              } else {<br \/>\n              setTimeout(preparentlook, eval(1000 *  eval(eval('' + viddurs[ivid]) - eval('' + vidstarts[ivid]))));<br \/>\n              }<br \/>\n           }<br \/>\n        }<br \/>\n                   } <\/font><br \/>\n        <font color=blue>}<\/font><br \/>\n        }<br \/>\n<\/code><\/p>\n<p> &#8230; we <a target=\"_blank\" class=\"audioytplay\" title=\"?\" href='https:\/\/www.youtube.com\/watch?v=e9_7GcQeiqw&#038;t=2m37s' rel=\"noopener\">finally<\/a> arrived at a happy home for our <font color=purple>interventional Javascript<\/font> <font color=magenta size=1>&#8230; as well as a first play intervention<\/font>.  As important as &#8220;intervention&#8221; is, this intervention needed some <font color=olive>&#8220;preparatory intervention&#8221;<\/font> that little bit earlier on in time &#8230;<\/p>\n<p><code><br \/>\n<font color=olive> var comeval='', vidarrv=[], vidstarts=[], viddurs=[], viddos=[], ivid=0, firstdelay=-1, ismobileplaylistplay=false, firststdone=false, lookedat=false;<\/font><br \/>\n<br \/>\n      function onYouTubeIframeAPIReady() {<br \/>\n        if (vid.length &gt; ('cGdz3GNhEQ4').length) {<br \/>\n        play_list_id=vid;<br \/>\n        vid='';<br \/>\n        player = new YT.Player('player', {<br \/>\n          width: vwidth,<br \/>\n          height: vheight,<br \/>\n          playerVars:<br \/>\n          {<br \/>\n            listType: 'playlist',<br \/>\n            list:  play_list_id,<br \/>\n            index: 0<br \/>\n          },<br \/>\n          events: {<br \/>\n            'onReady': onPlayerReady,<br \/>\n            'onStateChange': onPlayerStateChange<br \/>\n          }<br \/>\n        });<br \/>\n        \/\/event.target.playVideoAt(0);<br \/>\n        } else {<br \/>\n        player = new YT.Player('player', {<br \/>\n          height: vheight,<br \/>\n          width: vwidth,<br \/>\n          videoId: vid,<br \/>\n          events: {<br \/>\n            'onReady': onPlayerReady,<br \/>\n            'onStateChange': onPlayerStateChange<br \/>\n          }<br \/>\n        });<br \/>\n        console.log('Parent is ' + parent.document.URL);<br \/>\n        <font color=olive>if (parent.document.URL.indexOf('#http') != -1 && !lookedat) {<br \/>\n          lookedat=true;<br \/>\n          if (parent.document.URL.split('#')[0].split('\/\/')[1] == decodeURIComponent(parent.document.URL.split('#')[1]).split('&loop')[0].split('&name')[0].split('\/\/')[1]) {<br \/>\n             if (navigator.userAgent.match(\/Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile\/i) && 1 == 1) {<br \/>\n               comeval=parent.getcomingurl();<br \/>\n               if (comeval != '') {<br \/>\n               \/\/alert(1);<br \/>\n                 parent.unsetieo();<br \/>\n               \/\/alert(11);<br \/>\n                 firstdelay=eval(eval(parent.document.URL.split('&j0=')[1].split('&')[0].split('#')[0]) - eval(parent.document.URL.split('&i0=')[1].split(';')[0].split('&')[0].split('#')[0]));<br \/>\n               \/\/alert(firstdelay);<br \/>\n                 ivid=0;<br \/>\n                 ismobileplaylistplay=true;<br \/>\n                 \/\/  vidarr=[], vidstarts=[], viddurs=[], viddos=[]<br \/>\n                 setTimeout(function(){<br \/>\n                 for (var iipp=0; iipp&lt;=29; iipp++) {<br \/>\n                    if (parent.document.URL.indexOf('youtubeid=') != -1 && iipp == 0) {<br \/>\n                      vidarrv.push(parent.document.URL.split('youtubeid=')[1].split('&')[0].split('#')[0]);<br \/>\n                      vidstarts.push(parent.neweval(parent.document.URL.split('&i' + iipp + '=')[1].split('&')[0].split('#')[0]));<br \/>\n                      if (parent.document.URL.indexOf('&c' + iipp + '=on') != -1) {<br \/>\n                        viddos.push(true);<br \/>\n                      } else if (parent.document.URL.indexOf('&c' + iipp + '=off') != -1) {<br \/>\n                        viddos.push(false);<br \/>\n                      } else {<br \/>\n                        viddos.push(false);<br \/>\n                      }<br \/>\n                      viddurs.push(parent.document.URL.split('&j' + iipp + '=')[1].split('&')[0].split('#')[0]);<br \/>\n                      if (1 == 4) {<br \/>\n                      event.target.cueVideoById(<br \/>\n                           vidarrv[eval(-1 + vidarrv.length)],<br \/>\n                           eval('' + vidstarts[eval(-1 + vidstarts.length)]),<br \/>\n                           eval(eval('' + viddurs[eval(-1 + viddurs.length)]) - eval('' + vidstarts[eval(-1 + vidstarts.length)])),<br \/>\n                           \"medium\");<br \/>\n                      }<br \/>\n                    } else if (parent.document.URL.indexOf('&i' + iipp + '=') != -1 && parent.document.URL.indexOf('&i' + iipp + '=&') == -1 && parent.document.URL.indexOf('&i' + iipp + '=#') == -1) {<br \/>\n                      ivid=1;<br \/>\n                      vidstarts.push(parent.neweval(parent.document.URL.split('&i' + iipp + '=')[1].split('&')[0].split('#')[0]));<br \/>\n                      \/\/alert(vidstarts[eval(-1 + vidstarts.length)]);<br \/>\n                      vidarrv.push(parent.newereval(parent.document.URL.split('&i' + iipp + '=')[1].split('&')[0].split('#')[0]));<br \/>\n                      if (parent.document.URL.indexOf('&c' + iipp + '=on') != -1) {<br \/>\n                        viddos.push(true);<br \/>\n                      } else if (parent.document.URL.indexOf('&c' + iipp + '=off') != -1) {<br \/>\n                        viddos.push(false);<br \/>\n                      } else {<br \/>\n                        viddos.push(false);<br \/>\n                      }<br \/>\n                      viddurs.push(parent.document.URL.split('&j' + iipp + '=')[1].split('&')[0].split('#')[0]);<br \/>\n   \/\/alert(viddurs[eval(-1 + viddurs.length)]);<br \/>\n                      if (viddos[eval(-1 + viddos.length)] && viddurs[eval(-1 + viddurs.length)].replace(\/^0\/g,'') != '') {<br \/>\n   \/\/alert('event.target.cueVideoById(' + vidarrv[eval(-1 + vidarrv.length)] + ',' + eval('' + vidstarts[eval(-1 + vidstarts.length)]) + ',' + eval(eval('' + viddurs[eval(-1 + viddurs.length)]) - eval('' + vidstarts[eval(-1 + vidstarts.length)])) + ');');<br \/>\n                        if (1 == 4) {<br \/>\n                        try {<br \/>\n                        event.target.cueVideoById(<br \/>\n                           vidarrv[eval(-1 + vidarrv.length)],<br \/>\n                           eval('' + vidstarts[eval(-1 + vidstarts.length)]),<br \/>\n                           eval(eval('' + viddurs[eval(-1 + viddurs.length)]) - eval('' + vidstarts[eval(-1 + vidstarts.length)])),<br \/>\n                           \"medium\");<br \/>\n                        } catch(errsd) { alert(errsd.message);  }<br \/>\n                        }<br \/>\n   \/\/alert('event.target.cueVideoById(' + vidarrv[eval(-1 + vidarrv.length)] + ',' + eval('' + vidstarts[eval(-1 + vidstarts.length)]) + ',' + eval(eval('' + viddurs[eval(-1 + viddurs.length)]) - eval('' + vidstarts[eval(-1 + vidstarts.length)])) + ');');<br \/>\n                      }<br \/>\n                      <br \/>\n                    }<br \/>\n                 }<br \/>\n                 \/\/alert('vidarrv.length=' + vidarrv.length);<br \/>\n                 \/\/alert('found! looping ' + parent.getlooping());<br \/>\n                 setInterval(lookforparentcues, 100);<br \/>\n                 }, 4000);<br \/>\n               }<br \/>\n             }<br \/>\n          }<br \/>\n        }<\/font><br \/>\n        }<br \/>\n      }<br \/>\n<\/code><\/p>\n<p>Methinks it&#8217;s doubtful this avoidance of &#8220;all but the first&#8221; mobile tap &#8220;ask&#8221; can be avoided not using the YouTube API.  For mobile, with these inhouse &#8230;<\/p>\n<ol>\n<li>&#8220;playlist&#8221; supervisors &#8230; so far just &#8230;\n<ul>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html--------GETME\" rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html--------GETME\" rel=\"noopener\">splice_audio.htm<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.htm\" rel=\"noopener\">Spliced Audio\/Video\/Image web application live run<\/a><\/li>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/esp_ornot_esp.html--------GETME\" rel=\"noopener\">our tweaked<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/esp_ornot_esp.html--------GETME\" rel=\"noopener\">esp_ornot_esp.html<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/esp_ornot_esp.html\" rel=\"noopener\">YouTube API Interfacing web application<\/a><\/li>\n<\/ul>\n<p> &#8230; grandparents &#8230; calling &#8230;<\/li>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.html-----------------------------------------------------GETME\" rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.html-----------------------------------------------------GETME\" rel=\"noopener\">karaoke_youtube_api.htm<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.htm\" rel=\"noopener\">inhouse YouTube informational organizer<\/a> web application &#8230; parent &#8230; calling &#8230;<\/li>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/stop_start_youtube.html--------------------------GETME\" rel=\"noopener\">the reworked<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/stop_start_youtube.html--------------------------GETME\" rel=\"noopener\">stop_start_youtube.html<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/stop_start_youtube.html\" rel=\"noopener\">inhouse YouTube API interfacer<\/a> (we&#8217;re talking about with all the blurb above) &#8230; grandchild<\/li>\n<\/ol>\n<p> &#8230; we cut out &#8220;parent&#8221; involvement in any &#8220;decision making&#8221; sense, except as the place where checkboxes determine what is played, otherwise we know, you risk needing to re-rely on user instigated taps after the first when playing mobile &#8220;playlist&#8221; video lists sequentially.<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=\"_blank\" href='\/\/www.rjmprogramming.com.au\/ITblog\/spliced-audio\/video-youtube-mobile-recall-tutorial\/' rel=\"noopener\">Spliced Audio\/Video YouTube Mobile Recall Tutorial<\/a>.<\/p-->\n<hr>\n<p id='sa\/vytrt'>Previous relevant <a target=\"_blank\" title='Spliced Audio\/Video YouTube Recall Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/spliced-audio\/video-youtube-recall-tutorial\/' rel=\"noopener\">Spliced Audio\/Video YouTube Recall Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.htm\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Spliced Audio\/Video YouTube Recall Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_recall.gif\" title=\"Spliced Audio\/Video YouTube Recall Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">Spliced Audio\/Video YouTube Recall Tutorial<\/p><\/div>\n<p>Yesterday&#8217;s <a title='Spliced Audio\/Video YouTube Overlay Tutorial' href='#sa\/vytot'>Spliced Audio\/Video YouTube Overlay Tutorial<\/a> uses <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.html----------------------------------------------------GETME\" rel=\"noopener\">the considerably changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.html----------------------------------------------------GETME\" rel=\"noopener\">karaoke_youtube_api.htm<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.htm\" rel=\"noopener\">inhouse YouTube video interfacer<\/a> to add some new &#8230;<\/p>\n<ol>\n<li><font color=blue>recall<\/font><\/li>\n<li><font color=purple>looping<\/font><\/li>\n<p>&#8230; <\/ol>\n<p> &#8230; functionality possibilities where a supervisory web application such as <font size=1>so far just<\/font> &#8230;<\/p>\n<ul>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html--------GETME\" rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html--------GETME\" rel=\"noopener\">splice_audio.htm<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.htm\" rel=\"noopener\">Spliced Audio\/Video\/Image web application live run<\/a><\/li>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/esp_ornot_esp.html--------GETME\" rel=\"noopener\">our tweaked<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/esp_ornot_esp.html--------GETME\" rel=\"noopener\">esp_ornot_esp.html<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/esp_ornot_esp.html\" rel=\"noopener\">YouTube API Interfacing web application<\/a><\/li>\n<\/ul>\n<p> &#8230; organize themselves with a hashtag based calling URL logic when multiple YouTube videos are being asked to play sequentially.  Here is new Javascript featuring in the inhouse YouTube API Video Player via <i>lhchk(&#8221;);<\/i> new call at the document.body onload event &#8230;<\/p>\n<p><code><br \/>\n<font color=blue>function saveplaylist() {<br \/>\n if (document.getElementById('namechk') && document.getElementById('namethechk') && document.URL.indexOf('#http') != -1) {<br \/>\n  if (document.getElementById('namechk').checked && document.getElementById('namethechk').value.trim() != '') {<br \/>\n    if (('' + window.localStorage.getItem('karaoke_youtube_api-' + document.getElementById('namethechk').value.replace(\/\\ \/g, '-'))).replace(\/^null\/g,'').replace(\/^undefined\/g,'') != '') {<br \/>\n      window.localStorage.removeItem('karaoke_youtube_api-' + document.getElementById('namethechk').value.replace(\/\\ \/g, '-'));<br \/>\n    }<br \/>\n    window.localStorage.setItem('karaoke_youtube_api-' + document.getElementById('namethechk').value.replace(\/\\ \/g, '-'), encodeURIComponent(decodeURIComponent(document.URL.split('#')[1]).split('&loop=')[0].split('&name=')[0] + '#' + document.URL.split('#')[1]));<br \/>\n  }<br \/>\n }<br \/>\n}<br \/>\n<br \/>\nfunction newpl(insvalo) {<br \/>\n  var insval=insvalo.value, forgotthis='';<br \/>\n  if (insval.trim() != '' && insvalo.options[insvalo.selectedIndex].innerHTML.replace('Forget ... ','') != '') {<br \/>\n   if (insval.indexOf('x ') == 0) {<br \/>\n    forgotthis=insvalo.options[insvalo.selectedIndex].innerHTML.replace('Forget ... ','');<br \/>\n    window.localStorage.removeItem('karaoke_youtube_api-' + insvalo.options[insvalo.selectedIndex].innerHTML.replace('Forget ... ','').replace(\/\\ \/g,'-'));<br \/>\n    insvalo.innerHTML=insvalo.innerHTML.replace(forgotthis,'').replace(forgotthis,'');<br \/>\n   } else {<br \/>\n    location.href=decodeURIComponent(insval).replace('https:','').replace('http:','');<br \/>\n   }<br \/>\n  }<br \/>\n}<br \/>\n<br \/>\nfunction lhchk(inmode) {<br \/>\n  <font color=purple>var lcchk=' checked'<\/font>, lcname='';<br \/>\n  if (inmode == '') {<br \/>\n   for (const [key, value] of Object.entries(localStorage)) { \/\/ thanks to <a target=\"_blank\" title='https:\/\/stackoverflow.com\/questions\/3138564\/looping-through-localstorage-in-html5-and-javascript' href='\/\/stackoverflow.com\/questions\/3138564\/looping-through-localstorage-in-html5-and-javascript' rel=\"noopener\">https:\/\/stackoverflow.com\/questions\/3138564\/looping-through-localstorage-in-html5-and-javascript<\/a><br \/>\n    if (('' + key).indexOf('karaoke_youtube_api-') == 0) {<br \/>\n      if (recallsel == '') {<br \/>\n       recallsel='&lt;select style=\"width:80px;\" onchange=\"newpl(this);\"&gt;&lt;option value=\"\"&gt;Optionally choose a saved Playlist below ...&lt;\/option&gt;&lt;\/select&gt;';<br \/>\n      }<br \/>\n      recallsel=recallsel.replace('&lt;\/select&gt;', '&lt;option value=\"' + value + '\"&gt;' + ('' + key).split('karaoke_youtube_api-')[1].replace(\/\\-\/g, ' ') + '&lt;\/option&gt;&lt;option value=\"x ' + value + '\"&gt;Forget ... ' + ('' + key).split('karaoke_youtube_api-')[1].replace(\/\\-\/g, ' ') + '&lt;\/option&gt;&lt;\/select&gt;');<br \/>\n    }<br \/>\n   }<br \/>\n  }<br \/>\n  if (document.URL.indexOf('#http') != -1) {<br \/>\n   if (inmode == '') {<br \/>\n    recallurl=decodeURIComponent(document.URL.split('#')[1]).split('&loop=')[0].split('&name=')[0] + '#' + document.URL.split('#')[1];<br \/>\n    document.getElementById('spanthst').innerHTML=' ... ' + recallsel.replace('80px;', '160px;');<br \/>\n   } else {<br \/>\n    <font color=purple>if (decodeURIComponent(document.URL.split('#')[1]).toLowerCase().indexOf('&loop=n') != -1) { lcchk='';   }<\/font><br \/>\n    if (decodeURIComponent(document.URL.split('#')[1]).toLowerCase().indexOf('&name=') != -1 && decodeURIComponent((document.URL + encodeURIComponent('&')).split('#')[1]).toLowerCase().indexOf('&name=&') == -1) {<br \/>\n      lcname=decodeURIComponent(document.URL.split('#')[1]).split('&name=')[1].split('&')[0];<br \/>\n    }<br \/>\n    document.getElementById('spanthst').innerHTML='&nbsp;Loop:&nbsp;<font color=purple>&lt;input type=checkbox id=loopchk' + lcchk + '&gt;&lt;\/input&gt;<\/font>&nbsp;Saved&nbsp;&lt;input type=checkbox onchange=saveplaylist(); id=namechk&gt;&lt;\/input&gt;&nbsp;as&nbsp;&lt;input style=\"width:80px;\" onblur=saveplaylist(); id=namethechk title=\"Recallable name\" type=text placeholder\"Recallable name\" value=\"' + lcname + '\"&gt;&lt;\/input&gt;&nbsp;' + recallsel;<br \/>\n   }<br \/>\n  } else if (recallsel != '') {<br \/>\n    document.getElementById('spanthst').innerHTML=' ... ' + recallsel.replace('80px;', '160px;');<br \/>\n  }<br \/>\n}<\/font><br \/>\n<\/code><\/p>\n<p> &#8230; allowing for, perhaps continual, YouTube video play, so far just for non-mobile.  These configurations can be saved in <a target=\"_blank\" title='window.localStorage information from W3schools' href='https:\/\/www.w3schools.com\/jsref\/prop_win_localstorage.asp' rel=\"noopener\">localStorage<\/a> and recalled.<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=\"_blank\" href='\/\/www.rjmprogramming.com.au\/ITblog\/spliced-audio\/video-youtube-recall-tutorial\/' rel=\"noopener\">Spliced Audio\/Video YouTube Recall Tutorial<\/a>.<\/p-->\n<hr>\n<p id='sa\/vytot'>Previous relevant <a target=\"_blank\" title='Spliced Audio\/Video YouTube Overlay Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/spliced-audio\/video-youtube-overlay-tutorial\/' rel=\"noopener\">Spliced Audio\/Video YouTube Overlay Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.htm\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Spliced Audio\/Video YouTube Overlay Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_overlay.gif\" title=\"Spliced Audio\/Video YouTube Overlay Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">Spliced Audio\/Video YouTube Overlay Tutorial<\/p><\/div>\n<p>The concepts of &#8230;<\/p>\n<ul>\n<li><a target=\"_blank\" title='Reveal postings' href='https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/reveal' rel=\"noopener\">reveal<\/a><\/li>\n<li><a target=\"_blank\" title='Overlay postings' href='https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/overlay' rel=\"noopener\">overlay<\/a><\/li>\n<\/ul>\n<p> &#8230; we find useful, around here, to describe web page design issues and solutions.  They both come into play a lot, at least for us.  Mind you, our thoughts may have pared down complication thinking to arrive at these two concept foci.<\/p>\n<p>Today, we&#8217;re rewriting the existant Overlay logic from 2016 into our inhouse Spliced Audio\/Video\/Image web application, to cater for those data URL additional input data functionalities we&#8217;ve added with our 2025 revisit.<\/p>\n<p>And so, onto yesterday&#8217;s <a title='Spliced Audio\/Video YouTube Delimitations Tutorial' href='#sa\/vytdt'>Spliced Audio\/Video YouTube Delimitations Tutorial<\/a> we&#8217;ve <font color=blue>reworked into<\/font> those &#8230;<\/p>\n<p><code><br \/>\n&lt;div id=divanaudio&gt;&lt;audio title=\"\" id='anaudio' <font color=blue>style=\"display:none;\"<\/font> onload=alere(event); onloadedmetadata=ahere(event); style=display:none;&gt;&lt;source id=sanaudio src=\"\"&gt;&lt;\/source&gt;&lt;\/audio&gt;&lt;\/div&gt;<br \/>\n&lt;div id=divankara&gt;&lt;iframe title=\"\" id='ankara' <font color=blue>style=\"display:none;\"<\/font> onload=klere(this); style=display:none; src=\"\"&gt;&lt;\/iframe&gt;&lt;\/div&gt;<br \/>\n&lt;div id=divanvideo&gt;&lt;video title=\"\" id='anvideo' <font color=blue>style=\"display:none;\"<\/font> onload=vlere(event); onloadedmetadata=vhere(event); style=display:none;&gt;&lt;source id=sanvideo src=\"\"&gt;&lt;\/source&gt;&lt;\/video&gt;&lt;\/div&gt;<br \/>\n&lt;div id=divanimg&gt;&lt;img title=\"\" class=animg id='animg' <font color=blue>style=\"display:none;\"<\/font> onload=ihere(event); style=display:none; src=\"\"&gt;&lt;\/img&gt;&lt;\/div&gt;<br \/>\n<\/code><\/p>\n<p> &#8230; template HTML Javascript variables a <i>style=&#8221;display:none;&#8221;<\/i> <font size=1>&#8230; and curiously, we were going to use <i>style=&#8221;&#8221;<\/i> but this actually has more meaning than you&#8217;d think, as it seems to create a set of default styling decisions?! &#8230;<\/font> and then at document.body onload event <font color=olive>we have<\/font> &#8230;<\/p>\n<p><code><br \/>\n  divanaudio=document.getElementById('divanaudio').innerHTML.replace(' src=&gt;', ' src=\"\"&gt;')<font color=olive>.replace(' style=\"display:none;\"', ' style=\"\"')<\/font>;<br \/>\n  divanvideo=document.getElementById('divanvideo').innerHTML.replace(' src=&gt;', ' src=\"\"&gt;')<font color=olive>.replace(' style=\"display:none;\"', ' style=\"\"')<\/font>;<br \/>\n  divanimg=document.getElementById('divanimg').innerHTML.replace(' src=&gt;', ' src=\"\"&gt;')<font color=olive>.replace(' style=\"display:none;\"', ' style=\"\"')<\/font>;<br \/>\n  divankara=document.getElementById('divankara').innerHTML.replace(' src=&gt;', ' src=\"\"&gt;')<font color=olive>.replace(' style=\"display:none;\"', ' style=\"\"')<\/font>;<br \/>\n<\/code><\/p>\n<p> &#8230; with that template faux style <font color=purple>overwritten using<\/font> &#8230;<\/p>\n<p><code><br \/>\nfunction seqe() {<br \/>\n      var suff=' of 1', lzero=0, lone=1, iikk=0;<br \/>\n      <font color=purple>var ovbizzo='display:none;';<br \/>\n      if (audiooverlay[zero].indexOf('verlay') != -1) {<br \/>\n        var rectisz=document.getElementById('sparediv').getBoundingClientRect();<br \/>\n        ovbizzo=' position:absolute; top:' + rectisz.top + 'px; left:' + rectisz.left + 'px; z-index: ' + zind + '; opacity: 0.5; ';<br \/>\n        zind++;<br \/>\n      }<\/font><br \/>\n      if (document.getElementById('end' + eval(1 + zero)) && (spareanvideo != '' || spareanyt != '' || spareanimg != '' || spareanaudio != '' || spareelse != '' || zero &gt; 0)) {<br \/>\n      while (audiofiles[eval(0 + lzero)].trim() != '') {<br \/>\n        lzero++;<br \/>\n      }<br \/>\n      suff=' of ' + lzero;<br \/>\n      basepercent=eval(100 * (eval(0 + zero) \/ lzero));<br \/>\n      nextpercent=eval(100 * (eval(1 + zero) \/ lzero));<br \/>\n      if (spareanyt != '' || (eval('' + audiofiles[eval(0 + zero)].split('#')[0].length) == 11 && audiofiles[eval(0 + zero)].split('#')[0].indexOf(' ') == -1 && audiofiles[eval(0 + zero)].split('#')[0].indexOf('.') == -1 && audiofiles[eval(0 + zero)].split('#')[0].indexOf('\/') == -1)) {<br \/>\n      isaudio=false;<br \/>\n      if (spareanyt != '' || document.getElementById('ankara').src.indexOf('\/karaoke_') == -1) {<br \/>\n      spareanyt='\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.htm?youtubeid=' + audiofiles[eval(0 + zero)].split('#')[0] + '&youtube_duration=' + document.getElementById('end' + eval(1 + zero)).value + '&email=&email=&emoji=on&c0=on&i0=' + document.getElementById('start' + eval(1 + zero)).value + '&j0=' + Math.ceil(eval('' + document.getElementById('end' + eval(1 + zero)).value)) + '';<br \/>\n      for (iikk=eval(1 + zero); iikk&lt;audiofiles.length; iikk++) {<br \/>\n        if ((eval('' + audiofiles[eval(0 + iikk)].split('#')[0].length) == 11 && audiofiles[eval(0 + iikk)].split('#')[0].indexOf(' ') == -1 && audiofiles[eval(0 + iikk)].split('#')[0].indexOf('.') == -1 && audiofiles[eval(0 + iikk)].split('#')[0].indexOf('\/') == -1)) {<br \/>\n          spareanyt+='&c' + lone + '=on&i' + lone + '=' + document.getElementById('start' + eval(1 + iikk)).value + '|' + audiofiles[eval(0 + iikk)].split('#')[0] + '&j' + lone + '=' + document.getElementById('end' + eval(1 + iikk)).value;<br \/>\n        } else {<br \/>\n          spareanyt+='&c' + lone + '=off&i' + lone + '=&j' + lone + '=';<br \/>\n        }<br \/>\n        lone++;<br \/>\n      }<br \/>\n      for (var iickk=lone; iickk&lt;=29; iickk++) {<br \/>\n          spareanyt+='&c' + iickk + '=off&i' + iickk + '=&j' + iickk + '=';<br \/>\n      }<br \/>\n      \/\/var sd=prompt(spareanyt, spareanyt);<br \/>\n      document.getElementById('subis').style.background=dstyleit('linear-gradient(to right, yellow ' + Math.ceil(eval(100 * (eval(0 + zero) \/ lzero))) + '%, pink ' + Math.floor(eval(100 - eval(100 * (eval(0 + zero) \/ lzero)))) + '%) !important');<br \/>\n      document.getElementById('subis').value='Currently Playing YouTube Video ' + eval(1 + zero) + suff; \/\/ + ': ' + audiofiles[eval(0 + zero)].replace(\/\\ \/g,'+'); \/\/ + \" via Google Translate if you press speaker and am waiting for you to close that window.\";<br \/>\n      document.getElementById('divankara').style.width='100%';<br \/>\n      document.getElementById('divankara').style.height='800px';<br \/>\n      document.getElementById('divankara').innerHTML=divankara<font color=purple>.replace(' style=\"\"', ' style=\"' + ovbizzo + '\"')<\/font>.replace(' title=\"\"', ' title=\"Play\"').replace(' src=\"\"', ' src=\"' + spareanyt + '\"').replace('none','BLOCK');<br \/>\n      document.getElementById('ankara').style.display='block';<br \/>\n      document.getElementById('ankara').style.width='100%';<br \/>\n      document.getElementById('ankara').style.height='800px';<br \/>\n      } else if (document.getElementById('ankara').src.indexOf('\/karaoke_') == -1) {<br \/>\n      document.getElementById('subis').style.background=dstyleit('linear-gradient(to right, yellow ' + Math.ceil(eval(100 * (eval(0 + zero) \/ lzero))) + '%, pink ' + Math.floor(eval(100 - eval(100 * (eval(0 + zero) \/ lzero)))) + '%) !important');<br \/>\n      document.getElementById('subis').value='Currently Playing YouTube Video ' + eval(1 + zero) + suff; \/\/ + ': ' + audiofiles[eval(0 + zero)].replace(\/\\ \/g,'+'); \/\/ + \" via Google Translate if you press speaker and am waiting for you to close that window.\";<br \/>\n      spareanyt='\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.htm?youtubeid=' + audiofiles[eval(0 + zero)].split('#')[0] + '&youtube_duration=' + document.getElementById('end' + eval(1 + zero)).value + '&email=&email=&emoji=on&i0=' + document.getElementById('start' + eval(1 + zero)).value + '&j0=' + Math.ceil(eval('' + document.getElementById('end' + eval(1 + zero)).value)) + '&c0=on&i1=&j1=&i2=&j2=&i3=&j3=&i4=&j4=&i5=&j5=&i6=&j6=&i7=&j7=&i8=&j8=&i9=&j9=&i10=&j10=&i11=&j11=&i12=&j12=&i13=&j13=&i14=&j14=&i15=&j15=&i16=&j16=&i17=&j17=&i18=&j18=&i19=&j19=&i20=&j20=&i21=&j21=&i22=&j22=&i23=&j23=&i24=&j24=&i25=&j25=&i26=&j26=&i27=&j27=&i28=&j28=&i29=&j29=';<br \/>\n      document.getElementById('divankara').innerHTML=divankara.replace(' title=\"\"', ' title=\"Play\"').replace(' src=\"\"', ' src=\"' + spareanyt + '\"').replace('none','BLOCK');<br \/>\n      } else {<br \/>\n      document.getElementById('subis').style.background=dstyleit('linear-gradient(to right, yellow ' + Math.ceil(eval(100 * (eval(0 + zero) \/ lzero))) + '%, pink ' + Math.floor(eval(100 - eval(100 * (eval(0 + zero) \/ lzero)))) + '%) !important');<br \/>\n      document.getElementById('subis').value='Currently Playing YouTube Video ' + eval(1 + zero) + suff; \/\/ + ': ' + audiofiles[eval(0 + zero)].replace(\/\\ \/g,'+'); \/\/ + \" via Google Translate if you press speaker and am waiting for you to close that window.\";<br \/>\n      if (document.getElementById('end' + eval(0 + zero)).value.replace(\/^0\\.\/g,'@').replace(\/^0\/g,'-').indexOf('-') == -1) {<br \/>\n\/\/alert(5555);<br \/>\n        segstart=0.0;<br \/>\n        segend=eval('' + eval('' + document.getElementById('end' + eval(1 + zero)).value)) + 0 - eval('' + document.getElementById('start' + eval(1 + zero)).value);<br \/>\n        setTimeout(everysecond, 1000);<br \/>\n        setTimeout(function(){  zero++; seqe(); }, eval(1000 * (eval('' + eval('' + document.getElementById('end' + eval(1 + zero)).value)) + 4 - eval('' + document.getElementById('start' + eval(1 + zero)).value))));<br \/>\n      }<br \/>\n      }<br \/>\n      spareanyt='';<br \/>\n      if (document.getElementById('end' + eval(1 + zero)).value.replace(\/^0\\.\/g,'@').replace(\/^0\/g,'-').indexOf('-') == -1) {<br \/>\n        setTimeout(everysecond, 1000);<br \/>\n        setTimeout(function(){  zero++; seqe(); }, eval(1000 * (eval('' + document.getElementById('end' + eval(1 + zero)).value) + 4 - eval('' + document.getElementById('start' + eval(1 + zero)).value))));<br \/>\n      }<br \/>\n      } else if (audiofiles[eval(0 + zero)].indexOf('data:audio\/') == 0) {<br \/>\n      isaudio=true;<br \/>\n      document.getElementById('subis').style.background=dstyleit('linear-gradient(to right, yellow ' + Math.ceil(eval(100 * (eval(0 + zero) \/ lzero))) + '%, pink ' + Math.floor(eval(100 - eval(100 * (eval(0 + zero) \/ lzero)))) + '%) !important');<br \/>\n      document.getElementById('subis').value='Currently Playing Audio ' + eval(1 + zero) + suff; \/\/ + ': ' + audiofiles[eval(0 + zero)].replace(\/\\ \/g,'+'); \/\/ + \" via Google Translate if you press speaker and am waiting for you to close that window.\";<br \/>\n      \/\/var xc=prompt(divanaudio.replace('&lt;source ', '&lt;source type=audio\/' + audiofiles[eval(0 + zero)].split('data:audio\/')[1].split(',')[0].split(';')[0] + ' ').replace(' src=\"\"', ' src=\"' + audiofiles[eval(0 + zero)].replace(\/\\ \/g,'+') + '\"').replace('none','BLOCK'),divanaudio.replace('&lt;source ', '&lt;source type=audio\/' + audiofiles[eval(0 + zero)].split('data:audio\/')[1].split(',')[0].split(';')[0] + ' ').replace(' src=\"\"', ' src=\"' + audiofiles[eval(0 + zero)].replace(\/\\ \/g,'+') + '\"').replace('none','BLOCK'));<br \/>\n      document.getElementById('divanaudio').innerHTML=divanaudio<font color=purple>.replace(' style=\"\"', ' style=\"' + ovbizzo + '\"')<\/font>.replace('&gt;',' controls&gt;').replace(' title=\"\"', ' title=\"Play\"').replace('&lt;source ', '&lt;source type=audio\/' + audiofiles[eval(0 + zero)].split('data:audio\/')[1].split(',')[0].split(';')[0] + ' ').replace(' src=\"\"', ' src=\"' + audiofiles[eval(0 + zero)].replace(\/\\ \/g,'+') + '\"').replace('none','BLOCK');<br \/>\n      document.getElementById('divanaudio').style.width='30%';<br \/>\n      document.getElementById('divanaudio').style.marginLeft='35%';<br \/>\n      document.getElementById('anaudio').style.display='block';<br \/>\n      if (document.getElementById('end' + eval(1 + zero)).value.replace(\/^0\\.\/g,'@').replace(\/^0\/g,'-').indexOf('-') == -1) {<br \/>\n        segstart=0.0;<br \/>\n        segend=eval('' + document.getElementById('end' + eval(1 + zero)).value) + 4 - eval('' + document.getElementById('start' + eval(1 + zero)).value);<br \/>\n        setTimeout(everysecond, 1000);<br \/>\n        setTimeout(function(){  zero++; seqe(); }, eval(1000 * (eval('' + document.getElementById('end' + eval(1 + zero)).value) + 4 - eval('' + document.getElementById('start' + eval(1 + zero)).value))));<br \/>\n      }<br \/>\n      } else if (audiofiles[eval(0 + zero)].indexOf('data:video\/') == 0) {<br \/>\n      isaudio=false;<br \/>\n      document.getElementById('subis').style.background=dstyleit('linear-gradient(to right, yellow ' + Math.ceil(eval(100 * (eval(0 + zero) \/ lzero))) + '%, pink ' + Math.floor(eval(100 - eval(100 * (eval(0 + zero) \/ lzero)))) + '%) !important');<br \/>\n      document.getElementById('subis').value='Currently Playing Video ' + eval(1 + zero) + suff; \/\/ + ': ' + audiofiles[eval(0 + zero)].replace(\/\\ \/g,'+'); \/\/ + \" via Google Translate if you press speaker and am waiting for you to close that window.\";<br \/>\n      document.getElementById('divanvideo').innerHTML=divanvideo<font color=purple>.replace(' style=\"\"', ' style=\"' + ovbizzo + '\"')<\/font>.replace('&gt;',' controls&gt;').replace(' title=\"\"', ' title=\"Play\"').replace('&lt;source ', '&lt;source type=video\/' + audiofiles[eval(0 + zero)].split('data:video\/')[1].split(',')[0].split(';')[0].replace('quicktime','mp4') + ' ').replace(' src=\"\"', ' src=\"' + audiofiles[eval(0 + zero)].replace(\/\\ \/g,'+') + '\"').replace('none','BLOCK');<br \/>\n      document.getElementById('divanvideo').style.width='100%';<br \/>\n      document.getElementById('anvideo').style.display='block';<br \/>\n      document.getElementById('anvideo').style.width='60%';<br \/>\n      document.getElementById('anvideo').style.marginLeft='20%';<br \/>\n      \/\/document.getElementById('divanvideo').innerHTML=divanvideo<font color=purple>.replace(' style=\"\"', ' style=\"' + ovbizzo + '\"')<\/font>.replace('&gt;',' controls&gt;').replace(' title=\"\"', ' title=\"Play\"').replace('&lt;source ', '&lt;source type=video\/' + audiofiles[eval(0 + zero)].split('data:video\/')[1].split(',')[0].split(';')[0].replace('quicktime','mp4') + ' ').replace(' src=\"\"', ' src=\"' + audiofiles[eval(0 + zero)].replace(\/\\ \/g,'+') + '\"').replace('none','BLOCK');<br \/>\n      if (document.getElementById('end' + eval(1 + zero)).value.replace(\/^0\\.\/g,'@').replace(\/^0\/g,'-').indexOf('-') == -1) {<br \/>\n        setTimeout(everysecond, 1000);<br \/>\n        setTimeout(function(){  zero++; seqe(); }, eval(1000 * (eval('' + document.getElementById('end' + eval(1 + zero)).value) + 4 - eval('' + document.getElementById('start' + eval(1 + zero)).value))));<br \/>\n      }<br \/>\n      } else if (audiofiles[eval(0 + zero)].replace('#.','data:image\/').indexOf('data:image\/') != -1) {<br \/>\n      isaudio=false;<br \/>\n      document.getElementById('subis').style.background=dstyleit('linear-gradient(to right, yellow ' + Math.ceil(eval(100 * (eval(0 + zero) \/ lzero))) + '%, pink ' + Math.floor(eval(100 - eval(100 * (eval(0 + zero) \/ lzero)))) + '%) !important');<br \/>\n      document.getElementById('subis').value='Currently Showing Image ' + eval(1 + zero) + suff; \/\/ + ': ' + audiofiles[eval(0 + zero)].replace(\/\\ \/g,'+'); \/\/ + \" via Google Translate if you press speaker and am waiting for you to close that window.\";<br \/>\n      document.getElementById('divanimg').style.width='100%';<br \/>\n      document.getElementById('divanimg').style.textAlign='center';<br \/>\n      \/\/alert(divanimg.replace(\/\\ title\\=\\\"\\\"\/g, ' title=\"Play\"').replace(' src=\"\"', ' src=\"' + audiofiles[eval(0 + zero)].replace(\/\\ \/g,'+') + '\"').replace('none','BLOCK'));<br \/>\n      \/\/alert('yes00 ' + divanimg);<br \/>\n    if (document.getElementById('animg').src == '') {<br \/>\n      \/\/alert('yes0 ' + divanimg);<br \/>\n      document.getElementById('divanimg').innerHTML='&lt;details id=details' + zero + ' open&gt;&lt;summary&gt;&lt;\/summary&gt;' + divanimg<font color=purple>.replace(' style=\"\"', ' style=\"' + ovbizzo + '\"')<\/font>.replace(\/\\ title\\=\\\"\\\"\/g, ' title=\"Play\"').replace(' src=\"\"', ' src=\"' + audiofiles[eval(0 + zero)].replace(\/\\ \/g,'+') + '\"').replace('none','BLOCK') + '&lt;\/details&gt;&lt;div id=divanimgmore&gt;&lt;\/div&gt;';<br \/>\n      if (1 == 5) {<br \/>\n      var joff=1;<br \/>\n      while (audiofiles[eval(joff + zero)].replace('#.','data:image\/').indexOf('data:image\/') != -1) {<br \/>\n      if (document.getElementById('divanimgmore')) {<br \/>\n      \/\/alert('yes1');<br \/>\n      document.getElementById('divanimgmore').innerHTML=document.getElementById('divanimgmore').innerHTML.replace(\/\\ open\/g,' data-open') + nodet('&lt;br&gt;&lt;details id=details' + zero + ' open&gt;&lt;summary&gt;&lt;\/summary&gt;&lt;img' + divanimg.split('&lt;img')[1].split('&lt;\/img&gt;')[0] + '&lt;\/img&gt;')<font color=purple>.replace(' style=\"\"', ' style=\"' + ovbizzo + '\"')<\/font>.replace(' id=', ' data-id=').replace(' title=\"\"', ' title=\"Play\"').replace(' src=\"\"', ' src=\"' + audiofiles[eval(joff + zero)].replace(\/\\ \/g,'+') + '\"').replace('none','BLOCK') + '&lt;\/details&gt;';<br \/>\n      } else {<br \/>\n      \/\/alert('yes2');<br \/>\n      document.getElementById('divanimg').innerHTML=document.getElementById('divanimg').innerHTML.replace(\/\\ open\/g,' data-open') + nodet('&lt;br&gt;&lt;details id=details' + zero + ' open&gt;&lt;summary&gt;&lt;\/summary&gt;&lt;img' + divanimg.split('&lt;img')[1].split('&lt;\/img&gt;')[0] + '&lt;\/img&gt;')<font color=purple>.replace(' style=\"\"', ' style=\"' + ovbizzo + '\"')<\/font>.replace(' id=', ' data-id=').replace(' title=\"\"', ' title=\"Play\"').replace(' src=\"\"', ' src=\"' + audiofiles[eval(joff + zero)].replace(\/\\ \/g,'+') + '\"').replace('none','BLOCK') + '&lt;\/details&gt;';<br \/>\n      }<br \/>\n      joff++;<br \/>\n      }<br \/>\n      }<br \/>\n      document.getElementById('animg').style.display='block';<br \/>\n    } else if (document.getElementById('divanimg').innerHTML.indexOf(audiofiles[eval(0 + zero)].replace(\/\\ \/g,'+')) == -1) {<br \/>\n      if (document.getElementById('divanimgmore')) {<br \/>\n      document.getElementById('divanimgmore').innerHTML=document.getElementById('divanimgmore').innerHTML.replace(\/\\ open\/g,' data-open') + nodet('&lt;br&gt;&lt;details id=details' + zero + ' open&gt;&lt;summary&gt;&lt;\/summary&gt;&lt;img' + divanimg.split('&lt;img')[1].split('&lt;\/img&gt;')[0] + '&lt;\/img&gt;')<font color=purple>.replace(' style=\"\"', ' style=\"' + ovbizzo + '\"')<\/font>.replace(' id=', ' data-id=').replace(' title=\"\"', ' title=\"Play\"').replace(' src=\"\"', ' src=\"' + audiofiles[eval(0 + zero)].replace(\/\\ \/g,'+') + '\"').replace('none','BLOCK') + '&lt;\/details&gt;';<br \/>\n      } else {<br \/>\n      document.getElementById('divanimg').innerHTML=document.getElementById('divanimg').innerHTML.replace(\/\\ open\/g,' data-open') + nodet('&lt;br&gt;&lt;details id=details' + zero + ' open&gt;&lt;summary&gt;&lt;\/summary&gt;&lt;img' + divanimg.split('&lt;img')[1].split('&lt;\/img&gt;')[0] + '&lt;\/img&gt;')<font color=purple>.replace(' style=\"\"', ' style=\"' + ovbizzo + '\"')<\/font>.replace(' id=', ' data-id=').replace(' title=\"\"', ' title=\"Play\"').replace(' src=\"\"', ' src=\"' + audiofiles[eval(0 + zero)].replace(\/\\ \/g,'+') + '\"').replace('none','BLOCK') + '&lt;\/details&gt;';<br \/>\n      }<br \/>\n      document.getElementById('animg').style.display='block';<br \/>\n    }<br \/>\n      if (document.getElementById('end' + eval(1 + zero)).value.replace(\/^0\\.\/g,'@').replace(\/^0\/g,'-').indexOf('-') == -1) {<br \/>\n        segstart=0.0;<br \/>\n        segend=eval('' + document.getElementById('end' + eval(1 + zero)).value) + 0 - eval('' + document.getElementById('start' + eval(1 + zero)).value);<br \/>\n        setTimeout(everysecond, 1000);<br \/>\n        setTimeout(function(){ segend=9999999.0; segstart=0.0;  zero++; seqe(); }, eval(1000 * (eval('' + document.getElementById('end' + eval(1 + zero)).value) + 0 - eval('' + document.getElementById('start' + eval(1 + zero)).value))));<br \/>\n      \/\/} else {<br \/>\n        \/\/alert(document.getElementById('end' + eval(1 + zero)).value);<br \/>\n      } else {<br \/>\n        segstart=0.0;<br \/>\n        segend=5.0;<br \/>\n        setTimeout(everysecond, 1000);<br \/>\n        setTimeout(function(){ segend=9999999.0; segstart=0.0;  zero++; seqe(); }, 5000);<br \/>\n      }<br \/>\n      } else if (audiofiles[eval(0 + zero)] != '') {<br \/>\n      isaudio=true;<br \/>\n      document.getElementById('subis').style.background=dstyleit('linear-gradient(to right, yellow ' + Math.ceil(eval(100 * (eval(0 + zero) \/ lzero))) + '%, pink ' + Math.floor(eval(100 - eval(100 * (eval(0 + zero) \/ lzero)))) + '%) !important');<br \/>\n      document.getElementById('subis').value='Currently Playing Audio ' + eval(1 + zero) + suff; \/\/ + ': ' + noplus(audiofiles[eval(0 + zero)]) + \" via Google Translate if you press speaker and am waiting for you to close that window \" + suff;<br \/>\n      wo=window.open('https:\/\/translate.google.com\/#auto\/en\/' + encodeURIComponent(noplus(audiofiles[eval(0 + zero)])),'_blank','top=50,left=50,width=600,height=600');<br \/>\n      }<br \/>\n      setTimeout(precheckget, 20);<br \/>\n      }<br \/>\n}<br \/>\n<\/code><\/p>\n<p> &#8230; should the next display element on the list be flagged by the user as needing to be Overlay<sup>ed<\/sup>.<\/p>\n<p>And so, codewise &#8230;<\/p>\n<ul>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.php--GETME\" rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.php--GETME\" rel=\"noopener\">unchanged<\/a> PHP &#8220;guise of&#8221; <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.php\" rel=\"noopener\">our Splicing Audio or Video inhouse web application<\/a> (mainly adding $_POST[] navigation knowledge to the HTML template to work off) &#8230; helped out &#8230;<\/li>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html--------GETME\" rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html--------GETME\" rel=\"noopener\">splice_audio.htm<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.htm\" rel=\"noopener\">live run<\/a><\/li>\n<\/ul>\n<p> &#8230; got a happier set of Overlay functionalities going!<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=\"_blank\" href='\/\/www.rjmprogramming.com.au\/ITblog\/spliced-audio\/video-youtube-overlay-tutorial\/' rel=\"noopener\">Spliced Audio\/Video YouTube Overlay Tutorial<\/a>.<\/p-->\n<hr>\n<p id='sa\/vytdt'>Previous relevant <a target=\"_blank\" title='Spliced Audio\/Video YouTube Delimitations Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/spliced-audio\/video-youtube-delimitations-tutorial\/' rel=\"noopener\">Spliced Audio\/Video YouTube Delimitations Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.htm\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Spliced Audio\/Video YouTube Delimitations Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/yt_better.gif\" title=\"Spliced Audio\/Video YouTube Delimitations Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">Spliced Audio\/Video YouTube Delimitations Tutorial<\/p><\/div>\n<p>Another day, another deliberation about <i>delimitation<\/i>!  Yes, as a programmer, of the <i>mere mortal<\/i> variety, and you ask a bit of your engaged users, you&#8217;ll not have much chance of &#8230;<\/p>\n<ul>\n<li>changing hardware<\/li>\n<li>changing firmware<\/li>\n<li>changing environment <font size=1>&#8230; very much<\/font><\/li>\n<\/ul>\n<p> &#8230; achieving your ends <font size=1>&#8230; ngah ha ha<\/font>!<\/p>\n<p>But you have got <i>delimitation<\/i> on your side.<\/p>\n<blockquote><p>\nDown @ &#8230;<br \/>\nWait for ! to finish first &#8230;\n<\/p><\/blockquote>\n<p>We do this type of work a lot, and recommend &#8230;<\/p>\n<ul>\n<li>get firm idea in the mind of what you want to achieve <font size=1>(yesterday and today, it being the &#8220;midstream&#8221; ability to change <a target=\"_blank\" title='YouTube' href='https:\/\/youtube.com' rel=\"noopener\">YouTube<\/a> video ID references using our <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.htm\" rel=\"noopener\">inhouse YouTube video interfacer<\/a>)<\/font> &#8230; including &#8230;<\/li>\n<li>what might happen into the future &#8230; and allow for flexibility should a new piece of functionality happen into the future &#8230; and &#8230;<\/li>\n<li>the work is often behind the scenes, and the user not interested in odd arrangements, so flag with title hovering (non-mobile) and\/or placeholder (non-mobile or mobile) textbox flagging of your preferred usage &#8230; though &#8230;<\/li>\n<li>behind the scenes, where possible, allow for more flexibility, regarding which delimiter makes the functionality happen, should the user forget, and flounder<\/li>\n<\/ul>\n<p>We used <i>placeholder<\/i> attribute to display the delimitation rules of <i>Start time in seconds<\/i> textboxes, <a style=color:purple href=#fstart>we started<\/a> yesterday, with <a title='Spliced Audio\/Video YouTube Tutorial' href='#sa\/vytt'>Spliced Audio\/Video YouTube Tutorial<\/a>, using our <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.html--------------------------------------------------GETME\" rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.html--------------------------------------------------GETME\" rel=\"noopener\">karaoke_youtube_api.htm<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.htm\" rel=\"noopener\">inhouse YouTube video interfacer<\/a> we tweaked to interface to <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html--------GETME\" rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html--------GETME\" rel=\"noopener\">splice_audio.htm<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.htm\" rel=\"noopener\">live run<\/a> that goes like &#8230;<\/p>\n<ul>\n<li><font color=blue>generally speaking<\/font> textbox static HTML like &#8230;<br \/>\n<code><br \/>\n&lt;input <font color=blue>placeholder=\"Can | separate time to next YouTube video ID (use ; for just audio)\"<\/font> style=\"width:400px;\" onblur=\"checkval(this);\" type=\"text\" onmouseover=\"toms(this);\" id=\"i1\" name=\"i1\" value=\"\" title=\"0:00:00\"&gt;<br \/>\n<\/code><br \/>\n &#8230; <\/p>\n<li>but reworked for the first such textbox <font size=1>(and no, using CSS for this is not recommended)<\/font> using Javascript &#8230;<br \/>\n<code><br \/>\n setTimeout(function(){   if (document.getElementById('i0')) {       document.getElementById('i0').placeholder='Can ; separate time to flag Just Audio';    } }, 4000);<br \/>\n<\/code>\n<\/li>\n<\/ul>\n<p> &#8230; to help inform the user of what is possible <strike><font size=1>&#8230; ngah ha ha<\/font><\/strike> <\/p>\n<blockquote><p>No | &#8230; wait &#8230; ~!@#$%%%#@#$^&#038; <font size=1>&#8230; ouch<\/font><\/p><\/blockquote>\n<p>Proof of the <i>delimitation pudding<\/i> here, we think, is that we could move off yesterday&#8217;s &#8230;<\/p>\n<blockquote><p>\nblast from the past version\n<\/p><\/blockquote>\n<p> &#8230; working methodically through the issues, making the current version better too.  You will find web browser Web Inspectors invaluable here.  We used a &#8220;suck it and see&#8221; approach to making changes and saw where the Web Inspector took us regarding errors we caused, and fixed those, so that we could apply the better logic to the most recent version of our <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/karaoke_youtube_api.htm\" rel=\"noopener\">inhouse YouTube video interfacer<\/a>.<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=\"_blank\" href='\/\/www.rjmprogramming.com.au\/ITblog\/spliced-audio\/video-youtube-delimitation-tutorial\/' rel=\"noopener\">Spliced Audio\/Video YouTube Delimitation Tutorial<\/a>.<\/p-->\n<hr>\n<p id='sa\/vytt'>Previous relevant <a target=\"_blank\" title='Spliced Audio\/Video YouTube Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/spliced-audio\/video-youtube-tutorial\/' rel=\"noopener\">Spliced Audio\/Video YouTube Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.htm\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Spliced Audio\/Video YouTube Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/yt_multiple.gif\" title=\"Spliced Audio\/Video YouTube Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">Spliced Audio\/Video YouTube Tutorial<\/p><\/div>\n<p>Yesterday&#8217;s <a title='Spliced Audio\/Video Animated GIF Tutorial' href='#sa\/vagift'>Spliced Audio\/Video Animated GIF Tutorial<\/a> input modus operandi &#8230;<\/p>\n<ul>\n<li>audio<\/li>\n<li>video<\/li>\n<li>image<\/li>\n<li>text to send to Google Translate &#8230; is bolstered today via a new modus operandum &#8230;<\/li>\n<li>via <a target=\"_blank\" title='YouTube' href='https:\/\/youtube.com' rel=\"noopener\">YouTube<\/a> video ID 11 character code play a YouTube video<\/li>\n<\/ul>\n<p> &#8230; feeding into our <a target=\"_blank\" title='YouTube API for Iframe embedded videos' href='https:\/\/developers.google.com\/youtube\/iframe_api_reference' rel=\"noopener\">YouTube API<\/a> work, but resurrecting an inhouse &#8220;blast from the past version&#8221; close to being okay, on non-mobile, changing YouTube video IDs &#8220;midstream&#8221; and keeping the video playing work all within the one webpage window.  Am sure we had ideas like this in mind using the &#8220;Splicing&#8221; word in the web application title.  We&#8217;ve always been a bit obsessed with those train announcements piecing a message together, especially when it comes to &#8220;number words&#8221; via a combination of audio media snippets.<\/p>\n<p>Also, today, with limited practical success, we&#8217;re trying to allow a user to loop through their media list, repeating the playing.  There are that many ways we can get interrupted achieving this, it&#8217;s not funny <font size=1>&#8230; really &#8230;<\/font> but we&#8217;re not getting upset because the user can go back to the source window and reclick buttons of their choice to keep the good times rolling <font size=1>&#8230; ah, MacArthur Park &#8230; again<\/font>!<\/p>\n<p>And so, codewise &#8230;<\/p>\n<ul>\n<!--li><a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php-----------------------------------------------------------------------------------------------GETME' rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php-----------------------------------------------------------------------------------------------GETME' rel=\"noopener\">tutorial_to_animated_gif.php<\/a> PHP <a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php' rel=\"noopener\">animated GIF creator helper<\/a> web application ... hosted in a new iframe element to help collect local file media file(s) ... itself calling ...<\/li-->\n<!--li><a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.html--------------------------------------------------------GETME' rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.html--------------------------------------------------------GETME' rel=\"noopener\">client_browsing.htm<\/a> client side <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.htm' rel=\"noopener\">local file browsing HTML and Javascript inhouse helper<\/a> ... to help ...<\/li-->\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.php-GETME\" rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.php-GETME\" rel=\"noopener\">unchanged<\/a> PHP &#8220;guise of&#8221; <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.php\" rel=\"noopener\">our Splicing Audio or Video inhouse web application<\/a> (mainly adding $_POST[] navigation knowledge to the HTML template to work off) &#8230; helped out &#8230;<\/li>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html-------GETME\" rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html-------GETME\" rel=\"noopener\">splice_audio.htm<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.htm\" rel=\"noopener\">live run<\/a><\/li>\n<\/ul>\n<p> &#8230; here, along with the reworked <i>eval<\/i> of our inhouse YouTube player &#8230;<\/p>\n<p><code><br \/>\nfunction neweval(cwhat) {<br \/>\n  var kkzero=0;<br \/>\n  var delmtry='|';<br \/>\n  var cbitsare=cwhat.split(delmtry);<br \/>\n  if (eval('' + cbitsare.length) &lt;= 1) {<br \/>\n    delmtry=',';<br \/>\n    cbitsare=cwhat.split(delmtry);<br \/>\n    if (eval('' + cbitsare.length) &lt;= 1) {<br \/>\n      <font id=fstart color=purple>delmtry='!'; \/\/ used to be ';'<\/font><br \/>\n      cbitsare=cwhat.split(delmtry);<br \/>\n      if (eval('' + cbitsare.length) &lt;= 1) {<br \/>\n        delmtry='@';<br \/>\n        cbitsare=cwhat.split(delmtry);<br \/>\n        if (eval('' + cbitsare.length) &lt;= 1) {<br \/>\n          delmtry='#';<br \/>\n          cbitsare=cwhat.split(delmtry);<br \/>\n        }<br \/>\n      }<br \/>\n    }<br \/>\n  }<br \/>\n  var iki=0, surl='';<br \/>\n  var wasurl=document.URL;<br \/>\n  var isurl=wasurl, prefixingurl=wasurl, suffixingurl=wasurl;<br \/>\n  if (eval('' + cbitsare.length) &gt; 1) {<br \/>\n    if (eval('' + cbitsare[0].length) &gt;= 11) {<br \/>\n      iki=1;<br \/>\n      surl=wasurl.split(cbitsare[0])[0].split('&c')[eval(-1 + wasurl.split(cbitsare[0])[0].split('&c').length)];<br \/>\n      prefixingurl=wasurl.split(surl)[0];<br \/>\n      suffixingurl=wasurl.split(prefixingurl)[1];<br \/>\n      \/\/prefixingurl=prefixingurl.replace(\/\\=on\/g,'=off');<br \/>\n      prefixingurl=prefixingurl.replace('youtubeid=' + prefixingurl.split('youtubeid=')[1].split('&')[0].split('#')[0], 'youtubeid=' + cbitsare[0]);<br \/>\n      while (prefixingurl.indexOf('&i' + kkzero + '=') != -1) {<br \/>\n        prefixingurl=prefixingurl.replace('&i' + kkzero + '=' + prefixingurl.split('&i' + kkzero + '=')[1].split('&c')[0], '&i' + kkzero + '=0&j' + kkzero + '=0');<br \/>\n        kkzero++;<br \/>\n      }<br \/>\n      suffixingurl=suffixingurl.replace(cbitsare[0] + encodeURIComponent(delmtry), '').replace(cbitsare[0] + delmtry, '');<br \/>\n      <font color=purple>comingurl=prefixingurl + suffixingurl;<br \/>\n      \/\/<\/font>location.href=prefixingurl + suffixingurl;<br \/>\n    } else if (eval('' + cbitsare[1].length) &gt;= 11) {<br \/>\n      iki=0;<br \/>\n      surl=wasurl.split(cbitsare[1])[0].split('&c')[eval(-1 + wasurl.split(cbitsare[1])[0].split('&c').length)];<br \/>\n      prefixingurl=wasurl.split(surl)[0];<br \/>\n      suffixingurl=wasurl.split(prefixingurl)[1];<br \/>\n      \/\/prefixingurl=prefixingurl.replace(\/\\=on\/g,'=off');<br \/>\n      prefixingurl=prefixingurl.replace('youtubeid=' + prefixingurl.split('youtubeid=')[1].split('&')[0].split('#')[0], 'youtubeid=' + cbitsare[1]);<br \/>\n      while (prefixingurl.indexOf('&i' + kkzero + '=') != -1) {<br \/>\n        prefixingurl=prefixingurl.replace('&i' + kkzero + '=' + prefixingurl.split('&i' + kkzero + '=')[1].split('&c')[0], '&i' + kkzero + '=0&j' + kkzero + '=0');<br \/>\n        kkzero++;<br \/>\n      }<br \/>\n      suffixingurl=suffixingurl.replace(encodeURIComponent(delmtry) + cbitsare[1], '').replace(delmtry + cbitsare[1], '');<br \/>\n      <font color=purple>comingurl=prefixingurl + suffixingurl;<br \/>\n      \/\/<\/font>location.href=prefixingurl + suffixingurl;<br \/>\n    }<br \/>\n  }<br \/>\n  return eval('' + cbitsare[iki]<font color=purple>.split(';')[0].split(encodeURIComponent(';'))<\/font>);<br \/>\n}<br \/>\n<\/code><\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=\"_blank\" href='\/\/www.rjmprogramming.com.au\/ITblog\/spliced-audio\/video-youtube-tutorial\/' rel=\"noopener\">Spliced Audio\/Video YouTube Tutorial<\/a>.<\/p-->\n<hr>\n<p id='sa\/vagift'>Previous relevant <a target=\"_blank\" title='Spliced Audio\/Video Animated GIF Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/spliced-audio\/video-animated-gif-tutorial\/' rel=\"noopener\">Spliced Audio\/Video Animated GIF Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.htm\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Spliced Audio\/Video Animated GIF Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/was_spliced_audio_animated_gif.gif\" title=\"Spliced Audio\/Video Animated GIF Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">Spliced Audio\/Video Animated GIF Tutorial<\/p><\/div>\n<p>If you&#8217;ve been following yesterday&#8217;s <a title='Spliced Audio\/Video Styling Tutorial' href='#sa\/vst'>Spliced Audio\/Video Styling Tutorial<\/a> Spliced Media synchronized play project of recent times, you&#8217;ll probably guess what our &#8220;project word&#8221; would be, that being &#8230;<\/p>\n<blockquote><p>\nduration\n<\/p><\/blockquote>\n<p> &#8230; as a &#8220;measure&#8221; of importance to help with the sequential play of media, out of &#8230;<\/p>\n<ul>\n<li>audio<\/li>\n<li>video<\/li>\n<li>image<\/li>\n<\/ul>\n<p> &#8230; choices of &#8220;media category&#8221; we&#8217;re offering in this project.  But, what &#8220;duration&#8221; applies to <i>image<\/i> choice above?  Well, we just hardcode 5 seconds for &#8230;<\/p>\n<ul>\n<li><font size=1>(non-animated)<\/font> JPEG or PNG or GIF &#8230; but &#8230;<\/li>\n<li>animated GIFs have a <i>one cycle through<\/i> duration &#8230;<\/li>\n<\/ul>\n<p> &#8230; that we want to help calculate for the user and show in that relevant &#8220;end of&#8221; timing textbox.  Luckily, we&#8217;ve researched this in the past, but every scenario is that bit different, we find, and so here is the Javascript for what we&#8217;re using &#8230;<\/p>\n<p><code><br \/>\nfunction prefetch(whatgifmaybe) { \/\/ thanks to https:\/\/stackoverflow.com\/questions\/69564118\/how-to-get-xxduration-of-gif-image-in-javascript#:~:text=Mainly%20use%20parseGIF()%20%2C%20then,xxduration%20of%20a%20GIF%20image.<br \/>\nif ((whatgifmaybe.toLowerCase().trim().split('#')[0].replace('\/gif;', '\/gif?;') + '?').indexOf('.gif?') != -1 && lastgifpreq != whatgifmaybe.split('?')[0]) {<br \/>\nlastgifpreq=whatgifmaybe.split('?')[0];<br \/>\nif (whatgifmaybe.indexOf('\/tmp\/') != -1) {<br \/>\n  lastgifurl='\/tmp\/' + whatgifmaybe.split('\/tmp\/')[1];<br \/>\n} else {<br \/>\n  lastgifurl='';<br \/>\n}<br \/>\ndocument.body.style.cursor='progress';<br \/>\nwhatgifmaybe=whatgifmaybe.split('?')[0];<br \/>\n\/\/alert('whatgifmaybe=' + whatgifmaybe);<br \/>\n<br \/>\nfetch(whatgifmaybe)<br \/>\n  .then(res =&gt; res.arrayBuffer())<br \/>\n  .then(ab =&gt; isGifAnimated(new Uint8Array(ab)))<br \/>\n  .then(console.log);<br \/>\n}<br \/>\nreturn -1;<br \/>\n}<br \/>\n<br \/>\n\/** @param {Uint8Array} uint8 *\/<br \/>\n<br \/>\nfunction isGifAnimated(uint8) { \/\/ thanks to https:\/\/stackoverflow.com\/questions\/69564118\/how-to-get-xxduration-of-gif-image-in-javascript#:~:text=Mainly%20use%20parseGIF()%20%2C%20then,xxduration%20of%20a%20GIF%20image.<br \/>\n  let xxduration = 0;<br \/>\n  for (let i = 0, len = uint8.length; i &lt; len; i++) {<br \/>\n    if (uint8[i] == 0x21<br \/>\n      && uint8[i + 1] == 0xF9<br \/>\n      && uint8[i + 2] == 0x04<br \/>\n      && uint8[i + 7] == 0x00) {<br \/>\n      const xxdelay = (uint8[i + 5] &lt;&lt; 8) | (uint8[i + 4] & 0xFF);<br \/>\n      xxduration += xxdelay &lt; 2 ? 10 : xxdelay;<br \/>\n    }<br \/>\n  }<br \/>\n  \/\/alert('' + eval(xxduration \/ 100));<br \/>\n  if (eval(xxduration \/ 100) &gt; 0.11) {<br \/>\n    delay=eval(xxduration \/ 100);<br \/>\n    if (('' + delay).indexOf('.') != -1) {<br \/>\n    \/\/document.getElementById('end' + lastgifid).type='text';<br \/>\n    document.getElementById('end' + lastgifid).title='' + delay;<br \/>\n    document.getElementById('end' + lastgifid).value='' + delay;<br \/>\n    \/\/alert(delay);<br \/>\n    \/\/setTimeout(function(){ alert('DeLaY=' + delay + ' lastgifid=' + lastgifid); }, 2000);<br \/>\n    } else if (document.getElementById('end' + lastgifid)) {<br \/>\n    document.getElementById('end' + lastgifid).title='' + delay;<br \/>\n    document.getElementById('end' + lastgifid).value='' + delay;<br \/>\n    if (document.getElementById('audio' + lastgifid).value.toLowerCase().indexOf('.gif') != -1 && document.getElementById('audio' + lastgifid).value.replace(\/^\\\/tmp\\\/\/g,'data:').indexOf('data:') == -1 && document.getElementById('audio' + lastgifid).value.indexOf('#.') == -1) {<br \/>\n      document.getElementById('audio' + lastgifid).value+='#.' + delay;<br \/>\n    }<br \/>\n    if (lastgifurl != '' && (176 == 176 || lastgifurl != lastgifurl)) { document.getElementById('audio' + lastgifid).value='' + lastgifurl;   }<br \/>\n    setTimeout(function(){ if (1 == 1) { document.getElementById('taif').src='\/PHP\/animegif\/tutorial_to_animated_gif.php?aschild=' + Math.floor(Math.random() * 19897865);  } else { window.open('\/PHP\/animegif\/tutorial_to_animated_gif.php?aschild=' + Math.floor(Math.random() * 19897865),'taif'); } }, 2000);<br \/>\n    }<br \/>\n  }<br \/>\n  document.body.style.cursor='pointer';<br \/>\n  return eval(xxduration \/ 100); \/\/ if 0.1 is not an animated GIF<br \/>\n}<br \/>\n<\/code><\/p>\n<p> &#8230; in this project.<\/p>\n<p>Today, we start concertinaing multiple image asks <font size=1>(and yet show image order)<\/font>, using our favourite <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/reveal\" title='WordPress reveal posts' rel=\"noopener\">&#8220;reveal&#8221;<\/a> tool, the <a target=\"_blank\" title='HTML details tag information from w3schools' href='https:\/\/www.w3schools.com\/tags\/tag_details.asp' rel=\"noopener\">details<\/a>\/<a target=\"_blank\" title='HTML summary tag information from w3schools' href='https:\/\/www.w3schools.com\/tags\/tag_details.asp' rel=\"noopener\">summary<\/a> HTML element dynamic duo, so that there are less images disappearing &#8220;below the fold&#8221; happening this way in &#8230;<\/p>\n<ul>\n<!--li><a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php-----------------------------------------------------------------------------------------------GETME' rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php-----------------------------------------------------------------------------------------------GETME' rel=\"noopener\">tutorial_to_animated_gif.php<\/a> PHP <a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php' rel=\"noopener\">animated GIF creator helper<\/a> web application ... hosted in a new iframe element to help collect local file media file(s) ... itself calling ...<\/li-->\n<li><a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.html--------------------------------------------------------GETME' rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.html--------------------------------------------------------GETME' rel=\"noopener\">client_browsing.htm<\/a> client side <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.htm' rel=\"noopener\">local file browsing HTML and Javascript inhouse helper<\/a> &#8230; to help &#8230;<\/li>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.php_GETME\" rel=\"noopener\">unchanged<\/a> PHP &#8220;guise of&#8221; <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.php\" rel=\"noopener\">our Splicing Audio or Video inhouse web application<\/a> (mainly adding $_POST[] navigation knowledge to the HTML template to work off) &#8230; that being &#8230;<\/li>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html------GETME\" rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html------GETME\" rel=\"noopener\">splice_audio.htm<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.htm\" rel=\"noopener\">live run<\/a><\/li>\n<\/ul>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=\"_blank\" href='\/\/www.rjmprogramming.com.au\/ITblog\/spliced-audio\/video-animated-gif-tutorial\/' rel=\"noopener\">Spliced Audio\/Video Animated GIF Tutorial<\/a>.<\/p-->\n<hr>\n<p id='sa\/vst'>Previous relevant <a target=\"_blank\" title='Spliced Audio\/Video Styling Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/spliced-audio\/video-styling-tutorial\/' rel=\"noopener\">Spliced Audio\/Video Styling Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.htm\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Spliced Audio\/Video Styling Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/was_spliced_audio_aesthetics.gif\" title=\"Spliced Audio\/Video Styling Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">Spliced Audio\/Video Styling Tutorial<\/p><\/div>\n<p>We have &#8220;bad hair days&#8221;, but that doesn&#8217;t stop us seeking &#8220;styling days&#8221;.  Yes, we often separate CSS styling into an issue that is addressed only if we deem the project warrants it, and we&#8217;ve decided this latest Spliced Audio\/Video web application project is worth it.  This means that further to yesterday&#8217;s <a title='Spliced Audio\/Video Browsing Data URL Tutorial' href='#sa\/vbdurlt'>Spliced Audio\/Video Browsing Data URL Tutorial<\/a> we have some new CSS styling in today&#8217;s work &#8230;<\/p>\n<p><code><br \/>\n&lt;style&gt;<br \/>\n  body {<br \/>\n     background-color: #f9f9f9;<br \/>\n  }<br \/>\n  <br \/>\n  .animg {<br \/>\n     width: 100%;<br \/>\n  }<br \/>\n<br \/>\n  input[type=text] {<br \/>\n     background-color: #e0e0e0;<br \/>\n     border-radius: 7px;<br \/>\n     margin-bottom: 2px;<br \/>\n  }<br \/>\n<br \/>\n  input[type=number] {<br \/>\n     background-color: #ebebeb;<br \/>\n     border-radius: 7px;<br \/>\n  }<br \/>\n  <br \/>\n  input[type=submit] {<br \/>\n     border-radius: 7px;<br \/>\n     width: 20%;<br \/>\n  }<br \/>\n<br \/>\n  #spif {<br \/>\n     border-radius: 7px;<br \/>\n  }<br \/>\n<br \/>\n  #taif {<br \/>\n     border-radius: 7px;<br \/>\n  }<br \/>\n<br \/>\n  input[type=checkbox] { \/* thanks to https:\/\/stackoverflow.com\/questions\/24322599\/why-cannot-change-checkbox-color-whatever-i-do *\/<br \/>\n     border: 1px solid yellow;<br \/>\n     filter: invert(80%) hue-rotate(88deg) brightness(1.7) opacity(0.8);<br \/>\n     accent-color: cyan;<br \/>\n  }<br \/>\n  <br \/>\n  #audio1 {<br \/>\n     width: 29% !important;<br \/>\n  }<br \/>\n  <br \/>\n  select {<br \/>\n     background-color: lightblue;<br \/>\n     border-radius: 7px;<br \/>\n  }<br \/>\n&lt;\/style&gt;<br \/>\n<\/code><\/p>\n<p>Yes, no rocket science there.  But, for the first time we can remember, we&#8217;ve turned a button &#8230;<\/p>\n<ul>\n<li>\n<code><br \/>\n&lt;input onclick='fixhide(); fixstartend();' id='subis' style='text-align:center; background-color: pink; ' type='submit' value='Play Sequentially'&gt;&lt;\/input&gt;<br \/>\n<\/code><br \/>\n &#8230; into <font size=1>(in the second phase of it&#8217;s existence within an execution run)<\/font> a &#8230;\n<\/li>\n<li>linear gradient inspired progress bar &#8230; the secret to the &#8220;hard stops&#8221; we got great new advice from <a target=\"_blank\" href='https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\/gradient\/linear-gradient' rel=\"noopener\">this link<\/a>, thanks &#8230; to come up with dynamic CSS styling via Javascript &#8230;<br \/>\n<code><br \/>\nfunction dstyleit(what) {<br \/>\n   var oney=what.split('yellow ')[1].split('%')[0] + '%,';<br \/>\n   what=what.replace(oney,oney + oney);<br \/>\n   document.getElementById('dstyle').innerHTML+='&lt;style&gt; #subis { background: ' + what + ' } &lt;\/style&gt;';<br \/>\n   return what;<br \/>\n}<br \/>\n<br \/>\nfunction everysecond() {<br \/>\n  var addition=0.0;<br \/>\n  segstart+=1.0;<br \/>\n  if (segstart &lt;= segend) {<br \/>\n    addition=eval(1.0 * (eval(segstart \/ segend) * (eval(nextpercent - basepercent))));<br \/>\n    if (segstart &lt; segend) {<br \/>\n      setTimeout(everysecond, 1000);<br \/>\n    }<br \/>\n    document.getElementById('subis').style.background=dstyleit('linear-gradient(to right, yellow ' + Math.ceil(eval(basepercent + addition)) + '%, pink ' + Math.floor(eval(100 - eval(basepercent + addition))) + '%) !important');<br \/>\n  } else {<br \/>\n    addition=eval(nextpercent - basepercent);<br \/>\n    document.getElementById('subis').style.background=dstyleit('linear-gradient(to right, yellow ' + Math.ceil(eval(basepercent + addition)) + '%, pink ' + Math.floor(eval(100 - eval(basepercent + addition))) + '%) !important');<br \/>\n    segstart=0.0;<br \/>\n  }<br \/>\n}<br \/>\n<br \/>\nfunction seqe() {<br \/>\n      var suff=' of 1', lzero=0;<br \/>\n      if (document.getElementById('end' + eval(1 + zero)) && (spareanvideo != '' || spareanimg != '' || spareanaudio != '' || spareelse != '' || zero &gt; 0)) {<br \/>\n      while (audiofiles[eval(0 + lzero)].trim() != '') {<br \/>\n        lzero++;<br \/>\n      }<br \/>\n      suff=' of ' + lzero;<br \/>\n      basepercent=eval(100 * (eval(0 + zero) \/ lzero));<br \/>\n      nextpercent=eval(100 * (eval(1 + zero) \/ lzero));<br \/>\n      if (audiofiles[eval(0 + zero)].indexOf('data:audio\/') == 0) {<br \/>\n      isaudio=true;<br \/>\n      document.getElementById('subis').style.background=dstyleit('linear-gradient(to right, yellow ' + Math.ceil(eval(100 * (eval(0 + zero) \/ lzero))) + '%, pink ' + Math.floor(eval(100 - eval(100 * (eval(0 + zero) \/ lzero)))) + '%) !important');<br \/>\n      document.getElementById('subis').value='Currently Playing Audio ' + eval(1 + zero) + suff; \/\/ + ': ' + audiofiles[eval(0 + zero)].replace(\/\\ \/g,'+'); \/\/ + \" via Google Translate if you press speaker and am waiting for you to close that window.\";<br \/>\n      \/\/var xc=prompt(divanaudio.replace('&lt;source ', '&lt;source type=audio\/' + audiofiles[eval(0 + zero)].split('data:audio\/')[1].split(',')[0].split(';')[0] + ' ').replace(' src=\"\"', ' src=\"' + audiofiles[eval(0 + zero)].replace(\/\\ \/g,'+') + '\"').replace('none','BLOCK'),divanaudio.replace('&lt;source ', '&lt;source type=audio\/' + audiofiles[eval(0 + zero)].split('data:audio\/')[1].split(',')[0].split(';')[0] + ' ').replace(' src=\"\"', ' src=\"' + audiofiles[eval(0 + zero)].replace(\/\\ \/g,'+') + '\"').replace('none','BLOCK'));<br \/>\n      document.getElementById('divanaudio').style.width='30%';<br \/>\n      document.getElementById('divanaudio').style.marginLeft='35%';<br \/>\n      document.getElementById('divanaudio').innerHTML=divanaudio.replace('&gt;',' controls&gt;').replace(' title=\"\"', ' title=\"Play\"').replace('&lt;source ', '&lt;source type=audio\/' + audiofiles[eval(0 + zero)].split('data:audio\/')[1].split(',')[0].split(';')[0] + ' ').replace(' src=\"\"', ' src=\"' + audiofiles[eval(0 + zero)].replace(\/\\ \/g,'+') + '\"').replace('none','BLOCK');<br \/>\n      if (document.getElementById('end' + eval(1 + zero)).value.replace(\/^0\/g,'-').indexOf('-') == -1) {<br \/>\n        segstart=0.0;<br \/>\n        segend=eval('' + document.getElementById('end' + eval(1 + zero)).value) + 4 - eval('' + document.getElementById('start' + eval(1 + zero)).value);<br \/>\n        setTimeout(everysecond, 1000);<br \/>\n        setTimeout(function(){  zero++; seqe(); }, eval(1000 * (eval('' + document.getElementById('end' + eval(1 + zero)).value) + 4 - eval('' + document.getElementById('start' + eval(1 + zero)).value))));<br \/>\n      }<br \/>\n      } else if (audiofiles[eval(0 + zero)].indexOf('data:video\/') == 0) {<br \/>\n      isaudio=false;<br \/>\n      document.getElementById('subis').style.background=dstyleit('linear-gradient(to right, yellow ' + Math.ceil(eval(100 * (eval(0 + zero) \/ lzero))) + '%, pink ' + Math.floor(eval(100 - eval(100 * (eval(0 + zero) \/ lzero)))) + '%) !important');<br \/>\n      document.getElementById('subis').value='Currently Playing Video ' + eval(1 + zero) + suff; \/\/ + ': ' + audiofiles[eval(0 + zero)].replace(\/\\ \/g,'+'); \/\/ + \" via Google Translate if you press speaker and am waiting for you to close that window.\";<br \/>\n      document.getElementById('divanvideo').style.width='100%';<br \/>\n      document.getElementById('anvideo').style.width='60%';<br \/>\n      document.getElementById('anvideo').style.marginLeft='20%';<br \/>\n      document.getElementById('divanvideo').innerHTML=divanvideo.replace('&gt;',' controls&gt;').replace(' title=\"\"', ' title=\"Play\"').replace('&lt;source ', '&lt;source type=video\/' + audiofiles[eval(0 + zero)].split('data:video\/')[1].split(',')[0].split(';')[0].replace('quicktime','mp4') + ' ').replace(' src=\"\"', ' src=\"' + audiofiles[eval(0 + zero)].replace(\/\\ \/g,'+') + '\"').replace('none','BLOCK');<br \/>\n      if (document.getElementById('end' + eval(1 + zero)).value.replace(\/^0\/g,'-').indexOf('-') == -1) {<br \/>\n        setTimeout(everysecond, 1000);<br \/>\n        setTimeout(function(){  zero++; seqe(); }, eval(1000 * (eval('' + document.getElementById('end' + eval(1 + zero)).value) + 4 - eval('' + document.getElementById('start' + eval(1 + zero)).value))));<br \/>\n      }<br \/>\n      } else if (audiofiles[eval(0 + zero)].indexOf('data:image\/') == 0) {<br \/>\n      isaudio=false;<br \/>\n      document.getElementById('subis').style.background=dstyleit('linear-gradient(to right, yellow ' + Math.ceil(eval(100 * (eval(0 + zero) \/ lzero))) + '%, pink ' + Math.floor(eval(100 - eval(100 * (eval(0 + zero) \/ lzero)))) + '%) !important');<br \/>\n      document.getElementById('subis').value='Currently Showing Image ' + eval(1 + zero) + suff; \/\/ + ': ' + audiofiles[eval(0 + zero)].replace(\/\\ \/g,'+'); \/\/ + \" via Google Translate if you press speaker and am waiting for you to close that window.\";<br \/>\n      document.getElementById('divanimg').style.width='100%';<br \/>\n      document.getElementById('divanimg').style.textAlign='center';<br \/>\n      \/\/alert(divanimg.replace(' title=\"\"', ' title=\"Play\"').replace(' src=\"\"', ' src=\"' + audiofiles[eval(0 + zero)].replace(\/\\ \/g,'+') + '\"').replace('none','BLOCK'));<br \/>\n    if (document.getElementById('animg').src == '') {<br \/>\n      document.getElementById('divanimg').innerHTML=divanimg.replace(' title=\"\"', ' title=\"Play\"').replace(' src=\"\"', ' src=\"' + audiofiles[eval(0 + zero)].replace(\/\\ \/g,'+') + '\"').replace('none','BLOCK');<br \/>\n    } else if (document.getElementById('divanimg').innerHTML.indexOf(audiofiles[eval(0 + zero)].replace(\/\\ \/g,'+')) == -1) {<br \/>\n      document.getElementById('divanimg').innerHTML+=('&lt;br&gt;&lt;img' + divanimg.split('&lt;img')[1].split('&lt;\/img&gt;')[0] + '&lt;\/img&gt;').replace(' id=', ' data-id=').replace(' title=\"\"', ' title=\"Play\"').replace(' src=\"\"', ' src=\"' + audiofiles[eval(0 + zero)].replace(\/\\ \/g,'+') + '\"').replace('none','BLOCK');<br \/>\n    }<br \/>\n      if (document.getElementById('end' + eval(1 + zero)).value.replace(\/^0\/g,'-').indexOf('-') == -1) {<br \/>\n        segstart=0.0;<br \/>\n        segend=eval('' + document.getElementById('end' + eval(1 + zero)).value) + 4 - eval('' + document.getElementById('start' + eval(1 + zero)).value);<br \/>\n        setTimeout(everysecond, 1000);<br \/>\n        setTimeout(function(){  zero++; seqe(); }, eval(1000 * (eval('' + document.getElementById('end' + eval(1 + zero)).value) + 4 - eval('' + document.getElementById('start' + eval(1 + zero)).value))));<br \/>\n      }<br \/>\n      } else if (audiofiles[eval(0 + zero)] != '') {<br \/>\n      isaudio=true;<br \/>\n      document.getElementById('subis').style.background=dstyleit('linear-gradient(to right, yellow ' + Math.ceil(eval(100 * (eval(0 + zero) \/ lzero))) + '%, pink ' + Math.floor(eval(100 - eval(100 * (eval(0 + zero) \/ lzero)))) + '%) !important');<br \/>\n      document.getElementById('subis').value='Currently Playing Audio ' + eval(1 + zero) + ': ' + noplus(audiofiles[eval(0 + zero)]) + \" via Google Translate if you press speaker and am waiting for you to close that window \" + suff;<br \/>\n      wo=window.open('https:\/\/translate.google.com\/#auto\/en\/' + encodeURIComponent(noplus(audiofiles[eval(0 + zero)])),'_blank','top=50,left=50,width=600,height=600');<br \/>\n      }<br \/>\n      setTimeout(precheckget, 20);<br \/>\n      }<br \/>\n}<br \/>\n<\/code><br \/>\n &#8230; so as to be happy that our button behaved a lot like a progress bar in <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html-----GETME\" rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html-----GETME\" rel=\"noopener\">splice_audio.htm<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.htm\" rel=\"noopener\">live run<\/a> &#8230;<\/p>\n<li>\n<\/ul>\n<p> &#8230; as something we&#8217;ve long dreamed of <font size=1>&#8230; well, you had to be there!<\/font><\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=\"_blank\" href='\/\/www.rjmprogramming.com.au\/ITblog\/spliced-audio\/video-styling-tutorial\/' rel=\"noopener\">New Spliced Audio\/Video Styling Tutorial<\/a>.<\/p-->\n<hr>\n<p id='sa\/vbdurlt'>Previous relevant <a target=\"_blank\" title='Spliced Audio\/Video Browsing Data URL Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/spliced-audio\/video-browsing-data-url-tutorial\/' rel=\"noopener\">Spliced Audio\/Video Browsing Data URL Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.htm\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Spliced Audio\/Video Browsing Data URL Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/was_spliced_audio_more.gif\" title=\"Spliced Audio\/Video Browsing Data URL Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">Spliced Audio\/Video Browsing Data URL Tutorial<\/p><\/div>\n<p>It&#8217;s data URL media conduits that make &#8230;<\/p>\n<ul>\n<li>browsing for local files off the client operating system environment &#8230; and &#8230;<\/li>\n<li>a genericized &#8220;guise&#8221; of web server media files &#8230; and &#8230;<\/li>\n<li>client <a target=\"_blank\" title='Great link' href='http:\/\/www.html5rocks.com\/en\/tutorials\/file\/dndfiles\/' rel=\"noopener\">File API<\/a> blob or canvas content media representations<\/li>\n<\/ul>\n<p> &#8230; a point of commonality, and as far as we are concerned, we are always looking to these days, whenever we can, <i>data size permitting<\/i>, to do away with static web server references, open to so many mixed content and privilege issues.<\/p>\n<p>Perhaps, that is the major reason, these days, we&#8217;ve taken more and more to hashtag based means of communication via &#8220;a&#8221; &#8220;mailto:&#8221; (email) or &#8220;sms:&#8221; (SMS) links.<\/p>\n<p>Today proved to us that that, albeit most flexible of all, clientside hashtag approach has its data limitations, that PHP serverside form method=POST does better at, as far as accomodating large amounts of data.<\/p>\n<p>And so, yesterday, with our Splicing Audio or Video inhouse web application, turning more towards data URLs to solve issues, we started the day &#8230;<\/p>\n<ul>\n<li>trying hashtag clientside based navigations &#8230; but ran into data size issues, so &#8230;<\/li>\n<li>introduced into our Splicing Audio or Video inhouse web application, for the first time, PHP serverside involvement &#8230;<\/li>\n<\/ul>\n<p> &#8230; that made things start working for us better getting the synchronized play of our user entered audio or video media items performing better.<\/p>\n<p>And so, further to yesterday&#8217;s <a title='Spliced Audio\/Video Data URL Tutorial' href='#sa\/vdurlt'>Spliced Audio\/Video Data URL Tutorial<\/a> we added <i>browsing for local media files<\/i> as a new option for user input, by calling &#8230;<\/p>\n<ul>\n<li><a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php-----------------------------------------------------------------------------------------------GETME' rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php-----------------------------------------------------------------------------------------------GETME' rel=\"noopener\">tutorial_to_animated_gif.php<\/a> PHP <a target=\"_blank\" href='http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php' rel=\"noopener\">animated GIF creator helper<\/a> web application &#8230; hosted in a new iframe element to help collect local file media file(s) &#8230; itself calling &#8230;<\/li>\n<li><a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.html-------------------------------------------------------GETME' rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.html-------------------------------------------------------GETME' rel=\"noopener\">client_browsing.htm<\/a> client side <a target=\"_blank\" href='https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/client_browsing.htm' rel=\"noopener\">local file browsing HTML and Javascript inhouse helper<\/a> &#8230; to help &#8230;<\/li>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.php_GETME\" rel=\"noopener\">totally new &#8220;first draft&#8221;<\/a> PHP &#8220;guise of&#8221; <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.php\" rel=\"noopener\">our Splicing Audio or Video inhouse web application<\/a> (mainly adding $_POST[] navigation knowledge to the HTML template to work off) &#8230; that being &#8230;<\/li>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html----GETME\" rel=\"noopener\">our changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html----GETME\" rel=\"noopener\">splice_audio.htm<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.htm\" rel=\"noopener\">live run<\/a><\/li>\n<\/ul>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=\"_blank\" href='\/\/www.rjmprogramming.com.au\/ITblog\/spliced-audio\/video-browsing-data-url-tutorial\/' rel=\"noopener\">Spliced Audio\/Video Browsing Data URL Tutorial<\/a>.<\/p-->\n<hr>\n<p id='sa\/vdurlt'>Previous relevant <a target=\"_blank\" title='Spliced Audio\/Video Data URL Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/spliced-audio\/video-data-url-tutorial\/' rel=\"noopener\">Spliced Audio\/Video Data URL Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.htm\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Spliced Audio\/Video Data URL Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/was_spliced_audio.gif\" title=\"Spliced Audio\/Video Data URL Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">Spliced Audio\/Video Data URL Tutorial<\/p><\/div>\n<p>We&#8217;re revisiting the Spliced Media web application talked about at <a title='Spliced Audio\/Video Overlay Position Tutorial' href='#savopt'>Spliced Audio\/Video Overlay Position Tutorial<\/a> to shore up some input conduits &#8230;<\/p>\n<ul>\n<li>entering a <i>File<\/i> as a relative URL to the RJM Programming domain document root &#8230;<\/li>\n<li>entering a <i>File<\/i> as a fully formed audio or video data URL<\/li>\n<\/ul>\n<p> &#8230; and there is still browsing for local files we&#8217;d like to add to that list, but on another day.<\/p>\n<p>We started considering this work to help the user to fill out a real media <i>duration<\/i> value that can help with the synchronized playing of the media.<\/p>\n<p>We found that the <i>onloadedmetadata<\/i> statically defined &#8230;<\/p>\n<p><code><br \/>\n&lt;div id=divanaudio&gt;&lt;audio id='anaudio' onload=alere(event); onloadedmetadata=ahere(event); style=display:none;&gt;&lt;source id=sanaudio src=\"\"&gt;&lt;\/source&gt;&lt;\/audio&gt;&lt;\/div&gt;<br \/>\n&lt;div id=divanvideo&gt;&lt;video id='anvideo' onload=vlere(event); onloadedmetadata=vhere(event); style=display:none;&gt;&lt;source id=sanvideo src=\"\"&gt;&lt;\/source&gt;&lt;\/video&gt;&lt;\/div&gt;<br \/>\n&lt;iframe name=myif onload='checkdu(this);' id=myif src=\/HTMLCSS\/do_away_with_the_boring_bits.html style=display:none;&gt;&lt;\/iframe&gt;<br \/>\n&lt;form id=myifform method=POST style=display:none; target=myif action=\/HTMLCSS\/do_away_with_the_boring_bits.php&gt;<br \/>\n&lt;input type=hidden name=url id=myifurl value=''&gt;&lt;\/input&gt;&lt;input type=hidden name=durto id=myifdurto value=''&gt;&lt;\/input&gt;&lt;input type=hidden name=justfgcdu id=myifjustfgcdu value=''&gt;&lt;\/input&gt;&lt;input type=submit id=myifb value=Submit style=display:none;&gt;&lt;\/input&gt;&lt;\/form&gt;<br \/>\n<\/code><\/p>\n<p>&#8230; in an <i>audio<\/i> or <i>video<\/i> element hosted by a reworked <i>div<\/i> hosting element was <font color=blue>the way to go<\/font> &#8230;<\/p>\n<p><code><br \/>\nfunction doinput(sio) {<br \/>\n  <font color=blue>var ij=0;<br \/>\n  if (sio.value.indexOf('data:audio\/') == 0) {<br \/>\n    if (sio.value.indexOf(';base64,') != -1) {<br \/>\n    durtoid='end' + sio.id.replace('audio','');<br \/>\n    document.getElementById('sel' + sio.id.replace('audio','')).value='Audio';<br \/>\n    document.getElementById('divanaudio').innerHTML=divanaudio.replace('&gt;source ', '&lt;source type=audio\/' + sio.value.split('data:audio\/')[1].split(',')[0].split(';')[0] + ' ').replace(' src=\"\"', ' src=\"' + sio.value + '\"').replace('none','NONE');<br \/>\n    document.getElementById('myif').src='\/HTMLCSS\/do_away_with_the_boring_bits.php?rand=' + encodeURIComponent(sio.value.split(';base64,')[0] + ';base64,');<br \/>\n    document.getElementById('myifurl').value=sio.value;<br \/>\n    document.getElementById('myifdurto').value=durtoid;<br \/>\n    document.getElementById('myifjustfgcdu').value=sio.value.split(';base64,')[0] + ';base64,';<br \/>\n    setTimeout(function(){<br \/>\n    document.getElementById('myifb').click();<br \/>\n    }, 2000);<br \/>\n    }<br \/>\n  } else if (sio.value.indexOf('data:video\/') == 0) {<br \/>\n    if (sio.value.indexOf(';base64,') != -1) {<br \/>\n    durtoid='end' + sio.id.replace('audio','');<br \/>\n    document.getElementById('sel' + sio.id.replace('audio','')).value='Video';<br \/>\n    document.getElementById('divanvideo').innerHTML=divanaudio.replace('&lt;source ', '&lt;source type=video\/' + sio.value.split('data:video\/')[1].split(',')[0].split(';')[0] + ' ').replace(' src=\"\"', ' src=\"' + sio.value + '\"').replace('none','NONE');<br \/>\n    document.getElementById('myif').src='\/HTMLCSS\/do_away_with_the_boring_bits.php?rand=' + encodeURIComponent(sio.value.split(';base64,')[0] + ';base64,');<br \/>\n    document.getElementById('myifurl').value=sio.value;<br \/>\n    document.getElementById('myifdurto').value=durtoid;<br \/>\n    document.getElementById('myifjustfgcdu').value=sio.value.split(';base64,')[0] + ';base64,';<br \/>\n    setTimeout(function(){<br \/>\n    document.getElementById('myifb').click();<br \/>\n    }, 2000);<br \/>\n    }<br \/>\n  } else if (sio.value.indexOf('data:image\/') == 0) {<br \/>\n    durtoid='end' + sio.id.replace('audio','');<br \/>\n  } else if (('     ' + sio.value.replace(\/\\.$\/g,'')).slice(-5).indexOf('.') != -1) {<br \/>\n    for (ij=0; ij&lt;mexts.length; ij++) {<br \/>\n      if ((sio.value + '~').indexOf(mexts[ij] + '~') != -1) {<br \/>\n         durtoid='end' + sio.id.replace('audio','');<br \/>\n         document.getElementById('sel' + sio.id.replace('audio','')).value=mtypes[ij].split('\/')[0].substring(0,1).toUpperCase() + mtypes[ij].split('\/')[0].substring(1).toLowerCase();<br \/>\n         switch (mtypes[ij].split('\/')[0]) {<br \/>\n           case \"audio\":<br \/>\n             document.getElementById('myif').src='\/HTMLCSS\/do_away_with_the_boring_bits.php?url=' + encodeURIComponent(sio.value) + '&durto=end' + sio.id.replace('audio','') + '&justfgcdu=' + encodeURIComponent('data:' + mtypes[ij] + ';base64,');<br \/>\n             break;<br \/>\n<br \/>\n           case \"video\":<br \/>\n             document.getElementById('myif').src='\/HTMLCSS\/do_away_with_the_boring_bits.php?url=' + encodeURIComponent(sio.value) + '&durto=end' + sio.id.replace('audio','') + '&justfgcdu=' + encodeURIComponent('data:' + mtypes[ij] + ';base64,');<br \/>\n             break;<br \/>\n    <br \/> <br \/>\n           default:<br \/>\n             break;<br \/>\n        <br \/> <br \/>\n         }<br \/>\n      }<br \/>\n    }<br \/>\n  }<\/font><br \/>\n  audiofiles[eval(-1 + eval(sio.id.replace('audio','')))]=sio.value;<br \/>\n}<br \/>\n<br \/>\nfunction checkdu(iois) {<br \/>\n    if (iois.src.indexOf('\/do_away_with_the_boring_bits.') != -1 && iois.src.indexOf('\/do_away_with_the_boring_bits.htm') == -1) {<br \/>\n       var twaconto = (iois.contentWindow || iois.contentDocument);<br \/>\n       if (twaconto != null) {<br \/>\n       if (twaconto.document) { twaconto = twaconto.document; }<br \/>\n       if (twaconto.body.innerHTML.replace(\/^\\\/tmp\/g, 'data:audio').indexOf('data:audio\/') != -1) {<br \/>\n       \/\/alert(twaconto.body.innerHTML);<br \/>\n          \/\/document.getElementById('sanaudio').src=twaconto.body.innerHTML;<br \/>\n          \/\/alert(divanaudio + ' ... ' + twaconto.body.innerHTML);<br \/>\n          if (twaconto.body.innerHTML.indexOf('data:audio\/') != -1) {<br \/>\n          document.getElementById('divanaudio').innerHTML=divanaudio.replace('&lt;source ', '&lt;source type=audio\/' + twaconto.body.innerHTML.split('data:audio\/')[1].split(',')[0].split(';')[0] + ' ').replace(' src=\"\"', ' src=\"' + twaconto.body.innerHTML + '\"').replace('none','NONE');<br \/>\n          } else {<br \/>\n          var pref=1;<br \/>\n          if (document.getElementById('audio' + pref).value.indexOf('data:') == -1) {<br \/>\n          while (document.getElementById('audio' + pref).value.indexOf('data:') == -1) {<br \/>\n             pref++;<br \/>\n          }<br \/>\n          }<br \/>\n          while (document.getElementById('audio' + pref).value.indexOf('data:') == -1) {<br \/>\n             pref++;<br \/>\n          }<br \/>\n          document.getElementById('audio' + pref).value=twaconto.body.innerHTML;<br \/>\n          iois.src='\/HTMLCSS\/do_away_with_the_boring_bits.php?rand=';<br \/>\n          }<br \/>\n          \/\/alert(document.getElementById('divanaudio').innerHTML);<br \/>\n       } else if (twaconto.body.innerHTML.indexOf('data:video\/') != -1) {<br \/>\n          \/\/document.getElementById('sanvideo').src=twaconto.body.innerHTML;<br \/>\n          \/\/alert(divanvideo + ' ... ' + twaconto.body.innerHTML);<br \/>\n          document.getElementById('divanvideo').innerHTML=divanvideo.replace('&lt;source ', '&lt;source type=video\/' + twaconto.body.innerHTML.split('data:video\/')[1].split(',')[0].split(';')[0] + ' ').replace(' src=\"\"', ' src=\"' + twaconto.body.innerHTML + '\"').replace('none','NONE');<br \/>\n          \/\/alert(document.getElementById('divanvideo').innerHTML);<br \/>\n       }<br \/>\n       \/\/alert(twaconto.body.innerHTML);<br \/>\n       }<br \/>\n    }<br \/>\n}<br \/>\n<br \/>\nfunction ahere(evt) {<br \/>\n if (document.getElementById('sanaudio').src.trim() != '') {<br \/>\n  document.getElementById(durtoid).value=Math.ceil(eval('' + document.getElementById('anaudio').duration));<br \/>\n  \/\/alert('audio here');<br \/>\n  \/\/alert('audio here ' + document.getElementById('anaudio').duration);<br \/>\n }<br \/>\n}<br \/>\n<br \/>\nfunction alere(evt) {<br \/>\n if (document.getElementById('sanaudio').src.trim() != '') {<br \/>\n  document.getElementById(durtoid).value=Math.ceil(eval('' + document.getElementById('anaudio').duration));<br \/>\n  \/\/alert('audio Here');<br \/>\n }<br \/>\n}<br \/>\n<br \/>\nfunction vhere(evt) {<br \/>\n if (document.getElementById('sanvideo').src.trim() != '') {<br \/>\n  document.getElementById(durtoid).value=Math.ceil(eval('' + document.getElementById('anvideo').duration));<br \/>\n  \/\/alert('video here');<br \/>\n  \/\/alert('video here ' + document.getElementById('anvideo').duration);<br \/>\n }<br \/>\n}<br \/>\n<br \/>\nfunction vlere(evt) {<br \/>\n if (document.getElementById('sanvideo').src.trim() != '') {<br \/>\n  document.getElementById(durtoid).value=Math.ceil(eval('' + document.getElementById('anvideo').duration));<br \/>\n  \/\/alert('video Here');<br \/>\n }<br \/>\n}<br \/>\n<\/code><\/p>\n<p>This works if you can fill in the <i>src<\/i> attribute of the relevant subelement <i>source<\/i> element with a suitable <i>data URL<\/i> <font size=1>(we used <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/do_away_with_the_boring_bits.php----GETME\" rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/do_away_with_the_boring_bits.php----GETME\" rel=\"noopener\">do_away_with_the_boring_bits.php<\/a> helping PHP to derive)<\/font>.  From there, in that event logic an [element].duration is there to help fill out those end of play textboxes in a more automated fashion for the user that wants to use this new functionality, as they fill out the Spliced Media form presented.<\/p>\n<p><!--p>You can also see this play out at WordPress 4.1.1's <a target=\"_blank\" href='\/\/www.rjmprogramming.com.au\/ITblog\/spliced-audio\/video-data-url-tutorial\/' rel=\"noopener\">Spliced Audio\/Video Data URL Tutorial<\/a>.<\/p-->\n<hr>\n<p id='savopt'>Previous relevant <a target=\"_blank\" title='Spliced Audio\/Video Overlay Position Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/spliced-audiovideo-overlay-position-tutorial\/' rel=\"noopener\">Spliced Audio\/Video Overlay Position Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.htm\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Spliced Audio\/Video Overlay Position Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audiovideo_position.jpg\" title=\"Spliced Audio\/Video Overlay Position Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">Spliced Audio\/Video Overlay Position Tutorial<\/p><\/div>\n<p>Today we&#8217;ve written a third draft of an HTML and Javascript web application that splices up to nine bits of audio or video or image input together, building on the previous <a title='Spliced Audio\/Video\/Image Overlay Tutorial' href='#saviot'>Spliced Audio\/Video\/Image Overlay Tutorial<\/a> as shown below, here, and that can take any of the forms &#8230;<\/p>\n<ul>\n<li>audio file &#8230; and less user friendly is &#8230;<\/li>\n<li>text that gets turned into speech via <a target=\"_blank\" title='Google Translate' href='http:\/\/translate.google.com' rel=\"noopener\">Google Translate<\/a> (and user induced Text to Speech functionality), but needs your button presses<\/li>\n<li>video<\/li>\n<li>image &#8230; and background image for webpage<\/li>\n<\/ul>\n<p> &#8230; for either of the modes of use, that being &#8230;<\/p>\n<ul>\n<li>discrete &#8230; or &#8220;Optional&#8221;<\/li>\n<li>synchronized &#8230; or &#8220;Overlay&#8221;<\/li>\n<\/ul>\n<p> &#8230; all like yesterday, but this time we allow you to &#8220;seek&#8221; or position yourself within the audio and\/or video media.  We still all &#8220;fit&#8221; this into GET parameter usage.  Are you thinking we are a tad lazy with this approach?  Well, perhaps a little, but it also means you can do this job just using clientside HTML and Javascript, without having to involve any serverside code like PHP, and in this day and age, people are much keener on this &#8220;just clientside&#8221; or &#8220;just client looking, plus, perhaps, Javascript serverside code&#8221; (ala <a target=\"_blank\" title='Node.js installation download webpage' href='https:\/\/nodejs.org\/en\/download\/' rel=\"noopener\">Node.js<\/a>) or perhaps &#8220;Javascript clientside client code, plus Ajax methodologies&#8221;.  In any case, it does simplify design to not have to involve a serverside language like PHP &#8230; but please don&#8217;t think we do not encourage you to learn a serverside language like PHP.<\/p>\n<p>While we are at it here, we continue to think about the mobile device unfriendliness with our current web application, it being, these days, that the setting of the <i>autoplay<\/i> property for a media object is frowned upon regarding these mobile devices &#8230; for reasons of &#8220;runaway&#8221; unknown charge issues as you can read at this <a target=\"_blank\" title='Useful link' href='http:\/\/stackoverflow.com\/questions\/12496144\/can-you-autoplay-html5-videos-on-the-ipad' rel=\"noopener\">useful link<\/a> &#8230; thanks &#8230; and where they quote from Apple &#8230; <\/p>\n<blockquote cite=\"http:\/\/stackoverflow.com\/questions\/12496144\/can-you-autoplay-html5-videos-on-the-ipad\"><p>\n    &#8220;Apple has made the decision to disable the automatic playing of video on iOS devices, through both script and attribute implementations.<br \/>\n<b><\/b><br \/>\n    In Safari, on iOS (for all devices, including iPad), where the user may be on a cellular network and be charged per data unit, preload and auto-play are disabled. No data is loaded until the user initiates it.&#8221; &#8211; Apple documentation.\n<\/p><\/blockquote>\n<p>A link we&#8217;d like to thank regarding the new &#8220;seek&#8221; or media positioning functionality is <a target=\"_blank\" title='Useful link' href='http:\/\/stackoverflow.com\/questions\/9563887\/setting-html5-audio-position' rel=\"noopener\">this one<\/a> &#8230; thanks.<\/p>\n<p><p>Also, today, for that sense of symmetry, we start to create the Audio objects from now on using &#8230;<\/p>\n<p><code><br \/>\ndocument.createElement(\"AUDIO\");<br \/>\n<\/code><\/p>\n<p> &#8230; as this acts the same as <i>new Audio()<\/i> to the best of our testing.<\/p>\n<p>For your own testing purposes, if you know of some media URLs to try, please feel free to try the &#8220;overlay&#8221; of media ideas inherent in today&#8217;s <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html---GETME\" rel=\"noopener\">splice_audio.htm<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.htm\" rel=\"noopener\">live run<\/a>.  For today&#8217;s <i>cake<\/i> &#8220;prepared before the program&#8221; we&#8217;ve again channelled the <a target=\"_blank\" title='GoToMeeting Primer Tutorial' href='https:\/\/www.rjmprogramming.com.au\/ITblog\/gotomeeting-primer-tutorial\/' rel=\"noopener\">GoToMeeting Primer Tutorial<\/a> which had separate audio (albeit very short &#8230; sorry &#8230; but you get the gist) and video &#8230; well, below, you can click on the image to hear the presentation with audio and video synchronized, but only seconds 23 through to 47 of the video should play, and the presentation ending with the image below &#8230;<\/p>\n<p><a id='aaiff' title='Click to see the audio and video played together synchronously' onclick=\"  document.getElementById('aiff').style.display='block';  document.getElementById('aiff').src='http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.htm?audio1=..%2FGoToMeeting%2FGoToMeeting.m4v+%2323.47&#038;audio2=+..%2FGoToMeeting%2FGoToMeeting.m4a&#038;audio3=..%2FGoToMeeting%2FGoToMeeting-80aof.jpg++&#038;audio4=&#038;audio5=&#038;audio6=&#038;audio7=&#038;audio8=&#038;audio9=&#038;background=&#038;hide=offoff'; this.style.display='none'; \"><img title='Click to see the audio and video played together synchronously' id='iiif' src='http:\/\/www.rjmprogramming.com.au\/Mac\/GoToMeeting\/GoToMeeting-80aof.jpg'><\/img><\/a><iframe style='display:none; width:100%; height:500px;' id='aiff' src='http:\/\/www.rjmprogramming.com.au\/Mac\/GoToMeeting\/GoToMeeting-80aof.jpg' title='GoToMeeting Primer Tutorial presentation'><\/iframe><\/p>\n<p>We think, though, that we will be back regarding this interesting topic, and hope we can improve mobile device functionality.<\/p>\n<hr>\n<p id='saviot'>Previous relevant <a target=\"_blank\" title='Spliced Audio\/Video\/Image Overlay Tutorial' href='https:\/\/www.rjmprogramming.com.au\/ITblog\/spliced-audiovideoimage-overlay-tutorial\/' rel=\"noopener\">Spliced Audio\/Video\/Image Overlay Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.htm\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Spliced Audio\/Video\/Image Overlay Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audiovideo.jpg\" title=\"Spliced Audio\/Video\/Image Overlay Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">Spliced Audio\/Video\/Image Overlay Tutorial<\/p><\/div>\n<p>Today we&#8217;ve written a second draft of an HTML and Javascript web application that splices up to nine bits of audio or video or image input together, building on the previous <a title='Splicing Audio Primer Tutorial' href='#sapt'>Splicing Audio Primer Tutorial<\/a> as shown below, here, and that can take any of the forms &#8230;<\/p>\n<ul>\n<li>audio file &#8230; and less user friendly is &#8230;<\/li>\n<li>text that gets turned into speech via <a target=\"_blank\" title='Google Translate' href='http:\/\/translate.google.com' rel=\"noopener\">Google Translate<\/a> (and user induced Text to Speech functionality), but needs your button presses<\/li>\n<li>video<\/li>\n<li>image &#8230; and background image for webpage<\/li>\n<\/ul>\n<p> &#8230; for either of the modes of use, that being &#8230;<\/p>\n<ul>\n<li>discrete &#8230; or &#8220;Optional&#8221;<\/li>\n<li>synchronized &#8230; or &#8220;Overlay&#8221;<\/li>\n<\/ul>\n<p>The major new change here, apart from the ability to play two media files at once in our synchronized (or &#8220;overlayed&#8221;) way, is the additional functionality for Video, and we proceeded thinking there&#8217;d be an Javascript DOM <a target=\"_blank\" title='OOP information from Wikipedia ... thanks' href='http:\/\/en.wikipedia.org\/wiki\/Object-oriented_programming' rel=\"noopener\">OOP<\/a>y method like &#8230; <i>var xv = new Video();<\/i> &#8230; to allow for this, but found out from this useful link &#8230; thanks &#8230; that an <a target=\"_blank\" title='Video object information from w3schools' href='http:\/\/www.w3schools.com\/jsref\/dom_obj_video.asp' rel=\"noopener\">alternative approach for Video<\/a> object creation, on the fly, is &#8230;<\/p>\n<p><code><br \/>\nvar xv = document.createElement(\"VIDEO\");<br \/>\n<\/code><\/p>\n<p> &#8230; curiously.  And it took us a while to tweak to the idea that to have a &#8220;display home&#8221; for the video on the webpage we needed to &#8230;<\/p>\n<p><code><br \/>\ndocument.body.appendChild(xv);<br \/>\n<\/code><\/p>\n<p> &#8230; which means you need to take care of any HTML form data already filled in, that isn&#8217;t that form&#8217;s default, when you effectively &#8220;refresh&#8221; the webpage like this.  Essentially though, media on the fly is a modern approach possible fairly easily with just clientside code.  Cute, huh?!<\/p>\n<p>Of course, what we still miss here, is the upload from a local place onto the web server, here at RJM Programming, capability, which we may consider in future, and that some of those other <a target=\"_blank\" title='Synchronization blog postings here' href='https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/synchronize' rel=\"noopener\">synchronization of media<\/a> themed blog postings of the past, which you may want to read more, for this type of approach.<\/p>\n<p>In the meantime, if you know of some media URLs to try, please feel free to try the &#8220;overlay&#8221; of media ideas inherent in today&#8217;s <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html--GETME\" rel=\"noopener\">splice_audio.htm<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.htm\" rel=\"noopener\">live run<\/a>.  We&#8217;ve thought of this one.  Do you remember how the <a target=\"_blank\" title='GoToMeeting Primer Tutorial' href='https:\/\/www.rjmprogramming.com.au\/ITblog\/gotomeeting-primer-tutorial\/' rel=\"noopener\">GoToMeeting Primer Tutorial<\/a> had separate audio (albeit very short &#8230; sorry &#8230; but you get the gist) and video &#8230; well, below, you can click on the image to hear the presentation with audio and video synchronized, and the presentation ending with the image below &#8230;<\/p>\n<p><a id='aaif' title='Click to see the audio and video played together synchronously' onclick=\"  document.getElementById('aif').style.display='block';  document.getElementById('aif').src='http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.htm?audio1=..%2FGoToMeeting%2FGoToMeeting.m4v+&#038;audio2=+..%2FGoToMeeting%2FGoToMeeting.m4a&#038;audio3=..%2FGoToMeeting%2FGoToMeeting-80aof.jpg++&#038;audio4=&#038;audio5=&#038;audio6=&#038;audio7=&#038;audio8=&#038;audio9=&#038;background=&#038;hide=offoff'; this.style.display='none'; \"><img title='Click to see the audio and video played together synchronously' id='iiif' src='http:\/\/www.rjmprogramming.com.au\/Mac\/GoToMeeting\/GoToMeeting-80aof.jpg'><\/img><\/a><iframe style='display:none; width:100%; height:500px;' id='aif' src='http:\/\/www.rjmprogramming.com.au\/Mac\/GoToMeeting\/GoToMeeting-80aof.jpg' title='GoToMeeting Primer Tutorial presentation'><\/iframe><\/p>\n<p>We think, though, that we will be back regarding this interesting topic.<\/p>\n<hr>\n<p id='sapt'>Previous relevant <a target=\"_blank\" title='Splicing Audio Primer Tutorial' href='https:\/\/www.rjmprogramming.com.au\/ITblog\/splicing-audio-primer-tutorial\/' rel=\"noopener\">Splicing Audio Primer Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Spliced Audio Primer Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.jpg\" title=\"Spliced Audio Primer Tutorial\"  style=\"float:left;\"   \/><\/a><p class=\"wp-caption-text\">Splicing Audio Primer Tutorial<\/p><\/div>\n<p>Today we&#8217;ve written a first draft of an HTML and Javascript web application that splices up to nine bits of audio input together that can take either of the forms &#8230;<\/p>\n<ul>\n<li>audio file &#8230; and less user friendly is &#8230;<\/li>\n<li>text that gets turned into speech via <a target=\"_blank\" title='Google Translate' href='http:\/\/translate.google.com' rel=\"noopener\">Google Translate<\/a> (and user induced Text to Speech functionality), but needs your button presses<\/li>\n<\/ul>\n<p>Do you remember, perhaps, when we did a series of blog posts regarding the YouTube API, that finished, so far, with <a target=\"_blank\" title='YouTube API Iframe Synchronicity Resizing Tutorial' href='https:\/\/www.rjmprogramming.com.au\/ITblog\/youtube-api-iframe-synchronicity-resizing-tutorial\/' rel=\"noopener\">YouTube API Iframe Synchronicity Resizing Tutorial<\/a>?  Well, a lot of what we do today is doing similar sorts of functionalities but just for <a target=\"_blank\" title='Javascript Audio object via DOM information from w3schools' href='http:\/\/www.w3schools.com\/tags\/ref_av_dom.asp' rel=\"noopener\"><i>Audio<\/i><\/a> objects in HTML5.  For help on this we&#8217;d like to thank this <a target=\"_blank\" title='Great link' href='http:\/\/stackoverflow.com\/questions\/10868249\/html5-audio-player-duration-showing-nan' rel=\"noopener\">great link<\/a>.  So rather than have HTML <a target=\"_blank\" href='http:\/\/www.w3schools.com\/html\/html5_audio.asp' title='HTML audio tag information from w3schools' rel=\"noopener\"><i>audio<\/i><\/a> elements in our HTML, as we first shaped to do, we&#8217;ve taken the great advice from this link, and gone all Javascript DOM <a target=\"_blank\" title='OOP information from Wikipedia ... thanks' href='http:\/\/en.wikipedia.org\/wiki\/Object-oriented_programming' rel=\"noopener\">OOP<\/a>y on the task, to splice audio media together.<\/p>\n<p>There were three thought patterns going on here for me.<\/p>\n<ul>\n<li>The first was a simulation of those Sydney train public announcements where the timbre of the voice differs a bit between when they say &#8220;Platform&#8221; and the &#8220;6&#8221; (or whatever platform it is) that follows.  This is pretty obviously computer audio &#8220;bits&#8221; strung together &#8230; and wanted to get somewhere towards that capability.<\/li>\n<li>The second one relates to presentation ideas following up on that &#8220;onmouseover&#8221; Siri audio enhanced presentation we did at <a target=\"_blank\" title='Apple iOS Siri Audio Commentary Tutorial' href='https:\/\/www.rjmprogramming.com.au\/ITblog\/apple-ios-siri-audio-commentary-tutorial\/' rel=\"noopener\">Apple iOS Siri Audio Commentary Tutorial<\/a>.  Well, we think we can do something related to that here, and we&#8217;ve prepared this <strike>cake<\/strike> audio presentation here, for us, in advance &#8230; <font size=1>really, there&#8217;s no need for thanks<\/font>.<\/li>\n<li>The third concerns our eternal media file synchronization quests here at this blog that you may find of interest we hope, <a target=\"_blank\" title='Synchronization blog postings here' href='https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/synchronize' rel=\"noopener\">here<\/a>.<\/p>\n<\/ul>\n<p>Also of interest over time has been the <a target=\"_blank\" title='Google Translate' href='http:\/\/translate.google.com' rel=\"noopener\">Google Translate<\/a> Text to Speech functionality that <a target=\"_blank\" title='Discussion here' href='https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/text-to-speech' rel=\"noopener\">used to be very open<\/a>, and we now only use around here in an interactive &#8220;user clicks&#8221; way &#8230; but we still use it, because it is very useful, so, thanks.  But trying to get this method working for &#8220;Platform&#8221; and &#8220;6&#8221; without a yawning gap in between ruins the spontaneity and fun somehow, but there&#8217;s nothing stopping you making your own audio files yourself as we did in that Siri tutorial called <a target=\"_blank\" title='Apple iOS Siri Audio Commentary Tutorial' href='https:\/\/www.rjmprogramming.com.au\/ITblog\/apple-ios-siri-audio-commentary-tutorial\/' rel=\"noopener\">Apple iOS Siri Audio Commentary Tutorial<\/a> and take the HTML and Javascript code you could call <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html_GETME\" title='splice_audio.html' rel=\"noopener\">splice_audio.html<\/a> from today, and go and make your own web application? Now, is there? Huh?<\/p>\n<p>Try a <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html\" title='Click picture' rel=\"noopener\">live run<\/a> or perhaps some more Siri cakes?!<\/p>\n<ul>\n<li><a target=\"_blank\" title='Audio with Background then Form for another, perhaps' href='http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html?audio1=slide1.m4a&#038;audio2=slide2.m4a&#038;audio3=slide3.m4a&#038;audio4=slide4.m4a&#038;audio5=slide5.m4a&#038;audio6=slide6.m4a&#038;audio7=slide7.m4a&#038;audio8=slide8.m4a&#038;audio9=slide9.m4a&#038;background=siri_setup.jpg&#038;hide=onoff' rel=\"noopener\">Audio with Background then Form for another, perhaps<\/a><\/li>\n<li><a target=\"_blank\" title='Audio with Background and Form showing the whole time' href='http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html?audio1=slide1.m4a&#038;audio2=slide2.m4a&#038;audio3=slide3.m4a&#038;audio4=slide4.m4a&#038;audio5=slide5.m4a&#038;audio6=slide6.m4a&#038;audio7=slide7.m4a&#038;audio8=slide8.m4a&#038;audio9=slide9.m4a&#038;background=siri_setup.jpg&#038;hide=offoff' rel=\"noopener\">Audio with Background and Form showing the whole time<\/a><\/li>\n<li><a target=\"_blank\" title='Audio with no Background then Form for another, perhaps' href='http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html?audio1=slide1.m4a&#038;audio2=slide2.m4a&#038;audio3=slide3.m4a&#038;audio4=slide4.m4a&#038;audio5=slide5.m4a&#038;audio6=slide6.m4a&#038;audio7=slide7.m4a&#038;audio8=slide8.m4a&#038;audio9=slide9.m4a&#038;background=&#038;hide=onoff' rel=\"noopener\">Audio with no Background then Form for another, perhaps<\/a><\/li>\n<li><a target=\"_blank\" title='Just Audio' href='http:\/\/www.rjmprogramming.com.au\/Mac\/iPad\/splice_audio.html?audio1=slide1.m4a&#038;audio2=slide2.m4a&#038;audio3=slide3.m4a&#038;audio4=slide4.m4a&#038;audio5=slide5.m4a&#038;audio6=slide6.m4a&#038;audio7=slide7.m4a&#038;audio8=slide8.m4a&#038;audio9=slide9.m4a&#038;background=&#038;hide=onon' rel=\"noopener\">Just Audio<\/a><\/li>\n<\/ul>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d24451' onclick='var dv=document.getElementById(\"d24451\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/audio\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d24451' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d24545' onclick='var dv=document.getElementById(\"d24545\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/video\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d24545' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d24572' onclick='var dv=document.getElementById(\"d24572\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/media\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d24572' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d67866' onclick='var dv=document.getElementById(\"d67866\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/audio\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d67866' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d67887' onclick='var dv=document.getElementById(\"d67887\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/browsing\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d67887' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d67907' onclick='var dv=document.getElementById(\"d67907\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/css\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d67907' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d67921' onclick='var dv=document.getElementById(\"d67921\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/duration\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d67921' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d67933' onclick='var dv=document.getElementById(\"d67933\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/youtube\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d67933' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d67936' onclick='var dv=document.getElementById(\"d67936\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/delimitation\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d67936' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d67952' onclick='var dv=document.getElementById(\"d67952\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/overlay\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d67952' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d67964' onclick='var dv=document.getElementById(\"d67964\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/localStorage\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d67964' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d67976' onclick='var dv=document.getElementById(\"d67976\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/intervention\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d67976' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d67998' onclick='var dv=document.getElementById(\"d67998\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/shuffle\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d67998' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d68005' onclick='var dv=document.getElementById(\"d68005\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/playlist\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d68005' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d68090' onclick='var dv=document.getElementById(\"d68090\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/microphone\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d68090' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Back at the recent YouTube Video List of Play Supervisor Tutorial the role of our inhouse YouTube Interfacer web application was as a middleparent in a &#8220;grandparent&#8221;\/&#8221;parent&#8221;\/&#8221;grandchild&#8221; web application design, but today we revisit the functionality that motivated us to &hellip; <a href=\"https:\/\/www.rjmprogramming.com.au\/ITblog\/audio-recording-youtube-interfacer-revisit-tutorial\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,14,37],"tags":[2915,83,113,3806,1989,2051,1993,3531,1849,5160,281,290,5159,297,307,2380,2276,2147,2310,354,360,5168,419,452,532,557,576,587,2882,626,631,652,2016,4772,2415,3373,2205,3870,760,1830,781,795,840,849,5167,870,5158,875,894,932,1845,2362,1898,1988,970,997,3274,2407,1032,1063,2210,2254,1987,4438,1166,5166,1209,1212,5161,2311,1234,1670,1242,1258,1319,1369,1404,2099,1493],"class_list":["post-68090","post","type-post","status-publish","format-standard","hentry","category-elearning","category-event-driven-programming","category-tutorials","tag-_post","tag-animated-gif","tag-audio","tag-audio-file","tag-autoplay","tag-blob","tag-browse","tag-browsing","tag-coding","tag-concertina","tag-css","tag-data","tag-data-size","tag-data-url","tag-debugging","tag-delay","tag-delimitation","tag-delimiter","tag-details","tag-dom","tag-download","tag-downloads","tag-file-api","tag-form","tag-google-translate","tag-hashtag","tag-html","tag-iframe","tag-intervention","tag-ios","tag-iphone","tag-javascript","tag-karaoke","tag-local-file","tag-localstorage","tag-logic","tag-loop","tag-looping","tag-media","tag-method","tag-microphone","tag-mobile","tag-node-js","tag-object","tag-online-voice-recorder","tag-onload","tag-onloadedmetadata","tag-oop","tag-overlay","tag-php","tag-planning","tag-play","tag-playlist","tag-position","tag-post","tag-programming","tag-recall","tag-record","tag-recording","tag-reveal","tag-rule","tag-rules","tag-seek","tag-shuffle","tag-software-2","tag-splashpage","tag-style","tag-styling","tag-suck-and-see","tag-summary","tag-synchronization","tag-synchronize","tag-tap","tag-text-to-speech","tag-tutorial","tag-video","tag-web-browser","tag-web-inspector","tag-youtube"],"_links":{"self":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/68090"}],"collection":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/comments?post=68090"}],"version-history":[{"count":17,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/68090\/revisions"}],"predecessor-version":[{"id":68112,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/68090\/revisions\/68112"}],"wp:attachment":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/media?parent=68090"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/categories?post=68090"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/tags?post=68090"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}