Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Закрытая тема
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.04.2016, 04:21
Gareth Gareth вне форума
Активный
 
Регистрация: 21.03.2013
Адрес: Приднестровье
Сообщения: 202
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Разбор текста с запроса vk audio.get

Здравствуйте!

делаю запрос аудиозаписей, ответ приходит. Но как его разобрать и какой компонент лучше использовать, для выведения в программе?
Основной вопрос по тексту.. Я пробовал мудрить с функциями pos, delete,copy и тд.. но только запутал себя еще больше..

Ответ такой(запрос для примера 3 трека)
Цитата:
{"response":[45,{"aid":456239040,"owner_id":80472368,"artist":" EA7","title":"Major Lazer feat. Wild Belle - Be Together","duration":235,"url":"http:\/\/cs6-12v4.vk-cdn.net\/p18\/7cefb1e16d2242.mp3?extra=9hmtrkCPI4i1J12lq4_sS1KKa Vmxto7amYNAeLG-mIKL83h_xAdyg8oNnegYCKnH3cFK9kawFqXl1hxlAdHsmqSgwl J8Kn8eh0dRkMnqkH1IOK6kFVsATsTQ7aq6hndxZgrrglp3T7zW ","lyrics_id":"320572814","genre":22},{"aid":45623 9038,"owner_id":80472368,"artist":"2Pac","title":" Hail Mary (1996)","duration":166,"url":"http:\/\/cs6-7v4.vk-cdn.net\/p6\/d66b0363401315.mp3?extra=itEsbCn6DKGi6l2TmUHMiiyCZ fFn7r5hv79E5y7P0aKtSD-zy_7SGncCUQ9Ve-wXExLMbg3y5ztrVChwP9drEN7fm7OAJzAxEkMgH1H3UI50RIVU Yth6IHPnibpVGodrIle6y0nxsWPs","genre":18},{"aid":4 56239036,"owner_id":80472368,"artist":"2Pac,Eazy-E and Fugees","title":"Ready Or Not (Remix)","duration":239,"url":"http:\/\/cs6-4v4.vk-cdn.net\/p11\/81e91c4d23f9be.mp3?extra=WyNy9d-a4_Vg1UKXBeFn6iKoMpbTeWfVAE0z5sw7_fmw_Ml4beV0G7SMP e7abGYNGrawaaeF0x90csryj12CW4dIpbeJCCpgnzDqjo89alU EaoiaGlaDCSYW0_MKWSRtxJAdFiuRNfZL","lyrics_id":"11 534176","genre":18}]}
Хотелось бы, что бы вы объяснили как вытащить имена артистов, название треков, URL и вставить их в Listbox. Заранее спасибо !
  #2  
Старый 10.04.2016, 09:18
js roman1 js roman1 вне форума
Прохожий
 
Регистрация: 08.04.2016
Сообщения: 25
Версия Delphi: XE8
Репутация: 10
По умолчанию

Название трека идет после слова "title":"Имя артиста и название трека."
Можете с помощью цикла пробежаться по этому тексту и начинать считывать название трека именно после ' "title":" ' и признак конца будет символ "
  #3  
Старый 10.04.2016, 10:43
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Нужно по-правилам пользовать регэкспы, но мона и так разобрать, 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  
Старый 10.04.2016, 11:02
js roman1 js roman1 вне форума
Прохожий
 
Регистрация: 08.04.2016
Сообщения: 25
Версия Delphi: XE8
Репутация: 10
По умолчанию

Код:
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  
Старый 10.04.2016, 11:47
Gareth Gareth вне форума
Активный
 
Регистрация: 21.03.2013
Адрес: Приднестровье
Сообщения: 202
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо огромное за код!
Работает.

Но как воспроизвести трек по нажатию в листбоксе?
Нашёл в инете код:
Код:
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;
Проблема со строкой BasicPlay(link[i]); Пишет Undeclared identifier: 'link'.
Что это за link, где и как его объявить ?
  #6  
Старый 10.04.2016, 13:31
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Ага, на BasicPlay значит не ругается, предположим, что link это список с текстовыми адресами, если мой пример работает, тогда замените эту строчку на BasicPlay(url[ListBox1.ItemIndex]); i можно и выкинуть, только url.Free следует выполнить лишь при выходе из программы, не раньше

З.Ы. В смысле, нужно стринГлисту url сделать глобальной, видимой из других процедур перенеся её в var-секцию юнита

Последний раз редактировалось Alegun, 10.04.2016 в 13:45.
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Gareth (10.04.2016)
  #7  
Старый 10.04.2016, 15:25
Gareth Gareth вне форума
Активный
 
Регистрация: 21.03.2013
Адрес: Приднестровье
Сообщения: 202
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Сделал как вы сказали. Все ссылки, артисты и тд отоброжаются, ваш код работает. Но при попытки воспроизвести музыку выдает ошибку.

Ошибка с этого кода, 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;
Может ли это быть из-за того, что в url есть лишние символы "/" ?
  #8  
Старый 10.04.2016, 15:35
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Всё может быть, попробуйте для примера подбросить на форму едит, в него адрес эмпифришки и пробуйте её запустить удаляя лишнее, как запустится будет образец для разборки ответа

З.Ы. Можно StringReplace натравить для удаления лишних слешей

Последний раз редактировалось Alegun, 10.04.2016 в 15:44.
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Gareth (10.04.2016)
  #9  
Старый 10.04.2016, 16:06
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Gareth
Здравствуйте!


Ответ такой(запрос для примера 3 трека)
Хотелось бы, что бы вы объяснили как вытащить имена артистов, название треков, URL и вставить их в Listbox. Заранее спасибо !
Можно конечно руками, но есть объект для работы с JSON:
Код:
uses ..., superobject
....
var
Answer: ISuperObject
...
  Answer:= TSuperObject.ParseStream(myHT.Document,False);
     msg:=Answer.AsObject.S['title'];
    
Эти 2 пользователя(ей) сказали Спасибо nixon232 за это полезное сообщение:
Gareth (10.04.2016), Tech N9ne (08.10.2018)
  #10  
Старый 14.04.2016, 20:41
Gareth Gareth вне форума
Активный
 
Регистрация: 21.03.2013
Адрес: Приднестровье
Сообщения: 202
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Извиняюсь что долго не отвечал.
Плеер работает так как мне надо= ))) Спасибо всем, особенно Alegun .
Дело было в том, что удалял я не те символы с ссылки. Надо было другие слэши уждалять. С двумя слэшами как в ответе от вк "\/" не играло, я удалял этот слэш "/", а надо было этот "\" , + какого-то фига ответ был в верхнем регистре, перевел ответ на всякий случай в нижний.

Плеер работает, осталось прикрутить потоки и всякие кнопочки, типа плей, пауза, стоп...

В общем разобрался я как это всё работает. Теперь не составляет труда сделать с нуля=)
Еще раз спасибо всем !) Тема закрыта =)
Закрытая тема


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:19.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter