├── .nowignore ├── public ├── robots.txt ├── favicons │ ├── favicon.ico │ ├── favicon-16.png │ ├── favicon-32.png │ ├── favicon-57.png │ ├── favicon-60.png │ ├── favicon-64.png │ ├── favicon-70.png │ ├── favicon-72.png │ ├── favicon-76.png │ ├── favicon-96.png │ ├── favicon-114.png │ ├── favicon-120.png │ ├── favicon-144.png │ ├── favicon-150.png │ ├── favicon-152.png │ ├── favicon-160.png │ ├── favicon-180.png │ ├── favicon-192.png │ ├── favicon-310.png │ └── browserconfig.xml └── index.html ├── ytplcalc.png ├── src ├── assets │ ├── logo.png │ └── not-found.png ├── plugins │ └── bootstrap-vue.js ├── main.js ├── App.vue ├── api │ └── index.js └── components │ └── Home.vue ├── babel.config.js ├── vercel.svg ├── .gitignore ├── vue.svg ├── README.md └── package.json /.nowignore: -------------------------------------------------------------------------------- 1 | README.md 2 | yarn.lock -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * Disallow: -------------------------------------------------------------------------------- /ytplcalc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/srijans38/youtube-playlist-calculator/HEAD/ytplcalc.png -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/srijans38/youtube-playlist-calculator/HEAD/src/assets/logo.png -------------------------------------------------------------------------------- /src/assets/not-found.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/srijans38/youtube-playlist-calculator/HEAD/src/assets/not-found.png -------------------------------------------------------------------------------- /public/favicons/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/srijans38/youtube-playlist-calculator/HEAD/public/favicons/favicon.ico -------------------------------------------------------------------------------- /public/favicons/favicon-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/srijans38/youtube-playlist-calculator/HEAD/public/favicons/favicon-16.png -------------------------------------------------------------------------------- /public/favicons/favicon-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/srijans38/youtube-playlist-calculator/HEAD/public/favicons/favicon-32.png -------------------------------------------------------------------------------- /public/favicons/favicon-57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/srijans38/youtube-playlist-calculator/HEAD/public/favicons/favicon-57.png -------------------------------------------------------------------------------- /public/favicons/favicon-60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/srijans38/youtube-playlist-calculator/HEAD/public/favicons/favicon-60.png -------------------------------------------------------------------------------- /public/favicons/favicon-64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/srijans38/youtube-playlist-calculator/HEAD/public/favicons/favicon-64.png -------------------------------------------------------------------------------- /public/favicons/favicon-70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/srijans38/youtube-playlist-calculator/HEAD/public/favicons/favicon-70.png -------------------------------------------------------------------------------- /public/favicons/favicon-72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/srijans38/youtube-playlist-calculator/HEAD/public/favicons/favicon-72.png -------------------------------------------------------------------------------- /public/favicons/favicon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/srijans38/youtube-playlist-calculator/HEAD/public/favicons/favicon-76.png -------------------------------------------------------------------------------- /public/favicons/favicon-96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/srijans38/youtube-playlist-calculator/HEAD/public/favicons/favicon-96.png -------------------------------------------------------------------------------- /public/favicons/favicon-114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/srijans38/youtube-playlist-calculator/HEAD/public/favicons/favicon-114.png -------------------------------------------------------------------------------- /public/favicons/favicon-120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/srijans38/youtube-playlist-calculator/HEAD/public/favicons/favicon-120.png -------------------------------------------------------------------------------- /public/favicons/favicon-144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/srijans38/youtube-playlist-calculator/HEAD/public/favicons/favicon-144.png -------------------------------------------------------------------------------- /public/favicons/favicon-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/srijans38/youtube-playlist-calculator/HEAD/public/favicons/favicon-150.png -------------------------------------------------------------------------------- /public/favicons/favicon-152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/srijans38/youtube-playlist-calculator/HEAD/public/favicons/favicon-152.png -------------------------------------------------------------------------------- /public/favicons/favicon-160.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/srijans38/youtube-playlist-calculator/HEAD/public/favicons/favicon-160.png -------------------------------------------------------------------------------- /public/favicons/favicon-180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/srijans38/youtube-playlist-calculator/HEAD/public/favicons/favicon-180.png -------------------------------------------------------------------------------- /public/favicons/favicon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/srijans38/youtube-playlist-calculator/HEAD/public/favicons/favicon-192.png -------------------------------------------------------------------------------- /public/favicons/favicon-310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/srijans38/youtube-playlist-calculator/HEAD/public/favicons/favicon-310.png -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "presets": [ 3 | [ 4 | "@vue/app", 5 | { 6 | "useBuiltIns": "entry" 7 | } 8 | ] 9 | ] 10 | } -------------------------------------------------------------------------------- /vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/plugins/bootstrap-vue.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | 3 | import BootstrapVue from 'bootstrap-vue' 4 | import 'bootstrap/dist/css/bootstrap.min.css' 5 | import 'bootstrap-vue/dist/bootstrap-vue.css' 6 | 7 | Vue.use(BootstrapVue) 8 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import '@babel/polyfill' 2 | import 'mutationobserver-shim' 3 | import Vue from 'vue' 4 | import './plugins/bootstrap-vue' 5 | import App from './App.vue' 6 | 7 | Vue.config.productionTip = false 8 | 9 | new Vue({ 10 | render: h => h(App), 11 | }).$mount('#app') 12 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 17 | 18 | 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | # local env files 6 | .env.local 7 | .env.*.local 8 | .env 9 | .env.build 10 | 11 | # Log files 12 | npm-debug.log* 13 | yarn-debug.log* 14 | yarn-error.log* 15 | 16 | # Editor directories and files 17 | .idea 18 | .vscode 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? 24 | -------------------------------------------------------------------------------- /vue.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/favicons/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | #FFFFFF 9 | 10 | 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Logo](ytplcalc.png) 2 | 3 | ## Usage 4 | 5 | Calculates the total duration of a given YouTube playlist. 6 | Just paste a URL with the `list` query parameter and hit Go. 7 | 8 | _Live at: https://youtube-playlist-calculator.now.sh_ 9 | 10 | ## Created with 11 | 12 | ![Vue.js](vue.svg) ![Vercel](vercel.svg) 13 | 14 | [Vue.js](https://vuejs.org/) and [Vercel](https://vercel.com/) -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build", 8 | "lint": "vue-cli-service lint", 9 | "dev": "vue-cli-service serve --port $PORT" 10 | }, 11 | "dependencies": { 12 | "axios": "^0.19.2", 13 | "bootstrap-vue": "^2.1.0", 14 | "core-js": "^2.6.5", 15 | "humanize-duration": "^3.22.0", 16 | "iso8601-duration": "^1.2.0", 17 | "moment": "^2.25.0", 18 | "vue": "^2.6.10" 19 | }, 20 | "devDependencies": { 21 | "@babel/polyfill": "^7.7.0", 22 | "@vue/cli-plugin-babel": "^3.9.0", 23 | "@vue/cli-plugin-eslint": "^3.9.0", 24 | "@vue/cli-service": "^3.9.0", 25 | "babel-eslint": "^10.0.1", 26 | "bootstrap": "^4.3.1", 27 | "eslint": "^5.16.0", 28 | "eslint-plugin-vue": "^5.0.0", 29 | "mutationobserver-shim": "^0.3.3", 30 | "popper.js": "^1.16.0", 31 | "portal-vue": "^2.1.6", 32 | "sass": "^1.19.0", 33 | "sass-loader": "^8.0.0", 34 | "vue-cli-plugin-bootstrap-vue": "~0.6.0", 35 | "vue-template-compiler": "^2.6.10" 36 | }, 37 | "eslintConfig": { 38 | "root": true, 39 | "env": { 40 | "node": true 41 | }, 42 | "extends": [ 43 | "plugin:vue/essential", 44 | "eslint:recommended" 45 | ], 46 | "rules": { 47 | "no-console": "off" 48 | }, 49 | "parserOptions": { 50 | "parser": "babel-eslint" 51 | } 52 | }, 53 | "postcss": { 54 | "plugins": { 55 | "autoprefixer": {} 56 | } 57 | }, 58 | "browserslist": [ 59 | "> 1%", 60 | "last 2 versions" 61 | ] 62 | } 63 | -------------------------------------------------------------------------------- /src/api/index.js: -------------------------------------------------------------------------------- 1 | import axios from "axios"; 2 | import moment from 'moment'; 3 | 4 | var key = process.env.VUE_APP_GOOGLE; 5 | 6 | export const getPlaylistDataAPI = async (listId, nextPageToken) => { 7 | try { 8 | var url = `https://www.googleapis.com/youtube/v3/playlistItems?playlistId=${listId}&part=snippet&key=${key}&fields=nextPageToken,items(snippet(publishedAt,title,description,thumbnails(medium),position,resourceId(videoId)))&maxResults=50&pageToken=${nextPageToken}` 9 | const response = await axios.get(url); 10 | return response; 11 | } catch (error) { 12 | console.error(error); 13 | } 14 | } 15 | 16 | export const getPlaylistInfoAPI = async (listId) => { 17 | try { 18 | var url = `https://www.googleapis.com/youtube/v3/playlists?id=${listId}&part=snippet&key=${key}&fields=items(snippet(title,description))` 19 | const response = await axios.get(url); 20 | const { data : { items : [ { snippet } ] } } = response; 21 | return snippet; 22 | } catch (error) { 23 | console.log(error); 24 | } 25 | } 26 | 27 | export const getVideoDurationAPI = async (videosIds) => { 28 | let durations = {}; 29 | try { 30 | for(var chunk of videosIds) { 31 | var url = `https://www.googleapis.com/youtube/v3/videos?part=contentDetails&id=${chunk.join()}&maxResults=50&fields=items(id,contentDetails(duration))&key=${key}` 32 | const response = await axios.get(url); 33 | var { items } = response.data; 34 | items.map((item) => { 35 | var { id, contentDetails: { duration }} = item; 36 | durations[id] = moment.duration(duration).asSeconds(); 37 | }); 38 | } 39 | return durations; 40 | } catch (error) { 41 | console.error(error) 42 | } 43 | } -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 11 | 12 | 13 | 18 | 24 | 30 | 36 | 42 | 48 | 54 | 58 | 63 | 68 | 73 | 78 | 83 | 88 | 93 | 98 | 99 | 103 | 107 | 108 | 112 | 113 | 114 | 115 | 119 | 123 | 128 | 133 | 134 | Youtube Playlist Calculator 135 | 140 | 141 | 142 | 148 |
149 | 150 | 151 | 152 | -------------------------------------------------------------------------------- /src/components/Home.vue: -------------------------------------------------------------------------------- 1 | 111 | 112 | 266 | 267 | 268 | 296 | --------------------------------------------------------------------------------