{"id":70594,"date":"2025-11-15T03:01:00","date_gmt":"2025-11-14T17:01:00","guid":{"rendered":"https:\/\/www.rjmprogramming.com.au\/ITblog\/?p=70594"},"modified":"2025-11-15T08:14:21","modified_gmt":"2025-11-14T22:14:21","slug":"youtube-api-caller-radio-play-playlist-local-system-tutorial","status":"publish","type":"post","link":"https:\/\/www.rjmprogramming.com.au\/ITblog\/youtube-api-caller-radio-play-playlist-local-system-tutorial\/","title":{"rendered":"YouTube API Caller Radio Play Playlist Local System Tutorial"},"content":{"rendered":"<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"YouTube API Caller Radio Play Playlist Local System Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media_cmd.gif\" title=\"YouTube API Caller Radio Play Playlist Local System Tutorial\"  style=\"float:left;\"  \/><\/a><p class=\"wp-caption-text\">YouTube API Caller Radio Play Playlist Local System Tutorial<\/p><\/div>\n<p>The ..<\/p>\n<blockquote><p>\ncommand line\n<\/p><\/blockquote>\n<p> &#8230; of a laptop or notebook or personal computer can be an environment to relax from the GUI aspects of your modern operating systems and think about &#8230;<\/p>\n<ul>\n<li>processes<\/li>\n<li>batch driven tasks<\/li>\n<li>task simplifications<\/li>\n<\/ul>\n<p> &#8230; and in the category of that last one, on our local macOS operating system we envisaged a day we could slip back to the &#8220;quiet world&#8221; of the &#8220;command line&#8221; and type a command like &#8230;<\/p>\n<p><code><br \/>\nplay Tragedy,Imagine,Down Among the Dead Men PAN -<br \/>\n<\/code><\/p>\n<p> &#8230; and get somewhere playing those songs through a web browser accessing 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 our interfacings to it in webpage software form, playing in a continuous Radio Play style.<\/p>\n<p>You see, with all the distractions, only having to remember &#8230;<\/p>\n<blockquote><p>\nplay\n<\/p><\/blockquote>\n<p> &#8230; no matter where we were in &#8220;command line&#8221; woooorrrrllllddd seemed the ideal, and yes, it&#8217;s possible.  However, we think explaining &#8230;<\/p>\n<p><code><br \/>\nbash \/Applications\/MAMP\/htdocs\/play.<strike>k<\/strike>sh Tragedy,Imagine,Down Among the Dead Men PAN -<br \/>\n<\/code><\/p>\n<p> &#8230; is a necessary dividing line between two parts to the discussion.  So what&#8217;s <i>bash<\/i>?  It&#8217;s the shell we associate as your macOS default shell (we get to via the &#8220;out of the box&#8221; macOS <i>desktop application<\/i> called Terminal) &#8230; well, it used to be &#8230; anyway, the first line of (what started as play.ksh then play.sh and then eventually, just, play &#8230; as a filename <span><a target=\"_blank\" title='?' class=\"audioytplay\" href='https:\/\/www.youtube.com\/watch?v=PtR4cWb4HNg' rel=\"noopener\">that is<\/a><\/span>) &#8230;<\/p>\n<p><code><br \/>\n#!\/bin\/bash<br \/>\nrest=\"\"<br \/>\nif [ -z \"$1\" ]; then<br \/>\n  echo \"Radio Play via comma separate YouTube 11 character IDs or search ideas for a playlist ... egs. Tragedy,Boogie Wonderland,Down Among the Dead Men ... random ... Tragedy ,Imagine*3,Breezin ... ordered 5 ... Tragedy  ,Pina Colada Song,Fast Car ... audio ... Tragedy   ,Galveston,Fix You    ... audio ordered,    and go.\"<br \/>\n  read ans<br \/>\nelse<br \/>\n  ans=\"$1 $2 $3 $4 $5 $6 $7 $8 $9\"<br \/>\n  while [ ! -z \"$9\" ]; do<br \/>\n   shift<br \/>\n   rest=\"${rest} $9\"<br \/>\n  done<br \/>\n  ans=\"$ans${rest}\"<br \/>\nfi<br \/>\nif [ ! -z \"$ans\" ]; then<br \/>\n  open \"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html $ans\"<br \/>\nfi<br \/>\nexit<br \/>\n<\/code><\/p>\n<p> &#8230; tells the local system use the <i>bash<\/i> shell to interpret this what you might like to think of as an <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/Mac\/play.sh_GETME\" rel=\"noopener\">executable script<\/a> (which we went <i>chmod 777 play<\/i> regarding to make it so).<\/p>\n<p>Okay, so we wrote this script in \/Applications\/MAMP\/htdocs\/ and that &#8230;<\/p>\n<p><code><br \/>\nbash \/Applications\/MAMP\/htdocs\/play Tragedy,Imagine,Down Among the Dead Men PAN -<br \/>\n<\/code><\/p>\n<p> &#8230; could swing it at this stage, or even being in \/Applications\/MAMP\/htdocs\/ and going &#8230;<\/p>\n<p><code><br \/>\n.\/play Tragedy,Imagine,Down Among the Dead Men PAN -<br \/>\n<\/code><\/p>\n<p> &#8230; but (even in \/Applications\/MAMP\/htdocs\/) &#8230;<\/p>\n<p><code><br \/>\nplay Tragedy,Imagine,Down Among the Dead Men PAN -<br \/>\n<\/code><\/p>\n<p> &#8230; is most likely to reply something like &#8230;<\/p>\n<blockquote><p>\n<span title='This is what made me think bash is not the default shell ... anyway ...'>zsh<\/span>: no such command\n<\/p><\/blockquote>\n<p>As the programmer, perhaps you could leave it at that with your &#8220;insider knowledge&#8221;, or if &#8220;play&#8221; as a command already meant something <font size=1>(a test that would be good to do before any such proposed work)<\/font>, otherwise &#8230; do you really think you&#8217;ll remember next Wednesday?   So &#8230;<\/p>\n<ol>\n<li>enter into the wooooorrrrllllddd of <i>alias<\/i><sup>es<\/sup> (thanks to <a target=\"_blank\" title='alias advice' href='https:\/\/www.google.com\/search?q=bash+alias&#038;rlz=1C5OZZY_en&#038;oq=bash+alias&#038;gs_lcrp=EgZjaHJvbWUyCQgAEEUYORiABDIHCAEQABiABDIHCAIQABiABDIHCAMQABiABDIHCAQQABiABDIHCAUQABiABDIHCAYQABiABDIMCAcQABgUGIcCGIAEMgcICBAAGIAEMgcICRAAGIAE0gEIMzg0MmowajeoAgCwAgA&#038;sourceid=chrome&#038;ie=UTF-8' rel=\"noopener\">this great advice<\/a>, thanks) &#8230; eg.<br \/>\n<code><br \/>\nalias play=\"\/Applications\/MAMP\/htdocs\/play\"<br \/>\n<\/code>\n<\/li>\n<li>placed into &#8230;<br \/>\n<code><br \/>\n~\/.bashrc<br \/>\n<\/code><br \/>\n &#8230; via (in our case) &#8230;<br \/>\n<code><br \/>\nvi ~\/.bashrc<br \/>\n<\/code>\n<\/li>\n<li>then &#8230;<br \/>\n<code><br \/>\nsource ~\/.bashrc<br \/>\n<\/code><br \/>\n &#8230; needs to be included into the login procedure of &#8230;<br \/>\n<code><br \/>\n~\/.profile<br \/>\n<\/code><br \/>\n &#8230;via (in our case) &#8230;<br \/>\n<code><br \/>\nvi ~\/.profile<br \/>\n<\/code>\n<\/li>\n<li>to make &#8230;<br \/>\n<code><br \/>\nplay<br \/>\n<\/code><br \/>\n &#8230; as the interactively asking alternative to the argumentative example of &#8230;<br \/>\n<code><br \/>\nplay Tragedy,Imagine,Down Among the Dead Men PAN -<br \/>\n<\/code><br \/>\n &#8230; mean something &#8230; and anywhere\n<\/ul>\n<p> &#8230; all of this possible because of the brilliantly useful macOS (not Linux nor unix) &#8230;<\/p>\n<p><code><br \/>\n<a target=\"_blank\" title='macOS open command' href='https:\/\/scriptingosx.com\/2017\/02\/the-macos-open-command\/' rel=\"noopener\">open<\/a><br \/>\n<\/code><\/p>\n<p> &#8230; opener of web browsers from the command line <font size=1>blowing of our tiny little rather still naive mind<\/font> &#8230; mind you, VAX\/VMS &#8220;phone&#8221; command from the &#8217;70&#8217;s might have <i>even<\/i> been better?!  <font size=3>And then there were those punch<\/font><font size=2> cards &#8230; in the hopper &#8230; and if you got a character wro<\/font><font size=1>ng &#8230; <a target=\"_blank\" title=\"?\" href='https:\/\/www.youtube.com\/watch?v=qZlqWPClHic' rel=\"noopener\">back to the end of the queue<\/a>.<\/font><\/p>\n<p>Sorry &#8230; we got a bit hot and bothered there!<\/p>\n<p>Anyway, as a layer of thought on top of the recent <a title='YouTube API Caller Radio Play Playlist Songname Search List Repeats Tutorial' href='#ytapicrppsslrt'>YouTube API Caller Radio Play Playlist Songname Search List Repeats Tutorial<\/a>&#8216;s <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html-----------------------------------------GETME\" rel=\"noopener\">mildly changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html-----------------------------------------GETME\" rel=\"noopener\">swipe_media.html<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html\" rel=\"noopener\">Tabular Single Row Media Gallery<\/a> web application work it might be a thing you want to pursue yourself?<\/p>\n<p>By the way, this brought into play for us what your default web browser is.  Ours is Safari yet we develop more on Google Chrome.  Safari, for us, does more Popup Blocking, and it is a thing to look out for should a window not open when expected <font size=1>(and these command line methodologies don&#8217;t get past you still having to unmute and\/or click\/tap once before the Radio Play mode of play kicks off)<\/font>.  To undo the Popup Block there will probably be a means to do this to the right of the web browser address bar.<\/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\/new-youtube-api-caller-radio-play-playlist-songname-search-list-repeats-tutorial\/' rel=\"noopener\">New YouTube API Caller Radio Play Playlist Songname Search List Repeats Tutorial<\/a>.<\/p-->\n<hr>\n<p id='ytapicrppsslrt'>Previous relevant <a target=\"_blank\" title='YouTube API Caller Radio Play Playlist Songname Search List Repeats Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/youtube-api-caller-radio-play-playlist-songname-search-list-repeats-tutorial\/' rel=\"noopener\">YouTube API Caller Radio Play Playlist Songname Search List Repeats Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"YouTube API Caller Radio Play Playlist Songname Search List Repeats Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media_repeats.gif\" title=\"YouTube API Caller Radio Play Playlist Songname Search List Repeats Tutorial\"  style=\"float:left;\"  \/><\/a><p class=\"wp-caption-text\">YouTube API Caller Radio Play Playlist Songname Search List Repeats Tutorial<\/p><\/div>\n<blockquote><p>\nBurp &#8230;\n<\/p><\/blockquote>\n<p>Sorry to open with a quote, and sorry to repeat myself, like.<\/p>\n<p>And sorry to repeat myself, like, <span><a target=\"_blank\" class=\"audioytplay\" title=\"https:\/\/www.youtube.com\/watch?v=e9_7GcQeiqw\" href=\"https:\/\/www.youtube.com\/watch?v=e9_7GcQeiqw&#038;t=2m37s#d=9\" rel=\"noopener\">again<\/a><\/span>.<\/p>\n<p>But there is a point.  Today represents an improvement on yesterday&#8217;s arrangements for dynamic playlist creation regarding our <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html\" rel=\"noopener\">Tabular Single Row Media Gallery<\/a> web application via the playlist emoji button &#x1F500; click\/tap or on the web browser command line.  With yesterday&#8217;s scenario, had you entered as your internal playlist comma separated string &#8230; <\/p>\n<blockquote><p>\nBorn to Run,Born to Run,Born to Run,Born to Run\n<\/p><\/blockquote>\n<p> &#8230; without the &#8230;<\/p>\n<blockquote><p>\nBurp &#8230;\n<\/p><\/blockquote>\n<p> &#8230; <span><a target=\"_blank\" title='?' class=\"audioytplay\" href='https:\/\/www.youtube.com\/watch?v=PtR4cWb4HNg' rel=\"noopener\">that is<\/a><\/span> you&#8217;d have ended up with the top find off a <a target=\"_blank\" title=\"YouTube\" href='https:\/\/youtube.com' rel=\"noopener\">YouTube<\/a> search repeated 4 times.  Is this ideal?  We asked <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/Mac\/rolling.mov\" rel=\"noopener\">Nala and Luna<\/a> but, unfortunately they were busy, so they left me with the decision, and we came up with &#8230;<\/p>\n<blockquote><p>\nThat&#8217;s kind of silly.\n<\/p><\/blockquote>\n<p>For these few reasons &#8230;<\/p>\n<ul>\n<li>variety<\/li>\n<li>album style Radio Play listening possibilities<\/li>\n<li>perhaps getting around that &#8230;<br \/>\n<blockquote><p>\nThis video requires payment to watch YouTube\n<\/p><\/blockquote>\n<p> &#8230; issue we talked about before &#8230; because you could uncheck it&#8217;s checkbox if the error appears<\/li>\n<li>giving non-top search items a go<\/li>\n<\/ul>\n<p> &#8230; we decided to &#8220;mix it up&#8221; regarding entries like &#8230;<\/p>\n<blockquote><p>\nBorn to Run,Born to Run,Born to Run,Born to Run\n<\/p><\/blockquote>\n<p> &#8230; as well as the simpler &#8230;<\/p>\n<blockquote><p>\nBorn to Run*4\n<\/p><\/blockquote>\n<p> &#8230; so that repeats don&#8217;t cause users indigestion <font size=1>&#8230; chortle, chortle<\/font>.<\/p>\n<p>Here&#8217;s the Javascript turning <i>Born to Run*4<\/i> into <i>Born to Run,Born to Run,Born to Run,Born to Run<\/i> &#8230;<\/p>\n<p><code><br \/>\n  function expandrepeats(ocsl) {<br \/>\n    var numnum=0, minone=-1, interesting='', ninteresting='', pinteresting='', superinteresting='', imn=1;<br \/>\n    var retocsl=ocsl;<br \/>\n    var acarr=ocsl.split(',');<br \/>\n    for (var iac=0; iac&lt;acarr.length; iac++) {<br \/>\n      numnum=0;<br \/>\n      minone=-1;<br \/>\n      if (acarr[iac].trim() != '') {<br \/>\n        if (acarr[iac].trim().slice(-1) &gt;= '0' && acarr[iac].trim().slice(-1) &lt;= '9') {<br \/>\n          while (('S' + acarr[iac].trim()).slice(minone).substring(0,1) &gt;= '0' && ('S' + acarr[iac].trim()).slice(minone).substring(0,1) &lt;= '9') {<br \/>\n            numnum++;<br \/>\n            minone--;<br \/>\n          }<br \/>\n        }<br \/>\n        if (numnum &gt; 0 && numnum &lt; eval('' + acarr[iac].trim().length)) {<br \/>\n          ninteresting=acarr[iac].trim().slice(-numnum);<br \/>\n          interesting=acarr[iac].trim().substring(0, eval(-numnum + eval('' + acarr[iac].trim().length)));<br \/>\n          superinteresting='';<br \/>\n          pinteresting='';<br \/>\n          if (interesting.toLowerCase() != interesting.toLowerCase().replace(\/\\ x\\ $\/g,'')) {<br \/>\n          pinteresting=interesting.slice(-3) + ninteresting;<br \/>\n          superinteresting=interesting.replace(\/\\ x\\ $\/g,'').replace(\/\\ X\\ $\/g,'');<br \/>\n          } else if (interesting.toLowerCase() != interesting.toLowerCase().replace(\/x\\ $\/g,'')) {<br \/>\n          pinteresting=interesting.slice(-2) + ninteresting;<br \/>\n          superinteresting=interesting.replace(\/x\\ $\/g,'').replace(\/X\\ $\/g,'');<br \/>\n          } else if (interesting.toLowerCase() != interesting.toLowerCase().replace(\/\\ x$\/g,'')) {<br \/>\n          pinteresting=interesting.slice(-2) + ninteresting;<br \/>\n          superinteresting=interesting.replace(\/\\ x$\/g,'').replace(\/\\ X$\/g,'');<br \/>\n          } else if (interesting.toLowerCase() != interesting.toLowerCase().replace(\/x$\/g,'')) {<br \/>\n          pinteresting=interesting.slice(-1) + ninteresting;<br \/>\n          superinteresting=interesting.replace(\/x$\/g,'').replace(\/X$\/g,'');<br \/>\n          } else if (interesting.toLowerCase() != interesting.toLowerCase().replace(\/\\ \\*\\ $\/g,'')) {<br \/>\n          pinteresting=interesting.slice(-3) + ninteresting;<br \/>\n          superinteresting=interesting.replace(\/\\ \\*\\ $\/g,'');<br \/>\n          } else if (interesting.toLowerCase() != interesting.toLowerCase().replace(\/\\*\\ $\/g,'')) {<br \/>\n          pinteresting=interesting.slice(-2) + ninteresting;<br \/>\n          superinteresting=interesting.replace(\/\\*\\ $\/g,'');<br \/>\n          } else if (interesting.toLowerCase() != interesting.toLowerCase().replace(\/\\ \\*$\/g,'')) {<br \/>\n          pinteresting=interesting.slice(-2) + ninteresting;<br \/>\n          superinteresting=interesting.replace(\/\\ \\*$\/g,'');<br \/>\n          } else if (interesting.toLowerCase() != interesting.toLowerCase().replace(\/\\*$\/g,'')) {<br \/>\n          pinteresting=interesting.slice(-1) + ninteresting;<br \/>\n          superinteresting=interesting.replace(\/\\*$\/g,'');<br \/>\n          }<br \/>\n          if (superinteresting != '' && eval('' + ninteresting) &gt;= 1) {<br \/>\n            for (imn=1; imn&lt;=eval('' + ninteresting); imn++) {<br \/>\n              if (imn == 1) {<br \/>\n                retocsl=retocsl.replace(pinteresting, '');<br \/>\n                acarr[iac]=acarr[iac].replace(pinteresting, '');<br \/>\n              } else {<br \/>\n                retocsl=retocsl.replace(acarr[iac], acarr[iac] + ',' + superinteresting.trim());<br \/>\n              }<br \/>\n            }<br \/>\n          }<br \/>\n        }<br \/>\n      }<br \/>\n    }<br \/>\n    if (retocsl != ocsl) { outplist=retocsl; }<br \/>\n    return retocsl;<br \/>\n  }<br \/>\n<\/code><\/p>\n<p> &#8230; in <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html----------------------------------------GETME\" rel=\"noopener\">the changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html----------------------------------------GETME\" rel=\"noopener\">swipe_media.html<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html\" rel=\"noopener\">Tabular Single Row Media Gallery<\/a> web application you can try for yourself <font size=1>(or try some more of <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.htmlBorn to Run*4 ,Jungleland*3\" rel=\"noopener\">The Boss<\/a>)<\/font>, further to yesterday&#8217;s <a title='YouTube API Caller Radio Play Playlist Songname Search List Address Bar Tutorial' href='#ytapicrppsslabt'>YouTube API Caller Radio Play Playlist Songname Search List Address Bar Tutorial<\/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\/youtube-api-caller-radio-play-playlist-songname-search-list-repeats-tutorial\/' rel=\"noopener\">YouTube API Caller Radio Play Playlist Songname Search List Repeats Tutorial<\/a>.<\/p-->\n<hr>\n<p id='ytapicrppsslabt'>Previous relevant <a target=\"_blank\" title='YouTube API Caller Radio Play Playlist Songname Search List Address Bar Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/youtube-api-caller-radio-play-playlist-songname-search-list-address-bar-tutorial\/' rel=\"noopener\">YouTube API Caller Radio Play Playlist Songname Search List Address Bar Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"YouTube API Caller Radio Play Playlist Songname Search List Address Bar Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media_address_bar.jpg\" title=\"YouTube API Caller Radio Play Playlist Songname Search List Address Bar Tutorial\"  style=\"float:left;\"  \/><\/a><p class=\"wp-caption-text\">YouTube API Caller Radio Play Playlist Songname Search List Address Bar Tutorial<\/p><\/div>\n<p>Don&#8217;t know if you are like me, but especially when on this MacBook Air we&#8217;re, forever, using a web browser address bar to type in, what we&#8217;ve set up as, a Google search engine webpage query.  Rather than even going to <a target=\"_blank\" href='https:\/\/google.com' rel=\"noopener\">Google<\/a> webpage first, <span><a target=\"_blank\" title='?' class=\"audioytplay\" href='https:\/\/www.youtube.com\/watch?v=PtR4cWb4HNg' rel=\"noopener\">that is<\/a><\/span>!<\/p>\n<p>Most people don&#8217;t want to know about arcane web application argument arrangements <font size=1>&#8230; though we&#8217;re very fond of the 5 minute ones?!<\/font><\/p>\n<p>What&#8217;s wrong with some of you?  Who would not <i><strong>relish<\/strong><\/i> the thought of &#8230;<\/p>\n<ul>\n<li>adding onto the address bar &#8230;<br \/>\n<code><br \/>\n<a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html\" rel=\"noopener\">https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html<\/a><br \/>\n<\/code><br \/>\n&#8230; with new arguments( eg. <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.htmlBorn to Run,Jungleland\" rel=\"noopener\">https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html Born to Run,Jungleland<\/a> ) &#8230;<br \/>\n<iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/CvrEBkc4OK4?si=OxUMNdW_jeZ7eDiF\" 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>\n<\/li>\n<li><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html?ask=y\" rel=\"noopener\">?ask=y<\/a>    # will get you straight to the Javascript playlist prompt window<\/li>\n<li><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html?thelist=Jungleland%2CBorn%2520to%2520Run\" rel=\"noopener\"><sub>&#038;<\/sub><sup>or<\/sup>?thelist=[commaSeparatedList_encodeURIComponent_ized]<\/a>    # will supply that prompt window with the answer [commaSeparatedList_decodeURIComponent_ized]<\/li>\n<li><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html?thelist=Jungleland%2CBorn%2520to%2520Run&#038;andgo=y\" rel=\"noopener\"><sub>&#038;<\/sub><sup>or<\/sup>?andgo=y<\/a>    # will click the Radio button after all above <font size=1>(unless <i>notgo<\/i> is mentioned in the list somewhere)<\/font>, as relevant, with the programmatically determined derived YouTube ID list via YouTube search(es)<\/li>\n<li> <sup><font size=1>&#x1F4AC;<\/font><\/sup>&#x1F986; <font title=\"Lleyton's call\" size=6>Come On!<\/font><\/li>\n<li> &#8230; when, after a bit of thought and tweaks to our RJM Programming domain&#8217;s Apache Document Root residing 404.shtml webpage Javascript &#8230;<br \/>\n<code><br \/>\n  if (document.URL.indexOf('rjmprogramming.com.au\/HTMLCSS\/swipe_media.htm') != -1) {<br \/>\n    if (decodeURIComponent(document.URL).indexOf(',') != -1) {<br \/>\n      if (decodeURIComponent(document.URL.split('rjmprogramming.com.au\/HTMLCSS\/swipe_media.htm')[1].replace(\/^l\/g,'')).toLowerCase().indexOf('notgo') != -1) {<br \/>\n      location.href='\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html?thelist=' + encodeURIComponent(decodeURIComponent(document.URL.split('rjmprogramming.com.au\/HTMLCSS\/swipe_media.htm')[1].replace(\/^l\/g,'').replace(\/^\\%20\/g,'').replace(\/^\\%20\/g,'').replace(\/^\\%20\/g,'').replace(\/^\\%20\/g,'').replace(\/^\\%20\/g,'').replace('notgo','').replace('NOTGO','').replace('Notgo','')));<br \/>\n      } else {<br \/>\n      location.href='\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html?andgo=y&thelist=' + encodeURIComponent(decodeURIComponent(document.URL.split('rjmprogramming.com.au\/HTMLCSS\/swipe_media.htm')[1].replace(\/^l\/g,'').replace(\/^\\%20\/g,'').replace(\/^\\%20\/g,'').replace(\/^\\%20\/g,'').replace(\/^\\%20\/g,'').replace(\/^\\%20\/g,'')));<br \/>\n      exit;<br \/>\n      }<br \/>\n    } else if (decodeURIComponent(document.URL.split('rjmprogramming.com.au\/HTMLCSS\/swipe_media.htm')[1].replace(\/^l\/g,'')).toLowerCase().indexOf('ask') != -1) {<br \/>\n      location.href='\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html?ask=y';<br \/>\n      exit;<br \/>\n    }<br \/>\n  }<br \/>\n<\/code><br \/>\n &#8230; now all you need to add after that link above, on the web browser address bar is &#8230;<br \/>\n<code><br \/>\n[commaSeparatedList_decodeURIComponent_ized]<br \/>\n<\/code><br \/>\n &#8230; ie. just type a comma separated YouTube song search basis link after the link wording above<\/li>\n<li><font size=1>so<\/font> <sup><font size=1>&#x1F4AC;<\/font><\/sup>&#x1F986; <font title=\"Lleyton's call\" size=6>Come On<\/font><font size=1><sup> down ye doubting Thomases<\/sup><\/font><font size=6>!<\/font><\/li>\n<\/ul>\n<p>And so, further to yesterday&#8217;s <a title='YouTube API Caller Radio Play Playlist Songname Search List Dropdown Tutorial' href='#ytapicrppssldt'>YouTube API Caller Radio Play Playlist Songname Search List Dropdown Tutorial<\/a> we have <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html---------------------------------------GETME\" rel=\"noopener\">a changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html---------------------------------------GETME\" rel=\"noopener\">swipe_media.html<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html\" rel=\"noopener\">Tabular Single Row Media Gallery<\/a> web application you can try for yourself.<\/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-api-caller-radio-play-playlist-songname-search-list-address-bar-tutorial\/' rel=\"noopener\">YouTube API Caller Radio Play Playlist Songname Search List Address Bar Tutorial<\/a>.<\/p-->\n<p><b><i>Stop Press<\/i><\/b><\/p>\n<p>On reflection, as well as &#8230;<\/p>\n<p><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.htmlBorn to Run,Jungleland\" rel=\"noopener\">https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html Born to Run,Jungleland<\/a> working up at the address bar, so, too, will <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.htmlBorn to Run,Jungleland\" rel=\"noopener\">https:\/\/www.rjmprogramming.com.au\/ Born to Run,Jungleland<\/a><\/p>\n<hr>\n<p id='ytapicrppssldt'>Previous relevant <a target=\"_blank\" title='YouTube API Caller Radio Play Playlist Songname Search List Dropdown Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/youtube-api-caller-radio-play-playlist-songname-search-list-dropdown-tutorial\/' rel=\"noopener\">YouTube API Caller Radio Play Playlist Songname Search List Dropdown Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html\" rel=\"noopener\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"YouTube API Caller Radio Play Playlist Songname Search List Dropdown Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media_songname_list_dropdown.gif\" title=\"YouTube API Caller Radio Play Playlist Songname Search List Dropdown Tutorial\"  style=\"float:left;\"  \/><\/a><p class=\"wp-caption-text\">YouTube API Caller Radio Play Playlist Songname Search List Dropdown Tutorial<\/p><\/div>\n<p>Around here, regarding web application work, we really like dropdown (ie. HTML <a target=\"_blank\" href='http:\/\/www.w3schools.com\/tags\/tag_select.asp' title='HTML select tag information from w3schools' rel=\"noopener\"><i>select<\/i><\/a> element) work because a lot of information can be &#8230;<\/p>\n<ul>\n<li>stored<\/li>\n<li>displayed (often taking up minimal webpage space)<\/li>\n<li>it&#8217;s <i>option<\/i> subelements can have an <i>event<\/i> life of their own, or be part of the <i>select<\/i> element <i>event<\/i> whole picture<\/li>\n<li>dropdown multiple selection mode (as with today&#8217;s work) can &#8230;\n<ol>\n<li>still support your single choice scenario<\/li>\n<li>we&#8217;ve coded today&#8217;s dropdown to support, as applicable, ordered single click choices &#8230; versus &#8230;<\/li>\n<li>can allow for control key (sets of choices not necessarily adjacent) and shift key (blocks of choices)<\/li>\n<li>can respond (as with today&#8217;s dropdown) to preset selections established at creation via dropdown (ie. select) innerHTML option subelement <i>selected<\/i> attribute setting<\/li>\n<\/ol>\n<\/li>\n<li>dropdown events <i>onmousedown<\/i> and <i>ontouchdown<\/i> (as for  today&#8217;s dropdown) and <i>onclick<\/i> can be harnessed ahead of an <i>onchange<\/i> event <font size=1>&#8230; and in today&#8217;s case can help unset any preset option subelement <i>selected<\/i> attribute setting(s)<\/font><\/li>\n<\/ul>\n<p>Just so flexible!  Subelement option CSS styling can be less friendly, but even so, often background colouring is possible, and we do a bit of that with the work from yesterday&#8217;s <a target=\"_blank\" title='YouTube API Caller Radio Play Playlist Songname Search List Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/youtube-api-caller-radio-play-playlist-songname-search-list-tutorial\/' rel=\"noopener\">YouTube API Caller Radio Play Playlist Songname Search List Tutorial<\/a> and today&#8217;s better &#8220;shored up&#8221; work you can see a bit of below (where your starting point might be that we &#8220;wrap&#8221; this particular Javascript prompt window through the Javascript <i>overprompt<\/i> function below) &#8230;<\/p>\n<p><code><br \/>\n  var outplist='', kaconto=null, kacontoarr=[], rconeis=155, gconeis=255, bconeis=255;<br \/>\n  <br \/>\n  function overprompt(blb, defvl) {<br \/>\n   var tdsare=[], itdone=false, itds=0, baeis='', ivb=0, lastpassesmustard=true;<br \/>\n   var oklast=['A','E','I','M','Q','U','Y','c','g','k','o','s','w','0','4','8'];<br \/>\n   outplist=prompt(blb, defvl);<br \/>\n   if (outplist) {<br \/>\n   \/\/alert(1);<br \/>\n     var outparrs=outplist.trim().split(',');<br \/>\n   \/\/alert(11);<br \/>\n     if (eval('' + outparrs.length) &gt; 1) {<br \/>\n     if (eval('' + outparrs[0].length) &gt; 0) {<br \/>\n       if (oklast.indexOf(outparrs[0].slice(-1)) == -1) { lastpassesmustard=false; }<br \/>\n     }<br \/>\n    if ((outparrs[0] + baeis).replace(\/\\ \\ \\ $\/g,'') != (outparrs[0] + baeis)) {<br \/>\n    baeis='&domatters=&20%20%20';<br \/>\n    outparrs[0]=outparrs[0].replace(\/\\ \\ \\ $\/g,'');<br \/>\n    } else if ((outparrs[0] + baeis).replace(\/\\ \\ $\/g,'') != (outparrs[0] + baeis)) {<br \/>\n    baeis='&domatters=&20%20';<br \/>\n    outparrs[0]=outparrs[0].replace(\/\\ \\ $\/g,'');<br \/>\n    } else if ((outparrs[0] + baeis).replace(\/\\ $\/g,'') != (outparrs[0] + baeis)) {<br \/>\n    baeis='&domatters=&20';<br \/>\n    outparrs[0]=outparrs[0].replace(\/\\ $\/g,'');<br \/>\n    } else {<br \/>\n    baeis='';<br \/>\n    }<br \/>\n   \/\/alert(111);<br \/>\n       if (eval('' + outparrs[0].length) != 11 || !lastpassesmustard || encodeURIComponent(outparrs[0]) != outparrs[0]) {<br \/>\n   \/\/alert(1111);<br \/>\n   tdsare=document.getElementsByTagName('td');<br \/>\n   for (itds=0; itds&lt;tdsare.length; itds++) {<br \/>\n   \/\/alert(tdsare[itds].innerHTML);<br \/>\n   if (!itdone && tdsare[itds].innerHTML == '' && ('' + tdsare[itds].id) != 'td0001') {<br \/>\n     itdone=true;<br \/>\n     \/\/alert('here ' + outplist.trim().replace(\/\\,\/g,'|!!|'));<br \/>\n     \/\/tdsare[itds].innerHTML='&lt;iframe onload=karlook(this); style=\"width:100%;height:100%;\" id=karsearch name=karsearch src=\"\/HTMLCSS\/karaoke_youtube_api.htm?youtubeid=++++++++++++' + encodeURIComponent(outplist.trim().replace(\/\\,\/g,'|!!|')) + '&minimize=y&youtube_duration=&email=&emoji=on&clickcheck=y\"&gt;&lt;\/iframe&gt;';<br \/>\n     tdsare[itds].innerHTML='&lt;iframe onload=karlook(this); style=\"width:100%;height:80%;\" id=karsearch name=karsearch src=\"\/HTMLCSS\/karaoke_youtube_api.htm?youtubeid=++++++++++++' + encodeURIComponent(outparrs[0]) + baeis + '&minimize=y&youtube_duration=&email=&emoji=on&clickcheck=y\"&gt;&lt;\/iframe&gt;';<br \/>\n     tdsare[itds].scrollIntoView();<br \/>\n     \/\/alert('there ' + outplist.trim().replace(\/\\,\/g,'|!!|'));<br \/>\n     baeis='';<br \/>\n     kacontoarr=[];<br \/>\n     for (ivb=1; ivb&lt;outparrs.length; ivb++) {<br \/>\n     kacontoarr.push(null);<br \/>\n     }<br \/>\n     for (ivb=1; ivb&lt;outparrs.length; ivb++) {<br \/>\n     tdsare[eval(itds + ivb)].innerHTML='&lt;iframe onload=karlookagain(this,' + eval(-1 + ivb) + '); style=\"width:100%;height:80%;visibility:hidden;\" id=karsearch' + ivb + ' src=\"\/HTMLCSS\/karaoke_youtube_api.htm?youtubeid=++++++++++++' + encodeURIComponent(outparrs[ivb]) + '&minimize=y&youtube_duration=&email=&emoji=on&clickcheck=y\"&gt;&lt;\/iframe&gt;';<br \/>\n     }<br \/>\n     return '';<br \/>\n   }<br \/>\n   }<br \/>\n       }<br \/>\n     }<br \/>\n   }<br \/>\n   return outplist;<br \/>\n  }<br \/>\n<br \/>\n  function karlook(iois) {<br \/>\n    var aconto=null;<br \/>\n    aconto = (iois.contentWindow || iois.contentDocument);<br \/>\n    if (aconto != null) {<br \/>\n       if (aconto.document) { aconto = aconto.document; }<br \/>\n       if (aconto.body != null) {<br \/>\n          if (outplist.indexOf(',') != -1) {<br \/>\n          kaconto=aconto;<br \/>\n          setTimeout(function(){ kaconto.getElementById('ajaxs').style.cursor='progress'; }, 3000);<br \/>\n          setTimeout(postkarlook, 7000);<br \/>\n          } else if (navigator.userAgent.match(\/Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile\/i)) {<br \/>\n          kaconto=aconto;<br \/>\n          setTimeout(mpostkarlook, 7000);<br \/>\n          }<br \/>\n       }<br \/>\n    }<br \/>\n  }<br \/>\n   <br \/>\n  function karlookagain(iois,idxn) {<br \/>\n    var aconto=null;<br \/>\n    aconto = (iois.contentWindow || iois.contentDocument);<br \/>\n    if (aconto != null) {<br \/>\n       if (aconto.document) { aconto = aconto.document; }<br \/>\n       if (aconto.body != null) {<br \/>\n          if (eval('' + kacontoarr.length) &gt; eval('' + idxn)) {<br \/>\n          kacontoarr[eval('' + idxn)]=aconto;<br \/>\n          } else {<br \/>\n          kacontoarr.push(aconto);<br \/>\n          }<br \/>\n       }<br \/>\n    }<br \/>\n  }<br \/>\n  <br \/>\n  function mpostkarlook() {<br \/>\n    if (kaconto.getElementById('ajaxs')) {<br \/>\n        var kbuts=kaconto.getElementsByTagName('input');<br \/>\n        for (var lbuts=0; lbuts&lt;kbuts.length; lbuts++) {<br \/>\n          if (('' + kbuts[lbuts].type) == 'button') {<br \/>\n            if (('' + kbuts[lbuts].value).indexOf('Radio') == 0) {<br \/>\n                kbuts[lbuts].value=kbuts[lbuts].value.replace('Radio', String.fromCharCode(10) + 'Radio');<br \/>\n            }<br \/>\n          }<br \/>\n        }<br \/>\n    } else {<br \/>\n      setTimeout(mpostkarlook, 5000);<br \/>\n    }<br \/>\n  }<br \/>\n  <br \/>\n  function postkarlook() {<br \/>\n    var selectedones='', oktogo=true, hihi=0;<br \/>\n    if (kaconto.getElementById('ajaxs')) {<br \/>\n      \/\/alert(kaconto.getElementById('ajaxs').innerHTML);<br \/>\n      for (hihi=0; hihi&lt;kacontoarr.length; hihi++) {<br \/>\n      if (!kacontoarr[hihi]) {<br \/>\n      oktogo=false;<br \/>\n      \/\/alert('hihi=' + hihi + ' NOT okay');<br \/>\n      } else if (!kacontoarr[hihi].getElementById('ajaxs')) {<br \/>\n      oktogo=false;<br \/>\n      \/\/alert('hihi=' + hihi + ' not okay');<br \/>\n      }<br \/>\n      }<br \/>\n      if (!oktogo) {<br \/>\n      setTimeout(postkarlook, 5000);<br \/>\n      } else if (kaconto.getElementById('ajaxs').innerHTML.indexOf('... and then ...') == -1) {<br \/>\n      kaconto.getElementById('ajaxs').style.cursor='pointer';<br \/>\n      var otherps=baeisf();<br \/>\n      if (otherps != '' || navigator.userAgent.match(\/Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile\/i)) {<br \/>\n        var kbuts=kaconto.getElementsByTagName('input');<br \/>\n        for (var lbuts=0; lbuts&lt;kbuts.length; lbuts++) {<br \/>\n          if (('' + kbuts[lbuts].type) == 'button') {<br \/>\n            if (('' + kbuts[lbuts].value).indexOf('Radio') == 0) {<br \/>\n              var wasvl=kbuts[lbuts].value;<br \/>\n              if (otherps == '   ') {<br \/>\n                kbuts[lbuts].value=kbuts[lbuts].value.replace('Radio', 'Ordered ' + String.fromCharCode(10) + 'Audio ' + String.fromCharCode(10) + 'Radio');<br \/>\n              } else if (otherps == '  ') {<br \/>\n                kbuts[lbuts].value=kbuts[lbuts].value.replace('Radio', 'Audio ' + String.fromCharCode(10) + 'Radio');<br \/>\n              } else if (otherps == ' ') {<br \/>\n                kbuts[lbuts].value=kbuts[lbuts].value.replace('Radio', 'Ordered ' + String.fromCharCode(10) + 'Radio');<br \/>\n              } else {<br \/>\n                kbuts[lbuts].value=kbuts[lbuts].value.replace('Radio', String.fromCharCode(10) + 'Radio');<br \/>\n              }<br \/>\n            }<br \/>\n          }<br \/>\n        }<br \/>\n      }<br \/>\n      selectedones=(kaconto.getElementById('ajaxs').innerHTML.split(kaconto.getElementById('ajaxs').innerHTML.split('&lt;\/option&gt;')[0] + '&lt;\/option&gt;')[1].split('&lt;\/option&gt;')[0] + '&lt;\/option&gt;').replace('&gt;', ' class=uptop selected&gt;');<br \/>\n      for (hihi=0; hihi&lt;kacontoarr.length; hihi++) {<br \/>\n      if (rconeis == gconeis && rconeis == bconeis) {<br \/>\n        bconeis-=7;<br \/>\n        if (bconeis &lt; 0) { bconeis+=255;  }<br \/>\n      } else if (rconeis == gconeis) {<br \/>\n        gconeis-=7;<br \/>\n        if (gconeis &lt; 0) { gconeis+=255;  }<br \/>\n      } else {<br \/>\n        rconeis-=7;<br \/>\n        if (rconeis &lt; 0) { rconeis+=255;  }<br \/>\n      }<br \/>\n      selectedones+=((kacontoarr[hihi].getElementById('ajaxs').innerHTML.split(kacontoarr[hihi].getElementById('ajaxs').innerHTML.split('&lt;\/option&gt;')[0] + '&lt;\/option&gt;')[1].split('&lt;\/option&gt;')[0] + '&lt;\/option&gt;').replace('&gt;', ' class=uptop selected&gt;')).replace(\/option\\ onclick\\=\/g, 'option style=background-color:rgb(' + rconeis + ',' + gconeis + ',' + bconeis + '); onclick=');<br \/>\n      kaconto.getElementById('ajaxs').innerHTML+='&lt;option value=\"\"&gt;... and then ...&lt;\/option&gt;';<br \/>\n      kaconto.getElementById('ajaxs').innerHTML+=kacontoarr[hihi].getElementById('ajaxs').innerHTML.split(kacontoarr[hihi].getElementById('ajaxs').innerHTML.split('&lt;\/option&gt;')[0] + '&lt;\/option&gt;')[1].replace(\/option\\ onclick\\=\/g, 'option style=background-color:rgb(' + rconeis + ',' + gconeis + ',' + bconeis + '); onclick=');<br \/>\n      \/\/alert(kacontoarr[hihi].getElementById('ajaxs').innerHTML);<br \/>\n      }<br \/>\n      \/\/alert(selectedones);<br \/>\n      kaconto.getElementById('ajaxs').innerHTML=kaconto.getElementById('ajaxs').innerHTML.replace(kaconto.getElementById('ajaxs').innerHTML.split('&lt;\/option&gt;')[0] + '&lt;\/option&gt;', kaconto.getElementById('ajaxs').innerHTML.split('&lt;\/option&gt;')[0] + '&lt;\/option&gt;' + selectedones + (selectedones != '' ? '&lt;option id=optclk value=\"\"&gt;____ Selection above available (resettable via click here) as you click\/tap button at right ____&lt;\/option&gt;' : ''));<br \/>\n      if (selectedones != '') {<br \/>\n      kaconto.getElementById('ajaxs').onmousedown=function(event){ if (event.target.parentNode.outerHTML.split('&gt;')[0].indexOf(' data-flagged=') == -1) { event.target.parentNode.setAttribute('data-flagged','y'); event.target.parentNode.innerHTML=event.target.parentNode.innerHTML.replace(\/\\ selected\/g, ' ').replace('____ Selection above available (resettable via click here) as you click\/tap button at right ____','____ Please select choices in usual multiple choice dropdown ways ____');   }  };<br \/>\n      kaconto.getElementById('ajaxs').ontouchdown=function(event){ if (event.target.parentNode.outerHTML.split('&gt;')[0].indexOf(' data-flagged=') == -1) { event.target.parentNode.setAttribute('data-flagged','y'); event.target.parentNode.innerHTML=event.target.parentNode.innerHTML.replace(\/\\ selected\/g, ' ').replace('____ Selection above available (resettable via click here) as you click\/tap button at right ____','____ Please select choices in usual multiple choice dropdown ways ____');   }  };<br \/>\n      }<br \/>\n      }<br \/>\n    }<br \/>\n  }<br \/>\n  <br \/>\n  function baeisf() {<br \/>\n    var outarrp=outplist.split(',');<br \/>\n    if (eval('' + outarrp.length) &gt; 1) {<br \/>\n      return outarrp[0].replace(outarrp[0].trim(), '');<br \/>\n    }<br \/>\n    return '';<br \/>\n  }<br \/>\n<\/code> <\/p>\n<p>And so, today &#8230;<\/p>\n<ul>\n<li>we add onto the default <i>random<\/i> ordering mode of Radio Play via YouTube search comma separated list, <font color=blue>the further choices<\/font> <i>ordered<\/i> or <i>audio<\/i> or <i>audio ordered<\/i>, as per the relevant Javascript prompt blurb that is now going &#8230;<br \/>\n<blockquote><p>\nEnter YouTube 11 character code video (comma separated) or audio stream only of video (semicolon) list to Radio Play (and add ! to start in shuffle mode and\/or # for the order you enter and\/or &#038; for whole list) &#8230; or a YouTube Search String basis for playlist via a Radio&#x1F4FB;? button to activate, later. <font color=blue>Comma separateds can be search ideas &#8230; egs. Tragedy,Boogie Wonderland,Down Among the Dead Men &#8230; random &#8230; Tragedy&nbsp;,Imagine,Breezin &#8230; ordered &#8230; Tragedy&nbsp;&nbsp;,Pina Colada Song,Fast Car &#8230; audio &#8230; Tragedy&nbsp;&nbsp;&nbsp;,Galveston,Angel of the Morning &#8230; audio ordered.<\/font> Double click on this cell for playlist redefinitions.\n<\/p><\/blockquote>\n<\/li>\n<li>started allowing for dropdown events <i>onmousedown<\/i> and <i>ontouchdown<\/i> be able to reset the preset choices we programmatically select for the user should they be happy <font size=1>(but our motivation for this event work was the potential to run into a YouTube video that gives the error &#8230;<br \/>\n<blockquote><p>\nThis video requires payment to watch YouTube\n<\/p><\/blockquote>\n<p>)<\/font><\/li>\n<\/ul>\n<p>Codewise, this involved &#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\">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 video interfacer<\/a> &#8220;parent level&#8221; helper to &#8230;<\/li>\n<li><a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html--------------------------------------GETME\" rel=\"noopener\">a changed<\/a> <a target=\"_blank\" href=\"http:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html--------------------------------------GETME\" rel=\"noopener\">swipe_media.html<\/a> <a target=\"_blank\" href=\"https:\/\/www.rjmprogramming.com.au\/HTMLCSS\/swipe_media.html\" rel=\"noopener\">Tabular Single Row Media Gallery<\/a> web application &#8230; at that &#8220;grandparent level&#8221;<\/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\/youtube-api-caller-radio-play-playlist-songname-search-list-dropdown-tutorial\/' rel=\"noopener\">YouTube API Caller Radio Play Playlist Songname Search List Dropdown Tutorial<\/a>.<\/p-->\n<!--hr--><\/p>\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='#d70402' onclick='var dv=document.getElementById(\"d70402\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/dropdown\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d70402' 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='#d70413' onclick='var dv=document.getElementById(\"d70413\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/address-bar\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d70413' 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='#d70453' onclick='var dv=document.getElementById(\"d70453\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/repeat\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d70453' 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='#d70594' onclick='var dv=document.getElementById(\"d70594\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/command-line\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d70594' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n","protected":false},"excerpt":{"rendered":"<p>The .. command line &#8230; of a laptop or notebook or personal computer can be an environment to relax from the GUI aspects of your modern operating systems and think about &#8230; processes batch driven tasks task simplifications &#8230; and &hellip; <a href=\"https:\/\/www.rjmprogramming.com.au\/ITblog\/youtube-api-caller-radio-play-playlist-local-system-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":[2,12,14,29,37],"tags":[52,1669,5275,1767,71,2535,5306,83,84,88,1885,103,113,5307,132,5331,5332,1703,177,181,1580,210,2531,5330,234,4191,5281,5279,2335,252,253,5278,257,2442,281,283,2127,1654,305,307,1606,2380,2310,327,341,1816,354,359,367,2091,1549,380,385,1605,5301,386,1756,5287,400,2678,1664,3081,513,520,3406,557,3961,564,576,587,590,599,4063,614,617,3695,620,2072,652,5280,673,1560,1807,705,710,5315,5334,2415,2205,3870,2178,760,2732,2122,1616,802,830,2010,3987,2337,1919,3267,2723,875,3049,884,2273,2076,894,5304,932,2858,950,2362,4321,1898,967,5333,1981,997,1915,3274,5305,5298,5299,2955,1063,1069,1893,3310,5303,1105,1866,3169,1125,1126,1133,1138,1139,1168,1173,5302,2228,1200,2311,2001,1238,1581,1252,1254,5276,1675,5277,1282,2167,3325,1292,1319,1345,1891,3575,1721,1369,2485,1404,2099,1418,1425,1583,1452,1622,2455,3098,4799,1493,2017],"class_list":["post-70594","post","type-post","status-publish","format-standard","hentry","category-ajax","category-elearning","category-event-driven-programming","category-operating-system","category-tutorials","tag-absolute-url","tag-address-bar","tag-after","tag-album","tag-alias","tag-alphabetic","tag-alphabetical","tag-animated-gif","tag-animation-2","tag-api","tag-argument","tag-array","tag-audio","tag-authority","tag-bash","tag-bash-shell","tag-blocker","tag-breadcrumbs","tag-cache","tag-call","tag-cell","tag-class","tag-comma-separated-values","tag-commad","tag-command-line","tag-compilation","tag-completion","tag-condition","tag-conditional","tag-connection","tag-console","tag-console-warn","tag-content","tag-contenteditable","tag-css","tag-csv","tag-cursor","tag-data-uri","tag-debug","tag-debugging","tag-decodeuricomponent","tag-delay","tag-details","tag-did-you-know","tag-display","tag-document-title","tag-dom","tag-double-click","tag-dropdown","tag-duration","tag-element","tag-email","tag-emoji","tag-encodeuricomponent","tag-encrypt","tag-encryption","tag-environment","tag-error-414","tag-event","tag-genre","tag-global","tag-global-variable","tag-google","tag-google-chrome","tag-hands-free","tag-hashtag","tag-hashtagging","tag-hierarchy","tag-html","tag-iframe","tag-image","tag-img","tag-instance","tag-integration","tag-interactive","tag-interfacing","tag-internationalization","tag-itinerary","tag-javascript","tag-jump","tag-keyboard","tag-language","tag-link","tag-links","tag-list","tag-lleyton","tag-local-system","tag-localstorage","tag-loop","tag-looping","tag-macos","tag-media","tag-mimetype","tag-moderation","tag-modularization","tag-module","tag-navigation","tag-object-oriented-programming","tag-oncontextmenu","tag-onkeypress","tag-onmousedown","tag-ontouchdown","tag-ontouchmove","tag-oop","tag-open","tag-opera","tag-option","tag-order","tag-overlay","tag-persistence","tag-php","tag-plan","tag-platform","tag-play","tag-play-button","tag-playlist","tag-popup","tag-popup-blocker","tag-profile","tag-programming","tag-progress","tag-recall","tag-recalling","tag-remember","tag-remembering","tag-repeat","tag-reveal","tag-right-click","tag-schedule","tag-scheduling","tag-scope","tag-script","tag-select","tag-sessionstorage","tag-setinterval","tag-settimeout","tag-share","tag-shell","tag-shell-script","tag-software-integration","tag-sort","tag-sppech-to-text","tag-standing-order","tag-stop-press","tag-summary","tag-tab","tag-table","tag-table-cell","tag-terminal","tag-text","tag-text-cursor","tag-textbox","tag-textual-cursor","tag-timer","tag-title","tag-toggle","tag-top","tag-tutorial","tag-url","tag-user","tag-user-input","tag-variable","tag-video","tag-visibility","tag-web-browser","tag-web-inspector","tag-webpage","tag-whitespace","tag-window","tag-word","tag-words","tag-wrap","tag-wrapper","tag-wrapping","tag-youtube","tag-youtube-api"],"_links":{"self":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/70594"}],"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=70594"}],"version-history":[{"count":29,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/70594\/revisions"}],"predecessor-version":[{"id":70631,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/70594\/revisions\/70631"}],"wp:attachment":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/media?parent=70594"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/categories?post=70594"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/tags?post=70594"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}