Add collections to videoob

This commit is contained in:
Nicolas Duhamel 2011-04-08 19:30:16 +02:00 committed by Romain Bignon
commit 8b2e4b276d
2 changed files with 97 additions and 25 deletions

View file

@ -1,21 +1,19 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright(C) 2010-2011 Christophe Benz # Copyright(C) 2010 Christophe Benz
# #
# This file is part of weboob. # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, version 3 of the License.
# #
# weboob is free software: you can redistribute it and/or modify # This program is distributed in the hope that it will be useful,
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# weboob is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU General Public License
# along with weboob. If not, see <http://www.gnu.org/licenses/>. # along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
from .videoob import Videoob from .videoob import Videoob

View file

@ -2,20 +2,18 @@
# Copyright(C) 2010-2011 Christophe Benz, Romain Bignon, John Obbele # Copyright(C) 2010-2011 Christophe Benz, Romain Bignon, John Obbele
# #
# This file is part of weboob. # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, version 3 of the License.
# #
# weboob is free software: you can redistribute it and/or modify # This program is distributed in the hope that it will be useful,
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# weboob is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU General Public License
# along with weboob. If not, see <http://www.gnu.org/licenses/>. # along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
from __future__ import with_statement from __future__ import with_statement
@ -23,12 +21,14 @@ import subprocess
import sys import sys
import os import os
from weboob.capabilities.video import ICapVideo from weboob.capabilities.video import ICapVideo, BaseVideo
from weboob.capabilities.base import NotLoaded from weboob.capabilities.base import NotLoaded
from weboob.tools.application.repl import ReplApplication from weboob.tools.application.repl import ReplApplication
from weboob.tools.application.media_player import InvalidMediaPlayer, MediaPlayer, MediaPlayerNotFound from weboob.tools.application.media_player import InvalidMediaPlayer, MediaPlayer, MediaPlayerNotFound
from weboob.tools.application.formatters.iformatter import IFormatter from weboob.tools.application.formatters.iformatter import IFormatter
from weboob.capabilities.collection import Collection, ICapCollection
__all__ = ['Videoob'] __all__ = ['Videoob']
@ -65,11 +65,13 @@ class Videoob(ReplApplication):
'play and download them and get information.' 'play and download them and get information.'
CAPS = ICapVideo CAPS = ICapVideo
EXTRA_FORMATTERS = {'video_list': VideoListFormatter} EXTRA_FORMATTERS = {'video_list': VideoListFormatter}
COMMANDS_FORMATTERS = {'search': 'video_list'} COMMANDS_FORMATTERS = {'search': 'video_list', 'ls': 'video_list'}
nsfw = True nsfw = True
videos = [] videos = []
working_dir = []
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
ReplApplication.__init__(self, *args, **kwargs) ReplApplication.__init__(self, *args, **kwargs)
self.player = MediaPlayer(self.logger) self.player = MediaPlayer(self.logger)
@ -238,3 +240,75 @@ class Videoob(ReplApplication):
self.videos.append(video) self.videos.append(video)
self.format(video) self.format(video)
self.flush() self.flush()
def do_ls(self, line):
self.videos = []
if len(self.working_dir) == 0:
for name in [b.NAME for b in self.weboob. iter_backends(caps=ICapCollection)]:
print name
return 0
for backend, rep in self.do('iter_resources', backends=self.working_dir[0]):
if isinstance(rep, BaseVideo):
self.videos.append(rep)
self.format(rep)
else:
print rep
self.flush()
def do_cd(self, line):
line = line.encode('utf-8')
import urllib
line = urllib.quote_plus(line)
import posixpath
path = posixpath.normpath(line)
abspath = posixpath.normpath(posixpath.join('/' + '/'.join(self.working_dir), path))
final_parse = abspath.split('/')[1:]
while len(final_parse) > 0 and final_parse[0] == u'': del final_parse[0]
if len(final_parse) == 0:
self.working_dir = []
self.prompt = '%s> ' % self.APPNAME
return 0
final_parse = map(urllib.unquote_plus, final_parse)
working_backend = final_parse[0]
path = final_parse [1:]
if working_backend in [b.NAME for b in self.enabled_backends]:
if working_backend in [b.NAME for b in self.weboob. iter_backends(caps=ICapCollection)]:
backend = [b for b in self.enabled_backends if b.NAME == working_backend][0]
else:
print >>sys.stderr, "Error backend %s not implement Collection" % working_backend
return 1
else:
print >>sys.stderr, "Error backend %s unknow" % working_backend
return 1
if not path:
self.working_dir = [working_backend,]
backend.working_coll = []
self.prompt = '%s:%s> ' % (self.APPNAME, '/' + '/'.join(self.working_dir))
return 0
try:
path = backend.change_working_collection(path)
except NotImplementedError:
print >>sys.stderr, "Error backend %s not implement collection" % working_backend
return 1
escape = lambda s: s.replace('/', '%2F')
path = map(escape, path)
self.working_dir = [working_backend,]+path
self.prompt = '%s:%s> ' % (self.APPNAME, '/' + '/'.join(self.working_dir))
def complete_cd(self, text, line, begidx, endidx):
mline = line.partition(' ')[2]
offs = len(mline) - len(text)
if len(self.working_dir) == 0:
tmp = [b.NAME for b in self.weboob. iter_backends(caps=ICapCollection)]
else:
tmp = [rep for backend, rep in self.do('iter_resources', backends=self.working_dir[0])]
return [s[offs:] for s in tmp if s.startswith(mline)]