286
Плагины-дополнения / Addons / Re: AudioCloud v0.0.2 Alpha - воспроизводим музыку из "облака" [AIMP v3.60 Beta]
« on: September 17, 2014, 10:28:09 »
Soolo
Обновил, пробуй.
Обновил, пробуй.
This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.
да и кстати в AIMP 3.60 декларированы методы для работы с HTTP и HTTPS, поэтому сторонние методы вообще как бы не нужны, плеер сам их предоставляет =)У них пока ещё не реализована отправка пользовательских заголовков в запросе.
получил аксестокен, заполнил в настройкахА если закрыть и заново открыть Аимп?
при нажатии добавить из облака получаю ошибку
Module: aimp_AudioCloud.dll
Class: ESynapseError
Win8.1x64
Указать кастомный параметр можно вот так: [url]\r\nheader1\r\n. \r\n - в дельфях заменяете на #13#10.А как должен выглядеть окончательный url?
webdav.yandex.ru/123.mp3
Accept: */*
Authorization: OAuth <токен>
Как то так?Accept%3A+*%2F*
Authorization%3A+OAuth+%3C%3F%3F%3F%3F%3F%3E
Или можно передавать в том виде, как есть?Accept: */*
Authorization: OAuth <токен>
Правильно ли я понимаю, что токен отправляется через POST запрос? Или он отправляется в поле HTTP-GET заголовка?Get запрос, в заголовке нужно передать "Authorization: OAuth <токен>".
Точно, заголовки запроса же входят в состав url. Можно попробовать.Яндекс.Диск не хочет работать через токен в параметрах url, только в теле запроса. Причем остальные сервисы яндекса так умеют.
Так если ответом идут данные, нельзя ли подменить временный-URL из плейлиста на этот запрос? Ведь в таком случае плеер сам все декодирует и проиграет.Точно, заголовки запроса же входят в состав url. Можно попробовать.
В новом SDK, ознакомьтесь с разделом FileManager, интерфейсом IAIMPVirtualFile и все, что с ним связано.Возник вопрос, при каких условиях срабатывает IAIMPExtensionFileExpander.Expand (т.к. пока никак не срабатывает)? И как добавляется в плейлист путь к "виртуальному файлу" (т.е. как проще это сделать, в целях отладки)?
Поясните, пожалуйста. Вы посылаете какой-то запрос, а сервер отдает файл, так?Точно, отсылаю запрос - и ответом идут данные. Только сейчас дошло до меня... никакой временной ссылки я не получаю, по крайней мере по протоколу WebDav.
Нет, такие варианты не подойдут. Правильным в данной ситуации будет морозить вызывающий поток до того момента, пока данные не подоспеют.А каким подходом это делать? Не начинать воспроизведение, пока не закачается всё? Отслеживать воспроизведение и каким то образом просчитывать, что впереди "обрыв" и приостанавливаться (пока даже не представляю как)?
Да, доступно. Лежит на сайте в разделе SDK.
Если прямой ссылки нет, то каким образом вы собираетесь скачивать файл? Как правило сервисы отдают временную прямую ссылку на файл, по которому их могут скачать браузеры и т.п.Средствами API самого сервера. Оно в отличии от временной ссылки будет работать всегда, а не временно. Есть парочка вариантов, как "обмануть" аимп и реализовать это.
А как вы пытались реализовать это?Пробовал два варианта:
Но отдавать данные вам нужно уже в PCM-формате, а не в исходном.Т.е. нет никакой возможности передать данные следующему "подходящему" декодеру?
1. я бы изучил вопрос на счет прямой ссылки, раз вы можете скачать файл по ссылке, значит вы можете и проиграть его по ссылке.Это был запасной вариант, если ответ на вышеуказанный вопрос с декодером - отрицательный, буду пробовать его.
Базируясь на API для 3.60Так оно уже доступно или нет?
{ TAIMPInputPluginHeader }
function TAIMPInputPluginHeader.CreateDecoder(AFileName: PWideChar;
out ADecoder: IAIMPInputPluginDecoder): LongBool;
begin
ADecoder := TAIMPInputPluginDecoder.Create(AFileName);
Result := True;
end;
function TAIMPInputPluginHeader.CreateDecoderEx(AStream: IAIMPInputStream;
out ADecoder: IAIMPInputPluginDecoder): LongBool;
begin
Result := False;
end;
function TAIMPInputPluginHeader.Initialize: LongBool;
begin
Result := True;
end;
function TAIMPInputPluginHeader.Finalize: LongBool;
begin
Result := True;
end;
function TAIMPInputPluginHeader.GetFileInfo(AFileName: PWideChar;
AFileInfo: PAIMPFileInfo): LongBool;
begin
Result := False;
end;
function TAIMPInputPluginHeader.GetPluginAuthor: PWideChar;
begin
Result := 'Test';
end;
function TAIMPInputPluginHeader.GetPluginFlags: DWORD;
begin
Result := AIMP_INPUT_FLAG_FILE
end;
function TAIMPInputPluginHeader.GetPluginInfo: PWideChar;
begin
Result := 'Test';
end;
function TAIMPInputPluginHeader.GetPluginName: PWideChar;
begin
Result := 'Test';
end;
function TAIMPInputPluginHeader.GetSupportsFormats: PWideChar;
begin
Result := 'Test|*.test;|';
end;
{ TAIMPInputPluginDecoder }
constructor TAIMPInputPluginDecoder.Create(const AFileName: string);
begin
FS := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyRead);
end;
function TAIMPInputPluginDecoder.DecoderGetFormatType: PWideChar;
begin
Result := 'MP3';
end;
function TAIMPInputPluginDecoder.DecoderGetInfo(out ASampleRate, AChannels,
ABitDepth: Integer): LongBool;
begin
Result := False;
end;
function TAIMPInputPluginDecoder.DecoderGetPosition: Int64;
begin
Result := FS.Position;
end;
function TAIMPInputPluginDecoder.DecoderGetSize: Int64;
begin
Result := FS.Size;
end;
function TAIMPInputPluginDecoder.DecoderGetTags(
AFileInfo: PAIMPFileInfo): LongBool;
begin
Result := False;
end;
function TAIMPInputPluginDecoder.DecoderIsRealTimeStream: LongBool;
begin
Result := False;
end;
function TAIMPInputPluginDecoder.DecoderIsSeekable: LongBool;
begin
Result := True;
end;
function TAIMPInputPluginDecoder.DecoderRead(Buffer: PByte;
Size: Integer): Integer;
begin
FS.Write(Buffer, Size);
end;
function TAIMPInputPluginDecoder.DecoderSetPosition(
const AValue: Int64): LongBool;
begin
FS.Position := AValue;
end;
destructor TAIMPInputPluginDecoder.Destroy;
begin
FS.Free;
end;