Fix on-the-fly writing of playlist
This commit is contained in:
parent
f1e6800a15
commit
5194345c0c
|
@ -77,7 +77,7 @@ public abstract class AbstractHlsDownload extends AbstractDownload {
|
||||||
private static final int A_FEW_SECONDS = 10_000;
|
private static final int A_FEW_SECONDS = 10_000;
|
||||||
private static final int MAX_SECONDS_WITHOUT_TRANSFER = 30;
|
private static final int MAX_SECONDS_WITHOUT_TRANSFER = 30;
|
||||||
|
|
||||||
private NumberFormat nf = new DecimalFormat("000000");
|
private final NumberFormat nf = new DecimalFormat("000000");
|
||||||
private int playlistEmptyCount = 0;
|
private int playlistEmptyCount = 0;
|
||||||
private int segmentCounter = 1;
|
private int segmentCounter = 1;
|
||||||
|
|
||||||
|
@ -94,7 +94,7 @@ public abstract class AbstractHlsDownload extends AbstractDownload {
|
||||||
private Instant lastSegmentDownload = Instant.MAX;
|
private Instant lastSegmentDownload = Instant.MAX;
|
||||||
private int selectedResolution = UNKNOWN;
|
private int selectedResolution = UNKNOWN;
|
||||||
|
|
||||||
private List<RecordingEvent> recordingEvents = new LinkedList<>();
|
private final List<RecordingEvent> recordingEvents = new LinkedList<>();
|
||||||
protected ExecutorCompletionService<SegmentDownload> segmentDownloadService;
|
protected ExecutorCompletionService<SegmentDownload> segmentDownloadService;
|
||||||
|
|
||||||
protected AbstractHlsDownload(HttpClient client) {
|
protected AbstractHlsDownload(HttpClient client) {
|
||||||
|
@ -176,7 +176,7 @@ public abstract class AbstractHlsDownload extends AbstractDownload {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void processFinishedSegments() {
|
protected void processFinishedSegments() {
|
||||||
downloadExecutor.submit((Runnable)() -> {
|
downloadExecutor.submit(() -> {
|
||||||
Future<SegmentDownload> future;
|
Future<SegmentDownload> future;
|
||||||
while ((future = segmentDownloadService.poll()) != null) {
|
while ((future = segmentDownloadService.poll()) != null) {
|
||||||
try {
|
try {
|
||||||
|
@ -193,7 +193,7 @@ public abstract class AbstractHlsDownload extends AbstractDownload {
|
||||||
|
|
||||||
protected abstract void execute(SegmentDownload segmentDownload);
|
protected abstract void execute(SegmentDownload segmentDownload);
|
||||||
|
|
||||||
protected void handleHttpException(HttpException e) throws IOException {
|
protected void handleHttpException(HttpException e) {
|
||||||
if (e.getResponseCode() == 404) {
|
if (e.getResponseCode() == 404) {
|
||||||
checkIfModelIsStillOnline("Playlist not found (404). Model {} probably went offline. Model state: {}");
|
checkIfModelIsStillOnline("Playlist not found (404). Model {} probably went offline. Model state: {}");
|
||||||
} else if (e.getResponseCode() == 403) {
|
} else if (e.getResponseCode() == 403) {
|
||||||
|
@ -207,7 +207,7 @@ public abstract class AbstractHlsDownload extends AbstractDownload {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void checkIfModelIsStillOnline(String errorMsg) throws IOException {
|
protected void checkIfModelIsStillOnline(String errorMsg) {
|
||||||
ctbrec.Model.State modelState;
|
ctbrec.Model.State modelState;
|
||||||
try {
|
try {
|
||||||
modelState = model.getOnlineState(false);
|
modelState = model.getOnlineState(false);
|
||||||
|
@ -323,7 +323,7 @@ public abstract class AbstractHlsDownload extends AbstractDownload {
|
||||||
uri = new URL(context, uri).toExternalForm();
|
uri = new URL(context, uri).toExternalForm();
|
||||||
}
|
}
|
||||||
lsp.totalDuration += trackData.getTrackInfo().duration;
|
lsp.totalDuration += trackData.getTrackInfo().duration;
|
||||||
lsp.segments.add(new Segment(uri, trackData.getTrackInfo().duration));
|
lsp.segments.add(new Segment(uri, Math.max(0, trackData.getTrackInfo().duration)));
|
||||||
if (trackData.hasEncryptionData()) {
|
if (trackData.hasEncryptionData()) {
|
||||||
lsp.encrypted = true;
|
lsp.encrypted = true;
|
||||||
EncryptionData data = trackData.getEncryptionData();
|
EncryptionData data = trackData.getEncryptionData();
|
||||||
|
@ -364,7 +364,7 @@ public abstract class AbstractHlsDownload extends AbstractDownload {
|
||||||
DateTimeFormatter dtf = DateTimeFormatter.ISO_LOCAL_TIME;
|
DateTimeFormatter dtf = DateTimeFormatter.ISO_LOCAL_TIME;
|
||||||
for (RecordingEvent recordingEvent : recordingEvents) {
|
for (RecordingEvent recordingEvent : recordingEvents) {
|
||||||
ZonedDateTime dateTime = recordingEvent.timestamp.atZone(ZoneId.systemDefault());
|
ZonedDateTime dateTime = recordingEvent.timestamp.atZone(ZoneId.systemDefault());
|
||||||
br.append(dtf.format(dateTime) + " " + model + " " + recordingEvent.message);
|
br.append(dtf.format(dateTime)).append(' ').append(model.toString()).append(' ').append(recordingEvent.message);
|
||||||
br.newLine();
|
br.newLine();
|
||||||
}
|
}
|
||||||
br.flush();
|
br.flush();
|
||||||
|
|
|
@ -21,14 +21,10 @@ import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Future;
|
import java.util.concurrent.Future;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import com.iheartradio.m3u8.*;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import com.iheartradio.m3u8.Encoding;
|
|
||||||
import com.iheartradio.m3u8.Format;
|
|
||||||
import com.iheartradio.m3u8.ParseException;
|
|
||||||
import com.iheartradio.m3u8.PlaylistException;
|
|
||||||
import com.iheartradio.m3u8.PlaylistWriter;
|
|
||||||
import com.iheartradio.m3u8.data.MediaPlaylist;
|
import com.iheartradio.m3u8.data.MediaPlaylist;
|
||||||
import com.iheartradio.m3u8.data.Playlist;
|
import com.iheartradio.m3u8.data.Playlist;
|
||||||
import com.iheartradio.m3u8.data.PlaylistType;
|
import com.iheartradio.m3u8.data.PlaylistType;
|
||||||
|
@ -48,9 +44,9 @@ public class HlsDownload extends AbstractHlsDownload {
|
||||||
|
|
||||||
protected Path downloadDir;
|
protected Path downloadDir;
|
||||||
|
|
||||||
private Queue<Future<SegmentDownload>> segmentDownloads = new LinkedList<>();
|
private final Queue<Future<SegmentDownload>> segmentDownloads = new LinkedList<>();
|
||||||
|
|
||||||
private List<TrackData> segments = new LinkedList<>();
|
private final List<TrackData> segments = new LinkedList<>();
|
||||||
|
|
||||||
private float targetDuration;
|
private float targetDuration;
|
||||||
|
|
||||||
|
@ -85,6 +81,9 @@ public class HlsDownload extends AbstractHlsDownload {
|
||||||
private void updatePlaylist() {
|
private void updatePlaylist() {
|
||||||
downloadExecutor.submit(() -> {
|
downloadExecutor.submit(() -> {
|
||||||
addNewSegmentsToPlaylist();
|
addNewSegmentsToPlaylist();
|
||||||
|
if (segments.isEmpty() || targetDuration <= 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
MediaPlaylist playlist = new MediaPlaylist.Builder()
|
MediaPlaylist playlist = new MediaPlaylist.Builder()
|
||||||
.withPlaylistType(PlaylistType.VOD)
|
.withPlaylistType(PlaylistType.VOD)
|
||||||
|
@ -110,7 +109,14 @@ public class HlsDownload extends AbstractHlsDownload {
|
||||||
.build();
|
.build();
|
||||||
writer.write(master);
|
writer.write(master);
|
||||||
}
|
}
|
||||||
} catch (IOException | ParseException | PlaylistException e) {
|
} catch (PlaylistException e) {
|
||||||
|
LOG.error("Updating segment playlist failed", e);
|
||||||
|
if (e.getErrors() != null) {
|
||||||
|
for (PlaylistError error : e.getErrors()) {
|
||||||
|
LOG.error("Playlist Error: {}", error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException | ParseException e) {
|
||||||
LOG.error("Updating segment playlist failed", e);
|
LOG.error("Updating segment playlist failed", e);
|
||||||
}
|
}
|
||||||
LOG.trace("Segment queue size for {}: {}", model, segmentDownloads.size());
|
LOG.trace("Segment queue size for {}: {}", model, segmentDownloads.size());
|
||||||
|
|
Loading…
Reference in New Issue