diff --git a/README.md b/README.md index 9dd7420..387ffba 100644 --- a/README.md +++ b/README.md @@ -36,4 +36,3 @@ The website makes use of SVG files. Make sure your web server is configured to p ### Credits: * Some icons used are provided by _feather_: https://www.github.com/colebemis/feather -* RSS feed generation is done with _podcastfeed_: https://www.github.com/torann/podcastfeed diff --git a/composer.json b/composer.json index feb78a4..923b1c0 100644 --- a/composer.json +++ b/composer.json @@ -7,8 +7,7 @@ "require": { "php": ">=5.6.4", "laravel/framework": "5.5.*", - "laravel/tinker": "~1.0", - "torann/podcastfeed": "^0.2.2" + "laravel/tinker": "~1.0" }, "require-dev": { "fzaninotto/faker": "~1.4", diff --git a/composer.lock b/composer.lock index 28e8cf4..42fc5fa 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "1cae6beacabbf92528e5f3b3aef29cf0", + "content-hash": "a227793fb94a414365706d2a530b7e23", "packages": [ { "name": "dnoegel/php-xdg-base-dir", @@ -2117,56 +2117,6 @@ "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", "time": "2016-09-20T12:50:39+00:00" }, - { - "name": "torann/podcastfeed", - "version": "0.2.2", - "source": { - "type": "git", - "url": "https://github.com/Torann/podcastfeed.git", - "reference": "6c4bd157a3eaaaa62aa71f665566ed2050973664" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Torann/podcastfeed/zipball/6c4bd157a3eaaaa62aa71f665566ed2050973664", - "reference": "6c4bd157a3eaaaa62aa71f665566ed2050973664", - "shasum": "" - }, - "require": { - "illuminate/support": "~5.1", - "php": ">=5.5.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.2-dev" - } - }, - "autoload": { - "psr-4": { - "Torann\\PodcastFeed\\": "src/Torann/PodcastFeed/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD 2-Clause" - ], - "authors": [ - { - "name": "Daniel Stainback", - "email": "daniel@lyften.com" - } - ], - "description": "Generate RSS feeds for podcasts in Laravel 5.", - "keywords": [ - "feed", - "laravel", - "podcast", - "podcast generator", - "rss", - "xml" - ], - "time": "2016-09-01T20:24:17+00:00" - }, { "name": "vlucas/phpdotenv", "version": "v2.4.0", diff --git a/config/app.php b/config/app.php index 552596b..135e977 100644 --- a/config/app.php +++ b/config/app.php @@ -177,11 +177,6 @@ App\Providers\EventServiceProvider::class, App\Providers\RouteServiceProvider::class, - /* - * https://github.com/Torann/podcastfeed - */ - Torann\PodcastFeed\PodcastFeedServiceProvider::class, - ], /* @@ -218,7 +213,6 @@ 'Mail' => Illuminate\Support\Facades\Mail::class, 'Notification' => Illuminate\Support\Facades\Notification::class, 'Password' => Illuminate\Support\Facades\Password::class, - 'PodcastFeed' => Torann\PodcastFeed\Facades\PodcastFeed::class, 'Queue' => Illuminate\Support\Facades\Queue::class, 'Redirect' => Illuminate\Support\Facades\Redirect::class, 'Redis' => Illuminate\Support\Facades\Redis::class, diff --git a/config/podcast-feed.php b/config/podcast-feed.php deleted file mode 100644 index 1d125d0..0000000 --- a/config/podcast-feed.php +++ /dev/null @@ -1,16 +0,0 @@ - [ - 'title' => 'Steamchat Podcast', - 'subtitle' => 'A podcast all about Valve and the community', - 'description' => 'Sam, Saurabh and Brad discuss Valve, their games, and most importantly, the community and their discussions in the Steam Users\' Forums.', - 'author' => 'Sam, Saurabh, Brad', - 'email' => 'sam@flamov.com', - 'category' => 'Technology', - 'language' => 'en-us', - 'copyright' => '© Steamchat Podcast', - ] - -]; diff --git a/resources/assets/images/global/more-icon-google.svg b/resources/assets/images/global/more-icon-google.svg new file mode 100644 index 0000000..0c96fbd --- /dev/null +++ b/resources/assets/images/global/more-icon-google.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/assets/images/global/more-icon-itunes.svg b/resources/assets/images/global/more-icon-itunes.svg new file mode 100644 index 0000000..123928b --- /dev/null +++ b/resources/assets/images/global/more-icon-itunes.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/assets/images/global/more-icon-rss.svg b/resources/assets/images/global/more-icon-rss.svg new file mode 100644 index 0000000..b12fb93 --- /dev/null +++ b/resources/assets/images/global/more-icon-rss.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/assets/images/seo/podcast-feed-logo.png b/resources/assets/images/seo/podcast-feed-logo.png new file mode 100644 index 0000000..196dabe Binary files /dev/null and b/resources/assets/images/seo/podcast-feed-logo.png differ diff --git a/resources/assets/js/modules/sidebar.js b/resources/assets/js/modules/archive.js similarity index 70% rename from resources/assets/js/modules/sidebar.js rename to resources/assets/js/modules/archive.js index b44fd6e..2d5f251 100644 --- a/resources/assets/js/modules/sidebar.js +++ b/resources/assets/js/modules/archive.js @@ -1,65 +1,64 @@ -var $archives; - -var episodeCache = { +let $archives; +const episodeCache = { years: {}, categories: {} }; function createCache() { - $archives.$sidebar.$years = $archives.$sidebar.getElementsByClassName('js-year'); $archives.$sidebar.$categories = $archives.$sidebar.getElementsByClassName('js-category'); - var i, targetElement; - - var filterArray = function(key, attribute) { + const filterArray = function(key, attribute) { return Array.prototype.filter.call($archives.$episodes, function(episode) { return episode.getAttribute(attribute) === key; }); }; // Cache episodes by year - for (i = 0; i < $archives.$sidebar.$years.length; i++) { - + for (let i = 0; i < $archives.$sidebar.$years.length; i++) { // Get the element - targetElement = $archives.$sidebar.$years[i]; + let targetElement = $archives.$sidebar.$years[i]; // Get the year value - var targetYear = targetElement.value; + const targetYear = targetElement.value; // Check if the object property already exists if (episodeCache.years.hasOwnProperty(targetYear) === false) { episodeCache.years[targetYear] = filterArray(targetYear, 'data-year'); } - } // Cache episodes by category - for (i = 0; i < $archives.$sidebar.$categories.length; i++) { - + for (let i = 0; i < $archives.$sidebar.$categories.length; i++) { // Get the element - targetElement = $archives.$sidebar.$categories[i]; + let targetElement = $archives.$sidebar.$categories[i]; // Get the category value - var targetCategory = targetElement.value; + const targetCategory = targetElement.value; // Check if the object property already exists if (targetCategory !== 'all' && episodeCache.categories.hasOwnProperty(targetCategory) === false) { episodeCache.categories[targetCategory] = filterArray(targetCategory, 'data-category'); } - } } function searchBehaviour() { + let value = this.value; + + // Ignore non-alphanumeric and whitespace characters + value = value.replace(/[^a-zA-Z0-9]/gi, ' '); - var value = this.value; - var regex = new RegExp(value, 'gi'); + // Then replace multiple spaces with a single space + value = value.replace(/\s\s+/g, ' '); - for (var i = 0; i < $archives.$episodes.length; i++) { - var targetElement = $archives.$episodes[i]; - if (targetElement.getAttribute('data-description').search(regex) < 0) { + const regex = new RegExp(value, 'gi'); + + for (let i = 0; i < $archives.$episodes.length; i++) { + const targetElement = $archives.$episodes[i]; + let description = targetElement.getAttribute('data-description'); + if (description.search(regex) < 0) { targetElement.classList.add('filter-description'); } else { @@ -75,22 +74,16 @@ function searchBehaviour() { } updateFilteringDisplay(); - } function yearsBehaviour() { - - var i; - - var totalLength = $archives.$sidebar.$years.length; - - var yearsActive = 0; - for (i = 0; i < $archives.$sidebar.$years.length; i++) { + const totalLength = $archives.$sidebar.$years.length; + let yearsActive = 0; + for (let i = 0; i < $archives.$sidebar.$years.length; i++) { if ($archives.$sidebar.$years[i].checked === true) { yearsActive++; } } - yearsActive = totalLength - (totalLength - yearsActive); // If this is the last checkbox checked, prevent it from becoming unchecked @@ -98,26 +91,22 @@ function yearsBehaviour() { this.checked = true; } else { - this.disabled = false; - var selectedYear = episodeCache.years[this.value]; + const selectedYear = episodeCache.years[this.value]; // Loop through the year of episodes corresponding to the year checkbox value - for (i = 0; i < selectedYear.length; i++) { - - var targetEpisode = selectedYear[i]; - + for (let i = 0; i < selectedYear.length; i++) { + const targetEpisode = selectedYear[i]; if (this.checked === true) { targetEpisode.classList.remove('filter-year'); } else { targetEpisode.classList.add('filter-year'); } - } // Disable last checkbox if only one left, otherwise enable all checkboxes - for (i = 0; i < $archives.$sidebar.$years.length; i++) { + for (let i = 0; i < $archives.$sidebar.$years.length; i++) { if (yearsActive <= 1 && $archives.$sidebar.$years[i].checked === true) { $archives.$sidebar.$years[i].disabled = true; break; @@ -130,58 +119,49 @@ function yearsBehaviour() { } updateFilteringDisplay(); - } function categoryBehaviour() { - - var i; - var selectedCategory = this.value; + const selectedCategory = this.value; if (selectedCategory === 'all') { - for (i = 0; i < $archives.$episodes.length; i++) { + for (let i = 0; i < $archives.$episodes.length; i++) { $archives.$episodes[i].classList.remove('filter-category'); } } else { - - for (i = 0; i < $archives.$episodes.length; i++) { + for (let i = 0; i < $archives.$episodes.length; i++) { $archives.$episodes[i].classList.add('filter-category'); } - var targetCategory = episodeCache.categories[selectedCategory]; - for (i = 0; i < targetCategory.length; i++) { + const targetCategory = episodeCache.categories[selectedCategory]; + for (let i = 0; i < targetCategory.length; i++) { targetCategory[i].classList.remove('filter-category'); } - } updateFilteringDisplay(); - } function resetBehaviour(event) { - if (event !== null) { event.preventDefault(); } - var i; - // Reset the search field $archives.$sidebar.$search.value = ''; $archives.$sidebar.$search.classList.remove('active'); // Reset the year inputs - for (i = 0; i < $archives.$sidebar.$years.length; i++) { - var targetCheckbox = $archives.$sidebar.$years[i]; + for (let i = 0; i < $archives.$sidebar.$years.length; i++) { + const targetCheckbox = $archives.$sidebar.$years[i]; targetCheckbox.checked = true; targetCheckbox.disabled = false; } // Reset the category inputs - for (i = 0; i < $archives.$sidebar.$categories.length; i++) { - var targetCategory = $archives.$sidebar.$categories[i]; + for (let i = 0; i < $archives.$sidebar.$categories.length; i++) { + const targetCategory = $archives.$sidebar.$categories[i]; if (targetCategory.value === 'all') { targetCategory.checked = true; break; @@ -189,30 +169,27 @@ function resetBehaviour(event) { } // Reset the episode elements - for (i = 0; i < $archives.$episodes.length; i++) { + for (let i = 0; i < $archives.$episodes.length; i++) { $archives.$episodes[i].classList.remove('filter-description', 'filter-year', 'filter-category'); } // Update filering display updateFilteringDisplay(); - } function updateFilteringDisplay() { + const total = $archives.$episodes.length; + let hiding = 0; - var total = $archives.$episodes.length; - var hiding = 0; - - var filterClasses = [ + const filterClasses = [ 'filter-description', 'filter-year', 'filter-category' ]; // Function to check if any of the filter classes are present in the element class list - var checkClass = function(element) { - var containCount = 0; - for (var i = 0; i < filterClasses.length; i++) { + const checkClass = function(element) { + for (let i = 0; i < filterClasses.length; i++) { if (element.classList.contains(filterClasses[i]) === true) { return true; } @@ -221,14 +198,13 @@ function updateFilteringDisplay() { }; // Loop through each episode elements and increase the hiding count if it contains any filter classes - for (var i = 0; i < $archives.$episodes.length; i++) { + for (let i = 0; i < $archives.$episodes.length; i++) { if (checkClass($archives.$episodes[i]) === true) { hiding++; } } - var showing = total - hiding; - + const showing = total - hiding; if (showing < total) { $archives.$counter.innerHTML = 'Showing ' + showing + ' of ' + total + ' episodes:'; $archives.classList.add('filtering'); @@ -244,13 +220,9 @@ function updateFilteringDisplay() { else { $archives.classList.remove('empty'); } - } export function init(element) { - - var i; - // Cache element selectors $archives = element; $archives.$sidebar = $archives.getElementsByClassName('js-sidebar')[0]; @@ -262,7 +234,7 @@ export function init(element) { /*** Bind sidebar scrolling ***/ window.addEventListener('scroll', function() { - var padding = 40; + const padding = 40; if (window.scrollY > ($archives.offsetTop - padding)) { $archives.$sidebar.classList.add('sticky'); } @@ -275,7 +247,7 @@ export function init(element) { createCache(); /*** Bind Show Button ***/ - var show = $archives.getElementsByClassName('js-show'); + const show = $archives.getElementsByClassName('js-show'); if (show.length > 0) { show[0].addEventListener('click', function(event) { event.preventDefault(); @@ -290,19 +262,18 @@ export function init(element) { $archives.$sidebar.$search.addEventListener('input', searchBehaviour); /*** Bind Year Inputs ***/ - for (i = 0; i < $archives.$sidebar.$years.length; i++) { + for (let i = 0; i < $archives.$sidebar.$years.length; i++) { $archives.$sidebar.$years[i].addEventListener('change', yearsBehaviour); } /*** Bind Category Inputs ***/ - for (i = 0; i < $archives.$sidebar.$categories.length; i++) { + for (let i = 0; i < $archives.$sidebar.$categories.length; i++) { $archives.$sidebar.$categories[i].addEventListener('change', categoryBehaviour); } /*** Bind Reset Button ***/ - var reset = $archives.getElementsByClassName('js-reset'); - for (i = 0; i < reset.length; i++) { + const reset = $archives.getElementsByClassName('js-reset'); + for (let i = 0; i < reset.length; i++) { reset[i].addEventListener('click', resetBehaviour); } - } diff --git a/resources/assets/js/modules/listen.js b/resources/assets/js/modules/listen.js index 49e2571..ee622dc 100644 --- a/resources/assets/js/modules/listen.js +++ b/resources/assets/js/modules/listen.js @@ -1,20 +1,17 @@ function listenBehaviour(event) { - event.preventDefault(); - var target = document.getElementsByClassName('js-audio')[0]; - + const target = document.getElementsByClassName('js-audio')[0]; if (target.paused === true || target.stopped === true) { target.play(); } else { target.pause(); } - } export function init(elements) { - for (var i = 0; i < elements.length; i++) { + for (let i = 0; i < elements.length; i++) { elements[i].addEventListener('click', listenBehaviour); } } diff --git a/resources/assets/js/modules/player.js b/resources/assets/js/modules/player.js index 9bf453d..625f216 100644 --- a/resources/assets/js/modules/player.js +++ b/resources/assets/js/modules/player.js @@ -1,18 +1,17 @@ function player(element) { - - var Vue = require('vue'); + const Vue = require('vue'); return new Vue({ el: element, template: `
Steamchat (formerly "Steamcast") is a podcast that hosts discussions about Valve, Steam, digital distribution, PC games and other related subjects such as the art and design of video games and other topical video game-related subjects.
-Steamchat is an audio-only podcast, with episodes lasting for around an hour in length. New episodes are published on our website, on our RSS feed, and on the iTunes Store.
+Steamchat is an audio-only podcast, with episodes lasting for around an hour in length. New episodes are published on our website, our RSS feed, the iTunes Store, and the Google Play Store.
We love to hear from our listeners, and have always kept our promise to read and discuss every email and message we get on the show. If you would like for us to discuss something on the show, or just want to get in touch, please feel free to send us an email at podcast@thesteamchat.com.
-The source code for this website is also avaliable on GitHub.
+The source code for this website is also avaliable on GitHub.
diff --git a/resources/views/layouts/episode.blade.php b/resources/views/layouts/episode.blade.php index 349a46a..ebdccdd 100644 --- a/resources/views/layouts/episode.blade.php +++ b/resources/views/layouts/episode.blade.php @@ -16,13 +16,14 @@{{ $episode->description }}
@isset($episode->transcript_url) @@ -37,20 +38,33 @@ diff --git a/resources/views/layouts/index.blade.php b/resources/views/layouts/index.blade.php index ed0c569..8c97ac9 100644 --- a/resources/views/layouts/index.blade.php +++ b/resources/views/layouts/index.blade.php @@ -12,52 +12,74 @@