diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e201d28 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +/vendor/* +!/vendor/.gitkeep +/cache/* +!/cache/.gitkeep +composer.lock \ No newline at end of file diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..4b8c2df --- /dev/null +++ b/.htaccess @@ -0,0 +1,9 @@ + +RewriteEngine On +RewriteBase /rss-audio-player/ +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteRule ^([^/]*)$ ./index.php [QSA] +RewriteRule ^list/([^/]*)$ ./index.php?page=list [QSA] +RewriteRule ^show/([^/]*)$ ./index.php?page=show&feed=$1 [QSA,L] + \ No newline at end of file diff --git a/assets/audiojs/LICENSE b/assets/audiojs/LICENSE new file mode 100644 index 0000000..4fbf29d --- /dev/null +++ b/assets/audiojs/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2010 Anthony Kolber (http://aestheticallyloyal.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/assets/audiojs/audio.min.js b/assets/audiojs/audio.min.js new file mode 100644 index 0000000..e5fde2b --- /dev/null +++ b/assets/audiojs/audio.min.js @@ -0,0 +1,24 @@ +(function(h,o,g){var p=function(){for(var b=/audio(.min)?.js.*/,a=document.getElementsByTagName("script"),c=0,d=a.length;c ',settings:{autoplay:false,loop:false,preload:true,imageLocation:p+"player-graphics.gif",swfLocation:p+"audiojs.swf",useFlash:function(){var b=document.createElement("audio");return!(b.canPlayType&&b.canPlayType("audio/mpeg;").replace(/no/,""))}(),hasFlash:function(){if(navigator.plugins&&navigator.plugins.length&&navigator.plugins["Shockwave Flash"])return true;else if(navigator.mimeTypes&&navigator.mimeTypes.length){var b= +navigator.mimeTypes["application/x-shockwave-flash"];return b&&b.enabledPlugin}else try{new ActiveXObject("ShockwaveFlash.ShockwaveFlash");return true}catch(a){}return false}(),createPlayer:{markup:'

00:00/00:00
', +playPauseClass:"play-pause",scrubberClass:"scrubber",progressClass:"progress",loaderClass:"loaded",timeClass:"time",durationClass:"duration",playedClass:"played",errorMessageClass:"error-message",playingClass:"playing",loadingClass:"loading",errorClass:"error"},css:' .audiojs audio { position: absolute; left: -1px; } .audiojs { width: 460px; height: 36px; background: #404040; overflow: hidden; font-family: monospace; font-size: 12px; background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #444), color-stop(0.5, #555), color-stop(0.51, #444), color-stop(1, #444)); background-image: -moz-linear-gradient(center top, #444 0%, #555 50%, #444 51%, #444 100%); -webkit-box-shadow: 1px 1px 8px rgba(0, 0, 0, 0.3); -moz-box-shadow: 1px 1px 8px rgba(0, 0, 0, 0.3); -o-box-shadow: 1px 1px 8px rgba(0, 0, 0, 0.3); box-shadow: 1px 1px 8px rgba(0, 0, 0, 0.3); } .audiojs .play-pause { width: 25px; height: 40px; padding: 4px 6px; margin: 0px; float: left; overflow: hidden; border-right: 1px solid #000; } .audiojs p { display: none; width: 25px; height: 40px; margin: 0px; cursor: pointer; } .audiojs .play { display: block; } .audiojs .scrubber { position: relative; float: left; width: 280px; background: #5a5a5a; height: 14px; margin: 10px; border-top: 1px solid #3f3f3f; border-left: 0px; border-bottom: 0px; overflow: hidden; } .audiojs .progress { position: absolute; top: 0px; left: 0px; height: 14px; width: 0px; background: #ccc; z-index: 1; background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #ccc), color-stop(0.5, #ddd), color-stop(0.51, #ccc), color-stop(1, #ccc)); background-image: -moz-linear-gradient(center top, #ccc 0%, #ddd 50%, #ccc 51%, #ccc 100%); } .audiojs .loaded { position: absolute; top: 0px; left: 0px; height: 14px; width: 0px; background: #000; background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #222), color-stop(0.5, #333), color-stop(0.51, #222), color-stop(1, #222)); background-image: -moz-linear-gradient(center top, #222 0%, #333 50%, #222 51%, #222 100%); } .audiojs .time { float: left; height: 36px; line-height: 36px; margin: 0px 0px 0px 6px; padding: 0px 6px 0px 12px; border-left: 1px solid #000; color: #ddd; text-shadow: 1px 1px 0px rgba(0, 0, 0, 0.5); } .audiojs .time em { padding: 0px 2px 0px 0px; color: #f9f9f9; font-style: normal; } .audiojs .time strong { padding: 0px 0px 0px 2px; font-weight: normal; } .audiojs .error-message { float: left; display: none; margin: 0px 10px; height: 36px; width: 400px; overflow: hidden; line-height: 36px; white-space: nowrap; color: #fff; text-overflow: ellipsis; -o-text-overflow: ellipsis; -icab-text-overflow: ellipsis; -khtml-text-overflow: ellipsis; -moz-text-overflow: ellipsis; -webkit-text-overflow: ellipsis; } .audiojs .error-message a { color: #eee; text-decoration: none; padding-bottom: 1px; border-bottom: 1px solid #999; white-space: wrap; } .audiojs .play { background: url("$1") -2px -1px no-repeat; } .audiojs .loading { background: url("$1") -2px -31px no-repeat; } .audiojs .error { background: url("$1") -2px -61px no-repeat; } .audiojs .pause { background: url("$1") -2px -91px no-repeat; } .playing .play, .playing .loading, .playing .error { display: none; } .playing .pause { display: block; } .loading .play, .loading .pause, .loading .error { display: none; } .loading .loading { display: block; } .error .time, .error .play, .error .pause, .error .scrubber, .error .loading { display: none; } .error .error { display: block; } .error .play-pause p { cursor: auto; } .error .error-message { display: block; }', +trackEnded:function(){},flashError:function(){var b=this.settings.createPlayer,a=j(b.errorMessageClass,this.wrapper),c='Missing flash player plugin.';if(this.mp3)c+=' Download audio file.';g[h].helpers.removeClass(this.wrapper,b.loadingClass);g[h].helpers.addClass(this.wrapper,b.errorClass);a.innerHTML=c},loadError:function(){var b=this.settings.createPlayer,a=j(b.errorMessageClass,this.wrapper);g[h].helpers.removeClass(this.wrapper, +b.loadingClass);g[h].helpers.addClass(this.wrapper,b.errorClass);a.innerHTML='Error loading: "'+this.mp3+'"'},init:function(){g[h].helpers.addClass(this.wrapper,this.settings.createPlayer.loadingClass)},loadStarted:function(){var b=this.settings.createPlayer,a=j(b.durationClass,this.wrapper),c=Math.floor(this.duration/60),d=Math.floor(this.duration%60);g[h].helpers.removeClass(this.wrapper,b.loadingClass);a.innerHTML=(c<10?"0":"")+c+":"+(d<10?"0":"")+d},loadProgress:function(b){var a=this.settings.createPlayer, +c=j(a.scrubberClass,this.wrapper);j(a.loaderClass,this.wrapper).style.width=c.offsetWidth*b+"px"},playPause:function(){this.playing?this.settings.play():this.settings.pause()},play:function(){g[h].helpers.addClass(this.wrapper,this.settings.createPlayer.playingClass)},pause:function(){g[h].helpers.removeClass(this.wrapper,this.settings.createPlayer.playingClass)},updatePlayhead:function(b){var a=this.settings.createPlayer,c=j(a.scrubberClass,this.wrapper);j(a.progressClass,this.wrapper).style.width= +c.offsetWidth*b+"px";a=j(a.playedClass,this.wrapper);c=this.duration*b;b=Math.floor(c/60);c=Math.floor(c%60);a.innerHTML=(b<10?"0":"")+b+":"+(c<10?"0":"")+c}},create:function(b,a){a=a||{};return b.length?this.createAll(a,b):this.newInstance(b,a)},createAll:function(b,a){var c=a||document.getElementsByTagName("audio"),d=[];b=b||{};for(var e=0,i=c.length;ea.loadedPercent)){a.updatePlayhead.call(a,[c]);a.element.skipTo(c)}};a.updatePlayhead=function(c){a.settings.updatePlayhead.apply(a,[c])};a.play=function(){if(!a.settings.preload){a.settings.preload=true;a.element.init(a.mp3)}a.playing=true;a.element.pplay();a.settings.play.apply(a)};a.pause=function(){a.playing=false;a.element.ppause();a.settings.pause.apply(a)};a.setVolume=function(c){a.element.setVolume(c)};a.loadStarted=function(){a.swfReady= +true;a.settings.preload&&a.element.init(a.mp3);a.settings.autoplay&&a.play.apply(a)}},injectFlash:function(b,a){var c=this.flashSource.replace(/\$1/g,a);c=c.replace(/\$2/g,b.settings.swfLocation);c=c.replace(/\$3/g,+new Date+Math.random());var d=b.wrapper.innerHTML,e=document.createElement("div");e.innerHTML=c+d;b.wrapper.innerHTML=e.innerHTML;b.element=this.helpers.getSwf(a)},helpers:{merge:function(b,a){for(attr in a)if(b.hasOwnProperty(attr)||a.hasOwnProperty(attr))b[attr]=a[attr]},clone:function(b){if(b== +null||typeof b!=="object")return b;var a=new b.constructor,c;for(c in b)a[c]=arguments.callee(b[c]);return a},addClass:function(b,a){RegExp("(\\s|^)"+a+"(\\s|$)").test(b.className)||(b.className+=" "+a)},removeClass:function(b,a){b.className=b.className.replace(RegExp("(\\s|^)"+a+"(\\s|$)")," ")},injectCss:function(b,a){for(var c="",d=document.getElementsByTagName("style"),e=a.replace(/\$1/g,b.settings.imageLocation),i=0,f=d.length;i1?b[b.length-1]:b}},events:{memoryLeaking:false,listeners:[],addListener:function(b,a,c){if(b.addEventListener)b.addEventListener(a,c,false);else if(b.attachEvent){this.listeners.push(b);if(!this.memoryLeaking){window.attachEvent("onunload",function(){if(this.listeners)for(var d=0,e=this.listeners.length;d-1)d||b.init.apply(b);if(b.element.readyState>1){b.settings.autoplay&&b.play.apply(b);clearInterval(a);c=setInterval(function(){b.loadProgress.apply(b);b.loadedPercent>=1&&clearInterval(c)})}},10);b.readyTimer=a;b.loadTimer=c}},purge:function(b){var a=b.attributes,c;if(a)for(c=0;cthis.loadedPercent)){this.element.currentTime=this.duration*b;this.updatePlayhead()}},load:function(b){this.loadStartedCalled=false;this.source.setAttribute("src",b);this.element.load();this.mp3=b;g[h].events.trackLoadProgress(this)}, +loadError:function(){this.settings.loadError.apply(this)},init:function(){this.settings.init.apply(this)},loadStarted:function(){if(!this.element.duration)return false;this.duration=this.element.duration;this.updatePlayhead();this.settings.loadStarted.apply(this)},loadProgress:function(){if(this.element.buffered!=null&&this.element.buffered.length){if(!this.loadStartedCalled)this.loadStartedCalled=this.loadStarted();this.loadedPercent=this.element.buffered.end(this.element.buffered.length-1)/this.duration; +this.settings.loadProgress.apply(this,[this.loadedPercent])}},playPause:function(){this.playing?this.pause():this.play()},play:function(){/(ipod|iphone|ipad)/i.test(navigator.userAgent)&&this.element.readyState==0&&this.init.apply(this);if(!this.settings.preload){this.settings.preload=true;this.element.setAttribute("preload","auto");g[h].events.trackLoadProgress(this)}this.playing=true;this.element.play();this.settings.play.apply(this)},pause:function(){this.playing=false;this.element.pause();this.settings.pause.apply(this)}, +setVolume:function(b){this.element.volume=b},trackEnded:function(){this.skipTo.apply(this,[0]);this.settings.loop||this.pause.apply(this);this.settings.trackEnded.apply(this)}};var j=function(b,a){var c=[];a=a||document;if(a.getElementsByClassName)c=a.getElementsByClassName(b);else{var d,e,i=a.getElementsByTagName("*"),f=RegExp("(^|\\s)"+b+"(\\s|$)");d=0;for(e=i.length;d1?c:c[0]}})("audiojs","audiojsInstance",this); diff --git a/assets/audiojs/audiojs.swf b/assets/audiojs/audiojs.swf new file mode 100644 index 0000000..483599f Binary files /dev/null and b/assets/audiojs/audiojs.swf differ diff --git a/assets/audiojs/player-graphics.gif b/assets/audiojs/player-graphics.gif new file mode 100644 index 0000000..3e4d9d4 Binary files /dev/null and b/assets/audiojs/player-graphics.gif differ diff --git a/assets/scripts.js b/assets/scripts.js new file mode 100644 index 0000000..8f634f3 --- /dev/null +++ b/assets/scripts.js @@ -0,0 +1,51 @@ +$(document).foundation(); + +$(function() { + // Setup the player to autoplay the next track + var a = audiojs.createAll({ + trackEnded: function() { + var next = $('ol li.playing').next(); + if (!next.length) next = $('ol li').first(); + next.addClass('playing').siblings().removeClass('playing'); + audio.load($('a', next).attr('data-src')); + audio.play(); + } + }); + + // Load in the first track + var audio = a[0]; + first = $('ol a').attr('data-src'); + $('ol li').first().addClass('playing'); + audio.load(first); + + // Load in a track on click + $('ol li').click(function(e) { + e.preventDefault(); + $(this).addClass('playing').siblings().removeClass('playing'); + audio.load($('a', this).attr('data-src')); + audio.play(); + }); + + // Keyboard shortcuts + $(document).keydown(function(e) { + var unicode = e.charCode ? e.charCode : e.keyCode; + + // right arrow + if (unicode == 39) { + var next = $('li.playing').next(); + if (!next.length) next = $('ol li').first(); + next.click(); + + // back arrow + } else if (unicode == 37) { + + var prev = $('li.playing').prev(); + + if (!prev.length) prev = $('ol li').last(); + prev.click(); + // spacebar + } else if (unicode == 32) { + audio.playPause(); + } + }); +}); \ No newline at end of file diff --git a/assets/style.css b/assets/style.css new file mode 100644 index 0000000..fc16343 --- /dev/null +++ b/assets/style.css @@ -0,0 +1,66 @@ +.audiojs { + width: 100%; +} +ol { + display: block; + padding: 0px; margin: 0px 20px; list-style: decimal-leading-zero inside; + color: #ccc; border-top: 1px solid #ccc; font-size: 0.9em; +} +.play-pause { + width: 38px !important; +} +.scrubber { + width: 80% !important; +} +ol li { position: relative; margin: 0px; padding: 9px 5px 10px; border-bottom: 1px solid #ccc; cursor: pointer; } +ol li:hover { background: #fff; } +ol li a { display: block; text-indent: -3.3ex; padding: 0px 0px 0px 20px; } +li.playing { color: #aaa; text-shadow: 1px 1px 0px rgba(255, 255, 255, 0.3); } +li.playing a { color: #000; } +li.playing:before { + content: '♬'; width: 14px; height: 14px; padding: 3px; line-height: 14px; + margin: 0px; position: absolute; left: -24px; top: 9px; color: #000; + font-size: 13px; text-shadow: 1px 1px 0px rgba(0, 0, 0, 0.2); +} +.feeds-list ul { + padding: 0px; + margin: 0px 20px; + list-style: none; +} +.feeds-list li { + width: 25%; + text-align: center; + padding: 5px 0px; +} + +#bottom p, +#bottom li { + font-size: 13px; +} + +pre { + font-size: 13px; + overflow: auto; +} + +#shortcuts { + position: fixed; bottom: 0px; width: 100%; color: #666; font-size: 0.9em; + margin: 60px 0px 0px; padding: 20px 20px 15px; + background: #f3f3f3; background: rgba(240, 240, 240, 0.7); +} +#shortcuts div { width: 90%; margin: 0px auto; } +#shortcuts h1 { margin: 0px 0px 6px; } +#shortcuts p { margin: 0px 0px 18px; } +#shortcuts em { + font-style: normal; background: #d3d3d3; padding: 3px 9px; + position: relative; left: -3px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; + + -webkit-box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.1); + -o-box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.1); +} \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..387a40b --- /dev/null +++ b/composer.json @@ -0,0 +1,8 @@ +{ + "name": "ivuorinen/rss-audio-player", + "description": "Web based RSS Audio Player", + "license": "MIT", + "require": { + "simplepie/simplepie": "*" + } +} diff --git a/feeds.json b/feeds.json new file mode 100644 index 0000000..6e4377b --- /dev/null +++ b/feeds.json @@ -0,0 +1,5 @@ +{ + "5by5master": "http://feeds.5by5.tv/master", + "Alas": "http://alas.kschzt.com/rss.xml", + "AlasAmbient": "http://alasambient.kschzt.com/rss.xml" +} \ No newline at end of file diff --git a/inc/rss-audio-player.php b/inc/rss-audio-player.php new file mode 100644 index 0000000..c10fb22 --- /dev/null +++ b/inc/rss-audio-player.php @@ -0,0 +1,133 @@ +version = "1.0"; + $this->build = "20130725"; + + self::setDefaults(); + self::setConfig($config); + } + + public function translateFeed($feed = null) + { + $data = $this->feedslist; + if (is_readable($data)) { + $data = json_decode(file_get_contents($data)); + $this->feeds = $data; + } else { + return $this->feed_url; + } + + return $this->feeds->$feed; + } + + public function buildPage($page = 'list', $feed = null) + { + // Set our template path to shorthand + $tpl = $this->templatepath; + require_once $tpl . '/header.php'; + + $feed = $this->translateFeed($feed); + + $simplepie = new \SimplePie(); + $simplepie->set_feed_url($feed); + $simplepie->init(); + $simplepie->handle_content_type(); + + $data['this'] = $this; + + switch ($page) { + case 'show': + $data['feed'] = $simplepie; + break; + case 'list': + default: + $data['feeds'] = $this->feedslist; + break; + } + + if (is_readable($tpl . DIRECTORY_SEPARATOR . $page . '.php')) { + require_once $tpl . DIRECTORY_SEPARATOR . $page . '.php'; + } + + require_once $tpl . '/footer.php'; + return true; + } + + public function getFeedTitle($feed = null) + { + if (empty($feed)) { + return 'Feed "'.$feed.'" not known.'; + } else { + $feed = $this->translateFeed($feed); + + $simplepie = new \SimplePie(); + $simplepie->set_feed_url($feed); + $simplepie->init(); + $simplepie->handle_content_type(); + + return $simplepie->get_title(); + } + return false; + } + + public function lnk($link = null, $text = '') + { + return '' . $text . ''; + } + + public function lst($text = null) + { + return '
  • ' . $text . '
  • '; + } + + public function currentDir() + { + $path = dirname($_SERVER["PHP_SELF"]); + $position = strrpos($path, '/') + 1; + return '/' . substr($path, $position); + } + + public function setDefaults() + { + $path = pathinfo(__FILE__); + $this->basepath = dirname($path['dirname']) . DIRECTORY_SEPARATOR; + $this->cache_location = $this->basepath . 'cache'; + $this->feed_url = 'http://feeds.5by5.tv/master'; + $this->useragent = 'RSSAudioPlayer/'. $this->version + .' (Feed Parser; http://github.com/ivuorinen/rss-audio-player; ' + .'Allow like Gecko) Build/'. $this->build; + $this->templatepath = $this->basepath . 'templates'; + $this->feedslist = $this->basepath . 'feeds.json'; + $this->baseurl = $this->currentDir(); + } + + public function setConfig($config = null) + { + if (empty($config)) { + return false; + } + + foreach ($config as $key => $value) { + $this->$key = $value; + } + + return true; + } +} diff --git a/index.php b/index.php new file mode 100644 index 0000000..67bf99f --- /dev/null +++ b/index.php @@ -0,0 +1,44 @@ + + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * @category Default + * @package ivuorinen\RSS_Audio_Player + * @author Ismo Vuorinen + * @copyright 2012 Ismo Vuorinen. + * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @version 1.0 + * @link http://github.com/ivuorinen/rss-audio-player + */ + +require_once 'vendor/simplepie/simplepie/autoloader.php'; +require_once 'inc/rss-audio-player.php'; + +$page = (empty($_GET['page'])) ? 'list' : $_GET['page']; +$feed = (empty($_GET['feed'])) ? '5by5master' : $_GET['feed']; + +$rap = new \ivuorinen\RSSAudioPlayer(); + +$rap->buildPage($page, $feed); diff --git a/templates/footer.php b/templates/footer.php new file mode 100644 index 0000000..bd564dc --- /dev/null +++ b/templates/footer.php @@ -0,0 +1,34 @@ + + + + + + + + + + \ No newline at end of file diff --git a/templates/header.php b/templates/header.php new file mode 100644 index 0000000..b5d8c4e --- /dev/null +++ b/templates/header.php @@ -0,0 +1,23 @@ + + + + + + + + + RSS Audio Player + + + + + + + +
    + +
    diff --git a/templates/list.php b/templates/list.php new file mode 100644 index 0000000..ba926a5 --- /dev/null +++ b/templates/list.php @@ -0,0 +1,26 @@ + +
    +
    +
    + +

    Our known feeds

    +
      + +feeds as $key => $url) { + $title = $this->getFeedTitle($key); + echo "\t\t\t\t" . $this->lst( + $this->lnk( + $this->baseurl . '/show/' . $key, // Our link + $title + ) + ). "\n"; +} + +?> + +
    +
    +
    +
    \ No newline at end of file diff --git a/templates/show.php b/templates/show.php new file mode 100644 index 0000000..9fab235 --- /dev/null +++ b/templates/show.php @@ -0,0 +1,48 @@ + + +
    +
    +
    + +

    get_title(); + ?>

    +
    +

    get_description(); ?>

    +
    + +get_items(); + +if (! empty($items)) { + + echo ''."\n"; + echo '
      ' . "\n"; + + foreach ($items as $item) { + + if (($enclosure = $item->get_enclosure())) { + $link = $enclosure->get_link(); + } else { + $link = null; + } + + echo "\t\t\t\t
    1. " + . '' + . $item->get_title() + . '' + ."
    2. \n"; + } + + echo '
    ' . "\n"; +} +?> +
    +
    +
    \ No newline at end of file diff --git a/vendor/.gitkeep b/vendor/.gitkeep new file mode 100644 index 0000000..e69de29