예제 #1
0
        public async Task <IActionResult> Download(SubsonicRequest request)
        {
            var authResult = await this.AuthenticateUser(request);

            if (authResult != null)
            {
                return(Unauthorized());
            }
            var trackId = request.TrackId;

            if (trackId != null)
            {
                return(await base.StreamTrack(trackId.Value, this.TrackService, this.PlayActivityService, this.SubsonicUser));
            }
            var releaseId = request.ReleaseId;

            if (releaseId != null)
            {
                var releaseZip = await this.ReleaseService.ReleaseZipped(this.SubsonicUser, releaseId.Value);

                if (!releaseZip.IsSuccess)
                {
                    return(NotFound("Unknown Release id"));
                }
                return(File(releaseZip.Data, "application/zip", (string)releaseZip.AdditionalData["ZipFileName"]));
            }
            return(NotFound($"Unknown download id `{ request.id }`"));
        }
예제 #2
0
        private async Task <IActionResult> AuthenticateUser(SubsonicRequest request)
        {
            var appUser = await this.SubsonicService.Authenticate(request);

            if (!(appUser?.IsSuccess ?? false) || (appUser?.IsNotFoundResult ?? false))
            {
                return(this.BuildResponse(request, appUser.Adapt <SubsonicOperationResult <Response> >()));
            }
            this.SubsonicUser = this.UserModelForUser(appUser.Data.User);
            return(null);
        }
예제 #3
0
        private IActionResult BuildResponse(SubsonicRequest request, SubsonicOperationResult <Response> response = null,
                                            string responseType = null)
        {
            if (!Request.Method.Equals("GET", StringComparison.OrdinalIgnoreCase) &&
                !string.IsNullOrEmpty(Request.ContentType))
            {
                var formCollection = Request.Form;
                var formDictionary = new Dictionary <string, object>();
                if (formCollection?.Any() == true)
                {
                    foreach (var form in formCollection)
                    {
                        if (!formDictionary.ContainsKey(form.Key))
                        {
                            formDictionary[form.Key] = form.Value.FirstOrDefault();
                        }
                    }
                }
            }

            if (response?.ErrorCode.HasValue ?? false)
            {
                return(SendError(request, response));
            }
            if (request.IsJSONRequest)
            {
                Response.ContentType = "application/json";
                var    status     = response?.Data?.status.ToString();
                var    version    = response?.Data?.version ?? Services.SubsonicService.SubsonicVersion;
                string jsonResult = null;
                if (responseType == null)
                {
                    jsonResult = "{ \"subsonic-response\": { \"status\":\"" + status + "\", \"version\": \"" + version +
                                 "\" }}";
                }
                else
                {
                    jsonResult = "{ \"subsonic-response\": { \"status\":\"" + status + "\", \"version\": \"" + version +
                                 "\", \"" + responseType + "\":" + (response?.Data != null
                                     ? JsonConvert.SerializeObject(response.Data.Item)
                                     : string.Empty) + "}}";
                }

                if ((request?.f ?? string.Empty).Equals("jsonp", StringComparison.OrdinalIgnoreCase))
                {
                    jsonResult = request.callback + "(" + jsonResult + ");";
                }

                return(Content(jsonResult));
            }

            Response.ContentType = "application/xml";
            return(Ok(response.Data));
        }
예제 #4
0
        public async Task <IActionResult> GetSongsByGenre(SubsonicRequest request)
        {
            var authResult = await AuthenticateUser(request).ConfigureAwait(false);

            if (authResult != null)
            {
                return(authResult);
            }
            var result = await SubsonicService.GetSongsByGenre(request, SubsonicUser).ConfigureAwait(false);

            return(BuildResponse(request, result, "songsByGenre"));
        }
예제 #5
0
        public async Task <IActionResult> UnStar(SubsonicRequest request, [FromQueryAttribute] string[] albumId, [FromQueryAttribute] string[] artistId)
        {
            var authResult = await this.AuthenticateUser(request);

            if (authResult != null)
            {
                return(authResult);
            }
            var result = await this.SubsonicService.ToggleStar(request, this.SubsonicUser, false, albumId, artistId);

            return(this.BuildResponse(request, result));
        }
예제 #6
0
        public async Task <IActionResult> Search3(SubsonicRequest request)
        {
            var authResult = await this.AuthenticateUser(request);

            if (authResult != null)
            {
                return(authResult);
            }
            var result = await this.SubsonicService.Search(request, this.SubsonicUser, SearchVersion.Three);

            return(this.BuildResponse(request, result, "searchResult3"));
        }
예제 #7
0
        public async Task <IActionResult> SavePlayQueue(SubsonicRequest request, string username, string current, long?position)
        {
            var authResult = await this.AuthenticateUser(request);

            if (authResult != null)
            {
                return(authResult);
            }
            var result = await this.SubsonicService.SavePlayQueue(request, this.SubsonicUser, current, position);

            return(this.BuildResponse(request, result));
        }
예제 #8
0
        public async Task <IActionResult> GetTopSongs(SubsonicRequest request, int?count = 50)
        {
            var authResult = await this.AuthenticateUser(request);

            if (authResult != null)
            {
                return(authResult);
            }
            var result = await this.SubsonicService.GetTopSongs(request, this.SubsonicUser, count);

            return(this.BuildResponse(request, result, "topSongs"));
        }
예제 #9
0
        public async Task <IActionResult> AddChatMessage(SubsonicRequest request)
        {
            var authResult = await this.AuthenticateUser(request);

            if (authResult != null)
            {
                return(authResult);
            }
            var result = await this.SubsonicService.AddChatMessage(request, this.SubsonicUser);

            return(this.BuildResponse(request, result));
        }
예제 #10
0
        public async Task <IActionResult> UnStar(SubsonicRequest request, [FromQuery] string[] albumId, [FromQuery] string[] artistId)
        {
            var authResult = await AuthenticateUser(request).ConfigureAwait(false);

            if (authResult != null)
            {
                return(authResult);
            }
            var result = await SubsonicService.ToggleStar(request, SubsonicUser, false, albumId, artistId).ConfigureAwait(false);

            return(BuildResponse(request, result));
        }
예제 #11
0
        public async Task <IActionResult> SetRating(SubsonicRequest request, short rating)
        {
            var authResult = await AuthenticateUser(request).ConfigureAwait(false);

            if (authResult != null)
            {
                return(authResult);
            }
            var result = await SubsonicService.SetRating(request, SubsonicUser, rating).ConfigureAwait(false);

            return(BuildResponse(request, result));
        }
예제 #12
0
        public async Task <IActionResult> Search3(SubsonicRequest request)
        {
            var authResult = await AuthenticateUser(request).ConfigureAwait(false);

            if (authResult != null)
            {
                return(authResult);
            }
            var result = await SubsonicService.Search(request, SubsonicUser, SearchVersion.Three).ConfigureAwait(false);

            return(BuildResponse(request, result, "searchResult3"));
        }
예제 #13
0
        public async Task <IActionResult> GetTopSongs(SubsonicRequest request, int?count = 50)
        {
            var authResult = await AuthenticateUser(request).ConfigureAwait(false);

            if (authResult != null)
            {
                return(authResult);
            }
            var result = await SubsonicService.GetTopSongs(request, SubsonicUser, count).ConfigureAwait(false);

            return(BuildResponse(request, result, "topSongs"));
        }
예제 #14
0
        public async Task <IActionResult> AddChatMessage(SubsonicRequest request)
        {
            var authResult = await AuthenticateUser(request).ConfigureAwait(false);

            if (authResult != null)
            {
                return(authResult);
            }
            var result = await SubsonicService.AddChatMessage(request, SubsonicUser).ConfigureAwait(false);

            return(BuildResponse(request, result));
        }
예제 #15
0
        public async Task <IActionResult> GetStarred2(SubsonicRequest request)
        {
            var authResult = await AuthenticateUser(request).ConfigureAwait(false);

            if (authResult != null)
            {
                return(authResult);
            }
            var result = await SubsonicService.GetStarred(request, SubsonicUser, StarredVersion.Two).ConfigureAwait(false);

            return(BuildResponse(request, result, "starred"));
        }
예제 #16
0
        public async Task <IActionResult> GetSimilarSongs2(SubsonicRequest request, int?count = 50)
        {
            var authResult = await this.AuthenticateUser(request);

            if (authResult != null)
            {
                return(authResult);
            }
            var result = await this.SubsonicService.GetSimliarSongs(request, this.SubsonicUser, SimilarSongsVersion.Two, count);

            return(this.BuildResponse(request, result, "similarSongs2"));
        }
예제 #17
0
        public async Task <IActionResult> GetSongsByGenre(SubsonicRequest request)
        {
            var authResult = await this.AuthenticateUser(request);

            if (authResult != null)
            {
                return(authResult);
            }
            var result = await this.SubsonicService.GetSongsByGenre(request, this.SubsonicUser);

            return(this.BuildResponse(request, result, "songsByGenre"));
        }
예제 #18
0
        public async Task <IActionResult> GetAlbumList2(SubsonicRequest request)
        {
            var authResult = await this.AuthenticateUser(request);

            if (authResult != null)
            {
                return(authResult);
            }
            var result = await this.SubsonicService.GetAlbumList(request, this.SubsonicUser, AlbumListVersions.Two);

            return(this.BuildResponse(request, result, "albumList"));
        }
예제 #19
0
        public async Task <IActionResult> GetStarred2(SubsonicRequest request)
        {
            var authResult = await this.AuthenticateUser(request);

            if (authResult != null)
            {
                return(authResult);
            }
            var result = await this.SubsonicService.GetStarred(request, this.SubsonicUser, StarredVersion.Two);

            return(this.BuildResponse(request, result, "starred"));
        }
예제 #20
0
        public async Task <IActionResult> GetArtistInfo2(SubsonicRequest request, int?count, bool?includeNotPresent)
        {
            var authResult = await this.AuthenticateUser(request);

            if (authResult != null)
            {
                return(authResult);
            }
            var result = await this.SubsonicService.GetArtistInfo(request, count, includeNotPresent ?? false, ArtistInfoVersion.Two);

            return(this.BuildResponse(request, result, "artistInfo2"));
        }
예제 #21
0
        public async Task <IActionResult> GetUser(SubsonicRequest request, string username)
        {
            var authResult = await this.AuthenticateUser(request);

            if (authResult != null)
            {
                return(authResult);
            }
            var result = await this.SubsonicService.GetUser(request, username ?? request.u);

            return(this.BuildResponse(request, result, "user"));
        }
예제 #22
0
        public async Task <IActionResult> GetChatMessages(SubsonicRequest request, long?since)
        {
            var authResult = await this.AuthenticateUser(request);

            if (authResult != null)
            {
                return(authResult);
            }
            var result = await this.SubsonicService.GetChatMessages(request, this.SubsonicUser, since);

            return(this.BuildResponse(request, result, "chatMessages"));
        }
예제 #23
0
        public async Task <IActionResult> CreateBookmark(SubsonicRequest request, int position, string comment)
        {
            var authResult = await this.AuthenticateUser(request);

            if (authResult != null)
            {
                return(authResult);
            }
            var result = await this.SubsonicService.CreateBookmark(request, this.SubsonicUser, position, comment);

            return(this.BuildResponse(request, result));
        }
예제 #24
0
        public async Task <IActionResult> GetIndexes(SubsonicRequest request, long?ifModifiedSince = null)
        {
            var authResult = await this.AuthenticateUser(request);

            if (authResult != null)
            {
                return(authResult);
            }
            var result = await this.SubsonicService.GetIndexes(request, this.SubsonicUser, ifModifiedSince);

            return(this.BuildResponse(request, result, "indexes"));
        }
예제 #25
0
        public async Task <IActionResult> SetRating(SubsonicRequest request, short rating)
        {
            var authResult = await this.AuthenticateUser(request);

            if (authResult != null)
            {
                return(authResult);
            }
            var result = await this.SubsonicService.SetRating(request, this.SubsonicUser, rating);

            return(this.BuildResponse(request, result));
        }
예제 #26
0
        public async Task <IActionResult> GetMusicDirectory(SubsonicRequest request)
        {
            var authResult = await this.AuthenticateUser(request);

            if (authResult != null)
            {
                return(authResult);
            }
            var result = await this.SubsonicService.GetMusicDirectory(request, this.SubsonicUser);

            return(this.BuildResponse(request, result, "directory"));
        }
예제 #27
0
        public async Task <IActionResult> UpdatePlaylist(SubsonicRequest request, [FromQueryAttribute] string playlistId, [FromQueryAttribute] string name, [FromQueryAttribute] string comment, [FromQueryAttribute] bool? @public, [FromQueryAttribute] string[] songIdToAdd, [FromQueryAttribute] int[] songIndexToRemove)
        {
            var authResult = await this.AuthenticateUser(request);

            if (authResult != null)
            {
                return(authResult);
            }
            var result = await this.SubsonicService.UpdatePlaylist(request, this.SubsonicUser, playlistId, name, comment, @public, songIdToAdd, songIndexToRemove);

            return(this.BuildResponse(request, result));
        }
예제 #28
0
        public async Task <IActionResult> GetPodcasts(SubsonicRequest request, bool includeEpisodes)
        {
            var authResult = await this.AuthenticateUser(request);

            if (authResult != null)
            {
                return(authResult);
            }
            var result = await this.SubsonicService.GetPodcasts(request);

            return(this.BuildResponse(request, result, "podcasts"));
        }
예제 #29
0
        public async Task <IActionResult> CreatePlaylist(SubsonicRequest request, string playlistId, string name, string[] songId)
        {
            var authResult = await this.AuthenticateUser(request);

            if (authResult != null)
            {
                return(authResult);
            }
            var result = await this.SubsonicService.CreatePlaylist(request, this.SubsonicUser, name, songId, playlistId);

            return(this.BuildResponse(request, result, "playlist"));
        }
예제 #30
0
        public async Task <IActionResult> GetPlaylists(SubsonicRequest request, string username)
        {
            var authResult = await AuthenticateUser(request).ConfigureAwait(false);

            if (authResult != null)
            {
                return(authResult);
            }
            var result = await SubsonicService.GetPlaylists(request, SubsonicUser, username).ConfigureAwait(false);

            return(BuildResponse(request, result, "playlists"));
        }