protected override void RestoreState() { var state = DownloadStateIO.LoadMultiSourceHLSDownloadState(Id !); this._state = state; try { Log.Debug("Restoring chunks from: " + Path.Combine(state.TempDirectory, "chunks.db")); if (!TransactedIO.ReadStream("chunks.db", state.TempDirectory, s => { _chunks = ChunkStateFromBytes(s); })) { throw new FileNotFoundException(Path.Combine(state.TempDirectory, "chunks.db")); } var hlsDir = state.TempDirectory; var streamMap = _chunks.Select(c => new { c.Id, TempFilePath = Path.Combine(hlsDir, (c.StreamIndex == 0 ? "1_" : "2_") + c.Id + FileHelper.GetFileName(c.Uri)) }).ToDictionary(e => e.Id, e => e.TempFilePath); _chunkStreamMap = new SimpleStreamMap { StreamMap = streamMap }; var count = 0; totalDownloadedBytes = 0; _chunks.ForEach(c => { if (c.ChunkState == ChunkState.Finished) { count++; } if (c.Downloaded > 0) { totalDownloadedBytes += c.Downloaded; } }); ticksAtDownloadStartOrResume = Helpers.TickCount(); this.lastProgress = (count * 100) / _chunks.Count; Log.Debug("Already downloaded: " + count + " Total: " + _chunks.Count); } catch { // ignored Log.Debug("Chunk restore failed"); } }
private static void CreateChunks2(MultiSourceDASHDownloadState state, List <MultiSourceChunk> chunks, SimpleStreamMap chunkStreamMap) { var i = 0; if (state.Demuxed && state.VideoSegments != null && state.AudioSegments != null) { for (; i < Math.Min(state.AudioChunkCount, state.VideoChunkCount); i++) { var chunk1 = CreateChunk(state.VideoSegments[i], 0); chunks.Add(chunk1); chunkStreamMap.StreamMap[chunk1.Id] = Path.Combine(state.TempDirectory, "1_" + chunk1.Id + FileHelper.GetFileName(chunk1.Uri)); var chunk2 = CreateChunk(state.AudioSegments[i], 1); chunks.Add(chunk2); chunkStreamMap.StreamMap[chunk2.Id] = Path.Combine(state.TempDirectory, "2_" + chunk2.Id + FileHelper.GetFileName(chunk2.Uri)); } for (; i < state.VideoChunkCount; i++) { var chunk = CreateChunk(state.VideoSegments[i], 0); chunks.Add(chunk); chunkStreamMap.StreamMap[chunk.Id] = Path.Combine(state.TempDirectory, "1_" + chunk.Id + FileHelper.GetFileName(chunk.Uri)); } for (; i < state.AudioChunkCount; i++) { var chunk = CreateChunk(state.AudioSegments[i], 1); chunks.Add(chunk); chunkStreamMap.StreamMap[chunk.Id] = Path.Combine(state.TempDirectory, "2_" + chunk.Id + FileHelper.GetFileName(chunk.Uri)); } } }
private static void CreateChunks1(MultiSourceDASHDownloadState state, List <MultiSourceChunk> chunks, SimpleStreamMap chunkStreamMap) { var i = 0; var segments = state.VideoSegments ?? state.AudioSegments; if (segments != null) { for (; i < state.VideoChunkCount; i++) { var chunk = CreateChunk(segments[i], 0); chunks.Add(chunk); chunkStreamMap.StreamMap[chunk.Id] = Path.Combine(state.TempDirectory, "1_" + chunk.Id + FileHelper.GetFileName(chunk.Uri)); } } }
protected override void RestoreState() { var state = DownloadStateIO.LoadMultiSourceDASHDownloadState(Id !); this._state = state; //var bytes = TransactedIO.ReadBytes(Id + ".state", Config.DataDir); //if (bytes == null) //{ // throw new FileNotFoundException(Path.Combine(Config.DataDir, Id + ".state")); //} //var state = DownloadStateStore.MultiSourceDASHDownloadStateFromBytes(bytes); //this._state = state; //var text = TransactedIO.Read(Id + ".state", Config.DataDir); //if (text == null) //{ // throw new FileNotFoundException(Path.Combine(Config.DataDir, Id + ".state")); //} ////since all information is available in constructor we assume chunk restore can not fail //var state = JsonConvert.DeserializeObject<MultiSourceDASHDownloadState>( // text); //this._state = state; try { Log.Debug("Restoring chunks from: " + Path.Combine(_state.TempDirectory, "chunks.db")); if (!TransactedIO.ReadStream("chunks.db", state.TempDirectory, s => { _chunks = ChunkStateFromBytes(s);// pieces = ChunkStateFromBytes(s); })) { throw new FileNotFoundException(Path.Combine(state.TempDirectory, "chunks.db")); } //var bytes2 = TransactedIO.ReadBytes("chunks.db", _state.TempDirectory); //if (bytes2 == null) //{ // throw new FileNotFoundException(Path.Combine(_state.TempDirectory, "chunks.json")); //} //_chunks = ChunkStateFromBytes(bytes2); var dashDir = _state.TempDirectory; var streamMap = _chunks.Select(c => new { c.Id, TempFilePath = Path.Combine(dashDir, (c.StreamIndex == 0 ? "1_" : "2_") + c.Id + FileHelper.GetFileName(c.Uri)) }).ToDictionary(e => e.Id, e => e.TempFilePath); _chunkStreamMap = new SimpleStreamMap { StreamMap = streamMap }; } catch (Exception ex) { Log.Debug(ex, "Error loading chunks"); if (state.Demuxed) { CreateChunks2(state, _chunks, _chunkStreamMap); } else { CreateChunks1(state, _chunks, _chunkStreamMap); } } var count = 0; totalDownloadedBytes = 0; _chunks.ForEach(c => { if (c.ChunkState == ChunkState.Finished) { count++; } if (c.Downloaded > 0) { totalDownloadedBytes += c.Downloaded; } }); this.lastProgress = (count * 100) / _chunks.Count; ticksAtDownloadStartOrResume = Helpers.TickCount(); Log.Debug("Already downloaded: " + count); }