Ignore:
Timestamp:
Apr 5, 2018, 2:57:59 PM (2 years ago)
Author:
Juanma
Message:

WIP on bundles support

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lliurex-store/trunk/fuentes/python3-lliurex-store.install/usr/share/lliurexstore/plugins/appimage_catalogue.py

    r7115 r7118  
    1717gi.require_version('AppStreamGlib', '1.0')
    1818from gi.repository import AppStreamGlib as appstream
    19 
     19import queue
     20import time
    2021
    2122class appimageToAppstream:
     
    2930                #Appimges not stored in a repo must be listed in this file, providing the download url and the info url (if there's any)
    3031                self.external_appimages="/usr/share/lliurex-store/files/external_appimages.json"
    31                 self.disabled=False
    3232                self.conf_dir=os.getenv("HOME")+"/.cache/lliurex-store"
    3333                self.bundles_dir=self.conf_dir+"/bundles"
    34                 self.count=0
     34                self.queue=queue.Queue()
    3535        #def __init__
    3636
     
    4747                #Load repos
    4848                for repo_name,repo_info in self.repos.items():
    49                         if os.path.isdir(self.bundles_dir):
    50                                 self._debug("Fetching repo %s"%repo_info['url'])
    51                                 if repo_info['type']=='repo':
    52                                         applist=self._generate_applist(self._fetch_repo(repo_info['url']),repo_name)
    53                                         self._debug("Processing info...")
    54                                 elif repo_info['type']=='json':
    55                                         applist=self._process_appimage_json(self._fetch_repo(repo_info['url']),repo_name)
    56                                 self._debug("Fetched repo "+repo_info['url'])
    57                                 self._th_generate_xml_catalog(applist,outdir,repo_info['url_info'],repo_info['url'],repo_name)
    58                                 all_apps.extend(applist)
    59                         else:
    60                                 self._debug("appImage catalogue could not be fetched: Permission denied")
     49                        if not os.path.isdir(self.bundles_dir):
     50                                try:
     51                                        os.makedirs(self.bundles_dir)
     52                                except:
     53                                        self._debug("appImage catalogue could not be fetched: Permission denied")
     54                        self._debug("Fetching repo %s"%repo_info['url'])
     55                        if repo_info['type']=='repo':
     56                                applist=self._generate_applist(self._fetch_repo(repo_info['url']),repo_name)
     57                                self._debug("Processing info...")
     58                        elif repo_info['type']=='json':
     59                                applist=self._process_appimage_json(self._fetch_repo(repo_info['url']),repo_name)
     60
     61                        self._debug("Fetched repo "+repo_info['url'])
     62                        self._th_generate_xml_catalog(applist,outdir,repo_info['url_info'],repo_info['url'],repo_name)
     63                        all_apps.extend(applist)
    6164                #Load external apps
    6265                for app_name,app_info in self._get_external_appimages().items():
     
    7679                self._debug("Removing old entries...")
    7780#               self._clean_bundle_catalogue(all_apps,outdir)
    78                 return(True)
    7981        #def _download_bundles_catalogue
    8082
     
    148150                if 'items' in json_data.keys():
    149151                        for appimage in json_data['items']:
    150                                 th=threading.Thread(target=self._th_write_xml, args = (app,outdir,info_url,repo,repo_name,semaphore))
     152                                th=threading.Thread(target=self._th_process_appimage, args = (appimage,semaphore))
    151153                                th.start()
    152154
    153 
    154                                 releases=[]
    155                                 if 'links' in appimage.keys():
    156                                         releases=self._get_releases_from_json(appimage)
    157                                 if releases:
    158                                         appinfo=self.load_json_appinfo(appimage)
    159                                         appinfo['releases']=releases
    160                                         applist.append(appinfo)
    161 #                                       for release in releases:
    162 #                                               tmp_appinfo=appinfo.copy()
    163 #                                               self._debug("Release: %s"%release)
    164 #                                               tmp_appinfo['name']=release
    165 #                                               tmp_appinfo['package']=release
    166 #                                               applist.append(tmp_appinfo)
     155                while threading.active_count()>1:
     156                    time.sleep(0.1)
     157
     158                while not self.queue.empty():
     159                    applist.append(self.queue.get())
    167160                self._debug("JSON: %s"%applist)
    168161                return (applist)
    169162        #_process_appimage_json
     163
     164        def _th_process_appimage(self,appimage,semaphore):
     165                releases=[]
     166                if 'links' in appimage.keys():
     167                        releases=self._get_releases_from_json(appimage)
     168                if releases:
     169                        appinfo=self.load_json_appinfo(appimage)
     170                        appinfo['releases']=releases
     171#                       self.queue.put(appinfo)
     172                        for release in releases:
     173                                #Release has the direct download url
     174                                tmp_release=release.split('/')
     175                                tmp_appinfo=appinfo.copy()
     176                                rel_number=tmp_release[-2]
     177                                rel_name=tmp_release[-1].lower().replace('.appimage','')
     178                                self._debug("Release: %s"%release)
     179                                tmp_appinfo['name']=rel_name
     180                                tmp_appinfo['package']=tmp_release[-1]
     181                                tmp_appinfo['homepage']='/'.join(tmp_release[0:-1])
     182                                self.queue.put(tmp_appinfo)
     183        #def _th_process_appimage
    170184
    171185        def load_json_appinfo(self,appimage):
     
    184198                if 'screenshots' in appimage.keys():
    185199                        appinfo['thumbnails']=appimage['screenshots']
    186                 if 'authors' in appimage.keys():
     200                if 'links' in appimage.keys():
     201                        if appimage['links']:
     202                                for link in appimage['links']:
     203                                        if 'url' in link.keys() and link['type']=='Download':
     204                                                appinfo['homepage']=link['url']
     205                elif 'authors' in appimage.keys():
    187206                        if appimage['authors']:
    188207                                for author in appimage['authors']:
     
    201220                                                self._debug("Info url: %s"%link['url'])
    202221                                                try:
     222                                                        sw_git=False
    203223                                                        with urllib.request.urlopen(link['url']) as f:
     224                                                                if 'github' in link['url']:
     225                                                                        sw_git=True
    204226                                                                content=(f.read().decode('utf-8'))
    205227                                                                soup=BeautifulSoup(content,"html.parser")
    206228                                                                package_a=soup.findAll('a', attrs={ "href" : re.compile(r'.*[aA]pp[iI]mage$')})
    207229                                                                for package_data in package_a:
    208                                                                         package_soup=BeautifulSoup(str(package_data),"html.parser")
    209                                                                         package_name=package_soup.findAll('strong', attrs={ "class" : "pl-1"})
    210                                                                         self._debug("Release name: %s"%package_name)
    211                                                                         for name in package_name:
    212                                                                                 releases.append(name.get_text())
     230                                                                        package_name=package_data.findAll('strong', attrs={ "class" : "pl-1"})
     231                                                                        package_link=package_data['href']
     232                                                                        if sw_git:
     233                                                                                package_link="https://github.com"+package_link
     234                                                                                releases.append(package_link)
     235                                                                                self._debug("Link: %s"%package_link)
    213236                                                except Exception as e:
    214237                                                        print(e)
     
    230253                lock=threading.Lock()
    231254                self._debug("Populating %s"%appinfo)
    232                 filename=outdir+appinfo['package'].lower().replace('appimage',"appdata")+".xml"
     255                package=appinfo['name'].lower().replace(".appimage","")
     256                if len(package)>40:
     257                        tmp_package=package.split('-')
     258                        tam=0
     259                        pos=1
     260                        index=0
     261                        banned=['linux32','linux64','i386','x86_64','ia32','amd64']
     262                        for tmp_name in tmp_package:
     263                                if (tam<len(tmp_name) and pos<index) and tmp_name not in banned:
     264                                        tam=len(tmp_name)
     265                                        pos=index
     266                                index+=1
     267                        print("Removed: %s"%tmp_package[pos])
     268                        tmp_package[pos]=''
     269                        package='-'.join(tmp_package)
     270                        package=package.replace("--","-")
     271                        package=package.replace("-.",".")
     272
     273                filename=outdir+package.lower().replace('appimage',"appdata")+".xml"
    233274                self._debug("checking if we need to download "+filename)
    234275                if not os.path.isfile(filename):
     
    249290                        f.write("  <name>%s</name>\n"%name)
    250291                        f.write("  <metadata_license>CC0-1.0</metadata_license>\n")
    251                         f.write("  <provides><binary>%s</binary></provides>\n"%appinfo['name'])
     292                        f.write("  <provides><binary>%s</binary></provides>\n"%appinfo['package'])
    252293                        if 'releases' in appinfo.keys():
    253294                                f.write("  <releases>\n")
    254295                                for release in appinfo['releases']:
    255                                         f.write("    <release version=\"%s\" urgency=\"medium\">"%release)
     296                                        tmp_release=release.split('/')
     297                                        rel_number='/'.join(tmp_release[-2:])
     298                                        f.write("    <release version=\"%s\" urgency=\"medium\">"%rel_number)
    256299                                        f.write("</release>\n")
    257300                                f.write("  </releases>\n")
Note: See TracChangeset for help on using the changeset viewer.