Авто-генерация ссылки на библиотеки Chromium

Авто-генерация ссылки на библиотеки Chromium

Понадобилось мне относительно недавно реализовать автоматическое скачивание библиотеки Chromium для CEF4Delphi, по причине того что в случае обновления компонента - старая версия библиотек становится не актуальной, а каждый раз к программе заливать новые версии - крайне затратно по времени.

uses
  System.Net.HttpClientComponent, System.NetEncoding,
  System.RegularExpressions, System.JSON,

  uCEFApplication;
...
function GetLibURL: string;
var
  target, versionPannern, mainLink, pageResponse, fileName: string;
  JSON, JSONTarget, JSONObject: TJSONObject;
  JSONVersions, JSONFiles: TJSONArray;
begin
  Result := '';
  mainLink := 'https://cef-builds.spotifycdn.com/';

  {System}
  target :=
  {$IFDEF WIN32} 'windows32'
  {$ELSEIF Defined(WIN64)} 'windows64'
  {$ELSEIF Defined(MACOS32)} 'macosx64'
  {$ELSEIF Defined(MACOS64)} 'macosx64'
  {$ELSEIF Defined(LINUX32)} 'linux32'
  {$ELSEIF Defined(LINUX64)} 'linux64'
  {$ENDIF};

  {Version pattern}
  versionPannern := Format('%d.%d.%d', [
    CEF_SUPPORTED_VERSION_MAJOR,
    CEF_SUPPORTED_VERSION_MINOR,
    CEF_SUPPORTED_VERSION_RELEASE
  ]);

  {Get builds page}
  with TNetHTTPClient.Create(nil) do
  begin
    try pageResponse := Get(mainLink + 'index.json').ContentAsString; except end;
    Free;
  end;

  {Check response}
  if pageResponse = '' then Exit;

  {Parse response}
  JSON := TJSONObject.ParseJSONValue(pageResponse, False, True) as TJSONObject;
  try
    JSONTarget := JSON.FindValue(target) as TJSONObject;
    if not (Assigned(JSONTarget)) then Exit;

    with JSONTarget do
    begin
      JSONVersions := FindValue('versions') as TJSONArray;
      if not (Assigned(JSONVersions))
        or (JSONVersions.Count <= 0) then Exit;

      with JSONVersions.GetEnumerator do
      begin
        while MoveNext do
        begin
          if not (Current is TJSONObject)
            or (Pos(versionPannern, (Current as TJSONObject).Values[ 'cef_version' ].Value) <> 1) then Continue;

          JSONFiles := (Current as TJSONObject).FindValue('files') as TJSONArray;
          if not (Assigned(JSONFiles))
            or (JSONFiles.Count <= 0) then Exit;

          with JSONFiles.GetEnumerator do
          begin
            while MoveNext do
            begin
              if not (Current is TJSONObject)
                or ((Current as TJSONObject).Values[ 'type' ].Value <> 'client') then Continue;

              fileName := (Current as TJSONObject).Values['name'].Value;
            end;
          end;
        end;
      end;
    end;
  finally
    JSON.Free;
  end;

  {Find URL}
  if fileName = '' then Exit;

  {Encode result link}
  Result := mainLink + TNetEncoding.URL.Encode(fileName);
end;

Пользуйтесь на здоровье.