Skip to content

Commit f2932d1

Browse files
committed
multiple changes
server sync button for subsonic and panaudio playback logging for subsonic
1 parent 46d37ad commit f2932d1

13 files changed

+118
-15
lines changed

lib/controllers/album_controller.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ class AlbumController {
7878
Future<List<Album>> returnSimilar()async{
7979
setServerUrl();
8080
String serverType = GetStorage().read('ServerType') ?? "Jellyfin";
81-
if(serverType == "PanAudio")return [];
81+
if(serverType == "PanAudio" || serverType == "Subsonic")return [];
8282
await albumHelper.openBox();
8383
var album = albumHelper.returnAlbum(artistId!, albumId!);
8484

lib/controllers/music_controller.dart

+5-3
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class MusicController extends BaseAudioHandler with ChangeNotifier {
4646
ArtistsHelper artistsHelper = ArtistsHelper();
4747
AlbumsHelper albumsHelper = AlbumsHelper();
4848
ApiHelper apiHelper = ApiHelper();
49+
String serverType = GetStorage().read('ServerType') ?? "Jellyfin";
4950
PlaylistsController playlistController = PlaylistsController();
5051
bool _isPlaying = false;
5152

@@ -305,6 +306,8 @@ class MusicController extends BaseAudioHandler with ChangeNotifier {
305306
_advancedPlayer.positionStream.listen((position) {
306307
_durationController.add(position);
307308
currentTicks = position.inMicroseconds * 10;
309+
if(serverType == "Subsonic" && position.inSeconds > 40) _playbackPausePlay(false);
310+
308311
});
309312

310313
_advancedPlayer.bufferedPositionStream.listen((position){
@@ -385,7 +388,7 @@ class MusicController extends BaseAudioHandler with ChangeNotifier {
385388
var playbackLog = GetStorage().read('playbackReporting') ?? false;
386389
if(playbackLog) {
387390
var userId = await GetStorage().read('userId');
388-
String serverType = GetStorage().read('ServerType') ?? "Jellyfin";
391+
serverType = GetStorage().read('ServerType') ?? "Jellyfin";
389392

390393
IHandler jellyfinHandler = GetIt.instance<IHandler>(instanceName: serverType);
391394
String current = currentSource!.tag.id;
@@ -616,8 +619,7 @@ class MusicController extends BaseAudioHandler with ChangeNotifier {
616619
//return "$baseServerUrl/Audio/$id";
617620
}else if (serverType == "Subsonic"){
618621
var headers = apiHelper.returnSubsonicHeaders();
619-
print("$baseServerUrl/rest/download?id=$id&$headers");
620-
return "$baseServerUrl/rest/download?id=$id&$headers";
622+
return "$baseServerUrl/rest/stream?id=$id&$headers";
621623
}else if(serverType == "PanAudio"){
622624
return "$baseServerUrl/api/audio-stream?songId=$id";
623625
}

lib/handlers/ihandler.dart

+1
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,5 @@ abstract class IHandler {
2525
getPlaybackByDays(DateTime inOldDate, DateTime inCurDate);
2626
getPlaybackByArtists(DateTime inOldDate, DateTime inCurDate);
2727
getPlaybackForDay(DateTime day);
28+
scan();
2829
}

lib/handlers/jellyfin_handler.dart

+6
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,12 @@ class JellyfinHandler implements IHandler{
147147
throw UnimplementedError();
148148
}
149149

150+
@override
151+
scan() {
152+
// TODO: implement scan
153+
throw UnimplementedError();
154+
}
155+
150156

151157

152158
}

lib/handlers/panaudio_handler.dart

+5
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ class PanaudioHandler implements IHandler{
1717
// repo =
1818
}
1919

20+
@override
21+
scan()async{
22+
await repo.scan();
23+
}
24+
2025
@override
2126
getPlaybackByDays(DateTime inOldDate, DateTime inCurDate)async{
2227
return await repo.getPlaybackDays(inOldDate, inCurDate);

lib/handlers/subsonic_handler.dart

+19-3
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,18 @@ class SubsonicHandler implements IHandler{
2828
SongsHelper songsHelper = SongsHelper();
2929
Mappers mappers = Mappers();
3030
var baseServerUrl = "";
31+
String lastLoggedId = "";
3132
SubsonicHandler(){
3233
subsonicRepo = GetIt.instance<SubsonicRepo>();
3334
baseServerUrl = GetStorage().read('serverUrl') ?? "";
3435
openBox();
3536
}
3637

38+
@override
39+
scan()async{
40+
await subsonicRepo.scan();
41+
}
42+
3743
openBox()async{
3844
await albumsHelper.openBox();
3945
await songsHelper.openBox();
@@ -46,7 +52,7 @@ class SubsonicHandler implements IHandler{
4652
for(var songs in songData){
4753
var title = songs["title"];
4854
try{
49-
songsList.add(Songs(name: songs["title"], id: songs["id"], artist: songs["artist"], artistId: songs["artistId"] ?? "N/A", albumId: id, album: songs["album"], index: songs["track"] ?? 0, year: songs["year"] ?? 1900, length: conversions.returnSecondsToTimestampString(songs["duration"]), favourite: songs["starred"] != null, discIndex: songs["discNumber"] ?? 0, codec: songs["suffix"], playCount: 0));
55+
songsList.add(Songs(name: songs["title"], id: songs["id"], artist: songs["artist"], artistId: songs["artistId"] ?? "N/A", albumId: id, album: songs["album"], index: songs["track"] ?? 0, year: songs["year"] ?? 1900, length: conversions.returnSecondsToTimestampString(songs["duration"]), favourite: songs["starred"] != null, discIndex: songs["discNumber"] ?? 0, codec: songs["suffix"], playCount: songs["playCount"] ?? 0));
5056
}catch(e){
5157
await logger.openBox();
5258
await logger.addToLog(LogModel(logType: "Error", logMessage: "Error adding song: $title: $e", logDateTime: DateTime.now()));
@@ -77,6 +83,12 @@ class SubsonicHandler implements IHandler{
7783

7884
for (var index in artistsData) {
7985
for (var artist in index['artist']) {
86+
87+
var test = artist['name'].toString();
88+
if(test.startsWith("Jack")){
89+
print('stp[');
90+
}
91+
8092
artistsList.add(Artists(
8193
id: artist['id'],
8294
name: artist['name'],
@@ -258,9 +270,13 @@ class SubsonicHandler implements IHandler{
258270
}
259271

260272
@override
261-
updatePlaybackProgress(String songId, String? userId, bool paused, int ticks) {
273+
updatePlaybackProgress(String songId, String? userId, bool paused, int ticks) async{
262274
// TODO: implement updatePlaybackProgress
263-
275+
var seconds = ticks / 10000000;
276+
if(seconds > 40 && songId != lastLoggedId){
277+
lastLoggedId = songId;
278+
await subsonicRepo.logPlayback(songId);
279+
}
264280
}
265281

266282
@override

lib/hive/helpers/isynchelper.dart

+1
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ abstract class ISyncHelper {
44
openBox();
55
clearSongs();
66
runSync(bool check);
7+
scan();
78
}

lib/hive/helpers/panaudio_sync_helper.dart

+5
Original file line numberDiff line numberDiff line change
@@ -121,5 +121,10 @@ class PanaudioSyncHelper implements ISyncHelper {
121121
await songsHelper.clearSongs();
122122
}
123123

124+
@override
125+
scan() async{
126+
await panaudioHandler.scan();
127+
}
128+
124129

125130
}

lib/hive/helpers/subsonic_sync_helper.dart

+8
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ class SubsonicSyncHelper implements ISyncHelper{
6161
var songExists = songsHelper.returnSongById(song.id);
6262
if(songExists.name == "ERROR" && songExists.artist == "ERROR"){
6363
await songsHelper.addSongToBox(song);
64+
}else if(songExists.playCount != song.playCount){
65+
songExists.playCount = song.playCount;
66+
await songsHelper.updateSong(songExists);
6467
}
6568

6669
}catch(e){
@@ -88,4 +91,9 @@ class SubsonicSyncHelper implements ISyncHelper{
8891
await artistsHelper.openBox();
8992
}
9093

94+
@override
95+
scan() async{
96+
await subsonicHandler.scan();
97+
}
98+
9199
}

lib/hive/helpers/sync_helper.dart

+6
Original file line numberDiff line numberDiff line change
@@ -179,5 +179,11 @@ class SyncHelper implements ISyncHelper {
179179
return imgUrl;
180180
}
181181

182+
@override
183+
scan() {
184+
// TODO: implement scan
185+
throw UnimplementedError();
186+
}
187+
182188

183189
}

lib/repos/panaudio_repo.dart

+13
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,19 @@ class PanaudioRepo{
3030
}
3131
}
3232

33+
scan()async{
34+
baseServerUrl = GetStorage().read('serverUrl');
35+
try {
36+
String url = "$baseServerUrl/sync/all";
37+
http.Response res = await http.get(Uri.parse(url));
38+
if (res.statusCode == 200) {
39+
return json.decode(res.body);
40+
}
41+
} catch (e) {
42+
rethrow;
43+
}
44+
}
45+
3346
getPlaybackArtists(DateTime inOldDate, DateTime inCurDate)async{
3447
baseServerUrl = GetStorage().read('serverUrl');
3548
try {

lib/repos/subsonic_repo.dart

+43-8
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,28 @@ class SubsonicRepo{
77
ApiHelper apiHelper = ApiHelper();
88
String? baseServerUrl;
99
SubsonicRepo(){
10+
setUrl();
11+
}
12+
13+
setUrl(){
1014
baseServerUrl = GetStorage().read('serverUrl') ?? "";
1115
}
1216

17+
scan()async{
18+
try{
19+
var requestHeaders = apiHelper.returnSubsonicHeaders();
20+
String url = "$baseServerUrl/rest/startScan?$requestHeaders";
21+
22+
http.Response res = await http.get(Uri.parse(url));
23+
if (res.statusCode == 200) {
24+
var test = json.decode(res.body);
25+
return test;
26+
}
27+
}catch(e){
28+
rethrow;
29+
}
30+
}
31+
1332
getSongsForAlbum(String id)async{
1433
try{
1534
var requestHeaders = apiHelper.returnSubsonicHeaders();
@@ -54,9 +73,10 @@ class SubsonicRepo{
5473
}
5574

5675
getArtistData()async{
76+
setUrl();
5777
try{
5878
var requestHeaders = apiHelper.returnSubsonicHeaders();
59-
String url = "http://192.168.1.15:4533/rest/getArtists?$requestHeaders";
79+
String url = "$baseServerUrl/rest/getArtists?$requestHeaders";
6080

6181
http.Response res = await http.get(Uri.parse(url));
6282
if (res.statusCode == 200) {
@@ -71,7 +91,7 @@ class SubsonicRepo{
7191
getPlaylists()async{
7292
try{
7393
var requestHeaders = apiHelper.returnSubsonicHeaders();
74-
String url = "http://192.168.1.15:4533/rest/getPlaylists?$requestHeaders";
94+
String url = "$baseServerUrl/rest/getPlaylists?$requestHeaders";
7595

7696
http.Response res = await http.get(Uri.parse(url));
7797
if (res.statusCode == 200) {
@@ -85,7 +105,7 @@ class SubsonicRepo{
85105
getPlaylist(String id)async{
86106
try{
87107
var requestHeaders = apiHelper.returnSubsonicHeaders();
88-
String url = "http://192.168.1.15:4533/rest/getPlaylist?id=$id&$requestHeaders";
108+
String url = "$baseServerUrl/rest/getPlaylist?id=$id&$requestHeaders";
89109

90110
http.Response res = await http.get(Uri.parse(url));
91111
if (res.statusCode == 200) {
@@ -100,7 +120,7 @@ class SubsonicRepo{
100120
addToPlaylist(String playlistId, String songId)async{
101121
try{
102122
var requestHeaders = apiHelper.returnSubsonicHeaders();
103-
String url = "http://192.168.1.15:4533/rest/updatePlaylist?playlistId=$playlistId&songIdToAdd=$songId&$requestHeaders";
123+
String url = "$baseServerUrl/rest/updatePlaylist?playlistId=$playlistId&songIdToAdd=$songId&$requestHeaders";
104124

105125
http.Response res = await http.get(Uri.parse(url));
106126
if (res.statusCode == 200) {
@@ -115,7 +135,7 @@ class SubsonicRepo{
115135
deleteFromPlaylist(String playlistId, String index)async{
116136
try{
117137
var requestHeaders = apiHelper.returnSubsonicHeaders();
118-
String url = "http://192.168.1.15:4533/rest/updatePlaylist?playlistId=$playlistId&songIndexToRemove=$index&$requestHeaders";
138+
String url = "$baseServerUrl/rest/updatePlaylist?playlistId=$playlistId&songIndexToRemove=$index&$requestHeaders";
119139

120140
http.Response res = await http.get(Uri.parse(url));
121141
if (res.statusCode == 200) {
@@ -130,7 +150,7 @@ class SubsonicRepo{
130150
getRecentAlbums()async{
131151
try{
132152
var requestHeaders = apiHelper.returnSubsonicHeaders();
133-
String url = "http://192.168.1.15:4533/rest/getAlbumList?type=recent&$requestHeaders";
153+
String url = "$baseServerUrl/rest/getAlbumList?type=recent&$requestHeaders";
134154

135155
http.Response res = await http.get(Uri.parse(url));
136156
if (res.statusCode == 200) {
@@ -145,7 +165,7 @@ class SubsonicRepo{
145165
starItem(String id)async{
146166
try{
147167
var requestHeaders = apiHelper.returnSubsonicHeaders();
148-
String url = "http://192.168.1.15:4533/rest/star?id=$id&$requestHeaders";
168+
String url = "$baseServerUrl/rest/star?id=$id&$requestHeaders";
149169

150170
http.Response res = await http.get(Uri.parse(url));
151171
if (res.statusCode == 200) {
@@ -160,7 +180,22 @@ class SubsonicRepo{
160180
unStarItem(String id)async{
161181
try{
162182
var requestHeaders = apiHelper.returnSubsonicHeaders();
163-
String url = "http://192.168.1.15:4533/rest/unstar?id=$id&$requestHeaders";
183+
String url = "$baseServerUrl/rest/unstar?id=$id&$requestHeaders";
184+
185+
http.Response res = await http.get(Uri.parse(url));
186+
if (res.statusCode == 200) {
187+
var test = json.decode(res.body);
188+
return test;
189+
}
190+
}catch(e){
191+
rethrow;
192+
}
193+
}
194+
195+
logPlayback(String id)async{
196+
try{
197+
var requestHeaders = apiHelper.returnSubsonicHeaders();
198+
String url = "$baseServerUrl/rest/scrobble?id=$id&$requestHeaders";
164199

165200
http.Response res = await http.get(Uri.parse(url));
166201
if (res.statusCode == 200) {

lib/widgets/settings_page.dart

+5
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,10 @@ _getVersionNumber()async{
169169
super.dispose();
170170
}
171171

172+
173+
void scan()async{
174+
await syncHelper.scan();
175+
}
172176

173177
void sync()async{
174178
/* helper.getAllArtists();
@@ -347,6 +351,7 @@ _getVersionNumber()async{
347351
),
348352
],
349353
),
354+
TextButton(onPressed: () { scan(); }, child: Text('Scan', style: Theme.of(context).textTheme.bodySmall),),
350355
],
351356
),
352357
),

0 commit comments

Comments
 (0)