< html lang = "en" >
< head >
< meta charset = "utf-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1" >
< meta http-equiv = "cache-control" content = "no-cache" / >
< title > RedditVideoMakerBot< / title >
< link rel = "stylesheet" href = "https://cdn.jsdelivr.net/npm/bootstrap@4.1.3/dist/css/bootstrap.min.css"
integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
< link href = "https://getbootstrap.com/docs/5.2/dist/css/bootstrap.min.css" rel = "stylesheet" >
< link rel = "stylesheet" href = "https://cdn.jsdelivr.net/npm/bootstrap-icons@1.8.3/font/bootstrap-icons.css" >
< style >
.bd-placeholder-img {
font-size: 1.125rem;
text-anchor: middle;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
}
@media (min-width: 768px) {
.bd-placeholder-img-lg {
font-size: 3.5rem;
}
}
.b-example-divider {
height: 3rem;
background-color: rgba(0, 0, 0, .1);
border: solid rgba(0, 0, 0, .15);
border-width: 1px 0;
box-shadow: inset 0 .5em 1.5em rgba(0, 0, 0, .1), inset 0 .125em .5em rgba(0, 0, 0, .15);
}
.b-example-vr {
flex-shrink: 0;
width: 1.5rem;
height: 100vh;
}
.bi {
vertical-align: -.125em;
fill: currentColor;
}
.nav-scroller {
position: relative;
z-index: 2;
height: 2.75rem;
overflow-y: hidden;
}
.nav-scroller .nav {
display: flex;
flex-wrap: nowrap;
padding-bottom: 1rem;
margin-top: -1px;
overflow-x: auto;
text-align: center;
white-space: nowrap;
-webkit-overflow-scrolling: touch;
}
#tooltip {
background-color: #333;
color: white;
padding: 5px 10px;
border-radius: 4px;
font-size: 13px;
}
< / style >
< / head >
< body >
< header >
{% if get_flashed_messages() %}
{% for category, message in get_flashed_messages(with_categories=true) %}
{% if category == "error" %}
< div class = "alert alert-danger mb-0 text-center" role = "alert" >
{{ message }}
< / div >
{% else %}
< div class = "alert alert-success mb-0 text-center" role = "alert" >
{{ message }}
< / div >
{% endif %}
{% endfor %}
{% endif %}
< div class = "navbar navbar-dark bg-dark shadow-sm" >
< div class = "container" >
< a href = "#" class = "navbar-brand d-flex align-items-center" >
< svg xmlns = "http://www.w3.org/2000/svg" width = "20" height = "20" fill = "none" stroke = "currentColor"
stroke-linecap="round" stroke-linejoin="round" stroke-width="2" aria-hidden="true" class="me-2"
viewBox="0 0 24 24">
< path d = "M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z" / >
< circle cx = "12" cy = "13" r = "4" / >
< / svg >
< strong > RedditVideoMakerBot< / strong >
< / a >
<!-- Button trigger modal -->
< button type = "button" class = "btn btn-primary" data-toggle = "modal" data-target = "#backgroundModal" >
Add background video
< / button >
<!-- Modal -->
< div class = "modal fade" id = "backgroundModal" tabindex = "-1" role = "dialog" aria-labelledby = "backgroundModalLabel"
aria-hidden="true">
< div class = "modal-dialog" role = "document" >
< div class = "modal-content" >
< div class = "modal-header" >
< h5 class = "modal-title" id = "backgroundModalLabel" > Add Background Video< / h5 >
< button type = "button" class = "close" data-dismiss = "modal" aria-label = "Close" >
< span aria-hidden = "true" > × < / span >
< / button >
< / div >
< div class = "modal-body" >
<!-- Add video form -->
< form action = "/add_background" method = "post" >
< div class = "form-group row" >
< label class = "col-4 col-form-label" for = "youtube_uri" > YouTube URI< / label >
< div class = "col-8" >
< div class = "input-group" >
< div class = "input-group-prepend" >
< div class = "input-group-text" >
< i class = "bi bi-youtube" > < / i >
< / div >
< / div >
< input id = "youtube_uri" name = "youtube_uri" placeholder = "https://www.youtube.com/watch?v=..."
type="text" class="form-control" required="required">
< / div >
< / div >
< / div >
< div class = "form-group row" >
< label for = "filename" class = "col-4 col-form-label" > Filename< / label >
< div class = "col-8" >
< div class = "input-group" >
< div class = "input-group-prepend" >
< div class = "input-group-text" >
< i class = "bi bi-file-earmark" > < / i >
< / div >
< / div >
< input id = "filename" name = "filename" placeholder = "example: cool-background" type = "text"
aria-describedby="filenameHelpBlock" required="required" class="form-control">
< / div >
< / div >
< / div >
< div class = "form-group row" >
< label for = "citation" class = "col-4 col-form-label" > Credits (owner of the video)< / label >
< div class = "col-8" >
< div class = "input-group" >
< div class = "input-group-prepend" >
< div class = "input-group-text" >
< i class = "bi bi-person-circle" > < / i >
< / div >
< / div >
< input id = "citation" name = "citation" placeholder = "YouTube Channel" type = "text"
class="form-control" required="required" aria-describedby="citationHelpBlock">
< / div >
< span id = "citationHelpBlock" class = "form-text text-muted" > Include the channel name of the owner of
the background video you are adding.< / span >
< / div >
< / div >
< div class = "form-group row" >
< label for = "position" class = "col-4 col-form-label" > Position of screenshots< / label >
< div class = "col-8" >
< div class = "input-group" >
< div class = "input-group-prepend" >
< div class = "input-group-text" >
< i class = "bi bi-arrows-fullscreen" > < / i >
< / div >
< / div >
< input id = "position" name = "position" placeholder = "Example: center" type = "text"
class="form-control" aria-describedby="positionHelpBlock">
< / div >
< span id = "positionHelpBlock" class = "form-text text-muted" > Advanced option (you can leave it
empty). Valid options are "center" and decimal numbers< / span >
< / div >
< / div >
< / div >
< div class = "modal-footer" >
< button type = "button" class = "btn btn-secondary" data-dismiss = "modal" > Close< / button >
< button name = "submit" type = "submit" class = "btn btn-primary" > Add background< / button >
< / form >
< / div >
< / div >
< / div >
< / div >
< / div >
< / div >
< / header >
< main >
< div class = "album py-2 bg-light" >
< div class = "container" >
< div class = "row mt-2" >
< div class = "col-12 col-md-3 mb-3" >
< input type = "text" class = "form-control" placeholder = "Search videos" aria-label = "Search videos"
onkeyup="searchFilter()">
< / div >
< / div >
< div class = "grid row row-cols-1 row-cols-sm-2 row-cols-md-3 g-3" id = "videos" >
< / div >
< / div >
< / div >
< / main >
< footer class = "text-muted py-5" >
< div class = "container" >
< p class = "float-end mb-1" >
< a href = "#" > Back to top< / a >
< / p >
< p class = "mb-1" > < a href = "https://getbootstrap.com/docs/5.2/examples/album/" target = "_blank" > Album< / a > Example
Theme by © Bootstrap. < a
href="https://github.com/elebumm/RedditVideoMakerBot/blob/master/README.md#developers-and-maintainers"
target="_blank">Developers and Maintainers< / a > < / p >
< p class = "mb-0" > If your data is not refreshing, try to hard reload(Ctrl + F5) and visit your local < a
href="../video_creation/data/videos.json" target="_blank">videos.json< / a > file.< / p >
< / div >
< / footer >
< script src = "https://code.jquery.com/jquery-3.1.1.js" integrity = "sha256-16cdPddA6VdVInumRGo6IbivbERE8p7CQR3HzTBuELA="
crossorigin="anonymous">< / script >
< script src = "https://cdn.jsdelivr.net/npm/popper.js@1.14.3/dist/umd/popper.min.js"
integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49"
crossorigin="anonymous">< / script >
< script src = "https://cdn.jsdelivr.net/npm/bootstrap@4.1.3/dist/js/bootstrap.min.js"
integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy"
crossorigin="anonymous">< / script >
< script src = "https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.10/clipboard.min.js" > < / script >
< script src = "https://unpkg.com/isotope-layout@3/dist/isotope.pkgd.js" > < / script >
< script >
const intervals = [
{ label: 'year', seconds: 31536000 },
{ label: 'month', seconds: 2592000 },
{ label: 'day', seconds: 86400 },
{ label: 'hour', seconds: 3600 },
{ label: 'minute', seconds: 60 },
{ label: 'second', seconds: 1 }
];
function timeSince(date) {
const seconds = Math.floor((Date.now() / 1000 - date));
const interval = intervals.find(i => i.seconds < seconds ) ;
const count = Math.floor(seconds / interval.seconds);
return `${count} ${interval.label}${count !== 1 ? 's' : ''} ago`;
}
$(document).ready(function () {
$.getJSON("videos.json",
function (data) {
data.sort((b, a) => a['time'] - b['time'])
var video = '';
$.each(data, function (key, value) {
video += '< div class = "col" > ';
video += '< div class = "card shadow-sm" > ';
//keeping original themed image card for future thumbnail usage video += '< svg class = "bd-placeholder-img card-img-top" width = "100%" height = "225" xmlns = "http://www.w3.org/2000/svg" role = "img" aria-label = "Placeholder: Thumbnail" preserveAspectRatio = "xMidYMid slice" focusable = "false" > < title > Placeholder< / title > < rect width = "100%" height = "100%" fill = "#55595c" / > < text x = "50%" y = "50%" fill = "#eceeef" dy = ".3em" > r/'+value.subreddit+'< / text > < / svg > ';
video += '< div class = "card-body" > ';
video += '< p class = "card-text" > r/' + value.subreddit + ' • ' + checkTitle(value.reddit_title, value.filename) + '< / p > ';
video += '< div class = "d-flex justify-content-between align-items-center" > ';
video += '< div class = "btn-group" > ';
video += '< a href = "https://www.reddit.com/r/' + value.subreddit + '/comments/' + value.id + '/" class = "btn btn-sm btn-outline-secondary" target = "_blank" > View< / a > ';
video += '< a href = "http://localhost:4000/results/' + value.subreddit + '/' + value.filename + '" class = "btn btn-sm btn-outline-secondary" download > Download< / a > ';
video += '< / div > ';
video += '< div class = "btn-group" > ';
video += '< button type = "button" data-toggle = "tooltip" id = "copy" data-original-title = "Copy to clipboard" class = "btn btn-sm btn-outline-secondary" data-clipboard-text = "' + getCopyData(value.subreddit, value.reddit_title, value.filename, value.background_credit) + '" > < i class = "bi bi-card-text" > < / i > < / button > ';
video += '< button type = "button" data-toggle = "tooltip" id = "copy" data-original-title = "Copy to clipboard" class = "btn btn-sm btn-outline-secondary" data-clipboard-text = "' + checkTitle(value.reddit_title, value.filename) + ' #Shorts #reddit" > < i class = "bi bi-youtube" > < / i > < / button > ';
video += '< button type = "button" data-toggle = "tooltip" id = "copy" data-original-title = "Copy to clipboard" class = "btn btn-sm btn-outline-secondary" data-clipboard-text = "' + checkTitle(value.reddit_title, value.filename) + ' #reddit" > < i class = "bi bi-instagram" > < / i > < / button > ';
video += '< / div > ';
video += '< small class = "text-muted" > ' + timeSince(value.time) + '< / small > ';
video += '< / div > ';
video += '< / div > ';
video += '< / div > ';
video += '< / div > ';
});
$('#videos').append(video);
});
});
$(document).ready(function () {
$('[data-toggle="tooltip"]').tooltip();
$('[data-toggle="tooltip"]').on('click', function () {
$(this).tooltip('hide');
});
});
$('#copy').tooltip({
trigger: 'click',
placement: 'bottom'
});
function setTooltip(btn, message) {
$(btn).tooltip('hide')
.attr('data-original-title', message)
.tooltip('show');
}
function hoverTooltip(btn, message) {
$(btn).tooltip('hide')
.attr('data-original-title', message)
.tooltip('show');
}
function hideTooltip(btn) {
setTimeout(function () {
$(btn).tooltip('hide');
}, 1000);
}
function disposeTooltip(btn) {
setTimeout(function () {
$(btn).tooltip('dispose');
}, 1500);
}
var clipboard = new ClipboardJS('#copy');
clipboard.on('success', function (e) {
e.clearSelection();
console.info('Action:', e.action);
console.info('Text:', e.text);
console.info('Trigger:', e.trigger);
setTooltip(e.trigger, 'Copied!');
hideTooltip(e.trigger);
disposeTooltip(e.trigger);
});
clipboard.on('error', function (e) {
console.error('Action:', e.action);
console.error('Trigger:', e.trigger);
setTooltip(e.trigger, fallbackMessage(e.action));
hideTooltip(e.trigger);
});
function getCopyData(subreddit, reddit_title, filename, background_credit) {
if (subreddit == undefined) {
subredditCopy = "";
} else {
subredditCopy = "r/" + subreddit + "\n\n";
}
const file = filename.slice(0, -4);
if (reddit_title == file) {
titleCopy = reddit_title;
} else {
titleCopy = file;
}
var copyData = "";
copyData += subredditCopy;
copyData += titleCopy;
copyData += "\n\nBackground credit: " + background_credit;
return copyData;
}
function getLink(subreddit, id, reddit_title) {
if (subreddit == undefined) {
return reddit_title;
} else {
return "< a target = '_blank' href = 'https://www.reddit.com/r/" + subreddit + "/comments/" + id + "/' > " + reddit_title + "< / a > ";
}
}
function checkTitle(reddit_title, filename) {
const file = filename.slice(0, -4);
if (reddit_title == file) {
return reddit_title;
} else {
return file;
}
}
var searchFilter = () => {
const input = document.querySelector(".form-control");
const cards = document.getElementsByClassName("col");
console.log(cards[1])
let filter = input.value
for (let i = 0; i < cards.length ; i + + ) {
let title = cards[i].querySelector(".card-text");
if (title.innerText.toLowerCase().indexOf(filter.toLowerCase()) > -1) {
cards[i].classList.remove("d-none")
} else {
cards[i].classList.add("d-none")
}
}
}
< / script >
< / body >
< / html >