@@ -289,6 +289,16 @@ TSession = record
289289 function TouchupPlaylist (ID: integer): boolean;
290290 function UpdatePlayList (ID: integer; Name , Description: string; ReloadLibrary: boolean): boolean;
291291 function DeletePlayList (ID: integer): boolean;
292+ function DeleteTracks (Tracks: TArray<integer>): boolean;
293+ function DeleteTrack (ID: integer): boolean;
294+ function DeleteAlbum (ID: integer): boolean;
295+ function DeleteArtist (ID: integer): boolean;
296+ function RestoreTracks (Tracks: TArray<integer>): boolean;
297+ function RestoreTrack (ID: integer): boolean;
298+ function RestoreAlbum (ID: integer): boolean;
299+ function RestoreArtist (ID: integer): boolean;
300+ function EmptyTrash (Tracks: TArray<integer>): boolean;
301+ function CompleteEmptyTrash : boolean;
292302
293303 // History
294304 function PushHistory (Items: TArray<THistoryItem>): boolean;
@@ -394,6 +404,22 @@ TSession = record
394404 + ' "description": "%S"'
395405 + ' }' ;
396406
407+ // Track
408+ REQUEST_TRACK_DELETE = REQUEST_HEADER + ' ,'
409+ + ' "mode": "trash",'
410+ + ' "tracks": [%S]'
411+ + ' }' ;
412+
413+ REQUEST_TRACK_RESTORE = REQUEST_HEADER + ' ,'
414+ + ' "mode": "restore",'
415+ + ' "tracks": [%S]'
416+ + ' }' ;
417+
418+ REQUEST_TRACK_EMPTYTRASH = REQUEST_HEADER + ' ,'
419+ + ' "mode": "empty_trash",'
420+ + ' "tracks": [%S]'
421+ + ' }' ;
422+
397423 // Rating
398424 REQUEST_RATE_TRACK = REQUEST_HEADER + ' ,'
399425 + ' "mode": "ratetrack",'
@@ -1150,6 +1176,188 @@ function DeletePlayList(ID: integer): boolean;
11501176 LoadLibraryAdvanced([TLoad.PlayList]);
11511177end ;
11521178
1179+ function DeleteTracks (Tracks: TArray<integer>): boolean;
1180+ var
1181+ Request: string;
1182+ JResult: ResultType;
1183+
1184+ ATracks: string;
1185+ ATotal: integer;
1186+ I: integer;
1187+
1188+ JSONValue: TJSONValue;
1189+ begin
1190+ // Get Tracks
1191+ ATracks := ' ' ;
1192+ ATotal := High(Tracks);
1193+ for I := 0 to ATotal do
1194+ ATracks := ATracks + Tracks[I].ToString + ' ,' ;
1195+
1196+ ATracks := Copy(ATracks, 1 , Length(ATracks)-1 );
1197+
1198+ // Prepare request string
1199+ Request := Format(REQUEST_TRACK_DELETE, [USER_ID, TOKEN, ATracks]); // supports multi-delete
1200+
1201+ // Parse response and extract numbers
1202+ SetWorkStatus(' Deleting track' );
1203+ JSONValue := SendClientRequest(Request);
1204+ try
1205+ // Error
1206+ JResult.AnaliseFrom(JSONVALUE);
1207+
1208+ Result := JResult.Success;
1209+ finally
1210+ JSONValue.Free;
1211+ end ;
1212+
1213+ // Re-load playlists
1214+ LoadLibraryAdvanced([TLoad.Track, TLoad.Album, TLoad.Artist, TLoad.PlayList]);
1215+ end ;
1216+
1217+ function RestoreTracks (Tracks: TArray<integer>): boolean;
1218+ var
1219+ Request: string;
1220+ JResult: ResultType;
1221+
1222+ ATracks: string;
1223+ ATotal: integer;
1224+ I: integer;
1225+
1226+ JSONValue: TJSONValue;
1227+ begin
1228+ // Get Tracks
1229+ ATracks := ' ' ;
1230+ ATotal := High(Tracks);
1231+ for I := 0 to ATotal do
1232+ ATracks := ATracks + Tracks[I].ToString + ' ,' ;
1233+
1234+ ATracks := Copy(ATracks, 1 , Length(ATracks)-1 );
1235+
1236+ // Prepare request string
1237+ Request := Format(REQUEST_TRACK_RESTORE, [USER_ID, TOKEN, ATracks]); // supports multi-delete
1238+
1239+ // Parse response and extract numbers
1240+ SetWorkStatus(' Restoring track' );
1241+ JSONValue := SendClientRequest(Request);
1242+ try
1243+ // Error
1244+ JResult.AnaliseFrom(JSONVALUE);
1245+
1246+ Result := JResult.Success;
1247+ finally
1248+ JSONValue.Free;
1249+ end ;
1250+
1251+ // Re-load playlists
1252+ LoadLibraryAdvanced([TLoad.Track, TLoad.Album, TLoad.Artist, TLoad.PlayList]);
1253+ end ;
1254+
1255+ function EmptyTrash (Tracks: TArray<integer>): boolean;
1256+ var
1257+ Request: string;
1258+ JResult: ResultType;
1259+
1260+ ATracks: string;
1261+ ATotal: integer;
1262+ I: integer;
1263+
1264+ JSONValue: TJSONValue;
1265+ begin
1266+ // Get Tracks
1267+ ATracks := ' ' ;
1268+ ATotal := High(Tracks);
1269+ for I := 0 to ATotal do
1270+ ATracks := ATracks + Tracks[I].ToString + ' ,' ;
1271+
1272+ ATracks := Copy(ATracks, 1 , Length(ATracks)-1 );
1273+
1274+ // Prepare request string
1275+ Request := Format(REQUEST_TRACK_EMPTYTRASH, [USER_ID, TOKEN, ATracks]); // supports multi-delete
1276+
1277+ // Parse response and extract numbers
1278+ SetWorkStatus(' Deleting from trash' );
1279+ JSONValue := SendClientRequest(Request);
1280+ try
1281+ // Error
1282+ JResult.AnaliseFrom(JSONVALUE);
1283+
1284+ Result := JResult.Success;
1285+ finally
1286+ JSONValue.Free;
1287+ end ;
1288+
1289+ // Re-load playlists
1290+ LoadLibraryAdvanced([TLoad.Track, TLoad.Album, TLoad.Artist, TLoad.PlayList]);
1291+ end ;
1292+
1293+ function CompleteEmptyTrash : boolean;
1294+ var
1295+ ATracks: TArray<integer>;
1296+ I: integer;
1297+ begin
1298+ ATracks := [];
1299+ for I := 0 to High(Tracks) do
1300+ if Tracks[I].IsInTrash then
1301+ ATracks.AddValue(Tracks[I].ID);
1302+
1303+ // Empty
1304+ Result := EmptyTrash(ATracks);
1305+ end ;
1306+
1307+ function RestoreTrack (ID: integer): boolean;
1308+ begin
1309+ Result := RestoreTracks([ID]);
1310+ end ;
1311+
1312+ function RestoreAlbum (ID: integer): boolean;
1313+ var
1314+ Index: integer;
1315+ begin
1316+ Result := false;
1317+ Index := GetAlbum(ID);
1318+
1319+ if Index <> -1 then
1320+ Result := RestoreTracks(Albums[Index].TracksID);
1321+ end ;
1322+
1323+ function RestoreArtist (ID: integer): boolean;
1324+ var
1325+ Index: integer;
1326+ begin
1327+ Result := false;
1328+ Index := GetArtist(ID);
1329+
1330+ if Index <> -1 then
1331+ Result := RestoreTracks(Artists[Index].TracksID);
1332+ end ;
1333+
1334+ function DeleteTrack (ID: integer): boolean;
1335+ begin
1336+ Result := DeleteTracks([ID]);
1337+ end ;
1338+
1339+ function DeleteAlbum (ID: integer): boolean;
1340+ var
1341+ Index: integer;
1342+ begin
1343+ Result := false;
1344+ Index := GetAlbum(ID);
1345+
1346+ if Index <> -1 then
1347+ Result := DeleteTracks(Albums[Index].TracksID);
1348+ end ;
1349+
1350+ function DeleteArtist (ID: integer): boolean;
1351+ var
1352+ Index: integer;
1353+ begin
1354+ Result := false;
1355+ Index := GetArtist(ID);
1356+
1357+ if Index <> -1 then
1358+ Result := DeleteTracks(Artists[Index].TracksID);
1359+ end ;
1360+
11531361function PushHistory (Items: TArray<THistoryItem>): boolean;
11541362var
11551363 Request: string;
@@ -1407,6 +1615,10 @@ procedure LoadLibraryAdvanced(LoadSet: TLoadSet);
14071615 SetLength( Albums, Index + 1 );
14081616
14091617 Albums[Index].LoadFrom( JSONPair );
1618+
1619+ // Invalid entry, delete from index
1620+ if Albums[Index].TracksID.Count = 0 then
1621+ SetLength( Albums, Index );
14101622 end ;
14111623
14121624 // Updated
@@ -1438,6 +1650,10 @@ procedure LoadLibraryAdvanced(LoadSet: TLoadSet);
14381650 SetLength( Artists, Index + 1 );
14391651
14401652 Artists[Index].LoadFrom( JSONPair );
1653+
1654+ // Invalid entry, delete from index
1655+ if Artists[Index].TracksID.Count = 0 then
1656+ SetLength( Artists, Index );
14411657 end ;
14421658
14431659 // Updated
0 commit comments