unit uOBS_Doc_Player;
interface
uses
System.SysUtils, System.Classes, Web.HTTPApp, FMX.Types,
FMX.Controls3D, FMX.Objects3D, FMX.Controls, FMX.Forms, FMX.StdCtrls,
FMX.Edit, FMX.ListBox, uPlayerThread, bass_simple;
type
TOBS_Doc_Player = class(TWebModule)
procedure WebModule1DefaultHandlerAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure TrackBar1Change(Sender: TObject);
procedure WebModuleCreate(Sender: TObject);
procedure WebModuleDestroy(Sender: TObject);
private
{ Private declarations }
function gethtml(): string;
procedure AddToListBox(Text: String);
procedure DelFromListBox(Text: String);
procedure add(const aTitle: string);
procedure del(const aTitle: string);
{ Private declarations }
public
{ Public declarations }
end;
var
OBS_Doc_Player: TComponentClass = TOBS_Doc_Player;
Button1: TButton;
Button2: TButton;
ProgressBar1: TProgressBar;
TrackBar1: TTrackBar;
ListBox1: TListBox;
b: TBassSimple;
player: TPlayerThread;
mVolume: Integer;
isplay: string;
mySoundPath: string;
implementation
{%CLASSGROUP 'FMX.Controls.TControl'}
{$R *.dfm}
{ TOBS_Doc_Player }
function GetPathToTestExe: string; // вернет папку romaming
begin
Result := GetEnvironmentVariable('APPDATA');
if Result <> '' then
Result := IncludeTrailingPathDelimiter(Result);
end;
procedure TOBS_Doc_Player.add(const aTitle: string);
begin
AddToListBox(aTitle);
end;
procedure TOBS_Doc_Player.AddToListBox(Text: String);
begin
if ListBox1.Items.IndexOf(Text) = -1 then
ListBox1.Items.add(Text);
end;
procedure TOBS_Doc_Player.Button1Click(Sender: TObject);
begin
b.Pause;
if isplay = '0' then
isplay := '1'
else
isplay := '0'
end;
procedure TOBS_Doc_Player.Button2Click(Sender: TObject);
begin
player.Skip;
end;
procedure TOBS_Doc_Player.del(const aTitle: string);
begin
DelFromListBox(aTitle);
end;
procedure TOBS_Doc_Player.DelFromListBox(Text: String);
var
i: Integer;
begin
Application.ProcessMessages;
i := ListBox1.Items.IndexOf(Text);
if i <> -1 then
if i <= ListBox1.Items.Count - 1 then
ListBox1.Items.Delete(i);
Application.ProcessMessages;
end;
function TOBS_Doc_Player.gethtml: string;
var
s: string;
i: Integer;
playIcon: string;
begin
// Определяем иконку в зависимости от состояния
if isplay = '1' then
playIcon := 'fa-pause'
else
playIcon := 'fa-play';
// Собираем элементы ListBox в строку
s := '';
for i := 0 to ListBox1.Items.Count - 1 do
s := s + '
' + ListBox1.Items[i] + '';
// Генерация HTML-страницы с обновленными значениями
Result := '' + 'Web Radio' +
''
+ '' +
'' + '' +
'' + '' +
'' +
'' + '
' +
'' + '' +
'' + '
' +
'' +
'' + '' +
'';
end;
procedure TOBS_Doc_Player.TrackBar1Change(Sender: TObject);
begin
mVolume := Round(TrackBar1.Value);
b.Volume := mVolume;
end;
procedure TOBS_Doc_Player.WebModule1DefaultHandlerAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
VolumeStr: string;
VolumeValue, i: Integer;
begin
if Request.PathInfo = '/getSongs' then
begin
// Возвращаем список песен в формате JSON
var
songList: string := '[';
for i := 0 to ListBox1.Items.Count - 1 do
begin
songList := songList + '"' + ListBox1.Items[i] + '"';
if i < ListBox1.Items.Count - 1 then
songList := songList + ',';
end;
songList := songList + ']';
Response.Content := songList; // Отправляем JSON
Response.ContentType := 'application/json;charset=utf8';
Handled := True;
Exit;
end;
if Request.PathInfo = '/setVolume' then
begin
// Получаем значение из параметра 'value'
VolumeStr := Request.QueryFields.Values['value'];
// Пробуем преобразовать в целое число
if TryStrToInt(VolumeStr, VolumeValue) then
begin
// Если удалось преобразовать, обновляем переменную mVolume
mVolume := VolumeValue;
// Обновляем звук на сервере (если нужно, например, через библиотеку bass)
b.Volume := mVolume;
// Возвращаем обновленное состояние на страницу
Response.Content := gethtml;
end
else
begin
// Если не удалось преобразовать, возвращаем ошибку
Response.Content := 'Invalid volume value';
end;
Handled := True; // Запрос обработан
Exit;
end;
if Request.PathInfo = '/button1' then
begin
Button1Click(Sender); // Вызов процедуры для кнопки 1
Response.Content := gethtml;
Handled := True; // Указываем, что запрос был обработан
Exit;
end;
if Request.PathInfo = '/button2' then
begin
Button2Click(Sender); // Вызов процедуры для кнопки 2
Response.Content := gethtml;
Handled := True; // Указываем, что запрос был обработан
Exit;
end;
Response.Content := gethtml;
Handled := True;
end;
procedure TOBS_Doc_Player.WebModuleCreate(Sender: TObject);
begin
mySoundPath := GetPathToTestExe + 'TTW_Bot\ytSongs';
b := TBassSimple.Create(0);
player := TPlayerThread.Create(b, mySoundPath);
player.OnAddAd := add;
player.OnSkip := del;
mVolume := 0;
ListBox1 := TListBox.Create(self);
player.Start;
isplay := '1';
end;
procedure TOBS_Doc_Player.WebModuleDestroy(Sender: TObject);
begin
player.Free;
b.Free;
ListBox1.Free;
end;
end.