mirror of
https://git.sr.ht/~metalune/simpleweb_peertube
synced 2024-12-22 19:40:24 +01:00
Initial commit
This commit is contained in:
parent
d3024bcdb6
commit
49e81ef0e8
63
main.py
Normal file
63
main.py
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
from quart import Quart, request, render_template
|
||||||
|
import peertube
|
||||||
|
|
||||||
|
# Wrapper, only containing information that's important for us, and in some cases provides simplified ways to get information
|
||||||
|
class VideoWrapper:
|
||||||
|
def __init__(self, a, quality):
|
||||||
|
self.name = a["name"]
|
||||||
|
self.channel = a["channel"]
|
||||||
|
self.description = a["description"]
|
||||||
|
self.thumbnailPath = a["thumbnailPath"]
|
||||||
|
|
||||||
|
self.category = a["category"]
|
||||||
|
self.licence = a["licence"]
|
||||||
|
self.language = a["language"]
|
||||||
|
self.privacy = a["privacy"]
|
||||||
|
self.tags = a["tags"]
|
||||||
|
|
||||||
|
self.views = a["views"]
|
||||||
|
self.likes = a["likes"]
|
||||||
|
self.dislikes = a["dislikes"]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
self.resolutions = []
|
||||||
|
self.video = None
|
||||||
|
|
||||||
|
for entry in a["files"]:
|
||||||
|
resolution = (entry["resolution"])["id"]
|
||||||
|
self.resolutions.append(entry["resolution"])
|
||||||
|
|
||||||
|
if str(resolution) == str(quality):
|
||||||
|
self.video = entry["fileUrl"]
|
||||||
|
|
||||||
|
self.no_quality_selected = not self.video
|
||||||
|
|
||||||
|
|
||||||
|
app = Quart(__name__)
|
||||||
|
|
||||||
|
@app.route('/')
|
||||||
|
async def main():
|
||||||
|
return await render_template('index.html')
|
||||||
|
|
||||||
|
@app.route('/<string:domain>')
|
||||||
|
async def domain_main(domain):
|
||||||
|
return await render_template('domain_index.html')
|
||||||
|
|
||||||
|
@app.route('/<string:domain>/search/<string:term>')
|
||||||
|
async def search(domain, term):
|
||||||
|
amount, results = peertube.search(domain, term)
|
||||||
|
return await render_template('search_results.html', domain=domain, amount=amount, results=results)
|
||||||
|
|
||||||
|
@app.route('/<string:domain>/watch/<string:id>/')
|
||||||
|
async def video(domain, id):
|
||||||
|
data = peertube.video(domain, id)
|
||||||
|
quality = request.args.get("quality")
|
||||||
|
if quality == None:
|
||||||
|
quality = "best"
|
||||||
|
vid = VideoWrapper(data, quality)
|
||||||
|
|
||||||
|
return await render_template('video.html', video=vid, quality=quality)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app.run()
|
24
peertube.py
Normal file
24
peertube.py
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
from bs4 import BeautifulSoup
|
||||||
|
import requests
|
||||||
|
import json
|
||||||
|
|
||||||
|
def video(domain, id):
|
||||||
|
video_url = "https://" + domain + "/api/v1/videos/" + id
|
||||||
|
video_object = json.loads(requests.get(video_url).text)
|
||||||
|
return video_object
|
||||||
|
|
||||||
|
def search(domain, term, start = 0, count = 10):
|
||||||
|
search_url = "https://" + domain + "/api/v1/search/videos?start=" + str(start) + "&count=" + str(count) + "&search=" + term + "&sort=-match&searchTarget=local"
|
||||||
|
search_object = json.loads(requests.get(search_url).text)
|
||||||
|
|
||||||
|
amount = search_object["total"]
|
||||||
|
results = search_object["data"]
|
||||||
|
|
||||||
|
return amount, results
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
vid = video("diode.zone", "5405dac8-05c1-4512-b842-67be43ce7442")
|
||||||
|
print(json.dumps(vid, indent=2))
|
||||||
|
#_, results = search("diode.zone", "test")
|
||||||
|
#print(json.dumps(results, indent=2))
|
0
templates/domain_index.html
Normal file
0
templates/domain_index.html
Normal file
0
templates/index.html
Normal file
0
templates/index.html
Normal file
24
templates/search_results.html
Normal file
24
templates/search_results.html
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
<p>{{ amount }} results</p>
|
||||||
|
<table>
|
||||||
|
{% for result in results %}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<a href="/{{ domain}}/watch/{{ result.uuid }}">
|
||||||
|
<img src="https://{{ domain }}/{{ result.thumbnailPath }}" height="150"/>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a href="/{{ domain }}/watch/{{ result.uuid }}">{{ result.name }}</a>
|
||||||
|
<br>
|
||||||
|
{{ result.views }} Views
|
||||||
|
<br>
|
||||||
|
<b>{{ result.channel.displayName }}</b>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
</body>
|
||||||
|
</html>
|
51
templates/video.html
Normal file
51
templates/video.html
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
<h3>{{ video.name }}</h3>
|
||||||
|
By:
|
||||||
|
<b>{{ video.channel.displayName }}</b> ({{ video.channel.name }}@{{ video.channel.host }})
|
||||||
|
<br>
|
||||||
|
{% if video.no_quality_selected %}
|
||||||
|
<img height="300" src="https://{{ video.channel.host }}{{ video.thumbnailPath }}">
|
||||||
|
<p style="color: red">Please select a resolution:</p>
|
||||||
|
{% else %}
|
||||||
|
<video height="300" controls>
|
||||||
|
<source src="{{ video.video }}">
|
||||||
|
</video>
|
||||||
|
<br>
|
||||||
|
<b>Resolutions:</b>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% for resolution in video.resolutions %}
|
||||||
|
<a href="?quality={{ resolution.id }}">{{ resolution.label }}</a>
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
<br>
|
||||||
|
Views: <b>{{ video.views }}</b> Likes: <b>{{ video.likes }}</b> Dislikes: <b>{{ video.dislikes }}</b>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
{{ video.description }}
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td><b>Category</b></td>
|
||||||
|
<td>{{ video.category.label }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><b>License</b></td>
|
||||||
|
<td>{{ video.licence.label }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><b>Language</b></td>
|
||||||
|
<td>{{ video.language.label }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><b>Privacy</b></td>
|
||||||
|
<td>{{ video.privacy.label }}</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in New Issue
Block a user