Skip to content

Commit

Permalink
Debug
Browse files Browse the repository at this point in the history
  • Loading branch information
alopatindev committed Dec 2, 2024
1 parent 83df914 commit 72a7c3f
Show file tree
Hide file tree
Showing 13 changed files with 135 additions and 66 deletions.
4 changes: 3 additions & 1 deletion _config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,9 @@ theme_settings:
post_navigation: true

p2p_player:
media_url: https://media.codonaft.com
media_urls:
- https://media.codonaft.com
- https://media-cached.codonaft.com
trackers:
- wss://media.codonaft.com/announce
- wss://tracker.webtorrent.dev
Expand Down
2 changes: 1 addition & 1 deletion _hosts/media.codonaft/etc/aquatic/aquatic_ws.conf
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ enable_tls = false
tls_certificate_path = ""
tls_private_key_path = ""
websocket_max_message_size = 65536
websocket_max_frame_size = 16384
websocket_max_frame_size = 32768 # first messages that iOS sends are too large, this causes a connection drop
websocket_write_buffer_size = 8192
enable_http_health_checks = false

Expand Down
18 changes: 12 additions & 6 deletions _hosts/media.codonaft/etc/init.d/aquatic_ws
Original file line number Diff line number Diff line change
Expand Up @@ -37,23 +37,29 @@ update_access_list() {
# https://github.com/Novage/p2p-media-loader/blob/fe59c09e8226687f0478836becdaf2bbb39c10ba/packages/p2p-media-loader-core/src/utils/peer.ts#L12
python -c "
from glob import glob
from syslog import syslog
import base64, hashlib, os, tempfile, tomllib
location = '/var/www/'
config = tomllib.load(open('${CONFIG_FILE}', 'rb'))
output = config['access_list']['path']
syslog('aquatic_ws: generating info hashes')
with tempfile.NamedTemporaryFile(delete=False, dir=os.path.dirname(output), mode='wt') as temp:
for i in glob('%s/*/*/main.m3u8' % location):
def write_hashes(n, stream_type):
for index in range(n):
stream_swarm_id = b'v2-https://%s-%s-%d' % (i.replace(location, '').encode('utf-8'), stream_type, index)
item = base64.b64encode(hashlib.md5(stream_swarm_id).digest()[1:]).hex()
raw_item = base64.b64encode(hashlib.md5(stream_swarm_id).digest()[1:])
item = raw_item.hex()
syslog('aquatic_ws: %s %s %s' % (stream_swarm_id, raw_item, item))
temp.write(item + '\\n')
parent_dir = os.path.dirname(i)
main_streams = glob('%s/*/video.m3u8' % parent_dir)
secondary_streams = glob('%s/*/audio.m3u8' % parent_dir)
write_hashes(len(main_streams), b'main')
write_hashes(len(secondary_streams), b'secondary')
with open(i) as p:
playlist = p.readlines()
main_streams = sum(1 for i in playlist if i.startswith('#EXT-X-STREAM-INF'))
secondary_streams = sum(1 for i in playlist if i.startswith('#EXT-X-MEDIA:TYPE=AUDIO'))
write_hashes(main_streams, b'main')
write_hashes(secondary_streams, b'secondary')
temp.close()
os.chmod(temp.name, 0o644)
os.replace(temp.name, output)"
Expand Down
18 changes: 4 additions & 14 deletions _hosts/media.codonaft/etc/nginx/http.d/media.conf
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,6 @@ map $origin_allowed $origin {
1 $http_origin;
}

server {
listen 80;
listen [::]:80;

server_name media.codonaft.com;

location / {
add_header Cache-Control "public, max-age=7200";
expires 2h;
return 301 https://$host$request_uri;
}
}

server {
listen 443 ssl;
listen [::]:443 ssl;
Expand All @@ -42,7 +29,9 @@ server {
# #add_header X-Early-Data $tls1_3_early_data; # Debug 0-RTT
# add_header x-frame-options "deny";

server_name media.codonaft.com;
include /etc/nginx/cloudflare.conf;

server_name media.codonaft.com media-cached.codonaft.com;
ssl_certificate /etc/nginx/ssl/codonaft.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/codonaft.com/privkey.pem;
ssl_trusted_certificate /etc/nginx/ssl/codonaft.com/chain.pem;
Expand Down Expand Up @@ -75,6 +64,7 @@ server {

# 4 hours, for testing
add_header Cache-Control "public, max-age=14400, immutable";
#add_header Cache-Control "public, max-age=14400, must-revalidate";
expires 4h;

# TODO: 1 year
Expand Down
4 changes: 4 additions & 0 deletions _hosts/media.codonaft/etc/nginx/http.d/omv.conf
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ server {
listen 80;
listen [::]:80;

include /etc/nginx/cloudflare.conf;

server_name omv.codonaft.com;

location / {
Expand All @@ -16,6 +18,8 @@ server {
listen [::]:443 ssl;
http2 on;

include /etc/nginx/cloudflare.conf;

server_name omv.codonaft.com;
ssl_certificate /etc/nginx/ssl/codonaft.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/codonaft.com/privkey.pem;
Expand Down
105 changes: 87 additions & 18 deletions _includes/head.html
Original file line number Diff line number Diff line change
Expand Up @@ -80,12 +80,15 @@
import '/assets/js/vendor/vidstack-player/vidstack.js';

const pageLog = text => {
if (window.location.pathname !== '/ru/video-test/') return;
const p = document.createElement('p');
p.textContent = text;
p.style.color = 'green'
p.style.fontWeight = '800';
document.body.appendChild(p);
if (window.location.pathname === '/ru/video-test/') {
const p = document.createElement('p');
p.textContent = text;
p.style.color = 'green'
p.style.fontWeight = '800';
document.body.appendChild(p);
} else {
console.log(text);
}
};

const codecSupported = codec =>
Expand Down Expand Up @@ -149,7 +152,7 @@

const loadChapters = (player, playerIndex) => {
const duration = player.duration;
const element = document.querySelector(`.p2p-player-chapters[data-stream-url="${player.getAttribute('src')}"]`);
const element = player.parentElement.parentElement.querySelector('.p2p-player-chapters');
if (!element) return;

const lines = element
Expand Down Expand Up @@ -218,8 +221,36 @@
loadChapters(player, playerIndex);
};

let lastFailureTime = 0;
let mediaSourceSelectionAttempt = 0;
let aborted = false;
const fallback = player => {
if (player.state.playing) {
player.setAttribute('autoplay', true);
}

const now = Date.now();
if (now - lastFailureTime < 5000 || (!player.state.waiting && !aborted)) {
return;
}
lastFailureTime = now;

setTimeout(() => fallback(player), 6000);

const source = new URL(player.getAttribute('src'));
const mediaUrls = {{ site.theme_settings.p2p_player.media_urls | jsonify }};

mediaSourceSelectionAttempt++;
source.hostname = new URL(mediaUrls[mediaSourceSelectionAttempt % mediaUrls.length]).hostname;

player.setAttribute('src', source.toString());
pageLog('new source ' + player.getAttribute('src') + ' attempt=' + mediaSourceSelectionAttempt);
};

const initializePlayer = (player, playerIndex, currentTime, autoPlay) => {
pageLog(`initializePlayer ${playerIndex}`);
const swarmId = new URL(player.getAttribute('src'));

const videoLayout = player.querySelector('media-video-layout');
const poster = player.querySelector("media-poster");

Expand Down Expand Up @@ -297,18 +328,46 @@
});
}

player.addEventListener('stalled', event => {
pageLog('stalled');
for (const i of ['abort', 'audio-gain-change', 'audio-track-change', 'audio-tracks-change', 'auto-play', 'auto-play-change', 'auto-play-fail', 'can-load', 'can-load-poster', 'can-play', 'can-play-through', 'controls-change', 'destroy', 'duration-change', 'emptied', 'end', 'ended', 'error', 'fullscreen-change', 'fullscreen-error', 'live-change', 'live-edge-change', 'load-start', 'loaded-data', 'loaded-metadata', 'loop-change', 'media-airplay-request', 'media-audio-gain-change-request', 'media-audio-track-change-request', 'media-clip-end-change-request', 'media-clip-start-change-request', 'media-duration-change-request', 'media-enter-fullscreen-request', 'media-enter-pip-request', 'media-exit-fullscreen-request', 'media-exit-pip-request', 'media-google-cast-request', 'media-live-edge-request', 'media-mute-request', 'media-orientation-lock-request', 'media-orientation-unlock-request', 'media-pause-controls-request', 'media-pause-request', 'media-play-request', 'media-player-connect', 'media-poster-start-loading', 'media-quality-change-request', 'media-rate-change-request', 'media-resume-controls-request', 'media-seek-request', 'media-seeking-request', 'media-start-loading', 'media-text-track-change-request', 'media-type-change', 'media-unmute-request', 'media-user-loop-change-request', 'media-volume-change-request', 'orientation-change', 'pause', 'picture-in-picture-change', 'picture-in-picture-error', 'play', 'play-fail', 'playing', 'plays-inline-change', 'poster-change', 'progress', 'provider-change', 'provider-loader-change', 'provider-setup', 'qualities-change', 'quality-change', 'rate-change', 'remote-playback-change', 'replay', 'seeked', 'seeking', 'stalled', 'started', 'stream-type-change', 'suspend', 'text-track-change', 'text-tracks-change', 'title-change', 'vds-log', 'video-presentation-change', 'view-type-change', 'volume-change']) {
player.addEventListener(i, event => {
pageLog(i);
});
}

player.addEventListener('abort', event => {
aborted = true;
fallback(player)
});

player.addEventListener('can-play', event => {
aborted = false;
});

player.addEventListener('source-change', event => {
pageLog('source-change' + JSON.stringify(event.detail));
});

player.addEventListener('sources-change', event => {
pageLog('sources-change' + JSON.stringify(event.detail));
});

player.addEventListener('error', event => {
pageLog('error ' + JSON.stringify(event.detail));
if (event.detail['code'] === 1) {
fallback(player);
}
});

player.addEventListener("provider-change", event => {
const provider = event.detail;
if (provider?.type === 'hls') {
pageLog('swarmId ' + swarmId);

provider.library = HlsWithP2P;
provider.config = {
p2p: {
core: {
// swarmId: player.getAttribute('src'),
// swarmId: swarmId.toString(),
// isP2PDisabled: false,
// simultaneousHttpDownloads: 2,
// simultaneousP2PDownloads: 3,
Expand All @@ -324,15 +383,21 @@
p2pErrorRetries: Infinity,
announceTrackers: {{ site.theme_settings.p2p_player.trackers | jsonify }},
rtcConfig: { iceServers: {{ site.theme_settings.p2p_player.ice_servers | jsonify }}.map(urls => { return { urls }; }) },
mainStream: {
swarmId: swarmId.toString(),
},
secondaryStream: {
swarmId: swarmId.toString(),
},
},
onHlsJsCreated: (hls) => {
hls.p2pEngine.addEventListener('onPeerConnect', (params) => {
hls.p2pEngine.addEventListener('onPeerConnect', params => {
pageLog('Peer connected:' + params.peerId);
});
hls.p2pEngine.addEventListener('onPeerError', (params) => {
hls.p2pEngine.addEventListener('onPeerError', params => {
pageLog('Peer error:' + params.peerId);
});
hls.p2pEngine.addEventListener('onPeerClose', (params) => {
hls.p2pEngine.addEventListener('onPeerClose', params => {
pageLog('Peer disconnected:' + params.peerId);
});
hls.p2pEngine.addEventListener('onChunkDownloaded', (bytesLength, downloadSource, peerId) => {
Expand All @@ -343,20 +408,24 @@
hls.p2pEngine.addEventListener('onChunkUploaded', (bytesLength, peerId) => {
pageLog('Peer UPdownload:' + bytesLength + ' ' + peerId);
});
hls.p2pEngine.addEventListener('onSegmentLoaded', (params) => {
hls.p2pEngine.addEventListener('onSegmentLoaded', params => {
if (params.peerId) {
pageLog('P2P Segment loaded:' + params.bytesLength);
}
});
hls.p2pEngine.addEventListener('onSegmentError', (params) => {
hls.p2pEngine.addEventListener('onSegmentError', params => {
pageLog('ERROR loading segment:' + JSON.stringify(params));
if (params && params['downloadSource'] === 'http' && params['error'] !== undefined && params['error']['type'] === 'bytes-receiving-timeout') {
pageLog('http timeout failure');
fallback(player);
}
});

hls.on(Hls.Events.MANIFEST_PARSED, function (event, data) {
hls.on(Hls.Events.MANIFEST_PARSED, (event, data) => {
console.log(data);
pageLog('manifest loaded, found ' + data.levels.length + ' quality level');
});
hls.on(Hls.Events.BUFFER_CREATED, function (event, data) {
hls.on(Hls.Events.BUFFER_CREATED, (event, data) => {
pageLog('codec: ' + data.tracks.audiovideo.codec);
});
// TODO: connectedPeerCount
Expand All @@ -376,7 +445,7 @@
currentLocation.searchParams.delete('t');
history.replaceState(undefined, '', currentLocation.pathname + currentLocation.search);
if (Hls?.isSupported()) {
console.log('hls is supported');
pageLog('hls is supported');
let maybeAutoPlay = true;
document
.querySelectorAll('media-player')
Expand Down
6 changes: 3 additions & 3 deletions _includes/p2p_player.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
{% assign video_id = page.permalink | split: '/' | last %}
{% endif %}

{% assign stream_url_prefix = site.theme_settings.p2p_player.media_url | append: '/' | append: video_id %}
{% assign stream_url_prefix = site.theme_settings.p2p_player.media_urls[0] | append: '/' | append: video_id %}
{% assign stream_url = stream_url_prefix | append: "/main.m3u8" %}
{% assign thumbnail_url = stream_url_prefix | append: "/thumbnail.webp" %}
{% endif %}
Expand Down Expand Up @@ -38,12 +38,12 @@
</media-player>
</div>
{% if include.chapters %}
<div class="p2p-player-chapters" data-stream-url="{{ stream_url }}">
<div class="p2p-player-chapters">
{{ include.chapters | strip | newline_to_br }}
</div>
{% endif %}
{% if include.description %}
<div class="p2p-player-description" data-stream-url="{{ stream_url }}">
<div class="p2p-player-description">
{{ include.description | strip | markdownify }}
</div>
{% endif %}
Expand Down
2 changes: 1 addition & 1 deletion _includes/zapthreads.html
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ <h3>&nbsp;Nostr Login</h3>
<h3>&nbsp;Nostr Login</h3>
</div>
<div class="modal-body">
Please login using <a href="https://github.com/aljazceru/awesome-nostr#nip-07-browser-extensions" rel="noopener noreferrer" target="_blank">NIP-07 compatible extension</a> (such as <span class="extension-example">nos2x</span>) that {% include span_with_tooltip.html large="true" body="securely enough" tooltip="This website doesn't store your private key (and don't recommend entering it on <i>any</i> website as well, otherwise it'd be easy to steal it by some malicious browser extension <span class='no-wrap'>or user script).</span>" %} isolates your private key.
Please login using <a href="https://github.com/aljazceru/awesome-nostr#nip-07-browser-extensions" rel="noopener noreferrer" target="_blank">NIP-07 compatible extension</a> (such as <span class="extension-example">nos2x</span>) that {% include span_with_tooltip.html large="true" body="securely enough" tooltip="This website doesn't store your private key (and doesn't recommend entering it on <i>any</i> website as well, otherwise it'd be easy to steal it by some malicious browser extension <span class='no-wrap'>or user script).</span>" %} isolates your private key.
</div>
<div class="modal-footer justify-content-center">
<button type="button" class="btn btn-primary" data-bs-dismiss="modal" id="installNostrExtension">Install nos2x</button>
Expand Down
3 changes: 0 additions & 3 deletions _sass/includes/_p2p_player.scss
Original file line number Diff line number Diff line change
Expand Up @@ -203,9 +203,6 @@
line-height: 0.9;
column-count: 3;
column-gap: 1em;
li {
display: flex;
}
a {
color: $date-color;
width: 100%;
Expand Down

Large diffs are not rendered by default.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion assets/js/vendor/vidstack-player/vidstack.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ nostr:
17:34 Итоги"

description="
Использованное видео: [Scaling Git at Microsoft - Git Merge 2017](https://youtu.be/g_MPGU_m01s)
Использованное видео:
- [Scaling Git at Microsoft - Git Merge 2017](https://youtu.be/g_MPGU_m01s)

Музыка Chris Zabriskie (распространяется на условиях лицензии CC BY 4.0):
- CGI Snake
Expand Down

0 comments on commit 72a7c3f

Please sign in to comment.