Skip to content

Commit 1ea40e3

Browse files
committed
Update 1.8.3
Added trash support, track downloading to file, bug fixes, better logging and artist view
1 parent 078f092 commit 1ea40e3

14 files changed

+3970
-1483
lines changed

BroadcastAPI.pas

Lines changed: 216 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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]);
11511177
end;
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+
11531361
function PushHistory(Items: TArray<THistoryItem>): boolean;
11541362
var
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

CreatePlaylistForm.dfm

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ object CreatePlaylist: TCreatePlaylist
3232
Align = alBottom
3333
BevelOuter = bvNone
3434
ParentColor = True
35-
TabOrder = 1
35+
TabOrder = 2
3636
object Download_Item: CButton
3737
AlignWithMargins = True
3838
Left = 431
@@ -182,7 +182,7 @@ object CreatePlaylist: TCreatePlaylist
182182
Caption = 'Panel2'
183183
ParentColor = True
184184
ShowCaption = False
185-
TabOrder = 2
185+
TabOrder = 4
186186
object Label8: TLabel
187187
AlignWithMargins = True
188188
Left = 60
@@ -395,7 +395,7 @@ object CreatePlaylist: TCreatePlaylist
395395
Align = alTop
396396
BevelOuter = bvNone
397397
ParentColor = True
398-
TabOrder = 4
398+
TabOrder = 1
399399
object Label2: TLabel
400400
AlignWithMargins = True
401401
Left = 5
@@ -3225,13 +3225,13 @@ object CreatePlaylist: TCreatePlaylist
32253225
Colors.Leave = 16250866
32263226
Colors.Enter = 15658729
32273227
Colors.Down = 15066593
3228-
Colors.Checked = 4745881
3228+
Colors.Checked = 1265132
32293229
Colors.CheckIndicator = clWhite
32303230
Colors.TransparentCenter = True
32313231
ColorsBorder.Leave = 9013638
32323232
ColorsBorder.Enter = 9013638
32333233
ColorsBorder.Down = 12434873
3234-
ColorsBorder.Checked = 4745881
3234+
ColorsBorder.Checked = 1265132
32353235
Checked = False
32363236
State = cbUnchecked
32373237
end

DebugForm.dfm

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -969,6 +969,13 @@ object DebugUI: TDebugUI
969969
Height = 21
970970
Caption = 'Downl Thread:'
971971
end
972+
object Label14: TLabel
973+
Left = 185
974+
Top = 396
975+
Width = 74
976+
Height = 21
977+
Caption = 'Page Path: '
978+
end
972979
object CButton1: CButton
973980
Left = 19
974981
Top = 120
@@ -1106,7 +1113,7 @@ object DebugUI: TDebugUI
11061113
Left = 454
11071114
Top = 198
11081115
Width = 222
1109-
Height = 195
1116+
Height = 177
11101117
Lines.Strings = (
11111118
'JSON response will be '
11121119
'shown here')
@@ -1239,7 +1246,7 @@ object DebugUI: TDebugUI
12391246
Left = 323
12401247
Top = 34
12411248
Width = 118
1242-
Height = 359
1249+
Height = 341
12431250
Lines.Strings = (
12441251
'Queue')
12451252
ParentColor = True

DebugForm.pas

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ TDebugUI = class(TForm)
3838
CButton7: CButton;
3939
CButton8: CButton;
4040
Label13: TLabel;
41+
Label14: TLabel;
4142
procedure CButton1Click(Sender: TObject);
4243
procedure CButton2Click(Sender: TObject);
4344
procedure FormCreate(Sender: TObject);
@@ -113,6 +114,7 @@ procedure TDebugUI.DataSyncTimer(Sender: TObject);
113114
Label10.Caption := 'Ch Active: ' + BooleanToString( BASS_ChannelIsActive(Player.Stream) = BASS_ACTIVE_PLAYING );
114115
Label11.Caption := 'Img-Thread: ' + TotalThreads.ToString;
115116
Label12.Caption := 'Downl-Thread: ' + DownloadThreadsE.ToString;
117+
Label14.Caption := 'Page Path: ' + Location;
116118
end;
117119

118120
procedure TDebugUI.FormCreate(Sender: TObject);

0 commit comments

Comments
 (0)