-
Notifications
You must be signed in to change notification settings - Fork 0
/
MediaService.java
115 lines (90 loc) · 3.81 KB
/
MediaService.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/**
* Copyright (C) 2020 Joscha Düringer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package net.beardbot.subsonic.client.api.media;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import net.beardbot.subsonic.client.Subsonic;
import net.beardbot.subsonic.client.base.*;
import net.beardbot.subsonic.client.utils.JaxbUtil;
import org.subsonic.restapi.ErrorCode;
import org.subsonic.restapi.SubsonicResponse;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Collections;
import static net.beardbot.subsonic.client.utils.SubsonicResponseErrorHandler.handleError;
@Slf4j
public class MediaService {
private final Subsonic subsonic;
public MediaService(Subsonic subsonic) {
this.subsonic = subsonic;
}
@SneakyThrows
public InputStream stream(String id){
var params = StreamParams.create()
.format(subsonic.getPreferences().getStreamFormat())
.maxBitRate(subsonic.getPreferences().getStreamBitRate()).getParamMap();
params.put("id", Collections.singletonList(id));
log.debug("Fetching audio stream with params '{}'.", params);
URL url = subsonic.createUrl("stream", params);
return safeOpenStream(url);
}
@SneakyThrows
public InputStream download(String id){
var params = DownloadParams.create().id(id);
log.debug("Downloading song with params '{}'.", params.getParamMapForLogging());
URL url = subsonic.createUrl("download", params.getParamMap());
return safeOpenStream(url);
}
public InputStream getCoverArt(String id){
return getCoverArt(id, CoverArtParams.create());
}
@SneakyThrows
public InputStream getCoverArt(String id, CoverArtParams coverArtParams){
var params = coverArtParams.getParamMap();
params.put("id",Collections.singletonList(id));
log.debug("Downloading cover art with params '{}'.", params);
URL url = subsonic.createUrl("getCoverArt", params);
return safeOpenStream(url);
}
public InputStream getAvatar(){
return getAvatar(subsonic.getPreferences().getUsername());
}
@SneakyThrows
public InputStream getAvatar(String username){
var params = AvatarParams.create().username(username);
log.debug("Downloading avatar with params '{}'.", params.getParamMapForLogging());
URL url = subsonic.createUrl("getAvatar", params.getParamMap());
return safeOpenStream(url);
}
private InputStream safeOpenStream(URL url){
log.debug("Downloading resource {}", url);
try {
var connection = url.openConnection();
var inputStream = connection.getInputStream();
if (connection.getContentType().contains("xml")){
handleError(JaxbUtil.unmarshall(inputStream, SubsonicResponse.class));
}
return inputStream;
} catch (FileNotFoundException e) {
throw new SubsonicException(ErrorCode.DATA_NOT_FOUND, "The requested data was not found.");
} catch (IOException e) {
throw new SubsonicException(ErrorCode.GENERIC_ERROR, "Unknown error.");
}
}
}