Add video stream, Add Docker build
Some checks failed
Build and push container / Build-Docker-Container (push) Has been cancelled

This commit is contained in:
MrLetsplay 2025-02-14 21:56:34 +01:00
parent 04b17abdee
commit f3033187af
Signed by: mr
SSH Key Fingerprint: SHA256:92jBH80vpXyaZHjaIl47pjRq+Yt7XGTArqQg1V7hSqg
5 changed files with 116 additions and 4 deletions

View File

@ -0,0 +1,37 @@
name: Build and push container
run-name: ${{ gitea.actor }} is building the container
on: [push]
jobs:
Build-Docker-Container:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to registry
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: mrletsplay/aadl
tags: |
type=sha
type=raw,latest
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
file: docker/Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}

33
docker/Dockerfile Normal file
View File

@ -0,0 +1,33 @@
FROM maven:latest as builder
COPY . /workspace
WORKDIR /workspace
RUN mvn clean package
FROM alpine:latest
ENV UID=1000
ENV GID=1000
RUN apk update && apk add openjdk17 shadow sudo
COPY --from=builder /workspace/target/VideoBase-*.jar /app/VideoBase.jar
COPY --from=mrletsplay/docker_launcher /usr/local/bin/docker_launcher /usr/local/bin/docker_launcher
COPY ./docker/launcher_config.json /app/launcher_config.json
RUN useradd app
RUN mkdir /app/data && chown -R app /app/data
VOLUME ["/app/data"]
WORKDIR /app/data
EXPOSE 3706
ENTRYPOINT [ "docker_launcher", "--config", "/app/launcher_config.json", "sudo", "-u", "app" ]
CMD [ "java", "-jar", "/app/VideoBase.jar" ]

View File

@ -0,0 +1,11 @@
{
"updateUID": true,
"user": "app",
"updateGID": true,
"group": "app",
"runBefore": [
[ "chown", "-R", "app:app", "/app" ]
]
}

View File

@ -10,8 +10,8 @@ import java.util.concurrent.TimeUnit;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.slf4j.helpers.NOPLogger;
import ch.qos.logback.classic.Level;
import me.mrletsplay.mrcore.json.JSONObject; import me.mrletsplay.mrcore.json.JSONObject;
import me.mrletsplay.mrcore.json.converter.JSONConverter; import me.mrletsplay.mrcore.json.converter.JSONConverter;
import me.mrletsplay.mrcore.json.converter.SerializationOption; import me.mrletsplay.mrcore.json.converter.SerializationOption;
@ -55,12 +55,15 @@ public class VideoBase {
loadLibrary(); loadLibrary();
executor.scheduleWithFixedDelay(VideoBase::loadLibrary, 10, 10, TimeUnit.MINUTES); executor.scheduleWithFixedDelay(VideoBase::loadLibrary, 10, 10, TimeUnit.MINUTES);
((ch.qos.logback.classic.Logger) LOGGER).setLevel(Level.INFO);
HttpServer server = new HttpServer(HttpServer.newConfigurationBuilder() HttpServer server = new HttpServer(HttpServer.newConfigurationBuilder()
.hostBindAll() .hostBindAll()
.port(6969) .port(6969)
.poolSize(20) .poolSize(2)
.ioWorkers(3) .ioWorkers(1)
.logger(NOPLogger.NOP_LOGGER) .logger(LOGGER)
// .logger(NOPLogger.NOP_LOGGER)
.defaultCorsConfiguration(CorsConfiguration.createAllowAll()) .defaultCorsConfiguration(CorsConfiguration.createAllowAll())
.create()); .create());

View File

@ -3,6 +3,9 @@ package me.mrletsplay.videobase.rest;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List; import java.util.List;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
@ -154,6 +157,31 @@ public class LibraryAPI implements EndpointCollection {
ctx.getServerHeader().setContent(MimeType.PNG, bOut.toByteArray()); ctx.getServerHeader().setContent(MimeType.PNG, bOut.toByteArray());
} }
@Endpoint(method = HttpRequestMethod.GET, path = "/video/{video}/stream", pathPattern = true)
public void getStream(HttpRequestContext ctx, @RequestParameter("video") String videoId) {
Video video = VideoBase.getLibrary().findVideoById(videoId);
if(video == null) {
ctx.respond(HttpStatusCodes.NOT_FOUND_404, new TextResponse("Not found"));
return;
}
Path videoPath = video.getPath();
if(!Files.isRegularFile(videoPath)) {
ctx.respond(HttpStatusCodes.NOT_FOUND_404, new TextResponse("Video file not found"));
return;
}
try {
long length = Files.size(videoPath);
InputStream in = Files.newInputStream(videoPath);
ctx.getServerHeader().setCompressionEnabled(false);
ctx.getServerHeader().setContent(MimeType.of("video/mpeg"), in, length);
} catch (IOException e) {
ctx.respond(HttpStatusCodes.INTERNAL_SERVER_ERROR_500, new TextResponse("Failed to load video"));
return;
}
}
private JSONObject videoToJSON(Video video) { private JSONObject videoToJSON(Video video) {
JSONObject v = new JSONObject(); JSONObject v = new JSONObject();
v.put("id", video.getId()); v.put("id", video.getId());