mirror of
https://github.com/m1k1o/neko.git
synced 2024-07-24 14:40:50 +12:00
Compare commits
9 Commits
Author | SHA1 | Date | |
---|---|---|---|
334fcef407 | |||
e868ad4061 | |||
b41d0bf956 | |||
b62fa6ab8b | |||
8dba9cff44 | |||
217cc451ea | |||
1f81bd3efc | |||
50e5483661 | |||
d2765c30fd |
@ -133,6 +133,7 @@ ENV DISPLAY=:99.0
|
|||||||
ENV NEKO_PASSWORD=neko
|
ENV NEKO_PASSWORD=neko
|
||||||
ENV NEKO_PASSWORD_ADMIN=admin
|
ENV NEKO_PASSWORD_ADMIN=admin
|
||||||
ENV NEKO_BIND=:8080
|
ENV NEKO_BIND=:8080
|
||||||
|
ENV NEKO_HWENC=VAAPI
|
||||||
ENV RENDER_GID=
|
ENV RENDER_GID=
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -15,6 +15,11 @@ RUN set -eux; apt-get update; \
|
|||||||
apt-get clean -y; \
|
apt-get clean -y; \
|
||||||
rm -rf /var/lib/apt/lists/* /var/cache/apt/*
|
rm -rf /var/lib/apt/lists/* /var/cache/apt/*
|
||||||
|
|
||||||
|
#
|
||||||
|
# disable autolock
|
||||||
|
RUN kwriteconfig5 --file /home/neko/.config/kscreenlockerrc --group Daemon --key Autolock false; \
|
||||||
|
chown neko:neko /home/neko/.config/kscreenlockerrc
|
||||||
|
|
||||||
#
|
#
|
||||||
# copy configuation files
|
# copy configuation files
|
||||||
COPY supervisord.conf /etc/neko/supervisord/kde.conf
|
COPY supervisord.conf /etc/neko/supervisord/kde.conf
|
||||||
|
@ -1,17 +1,22 @@
|
|||||||
<template>
|
<template>
|
||||||
<div id="neko" :class="[!hideControls && side ? 'expanded' : '']">
|
<div id="neko" :class="[!videoOnly && side ? 'expanded' : '']">
|
||||||
<template v-if="!$client.supported">
|
<template v-if="!$client.supported">
|
||||||
<neko-unsupported />
|
<neko-unsupported />
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<main class="neko-main">
|
<main class="neko-main">
|
||||||
<div v-if="!hideControls" class="header-container">
|
<div v-if="!videoOnly" class="header-container">
|
||||||
<neko-header />
|
<neko-header />
|
||||||
</div>
|
</div>
|
||||||
<div class="video-container">
|
<div class="video-container">
|
||||||
<neko-video ref="video" :hideControls="hideControls" @control-attempt="controlAttempt" />
|
<neko-video
|
||||||
|
ref="video"
|
||||||
|
:hideControls="hideControls"
|
||||||
|
:extraControls="isEmbedMode"
|
||||||
|
@control-attempt="controlAttempt"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="!hideControls" class="room-container">
|
<div v-if="!videoOnly" class="room-container">
|
||||||
<neko-members />
|
<neko-members />
|
||||||
<div class="room-menu">
|
<div class="room-menu">
|
||||||
<div class="settings">
|
<div class="settings">
|
||||||
@ -26,11 +31,11 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
<neko-side v-if="!hideControls && side" />
|
<neko-side v-if="!videoOnly && side" />
|
||||||
<neko-connect v-if="!connected" />
|
<neko-connect v-if="!connected" />
|
||||||
<neko-about v-if="about" />
|
<neko-about v-if="about" />
|
||||||
<notifications
|
<notifications
|
||||||
v-if="!hideControls"
|
v-if="!videoOnly"
|
||||||
group="neko"
|
group="neko"
|
||||||
position="top left"
|
position="top left"
|
||||||
style="top: 50px; pointer-events: none"
|
style="top: 50px; pointer-events: none"
|
||||||
@ -176,10 +181,22 @@
|
|||||||
|
|
||||||
shakeKbd = false
|
shakeKbd = false
|
||||||
|
|
||||||
get hideControls() {
|
get isCastMode() {
|
||||||
return !!new URL(location.href).searchParams.get('cast')
|
return !!new URL(location.href).searchParams.get('cast')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get isEmbedMode() {
|
||||||
|
return !!new URL(location.href).searchParams.get('embed')
|
||||||
|
}
|
||||||
|
|
||||||
|
get hideControls() {
|
||||||
|
return this.isCastMode
|
||||||
|
}
|
||||||
|
|
||||||
|
get videoOnly() {
|
||||||
|
return this.isCastMode || this.isEmbedMode
|
||||||
|
}
|
||||||
|
|
||||||
@Watch('hideControls', { immediate: true })
|
@Watch('hideControls', { immediate: true })
|
||||||
onHideControls(enabled: boolean) {
|
onHideControls(enabled: boolean) {
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
|
@ -30,17 +30,17 @@
|
|||||||
</div>
|
</div>
|
||||||
<div ref="aspect" class="player-aspect" />
|
<div ref="aspect" class="player-aspect" />
|
||||||
</div>
|
</div>
|
||||||
<ul v-if="!fullscreen" class="video-menu top">
|
<ul v-if="!fullscreen && !hideControls" class="video-menu top">
|
||||||
<li><i @click.stop.prevent="requestFullscreen" class="fas fa-expand"></i></li>
|
<li><i @click.stop.prevent="requestFullscreen" class="fas fa-expand"></i></li>
|
||||||
<li v-if="admin"><i @click.stop.prevent="openResolution" class="fas fa-desktop"></i></li>
|
<li v-if="admin"><i @click.stop.prevent="openResolution" class="fas fa-desktop"></i></li>
|
||||||
<li :class="hideControls || 'request-control'">
|
<li v-if="!implicitHosting" :class="extraControls || 'extra-control'">
|
||||||
<i
|
<i
|
||||||
:class="[hosted && !hosting ? 'disabled' : '', !hosted && !hosting ? 'faded' : '', 'fas', 'fa-keyboard']"
|
:class="[hosted && !hosting ? 'disabled' : '', !hosted && !hosting ? 'faded' : '', 'fas', 'fa-keyboard']"
|
||||||
@click.stop.prevent="toggleControl"
|
@click.stop.prevent="toggleControl"
|
||||||
/>
|
/>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul v-if="!fullscreen" class="video-menu bottom">
|
<ul v-if="!fullscreen && !hideControls" class="video-menu bottom">
|
||||||
<li v-if="hosting && (!clipboard_read_available || !clipboard_write_available)">
|
<li v-if="hosting && (!clipboard_read_available || !clipboard_write_available)">
|
||||||
<i @click.stop.prevent="openClipboard" class="fas fa-clipboard"></i>
|
<i @click.stop.prevent="openClipboard" class="fas fa-clipboard"></i>
|
||||||
</li>
|
</li>
|
||||||
@ -106,12 +106,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.request-control {
|
/* usually extra controls are only shown on mobile */
|
||||||
|
&.extra-control {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
&.request-control {
|
&.extra-control {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -223,13 +223,15 @@
|
|||||||
@Ref('resolution') readonly _resolution!: Resolution
|
@Ref('resolution') readonly _resolution!: Resolution
|
||||||
@Ref('clipboard') readonly _clipboard!: Clipboard
|
@Ref('clipboard') readonly _clipboard!: Clipboard
|
||||||
|
|
||||||
|
// all controls are hidden (e.g. for cast mode)
|
||||||
@Prop(Boolean) readonly hideControls!: boolean
|
@Prop(Boolean) readonly hideControls!: boolean
|
||||||
|
// extra controls are shown (e.g. for embed mode)
|
||||||
|
@Prop(Boolean) readonly extraControls!: boolean
|
||||||
|
|
||||||
private keyboard = GuacamoleKeyboard()
|
private keyboard = GuacamoleKeyboard()
|
||||||
private observer = new ResizeObserver(this.onResize.bind(this))
|
private observer = new ResizeObserver(this.onResize.bind(this))
|
||||||
private focused = false
|
private focused = false
|
||||||
private fullscreen = false
|
private fullscreen = false
|
||||||
private startsMuted = true
|
|
||||||
private mutedOverlay = true
|
private mutedOverlay = true
|
||||||
|
|
||||||
get admin() {
|
get admin() {
|
||||||
@ -361,7 +363,6 @@
|
|||||||
onMutedChanged(muted: boolean) {
|
onMutedChanged(muted: boolean) {
|
||||||
if (this._video && this._video.muted != muted) {
|
if (this._video && this._video.muted != muted) {
|
||||||
this._video.muted = muted
|
this._video.muted = muted
|
||||||
this.startsMuted = muted
|
|
||||||
|
|
||||||
if (!muted) {
|
if (!muted) {
|
||||||
this.mutedOverlay = false
|
this.mutedOverlay = false
|
||||||
@ -392,7 +393,20 @@
|
|||||||
try {
|
try {
|
||||||
await this._video.play()
|
await this._video.play()
|
||||||
} catch (err: any) {
|
} catch (err: any) {
|
||||||
this.$accessor.video.pause()
|
if (!this._video.muted) {
|
||||||
|
// video.play() can fail if audio is set due restrictive
|
||||||
|
// browsers autoplay policy -> retry with muted audio
|
||||||
|
try {
|
||||||
|
this.$accessor.video.setMuted(true)
|
||||||
|
this._video.muted = true
|
||||||
|
await this._video.play()
|
||||||
|
} catch (err: any) {
|
||||||
|
// if it still fails, we're not playing anything
|
||||||
|
this.$accessor.video.pause()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.$accessor.video.pause()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -431,11 +445,6 @@
|
|||||||
this._video.addEventListener('canplaythrough', () => {
|
this._video.addEventListener('canplaythrough', () => {
|
||||||
this.$accessor.video.setPlayable(true)
|
this.$accessor.video.setPlayable(true)
|
||||||
if (this.autoplay) {
|
if (this.autoplay) {
|
||||||
// start as muted due to restrictive browsers autoplay policy
|
|
||||||
if (this.startsMuted && (!document.hasFocus() || !this.$accessor.active)) {
|
|
||||||
this.$accessor.video.setMuted(true)
|
|
||||||
}
|
|
||||||
|
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.$accessor.video.play()
|
this.$accessor.video.play()
|
||||||
})
|
})
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
- Added AV1 tag, metadata and pipeline. Unfortunately does not work yet, since the encoding is way too slow (by @mbattista).
|
- Added AV1 tag, metadata and pipeline. Unfortunately does not work yet, since the encoding is way too slow (by @mbattista).
|
||||||
- Added `m1k1o/neko:kde` tag as an alternative to `m1k1o/neko:xfce`.
|
- Added `m1k1o/neko:kde` tag as an alternative to `m1k1o/neko:xfce`.
|
||||||
- New VirtualGL version 3.1 was released, adding support for Chromium browsers to use Nvidia GPU acceleration!
|
- New VirtualGL version 3.1 was released, adding support for Chromium browsers to use Nvidia GPU acceleration!
|
||||||
|
- Added `?embed=1` parameter to the URL, which will hide the sidebar and the top bar, so that it can be embedded in other websites.
|
||||||
|
|
||||||
### Bugs
|
### Bugs
|
||||||
- Fixed TCP mux occasional freeze by adding write buffer to it.
|
- Fixed TCP mux occasional freeze by adding write buffer to it.
|
||||||
@ -19,6 +20,8 @@
|
|||||||
- Updated to go 1.19 and Node 18, removed go-events as dependency (by @mbattista).
|
- Updated to go 1.19 and Node 18, removed go-events as dependency (by @mbattista).
|
||||||
- Added adaptive framerate which now streams in the framerate you selected from the dropdown.
|
- Added adaptive framerate which now streams in the framerate you selected from the dropdown.
|
||||||
- Improved chinese and korean characters support.
|
- Improved chinese and korean characters support.
|
||||||
|
- Disabled autolock for kde, so that it does not lock the screen when you are not using it.
|
||||||
|
- Refactored autoplay, so that it will start playing audio, if it's allowed by the browser (by @urbanekpj).
|
||||||
|
|
||||||
## [n.eko v2.7](https://github.com/m1k1o/neko/releases/tag/v2.7)
|
## [n.eko v2.7](https://github.com/m1k1o/neko/releases/tag/v2.7)
|
||||||
|
|
||||||
|
@ -230,6 +230,7 @@ Note, currently only browser GPU acceleration is supported, not encoding.
|
|||||||
- Adding `?pwd=<password>` will prefill password.
|
- Adding `?pwd=<password>` will prefill password.
|
||||||
- Adding `?usr=<display-name>` will prefill username.
|
- Adding `?usr=<display-name>` will prefill username.
|
||||||
- Adding `?cast=1` will hide all control and show only video.
|
- Adding `?cast=1` will hide all control and show only video.
|
||||||
|
- Adding `?embed=1` will hide most additional components and show only video.
|
||||||
- e.g. `http(s)://<URL:Port>/?pwd=neko&usr=guest&cast=1`
|
- e.g. `http(s)://<URL:Port>/?pwd=neko&usr=guest&cast=1`
|
||||||
|
|
||||||
### Screen size
|
### Screen size
|
||||||
|
@ -25,7 +25,7 @@ nat1to1: <ip>
|
|||||||
- Control protection means, users can gain control only if at least one admin is in the room.
|
- Control protection means, users can gain control only if at least one admin is in the room.
|
||||||
- e.g. `false`
|
- e.g. `false`
|
||||||
#### `NEKO_IMPLICIT_CONTROL`:
|
#### `NEKO_IMPLICIT_CONTROL`:
|
||||||
- If enabled members can gain control implicitly, they don't needd to request control.
|
- If enabled members can gain control implicitly, they don't need to request control.
|
||||||
- e.g. `false`
|
- e.g. `false`
|
||||||
#### `NEKO_LOCKS`:
|
#### `NEKO_LOCKS`:
|
||||||
- Resources, that will be locked when starting, separated by whitespace.
|
- Resources, that will be locked when starting, separated by whitespace.
|
||||||
|
Reference in New Issue
Block a user