Esempio n. 1
0
    def create_metainfo(self):
        """
        create some metainfo for the archive
        """
        logger.log(9, 'create_metainfo()')

        display_type = self.display_type
        name = display_type or 'all'

        # check autovars
        for var, val in self.autovars:
            if var == 'num_%s_timestamp' % name:
                break
        else:
            self.autovars += [ ('num_%s_timestamp' % name, 0), ('num_%s_items' % name, 0), ('num_%s_total_items' % name, 0) ]

        try:
            timestamp = os.stat(self.dir)[stat.ST_MTIME]
        except OSError:
            return

        num_timestamp = self.info['num_%s_timestamp' % name]

        if not num_timestamp or num_timestamp < timestamp:
            logger.debug('Create metainfo for %s, display_type=%s', self.archive, self.display_type)

            if self.media:
                self.media.mount()

            num_dir_items  = 0
            num_play_items = 0
            files = []

            try:            
                if zipfile.is_zipfile(self.archive):
                    archive = zipfile.ZipFile(self.archive, 'r')
                    files   = archive.infolist()
                    names   = archive.namelist()

                elif tarfile.is_tarfile(self.archive):
                    archive = tarfile.open(self.archive, 'r')
                    files   = archive.getmembers()
                    names   = archive.getnames()

                elif ARCHIVE_RAR_AVAILABLE and rarfile.is_rarfile(self.archive):
                    archive = rarfile.RarFile(self.archive, 'r')
                    files   = archive.infolist()
                    names   = archive.namelist()

            except (ZipError, RarError, TarError) as exc:
               logger.warning('Archive %s error: %s', self.archive, exc)
               self.valid = False

            # play items and playlists
            for p in plugin.mimetype(display_type):
                num_play_items += p.count(self, names)

            # normal DirItems
            for file in files:
                if is_dir(file): num_dir_items += 1

            # store info
            self['num_dir_items'] = num_dir_items
            self['num_%s_items' % name] = num_play_items
            self['num_%s_timestamp' % name] = timestamp

            total_play_items = DirItem.get_play_items_recursive(self, name)

            # some items such as archives are not walkable, hence no way to 
            # calculate total number of playable items in the directory tree.
            logger.debug('self.name=%r, display_type=%r, total_play_items=%r, num_play_items=%r, num_dir_items=%r', 
                    self.name, name, total_play_items, num_play_items, num_dir_items)
            if total_play_items < num_play_items + num_dir_items:
                total_play_items = num_play_items + num_dir_items
            self['num_%s_total_items' % name] = total_play_items

            if self.media:
                self.media.umount()
Esempio n. 2
0
    def create_metainfo(self):
        """
        create some metainfo for the archive
        """
        logger.log(9, 'create_metainfo()')

        display_type = self.display_type
        name = display_type or 'all'

        # check autovars
        for var, val in self.autovars:
            if var == 'num_%s_timestamp' % name:
                break
        else:
            self.autovars += [('num_%s_timestamp' % name, 0),
                              ('num_%s_items' % name, 0),
                              ('num_%s_total_items' % name, 0)]

        try:
            timestamp = os.stat(self.dir)[stat.ST_MTIME]
        except OSError:
            return

        num_timestamp = self.info['num_%s_timestamp' % name]

        if not num_timestamp or num_timestamp < timestamp:
            logger.debug('Create metainfo for %s, display_type=%s',
                         self.archive, self.display_type)

            if self.media:
                self.media.mount()

            num_dir_items = 0
            num_play_items = 0
            files = []

            try:
                if zipfile.is_zipfile(self.archive):
                    archive = zipfile.ZipFile(self.archive, 'r')
                    files = archive.infolist()
                    names = archive.namelist()

                elif tarfile.is_tarfile(self.archive):
                    archive = tarfile.open(self.archive, 'r')
                    files = archive.getmembers()
                    names = archive.getnames()

                elif ARCHIVE_RAR_AVAILABLE and rarfile.is_rarfile(
                        self.archive):
                    archive = rarfile.RarFile(self.archive, 'r')
                    files = archive.infolist()
                    names = archive.namelist()

            except (ZipError, RarError, TarError) as exc:
                logger.warning('Archive %s error: %s', self.archive, exc)
                self.valid = False

            # play items and playlists
            for p in plugin.mimetype(display_type):
                num_play_items += p.count(self, names)

            # normal DirItems
            for file in files:
                if is_dir(file): num_dir_items += 1

            # store info
            self['num_dir_items'] = num_dir_items
            self['num_%s_items' % name] = num_play_items
            self['num_%s_timestamp' % name] = timestamp

            total_play_items = DirItem.get_play_items_recursive(self, name)

            # some items such as archives are not walkable, hence no way to
            # calculate total number of playable items in the directory tree.
            logger.debug(
                'self.name=%r, display_type=%r, total_play_items=%r, num_play_items=%r, num_dir_items=%r',
                self.name, name, total_play_items, num_play_items,
                num_dir_items)
            if total_play_items < num_play_items + num_dir_items:
                total_play_items = num_play_items + num_dir_items
            self['num_%s_total_items' % name] = total_play_items

            if self.media:
                self.media.umount()