LINUX.ORG.RU

FUSE.Operations

 ,


0

3
    def ls_music(self):
        '''list music using a self._vk object. Use vk.audio.get()'''
        get = self.vk.audio.get(uid=self.uid)
        self.list_music = {}
        for resp in get:
            ent = Entry()
            ent.id = resp['aid']
            ent.url = resp['url']
            self.list_music['{aid}.mp3'.format(**resp)] = ent

    def readdir(self, path, file_handle):
        if path == '/':
            self.ls_music()
            print ('readdir: Запрошен путь /')
            #list_music = {m:self.stat('/' + m) for m in self.list_music}
            #return list_music
            return ['..','.'] + list(self.list_music.keys())
        else:
            raise OSError(errno.ENOENT)

данный код не может создать директорию, т.к. filler не заполняет ничего уже на первой итерации.

Код readdir (low-level):

def readdir(self, path, result, filler, offset, file_info):
        for path in self.operations.readdir(path.decode('utf-8'), file_info.contents.fh):
            print ('Путь ' + path)
            if isinstance(path, str):
                name, stat, offset = path, None, 0
            else: 
                name, attributes, offset = path
                if attributes:
                    stat = _c_stat()
                    _stat_set_attributes(stat, attributes)
                else:
                    stat = None
            if not filler(result, name.encode('utf-8'), stat, offset):
                print ('breaking: filler {}, result {}, name {},stat {}, offset {}'.format(
                            filler(result, name.encode('utf-8'), stat, offset), result, name, stat, offset))
                break
        return 0
Выхлоп:
breaking: filler 0, result 139813869198080, name ..,stat None, offset 0

что делаю не так? Код биндинга fuse отсюда:http://paste.kde.org/538382/

★★★★

Последнее исправление: cetjs2 (всего исправлений: 2)

Я бы не стал писать так код. Функции которые вместо того чтобы вернуть значение правят какую-то переменную внутрях инстанса это зло. Тут и рейс-кондишены легко плодятся и читать сложно.

Ну а сам биндинг работает? К нему fuse3-mem.py или типа того прилагалось для проверки. Если работает то начни с его модификации.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Сейчас проверю. И вот еще проблема: что отдавать как st_size? Если в том месте загружать файл, то при первом же ls он будет загружать все, что мне не нужно. Если ничего не загружать, а поставить 0, у программ могут возникнуть проблемы с чтением.

pashazz ★★★★
() автор топика
Ответ на: комментарий от pashazz

что отдавать как st_size?

Эээ, да, проблема. Знаешь, если там писать ненастоящее значение то по-любому будут проблемы. Но я вот mplayer натравил на файл, он stat не делает, он сразу open() делает. Так что я бы сделал следующим образом:

1) отдавал бы 0 (если это не вызывает проблемы то отдавай, скажем 10метров) для файлов которые незакэшированы

2) При первом open скачивать файл на диск и на последующие stat() отдавать реальное число.

Но вообще я бы особо не заморачивался и просто один раз получал с сервера длины всех файлов и дальше отдавать закэшированное значение.

А то и вовсе можно скрипт написать который тупо всё один раз скачивает локально а синхронизирует если нужно.

true_admin ★★★★★
()
Ответ на: комментарий от pashazz

Эээ, я вот об этом и хотел поговорить. Да, можно сделать HEAD-запрос и всё узнать. Но ведь вопрос что делать при ls когда в папке сотни файлов. Не посылать же каждый раз сотни запросов.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Да, я так и сделал. Лагает. Тяжелая это работа, фс делать сетевую, я думал, будет легче))

pashazz ★★★★
() автор топика
Ответ на: комментарий от true_admin

да кстати, как лучше реализовать read? Если через urlretreive, то mplayer просто не хочет ждать.

Если через urlopen, то нельзя читать со смещением (а оно надо для mp3 файлов?)

pashazz ★★★★
() автор топика
Ответ на: комментарий от true_admin

Урра, исправил маленькую ошибочку и теперь можно слушать музычку из вкантактика в mpd!!!

так, эта проблема решена, теперь переходим к большой vk-файловой системе. Хочу смотреть фоточки не заходя на vk.com

pashazz ★★★★
() автор топика
Ответ на: комментарий от true_admin

Кстати, у тебя есть JID, я смотрю тут больше никто в этом не разбирается?

pashazz ★★★★
() автор топика

оказалось, что mpd делает open каждому файлу, который сейчас добавляется. Поэтому загружаются сразу все, что меня не устраивает. Как у xmms2 c этим дела?

pashazz ★★★★
() автор топика
Ответ на: комментарий от pashazz

mpd делает open каждому файлу

метаинформацию смотрит типа названия, длительности итп. Но у тебя разве не кэшируется это? По-моему, даже у fuse есть встроенные средства этого.

Как у xmms2 c этим дела?

Хз, думаю что как и у xmms1 настраивается. Он может сразу сканировать весь лист, может только видимую часть, а может и не сканировать вообще.

у тебя есть JID

true dog jabber no, но времени сейчас мало, я ещё в разъездах, поэтому не часто бываю.

true_admin ★★★★★
()
Ответ на: комментарий от pashazz

upd:

class fuse_file_info(Structure):
    _fields_ = [
        ('flags', c_int),
        ('fh_old', c_ulong),
        ('writepage', c_int),
        ('direct_io', c_uint, 1),
        ('keep_cache', c_uint, 1),
        ('flush', c_uint, 1),
        ('padding', c_uint, 29),
        ('fh', c_uint64),
        ('lock_owner', c_uint64)]
я смотрю, он и так включен. Так что это есть.

pashazz ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.