public void UpdateSubset(WebData webData, long subsetID = 0, string name = null) { MDBSubset subset; if (subsetID <= 0) { subset = new MDBSubset() { ID = CaveSystemData.CalculateID(name), Name = name, }; subset.ID = mdb.Subsets.Insert(subset); } else { subset = mdb.Subsets.TryGetStruct(subsetID); if (subset.ID == 0) { throw new WebServerException(WebError.DatasetMissing, 0, "Subset does not exist!"); } if (name != null) { subset.Name = name; } mdb.Subsets.Replace(subset); } mdb.Save(); GetSubsetList(webData); GetSubsetFilterList(webData, subset.ID); }
/// <summary>Selects the next file.</summary> /// <param name="streamID">The stream identifier.</param> /// <returns>Returns true on success, false otherwise</returns> public MDBFileSelection SelectNextFile(long streamID) { var config = mdb.GetStreamSettings(streamID); MDBSubset subset = mdb.Subsets.TryGetStruct(config.SubsetID); if (subset.ID == 0) { subset.Name = "Undefined"; } int seqNumber = mdb.Subsets.SequenceNumber ^ mdb.SubsetFilters.SequenceNumber ^ mdb.AudioFiles.SequenceNumber; if (audioFileIDs == null || seqNumber != sequenceNumber) { audioFileIDs = mdb.GetSubsetAudioFileIDs(subset.ID, config.MinimumLength, config.MaximumLength); if (subset.TitleCount != audioFileIDs.Count) { subset.TitleCount = audioFileIDs.Count; if (subset.ID > 0) { mdb.Subsets.Update(subset); } } sequenceNumber = seqNumber; this.LogInfo("Reloaded subset {0} at player", subset); } if (subset.ID > 0 && subset.TitleCount != audioFileIDs.Count) { subset.TitleCount = audioFileIDs.Count; try { mdb.Subsets.Update(subset); this.LogInfo("Subset {0} title count updated!", subset); } catch { } } if (audioFileIDs.Count == 0) { this.LogDebug("No subset defined or subset result empty for stream <red>{0}<default> selecting random titles.", streamID); audioFileIDs = mdb.AudioFiles.IDs; } if (audioFileIDs.Count == 0) { this.LogDebug("No audio files found!"); Selection = null; return(null); } var listSearch = Search.FieldEquals(nameof(MDBPlayListItem.StreamID), streamID); while (true) { Func <long> getCount = () => mdb.PlayListItems.Count(listSearch); //fill playlist for (int n = 0; getCount() < config.MinimumTitleCount; n++) { //max 4 tries per slot if (n > config.MinimumTitleCount * 4) { break; } int i = (int)((rnd.Next() * (long)rnd.Next()) % audioFileIDs.Count); long nextID = audioFileIDs[i]; //audiofile valid ? MDBAudioFile audioFile; if (!mdb.AudioFiles.TryGetStruct(nextID, out audioFile)) { continue; } //file does not exist if (!File.Exists(mdb.Files.TryGetStruct(audioFile.FileID).GetFullPath(mdb))) { mdb.AudioFiles.TryDelete(audioFile.FileID); mdb.Files.TryDelete(audioFile.FileID); this.LogError("AudioFile <red>{0}<default> removed (inaccessible).", audioFile); continue; } //yes, playlist contains id already ? if (mdb.PlayListItems.Exist(listSearch & Search.FieldEquals(nameof(MDBPlayListItem.AudioFileID), nextID))) { continue; } //no add mdb.PlayListItems.Insert(new MDBPlayListItem() { AudioFileID = audioFile.FileID, StreamID = streamID, SubsetID = subset.ID, Added = DateTime.UtcNow.AddTicks(DefaultRNG.Int8), }); this.LogInfo("Added audio file {0} from subset {1} to {2} playlist.", audioFile, subset, streamID); } mdb.Save(); //get current entry try { var items = mdb.PlayListItems.GetStructs( listSearch & Search.FieldGreater(nameof(MDBPlayListItem.OwnerID), 0), ResultOption.SortAscending(nameof(MDBPlayListItem.Added)) + ResultOption.Limit(1)); if (items.Count == 0) { items = mdb.PlayListItems.GetStructs( listSearch & Search.FieldEquals(nameof(MDBPlayListItem.OwnerID), 0), ResultOption.SortAscending(nameof(MDBPlayListItem.Added)) + ResultOption.Limit(1)); } var item = items.FirstOrDefault(); if (item.ID == 0) { continue; } try { var result = Selection = MDBFileSelection.Load(mdb, item); return(result); } finally { //always remove playlistitem (even on errors) mdb.PlayListItems.TryDelete(item.ID); } } catch (Exception ex) { this.LogError(ex, "Cannot start stream {0}!", streamID, ex.Message); Selection = null; return(null); } } }