private HttpResponse QueueContentsResponse() { var queue = new QueueTracks(); var track = Player.CurrentTrack; if (track != null) { var container = Player.ActivePlaylist ?? Player.MediaLibrary; var canp = new CanpData { DatabaseId = id, ContainerId = container.Id, ContainerItemId = track.Id, TrackId = track.Id }; queue.Add(new QueueTrack() { TrackSpecs = canp.Data, AlbumId = (track.Album != null) ? track.Album.PersistentId : 0, Album = track.AlbumName, AlbumArtist = (track.AlbumArtist != null) ? track.AlbumArtist.Id : 0, Artist = track.ArtistName, Title = track.Title, Genre = track.GenreName, MediaKind = 1, QueueIndex = 1, Upcoming = false }); } return(new DmapResponse(new { ceQR = new { mstt = 200, muty = (byte)0, ceQu = true, // update??? mlcl = queue, apsm = false, aprm = (byte)0 } })); }
private HttpResponse QueueContentsResponse() { var queue = new QueueTracks(); var track = Player.CurrentTrack; if (track != null) { var container = Player.ActivePlaylist ?? Player.MediaLibrary; var canp = new CanpData { DatabaseId = id, ContainerId = container.Id, ContainerItemId = track.Id, TrackId = track.Id }; queue.Add(new QueueTrack() { TrackSpecs = canp.Data, AlbumId = (track.Album != null) ? track.Album.PersistentId : 0, Album = track.AlbumName, AlbumArtist = (track.AlbumArtist != null) ? track.AlbumArtist.Id : 0, Artist = track.ArtistName, Title = track.Title, Genre = track.GenreName, MediaKind = 1, QueueIndex = 1, Upcoming = false }); } return new DmapResponse(new { ceQR = new { mstt = 200, muty = (byte)0, ceQu = true, // update??? mlcl = queue, apsm = false, aprm = (byte)0 } }); }
private HttpResponse PlayStatusUpdateResponse() { var revisionStr = Request.QueryString["revision-number"]; uint revisionNumber = 0; if (!string.IsNullOrEmpty(revisionStr) && uint.TryParse(revisionStr, out revisionNumber)) { if (Session.CtrlIntRevision > 0) { while (revisionNumber > Session.CtrlIntRevision) { Thread.Sleep(50); if (!Request.IsClientConnected) { using (Player.BeginRead()) return(new DmapResponse(new { cmst = new { mstt = 200, cmsr = 0, caps = (byte)2, // play status cash = (byte)Player.CurrentShuffleMode, // shuffle status carp = (byte)Player.CurrentRepeatMode, // repeat status cavc = true, // caas = (int)Player.AvailableShuffleModes << 1, caar = (int)Player.AvailableRepeatModes << 1, casu = false, //ceQu = false, //ceMQ = true, //ceNQ = 0 } })); } } } else { Session.CtrlIntRevision = 1; } } using (Player.BeginRead()) { var state = new Dictionary <string, object>() { { "mstt", 200 }, { "cmsr", Session.CtrlIntRevision + 1 }, { "caps", (byte)Player.CurrentState }, { "cash", (byte)Player.CurrentShuffleMode }, { "carp", (byte)Player.CurrentRepeatMode }, { "cavc", true }, // volume controllable { "caas", (int)Player.AvailableShuffleModes << 1 }, { "caar", (int)Player.AvailableRepeatModes << 1 }, { "casu", false }, { "ceGS", false }, /* * { "cavs", false }, * { "cafs", false }, * { "cafe", false }, * { "cave", false }*/ }; var track = Player.CurrentTrack; if (track != null) { var liveTrack = track as ILiveTrack; var isLive = liveTrack != null && liveTrack.IsLiveStream; var container = Player.ActivePlaylist ?? Player.MediaLibrary; /*var containerItemId = container.Id; * var trackList = container.Tracks as IList<ITrack>; * if (trackList != null) * containerItemId = container.Id + 1 + trackList.IndexOf(track);*/ state["cmmk"] = 1; state["canp"] = new CanpData { DatabaseId = id, ContainerId = container.Id, ContainerItemId = track.Id, TrackId = track.Id }.Data; if (track.Album != null) { state["asai"] = track.Album.PersistentId; } if (!isLive) { state["cann"] = track.Title; state["cana"] = track.ArtistName; state["canl"] = track.AlbumName; state["cang"] = track.GenreName; state["cast"] = (uint)Math.Round(track.Duration.TotalMilliseconds); state["cant"] = (uint)Math.Round((track.Duration - Player.CurrentPosition).TotalMilliseconds); } else { state["cann"] = track.Title; state["cana"] = track.ArtistName; state["canl"] = track.AlbumName; state["cang"] = track.GenreName; state["cant"] = uint.MaxValue; } state["casu"] = true; //state["ceMQ"] = false; //state["ceNQ"] = 0; } state["ceQu"] = false; return(new DmapResponse(new { cmst = state })); } }
private HttpResponse PlayStatusUpdateResponse() { var revisionStr = Request.QueryString["revision-number"]; uint revisionNumber = 0; if (!string.IsNullOrEmpty(revisionStr) && uint.TryParse(revisionStr, out revisionNumber)) { if (Session.CtrlIntRevision > 0) { while (revisionNumber > Session.CtrlIntRevision) { Thread.Sleep(50); if (!Request.IsClientConnected) { using (Player.BeginRead()) return new DmapResponse(new { cmst = new { mstt = 200, cmsr = 0, caps = (byte)2, // play status cash = (byte)Player.CurrentShuffleMode, // shuffle status carp = (byte)Player.CurrentRepeatMode, // repeat status cavc = true, // caas = (int)Player.AvailableShuffleModes << 1, caar = (int)Player.AvailableRepeatModes << 1, casu = false, //ceQu = false, //ceMQ = true, //ceNQ = 0 } }); } } } else Session.CtrlIntRevision = 1; } using (Player.BeginRead()) { var state = new Dictionary<string, object>() { { "mstt", 200 }, { "cmsr", Session.CtrlIntRevision + 1 }, { "caps", (byte)Player.CurrentState }, { "cash", (byte)Player.CurrentShuffleMode }, { "carp", (byte)Player.CurrentRepeatMode }, { "cavc", true }, // volume controllable { "caas", (int)Player.AvailableShuffleModes << 1 }, { "caar", (int)Player.AvailableRepeatModes << 1 }, { "casu", false }, { "ceGS", false }, /* { "cavs", false }, { "cafs", false }, { "cafe", false }, { "cave", false }*/ }; var track = Player.CurrentTrack; if (track != null) { var liveTrack = track as ILiveTrack; var isLive = liveTrack != null && liveTrack.IsLiveStream; var container = Player.ActivePlaylist ?? Player.MediaLibrary; /*var containerItemId = container.Id; var trackList = container.Tracks as IList<ITrack>; if (trackList != null) containerItemId = container.Id + 1 + trackList.IndexOf(track);*/ state["cmmk"] = 1; state["canp"] = new CanpData { DatabaseId = id, ContainerId = container.Id, ContainerItemId = track.Id, TrackId = track.Id }.Data; if (track.Album != null) state["asai"] = track.Album.PersistentId; if (!isLive) { state["cann"] = track.Title; state["cana"] = track.ArtistName; state["canl"] = track.AlbumName; state["cang"] = track.GenreName; state["cast"] = (uint)Math.Round(track.Duration.TotalMilliseconds); state["cant"] = (uint)Math.Round((track.Duration - Player.CurrentPosition).TotalMilliseconds); } else { state["cann"] = track.Title; state["cana"] = track.ArtistName; state["canl"] = track.AlbumName; state["cang"] = track.GenreName; state["cant"] = uint.MaxValue; } state["casu"] = true; //state["ceMQ"] = false; //state["ceNQ"] = 0; } state["ceQu"] = false; return new DmapResponse(new { cmst = state }); } }
/// <summary> /// Answers the /ctrl-int/dbid/getproperty request /// /// Query string arguments are: /// session-id: id of the remote session; /// properties: comma-separated list of properties to get. Remote seems using only 'volume'. /// </summary> /// <returns> /// cmgt --+ /// mstt 4 200 (status) /// cmvo 4 100 (volume, 0-100) /// </returns> private HttpResponse GetPropertyResponse() { var allProps = Request.QueryString["properties"]; var values = new Dictionary <string, object>(); values["mstt"] = 200; if (!string.IsNullOrEmpty(allProps)) { var props = allProps.Split(','); using (Player.BeginRead()) { var track = Player.CurrentTrack; var liveTrack = track as ILiveTrack; var isLive = liveTrack != null && liveTrack.IsLiveStream; foreach (var prop in props) { switch (prop) { case "dmcp.volume": values["cmvo"] = Player.CurrentVolume; break; case "dacp.playerstate": values["caps"] = (byte)Player.CurrentState; break; case "dacp.nowplaying": if (track != null) { var container = Player.ActivePlaylist ?? Player.MediaLibrary; /*var containerItemId = container.Id; * var trackList = container.Tracks as IList<ITrack>; * if (trackList != null) * containerItemId = container.Id + 1 + trackList.IndexOf(track);*/ values["canp"] = new CanpData { DatabaseId = id, ContainerId = container.Id, ContainerItemId = track.Id, TrackId = track.Id }.Data; if (!isLive) { values["cann"] = track.Title; values["cana"] = track.ArtistName; values["canl"] = track.AlbumName; values["cang"] = track.GenreName; } else { values["cann"] = liveTrack.LiveTitle; values["cana"] = liveTrack.LiveArtistName; values["canl"] = liveTrack.LiveAlbumName; values["cang"] = liveTrack.LiveGenreName; } if (track.Album != null) { values["asai"] = track.Album.PersistentId; } values["cmmk"] = 1; } break; case "dacp.playingtime": if (track != null) { if (!isLive) { values["cast"] = (uint)Math.Round(track.Duration.TotalMilliseconds); values["cant"] = (uint)Math.Round((track.Duration - Player.CurrentPosition).TotalMilliseconds); } else { values["cant"] = uint.MaxValue; } } break; case "dacp.volumecontrollable": values["cavc"] = true; break; case "dacp.availableshufflestates": values["caas"] = (int)Player.AvailableShuffleModes << 1; break; case "dacp.availablerepeatstates": values["caar"] = (int)Player.AvailableRepeatModes << 1; break; case "dacp.shufflestate": values["cash"] = (byte)Player.CurrentShuffleMode; break; case "dacp.repeatstate": values["carp"] = (byte)Player.CurrentRepeatMode; break; case "dacp.fullscreenenabled": values["cafe"] = false; break; case "dacp.fullscreen": values["cafs"] = (byte)0; break; case "dacp.visualizerenabled": values["cave"] = false; break; case "dacp.visualizer": values["cavs"] = (byte)0; break; } } } } return(new DmapResponse(new { cmgt = values })); }
/// <summary> /// Answers the /ctrl-int/dbid/getproperty request /// /// Query string arguments are: /// session-id: id of the remote session; /// properties: comma-separated list of properties to get. Remote seems using only 'volume'. /// </summary> /// <returns> /// cmgt --+ /// mstt 4 200 (status) /// cmvo 4 100 (volume, 0-100) /// </returns> private HttpResponse GetPropertyResponse() { var allProps = Request.QueryString["properties"]; var values = new Dictionary<string, object>(); values["mstt"] = 200; if (!string.IsNullOrEmpty(allProps)) { var props = allProps.Split(','); using (Player.BeginRead()) { var track = Player.CurrentTrack; var liveTrack = track as ILiveTrack; var isLive = liveTrack != null && liveTrack.IsLiveStream; foreach (var prop in props) switch (prop) { case "dmcp.volume": values["cmvo"] = Player.CurrentVolume; break; case "dacp.playerstate": values["caps"] = (byte)Player.CurrentState; break; case "dacp.nowplaying": if (track != null) { var container = Player.ActivePlaylist ?? Player.MediaLibrary; /*var containerItemId = container.Id; var trackList = container.Tracks as IList<ITrack>; if (trackList != null) containerItemId = container.Id + 1 + trackList.IndexOf(track);*/ values["canp"] = new CanpData { DatabaseId = id, ContainerId = container.Id, ContainerItemId = track.Id, TrackId = track.Id }.Data; if (!isLive) { values["cann"] = track.Title; values["cana"] = track.ArtistName; values["canl"] = track.AlbumName; values["cang"] = track.GenreName; } else { values["cann"] = liveTrack.LiveTitle; values["cana"] = liveTrack.LiveArtistName; values["canl"] = liveTrack.LiveAlbumName; values["cang"] = liveTrack.LiveGenreName; } if (track.Album != null) values["asai"] = track.Album.PersistentId; values["cmmk"] = 1; } break; case "dacp.playingtime": if (track != null) { if (!isLive) { values["cast"] = (uint)Math.Round(track.Duration.TotalMilliseconds); values["cant"] = (uint)Math.Round((track.Duration - Player.CurrentPosition).TotalMilliseconds); } else { values["cant"] = uint.MaxValue; } } break; case "dacp.volumecontrollable": values["cavc"] = true; break; case "dacp.availableshufflestates": values["caas"] = (int)Player.AvailableShuffleModes << 1; break; case "dacp.availablerepeatstates": values["caar"] = (int)Player.AvailableRepeatModes << 1; break; case "dacp.shufflestate": values["cash"] = (byte)Player.CurrentShuffleMode; break; case "dacp.repeatstate": values["carp"] = (byte)Player.CurrentRepeatMode; break; case "dacp.fullscreenenabled": values["cafe"] = false; break; case "dacp.fullscreen": values["cafs"] = (byte)0; break; case "dacp.visualizerenabled": values["cave"] = false; break; case "dacp.visualizer": values["cavs"] = (byte)0; break; } } } return new DmapResponse(new { cmgt = values }); }