From 1bea13dc0542af98e1e05b707a31c75bf7f3bfa1 Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Sun, 31 May 2020 17:20:25 +0200 Subject: [PATCH] Improve server download progress calculation --- CHANGELOG.md | 11 +++++++++++ .../main/java/ctbrec/ui/tabs/RecordingsTab.java | 2 +- .../download/hls/MergedFfmpegHlsDownload.java | 17 ++++++++++------- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6846751b..e2dd7fcc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +3.7.1 +======================== +* Server now logs in on startup, if credentials are set +* Show confirmation dialog on shutdown, if the are active downloads from the + server +* Added setting to remove recordings after post-processing +* Added max resolution setting for the player (click on the gear!) +* Added systemd service example for the server +* Server now returns the version in the HTML and HTTP headers +* Improved server download progress calculation + 3.7.0 ======================== * Fixed the problem, that media players won't start anymore diff --git a/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java b/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java index 2344badf..ecfc2dba 100644 --- a/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java +++ b/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java @@ -584,7 +584,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener { MergedFfmpegHlsDownload download = new MergedFfmpegHlsDownload(CamrecApplication.httpClient); download.init(config, recording.getModel(), Instant.now()); LOG.info("Downloading {}", url); - download.downloadFinishedRecording(url.toString(), target, createDownloadListener(recording)); + download.downloadFinishedRecording(url.toString(), target, createDownloadListener(recording), recording.getSizeInByte()); } } catch (FileNotFoundException e) { showErrorDialog(ERROR_WHILE_DOWNLOADING_RECORDING, "The target file couldn't be created", e); diff --git a/common/src/main/java/ctbrec/recorder/download/hls/MergedFfmpegHlsDownload.java b/common/src/main/java/ctbrec/recorder/download/hls/MergedFfmpegHlsDownload.java index 6c2fb850..5bff886a 100644 --- a/common/src/main/java/ctbrec/recorder/download/hls/MergedFfmpegHlsDownload.java +++ b/common/src/main/java/ctbrec/recorder/download/hls/MergedFfmpegHlsDownload.java @@ -470,7 +470,7 @@ public class MergedFfmpegHlsDownload extends AbstractHlsDownload { } } - public void downloadFinishedRecording(String segmentPlaylistUri, File target, ProgressListener progressListener) throws Exception { + public void downloadFinishedRecording(String segmentPlaylistUri, File target, ProgressListener progressListener, long sizeInBytes) throws Exception { running = true; if (Config.getInstance().getSettings().requireAuthentication) { URL u = new URL(segmentPlaylistUri); @@ -489,19 +489,18 @@ public class MergedFfmpegHlsDownload extends AbstractHlsDownload { } SegmentPlaylist segmentPlaylist = getNextSegments(segmentPlaylistUri); - int fileCounter = 0; + long loadedBytes = 0; for (String segmentUrl : segmentPlaylist.segments) { - downloadFile(segmentUrl); - fileCounter++; - int total = segmentPlaylist.segments.size(); - int progress = (int) (fileCounter / (double) total * 100); + loadedBytes += downloadFile(segmentUrl, loadedBytes, sizeInBytes, progressListener); + int progress = (int) (loadedBytes / (double) sizeInBytes * 100); progressListener.update(progress); } internalStop(); } - private void downloadFile(String fileUri) throws IOException { + private long downloadFile(String fileUri, long loadedBytes, long totalBytes, ProgressListener progressListener) throws IOException { + long fileLoadedBytes = 0; Request request = new Request.Builder().url(fileUri).addHeader("connection", "keep-alive").build(); try (Response response = client.execute(request)) { if (response.isSuccessful()) { @@ -510,11 +509,15 @@ public class MergedFfmpegHlsDownload extends AbstractHlsDownload { int length = -1; while ((length = in.read(b)) >= 0) { ffmpegStdIn.write(b, 0, length); + fileLoadedBytes += length; + int progress = (int) ((loadedBytes + fileLoadedBytes) / (double) totalBytes * 100); + progressListener.update(progress); } } else { throw new HttpException(response.code(), response.message()); } } + return fileLoadedBytes; } @Override