rra
3 years ago
commit
96912e1c95
4 changed files with 770 additions and 0 deletions
@ -0,0 +1,64 @@ |
|||
#!/bin/python3 |
|||
|
|||
#lumbung.space video feed generator |
|||
#c 2021 roel roscam abbing gpvl3 etc |
|||
|
|||
import peertube |
|||
import jinja2 |
|||
import json |
|||
import os |
|||
import datetime |
|||
|
|||
|
|||
def duration(n): |
|||
""" |
|||
convert '6655' in '1:50:55' |
|||
|
|||
""" |
|||
return str(datetime.timedelta(seconds = n)) |
|||
|
|||
#def base64ify(url): |
|||
#download url to object |
|||
#run base64 lib on object |
|||
#format a data: string |
|||
#return base64string |
|||
|
|||
def linebreaks(text): |
|||
if not text: |
|||
return text |
|||
else: |
|||
import re |
|||
br = re.compile(r"(\r\n|\r|\n)") |
|||
return br.sub(r"<br />\n", text) |
|||
|
|||
|
|||
|
|||
env = jinja2.Environment( |
|||
loader=jinja2.FileSystemLoader(os.path.curdir) |
|||
) |
|||
env.filters['duration'] = duration |
|||
env.filters['linebreaks'] = linebreaks |
|||
|
|||
host = 'https://tv.lumbung.space' |
|||
|
|||
configuration = peertube.Configuration( |
|||
host = host+"/api/v1" |
|||
) |
|||
|
|||
client = peertube.ApiClient(configuration) |
|||
|
|||
v = peertube.VideoApi(client) |
|||
|
|||
response = v.videos_get(count=6, filter='local')#, tags_one_of='audio') |
|||
|
|||
videos = response.to_dict() |
|||
videos = videos['data'] |
|||
|
|||
template = env.get_template('video-feed.html') |
|||
|
|||
html = template.render(videos=videos, host=host) |
|||
|
|||
with open('video-feed-prototype.html','w') as f: |
|||
f.write(html) |
|||
print(html) |
|||
|
@ -0,0 +1,405 @@ |
|||
<!DOCTYPE html> |
|||
<html lang="en" class="no-js"> |
|||
<head> |
|||
<meta charset="UTF-8"> |
|||
<meta name="viewport" content="width=device-width"> |
|||
|
|||
<title>lumbung.space video archive prototype</title> |
|||
|
|||
<meta name="description" content="this page is generated on the basis of a peertube instance"> |
|||
<meta property="og:title" content="lumbung.space video archive prototype"> |
|||
<meta property="og:description" content="this page is generated on the basis of a peertube instance"> |
|||
<meta property="og:image" content="https://tv.lumbung.space/lazy-static/previews/295dcb6d-7409-4bf7-8c3c-97b67b3775bc.jpg"> |
|||
<meta property="og:image:alt" content="Image description"> |
|||
<meta property="og:locale" content="en_GB"> |
|||
<meta property="og:type" content="website"> |
|||
<meta name="twitter:card" content="summary_large_image"> |
|||
<meta property="og:url" content="https://lumbung.space/videofeedprototype.html"> |
|||
<link rel="canonical" href="https://lumbung.space/videofeedprototype.html"> |
|||
|
|||
<link rel="icon" href="/favicon.ico"> |
|||
<link rel="icon" href="/favicon.svg" type="image/svg+xml"> |
|||
<link rel="apple-touch-icon" href="/apple-touch-icon.png"> |
|||
<link rel="manifest" href="/my.webmanifest"> |
|||
<meta name="theme-color" content="#FF00FF"> |
|||
<style type="text/css"> |
|||
@font-face{ |
|||
font-family: "Space Grotesk"; |
|||
src:url('SpaceGrotesk[wght].woff2') |
|||
} |
|||
|
|||
body {font-size:1.3rem;font-family: sans-serif;} |
|||
.wrapper { |
|||
width: 50%; |
|||
margin: auto; |
|||
} |
|||
.video-box { |
|||
border:2px solid #0e0e22; |
|||
max-width:560px; |
|||
margin:auto; |
|||
box-shadow:1em 1em 0 #d2d1c8; |
|||
margin-bottom: 2em; |
|||
} |
|||
.video-box img { |
|||
max-width: 100%; |
|||
} |
|||
.video-box .media { |
|||
line-height: 0; |
|||
} |
|||
|
|||
.metadata{ |
|||
display: flex; |
|||
flex-direction: column; |
|||
background-color: #fff09d; |
|||
font-size:0.9rem; |
|||
} |
|||
|
|||
|
|||
.title{ |
|||
margin-top:0; |
|||
border-top: 2px solid #0e0e22; |
|||
padding:0.5em; |
|||
font-weight:700; |
|||
font-size:1.3rem; |
|||
} |
|||
|
|||
.footer{ |
|||
margin-top:0; |
|||
border-top: 2px solid #0e0e22; |
|||
display: flex; |
|||
justify-content: space-between; |
|||
} |
|||
|
|||
.channel{ |
|||
border-right: 2px solid #0e0e22; |
|||
padding-left: 1em; |
|||
padding-right: 1em; |
|||
padding-top: 0.2em; |
|||
display: inline-block; |
|||
padding-bottom: 0.2em; |
|||
} |
|||
|
|||
.date { |
|||
float:right; |
|||
border-left: 2px solid #0e0e22; |
|||
padding-left: 1em; |
|||
padding-right: 1em; |
|||
padding-top: 0.2em; |
|||
display: inline-block; |
|||
padding-bottom: 0.2em; |
|||
} |
|||
|
|||
.description{ |
|||
padding: 1em; |
|||
display: block; |
|||
/*transition: height 0.5s linear;*/ |
|||
overflow: hidden; |
|||
border-top: 2px solid #0e0e22; |
|||
} |
|||
|
|||
.collapsed { |
|||
border-top: 0px; |
|||
/*transform:scaleY(0);*/ |
|||
height: 0; |
|||
padding:0; |
|||
} |
|||
|
|||
.descr_button { |
|||
cursor: pointer; |
|||
flex-grow: 1; |
|||
text-align: center; |
|||
} |
|||
|
|||
.descr_button a { |
|||
color:inherit; |
|||
text-decoration: inherit; |
|||
} |
|||
|
|||
.descr_button a:before { |
|||
content:'↕'; |
|||
vertical-align: sub; |
|||
} |
|||
|
|||
.descr_button:hover { |
|||
box-shadow: inset 2px 2px 0px #95948c; |
|||
} |
|||
|
|||
.play-icon { |
|||
width: 0; |
|||
height: 0; |
|||
position: absolute; |
|||
left: 50%; |
|||
top: 50%; |
|||
transform: translate(-50%,-50%) scale(.5); |
|||
border-top: 13px solid transparent; |
|||
border-bottom: 13px solid transparent; |
|||
border-left: 18px solid hsla(0,0%,100%,.95); |
|||
} |
|||
|
|||
.video-thumbnail { |
|||
position: absolute; |
|||
width: 100%; |
|||
height: 100%; |
|||
top: 0; |
|||
} |
|||
.video-thumbnail { |
|||
display: flex; |
|||
flex-direction: column; |
|||
position: relative; |
|||
overflow: hidden; |
|||
background-color: #ececec; |
|||
transition: filter .2s ease; |
|||
} |
|||
|
|||
.video-thumbnail-duration-overlay { |
|||
display: inline-block; |
|||
background-color: rgb(255, 240, 157); |
|||
color: #0e0e22; |
|||
font-size: 14px; |
|||
line-height: 1.1; |
|||
z-index: 10; |
|||
position: absolute; |
|||
padding: 1px 3px 1px 3px; |
|||
right: 5px; |
|||
bottom: 5px; |
|||
border: 2px solid #0e0e22; |
|||
} |
|||
|
|||
.play-overlay { |
|||
transition: all .2s ease; |
|||
position: absolute; |
|||
right: 0; |
|||
bottom: 0; |
|||
width: inherit; |
|||
height: inherit; |
|||
opacity: 0; |
|||
background-color: rgba(0,0,0,.3); |
|||
} |
|||
|
|||
.video-thumbnail:hover { |
|||
text-decoration:none!important |
|||
} |
|||
.video-thumbnail:hover .play-overlay { |
|||
opacity:1 |
|||
} |
|||
.video-thumbnail:hover .play-overlay .play-icon { |
|||
transform:translate(-50%,-50%) scale(1) |
|||
} |
|||
|
|||
/* @media screen and (min-width: 480px) { |
|||
* { |
|||
background: silver |
|||
}*/ |
|||
|
|||
</style> |
|||
</head> |
|||
|
|||
<body> |
|||
<!-- Content --> |
|||
|
|||
<div class='wrapper'> |
|||
|
|||
<div class='video-box'> |
|||
<div class='media'> |
|||
<a class='video-thumbnail' href="https://tv.lumbung.space/videos/watch/75fbc455-2491-4df2-994c-92062801ecf3"> |
|||
<img src="https://tv.lumbung.space/lazy-static/previews/295dcb6d-7409-4bf7-8c3c-97b67b3775bc.jpg"> |
|||
<!-- <iframe width="560" height="315" sandbox="allow-same-origin allow-scripts allow-popups" src="https://tv.lumbung.space/videos/embed/75fbc455-2491-4df2-994c-92062801ecf3" frameborder="0" allowfullscreen></iframe> --> |
|||
<div class="video-thumbnail-duration-overlay"> |
|||
|
|||
0:47:37 |
|||
|
|||
</div> |
|||
<div class="play-overlay"> |
|||
<div class="play-icon"></div> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class='metadata'> |
|||
<div class='title'>Sonic Liberation Front - 24/05/21</div> |
|||
<span class="description collapsed" id='vid-40'> Mirror from Radio Alhara<br /> |
|||
https://yamakan.place/palestine/<br /> |
|||
<br /> |
|||
Recording on 24/5/21 from 15:00 - 15:45 Betlehem time.<br /> |
|||
<br /> |
|||
Radio Alhara is a radio station based in Bethlehem, Ramallah and Amman. Launched during a global lockdown crisis in March 2020,...</span> |
|||
<div class='footer'> |
|||
<span class='channel'><a href='https://tv.lumbung.space/video-channels/sonicliberation'> Sonic Liberation Front</a></span> |
|||
|
|||
<span class='descr_button' id='toggle-button' onclick="toggleDescription('#vid-40')"> <a href='#'> </a></span> |
|||
|
|||
<span class='date'> <a href='https://tv.lumbung.space/videos/watch/75fbc455-2491-4df2-994c-92062801ecf3'> 2021-05-24</a></span> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class='video-box'> |
|||
<div class='media'> |
|||
<a class='video-thumbnail' href="https://tv.lumbung.space/videos/watch/698d6eb1-c76a-4b0a-ae32-e11692b356fb"> |
|||
<img src="https://tv.lumbung.space/lazy-static/previews/464da572-89da-46ae-90c8-82dae3cea325.jpg"> |
|||
<!-- <iframe width="560" height="315" sandbox="allow-same-origin allow-scripts allow-popups" src="https://tv.lumbung.space/videos/embed/698d6eb1-c76a-4b0a-ae32-e11692b356fb" frameborder="0" allowfullscreen></iframe> --> |
|||
<div class="video-thumbnail-duration-overlay"> |
|||
|
|||
4:30:16 |
|||
|
|||
</div> |
|||
<div class="play-overlay"> |
|||
<div class="play-icon"></div> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class='metadata'> |
|||
<div class='title'>Sonic Liberation Front - 23/05/2021</div> |
|||
<span class="description collapsed" id='vid-35'> Mirror from Radio Alhara<br /> |
|||
https://yamakan.place/palestine/<br /> |
|||
<br /> |
|||
Recording on 22/5/21 from 17:30 - 22:15 Betlehem time.<br /> |
|||
<br /> |
|||
Radio Alhara is a radio station based in Bethlehem, Ramallah and Amman. Launched during a global lockdown crisis in March 2020,...</span> |
|||
<div class='footer'> |
|||
<span class='channel'><a href='https://tv.lumbung.space/video-channels/sonicliberation'> Sonic Liberation Front</a></span> |
|||
|
|||
<span class='descr_button' id='toggle-button' onclick="toggleDescription('#vid-35')"> <a href='#'> </a></span> |
|||
|
|||
<span class='date'> <a href='https://tv.lumbung.space/videos/watch/698d6eb1-c76a-4b0a-ae32-e11692b356fb'> 2021-05-23</a></span> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class='video-box'> |
|||
<div class='media'> |
|||
<a class='video-thumbnail' href="https://tv.lumbung.space/videos/watch/752f7991-995d-4a2f-a1a4-41cc5688b078"> |
|||
<img src="https://tv.lumbung.space/lazy-static/previews/ce21bca7-c866-4093-b3d6-06e155291dfa.jpg"> |
|||
<!-- <iframe width="560" height="315" sandbox="allow-same-origin allow-scripts allow-popups" src="https://tv.lumbung.space/videos/embed/752f7991-995d-4a2f-a1a4-41cc5688b078" frameborder="0" allowfullscreen></iframe> --> |
|||
<div class="video-thumbnail-duration-overlay"> |
|||
|
|||
0:56:42 |
|||
|
|||
</div> |
|||
<div class="play-overlay"> |
|||
<div class="play-icon"></div> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class='metadata'> |
|||
<div class='title'>MAJÁLIS - A Lumbung tagok bemutatása | Politikai ágencia</div> |
|||
<span class="description collapsed" id='vid-39'> POLITICAL AGENCY<br /> |
|||
The discussion will explore the possibilities for art’s funding and political agency from the perspective of grassroots collectives.<br /> |
|||
<br /> |
|||
A conversation with the participation of Question of Funding (Palestine), hosted by OFF-Biennale...</span> |
|||
<div class='footer'> |
|||
<span class='channel'><a href='https://tv.lumbung.space/video-channels/majelis'> Majelis</a></span> |
|||
|
|||
<span class='descr_button' id='toggle-button' onclick="toggleDescription('#vid-39')"> <a href='#'> </a></span> |
|||
|
|||
<span class='date'> <a href='https://tv.lumbung.space/videos/watch/752f7991-995d-4a2f-a1a4-41cc5688b078'> 2021-05-23</a></span> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class='video-box'> |
|||
<div class='media'> |
|||
<a class='video-thumbnail' href="https://tv.lumbung.space/videos/watch/4eff6150-b688-4c42-958f-6e206319554d"> |
|||
<img src="https://tv.lumbung.space/lazy-static/previews/9ce1f7f8-13cb-436b-8313-01d020bc8d1c.jpg"> |
|||
<!-- <iframe width="560" height="315" sandbox="allow-same-origin allow-scripts allow-popups" src="https://tv.lumbung.space/videos/embed/4eff6150-b688-4c42-958f-6e206319554d" frameborder="0" allowfullscreen></iframe> --> |
|||
<div class="video-thumbnail-duration-overlay"> |
|||
|
|||
5:07:46 |
|||
|
|||
</div> |
|||
<div class="play-overlay"> |
|||
<div class="play-icon"></div> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class='metadata'> |
|||
<div class='title'>Sonic Liberation Front / Frente de Liberación Sonoro - 22/5/2021</div> |
|||
<span class="description collapsed" id='vid-30'> Mirror from Radio Alhara<br /> |
|||
https://yamakan.place/palestine/<br /> |
|||
<br /> |
|||
Recording on 22/5/21 from 19:00 - 24:00 Betlehem time.<br /> |
|||
<br /> |
|||
Radio Alhara is a radio station based in Bethlehem, Ramallah and Amman. Launched during a global lockdown crisis in March 2020,...</span> |
|||
<div class='footer'> |
|||
<span class='channel'><a href='https://tv.lumbung.space/video-channels/sonicliberation'> Sonic Liberation Front</a></span> |
|||
|
|||
<span class='descr_button' id='toggle-button' onclick="toggleDescription('#vid-30')"> <a href='#'> </a></span> |
|||
|
|||
<span class='date'> <a href='https://tv.lumbung.space/videos/watch/4eff6150-b688-4c42-958f-6e206319554d'> 2021-05-22</a></span> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class='video-box'> |
|||
<div class='media'> |
|||
<a class='video-thumbnail' href="https://tv.lumbung.space/videos/watch/73d9f872-ea75-490c-a1be-60a398bac45e"> |
|||
<img src="https://tv.lumbung.space/lazy-static/previews/6df9f482-ac52-45aa-a46b-5265df4439ee.jpg"> |
|||
<!-- <iframe width="560" height="315" sandbox="allow-same-origin allow-scripts allow-popups" src="https://tv.lumbung.space/videos/embed/73d9f872-ea75-490c-a1be-60a398bac45e" frameborder="0" allowfullscreen></iframe> --> |
|||
<div class="video-thumbnail-duration-overlay"> |
|||
|
|||
6:28:45 |
|||
|
|||
</div> |
|||
<div class="play-overlay"> |
|||
<div class="play-icon"></div> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class='metadata'> |
|||
<div class='title'>Sonic Liberation Front - 21/5/21</div> |
|||
<span class="description collapsed" id='vid-20'> Mirror from Radio Alhara<br /> |
|||
https://yamakan.place/palestine/<br /> |
|||
<br /> |
|||
Recording on 21/5/21 from 14:00 - 19:00 Betlehem time. <br /> |
|||
<br /> |
|||
Radio Alhara is a radio station based in Bethlehem, Ramallah and Amman. Launched during a global lockdown crisis in March 2020...</span> |
|||
<div class='footer'> |
|||
<span class='channel'><a href='https://tv.lumbung.space/video-channels/sonicliberation'> Sonic Liberation Front</a></span> |
|||
|
|||
<span class='descr_button' id='toggle-button' onclick="toggleDescription('#vid-20')"> <a href='#'> </a></span> |
|||
|
|||
<span class='date'> <a href='https://tv.lumbung.space/videos/watch/73d9f872-ea75-490c-a1be-60a398bac45e'> 2021-05-21</a></span> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class='video-box'> |
|||
<div class='media'> |
|||
<a class='video-thumbnail' href="https://tv.lumbung.space/videos/watch/b4aafef4-892f-4036-a4bc-2e09027e2b4b"> |
|||
<img src="https://tv.lumbung.space/lazy-static/previews/330965b6-f172-47bc-a914-d7d790858352.jpg"> |
|||
<!-- <iframe width="560" height="315" sandbox="allow-same-origin allow-scripts allow-popups" src="https://tv.lumbung.space/videos/embed/b4aafef4-892f-4036-a4bc-2e09027e2b4b" frameborder="0" allowfullscreen></iframe> --> |
|||
<div class="video-thumbnail-duration-overlay"> |
|||
|
|||
LIVE |
|||
|
|||
</div> |
|||
<div class="play-overlay"> |
|||
<div class="play-icon"></div> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class='metadata'> |
|||
<div class='title'>Sonic Liberation Front</div> |
|||
<span class="description collapsed" id='vid-21'> Ongoing mirror of Radio Alhara<br /> |
|||
<br /> |
|||
https://yamakan.place/palestine/<br /> |
|||
<br /> |
|||
Radio Alhara is a radio station based in Bethlehem, Ramallah and Amman. Launched during a global lockdown crisis in March 2020, it encompasses the idea of a public space. The ra...</span> |
|||
<div class='footer'> |
|||
<span class='channel'><a href='https://tv.lumbung.space/video-channels/sonicliberation'> Sonic Liberation Front</a></span> |
|||
|
|||
<span class='descr_button' id='toggle-button' onclick="toggleDescription('#vid-21')"> <a href='#'> </a></span> |
|||
|
|||
<span class='date'> <a href='https://tv.lumbung.space/videos/watch/b4aafef4-892f-4036-a4bc-2e09027e2b4b'> 2021-05-21</a></span> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
</div> |
|||
|
|||
</body> |
|||
<script> |
|||
function toggleDescription(id){ |
|||
document.querySelector(id).classList.toggle("collapsed"); |
|||
} |
|||
</script> |
|||
</html> |
@ -0,0 +1,240 @@ |
|||
<!DOCTYPE html> |
|||
<html lang="en" class="no-js"> |
|||
<head> |
|||
<meta charset="UTF-8"> |
|||
<meta name="viewport" content="width=device-width"> |
|||
|
|||
<title>lumbung.space video archive prototype</title> |
|||
|
|||
<meta name="description" content="this page is generated on the basis of a peertube instance"> |
|||
<meta property="og:title" content="lumbung.space video archive prototype"> |
|||
<meta property="og:description" content="this page is generated on the basis of a peertube instance"> |
|||
<meta property="og:image" content="{{ host }}{{videos[0].preview_path}}"> |
|||
<meta property="og:image:alt" content="Image description"> |
|||
<meta property="og:locale" content="en_GB"> |
|||
<meta property="og:type" content="website"> |
|||
<meta name="twitter:card" content="summary_large_image"> |
|||
<meta property="og:url" content="https://lumbung.space/videofeedprototype.html"> |
|||
<link rel="canonical" href="https://lumbung.space/videofeedprototype.html"> |
|||
|
|||
<link rel="icon" href="/favicon.ico"> |
|||
<link rel="icon" href="/favicon.svg" type="image/svg+xml"> |
|||
<link rel="apple-touch-icon" href="/apple-touch-icon.png"> |
|||
<link rel="manifest" href="/my.webmanifest"> |
|||
<meta name="theme-color" content="#FF00FF"> |
|||
<style type="text/css"> |
|||
@font-face{ |
|||
font-family: "Space Grotesk"; |
|||
src:url('SpaceGrotesk[wght].woff2') |
|||
} |
|||
|
|||
body {font-size:1.3rem;font-family: sans-serif;} |
|||
.wrapper { |
|||
width: 50%; |
|||
margin: auto; |
|||
} |
|||
.video-box { |
|||
border:2px solid #0e0e22; |
|||
max-width:560px; |
|||
margin:auto; |
|||
box-shadow:1em 1em 0 #d2d1c8; |
|||
margin-bottom: 2em; |
|||
} |
|||
.video-box img { |
|||
max-width: 100%; |
|||
} |
|||
.video-box .media { |
|||
line-height: 0; |
|||
} |
|||
|
|||
.metadata{ |
|||
display: flex; |
|||
flex-direction: column; |
|||
background-color: #fff09d; |
|||
font-size:0.9rem; |
|||
} |
|||
|
|||
|
|||
.title{ |
|||
margin-top:0; |
|||
border-top: 2px solid #0e0e22; |
|||
padding:0.5em; |
|||
font-weight:700; |
|||
font-size:1.3rem; |
|||
} |
|||
|
|||
.footer{ |
|||
margin-top:0; |
|||
border-top: 2px solid #0e0e22; |
|||
display: flex; |
|||
justify-content: space-between; |
|||
} |
|||
|
|||
.channel{ |
|||
border-right: 2px solid #0e0e22; |
|||
padding-left: 1em; |
|||
padding-right: 1em; |
|||
padding-top: 0.2em; |
|||
display: inline-block; |
|||
padding-bottom: 0.2em; |
|||
} |
|||
|
|||
.date { |
|||
float:right; |
|||
border-left: 2px solid #0e0e22; |
|||
padding-left: 1em; |
|||
padding-right: 1em; |
|||
padding-top: 0.2em; |
|||
display: inline-block; |
|||
padding-bottom: 0.2em; |
|||
} |
|||
|
|||
.description{ |
|||
padding: 1em; |
|||
display: block; |
|||
/*transition: height 0.5s linear;*/ |
|||
overflow: hidden; |
|||
border-top: 2px solid #0e0e22; |
|||
} |
|||
|
|||
.collapsed { |
|||
border-top: 0px; |
|||
/*transform:scaleY(0);*/ |
|||
height: 0; |
|||
padding:0; |
|||
} |
|||
|
|||
.descr_button { |
|||
cursor: pointer; |
|||
flex-grow: 1; |
|||
text-align: center; |
|||
} |
|||
|
|||
.descr_button a { |
|||
color:inherit; |
|||
text-decoration: inherit; |
|||
} |
|||
|
|||
.descr_button a:before { |
|||
content:'↕'; |
|||
vertical-align: sub; |
|||
} |
|||
|
|||
.descr_button:hover { |
|||
box-shadow: inset 2px 2px 0px #95948c; |
|||
} |
|||
|
|||
.play-icon { |
|||
width: 0; |
|||
height: 0; |
|||
position: absolute; |
|||
left: 50%; |
|||
top: 50%; |
|||
transform: translate(-50%,-50%) scale(.5); |
|||
border-top: 13px solid transparent; |
|||
border-bottom: 13px solid transparent; |
|||
border-left: 18px solid hsla(0,0%,100%,.95); |
|||
} |
|||
|
|||
.video-thumbnail { |
|||
position: absolute; |
|||
width: 100%; |
|||
height: 100%; |
|||
top: 0; |
|||
} |
|||
.video-thumbnail { |
|||
display: flex; |
|||
flex-direction: column; |
|||
position: relative; |
|||
overflow: hidden; |
|||
background-color: #ececec; |
|||
transition: filter .2s ease; |
|||
} |
|||
|
|||
.video-thumbnail-duration-overlay { |
|||
display: inline-block; |
|||
background-color: rgb(255, 240, 157); |
|||
color: #0e0e22; |
|||
font-size: 14px; |
|||
line-height: 1.1; |
|||
z-index: 10; |
|||
position: absolute; |
|||
padding: 1px 3px 1px 3px; |
|||
right: 5px; |
|||
bottom: 5px; |
|||
border: 2px solid #0e0e22; |
|||
} |
|||
|
|||
.play-overlay { |
|||
transition: all .2s ease; |
|||
position: absolute; |
|||
right: 0; |
|||
bottom: 0; |
|||
width: inherit; |
|||
height: inherit; |
|||
opacity: 0; |
|||
background-color: rgba(0,0,0,.3); |
|||
} |
|||
|
|||
.video-thumbnail:hover { |
|||
text-decoration:none!important |
|||
} |
|||
.video-thumbnail:hover .play-overlay { |
|||
opacity:1 |
|||
} |
|||
.video-thumbnail:hover .play-overlay .play-icon { |
|||
transform:translate(-50%,-50%) scale(1) |
|||
} |
|||
|
|||
/* @media screen and (min-width: 480px) { |
|||
* { |
|||
background: silver |
|||
}*/ |
|||
|
|||
</style> |
|||
</head> |
|||
|
|||
<body> |
|||
<!-- Content --> |
|||
|
|||
<div class='wrapper'> |
|||
{% for video in videos %} |
|||
<div class='video-box'> |
|||
<div class='media'> |
|||
<a class='video-thumbnail' href="{{ host }}/videos/watch/{{ video.uuid }}"> |
|||
<img src="{{ host }}{{ video.preview_path }}"> |
|||
<!-- <iframe width="560" height="315" sandbox="allow-same-origin allow-scripts allow-popups" src="{{ host }}{{ video.embed_path }}" frameborder="0" allowfullscreen></iframe> --> |
|||
<div class="video-thumbnail-duration-overlay"> |
|||
{% if video.is_live %} |
|||
LIVE |
|||
{% else %} |
|||
{{ video.duration | duration }} |
|||
{% endif %} |
|||
</div> |
|||
<div class="play-overlay"> |
|||
<div class="play-icon"></div> |
|||
</div> |
|||
</a> |
|||
</div> |
|||
<div class='metadata'> |
|||
<div class='title'>{{ video.name }}</div> |
|||
<span class="description collapsed" id='vid-{{ video.id }}'> {{ video.description | linebreaks }}</span> |
|||
<div class='footer'> |
|||
<span class='channel'><a href='{{ video.channel.url }}'> {{ video.channel.display_name }}</a></span> |
|||
|
|||
<span class='descr_button' id='toggle-button' onclick="toggleDescription('#vid-{{ video.id }}')"> <a href='#'> </a></span> |
|||
|
|||
<span class='date'> <a href='{{ host }}/videos/watch/{{ video.uuid }}'> {{ video.published_at.strftime('%Y-%m-%d') }}</a></span> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
{% endfor %} |
|||
</div> |
|||
|
|||
</body> |
|||
<script> |
|||
function toggleDescription(id){ |
|||
document.querySelector(id).classList.toggle("collapsed"); |
|||
} |
|||
</script> |
|||
</html> |
@ -0,0 +1,61 @@ |
|||
#!/bin/python3 |
|||
|
|||
#lumbung.space video feed generator |
|||
#c 2021 roel roscam abbing gpvl3 etc |
|||
|
|||
import peertube |
|||
import jinja2 |
|||
import json |
|||
import os |
|||
import datetime |
|||
|
|||
|
|||
def duration(n): |
|||
""" |
|||
convert '6655' in '1:50:55' |
|||
|
|||
""" |
|||
return str(datetime.timedelta(seconds = n)) |
|||
|
|||
def linebreaks(text): |
|||
import re |
|||
br = re.compile(r"(\r\n|\r|\n)") |
|||
return br.sub(r"<br />\n", text) |
|||
|
|||
#def base64ify(url): |
|||
#download url to object |
|||
#run base64 lib on object |
|||
#format a data: string |
|||
#return base64string |
|||
|
|||
|
|||
env = jinja2.Environment( |
|||
loader=jinja2.FileSystemLoader(os.path.curdir) |
|||
) |
|||
|
|||
env.filters['duration'] = duration |
|||
env.filters['linebreaks'] = linebreaks |
|||
|
|||
host = 'https://tv.lumbung.space' |
|||
|
|||
configuration = peertube.Configuration( |
|||
host = host+"/api/v1" |
|||
) |
|||
|
|||
client = peertube.ApiClient(configuration) |
|||
|
|||
v = peertube.VideoApi(client) |
|||
|
|||
response = v.videos_get(count=6, filter='local') |
|||
|
|||
videos = response.to_dict() |
|||
videos = videos['data'] |
|||
|
|||
template = env.get_template('video-feed.html') |
|||
|
|||
html = template.render(videos=videos, host=host, description=description) |
|||
|
|||
with open('video-feed-prototype.html','w') as f: |
|||
f.write(html) |
|||
print(html) |
|||
|
Loading…
Reference in new issue