private string BroadcastChannel(
int? yellowPageId,
string sourceUri,
string contentReader,
JObject info,
JObject track,
string sourceStream=null)
{
IYellowPageClient yp = null;
if (yellowPageId.HasValue) {
yp = PeerCast.YellowPages.FirstOrDefault(y => GetObjectId(y)==yellowPageId.Value);
if (yp==null) throw new RPCError(RPCErrorCode.InvalidParams, "Yellow page not found");
}
if (sourceUri==null) throw new RPCError(RPCErrorCode.InvalidParams, "source uri required");
Uri source;
try {
source = new Uri(sourceUri);
}
catch (UriFormatException) {
throw new RPCError(RPCErrorCode.InvalidParams, "Invalid Uri");
}
var content_reader = PeerCast.ContentReaderFactories.FirstOrDefault(reader => reader.Name==contentReader);
if (content_reader==null) throw new RPCError(RPCErrorCode.InvalidParams, "Content reader not found");
var source_stream = PeerCast.SourceStreamFactories
.Where(sstream => (sstream.Type & SourceStreamType.Broadcast)!=0)
.FirstOrDefault(sstream => sstream.Name==sourceStream);
if (source_stream==null) {
source_stream = PeerCast.SourceStreamFactories
.Where(sstream => (sstream.Type & SourceStreamType.Broadcast)!=0)
.FirstOrDefault(sstream => sstream.Scheme==source.Scheme);
}
if (source_stream==null) throw new RPCError(RPCErrorCode.InvalidParams, "Source stream not found");
var new_info = new AtomCollection();
if (info!=null) {
info.TryGetThen("name", v => new_info.SetChanInfoName(v));
info.TryGetThen("url", v => new_info.SetChanInfoURL(v));
info.TryGetThen("genre", v => new_info.SetChanInfoGenre(v));
info.TryGetThen("desc", v => new_info.SetChanInfoDesc(v));
info.TryGetThen("comment", v => new_info.SetChanInfoComment(v));
}
var channel_info = new ChannelInfo(new_info);
if (channel_info.Name==null || channel_info.Name=="") {
throw new RPCError(RPCErrorCode.InvalidParams, "Channel name must not be empty");
}
var channel_id = PeerCastStation.Core.BroadcastChannel.CreateChannelID(
PeerCast.BroadcastID,
channel_info.Name,
channel_info.Genre ?? "",
source.ToString());
var channel = PeerCast.BroadcastChannel(yp, channel_id, channel_info, source, source_stream, content_reader);
if (track!=null) {
var new_track = new AtomCollection(channel.ChannelTrack.Extra);
track.TryGetThen("name", v => new_track.SetChanTrackTitle(v));
track.TryGetThen("genre", v => new_track.SetChanTrackGenre(v));
track.TryGetThen("album", v => new_track.SetChanTrackAlbum(v));
track.TryGetThen("creator", v => new_track.SetChanTrackCreator(v));
track.TryGetThen("url", v => new_track.SetChanTrackURL(v));
channel.ChannelTrack = new ChannelTrack(new_track);
}
return channel.ChannelID.ToString("N").ToUpper();
}