@@ -138,6 +138,9 @@ def print_rich_help():
138138 proc_table .add_column ("Description" )
139139
140140 proc_table .add_row ("--with-urls" , "Genera link agli URL normattiva.it" )
141+ proc_table .add_row (
142+ "--opendata" , "Forza download Akoma Ntoso via API OpenData (ZIP AKN)"
143+ )
141144 proc_table .add_row ("--with-references" , "Scarica anche leggi citate" )
142145 proc_table .add_row ("--provvedimenti" , "Esporta provvedimenti attuativi CSV" )
143146 proc_table .add_row ("--validate" , "Validazione strutturale del Markdown" )
@@ -207,6 +210,8 @@ def print_rich_help():
207210 validate_normattiva_url ,
208211 extract_params_from_normattiva_url ,
209212 download_akoma_ntoso ,
213+ download_akoma_ntoso_via_export ,
214+ download_akoma_ntoso_via_opendata ,
210215)
211216from .exa_api import lookup_normattiva_url
212217from .akoma_utils import parse_article_reference
@@ -405,6 +410,11 @@ def main():
405410 action = "store_true" ,
406411 help = "Genera link Markdown agli URL originali di normattiva.it per gli articoli citati" ,
407412 )
413+ parser .add_argument (
414+ "--opendata" ,
415+ action = "store_true" ,
416+ help = "Forza download Akoma Ntoso via API OpenData (ZIP AKN)" ,
417+ )
408418 parser .add_argument (
409419 "-q" , "--quiet" , action = "store_true" , help = "Disabilita output non essenziali"
410420 )
@@ -653,46 +663,79 @@ def main():
653663 f"Rilevato riferimento articolo: { article_ref } " , file = sys .stderr
654664 )
655665
656- # Estrai parametri dalla pagina
657- params , session = extract_params_from_normattiva_url (
658- input_source , quiet = quiet_mode
659- )
660- if not params :
661- print ( "❌ Impossibile estrarre parametri dall'URL" , file = sys . stderr )
662- sys . exit ( 1 )
666+ # Estrai parametri dalla pagina (se non forziamo OpenData)
667+ params = None
668+ session = None
669+ if not args . opendata :
670+ params , session = extract_params_from_normattiva_url (
671+ input_source , quiet = quiet_mode
672+ )
663673
664674 if not quiet_mode :
665- print (f"\n Parametri estratti:" , file = sys .stderr )
666- print (f" dataGU: { params ['dataGU' ]} " , file = sys .stderr )
667- print (f" codiceRedaz: { params ['codiceRedaz' ]} " , file = sys .stderr )
668- print (f" dataVigenza: { params ['dataVigenza' ]} \n " , file = sys .stderr )
675+ if params :
676+ print (f"\n Parametri estratti:" , file = sys .stderr )
677+ print (f" dataGU: { params ['dataGU' ]} " , file = sys .stderr )
678+ print (f" codiceRedaz: { params ['codiceRedaz' ]} " , file = sys .stderr )
679+ print (f" dataVigenza: { params ['dataVigenza' ]} \n " , file = sys .stderr )
680+ elif args .opendata :
681+ print (
682+ "⚠️ OpenData forzato: download via OpenData (ZIP AKN)" ,
683+ file = sys .stderr ,
684+ )
685+ else :
686+ print (
687+ "⚠️ Link caricaAKN non disponibile: tentativo fallback OpenData" ,
688+ file = sys .stderr ,
689+ )
669690
670691 # Crea file XML temporaneo con tempfile module (più sicuro)
671692 temp_fd , xml_temp_path = tempfile .mkstemp (
672- suffix = f"_{ params ['codiceRedaz' ]} .xml" , prefix = "akoma2md_"
693+ suffix = f"_{ params ['codiceRedaz' ] if params else 'export' } .xml" ,
694+ prefix = "akoma2md_" ,
673695 )
674696 os .close (temp_fd ) # Close file descriptor, we'll write with requests
675697
676698 # Scarica XML
677- if not download_akoma_ntoso (
678- params , xml_temp_path , session , quiet = quiet_mode
679- ):
680- print ("❌ Errore durante il download del file XML" , file = sys .stderr )
681- sys .exit (1 )
699+ if params and not args .opendata :
700+ if not download_akoma_ntoso (
701+ params , xml_temp_path , session , quiet = quiet_mode
702+ ):
703+ print (
704+ "❌ Errore durante il download del file XML" ,
705+ file = sys .stderr ,
706+ )
707+ sys .exit (1 )
708+ metadata = {
709+ "dataGU" : params ["dataGU" ],
710+ "codiceRedaz" : params ["codiceRedaz" ],
711+ "dataVigenza" : params ["dataVigenza" ],
712+ "url" : input_source ,
713+ "url_xml" : (
714+ "https://www.normattiva.it/do/atto/caricaAKN"
715+ f"?dataGU={ params ['dataGU' ]} "
716+ f"&codiceRedaz={ params ['codiceRedaz' ]} "
717+ f"&dataVigenza={ params ['dataVigenza' ]} "
718+ ),
719+ }
720+ else :
721+ success , metadata , session = download_akoma_ntoso_via_opendata (
722+ input_source , xml_temp_path , session = session , quiet = quiet_mode
723+ )
724+ if not success :
725+ success , metadata , session = download_akoma_ntoso_via_export (
726+ input_source , xml_temp_path , session = session , quiet = quiet_mode
727+ )
728+ if not success :
729+ print (
730+ "❌ Errore durante il download via fallback OpenData/HTML" ,
731+ file = sys .stderr ,
732+ )
733+ sys .exit (1 )
682734
683735 # Converti a Markdown
684736 if not quiet_mode :
685737 print (f"\n Conversione in Markdown..." , file = sys .stderr )
686738
687- # Prepare metadata dict for front matter
688- metadata = {
689- "dataGU" : params ["dataGU" ],
690- "codiceRedaz" : params ["codiceRedaz" ],
691- "dataVigenza" : params ["dataVigenza" ],
692- "url" : input_source , # The original URL
693- "url_xml" : f"https://www.normattiva.it/do/atto/caricaAKN?dataGU={ params ['dataGU' ]} &codiceRedaz={ params ['codiceRedaz' ]} &dataVigenza={ params ['dataVigenza' ]} " ,
694- }
695-
696739 # Add article reference to metadata if present (or if overridden by --completo)
697740 if article_ref :
698741 metadata ["article" ] = article_ref
0 commit comments