Skip to main content

shoelace repairman

richardshide.com

rickdog

Up09 - CLoud file storage http://file.up09.com/

rickdog

rickdog

48 min read


    <link rel="stylesheet" href="https://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
    <script src="https://code.jquery.com/jquery-2.1.3.js"></script>
    <script src="https://code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
    <script src="https://rawgit.com/abdmob/x2js/master/xml2json.js" type="text/javascript"></script>
    <script src="https://lovasoa.github.io/tidy-html5/tidy.js", type="text/javascript"></script>

    <script src="https://rawgit.com/gilbitron/Dropit/master/dropit.js"></script>
    <link rel="stylesheet" href="https://rawgit.com/gilbitron/Dropit/master/dropit.css" type="text/css" />

<style type="text/css">
    .feedEntryHeader:hover {
        background-color: salmon;
    }
     > a:hover {
        background-color: salmon;
    }
     {
        width: 200px;
    }
    .entryDate {
      color: green;
      font-style: italic;
      font-size: 14px;
      font-weight: 900;
      margin-left: 5px;
    }
    .feedHeader {
        -webkit-margin-before: 0.0em;
        -webkit-margin-after: 0.0em;
        margin: auto auto .1em;
    }
    .feedLink {
        margin-left: 0.6em;
        float: right;
    }
    .feedDescription,
    .feedEtc {
        display: inline;
    }
    .feedEntryHeader
    {
        clear:both;
    }
    .audioPlayer {
        clear:both;
        margin-top: 10px;
    }
    .feedDescription {
        -webkit-margin-before: 0.0em;
        -webkit-margin-after: 0.0em;
        margin: auto auto .1em;
    }
    .feedCats {
        margin: auto auto 8px;
        font-size: 12px;
        color: blue;
    }
    .feedEtc {
        margin: auto auto 8px;
        font-size: 12px;
        display: inline;
    }
    .heartBullet:after {
        content: "\1D11E";// "\2767";
    }
    p.heartBullet {
        font-size: 40px;
        text-align: center;
        margin-top: 0px;
        margin-bottom: 0px;
    }
    img {
        max-width: 100%;
    }
    img.feedImg {
        max-width: 300px;
        max-height: 150px;
    }
     {
        border-bottom: 1px solid;
        max-width: 100%;
    }
     {
        background-color: cornsilk;
    }
    ,
     {
        overflow:auto;
        max-width: 100%;
    }
</style>

 
<script type="text/javascript">
    window.onresize = window.onload = function(e) {
        $('#opmlDivResizable').css('max-height', $(window).height()/2);
        $('#opmlDiv').css('max-height', $(window).height()/2);
        setTimeout(function(){$('#opmlDivResizable').css('height', $('#opmlDiv').height())}, 0);
        $('#feedDiv').css('max-height',$(window).height() - $('#notFeed').height() - 18);
    }
    $(function() {
        $("#opmlDivResizable").resizable({
            resize: function( event, ui ) {
                $('#opmlDiv').css('height',$('#opmlDivResizable').height());
                $('#opmlDivResizable').css('width', $(window).width());
            }
    }    );
    });
</script>
 


<div id="notFeed">
    <div id="header">
        <input type="text" id="feedURL" placeholder="Enter feed URL" size="60" tabindex="1">
        <button id="go" onclick="run()" tabindex="2">GO</button>
        <input type="text" id="num" placeholder="num" size="10" tabindex="3">
        <label>
            <input id="historical" type="checkbox" tabindex="4" value="h"></input>
            historical
        </label>
        <label>
            <input id="viewResponse" type="checkbox" tabindex="5"></input>
            view Response
        </label>
        <label>
            <input id="native" type="checkbox" tabindex="6"></input>
            native
        </label>
        <button id="collapse" onclick="toggleAll()" tabindex="7">Toggle</button>
        <button id="tryWhatever" onclick="whatever()" tabindex="9">Try whateverorigin.org</button>
        <span id="inoSub"></span>
        <ul id="opmlMenu">
            <li>
                <a href="#">OPML</a>
                <ul id="opmlDropit"></ul>
            </li>
        </ul>
    </div>
    <div id="opmlDivResizable">
        <div id="opmlDiv"></div>
    </div>
</div>
<div id="feedDiv"></div>

<script>

var gFeed = {
    feedDiv: document.querySelector('#feedDiv'),
    opmlDiv: document.querySelector('#opmlDiv'),
    lastUrl: undefined,    // kludge to fixup relative URLs in retrieved data
    homeUrl: undefined,
    response: undefined,
    bFromOpmlList: undefined
};

///////  https://www.inoreader.com/developers/stream-contents    
 
if (location.search)
{
    $("#native")[0].checked = true;
    $("#historical")[0].checked = true;
    $("#num")[0].value = 250;
    run($("#feedURL")[0].value = decodeURIComponent(location.search.substring(1)));
}
else
    run('https://rawgit.com/rickdog/chewbone/master/inoDirs.xml', true, true, true);    // load OPML directory


/* item content is cached in the itemContent array and is only displayed when the item header is clicked
 * this allows fast loading of large feeds with minimal memory requirements
 */
var itemContent = [];
var itemCnt = 0;

var toggleItem = function(el, n)
{
    if (el.nextSibling.innerHTML == "")
    {
        el.nextSibling.innerHTML = itemContent[n];
        //el.scrollIntoView();    // TODO only if item is very close to the bottom of the screen
    }
    else
        el.nextSibling.innerHTML = "";
}

var toggleAll = function()
{
    $("div.feedEntryHeader").each(function(i, el)
    {
        el.click();
    });
}


function htmlEncode(value)
{
  //create a in-memory div, set it's inner text(which jQuery automatically encodes)
  //then grab the encoded contents back out.  The div never exists on the page.
  return $('<div/>').text(value).html();
}

function htmlDecode(value)
{
  return $('<div/>').html(value).text();
}

function showJSON(data)
{
    var jStr = JSON.stringify(data);
    (W=window.open('','_blank')).focus();
    W.document.write(jStr.replace(/[ ]/g, '&nbsp;').replace(/[\t]/g, '&nbsp;&nbsp;&nbsp;&nbsp;').replace(/[\n\r]/g, '<br>'));
    W.document.close();
}

function showCode(html, bXML)
{
    //    www.htacg.org/tidy-html5/quickref.html
    var options = {
      "indent":"auto",
      "indent-spaces":4,
      "wrap":9999,
      "force-output" : true,
      "markup":true,
      "numeric-entities":true,
      "quote-marks":true,
      "quote-nbsp":false,
      "quote-ampersand":false,
      "break-before-br":false,
      "uppercase-tags":false,
      "uppercase-attributes":false,
      "drop-font-tags":false,
      "tidy-mark":false
    };
    if (bXML) {
      options["output-xml"] = true;
      options["output-html"] = false;
      options["input-xml"] = true;
      options["show-body-only"] = true;
    }
    else {
      options["output-html"] = false;
      options["output-xml"] = true;
      options["input-xml"] = false;
      options["show-body-only"] = false;
    }
    var htmlTidy = tidy_html5(html, options);
    var htmlEnc = htmlEncode(htmlTidy);
    //console.log(html);
    //console.log(htmlTidy);

    (W=window.open('','_blank')).focus();
    W.document.write(htmlEnc.replace(/[ ]/g, '&nbsp;').replace(/[\t]/g, '&nbsp;&nbsp;&nbsp;&nbsp;').replace(/[\n\r]/g, '<br>'));
    W.document.close();
}

// JSONP callback for OPML, called if XML and HTML queries fail
//
function gotOPML(response)
{
    var tmp = "";
    var div = $("<div>").html((new window.DOMParser()).parseFromString(response.results[0], "text/xml").documentElement.outerHTML);
    var opml = div[0].firstChild;
    gFeed.response = response;
    try {
        console.assert(opml.nodeName == "OPML", "gotOPML/response.nodeName!=opml", opml.nodeName );
        console.assert(opml.children[0].nodeName == "TITLE", "gotOPML/response.children[0].nodeName!=title", opml.children[0].nodeName);
        console.assert(opml.children[1].nodeName == "OUTLINE", "gotOPML/response.children[1].nodeName!=outline", opml.children[1].nodeName);
        var outlines = opml.querySelectorAll("outline");
        tmp = `<h1>${div[0].querySelector("title").textContent||"[No title]"}</h1>`;
        $(outlines).each(function(idx,node) {
            var a = node.attributes;
                var name = (a.getNamedItem("text") ? a.getNamedItem("text").nodeValue : (a.getNamedItem("title") ?  a.getNamedItem("title").nodeValue : ""));            if (!a.getNamedItem("type")) {    // directory
                tmp += `<h2>Directory ${name}</h2>`;
                tmp += `<a href="https://www.inoreader.com/stream/user/1005952996/tag/${name}/view/html" target="_blank">View Webstream</a><br/>
                        <a onclick=run("https://www.inoreader.com/stream/user/1005952996/tag/${name}?n=250",false,false,false,true)><u>View Combined Feed</u><br/><hr/>`;
            }
            else {
                console.assert(a.getNamedItem("type").nodeValue == "rss", "gotOPML/type != rss", a.getNamedItem("type").nodeValue);
                var xmlUrl = a.getNamedItem("xmlUrl").nodeValue;
                tmp += `<a href='${a.getNamedItem("htmlUrl").nodeValue}' target="_blank">${name||"[no title]"}</a>
                        &nbsp;&nbsp;&nbsp;&nbsp;<a href='javascript:run("${xmlUrl}",false,false,false,true)'>[${xmlUrl}]</a><br/>`;
            }
        })
    }
    catch(e) {
        console.log(e);
    }    
    gFeed.opmlDiv.innerHTML = tmp;
    $("#throbber").remove();
    $("#opmlMenu").menu("collapseAll")
    window.onresize();
    // sometimes Google ajax fails on initial XML get, try it with YQL get
    if (tmp == "")
        loadXML(gFeed.lastUrl, false, false, false, true);
}


// JSONP callback
function gotMyOPML(response)
{
    gFeed.response = response;
    $("#throbber").remove();
    if (response.results) {
        $("#opmlDropit")[0].innerHTML = "";
        var div = $("<div>").html((new window.DOMParser()).parseFromString(response.results[0], "text/xml").documentElement.outerHTML);
        var opml = div[0].firstChild;
        for (i = 1; i < opml.children.length; i++) {    // first child is title
            var type = opml.children[i].attributes["type"].value;
            if (type == "directory") {
                var url = opml.children[i].attributes['xmlUrl'].value;
                $("#opmlDropit")[0].innerHTML += `<li onclick="run('${url}', true, true, false)">${opml.children[i].attributes['title'].value}</li>`;
            }
        }
        $("#opmlMenu").menu();
        $("#opmlMenu").dropit();
    }
    else
        gFeed.feedDiv.innerHTML = "<h1>Error reading my OPML directory</h1>";
}


function processFeed(obj)
{
    // grab the raw XML from xmlString
    obj.oDOM = new DOMParser().parseFromString(obj.xmlString, "text/xml");
    
    var d = document.createElement("DIV");
    var bUseNativeXML = $("#native")[0].checked;

    if (bUseNativeXML)
    {
        var xmlSrc = obj.xmlString.replace(/<script[^>]+?\/>|<script(.|\s)*?\/script>/gi, '')
        var x2js = new X2JS();
        var jas = x2js.xml_str2json(xmlSrc);    // TODO: hunt down "syntax error"
        //console.log(JSON.stringify(jas));  

        if (jas.rss)
        {
            var z = new viewRssRaw(d, jas.rss);
            var y = new viewRssItemsRaw(d, jas.rss);
            z.render();
            y.render();
        }    
        else if (jas.feed)
        {
            var z = new viewAtomRaw(d, jas.feed);
            var y = new viewAtomEntriesRaw(d, jas.feed);
            z.render();
            y.render();
        }
        else
            d.innerHTML = "<b>Feed not found</b>";
        gFeed.feedDiv.innerHTML = d.innerHTML;
    }
    else {
        // use google gfeed representation of a feed, always atom
        if (obj.feed)    // atom
        {
            var z = new viewAtom(d, obj.feed);
            var y = new viewAtomEntries(d, obj.feed);
            z.render();
            y.render();
        }
        else {
            try {
                d.innerHTML = "<b>Unknown format: " + obj + "</b>";
            }
            catch (e) {console.log(e)}
        }
    }
    gFeed.feedDiv.innerHTML = d.innerHTML;
}


var viewAtom = function(d, feed)
{
  this.feed = feed;
  this.template = function(node) {
        var tmp = "";
console.log(node.link);
        if (node.link) {
            if (node.link instanceof Array) {
                link.forEach(function(aNode) {
                    if (aNode.type == "alternate") {
                        tmp = `<h1 class="feedHeader"><a href="${aNode.href}" target="_blank">${node.title}</a></h1>`;
                    }
                });
            }
            else
                tmp = `<h1 class="feedHeader"><a href="${node.link}" target="_blank">${node.title}</a></h1>`;
        }
        else
            tmp = `<h1 class="feedHeader">${node.title}</h1>`;
        document.title = node.title;
        return tmp + (node.description ? `<h2 class="feedDescription"><span class="descriptionText">${node.description}</span>` : "") + (node.author && node.author != "" ? `<span class="feedAuthor"> By ${node.author}</span></h2>` : "");
  };
  this.render = function() {
        d.innerHTML =  this.template(this.feed);
  }
}



var viewAtomEntries = function(d, feed)
{
    itemContent = [];
    itemCnt = 0;
    this.feed = feed;
    this.template = function(node) {
        var tmp = null;
        
        if (node.link instanceof Array) {
            node.link.forEach(function(aNode) {
                if (aNode.type == "alternate") {
                    if (!tmp)
                        tmp = `<b><a href="${aNode._href}" target="_blank">${node.title}</a></b>`;
                }
            });
        }
        else
            tmp = `<b><a href="${node.link}" target="_blank">${node.title}</a></b>`;
        tmp += ((node.author && node.author) != "" ? `<br>By ${node.author}` : "");
        tmp += `${node.content||node.contentSnippet||""}`;
        tmp += node.categories.length ? "Categories: " + node.categories.join(",") : "";
        if (node.mediaGroups)
        {
            tmp += '<div class="mediaGroups">';
            node.mediaGroups.forEach(function (mg) {
              tmp += '<p class="mediaTitle">Media</p>';
              mg.contents.forEach(function (cont) {
                switch (cont.medium) {
                  case "image":
                    tmp += `<div class="mediaItem"><a href="${cont.url}" target="_blank">${cont.title}<br/><img src="${cont.url}"/></a></div>`;
                    break;
                  default:
                    tmp += `<div class="mediaItem">medium=${cont.medium}, url=${cont.url}, title=${cont.title}</div>`;
                  }
              })
            })
            tmp += '</div>'
        }
        itemContent[itemCnt] = `<div class="feedEntryBody">` + tmp + "</div>";
        itemContent[itemCnt] += `<p class="heartBullet"></p>`;
        return `<div class="feedEntryHeader" onclick="toggleItem(this,` + itemCnt++ + `)">${node.title}`
            + `<span class="entryDate">` + new Date(`${node.publishedDate}`).toLocaleString()
            + `</span></div><div></div>`;
        
    };
    this.render = function()
    {
        var tmp = "";
        this.feed.entries.forEach(function(node) {
            tmp += '<li><div class="feedEntry">' + this.template(node) + '</div></li>';
        }.bind(this));
        d.innerHTML += "<ol>" + tmp + "</ol>";
    };
}


var txtAuthor = function(author)
{
    var txt = "";
    if (author)
    {
        if (author.uri)
        {
            txt = `<a href="${author.uri}" target="_blank">${author.name}</a>  `;    
        }
        else if (author.name)
        {
            txt = `${author.name}  `;
        }
        if (author.image)
        {
            var src = author.image._src;
            if (src.substring(0,2) == "//")
                src = "http:" + src;
            txt += `<img src="${src}" style="height: ${author.image._height}; width: ${author.image._width}"/>`;
        }
    }
    return txt;
}


function hideShow(el) {
    var display = el.nextSibling.style.display;
    if (display == "none") {
        el.nextSibling.style.display = "";
        el.innerHTML = "Category -&nbsp;&nbsp;&nbsp;&nbsp;";
    }
    else {
        el.nextSibling.style.display = "none";
        el.textContent = "Category +";
    }
};



var txtCategories = function(cats, isAtom)
{
    var txt = "";
    if (cats)
    {
        txt += `<span class="itemCat" onclick="hideShow(this)" style="font-weight:900">Category +</span><span id="catSpan" style = 'display:none'>`;
        var tmp = cats;
        if (!Array.isArray(tmp))
            tmp = [tmp];
        txt += (isAtom ? `${tmp[0]._term}` : (tmp[0]._text ? `${tmp[0]._text}` : `${tmp[0]}`));
        tmp.shift();
        tmp.forEach(function(cat) {
            txt += `, ${(isAtom ? cat._term : cat)}`;
        });
        txt += "</span>";
    }
    return txt;
}



var viewRssRaw = function(el, rss)
{
  this.el = el;
  this.rss = rss;
  this.template = function(node) {
        var    href = null;
        var tmp = "";
        if (node.link instanceof Array)
            href = node.link[0];
        else
            href = node.link;
        gFeed.homeUrl = href;
        tmp += `<h1 class="feedHeader"><a href="${href}" target="_blank">${node.title||"[no title]"}</a></h1>`;
        document.title = node.title;
        if (node.image && node.image._href) {
            tmp += `<a class="feedLink" title="Go to ${node.title}" href="${href}" target="_blank">
                    <img class="feedImg" src="${node.image._href}"/></a>`;
        }
        tmp +=`<h2 class="feedDescription">${node.description}</h2>`
            + '<div class="feedEtc">'
            + (node.author ? `<br/>Author: ${node.author}` : "")
            + (node.date ? `<br/>Date: ` + new Date(`${node.date}`).toLocaleString() : "")
            + (node.lastBuildDate ? `<br/>Last updated: ` + new Date(`${node.lastBuildDate}`).toLocaleString(): "")
            + (node.updateFrequency && node.updatePeriod ? `<br/>Update Interval: ${node.updateFrequency}/${node.updatePeriod}` : "")
            + (node.copyright ? `<br/>Copyright: ${node.copyright}` : "")
            + (node.rights ? `<br/>Rights: ${node.rights}` : "")
            + (node.language ? `<br/>Language: ${node.language[0]}` : "")
            + (node.explicit ? `<br/>Explicit: ${node.explicit}` : "")
            + (node.generator ? `<br/>Generator:${node.generator}` : "");

        this.el.innerHTML += tmp + "</div>";        
        this.el.innerHTML += `<div class="feedCats">` + txtCategories(this.rss.channel.category) + "</div>";
    };
    this.render = function()
    {
        this.template(this.rss.channel);
    }
}


var viewRssItemsRaw = function(el, rss)
{
    itemContent = [];
    itemCnt = 0;
    this.rss = rss;
    this.el = el;
    this.template = function(node) {
        var url = node.link ? `${node.link}` : `${gFeed.homeUrl}/${node.guid}`;
        itemContent[itemCnt] = `<div class="feedEntryBody"><a href="${url}" target="_blank">${node.title}</a><br/>`
            + (node.creator || node.author ? `<br>By ${node.creator || node.author}` : ``)
            + `<div>${txtCategories(node.category)}</div>`
            + `<div>${node.encoded || node.description || ""}</div>`;
        if (node.enclosure) {
          var enc = node.enclosure;
          if (!(node.enclosure instanceof Array))
            enc = [enc];
          for (var i = 0; i < enc.length; i++) {
            itemContent[itemCnt] +=
                `<div class="audioPlayer"><audio style="height: 28px; width: 50%;" controls>` +
                `<source src="${enc[i]._url}" type="${enc[i]._type}">` +
                `Your browser does not support the audio element.</audio><br/>` +
                `<a href="${enc[i]._url}" target="blank">${enc[i]._url}</a><br/>` +
                (enc[i]._length ? `Length: ${enc[i]._length}` : "") + "</div>";
            }
        }
        itemContent[itemCnt] += (node.duration ? `Duration: ${node.duration}<br/>` : "");
        itemContent[itemCnt] += (node.explicit ? `Explicit: ${node.explicit}<br/>` : "");
        itemContent[itemCnt] += (node.keywords && node.keywords.__text ? `Keywords: ${node.keywords}<br/>` : "");
        itemContent[itemCnt] += (node.image ? `<img src="${node.image._href}"/><br/>` : "");
        if (node.comments) {
            var comments = (node.comments instanceof Array ? node.comments[0] : node.comments);
            var nComments = (node.comments instanceof Array ? node.comments[0] : undefined);
            itemContent[itemCnt] += `<div class="comments">Comments ` + (nComments ? `[${node.comments[1]}]:` : "") + `<a href="${comments}" target="_blank">${comments}</a>`;
        }
        itemContent[itemCnt] += (node.commentRss ? `<br/>Comments feed: <a href="${node.commentRss}" target="_blank">${node.commentRss}</a>` : "") + "</div>";
        if (node.content)
        {
            if (!node.content instanceof Array)
                node.content = [node.content];
            for (var i = 0; i < node.content.length; i++) {
                if (node.content[i]._medium == "image") {                        
                    var img = `${node.content[i]._url}`;
                    var x = img.match(/\?w=[0-9]+/);
                    if (x && x[0])
                      img = img.substr(0, x.index)
                    itemContent[itemCnt] += `<div><img src="${img}"/>`;
                    if (node.content[i].title) {
                        if (node.content[i].title.__text) {
                            itemContent[itemCnt] += `<br><center>${node.content[i].title.__text}</center></div>`;
                        }
                        else
                            itemContent[itemCnt] += "<br>NOT node.content[i].title.__text</div>";
                    }
                    else
                        itemContent[itemCnt] += "<br>NOT node.content[i].title</div>";
                }
                else if (node.content[i].__prefix == "media") {                        
                    var img = `${node.content[i]._url}`;
                    var x = img.match(/\?w=[0-9]+/);
                    if (x && x[0])
                      img = img.substr(0, x.index)
                    itemContent[itemCnt] += `<div><center><img src="${img}"/>`;
                    if (node.content[i].description) {
                        if (node.content[i].description.toString) {
                            itemContent[itemCnt] += `<br>${node.content[i].description.toString()}</center></div>`;
                        }
                        else
                            itemContent[itemCnt] += "<br></center>NOT node.content[i].description.toString</div>";
                    }
                    else
                        itemContent[itemCnt] += "<br>NOT node.content[i].description</div>";
                }
                else
                    itemContent[itemCnt] += `<br><div>TODO: node.content[i] != image && node.content[i].__prefix != media</div>`;
            }
        }        
        itemContent[itemCnt] += `<p class="heartBullet"></p>`;
        var theDate = new Date(`${node.pubDate}`).toLocaleString();
        if (theDate == "Invalid Date")
            theDate = node.pubDate;
        return `<div class="feedEntryHeader" onclick="toggleItem(this,${itemCnt++})">${node.title}<span class="entryDate">${theDate}</span></div><div></div>`;
    };
    this.render = function()
    {
        if (this.rss.channel.item) {
            if (!(this.rss.channel.item instanceof Array))
                this.rss.channel.item = [this.rss.channel.item];
            var tmp = "<ol>";
            this.rss.channel.item.forEach(function(node) {
                tmp += "<li>" + (this.template(node)) + "</li>";
            }.bind(this));
            this.el.innerHTML += tmp + "</ol>";
        }
        else
            this.el.innerHTML += `<h1>No items</h1>`;
    };
}
    
var viewAtomRaw = function(el, feed)
{
  this.feed = feed;
  this.el = el;
  this.template = function(node) {
        var tmp = "";
console.log(this.feed.link);
        if (this.feed.link)
        {
            this.feed.link.forEach(function(aNode) {
                if (aNode._type == "text/html" || aNode._rel == "alternate")
                {
                    tmp = `<h1><a class="feedHeader" href="${aNode._href}" target="_blank">${node.title}</a></h1>`;
                }
            });
        }
        else
            tmp = `<h1>${node.title}</h1>`;
        document.title = node.title;
        tmp += (node.subtitle && node.subtitle.__text ? `<h2>${node.subtitle.__text}</h2>` : ``)
            + (node.author ? `Author: ` + txtAuthor(node.author) + `<br\>` : ``)
            + (this.feed.updated ? `Last updated: ` + new Date(`${this.feed.updated}`).toLocaleString() + "<br/>" : "")
            + (this.feed.generator ? `Generator:${this.feed.generator}` : ``);
        return tmp + `<div class="feedCats">` + txtCategories(this.feed.category, true) + `</div>`;
  };
  this.render = function()
  {
      this.el.innerHTML += this.template(this.feed);
  };
}


var viewAtomEntriesRaw = function(el,feed)
{
    itemContent = [];
    itemCnt = 0;
    this.feed = feed;
    this.el = el;
    this.enclosure = [];
    this.template = function(node) {
        var link = node.link;
        var pageLink = null;    // link back to page
        if (!Array.isArray(link))
            link = [link];
        link.forEach(function(aNode) {
            if (aNode) {
                if (aNode._rel == "alternate" || aNode._rel == undefined) {
                    if (!pageLink)
                        pageLink = aNode;
                }
                else if (aNode._rel == "enclosure")
                    this.enclosure.push(aNode);
            }
        }.bind(this));
        itemContent[itemCnt] = `<a class="feedEntryHeader" href="${(pageLink && pageLink._href) || "#"}" target="_blank">${node.title}</a>`;
        itemContent[itemCnt] += `<br>` + new Date(`${node.updated ? node.updated : node.published}`).toLocaleString()
            + `<br>` + (node.author ? `Author: ` + txtAuthor(node.author) + `<br\>` : ``);
        if (node.thumbnail) {
            itemContent[itemCnt] += `Thumbnail: <img src="${node.thumbnail._url}" style="height: ${node.thumbnail._height}; width: ${node.thumbnail._width}"></img>`;
        }
        if (node.content && node.content._type=="xhtml") {
            for (var i = 0; i < this.feed.entry.length; i++) {
                if (node == this.feed.entry[i]) {
                    itemContent[itemCnt] += gFeed.response.responseData.oDOM.getElementsByTagName("entry")[i].getElementsByTagName("content")[0].innerHTML;
                    break;
                }
            }
        }
        else
            itemContent[itemCnt] += `<div>${node.content||node.summary||""}</div>`;

        if (node.enclosure) {
            itemContent[itemCnt] += `<div class="audioPlayer"><audio style="height: 28px; width: 50%;" controls>`
                + `<source src="${node.enclosure._url}" type="${audio/mpeg}">`
                + `Your browser does not support the audio element.</audio></div>`;
        }
        else if (this.enclosure.length) {
            for (var i = 0; i < this.enclosure.length; i++) {
                itemContent[itemCnt] += `<div class="audioPlayer"><audio style="height: 28px; width: 50%;" controls>`
                    + `<source src="${this.enclosure[i]._href}" type="${this.enclosure[i]._type}">`
                    + `Your browser does not support the audio element.</audio></div>`;
            }
        }
        if (node.group && node.group.__prefix == "media") {
            var tmp = "";
            tmp += (node.group.title.__text ? `<div class="mediaTitle">${node.group.title.__text}</div>` : "");
            tmp += (node.group.description.__text ? `<div class="mediaDescription">${node.group.description.__text}</div>` : "");
            if (node.group.content._url && node.group.content._type) {
                tmp += `<embed type="${node.group.content._type}" src="${node.group.content._url}"`
                    + (node.group.content._height ? ` height=${node.group.content._height}` : "")
                    + (node.group.content._width ? ` width=${node.group.content._width}` : "") + "/>";    
            }
            if (node.group.community) {
                tmp += '<div class="rating">';
                var star = node.group.community.starRating;
                if (star) {
                    tmp += (star._average ? `Rating: ${star._average} ` : "");
                    tmp += (star._max ? `of ${star._max} ` : "");
                    tmp += (star._count ? `by ${star._count} users ` : "");
                }
                tmp += (node.group.community.statistics ? `(${node.group.community.statistics._views} viewers total)` : "") + "</div>";
            }
            itemContent[itemCnt] += tmp;
        }
        itemContent[itemCnt] += (node.category ? `<div class="feedCats">` + txtCategories(node.category, true) + "</div>" : "");
        itemContent[itemCnt] += `<p class="heartBullet"></p>`;
        return `<li><div class="feedEntryHeader" onclick="toggleItem(this,` + itemCnt++ + `)">${node.title}`
            + `<span class="entryDate">` + new Date(`${node.updated ? node.updated : node.published}`).toLocaleString()
            + `</span></div><div></div></li>`;
    };

    this.render = function()
    {
        var tmp = `<ol id="list">`;
        if (!(this.feed.entry instanceof Array))
            this.feed.entry = [this.feed.entry];
        this.feed.entry.forEach(function(node) {
            tmp += this.template(node);
        }.bind(this));
        this.el.innerHTML += tmp + `</ol>`;
    };
}



// JSONP callback
function gotXML(response)
{
    gFeed.response = response;
    if (response.responseData) {
        if ($("#viewResponse")[0].checked)
            showCode(response.responseData.xmlString, true);
        processFeed(response.responseData);
        if (gFeed.bFromOpmlList)
            $("#feedDiv")[0].scrollIntoView();
    }
    else {
        // assume user entered the webpage, not it's feed
        //loadXML($("#feedURL")[0].value, true);
        run(gFeed.lastUrl, true);
    }
    window.onresize();
}

// JSONP callback for HTML, scrape head for feed links and display them.
//
function gotHTML(response)
{
    gFeed.response = response;
    //console.log(response);
    if (response.results[0])
    {
        var data = response.results[0];
        if ($("#viewResponse")[0].checked)
            showCode(data, false);

        var div = $("<div>").html(data);
        var tmp = "";
        $.each(div[0].querySelectorAll("link[rel='alternate']"), function(i, el) {
            var url = `${el.href}`;
            // fix-up relative URLs
            if (url.match(/^file:/))    // running locally
                url = gFeed.lastUrl + url.substring(7);
            // TODO fix-up for running on net
            tmp += `${el.type}: <a href="javascript:$('#feedURL')[0].value='${url}';setTimeout(function(){$('#go').click()}, 1000);void 0">${el.title||el.href}</a><br>`;
        });
        if (tmp)
            tmp = "<b>Feed(s) found:</b> Click one to continue.<br/>" + tmp;
        else {
            tmp = "<b>Feed not found</b>";    
            run(undefined, true, true);        // try OPML
        }
        gFeed.feedDiv.innerHTML = tmp;
        //gFeed.feedDiv.scrollIntoView();
    }
    else {
        // try OPML
        //loadXML($("#feedURL")[0].value, true, true);
        run(undefined, true, true);
    }
}


function loadScript(url, callback)
{
  var s = document.createElement('script');
  s.src = url;
  if (s.addEventListener) {
    s.addEventListener('load', callback, false);
  } else {
    s.onreadystatechange = function () {
      if (this.readyState == 'complete') {
        callback();
        s = null;
      }
    }
  }
  s.type = 'text/javascript';
  document.getElementsByTagName('head')[0].appendChild(s);
};


function whatever()
{
    $.getJSON('http://whateverorigin.org/get?url=' + encodeURIComponent(document.querySelector("#feedURL").value) + '&callback=?', function(data)
    {
        console.log(data);
        var response={results: [data.contents]};
        gotOPML(response);
    });
}




function loadXML(url, bNotFeed, bTryOPML, bMyOPMLs, bLastFallback)
{
    var yql, q = '';
    gFeed.lastUrl = url;
    if (bNotFeed || bLastFallback) {
        if (bTryOPML) {
            if (bMyOPMLs)
                yql = 'https://query.yahooapis.com/v1/public/yql?callback=gotMyOPML&format=xml&q=';
            else
                yql = 'https://query.yahooapis.com/v1/public/yql?callback=gotOPML&format=xml&q=';
            q = encodeURIComponent(`select * from xml where url="${url}"`);
        }
        else if (bLastFallback) {
            yql = 'https://query.yahooapis.com/v1/public/yql?callback=gotXML&format=xml&q=';
            q = encodeURIComponent(`select * from xml where url="${url}"`);
        }
        else    // load as HTML to parse feeds links from header
        {
            yql = 'https://query.yahooapis.com/v1/public/yql?callback=gotHTML&format=xml&q=';
            q = encodeURIComponent(`select * from html where url="${url}" and xpath="*"`);
        }
      }
      else
      {
          if (false) { // use local proxy, no need for JSONP
               yql = `https://localhost:8080//xxx/xdom.php?val=${url}`;
              $.get( yql, function( data ) {
                  if (data.children[0].tagName == "opml")
                    gotOPML(data.children[0]);
                  else if (data.children[0].tagName == "rss")
                    gotXML({responseData:data.children[0]});
            });
            return;
        }
         //yql = `https://anyorigin.com/get/?url=${url}&callback=gotXML`;
        var maxItems = document.querySelector("#num").value;
        var bHistorical = document.querySelector("#historical").checked;
        var theUrl = encodeURIComponent(url);
           yql = `https://ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=gotXML${bHistorical ? "&scoring=h" : ""}&num=${maxItems}&output=json_xml&q=${theUrl}`;
    }

    return loadScript(yql + q, function (evt) {
        //console.log('script load event:');
        //console.log(evt);
      });
}


function run(url, bNotFeed, bTryOPML, bMyOPMLs, bFromOpmlList, bLastFallback)
{
    try {
        var theUrl = url;
        if (bFromOpmlList)
            gFeed.bFromOpmlList = bFromOpmlList;
        if (typeof url == "undefined")
            theUrl = document.querySelector("#feedURL").value;
        if (theUrl == "")
            return;
        document.querySelector("#inoSub").innerHTML = `<a href="http://www.inoreader.com/?add_feed=${theUrl}" target="_blank">Subscribe</a>`;
        gFeed.feedDiv.innerHTML = `<img id="throbber" src="http://i.imgur.com/I4TWrLd.gif" style="position:absolute;left:50%;margin-left:-250px;" alt="Banana animated">`;
        loadXML(theUrl, bNotFeed, bTryOPML, bMyOPMLs, bLastFallback);
    }
    catch(e) {
        console.log(e);
        alert(e);
    }
}



</script>

rickdog

jwplayer


<div style="width: 100%; height: 120px; background-color: rgb(0, 0, 0); opacity: 1;" id="jwPlayerContainer" class="jwplayer playlist-none">
</div>




<script src="https://megacloud.io/plugins/mediaplayer/assets/players/jwplayer/jwplayer.js"></script>


<script> jwplayer("jwPlayerContainer").setup({ file: "https://cf-media.sndcdn.com/hy73apZNmEGY.128.mp3?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiKjovL2NmLW1lZGlhLnNuZGNkbi5jb20vaHk3M2FwWk5tRUdZLjEyOC5tcDMiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MzYwMzYwMTZ9fX1dfQ__&Signature=j2M6TOsv3NTqS2wbAiEn9S0nGGdEE1TqeBHEPHeKrDFpukP6ZPH7toEllx3H8FXDz68wa9jWhwH4Z54q2GOnVLmSP-hs23N-TVR7dz7JmhijX7Rl~nwe3Y4rn7hvTTMiYWxlZnt7H~dn0P6aB7KR9GC1zEpW9od8JT62DMT~6ZtALfHC5RF9qbMAt4K8dPbIMhPOMxY0bN0tMif4TSqgPeNbcy6uDWjAcI4LCJQvCRf9QGVJ6wbYnSar8jQCi8A6YIGqvasi3aOSV4ePEaOYcISqBWjtEV-EVKy8JyaZZ-q2vZyydx~V2ocEpGwLdSr9Yu9OU~G4MAlLeqB47vJt1g__&Key-Pair-Id=APKAJAGZ7VMH2PFPW6UQ", type: "mp3", title: "01 - Lies You Forgot You Told.mp3", width: "100%", height: "120", startparam: "start", autostart: false });</script>