|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Разбор текста с запроса vk audio.get
Здравствуйте!
делаю запрос аудиозаписей, ответ приходит. Но как его разобрать и какой компонент лучше использовать, для выведения в программе? Основной вопрос по тексту.. Я пробовал мудрить с функциями pos, delete,copy и тд.. но только запутал себя еще больше.. Ответ такой(запрос для примера 3 трека) Цитата:
|
#2
|
|||
|
|||
Название трека идет после слова "title":"Имя артиста и название трека."
Можете с помощью цикла пробежаться по этому тексту и начинать считывать название трека именно после ' "title":" ' и признак конца будет символ " |
#3
|
||||
|
||||
Нужно по-правилам пользовать регэкспы, но мона и так разобрать, G-кодом
Код:
procedure TForm1.Button1Click(Sender: TObject); procedure prs(ds, s1, s2: string; list: TStrings); var pScan, pEnd, ps1, ps2: PChar; foundText : string; begin ds := Uppercase(ds); s1:= Uppercase(s1); s2:= Uppercase(s2); ps1:= PChar(s1); ps2:= PChar(s2); pScan:= PChar(ds); repeat pScan := StrPos(pScan, ps1); if pScan <> nil then begin inc(pScan, Length(s1)); pEnd:= StrPos(pScan, ps2); if pEnd <> nil then begin SetString(foundText, Pchar(ds)+(pScan-PChar(ds)), pEnd-pScan); list.Add(foundText); pScan:= pEnd+Length(s2); end else pScan:= nil; end; until pScan = nil; end; var artist, title, url: TStrings; i: integer; s: string; begin artist:= TStringList.Create; title:= TStringList.Create; url:= TStringList.Create; s:= Memo1.Text; prs(s, '"artist":"', '","', artist); prs(s, '"title":"', '","', title); prs(s, '"url":"', '","', url); ListBox1.TabWidth := 200; for i := 0 to artist.Count-1 do ListBox1.Items.Add('Artist: '+artist[i]+^I+'Title: '+title[i]+^I+'URL: '+url[i]); artist.Free; title.Free; url.Free; end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Gareth (10.04.2016)
|
#4
|
|||
|
|||
Код:
procedure test; Var Str, st, MyStr: String; i,j: Integer; begin while (Pos(artist, dintext)<>0) Do begin ar:=''; tit:=''; dr:=''; i:=Pos(artist, dintext); j:=i+length(artist); Repeat ar:=ar+dintext[j]; inc(j); until ((dintext[j]='"')); Delete(dintext, i, j-i); i:=Pos(title, dintext); j:=i+length(title); Repeat tit:=tit+dintext[j]; inc(j); until (dintext[j]='"'); Delete(dintext, i, j-i); i:=Pos(dur, dintext); j:=i+length(dur); Repeat dr:=dr+dintext[j]; inc(j); until (dintext[j]=','); Delete(dintext, i, j-i); Form1.ListBox1.Items.Add(ar+'-'+tit+','+dr); {Form1.ListBox1.Items.Add('Track:'+ar); Form1.ListBox1.Items.Add('Title:'+tit); Form1.ListBox1.Items.Add('Duration:'+dr); } end; end; procedure TForm1.Button1Click(Sender: TObject); begin dintext:= Memo1.Text; artist:='"artist":"'; title:='"title":"'; dur:='"duration":'; test; end; |
Этот пользователь сказал Спасибо js roman1 за это полезное сообщение: | ||
Gareth (10.04.2016)
|
#5
|
|||
|
|||
Спасибо огромное за код!
Работает. Но как воспроизвести трек по нажатию в листбоксе? Нашёл в инете код: Код:
procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var i: integer; begin if ListBox1.ItemIndex>=0 then begin i:= ListBox1.ItemIndex; BasicPlay(link[i]); end; end; Что это за link, где и как его объявить ? |
#6
|
||||
|
||||
Ага, на BasicPlay значит не ругается, предположим, что link это список с текстовыми адресами, если мой пример работает, тогда замените эту строчку на BasicPlay(url[ListBox1.ItemIndex]); i можно и выкинуть, только url.Free следует выполнить лишь при выходе из программы, не раньше
З.Ы. В смысле, нужно стринГлисту url сделать глобальной, видимой из других процедур перенеся её в var-секцию юнита Я не понял Вашего вопроса, но всё же Вам на него отвечу! Последний раз редактировалось Alegun, 10.04.2016 в 13:45. |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Gareth (10.04.2016)
|
#7
|
|||
|
|||
Сделал как вы сказали. Все ссылки, артисты и тд отоброжаются, ваш код работает. Но при попытки воспроизвести музыку выдает ошибку.
Ошибка с этого кода, 7 строка: Код:
var channel: HStream; procedure BasicPlay(FileName: AnsiString); begin Channel:= BASS_StreamCreateURL(PAnsiChar(FileName),0,0,nil,0); //Создаём файл, функция аналогична предыдущей, так что без комментариев. if not Bass_ChannelPlay(Channel, False) then //Воспроизводим MessageBox(0, 'Ошибка воспроизведения файла',0, Mb_ok); end; |
#8
|
||||
|
||||
Всё может быть, попробуйте для примера подбросить на форму едит, в него адрес эмпифришки и пробуйте её запустить удаляя лишнее, как запустится будет образец для разборки ответа
З.Ы. Можно StringReplace натравить для удаления лишних слешей Я не понял Вашего вопроса, но всё же Вам на него отвечу! Последний раз редактировалось Alegun, 10.04.2016 в 15:44. |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Gareth (10.04.2016)
|
#9
|
|||
|
|||
Цитата:
Код:
uses ..., superobject .... var Answer: ISuperObject ... Answer:= TSuperObject.ParseStream(myHT.Document,False); msg:=Answer.AsObject.S['title']; |
#10
|
|||
|
|||
Извиняюсь что долго не отвечал.
Плеер работает так как мне надо= ))) Спасибо всем, особенно Alegun . Дело было в том, что удалял я не те символы с ссылки. Надо было другие слэши уждалять. С двумя слэшами как в ответе от вк "\/" не играло, я удалял этот слэш "/", а надо было этот "\" , + какого-то фига ответ был в верхнем регистре, перевел ответ на всякий случай в нижний. Плеер работает, осталось прикрутить потоки и всякие кнопочки, типа плей, пауза, стоп... В общем разобрался я как это всё работает. Теперь не составляет труда сделать с нуля=) Еще раз спасибо всем !) Тема закрыта =) |