You can check whether the file exists by the FileExists
function. In your case it would be like:
procedure CurPageChanged(CurPageID: Integer);
var
FileName: string;
begin
if CurPageID = wpReady then
begin
idpClearFiles;
{ better use a local variable to avoid expanding the same path twice }
FileName := ExpandConstant('{tmp}\src.zip');
{ if the component item is checked and file does not exist yet, enqueue it }
if IsComponentSelected('src') and not FileExists(FileName) then
begin
idpAddFile(
'https://example.com/files/prj-sources-1.2.3.zip',
FileName);
end;
end;
end;