Форум » [x]Harbour » Чтение ICS-формата, возможно ли? » Ответить

Чтение ICS-формата, возможно ли?

Dr. Oldwarez: После долгих боёв, с помощью уважаемого SergKis, мне удалось организовать считывание из csv файла в массив, который далее можно заносить в базу данных. Но выяснилась следующая проблема: Google Calendar и прочие, особенно Horde Groupware, экспортируют календари только в формате ics. А там совершенно другой формат, теговый. Пример: [pre2] BEGIN:VCALENDAR VERSION:2.0 X-WR-CALNAME: Test Calendar PRODID:-//The Horde Project//Horde iCalendar Library//EN BEGIN:VEVENT UID:19970901T130000Z-123402@example.com DTSTAMP:19970901T130000Z DTSTART:19970401T163000Z DTEND:19970402T010000Z SUMMARY:Laurel is in sensitivity awareness class. CLASS:PUBLIC CATEGORIES:BUSINESS,HUMAN RESOURCES TRANSP:TRANSPARENT END:VEVENT BEGIN:VEVENT UID:20070423T123432Z-541111@example.com DTSTAMP:20070423T123432Z DTSTART;VALUE=DATE:20070628 DTEND;VALUE=DATE:20070709 SUMMARY:Festival International de Jazz de Montreal TRANSP:TRANSPARENT END:VEVENT END:VCALENDAR [/pre2]

Ответов - 6

SergKis: Dr. Oldwarez Такой файл читать не трудно, конкретно isc не читал, но файлы *.m3u читал с помощью oKeyData() из hmg пример формирования dbf из m3u тут [pre2] STATIC FUNCTION m3uCreate( cFil ) LOCAL lUse := .F., cAls LOCAL cDbf := left(cFil, RAt(".", cFil))+"dbf" LOCAL cCdx := left(cFil, RAt(".", cFil))+"cdx" LOCAL cCfg := left(cFil, RAt(".", cFil))+"cfg" LOCAL aStru := {}, cBuf, aBuf, oBuf LOCAL aOut := {}, cTmp, nTmp LOCAL nLen := 500 IF ! file( cDbf ) AAdd(aStru, {"NHTTP" , "C", 1, 0}) AAdd(aStru, {"YHTTP" , "C", 1, 0}) AAdd(aStru, {"EXTINF" , "C", 30, 0}) AAdd(aStru, {"EXTGRP" , "C", 20, 0}) AAdd(aStru, {"HTTP" , "C", nLen, 0}) AAdd(aStru, {"FAVOUR" , "N", 4, 0}) cBuf := hb_memoread(cFil) aBuf := hb_ATokens(cBuf, CRLF) FOR EACH cBuf IN aBuf cBuf := alltrim(hb_Utf8ToStr(cBuf)) IF Empty(cBuf) .or. "#EXTM3U" $ cBuf .or. lower(right(cBuf, 4)) == ".mp4" ; LOOP ENDIF IF "#EXTINF" $ cBuf oBuf:EXTINF := "" oBuf:EXTGRP := "" oBuf:HTTP := "" oBuf:EXTVLCOPT := "" oBuf := oKeyData() cTmp := subs(cBuf, At(":", cBuf)+1) cBuf := cTmp IF ( nTmp := At('group-title="', cTmp) ) > 0 cTmp := subs(cTmp, nTmp+13) oBuf:EXTGRP := left(cTmp, At('"', cTmp) - 1) ENDIF IF ( nTmp := RAt(",", cBuf) ) > 0 ; cBuf := subs(cBuf, nTmp + 1) ENDIF oBuf:EXTINF := cBuf ELSEIF "#EXTGRP" $ cBuf oBuf:EXTGRP := subs(cBuf, At(":", cBuf)+1) IF "Android" $ cBuf ; oBuf:EXTVLCOPT := "Только Android" ELSEIF "Украина" $ cBuf ; oBuf:EXTVLCOPT := "Украина" ENDIF ELSEIF "#EXTVLCOPT" $ cBuf oBuf:EXTVLCOPT := subs(cBuf, At(":", cBuf)+1) IF "Android" $ cBuf oBuf:EXTVLCOPT := "Только Android" ENDIF ELSEIF "http" == left(cBuf, 4) oBuf:HTTP := trim(cBuf) IF "/spacetv." $ cBuf .or. "/ott." $ cBuf .or. "/myott." .or. cBuf .or. "/mytv." $ cBuf .or. ; "/tvmedia2." $ cBuf .or. "/hlss.goodgame." $ cBuf .or. "/cdn01.dyndns." $ cBuf oBuf:EXTVLCOPT := "Ограничение устройств" ENDIF IF "Украи" $ oBuf:EXTGRP ; oBuf:EXTVLCOPT := "Пропустить Украина каналы" ENDIF IF Empty(oBuf:EXTVLCOPT) .and. ! "==" $ oBuf:EXTINF ; // не раб. строка .and. ! "FORKPLAY" $ upper(oBuf:EXTGRP) ; // не VLC player .and. ! "/variant.m3u8" $ oBuf:HTTP // не Wink адрес AAdd(aOut, oBuf) // адрес iptv добавим в список ENDIF ENDIF NEXT fErase(cCdx) fErase(cCfg) dbCreate( cDbf, aStru, , .T., "_TMP_", , "RU866" ) FOR EACH oBuf IN aOut IF Len(oBuf:HTTP) > nLen ? "Len(oBuf:HTTP) > "+hb_ntos(nLen), Len(oBuf:HTTP), oBuf:EXTINF, oBuf:HTTP ELSE APPEND BLANK REPLACE EXTINF with oBuf:EXTINF, ; EXTGRP with oBuf:EXTGRP, ; HTTP with oBuf:HTTP ENDIF NEXT dbCloseArea() EndIf BEGIN SEQUENCE WITH { |e|break(e) } USE ( cDbf ) ALIAS M3U NEW CODEPAGE "RU866" lUse := Used() END SEQUENCE IF lUse cAls := Alias() cBuf := "#EXTM3U"+CRLF GO TOP DO WHILE !EOF() cBuf += "#EXTINF"+":"+"-1,"+alltrim((cAls)->EXTINF)+CRLF cBuf += "#EXTGRP"+":"+alltrim((cAls)->EXTGRP)+CRLF cBuf += alltrim((cAls)->HTTP)+CRLF SKIP ENDDO GO TOP hb_MemoWrit(cCfg, cBuf) ENDIF RETURN lUse [/pre2] похожим образом можно прочитать тэги isc

SergKis: PS примеры m3u файлов (реальных) тут смотреть https://proiptv.top/

Dr. Oldwarez: SergKis пишет: но файлы *.m3u читал с помощью oKeyData() из hmg Спасибо. А что это за функция такая - oKeyData()? Я её в документации не видел


SergKis: Dr. Oldwarez пишет А что это за функция такая - oKeyData()? см. http://clipper.borda.ru/?1-4-0-00001336-000-0-0 Пост 3580 и далее

SergKis: PS Должно быть так (не понял как, но строка перепрыгнула) [pre2] IF "#EXTINF" $ cBuf oBuf := oKeyData() oBuf:EXTINF := "" oBuf:EXTGRP := "" oBuf:HTTP := "" oBuf:EXTVLCOPT := "" oBuf := oKeyData() cTmp := subs(cBuf, At(":", cBuf)+1) [/pre2]

Dr. Oldwarez: Вот так. Теги добавляем по вкусу. [pre2]LOCAL aBuf:=hb_ATokens( hb_memoread(GetFile({{'ICAL-файл','*.ics'}},'Выберите ICAL файл для импорта',; cImportLW,.F.,.T.)), CRLF) LOCAL aLen := {280,80,50,80,50,200,350} LOCAL aHeaders:={"Subject","Start Date", "Start Time","End Date","End Time","Location","Description"},aPos LOCAL cSubject:="",dStartDate:=CTOD(""),cStartTime:="00:00",dEndDate:=CTOD(""),cEndTime:="00:00",cLocation:="",cDescription:="" LOCAL nRec:=Termin->(RECNO()) aDim:={} FOR nI:=1 TO LEN(aBuf) IF aBuf[nI]="BEGIN:VEVENT" cSubject:="" dStartDate:=CTOD("") cStartTime:="00:00" dEndDate:=CTOD("") cEndTime:="00:00" cLocation:="" cDescription:="" ENDIF IF aBuf[nI]="DTSTART" //aPos:=HB_ATOKENS(aBuf[nI]":") //MsgInfo(aBuf[nI]) cDateTime:=SUBSTR(aBuf[nI],AT(":",aBuf[nI])+1) dStartDate:=STOD(LEFT(cDateTime,8)) cStartTime:=SUBSTR(cDateTime,10,2)+":"+SUBSTR(cDateTime,12,2) ENDIF IF aBuf[nI]="DTEND" cEndDateTime:=SUBSTR(aBuf[nI],AT(":",aBuf[nI])+1) dEndDate:=STOD(LEFT(cDateTimeEnd,8)) cEndTime:=SUBSTR(cEndDateTime,10,2)+":"+SUBSTR(cEndDateTime,12,2) ENDIF IF aBuf[nI]="SUMMARY" cSubject:=SUBSTR(aBuf[nI],AT(":",aBuf[nI])+1) ENDIF IF aBuf[nI]="LOCATION" cLocation:=SUBSTR(aBuf[nI],AT(":",aBuf[nI])+1) ENDIF IF aBuf[nI]="DESCRIPTION" cDescription:=SUBSTR(aBuf[nI],AT(":",aBuf[nI])+1) ENDIF IF aBuf[nI]="END:VEVENT" .AND. !DupTerm(dStartDate,cStartTime) AADD(aDim,{cSubject,dStartDate,cStartTime,dEndDate,cEndTime,cLocation,cDescription}) ENDIF NEXT nI DEFINE WINDOW wndICalImport; AT 50,0; WIDTH 1020 HEIGHT 670; CHILD; TITLE "Импорт календарей ICS" IF LEN(aDim)>0 DEFINE TBROWSE brwIcalImport; AT 10,10; WIDTH 950 HEIGHT 350; GRID brwICalImport:=SetArrayTo("brwICalImport","wndICalImport",aDim,,aHeaders,aLen) END TBROWSE ENDIF [/pre2]



полная версия страницы