' Scaricamento palinsesti SKY ' Freeware by Jumpjack & Rob64 ' http://win98.altervista.org/SatGrabLC ' 3.2.3/3.3.0/3.4.0 ' Aggiunto link a programmazione mensile ' Corretta estensione filtro automatico e colorazione intestazione. '3.2.2 ' Ora la cartella temporanea puo' essere impostata manualmente (nel secondo foglio) ' Migliorati contatori di progresso. ' 3.2.1 ' Modificato nome dei file salvati su disco (aggiunta data) ' Modificata cartella salvataggio file temporanei (non piu' C:\temp ma la cartella del programma) ' Corretto bug minore su una checkbox ' 3.2.0 ' Implementata listbox con canali (utente Rob64 di digital-forum) ' Corretta colonna link pagina ' Sveltito scaricamento trame (prima per errore la scaricava ad ogni campo!) ' Riordinata interfaccia ' Ripristinata funzionalità del tasto CANCELLA FOGLIO in maschera ' Eliminato genere HD (non piu' disponibile online perche' integrato in CINEMA) ' 3.1.0 ' Riattivato doppio click su colonna trama per scaricamento trama completo (disattivato per errore). ' Aggiunto commento in colonna trama sulla possibilità di scaricarla completa. ' Reinseriti campi "genere" e "sottogenere" (scomparsi dopo modifiche a formato file SKY). ' Ripulito codice per aumentare la velocità di scaricamento. ' Aggiunti numerosi commenti alla procedura di conversione da JSON a tabella per facilitare il porting. ' 2.4.3/3.0.0 ' Disattivata procedura Cancella (sostituita con CancellaFoglio, in fondo al sorgente) ' Introdotte costanti coi nomi dei fogli ' Eliminato auto-popup della finestra di download ' Aggiunto pulsante cancellazione foglio ' Messi pulsanti in entrambi i fogli ' Invertito ordine dei fogli: ora viene mostrato per primo quello con tutti i tisultati ' Aggiunta checkbox per scaricare le trame complete anche nel foglio globale (LENTISSIMO!) ' Aggiunta checkbox per forzare scaricamento file gia' presenti su disco (per default ora non li scarica). ' 2.4.2 ' Adattato a nuovo formato SKY (modifiche iniziate in 2.4.1) ' 2.4.1 (distribuito beta) ' Tentativo di adattamento a cambio formato SKY (non funziona) ' Verificare se mantenuta correzione bug data. ' 2.4.0 ' Ricorretto bug data ' 2.3.0 ' Aggiunti link a trama e a pagina SKY. ' Resa doppio-cliccabile colonna trama per scaricare trama completa. ' Sistemato bug data (internamente excel usa sempre il formato mm/gg/aaaa) ' 2.2.3 ' Corretto bug dei link ' Corretto bug dei filtri ' Nascoste colonne inutili ' 2.2.2 ' Corretto mini bug in etichetta "progresso" (c'era CAN: invece di DAY:) ' Aggiunto breve Help ' Subordinata casella canale ad accensione checkbox ' 2.2.1 ' Corretto errore su numero totale generi/giorni non azzerato a ogni ricalcolo ' Corretta mancata inizializzazione variabile RICERCA ' Corretto errore di ABORT non funzionante ' 2.2.0 ' Corretto errore: nel nome del file scaricato ci possono essere caratteri vietati, tolto nome canale da nome file; ' Corretto errore: problema con dir$() per verificare esistenza file (manca percorso); ' Aggiunto genere MUSICA; ' Aggiunta ripetizione scaricamento per tutti i file; ' Aggiunti indicatori di progresso numerici. ' 2.1.0 ' Corretto bug di mancato scaricamento file se non è selezionata checkbox del canale; ' aggiunti vari messaggi di errore; ' corretti alcuni bug relativi a dati scaricati mancanti e visualizzazione dati filtrati. ' Implementato scaricamentio trama; ' Aggiunto link a dettagli evento. ' 2.0.0 ' Nuova versione per supportare il nuovo formato JSON della guida SKY ' 1.1.2 'Aggiunto scaricamento automatico eventi con nome troppo corto nella "tabella rapida" 'Bisogna riaggiungere il conteggio corretto della versione 1.1.1 ' 1.1.0: ' Tolta sostituzione virgolette con apici (faccio il contrario, metto virgolette nei pattern) ' Spostata definizione pattern fuori dal ciclo. ' Ridotti da 1 a 3 in ciclo: InStr(InStr(orario, " ") + 1, orario, " ") ' Eliminata dal tutto riformattazione file (perfettamente inutile). ' ************** Richiede MICROSOFT HTML OBJECT LIBRARY: Public Declare Function URLDownloadToFile Lib "urlmon" Alias _ "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, _ ByVal szFileName As String, ByVal dwReserved As Long, _ ByVal lpfnCB As Long) As Long 'Dim riga As Long Dim Progress As String Dim abort As Boolean Dim expr(20), M(20) As String Dim numex As Integer Dim pattern(5) As String Dim NumEventi As Long Dim NumeroEventiSelezionati As Long Public NumeroGeneri As Integer Public genere(20) As String Dim ricerca As String 'Dim TotGens, TotDays As Integer ' Per accesso da altri moduli: Public Const NOME_FOGLIO_GLOBALE = "Globale" Public Const NOME_FOGLIO_RICERCA = "Dettagli" Dim NomeGlobale As String Dim NomeRicerca As String Const COLONNA_BASE = 6 Const COLONNA_ID = 2 Const COLONNA_ORARIO = 3 Const COLONNA_DURATA = 4 Const COLONNA_TITOLO = 5 Const COLONNA_TRAMA = 7 Const COLONNA_LINK = 18 Public Const MAX_Tentativi = 5 ' A volte il download non funziona al primo tentativo. Public Path As String Dim NumeroEventiCanale, NumeroEventiTrovatiCanale, NumeroCanali, CanaliElaborati, CurrGens, TotGens, CurrDays, TotDays As Integer Const STRINGA_GENERE = "http://guidatv.sky.it/app/guidatv/contenuti/data/grid/grid_GGGGGGGG_channels.js" Const STRINGA_CANALE = "http://guidatv.sky.it/app/guidatv/contenuti/data/grid/AA_MM_GG/ch_CCCCCCCC.js" Public Const STRINGA_EVENTO = "http://guidatv.sky.it/EpgBackend/event_description.do?eid=EEEEEEEE" Const STRINGA_MENSILE = "http://guidatv.sky.it/EpgBackend/getprogrammazione.do?idprogramma=" ' Seguita da id interno programma Sub InitVars() genere(1) = "intrattenimento" genere(2) = "cinema" genere(3) = "sport" genere(4) = "mondi" genere(5) = "news" genere(6) = "bambini" genere(7) = "primafila" genere(8) = "musica" 'genere(9) = "hd" NumeroGeneri = 8 NomeGlobale = NOME_FOGLIO_GLOBALE NomeRicerca = NOME_FOGLIO_RICERCA Call SetupTempFolder End Sub 'Sub Cancella() ' If MsgBox("Sicuro di voler cancellare tutto?", vbYesNo, "Conferma cancellazione") = vbNo Then Exit Sub ' Cells.Select ' Selection.ClearContents ' Call InizializzaFoglio 'End Sub Sub InizializzaFoglio() Sheets(NOME_FOGLIO_RICERCA).Cells(2, 1) = "Genere" Sheets(NOME_FOGLIO_RICERCA).Cells(2, 2) = "Posizione" Sheets(NOME_FOGLIO_RICERCA).Cells(2, 3) = "Giorno" Sheets(NOME_FOGLIO_RICERCA).Cells(2, 4) = "Data" Sheets(NOME_FOGLIO_RICERCA).Cells(2, 4) = "Data" Sheets(NOME_FOGLIO_RICERCA).Cells(2, 4) = "Data" Sheets(NOME_FOGLIO_RICERCA).Cells(2, 5) = "Orario" Sheets(NOME_FOGLIO_RICERCA).Cells(2, 6) = "Durata (min.)" Sheets(NOME_FOGLIO_RICERCA).Cells(2, 7) = "Titolo" Sheets(NOME_FOGLIO_RICERCA).Cells(2, 8) = "Trama" Sheets(NOME_FOGLIO_RICERCA).Select Range("A2:H2").Select With Selection.Interior .ColorIndex = 48 .pattern = xlSolid End With Selection.Font.bold = True 'Range("h2").Select Selection.AutoFilter Sheets(NOME_FOGLIO_GLOBALE).Cells(1, 1) = "Genere canale" Sheets(NOME_FOGLIO_GLOBALE).Cells(1, 2) = "(codice canale)" Sheets(NOME_FOGLIO_GLOBALE).Cells(1, 3) = "Posizione canale" Sheets(NOME_FOGLIO_GLOBALE).Cells(1, 4) = "Nome canale" Sheets(NOME_FOGLIO_GLOBALE).Cells(1, 5) = "Giorno" Sheets(NOME_FOGLIO_GLOBALE).Cells(1, 6) = "Data" Sheets(NOME_FOGLIO_GLOBALE).Cells(1, 7) = "ID evento" Sheets(NOME_FOGLIO_GLOBALE).Cells(1, 8) = "(ID interno)" Sheets(NOME_FOGLIO_GLOBALE).Cells(1, 9) = "Orario" Sheets(NOME_FOGLIO_GLOBALE).Cells(1, 10) = "Durata (min.)" Sheets(NOME_FOGLIO_GLOBALE).Cells(1, 11) = "Titolo" Sheets(NOME_FOGLIO_GLOBALE).Cells(1, 12) = "(titolo normalizzato)" Sheets(NOME_FOGLIO_GLOBALE).Cells(1, 13) = "Estratto della trama - doppio click per scaricare trama completa" Sheets(NOME_FOGLIO_GLOBALE).Cells(1, 14) = "Genere evento" Sheets(NOME_FOGLIO_GLOBALE).Cells(1, 15) = "Tipo di evento" Sheets(NOME_FOGLIO_GLOBALE).Cells(1, 16) = "" Sheets(NOME_FOGLIO_GLOBALE).Cells(1, 17) = "" Sheets(NOME_FOGLIO_GLOBALE).Cells(1, 18) = "File dettagli" Sheets(NOME_FOGLIO_GLOBALE).Cells(1, 19) = "Pagina web evento" Sheets(NOME_FOGLIO_GLOBALE).Cells(1, 20) = "Pagina web programmazione mensile" Sheets(NOME_FOGLIO_GLOBALE).Select Range("A1:T1").Select With Selection.Interior .ColorIndex = 48 .pattern = xlSolid End With Selection.Font.bold = True 'Range("a1:t1").Select Selection.AutoFilter 'Sheets(NOME_FOGLIO_RICERCA).Select End Sub Sub Fermatutto() If MsgBox("Interrompere scaricamento? (sara' necessario ricominciare da capo)", vbYesNo, "Richiesta conferma interruzione") = vbNo Then Exit Sub abort = True End Sub Sub Pausa() MsgBox ("Premere CTRL+PAUSA e cliccare su DEBUG per interrompere. " & vbCrLf & "Dopo, premere F5 NELL'EDITOR per continuare, o il tasto quadrato in alto (=stop) nell'editor per terminare.") End Sub Sub Auto_open() Call InizializzaFoglio frmSetup.Show End Sub Sub CicloScarica() Call cancella_foglio ricerca = "" abort = False If frmSetup.txtSearch.Text <> "" Then ricerca = frmSetup.txtSearch.Text NumEventi = 1 NumeroEventiSelezionati = 2 Call ContaCheckboxes If frmSetup.chkDay1.Value = 1 Then Giorno = 1 NuovoInizio = 2 GenNum = 0 ' Numero d'ordine del genere da scaricre. DayNum = 0 ' Numero d'ordine del giorno da scaricare. CurrGens = 0 CurrDays = 0 For gen = 1 To 9 For c = 0 To frmSetup.Controls.Count - 1 ' Esamina tutti i controlli della form If frmSetup.Controls.Item(c).Name = "chkGen" & LTrim$(Str$(gen)) Then GenNum = GenNum + 1 If frmSetup.Controls.Item(c).Value = True Then ' Per ogni genere richiesto,... CurrGens = CurrGens + 1 CurrDays = 0 For d = 1 To 7 ' Esamina tutti i checkbox dei giorni cercando quelli selezionati. For c2 = 0 To frmSetup.Controls.Count - 1 If frmSetup.Controls.Item(c2).Name = "chkDay" & LTrim$(Str$(d)) Then DayNum = DayNum + 1 If frmSetup.Controls.Item(c2).Value = True Then ' Scarica programmazione dei soli giorni selezionati. CurrDays = CurrDays + 1 DoEvents Call ScaricaNew((GenNum), (d)) ' frmSetup.lblProgress.Caption = "Progresso: Can " & Str$(Int(100 * CanaliElaborati / NumeroCanali)) & "% - Gen " & CurrGens & "/" & TotGens & ", Day: " & CurrDays & " / " & TotDays If abort = True Then frmSetup.txtStatus.Caption = "INTERROTTO" Exit Sub End If End If Exit For End If Next Next End If Exit For End If Next Next riga = 1 While Sheets(NOME_FOGLIO_GLOBALE).Cells(riga, 5) <> "" riga = riga + 1 DoEvents With Worksheets(NOME_FOGLIO_GLOBALE) frmSetup.txtStatus.Caption = "Aggiornamento link n. " & Str$(riga) & " (" & Str$(Int(100 * riga / NumEventi)) & "%)..." DoEvents .Hyperlinks.Add .Range("R" & LTrim$(riga)), Sheets(NOME_FOGLIO_GLOBALE).Cells(riga, COLONNA_LINK) Sheets(NOME_FOGLIO_GLOBALE).Range("R" & LTrim$(riga)) = "Link dati" Folder_Tipo = Sheets(NOME_FOGLIO_GLOBALE).Cells(riga, 15) Folder_Genere = Sheets(NOME_FOGLIO_GLOBALE).Cells(riga, 14) .Hyperlinks.Add .Range("s" & LTrim$(riga)), Replace("http://guidatv.sky.it/guidatv/programma/" & Folder_Genere & "/" & Folder_Tipo & "/" & Sheets(NOME_FOGLIO_GLOBALE).Cells(riga, 12) & "_xxxxx.shtml", "xxxxx", Sheets(NOME_FOGLIO_GLOBALE).Cells(riga, 8)) Sheets(NOME_FOGLIO_GLOBALE).Range("S" & LTrim$(riga)) = "Link pagina" .Hyperlinks.Add .Range("T" & LTrim$(riga)), STRINGA_MENSILE & Sheets(NOME_FOGLIO_GLOBALE).Cells(riga, 8) Sheets(NOME_FOGLIO_GLOBALE).Range("T" & LTrim$(riga)) = "Link programmazione" 'Debug.Print "Aggiungo link '"; Sheets(NOME_FOGLIO_GLOBALE).Cells(riga, COLONNA_LINK); "' in cella "; riga; ","; COLONNA_LINK End With Wend frmSetup.txtStatus.Caption = "TERMINATO." frmSetup.lblProgress.Caption = "" Call InizializzaFoglio Selection.AutoFilter End Sub Sub ScaricaNew(G As Integer, NumGiorno) ' GENERE: http://guidatv.sky.it/app/guidatv/contenuti/data/grid/grid_sport_channels.js ' CANALE: http://guidatv.sky.it/app/guidatv/contenuti/data/grid/09_02_19/ch_371.js ' EVENTO: http://guidatv.sky.it/EpgBackend/event_description.do?eid=17489032 Dim ElencoEventi As String Call InitVars ' ********* Scarica il file del genere 'For G = 1 To NumeroGeneri nomefile = Path & "Canali_" & genere(G) & ".txt" strurl = Replace(STRINGA_GENERE, "GGGGGGGG", genere(G)) Debug.Print "Scarico " & strurl & "..." Tentativi = 0 If (Dir$(nomefile) <> "" And frmSetup.chkUpdate.Value = True) Or _ (Dir$(nomefile) = "") Then ' Evita di RI-scaricare il file se c'è gia e se non è stato ' richiesto specificamente dalll'utente di aggiornarlo. retry3: Tentativi = Tentativi + 1 errcode = URLDownloadToFile(0, strurl, nomefile, 0, 0) If errcode = 0 Then 'Debug.Print "OK" Else If Tentativi < MAX_Tentativi Then GoTo retry3: Else Debug.Print "############ Scaricamento dati genere '" + genere(G), "': ERRORE ", Hex$(errcode) errcode = 0 End If End If Else Debug.Print "File "; nomefile; " già scaricato, elaboro..." End If 'Next Giorno = Lead0(Val(Day(Date - 1 + NumGiorno)), 1) Mese = Lead0(Val(Month(Date - 1 + NumGiorno)), 1) Anno = Mid$(Year(Date - 1 + NumGiorno), 3, 2) StringaData = Anno & "_" & Mese & "_" & Giorno 'Debug.Print "Elaboro genere " & genere(G) & " per giorno " & StringaData frmSetup.txtStatus.Caption = "Elaboro genere " & genere(G) & " per giorno " & StringaData DoEvents If Path & Dir$(nomefile) <> nomefile Then Debug.Print "File " + nomefile + " non trovato." Else Open nomefile For Input As #1 elencocanali = Input$(LOF(1), 1) Close #1 End If NumeroCanali = CountOccurrences((elencocanali), "service") ' *********** Elabora canali: FineCanale = 1 CanaliElaborati = 0 While InStr(FineCanale, elencocanali, Chr(34) & "id" & Chr(34)) > 0 CanaliElaborati = CanaliElaborati + 1 frmSetup.lblProgress.Caption = "Progresso: Gen " & CurrGens & "/" & TotGens & ", Day: " & CurrDays & " / " & TotDays & " - Can " & Str$(Int(100 * CanaliElaborati / NumeroCanali)) & "%" If abort = True Then frmSetup.txtStatus.Caption = "INTERROTTO" Exit Sub End If InizioCanale = InStr(FineCanale, elencocanali, Chr(34) & "id" & Chr(34)) + 6 FineCanale = InStr(InizioCanale, elencocanali, Chr$(34)) LunghCanale = FineCanale - InizioCanale canale = Mid$(elencocanali, InizioCanale, LunghCanale) InizioPosizione = InStr(FineCanale, elencocanali, "number") + 9 FinePosizione = InStr(InizioPosizione, elencocanali, Chr$(34)) LunghPosizione = FinePosizione - InizioPosizione posizione = Mid$(elencocanali, InizioPosizione, LunghPosizione) InizioNome = InStr(FineCanale, elencocanali, "name") + 7 FineNome = InStr(InizioNome, elencocanali, Chr$(34)) LunghNome = FineNome - InizioNome nome = Mid$(elencocanali, InizioNome, LunghNome) If frmSetup.chkSkipChan.Value = True Then ' Se la checkbox-filtro è selezionata, If frmSetup.txtChan.Text = posizione Then ' scarica solo i dati del canale scelto,... ' ******************** Scarica file-eventi: nomefile = Path & "Eventi_" & StringaData & "_" & Str$(posizione) & "_(service" & Str$(canale) & ").txt" strurl = Replace(STRINGA_CANALE, "CCCCCCCC", canale) strurl = Replace(strurl, "AA_MM_GG", StringaData) frmSetup.txtStatus.Caption = "Scarico " & strurl & "..." DoEvents Tentativi = 0 retry4: Tentativi = Tentativi + 1 If (Dir$(nomefile) <> "" And frmSetup.chkUpdate.Value = True) Or _ (Dir$(nomefile) = "") Then ' Evita di RI-scaricare il file se c'è gia e se non è stato ' richiesto specificamente dalll'utente di aggiornarlo. errcode = URLDownloadToFile(0, strurl, nomefile, 0, 0) Else errcode = 0 Debug.Print nomefile; " già scaricato, elaboro..." End If If errcode = 0 Then 'Debug.Print "OK" 'Debug.Print " Elaboro canale " & Replace(nome, " ", "_") frmSetup.txtStatus.Caption = "Elaboro canale " & Replace(nome, " ", "_") DoEvents If Path & Dir$(nomefile) <> nomefile Then 'frmSetup.txtLog.Text = frmSetup.txtLog.Text + vbCrLf + "File " + "Canali_" & genere(G) & ".txt" + " non trovato." Debug.Print "File " + nomefile + " non trovato." Else Open nomefile For Input As #1 ElencoEventi = Input$(LOF(1), 1) Close #1 Call JSON_Extractor((ElencoEventi), (canale), (posizione), (nome), genere(G), (StringaData)) End If Else If Tentativi < MAX_Tentativi Then GoTo retry4: Else Debug.Print "################ Canale ", posizione, ": ERRORE ", Hex$(errcode) Debug.Print "Errore, file " + strurl + " non scaricato." errcode = 0 End If End If Else Debug.Print "Salto canale " & posizione & " (" & nome & ")" frmSetup.txtStatus.Caption = "Salto canale " & posizione & " (" & nome & ")" End If Else ' .... altrimenti scarica tutti i canali. ' ******************** Scarica file-eventi: nomefile = Path & "Eventi_" & StringaData & "_" & Str$(posizione) & "_(service" & Str$(canale) & ").txt" strurl = Replace(STRINGA_CANALE, "CCCCCCCC", canale) strurl = Replace(strurl, "AA_MM_GG", StringaData) frmSetup.txtStatus.Caption = "Scarico " & strurl & "..." DoEvents Tentativi = 0 retry2: Tentativi = Tentativi + 1 If (Dir$(nomefile) <> "" And frmSetup.chkUpdate.Value = True) Or _ (Dir$(nomefile) = "") Then ' Evita di RI-scaricare il file se c'è gia e se non è stato ' richiesto specificamente dalll'utente di aggiornarlo. errcode = URLDownloadToFile(0, strurl, nomefile, 0, 0) Else errcode = 0 Debug.Print nomefile; " già scaricato, elaboro..." End If If errcode = 0 Then 'Debug.Print "OK" 'Debug.Print " Elaboro canale " & Replace(nome, " ", "_") frmSetup.txtStatus.Caption = "Elaboro canale " & Replace(nome, " ", "_") DoEvents If Path & Dir$(nomefile) <> nomefile Then 'frmSetup.txtLog.Text = frmSetup.txtLog.Text + vbCrLf + "File " + "Canali_" & genere(G) & ".txt" + " non trovato." Debug.Print "File " + nomefile + " non trovato." Else Open nomefile For Input As #1 ElencoEventi = Input$(LOF(1), 1) Close #1 Call JSON_Extractor((ElencoEventi), (canale), (posizione), (nome), genere(G), (StringaData)) End If Else If Tentativi < MAX_Tentativi Then GoTo retry2: Else Debug.Print " ################## Scaricamento dati canale " + posizione, "(" & nome & "): ERRORE ", Hex$(errcode) errcode = 0 End If End If End If Wend End Sub Function Lead0(n As Integer, figures As Integer) As String If n < 10 Then Lead0 = "0" & LTrim(Str(n)) Else Lead0 = LTrim(Str(n)) If figures < 2 Then Exit Function If n < 100 Then Lead0 = "0" & LTrim(Str(n)) Else Lead0 = LTrim(Str(n)) If figures < 3 Then Exit Function If n < 1000 Then Lead0 = "0" & LTrim(Str(n)) Else Lead0 = LTrim(Str(n)) If figures < 4 Then Exit Function If n < 10000 Then Lead0 = "0" & LTrim(Str(n)) Else Lead0 = LTrim(Str(n)) End Function Sub JSON_Extractor(ContenutoFileEvento As String, canale As String, posizione As String, nome As String, genere As String, Data As String) NumeroEventiTrovatiCanale = 0 Prima = InStr(ContenutoFileEvento, "[") + 1 Ultima = InStrRev(ContenutoFileEvento, "]") - 1 ContenutoFileEvento = Mid$(ContenutoFileEvento, Prima, Ultima - Prima) ' Contenuto completo file evento. ContenutoFileEvento = Replace(ContenutoFileEvento, "\'", "*") ' L'apostrofo è un delimitatore, se è presente nel testo, confonde il programma. ContenutoFileEvento = Replace(ContenutoFileEvento, "'", "*") ' L'apostrofo è un delimitatore, se è presente nel testo, confonde il programma. ContenutoFileEvento = Replace(ContenutoFileEvento, Chr(34), "'") ' Sostituisce virgolette con apostrofo. ContenutoFileEvento = Replace(ContenutoFileEvento, Chr(13) & Chr(10), "") ' Elimina i ritorni a capo ContenutoFileEvento = Replace(ContenutoFileEvento, Chr(10), "") ' Elimina i ritorni a capo NumeroEventiCanale = CountOccurrences(ContenutoFileEvento, "genre") While InStr(ContenutoFileEvento, "{") > 0 If abort = True Then frmSetup.txtStatus.Caption = "INTERROTTO" Exit Sub End If frmSetup.txtStatus.Caption = "Eventi trovati: " & Lead0$((NumEventi), 4) DoEvents 'frmSetup.txtStatus.Caption = "Canale " & canale & ", evento " & NumEventi NumEventi = NumEventi + 1 NumeroEventiTrovatiCanale = NumeroEventiTrovatiCanale + 1 ' Raccolta dati su singolo evento in unica variabile: InizioRiga = InStr(ContenutoFileEvento, "{") + 1 FineRiga = InStr(ContenutoFileEvento, "}") - 1 LunghRiga = FineRiga - InizioRiga + 1 riga = Mid$(ContenutoFileEvento, InizioRiga, LunghRiga) 'riga = Replace(Mid$(ContenutoFileEvento, InizioRiga, LunghRiga), Chr$(10), "") 'riga = Replace(riga, "\'", "*") ' L'apostrofo è un delimitatore, se è presente nel testo, confonde il programma. 'riga = Replace(riga, "'", "*") ' L'apostrofo è un delimitatore, se è presente nel testo, confonde il programma. 'riga = Replace(riga, Chr(34), "'") ' Sostituisce virgolette con apostrofo. 'Debug.Print riga ' ************* Formato della "riga" (in realta' gruppo di dati con ritorni a capo, poi trasformato in riga): *********** ' 'id':'28324961', ' 'pid':'5365', ' 'starttime':'00:30', ' 'dur':'55', ' 'title':'Dr. House', ' 'normalizedtitle': 'dr-house', ' 'desc':'3* Stagione Ep.9 -...', ' 'genre':'intrattenimento', ' 'subgenre':'fiction', ' 'prima':false Colonna = COLONNA_BASE ' Le prime "colonne" sono occupate da altri campi: ' {'channel':'931', ' 'banned':false, ' 'plan':[ Selezionato = False ' Se nella riga c'e' un evento selezionato, lo scrive anche nel foglio a parte. ' Questo flag viene quindi attivato se l'evento attualmente elaborato corrisponde ai criteri di ricerca. ' ************* Estrazione campi dalla riga ************ While InStr(riga, "'") > 0 If abort = True Then frmSetup.txtStatus.Caption = "INTERROTTO" Exit Sub End If Colonna = Colonna + 1 ' ********** Estrazione dati singolo campo InizioCampo = InStr(riga, "'") FineCampo = InStr(InizioCampo + 1, riga, "'") LunghCampo = FineCampo - InizioCampo - 1 If LunghCampo > 0 Then campo = Mid$(riga, InizioCampo + 1, LunghCampo) ' Elimina ritorni a capo. 'campo = Replace(Mid$(riga, InizioCampo + 1, LunghCampo), Chr$(13) & Chr$(10), "") ' Elimina ritorni a capo. campo = Replace(campo, "*", "'") ' Rimette a posto eventuali apostrofi cancellati. Else campo = "VUOTO" End If ' Costruzione data: (serve inglese o italiana???) DataEvento = Mid$(Data, 7, 2) & "/" & Mid$(Data, 4, 2) & "/" & "20" & Mid$(Data, 1, 2) If Weekday(DataEvento) = 1 Then GiornoSettimanaEvento = WeekdayName(7) Else GiornoSettimanaEvento = WeekdayName(Weekday(DataEvento) - 1) End If ' "Colonna" è in realtà il contatore della posizione del campo nel file. Nel nuovo formato di file, ' anche i nomi dei campi sono delimitati e quindi appaiono come se fossero campi, quindi vanno saltati. ' La variabile serve per capire a quale variabile assegnare il valore letto per il campo. If Colonna = COLONNA_BASE + 2 Then IdEvento = campo If Colonna = COLONNA_BASE + 4 Then IdInternoEvento = campo If Colonna = COLONNA_BASE + 6 Then OrarioEvento = campo If Colonna = COLONNA_BASE + 8 Then DurataEvento = campo If Colonna = COLONNA_BASE + 10 Then TitoloEvento = campo If Colonna = COLONNA_BASE + 12 Then TitoloNormEvento = campo If frmSetup.chkPlot.Value = True Then 'TramaEvento = ScaricaTrama((IdEvento)) ' Scarica trama completa Else If Colonna = COLONNA_BASE + 14 Then TramaEvento = campo End If If Colonna = COLONNA_BASE + 16 Then GenereEvento = campo If Colonna = COLONNA_BASE + 18 Then SottoGenereEvento = campo If ricerca <> "" And InStr(UCase$(campo), UCase$(ricerca)) > 0 Then ' Se l'evento corrisponde al campo di ricerca... Selezionato = True End If riga = Right$(riga, Len(riga) - FineCampo - 1) ' Cancella dall'inizio della riga il campo appena elaborato, e ricomincia. Wend Worksheets(NOME_FOGLIO_GLOBALE).Cells(NumEventi, 1) = genere Worksheets(NOME_FOGLIO_GLOBALE).Cells(NumEventi, 2) = canale Worksheets(NOME_FOGLIO_GLOBALE).Cells(NumEventi, 3) = posizione Worksheets(NOME_FOGLIO_GLOBALE).Cells(NumEventi, 4) = nome Worksheets(NOME_FOGLIO_GLOBALE).Cells(NumEventi, 5) = GiornoSettimanaEvento Worksheets(NOME_FOGLIO_GLOBALE).Cells(NumEventi, 6) = DataEvento ' ******** fine campi indipendenti dal file-evento Worksheets(NOME_FOGLIO_GLOBALE).Cells(NumEventi, 7) = IdEvento Worksheets(NOME_FOGLIO_GLOBALE).Cells(NumEventi, 8) = IdInternoEvento Worksheets(NOME_FOGLIO_GLOBALE).Cells(NumEventi, 9) = OrarioEvento Worksheets(NOME_FOGLIO_GLOBALE).Cells(NumEventi, 10) = DurataEvento Worksheets(NOME_FOGLIO_GLOBALE).Cells(NumEventi, 11) = TitoloEvento If frmSetup.chkPlot.Value = True Then TramaEvento = ScaricaTrama((IdEvento)) ' Scarica trama completa End If Worksheets(NOME_FOGLIO_GLOBALE).Cells(NumEventi, 12) = TitoloNormEvento Worksheets(NOME_FOGLIO_GLOBALE).Cells(NumEventi, 13) = TramaEvento Worksheets(NOME_FOGLIO_GLOBALE).Cells(NumEventi, 14) = GenereEvento Worksheets(NOME_FOGLIO_GLOBALE).Cells(NumEventi, 15) = SottoGenereEvento Worksheets(NOME_FOGLIO_GLOBALE).Cells(NumEventi, COLONNA_LINK) = Replace(STRINGA_EVENTO, "EEEEEEEE", IdEvento) If Selezionato = True Then ' Se richiesto, mette in altro foglio risultati di ricerca: 'Debug.Print "Scarico dettagli evento " & IdEvento TramaEvento = ScaricaTrama((IdEvento)) NumeroEventiSelezionati = NumeroEventiSelezionati + 1 Worksheets(NOME_FOGLIO_RICERCA).Cells(NumeroEventiSelezionati, 1) = nome Worksheets(NOME_FOGLIO_RICERCA).Cells(NumeroEventiSelezionati, 2) = posizione Worksheets(NOME_FOGLIO_RICERCA).Cells(NumeroEventiSelezionati, 3) = GiornoSettimanaEvento Worksheets(NOME_FOGLIO_RICERCA).Cells(NumeroEventiSelezionati, 4) = DataEvento Worksheets(NOME_FOGLIO_RICERCA).Cells(NumeroEventiSelezionati, 5) = OrarioEvento Worksheets(NOME_FOGLIO_RICERCA).Cells(NumeroEventiSelezionati, 6) = DurataEvento Worksheets(NOME_FOGLIO_RICERCA).Cells(NumeroEventiSelezionati, 7) = TitoloEvento Worksheets(NOME_FOGLIO_RICERCA).Cells(NumeroEventiSelezionati, 8) = TramaEvento Selezionato = False End If ContenutoFileEvento = Right$(ContenutoFileEvento, Len(ContenutoFileEvento) - FineRiga - 1) ' Elimina dalla stringa la riga appena letta. Wend End Sub Public Function ScaricaTrama(id As String) As String If Len(id) < 5 Then Exit Function strurl = Replace(STRINGA_EVENTO, "EEEEEEEE", id) nomefile = nomefile = Path & "Evento" & id & ".txt" Tentativi = 0 retry: Tentativi = Tentativi + 1 frmSetup.txtStatus.Caption = "Scarico trama per evento " & id & " - Eventi trovati: " & NumEventi DoEvents errcode = URLDownloadToFile(0, strurl, nomefile, 0, 0) If errcode = 0 Then 'Debug.Print "OK" ' Debug.Print " Elaboro evento " & id 'frmSetup.txtStatus.Caption = "Elaboro evento " & id 'DoEvents Open nomefile For Input As #1 DatiEvento = Input$(LOF(1), 1) Close #1 InizioTrama = InStr(DatiEvento, Chr$(34) & "description" & Chr$(34)) + 15 FineTrama = InStr(InizioTrama + 1, DatiEvento, Chr$(34)) - 1 TEMP = Mid$(DatiEvento, InizioTrama, FineTrama - InizioTrama + 1) Else If Tentativi < MAX_Tentativi Then GoTo retry: Else Debug.Print "################ Evento ", id, ": ERRORE ", Hex$(errcode) Debug.Print "Errore, file " + strurl + " non scaricato." errcode = 0 TEMP = "[ERRORE - file " & strurl & "(" & nomefile & ") ]" End If End If ScaricaTrama = TEMP End Function Sub ContaCheckboxes() TotGens = 0 TotDays = 0 For c = 0 To frmSetup.Controls.Count - 1 ' Esamina tutti i controlli della form For gen = 1 To NumeroGeneri If frmSetup.Controls.Item(c).Name = "chkGen" & LTrim$(Str$(gen)) Then If frmSetup.Controls.Item(c).Value = True Then TotGens = TotGens + 1 Next For d = 1 To 7 If frmSetup.Controls.Item(c).Name = "chkDay" & LTrim$(Str$(d)) Then If frmSetup.Controls.Item(c).Value = True Then TotDays = TotDays + 1 Next Next 'Debug.Print End Sub Sub ShowHelp() frmHelp.Show End Sub Sub cancella_foglio() result = MsgBox("Sicuro di voler cancellare l'intero foglio?", vbOKCancel + vbExclamation, "Conferma cancellazione") If result = vbOK Then 'Sheets(f).Select Cells.Select Selection.ClearContents Call InizializzaFoglio Cells(1, 1).Select Else MsgBox ("OK, cancellazione annullata.") End If End Sub Sub SetupTempFolder() Dim fso Dim fol As String fol = Sheets(NOME_FOGLIO_RICERCA).Cells(1, 7) ' change to match the folder path Path = fol If Mid$(Path, Len(Path), 1) <> "\" Then Path = Path & "\" Set fso = CreateObject("Scripting.FileSystemObject") If Not fso.FolderExists(fol) Then fso.CreateFolder (fol) Else ' MsgBox fol & " already exists!", vbExclamation, "Folder Exists" End If End Sub Function CountOccurrences(SearchHere As String, SearchWhat As String) Dim regEx, Match, Matches Set regEx = New RegExp ' Create a regular expression. regEx.pattern = SearchWhat ' Set pattern. regEx.IgnoreCase = True regEx.Global = True ' Set global applicability. Set Matches = regEx.Execute(SearchHere) ' Execute search. CountOccurrences = Matches.Count End Function Sub ScaricaMensile() ' STRINGA_MENSILE = "http://guidatv.sky.it/EpgBackend/getprogrammazione.do?idprogramma=" ' Seguita da id interno programma RigaMensile = 2 While Cells(RigaMensile, 20) <> "" DoEvents If UCase$(Cells(RigaMensile, 21)) = "X" Then strurl = STRINGA_MENSILE & Cells(RigaMensile, 8) nomefile = Path & "mensile_" & Cells(RigaMensile, 8) & ".txt" If (Dir$(nomefile) <> "" And frmSetup.chkUpdate.Value = True) Or _ (Dir$(nomefile) = "") Then ' Evita di RI-scaricare il file se c'è gia e se non è stato ' richiesto specificamente dalll'utente di aggiornarlo. retryMensile: Tentativi = Tentativi + 1 errcode = URLDownloadToFile(0, strurl, nomefile, 0, 0) If errcode = 0 Then 'Debug.Print "OK" Else If Tentativi < MAX_Tentativi Then GoTo retryMensile: Else Debug.Print "############ Scaricamento dati mensili: ERRORE ", Hex$(errcode) errcode = 0 End If End If Else Debug.Print "File "; nomefile; " già scaricato, elaboro..." End If Open nomefile For Input As #4 ProgrammazioneMensile = Input(LOF(4), 4) Close #4 While InStr(ProgrammazioneMensile, "giorno") > 0 DoEvents InizioGiorno = InStr(ProgrammazioneMensile, "giorno") + 9 FineGiorno = InStr(InizioGiorno, ProgrammazioneMensile, Chr(34)) - 1 Giorno = Mid$(ProgrammazioneMensile, InizioGiorno, FineGiorno - InizioGiorno + 1) FineSequenzaGiorno = InStr(FineGiorno, ProgrammazioneMensile, "]") SequenzaGiorno = Mid$(ProgrammazioneMensile, FineGiorno, FineSequenzaGiorno - FineGiorno) While InStr(SequenzaGiorno, Chr(34) + "ora" + Chr(34)) > 0 DoEvents RipMens = RipMens + 1 InizioOrario = InStr(SequenzaGiorno, Chr(34) + "ora" + Chr(34)) + 7 FineOrario = InStr(InizioOrario, SequenzaGiorno, Chr(34)) - 1 Orario = Mid$(SequenzaGiorno, InizioOrario, FineOrario - InizioOrario + 1) StrMens = Giorno & " - " & Orario InizioEventoMensile = InStr(SequenzaGiorno, Chr(34) + "eventid" + Chr(34)) + 11 FineEventoMensile = InStr(InizioEventoMensile, SequenzaGiorno, Chr(34)) - 1 EventoMensile = Mid$(SequenzaGiorno, InizioEventoMensile, FineEventoMensile - InizioEventoMensile + 1) LinkEvMens = "http://guidatv.sky.it/EpgBackend/event_description.do?eid=" & EventoMensile '.Hyperlinks.Add .Range("R" & LTrim$(riga)), Sheets(NOME_FOGLIO_GLOBALE).Cells(riga, COLONNA_LINK) Worksheets(NOME_FOGLIO_GLOBALE).Hyperlinks.Add Worksheets(NOME_FOGLIO_GLOBALE).Cells(RigaMensile, 21 + RipMens), LinkEvMens Worksheets(NOME_FOGLIO_GLOBALE).Cells(RigaMensile, 21 + RipMens) = StrMens SequenzaGiorno = Right$(SequenzaGiorno, Len(SequenzaGiorno) - FineOrario) Wend ' Orario ProgrammazioneMensile = Right$(ProgrammazioneMensile, Len(ProgrammazioneMensile) - FineGiorno) Wend ' Giorno End If RigaMensile = RigaMensile + 1 RipMens = 0 Wend ' Riga MsgBox ("Terminato") End Sub