1
0
mirror of https://github.com/mxpv/podsync.git synced 2024-05-11 05:55:04 +00:00

Clean up old frontend code

This commit is contained in:
Maksym Pavlenko
2019-06-02 19:33:43 -07:00
parent 536d060ccd
commit de42b3fcab
18 changed files with 0 additions and 10112 deletions

View File

@@ -22,9 +22,3 @@ test:
up:
docker-compose pull
docker-compose up -d
.PHONY: static
static:
- rm -rf dist/
npm install
npm run build

View File

@@ -1,399 +0,0 @@
@import url('https://fonts.googleapis.com/css?family=Ubuntu');
[v-cloak] {
display: none;
}
body {
margin: 0;
padding: 0;
font-family: 'Ubuntu', sans-serif;
background-color: #f4eddb;
}
a {
color: #EB8C11;
text-decoration: none;
}
.pad10 {
padding: 10px;
}
.black {
color: #000000;
}
.background-image {
background-image: url('/assets/img/pc_bg.png');
-ms-background-repeat: repeat-x;
background-repeat: repeat-x;
-ms-background-position: center bottom;
background-position: center bottom;
position: absolute;
width: 100%;
top: 0;
left: 0;
bottom: 0;
margin: 0;
padding: 0;
-webkit-user-select: text;
z-index: 0;
}
/* Footer */
.footer {
background-image: url('/assets/img/pc_footer.png');
-ms-background-repeat: space;
background-repeat: space;
-ms-background-position: center bottom;
background-position: center bottom;
background-color: #aca496;
position: absolute;
width: 100%;
height: 69px;
left: 0;
bottom: 0;
margin: 0;
padding: 0;
-webkit-user-select: text;
z-index: -1;
}
.footer-links {
position: absolute;
right: 2em;
bottom: 0;
font-size: 3em;
}
.footer-links a {
color: rgb(62, 62, 41);
}
.footer-links a:hover {
color: rgb(33, 33, 26);
background: none;
}
/* Header */
.title {
padding: 50px;
}
.title h1 {
margin: 0;
}
.title h2 {
max-width: 500px;
font-weight: normal;
font-size: 1em;
}
.login-block {
color: #e18712;
font-size: 1em;
overflow: hidden;
}
.login-border, .login-border a {
float: left;
background: orange;
color: whitesmoke;
border: 1px orange;
padding: 3px;
border-radius: 2px;
font-size: 15px;
}
/* Main block + input */
.shadow {
box-shadow: 0 12px 8px -6px #a79d87;
box-shadow: 0 12px 8px -6px rgba(167, 157, 135, 0.4);
}
.main {
text-align: center;
padding: 5em 2em 10em;
max-width: 860px;
width: 90%;
margin: 0 auto;
padding: 3em 0;
text-align: left;
}
.main-border {
border: thin solid #a39c8e;
background: #f4ecda;
}
.input-border {
background-color: #e4dac8;
border: none;
border-bottom: 1px solid #a39c8e;
}
.main-border input {
border: none;
padding: 0.5em 0 0.5em 0.5em;
width: calc(100% - 2em);
font-size: 2em;
line-height: 1;
color: #616161;
background: transparent;
}
*:focus {
outline: none;
}
/* Input button (arrow) */
.arrow-button {
float: right;
font-size: 2em;
padding-top: 0.5em;
padding-right: 0.3em;
}
.arrow-button a {
color: rgb(142, 134, 119);
}
.arrow-button a:hover {
background: none;
color: rgb(105, 98, 86);
}
/* Controls under input */
.controls {
padding-left: 1em;
word-spacing: 0.15em;
margin: 12px 0 12px 0;
overflow: hidden;
}
.controls-icon {
float: left;
padding-right: 6px;
}
.switch-field {
float: left;
font-size: 1em;
padding-right: 7px;
}
.switch-title {
display: inline-block;
float: left;
padding-right: 5px;
}
.switch-field input {
position: absolute !important;
clip: rect(0, 0, 0, 0);
height: 1px;
width: 1px;
border: 0;
overflow: hidden;
}
.switch-field label {
float: left;
display: inline-block;
color: #EB8C11;
padding: 0 2px;
}
.switch-field label:hover {
cursor: pointer;
}
.switch-field input:checked + label {
background: orange;
color: whitesmoke;
border: 1px orange;
-ms-border-top-right-radius: 3px;
-ms-border-top-left-radius: 3px;
-ms-border-bottom-right-radius: 3px;
-ms-border-bottom-left-radius: 3px;
border-radius: 3px;
}
.locked {
-ms-opacity: 0.3;
opacity: 0.2;
}
/* Man image */
.man {
width: 210px;
height: 333px;
background-image: url('/assets/img/man.png');
-ms-background-repeat: no-repeat;
background-repeat: no-repeat;
-ms-background-position: center bottom;
background-position: center bottom;
background-color: transparent;
position: absolute;
bottom: 100px;
left: 30%;
margin: 0;
padding: 0;
z-index: -1;
}
/* Patreon block */
.patreon {
background: rgb(171, 163, 149);
border: 1px rgb(240, 232, 214) solid;
bottom: 6em;
float: right;
position: absolute;
right: 2em;
z-index: -1;
}
/* Placeholder */
::-webkit-input-placeholder { color: rgb(171, 163, 149); } /* Chrome/Opera/Safari */
::-moz-placeholder { color: rgb(171, 163, 149); } /* Firefox 19+ */
:-ms-input-placeholder { color: rgb(171, 163, 149); } /* IE 10+ */
:-moz-placeholder { color: rgb(171, 163, 149); } /* Firefox 18- */
/* Tooltips */
.tooltip {
display: none;
position: absolute;
background: rgb(171, 163, 149);
border: 1px rgb(244, 236, 218) solid;
padding: 10px;
color: #4a4030;
max-width: 350px;
}
/* Modal popup */
.modal {
position: fixed;
top: 20%;
left: 50%;
width: 50%;
max-width: 700px;
-ms-transform: translate3d(-50%,-50%, 0);
-webkit-transform: translate3d(-50%,-50%, 0);
transform: translate3d(-50%,-50%, 0);
height: 80px;
background: #56524b;
text-align: center;
z-index: 10;
outline: 9999px solid rgba(0,0,0,0.8);
padding: 10px;
}
.modal > input {
width: 100%;
font-size: 3em;
border: none;
background: none;
border-bottom: 1px dotted black;
}
.modal-links {
padding-top: 5px;
}
.modal-links span {
padding-right: 15px;
}
.modal-links a:hover {
color: #EB8C11;
background: rgb(68, 65, 60);
}
@media screen and (max-width: 640px) {
.background-image {
background-image: url('/assets/img/mobile_bg.png')
}
.footer {
background-image: url('/assets/img/mobile_footer.png');
height: 50px;
}
.title {
padding: 20px;
}
.main {
padding: 0;
}
.controls {
word-spacing: 0;
font-size: 1em;
}
.patreon {
right: 2em;
}
.man {
background-image: none;
}
}
@media screen and (max-width: 1024px) {
.modal {
width: 90%;
}
}
@media only screen and (max-device-width: 1024px) {
.modal > input {
font-size: 1.9em;
padding: 0;
padding-bottom: 15px;
}
.modal-links span {
padding-right: 30px;
}
}
@media screen and (max-height: 640px) {
.patreon {
width: 300px;
bottom: 4em;
}
.man {
display: none;
}
}
@media screen and (max-height: 400px) {
.patreon {
display: none;
}
}
@media screen and (max-height: 840px) {
.title {
padding-top: 1em;
padding-bottom: 1em;
}
.main {
padding-top: 0;
}
}

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

View File

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -1,109 +0,0 @@
var app = new Vue({
el: '#app',
data: {
link: '',
format: 'video',
quality: 'high',
count: 50,
showModal: false,
feedLink: '',
featureLevel: 0,
userId: '',
fullName: '',
},
methods: {
submit: function() {
var vm = this;
if (vm.link === '') {
return;
}
axios.post('/api/create', {
url: this.link,
format: this.format,
quality: this.quality,
page_size: this.count,
}).then(function(response) {
vm.feedLink = vm.formatLink(response.data.id);
vm.showModal = true;
vm.link = '';
}).catch(vm.httpError);
},
httpError: function(error) {
try {
this.showError(error.response.data.error);
} catch (e) {
console.error(e);
this.showError(error.message);
}
},
showError: function(msg) {
alert(msg);
},
formatLink: function(id) {
if (location.port === '80' || location.port === '443') {
return location.protocol + '//' + location.hostname + '/' + id;
} else {
return location.protocol + '//' + location.host + '/' + id;
}
},
copyLink: function() {
if (!this.showModal || !this.canCopy) {
return
}
this.$refs.output.select();
if (!document.execCommand('copy')) {
self.showError('Can\'t copy... Something went wrong...');
}
}
},
computed: {
locked: function() {
return this.featureLevel === 0;
},
isMobile: function() {
return /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);
},
canCopy: function() {
try {
return document.queryCommandSupported('copy') && !this.isMobile;
} catch (e) {
return false;
}
},
allow600pages: function() {
return !this.locked && this.featureLevel >= 2;
}
},
mounted: function() {
var vm = this;
window.addEventListener('keydown', function(event) {
// ESC handler
if (event.keyCode === 27 && vm.showModal) {
vm.showModal = false;
}
});
axios.get('/api/user').then(function (response) {
vm.userId = response.data.user_id;
vm.featureLevel = response.data.feature_level;
vm.fullName = response.data.full_name;
}).catch(function() {});
}
});

View File

@@ -1,86 +0,0 @@
const gulp = require('gulp'),
del = require('del'),
path = require('path'),
uglify = require('gulp-uglify'),
rev = require('gulp-rev'),
revreplace = require('gulp-rev-replace'),
cleancss = require('gulp-clean-css'),
autoprefixer = require('gulp-autoprefixer'),
size = require('gulp-size'),
gulpif = require('gulp-if'),
imagemin = require('gulp-imagemin'),
nunjucks = require('gulp-nunjucks'),
browserSync = require('browser-sync').create();
abs = path.join(process.cwd(), 'assets');
const config = {
images: './assets/**/*.{png,ico}',
scripts: ['./assets/js/**/*.js', './assets/css/**/*.css'],
html: './templates/[^_]*.html',
dist: {
assets: './dist/assets/',
html: './dist/html/',
},
};
// Clean up artifacts
const clean = function() {
return del(['./dist/**/*'])
};
// Minify images and output to ./dist folder
const img = function() {
return gulp.src(config.images)
.pipe(imagemin())
.pipe(size())
.pipe(gulp.dest(config.dist.assets))
};
// Minify scripts, build manifest.json and output to ./dist folder
const scripts = function() {
return gulp.src(config.scripts, {base: abs})
.pipe(gulpif(/js$/, uglify()))
.pipe(gulpif(/css$/, autoprefixer()))
.pipe(gulpif(/css$/, cleancss()))
.pipe(rev())
.pipe(size())
.pipe(gulp.dest(config.dist.assets))
.pipe(rev.manifest('manifest.json', {merge: true}))
.pipe(gulp.dest(config.dist.assets));
};
// Rewrite occurrences of scripts in template files
const html = function() {
const manifest = gulp.src('./dist/assets/manifest.json');
return gulp.src(config.html)
.pipe(nunjucks.compile())
.pipe(revreplace({manifest: manifest}))
.pipe(gulp.dest(config.dist.html))
};
const dev = function(cb) {
browserSync.init({
server: ['./dist/html/', './dist/'],
port: 8080,
watch: true,
});
gulp.watch(config.images, img);
gulp.watch(config.scripts, gulp.series(scripts, html));
gulp.watch(config.html, html);
cb();
};
const build = gulp.series(
clean,
gulp.parallel(
img,
gulp.series(scripts, html)
),
);
exports.default = build;
exports.dev = gulp.series(build, dev);

9187
package-lock.json generated
View File

File diff suppressed because it is too large Load Diff

View File

@@ -1,36 +0,0 @@
{
"name": "podsync",
"version": "1.0.0",
"description": "",
"main": "gulpfile.js",
"dependencies": {},
"devDependencies": {
"browser-sync": "^2.26.3",
"del": "^3.0.0",
"gulp": "^4.0.0",
"gulp-autoprefixer": "^4.0.0",
"gulp-clean-css": "^3.7.0",
"gulp-if": "^2.0.2",
"gulp-imagemin": "^3.3.0",
"gulp-nunjucks": "^4.0.0",
"gulp-rev": "^8.0.0",
"gulp-rev-replace": "^0.4.3",
"gulp-size": "^2.1.0",
"gulp-uglify": "^3.0.0"
},
"scripts": {
"build": "gulp -v && gulp",
"dev": "gulp dev",
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/mxpv/Podsync.git"
},
"author": "",
"license": "ISC",
"bugs": {
"url": "https://github.com/mxpv/Podsync/issues"
},
"homepage": "https://github.com/mxpv/Podsync#readme"
}

View File

@@ -1,66 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8"/>
<meta charset="utf-8"/>
<title>Podsync - Turn YouTube channels into podcast feeds</title>
<meta property="og:title" content="Podsync - turn YouTube channels into podcast feeds"/>
<meta property="og:description"
content="Simple and free service that lets you listen to any YouTube or Vimeo channels, playlists or user videos in podcast format"/>
<meta property="og:locale" content="en_US"/>
<meta property="og:image" content="/assets/img/og_image.png"/>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description"
content="Simple and free service that lets you listen to any YouTube or Vimeo channels, playlists or user videos in podcast format"/>
{% block link %}
<link rel="icon" type="image/x-icon" href="/assets/favicon.ico"/>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"/>
<link rel="stylesheet" href="assets/css/site.css"/>
{% endblock %}
</head>
<body>
{% block body %}
{% endblock %}
{% block scripts %}
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script src="assets/js/site.js"></script>
{% endblock %}
{% block analytics %}
<script>
(function (i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r;
i[r] = i[r] || function () {
(i[r].q = i[r].q || []).push(arguments)
}, i[r].l = 1 * new Date();
a = s.createElement(o),
m = s.getElementsByTagName(o)[0];
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m)
})(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');
ga('create', 'UA-64237526-1', 'auto');
ga('send', 'pageview');
</script>
{% endblock %}
{% block support %}
<script>
(function (w, i, d, g, e, t, s) {
w[d] = w[d] || [];
t = i.createElement(g);
t.async = 1;
t.src = e;
s = i.getElementsByTagName(g)[0];
s.parentNode.insertBefore(t, s);
})(window, document, '_gscq', 'script', '//widgets.getsitecontrol.com/23626/script.js');
</script>
{% endblock %}
</body>
</html>

View File

@@ -1,80 +0,0 @@
{% extends "_base.html" %}
{% block body %}
<div class="background-image">
<div class="pad10">
<div class="pad10 main-border">
<h1>FAQ</h1>
<ol>
<li>
<h3>
Can I delete my feed?
</h3>
<p>
Not manually. Feeds are automatically deleted if not used for more than 90 days.
</p>
</li>
<li>
<h3>
I am trying to turn the link below into a podcast form (to listen to on my phone) and it doesn't seem to be working?
https://www.youtube.com/watch?v=XXxxxXXxXxX
</h3>
<p>
Podsync can't build a feed from just one video. You have to provide a link either to a channel, user, or playlist.
</p>
</li>
<li>
<h3>
Audio podcast is double the length of the video, and the second half is silent
</h3>
<p>
This is known issue. Unfortunately as of now I don't have any fix for this.
</p>
</li>
<li>
<h3>
I am trying to download some files, but it is giving the following error "Download failed, error code 403 forbidden".
Is there a solution?
</h3>
<p>
That happens because you're in a different region than Podsync.
More details on this <a href="https://www.patreon.com/posts/youtube-playlist-7874992">here</a>.
I've been working on multi-region support, fix is coming soon.
</p>
</li>
<li>
<h3>
Does feeds auto-update as new videos show up on YouTube?
Or do they just represent a snapshot of whenever you generated them?
</h3>
<p>
Feeds are cached for 10 minutes to reduce server loads.
</p>
</li>
<li>
<h3>
Is it possible to get a podcast of all videos in "watch later" on YouTube?
</h3>
<p>
No, that would require "login with your YouTube account" on Podsync.
Instead you might want to create custom playlist and add there videos you want to watch.
</p>
</li>
</ol>
</div>
</div>
<div class="footer">
<div class="footer-links">
<a href="/"><i class="fa fa-home" aria-hidden="true"></i></a>
<a href="https://twitter.com/pod_sync"><i class="fa fa-twitter" aria-hidden="true"></i></a>
</div>
</div>
</div>
{% endblock %}

View File

@@ -1,143 +0,0 @@
{% extends "_base.html" %}
{% block body %}
<div class="background-image" id="app">
<div class="title">
<h1>Podsync</h1>
<h2>
Simple and free service that lets you listen to any YouTube or
Vimeo channels, playlists or user videos in podcast format.
</h2>
<div class="login-block">
<div class="login-border">
<template v-if="!userId">
<a href="/user/login">
<i class="fa fa-unlock" aria-hidden="true"></i>
Login with Patreon to unlock features
</a>
<a href="https://www.patreon.com/bePatron?c=278915">
<i class="fa fa-question-circle-o" aria-hidden="true"></i>
</a>
</template>
<template v-else>
<a>Hey, <i class="fa fa-user-o" aria-hidden="true"></i> {{ fullName }}</a>
<a href="/user/logout"><i class="fa fa-power-off" aria-hidden="true"></i></a>
</template>
</div>
</div>
</div>
<div class="main" v-if="!showModal" v-cloak>
<div class="main-border shadow">
<div class="input-border">
<input v-model="link"
@keyup.enter="submit"
type="text"
placeholder="paste your link here"
spellcheck="false"
autofocus />
<div class="arrow-button">
<a href="#" id="get-link" @click="submit">
<i class="fa fa-arrow-right" aria-hidden="true"></i>
</a>
</div>
</div>
<div class="controls">
<div class="controls-icon">
<template v-if="locked">
<a href="https://www.patreon.com/bePatron?c=278915" class="black">
<i class="fa fa-question-circle master-tooltip"
aria-hidden="true"
title="This features are available for patrons only. You may support us and unlock this features"></i>
</a>
</template>
<template v-else>
<i class="fa fa-wrench" aria-hidden="true"></i>
</template>
</div>
<div :class="{ locked: locked }">
<div class="switch-field">
<div class="switch-title">format </div>
<input type="radio" id="type_video" value="video" name="episode_format" v-model="format" :disabled="locked" />
<label for="type_video">video</label>
<input type="radio" id="type_audio" value="audio" name="episode_format" v-model="format" :disabled="locked" />
<label for="type_audio">audio</label>
</div>
<div class="switch-field">
<div class="switch-title">quality </div>
<input type="radio" id="quality_low" value="low" name="episode_quality" v-model="quality" :disabled="locked" />
<label for="quality_low">low</label>
<input type="radio" id="quality_high" value="high" name="episode_quality" v-model="quality" :disabled="locked" />
<label for="quality_high">high</label>
</div>
<div class="switch-field">
<div class="switch-title">episode count </div>
<input type="radio" id="page_50" value="50" name="page_count" v-model.number="count" :disabled="locked" />
<label for="page_50">50</label>
<input type="radio" id="page_100" value="100" name="page_count" v-model.number="count" :disabled="locked" />
<label for="page_100">100</label>
<input type="radio" id="page_150" value="150" name="page_count" v-model.number="count" :disabled="locked" />
<label for="page_150">150</label>
<input type="radio" id="page_600" value="600" name="page_count" v-model.number="count" :disabled="locked || !allow600pages" />
<label for="page_600" :class="{ locked: !locked && !allow600pages }">600</label>
</div>
</div>
</div>
</div>
</div>
<div class="man"></div>
<div>
<a href="https://www.patreon.com/podsync" target="_blank">
<img class="patreon shadow" width="400" src="assets/img/become_patreon.png"
alt="Become my patron on Patreon"/>
</a>
</div>
<!-- Modal dialog -->
<div v-cloak v-if="showModal" class="modal">
<input type="url" v-model="feedLink" ref="output" readonly />
<div class="modal-links">
<span v-if="canCopy">
<a id="modal-copy" href="#" @click="copyLink">
<i class="fa fa-clone" aria-hidden="true"></i>
Copy
</a>
</span>
<span>
<a id="modal-open" :href="feedLink" target="_blank">
<i class="fa fa-external-link" aria-hidden="true"></i>
Open
</a>
</span>
<span>
<a id="close-modal" href="#" @click="showModal=false">
<i class="fa fa-thumbs-up" aria-hidden="true"></i>
Close
</a>
</span>
</div>
</div>
<div class="footer">
<div class="footer-links">
<a href="./faq.html"><i class="fa fa-question-circle" aria-hidden="true"></i></a>
<a href="https://twitter.com/pod_sync"><i class="fa fa-twitter" aria-hidden="true"></i></a>
</div>
</div>
</div>
{% endblock %}