renamed application.py files to frontends name
This commit is contained in:
parent
f7827c1e86
commit
c5fef77bc8
16 changed files with 11 additions and 11 deletions
|
|
@ -18,4 +18,4 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
|
||||
"""
|
||||
|
||||
from .application import HaveSex
|
||||
from .havesex import HaveSex
|
||||
|
|
|
|||
86
weboob/frontends/havesex/havesex.py
Normal file
86
weboob/frontends/havesex/havesex.py
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Copyright(C) 2010 Romain Bignon
|
||||
|
||||
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.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
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
|
||||
|
||||
import logging
|
||||
import sys
|
||||
|
||||
from weboob.tools.application import PromptApplication
|
||||
from weboob.capabilities.dating import ICapDating
|
||||
|
||||
|
||||
__all__ = ['HaveSex']
|
||||
|
||||
|
||||
class HaveSex(PromptApplication):
|
||||
APPNAME = 'havesex'
|
||||
VERSION = '1.0'
|
||||
COPYRIGHT = 'Copyright(C) 2010 Romain Bignon'
|
||||
STORAGE_FILENAME = 'dating.storage'
|
||||
|
||||
def main(self, argv):
|
||||
self.load_config()
|
||||
self.load_backends(ICapDating, storage=self.create_storage(self.STORAGE_FILENAME))
|
||||
|
||||
return self.loop()
|
||||
|
||||
def split_id(self, id):
|
||||
try:
|
||||
bname, id = id.split('.', 1)
|
||||
except ValueError:
|
||||
return None, None
|
||||
|
||||
return self.weboob.backends.get(bname, None), id
|
||||
|
||||
@PromptApplication.command("exit program")
|
||||
def command_exit(self):
|
||||
print 'Returning in real-life...'
|
||||
self.weboob.want_stop()
|
||||
|
||||
@PromptApplication.command("show a profile")
|
||||
def command_profile(self, id):
|
||||
backend, _id = self.split_id(id)
|
||||
if not backend:
|
||||
print 'Invalid ID: %s' % id
|
||||
return False
|
||||
with backend:
|
||||
profile = backend.get_profile(_id)
|
||||
if not profile:
|
||||
print 'Profile not found'
|
||||
|
||||
print profile.get_profile_text()
|
||||
return True
|
||||
|
||||
def service(self, action, function):
|
||||
sys.stdout.write('%s:' % action)
|
||||
for backend, result in self.weboob.do(function):
|
||||
sys.stdout.write(' ' + backend.name)
|
||||
sys.stdout.flush()
|
||||
sys.stdout.write('.\n')
|
||||
|
||||
@PromptApplication.command("start profiles walker")
|
||||
def command_walker(self, action):
|
||||
if action == 'start':
|
||||
self.service('Starting walker', 'start_profiles_walker')
|
||||
elif action == 'stop':
|
||||
self.service('Stopping walker', 'stop_profiles_walker')
|
||||
else:
|
||||
logging.error(u'Syntax: walker (start|stop)')
|
||||
|
|
@ -19,4 +19,4 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
|
||||
"""
|
||||
|
||||
from .application import Masstransit
|
||||
from .masstransit import Masstransit
|
||||
|
|
|
|||
241
weboob/frontends/masstransit/masstransit.py
Normal file
241
weboob/frontends/masstransit/masstransit.py
Normal file
|
|
@ -0,0 +1,241 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Copyright(C) 2010 Julien Hébert
|
||||
|
||||
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.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
"""
|
||||
|
||||
from weboob.capabilities.travel import ICapTravel
|
||||
from weboob.tools.application import BaseApplication
|
||||
|
||||
import conic
|
||||
import gtk
|
||||
import hildon
|
||||
from logging import debug
|
||||
|
||||
|
||||
__all__ = ['Masstransit']
|
||||
|
||||
|
||||
class MasstransitHildon():
|
||||
"hildon interface"
|
||||
|
||||
def connect_event(self, connection, event=None, c=None, d=None):
|
||||
debug("DBUS-DEBUG a: %s, b:%s, c:%s,d: %s" % (connection, event, c, d))
|
||||
status = event.get_status()
|
||||
if status == conic.STATUS_CONNECTED:
|
||||
self.connected = True
|
||||
if self.touch_selector_entry_filled == False:
|
||||
debug("connected, now fill")
|
||||
self.fill_touch_selector_entry()
|
||||
if self.refresh_in_progress:
|
||||
self.refresh()
|
||||
elif status == conic.STATUS_DISCONNECTED:
|
||||
self.connected = False
|
||||
|
||||
def __init__(self, weboob):
|
||||
self.touch_selector_entry_filled = False
|
||||
self.refresh_in_progress = False
|
||||
self.connected = False
|
||||
self.weboob = weboob
|
||||
self.connection = conic.Connection()
|
||||
self.connection.connect("connection-event", self.connect_event)
|
||||
self.connection.set_property("automatic-connection-events", True)
|
||||
self.connection.request_connection(conic.CONNECT_FLAG_NONE)
|
||||
|
||||
main_window = hildon.Window()
|
||||
main_window.set_title("Horaires des Prochains Trains")
|
||||
main_window.connect("destroy", self.on_main_window_destroy)
|
||||
|
||||
self.refresh_button = hildon.Button(
|
||||
gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT,
|
||||
hildon.BUTTON_ARRANGEMENT_HORIZONTAL,
|
||||
"Actualiser"
|
||||
)
|
||||
|
||||
self.refresh_button.set_sensitive(False)
|
||||
self.refresh_button.connect("clicked", self.on_refresh_button_clicked)
|
||||
|
||||
self.retour_button = hildon.Button(
|
||||
gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT,
|
||||
hildon.BUTTON_ARRANGEMENT_HORIZONTAL,
|
||||
"Retour"
|
||||
)
|
||||
|
||||
self.retour_button.set_sensitive(False)
|
||||
self.retour_button.connect("clicked", self.on_retour_button_clicked)
|
||||
|
||||
self.treestore = gtk.TreeStore(str, str, str, str, str)
|
||||
treeview = gtk.TreeView(self.treestore)
|
||||
|
||||
|
||||
treeview.append_column(
|
||||
gtk.TreeViewColumn(
|
||||
'Train',
|
||||
gtk.CellRendererText(),
|
||||
text=0
|
||||
))
|
||||
|
||||
treeview.append_column(
|
||||
gtk.TreeViewColumn(
|
||||
'Horaire',
|
||||
gtk.CellRendererText(),
|
||||
text=1
|
||||
))
|
||||
|
||||
treeview.append_column(
|
||||
gtk.TreeViewColumn(
|
||||
'Destination',
|
||||
gtk.CellRendererText(),
|
||||
text=2
|
||||
))
|
||||
treeview.append_column(
|
||||
gtk.TreeViewColumn(
|
||||
'Voie',
|
||||
gtk.CellRendererText(),
|
||||
text=3
|
||||
))
|
||||
|
||||
treeview.append_column(
|
||||
gtk.TreeViewColumn(
|
||||
'Information',
|
||||
gtk.CellRendererText(),
|
||||
text=4
|
||||
))
|
||||
|
||||
|
||||
self.combo_source = hildon.TouchSelectorEntry(text=True)
|
||||
self.combo_dest = hildon.TouchSelectorEntry(text=True)
|
||||
|
||||
self.picker_button_source = hildon.PickerButton(
|
||||
gtk.HILDON_SIZE_AUTO,
|
||||
hildon.BUTTON_ARRANGEMENT_VERTICAL)
|
||||
|
||||
self.picker_button_dest = hildon.PickerButton(
|
||||
gtk.HILDON_SIZE_AUTO,
|
||||
hildon.BUTTON_ARRANGEMENT_VERTICAL
|
||||
)
|
||||
|
||||
self.picker_button_source.set_sensitive(False)
|
||||
self.picker_button_dest.set_sensitive(False)
|
||||
|
||||
self.picker_button_source.set_title("Gare de Depart")
|
||||
self.picker_button_dest.set_title("Gare d'arrivee")
|
||||
|
||||
self.picker_button_source.set_selector(self.combo_source)
|
||||
self.picker_button_dest.set_selector(self.combo_dest)
|
||||
|
||||
vertical_box = gtk.VBox()
|
||||
horizontal_box = gtk.HBox()
|
||||
vertical_box.pack_start(horizontal_box)
|
||||
horizontal_box.pack_start(self.picker_button_source)
|
||||
horizontal_box.pack_start(self.picker_button_dest)
|
||||
horizontal_box.pack_start(self.retour_button)
|
||||
vertical_box.pack_start(treeview)
|
||||
vertical_box.pack_start(self.refresh_button)
|
||||
|
||||
main_window.add(vertical_box)
|
||||
main_window.show_all()
|
||||
|
||||
self.picker_button_source.connect("value-changed",
|
||||
self.check_station_input,
|
||||
self.picker_button_source)
|
||||
self.picker_button_dest.connect("value-changed",
|
||||
self.check_station_input,
|
||||
self.picker_button_dest)
|
||||
|
||||
def fill_touch_selector_entry(self):
|
||||
liste = []
|
||||
|
||||
for backend in self.weboob.iter_backends():
|
||||
for station in backend.iter_station_search(""):
|
||||
liste.append(station.name.capitalize())
|
||||
|
||||
liste.sort()
|
||||
|
||||
for station in liste:
|
||||
self.combo_source.append_text(station)
|
||||
self.combo_dest.append_text(station)
|
||||
|
||||
self.touch_selector_entry_filled = True
|
||||
self.picker_button_source.set_sensitive(True)
|
||||
|
||||
def on_main_window_destroy(self, widget):
|
||||
"exit application at the window close"
|
||||
gtk.main_quit()
|
||||
|
||||
def on_main_window_show(self, param):
|
||||
self.fill_touch_selector_entry()
|
||||
|
||||
def on_retour_button_clicked(self, widget):
|
||||
"the button is clicked"
|
||||
self.refresh_in_progress = True
|
||||
col_source = self.combo_source.get_active(0)
|
||||
col_dest = self.combo_dest.get_active(0)
|
||||
self.combo_source.set_active(0, col_dest)
|
||||
self.combo_dest.set_active(0, col_source)
|
||||
self.refresh()
|
||||
|
||||
def on_refresh_button_clicked(self, widget):
|
||||
"the refresh button is clicked"
|
||||
self.refresh_in_progress = True
|
||||
self.connection.request_connection(conic.CONNECT_FLAG_NONE)
|
||||
|
||||
def check_station_input(self, widget, user_data):
|
||||
if self.combo_source.get_current_text() is None :
|
||||
self.picker_button_dest.set_sensitive(False)
|
||||
self.refresh_button.set_sensitive(False)
|
||||
self.retour_button.set_sensitive(False)
|
||||
else:
|
||||
self.picker_button_dest.set_sensitive(True)
|
||||
if self.combo_dest.get_current_text() is None:
|
||||
self.refresh_button.set_sensitive(False)
|
||||
self.retour_button.set_sensitive(False)
|
||||
else:
|
||||
self.refresh_button.set_sensitive(True)
|
||||
self.retour_button.set_sensitive(True)
|
||||
|
||||
def refresh(self):
|
||||
"update departures"
|
||||
self.treestore.clear()
|
||||
for backend in self.weboob.iter_backends():
|
||||
for station in \
|
||||
backend.iter_station_search(self.combo_source.get_current_text()):
|
||||
for arrival in \
|
||||
backend.iter_station_search(self.combo_dest.get_current_text()):
|
||||
for departure in \
|
||||
backend.iter_station_departures(station.id, arrival.id):
|
||||
self.treestore.append(None,
|
||||
[departure.type,
|
||||
departure.time,
|
||||
departure.arrival_station,
|
||||
departure.plateform,
|
||||
departure.information])
|
||||
|
||||
self.refresh_in_progress = False
|
||||
|
||||
|
||||
class Masstransit(BaseApplication):
|
||||
"Application Class"
|
||||
APPNAME = 'masstransit'
|
||||
VERSION = '1.0'
|
||||
COPYRIGHT = 'Copyright(C) 2010 Julien Hébert'
|
||||
|
||||
def main(self, argv):
|
||||
"main fonction"
|
||||
self.load_modules(ICapTravel)
|
||||
MasstransitHildon(self.weboob)
|
||||
gtk.main()
|
||||
|
|
@ -1 +1 @@
|
|||
from .application import QVideoob
|
||||
from .qvideoob import QVideoob
|
||||
|
|
|
|||
42
weboob/frontends/qvideoob/qvideoob.py
Normal file
42
weboob/frontends/qvideoob/qvideoob.py
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Copyright(C) 2010 Romain Bignon
|
||||
|
||||
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.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
"""
|
||||
|
||||
from weboob.capabilities.video import ICapVideoProvider
|
||||
from weboob.tools.application import QtApplication
|
||||
|
||||
from .main_window import MainWindow
|
||||
|
||||
class QVideoob(QtApplication):
|
||||
APPNAME = 'qvideoob'
|
||||
VERSION = '1.0'
|
||||
COPYRIGHT = 'Copyright(C) 2010 Romain Bignon'
|
||||
CONFIG = {'settings': {'nsfw': True,
|
||||
'sfw': True,
|
||||
'sortby': 0,
|
||||
'backend': ''
|
||||
}
|
||||
}
|
||||
def main(self, argv):
|
||||
self.load_modules(ICapVideoProvider)
|
||||
self.load_config()
|
||||
|
||||
self.main_window = MainWindow(self.config, self.weboob)
|
||||
self.main_window.show()
|
||||
return self.weboob.loop()
|
||||
|
|
@ -18,4 +18,4 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
|
||||
"""
|
||||
|
||||
from .application import VideoobWeb
|
||||
from .videoob_web import VideoobWeb
|
||||
|
|
|
|||
112
weboob/frontends/videoob_web/videoob_web.py
Normal file
112
weboob/frontends/videoob_web/videoob_web.py
Normal file
|
|
@ -0,0 +1,112 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Copyright(C) 2010 Christophe Benz
|
||||
|
||||
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.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
"""
|
||||
|
||||
import os
|
||||
|
||||
from mako.lookup import TemplateLookup
|
||||
from mako.runtime import Context
|
||||
from routes import Mapper
|
||||
from StringIO import StringIO
|
||||
from webob.dec import wsgify
|
||||
from webob import exc
|
||||
from wsgiref.simple_server import make_server
|
||||
|
||||
from weboob.capabilities.video import ICapVideoProvider
|
||||
from weboob.tools.application import BaseApplication
|
||||
|
||||
|
||||
__all__ = ['VideoobWeb']
|
||||
|
||||
|
||||
template_lookup = TemplateLookup(directories=[os.path.join(os.path.dirname(__file__), 'templates')],
|
||||
output_encoding='utf-8', encoding_errors='replace')
|
||||
|
||||
|
||||
class VideoobWeb(BaseApplication):
|
||||
APPNAME = 'videoob-web'
|
||||
CONFIG = dict(host='localhost', port=8080)
|
||||
|
||||
@wsgify
|
||||
def make_app(self, req):
|
||||
map = Mapper()
|
||||
map.connect('index', '/', method='index')
|
||||
|
||||
results = map.routematch(environ=req.environ)
|
||||
if results:
|
||||
match, route = results
|
||||
req.urlvars = ((), match)
|
||||
kwargs = match.copy()
|
||||
method = kwargs.pop('method')
|
||||
return getattr(self, method)(req, **kwargs)
|
||||
else:
|
||||
public_path = os.path.join(os.path.dirname(__file__), 'public')
|
||||
if not os.path.exists(public_path):
|
||||
return exc.HTTPNotFound()
|
||||
path = req.path
|
||||
if path.startswith('/'):
|
||||
path = path[1:]
|
||||
public_file_path = os.path.join(public_path, path)
|
||||
if os.path.exists(public_file_path):
|
||||
if path.endswith('.css'):
|
||||
req.response.content_type = 'text/css'
|
||||
elif path.endswith('.js'):
|
||||
req.response.content_type = 'text/javascript'
|
||||
return open(public_file_path, 'r').read().strip()
|
||||
else:
|
||||
return exc.HTTPNotFound()
|
||||
|
||||
def main(self, argv):
|
||||
self.load_config()
|
||||
self.weboob.load_modules(ICapVideoProvider)
|
||||
print 'Web server created. Listening on http://%s:%s' % (
|
||||
self.config.get('host'), int(self.config.get('port')))
|
||||
srv = make_server(self.config.get('host'), int(self.config.get('port')), self.make_app)
|
||||
srv.serve_forever()
|
||||
|
||||
def index(self, req):
|
||||
c = {}
|
||||
nsfw = req.params.get('nsfw')
|
||||
nsfw = False if not nsfw or nsfw == '0' else True
|
||||
q = req.params.get('q', u'')
|
||||
merge = req.params.get('merge')
|
||||
merge = False if not merge or merge == '0' else True
|
||||
c['merge'] = merge
|
||||
c['form_data'] = dict(q=q)
|
||||
c['results'] = [] if merge else {}
|
||||
if q:
|
||||
for backend in self.weboob.iter_backends():
|
||||
videos = [dict(title=video.title,
|
||||
page_url=video.page_url,
|
||||
url=video.url if video.url else '/download?id=%s' % video.id,
|
||||
thumbnail_url=video.thumbnail_url,
|
||||
) \
|
||||
for video in backend.iter_search_results(pattern=q, nsfw=nsfw)]
|
||||
if videos:
|
||||
if merge:
|
||||
c['results'].extend(videos)
|
||||
else:
|
||||
c['results'][backend.name] = videos
|
||||
if merge:
|
||||
c['results'] = sorted(c['results'], key=lambda video: video['title'].lower())
|
||||
template = template_lookup.get_template('index.mako')
|
||||
buf = StringIO()
|
||||
ctx = Context(buf, **c)
|
||||
template.render_context(ctx)
|
||||
return buf.getvalue().strip()
|
||||
|
|
@ -18,4 +18,4 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
|
||||
"""
|
||||
|
||||
from .application import WeboobCfg
|
||||
from .weboobcfg import WeboobCfg
|
||||
|
|
|
|||
160
weboob/frontends/weboobcfg/weboobcfg.py
Normal file
160
weboob/frontends/weboobcfg/weboobcfg.py
Normal file
|
|
@ -0,0 +1,160 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright(C) 2010 Romain Bignon, Christophe Benz
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
import ConfigParser
|
||||
import logging
|
||||
import os
|
||||
import subprocess
|
||||
|
||||
import weboob
|
||||
from weboob.tools.application import ConsoleApplication
|
||||
|
||||
|
||||
__all__ = ['WeboobCfg']
|
||||
|
||||
|
||||
class WeboobCfg(ConsoleApplication):
|
||||
APPNAME = 'weboobcfg'
|
||||
VERSION = '1.0'
|
||||
COPYRIGHT = 'Copyright(C) 2010 Romain Bignon'
|
||||
|
||||
def main(self, argv):
|
||||
return self.process_command(*argv[1:])
|
||||
|
||||
def caps_included(self, modcaps, caps):
|
||||
modcaps = [x.__name__ for x in modcaps]
|
||||
for cap in caps:
|
||||
if not cap in modcaps:
|
||||
return False
|
||||
return True
|
||||
|
||||
@ConsoleApplication.command('List modules')
|
||||
def command_modules(self, *caps):
|
||||
print ' Name Capabilities Description '
|
||||
print '+--------------+----------------------+----------------------------------------+'
|
||||
self.weboob.modules_loader.load()
|
||||
for name, module in self.weboob.modules_loader.modules.iteritems():
|
||||
if caps and not self.caps_included(module.iter_caps(), caps):
|
||||
continue
|
||||
|
||||
first_line = True
|
||||
for cap in module.iter_caps():
|
||||
if first_line:
|
||||
print ' %-14s %-21s %s' % (name, cap.__name__, module.get_description())
|
||||
first_line = False
|
||||
else:
|
||||
print ' %s' % cap.__name__
|
||||
|
||||
@ConsoleApplication.command('List applications')
|
||||
def command_applications(self, *caps):
|
||||
applications_path = os.path.abspath(os.path.join(os.path.dirname(weboob.__file__), '..', 'scripts'))
|
||||
assert os.path.exists(applications_path)
|
||||
print ' '.join(f for f in os.listdir(applications_path) if not f.startswith('.'))
|
||||
|
||||
@ConsoleApplication.command('Display a module')
|
||||
def command_modinfo(self, name):
|
||||
try:
|
||||
module = self.weboob.modules_loader.get_or_load_module(name)
|
||||
except KeyError:
|
||||
logging.error('No such module: %s' % name)
|
||||
return 1
|
||||
|
||||
print '.------------------------------------------------------------------------------.'
|
||||
print '| Module %-69s |' % module.get_name()
|
||||
print "+-----------------.------------------------------------------------------------'"
|
||||
print '| Version | %s' % module.get_version()
|
||||
print '| Maintainer | %s' % module.get_maintainer()
|
||||
print '| License | %s' % module.get_license()
|
||||
print '| Description | %s' % module.get_description()
|
||||
print '| Capabilities | %s' % ', '.join([cap.__name__ for cap in module.iter_caps()])
|
||||
first = True
|
||||
for key, field in module.get_config().iteritems():
|
||||
value = field.description
|
||||
if not field.default is None:
|
||||
value += ' (default: %s)' % field.default
|
||||
if first:
|
||||
print '| | '
|
||||
print '| Configuration | %s: %s' % (key, value)
|
||||
first = False
|
||||
else:
|
||||
print '| | %s: %s' % (key, value)
|
||||
print "'-----------------' "
|
||||
|
||||
|
||||
@ConsoleApplication.command('Add a configured backend')
|
||||
def command_add(self, name, *options):
|
||||
self.weboob.modules_loader.load()
|
||||
if name not in [module_name for module_name, module in self.weboob.modules_loader.modules.iteritems()]:
|
||||
logging.error(u'Backend "%s" does not exist.' % name)
|
||||
return 1
|
||||
|
||||
params = {}
|
||||
# set backend params from command-line arguments
|
||||
for option in options:
|
||||
try:
|
||||
key, value = option.split('=', 1)
|
||||
except ValueError:
|
||||
logging.error(u'Parameters have to be formatted "key=value"')
|
||||
return 1
|
||||
params[key] = value
|
||||
# ask for params non-specified on command-line arguments
|
||||
module = self.weboob.modules_loader.get_or_load_module(name)
|
||||
for key, value in module.get_config().iteritems():
|
||||
if key not in params:
|
||||
masked = key == 'password'
|
||||
params[key] = self.ask(key, default=u'', masked=masked)
|
||||
|
||||
try:
|
||||
self.weboob.backends_config.add_backend(name, name, params)
|
||||
print u'Backend "%s" successfully added to file "%s".\n'\
|
||||
'Please check configuration parameters values with "weboobcfg edit".' % (
|
||||
name, self.weboob.backends_config.confpath)
|
||||
except ConfigParser.DuplicateSectionError:
|
||||
print u'Backend "%s" is already configured in file "%s"' % (name, self.weboob.backends_config.confpath)
|
||||
response = raw_input(u'Add new instance of "%s" backend ? [yN] ' % name)
|
||||
if response.lower() == 'y':
|
||||
while True:
|
||||
new_name = raw_input(u'Please give new instance name (could be "%s_1"): ' % name)
|
||||
if not new_name:
|
||||
continue
|
||||
try:
|
||||
self.weboob.backends_config.add_backend(new_name, name, params)
|
||||
print u'Backend "%s" successfully added to file "%s".\n'\
|
||||
'Please check configuration parameters values with "weboobcfg edit".' % (
|
||||
name, self.weboob.backends_config.confpath)
|
||||
break
|
||||
except ConfigParser.DuplicateSectionError:
|
||||
print u'Instance "%s" is already configured for backend "%s".' % (new_name, name)
|
||||
|
||||
@ConsoleApplication.command('List backends')
|
||||
def command_list(self):
|
||||
print ' Instance Name Name Params '
|
||||
print '+---------------+--------------+------------------------------------------------+'
|
||||
for instance_name, name, params in self.weboob.backends_config.iter_backends():
|
||||
print ' %-15s %-14s %-47s' % (instance_name, name, ', '.join('%s=%s' % (key, value) for key, value in params.iteritems()))
|
||||
|
||||
@ConsoleApplication.command('Remove a backend')
|
||||
def command_remove(self, instance_name):
|
||||
try:
|
||||
self.weboob.backends_config.remove_backend(instance_name)
|
||||
except ConfigParser.NoSectionError:
|
||||
logging.error("Backend '%s' does not exist" % instance_name)
|
||||
return 1
|
||||
|
||||
@ConsoleApplication.command('Edit configuration file')
|
||||
def command_edit(self):
|
||||
subprocess.call([os.environ.get('EDITOR', 'vi'), self.weboob.backends_config.confpath])
|
||||
|
|
@ -1,18 +1,18 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright(C) 2010 Christophe Benz
|
||||
#
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
from .application import WeboobDebug
|
||||
from .weboobdebug import WeboobDebug
|
||||
|
|
|
|||
45
weboob/frontends/weboobdebug/weboobdebug.py
Normal file
45
weboob/frontends/weboobdebug/weboobdebug.py
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright(C) 2010 Christophe Benz
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
|
||||
import logging
|
||||
|
||||
from weboob.tools.application import ConsoleApplication
|
||||
|
||||
|
||||
class WeboobDebug(ConsoleApplication):
|
||||
APPNAME = 'weboobdebug'
|
||||
VERSION = '1.0'
|
||||
COPYRIGHT = 'Copyright(C) 2010 Christophe Benz'
|
||||
|
||||
def main(self, argv):
|
||||
return self.process_command(*argv[1:])
|
||||
|
||||
@ConsoleApplication.command('Debug backend')
|
||||
def command_shell(self, backend_name):
|
||||
try:
|
||||
backend = self.weboob.load_modules(names=[backend_name])[backend_name]
|
||||
except KeyError:
|
||||
logging.error(u'Unable to load backend "%s"' % backend_name)
|
||||
return 1
|
||||
browser = backend.browser
|
||||
from IPython.Shell import IPShellEmbed
|
||||
shell = IPShellEmbed(argv=[])
|
||||
locs = dict(backend=backend, browser=browser, frontend=self, weboob=self.weboob)
|
||||
banner = 'Weboob debug shell\nBackend "%s" loaded.\nAvailable variables: %s' % (backend_name, locs)
|
||||
shell.set_banner(shell.IP.BANNER + '\n\n' + banner)
|
||||
shell(local_ns=locs, global_ns={})
|
||||
|
|
@ -18,4 +18,4 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
|
||||
"""
|
||||
|
||||
from .application import Weboorrents
|
||||
from .weboorrents import Weboorrents
|
||||
|
|
|
|||
89
weboob/frontends/weboorrents/weboorrents.py
Normal file
89
weboob/frontends/weboorrents/weboorrents.py
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Copyright(C) 2010 Romain Bignon
|
||||
|
||||
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.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
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
|
||||
|
||||
import logging
|
||||
|
||||
from weboob.capabilities.torrent import ICapTorrent
|
||||
from weboob.tools.application import ConsoleApplication
|
||||
|
||||
|
||||
__all__ = ['Weboorrents']
|
||||
|
||||
|
||||
class Weboorrents(ConsoleApplication):
|
||||
APPNAME = 'weboorrents'
|
||||
VERSION = '1.0'
|
||||
COPYRIGHT = 'Copyright(C) 2010 Romain Bignon'
|
||||
CONFIG = {}
|
||||
|
||||
def main(self, argv):
|
||||
self.load_backends(ICapTorrent)
|
||||
return self.process_command(*argv[1:])
|
||||
|
||||
def split_id(self, id):
|
||||
if not '.' in id:
|
||||
logging.error('ID must be in form <backend>.<ID>')
|
||||
return None, None
|
||||
|
||||
backend_name, id = id.split('.', 1)
|
||||
backend = self.weboob.backends.get(backend_name, None)
|
||||
if not backend:
|
||||
logging.error('Backends "%s" not found' % backend_name)
|
||||
return None, None
|
||||
|
||||
return backend, id
|
||||
|
||||
@ConsoleApplication.command('Get information about a torrent')
|
||||
def command_info(self, id):
|
||||
backend, id = self.split_id(id)
|
||||
if not backend:
|
||||
return 1
|
||||
with backend:
|
||||
torrent = backend.get_torrent(id)
|
||||
if not torrent:
|
||||
logging.error('Torrent "%s" not found' % id)
|
||||
return 1
|
||||
self.format(torrent)
|
||||
|
||||
@ConsoleApplication.command('Get the torrent file')
|
||||
def command_getfile(self, id, dest):
|
||||
backend, id = self.split_id(id)
|
||||
if not backend:
|
||||
return 1
|
||||
|
||||
with backend:
|
||||
s = backend.get_torrent_file(id)
|
||||
if not s:
|
||||
logging.error('Torrent "%s" not found' % id)
|
||||
return 1
|
||||
|
||||
if dest == '-':
|
||||
print s
|
||||
else:
|
||||
with open(dest, 'w') as f:
|
||||
f.write(s)
|
||||
|
||||
@ConsoleApplication.command('Search torrents')
|
||||
def command_search(self, pattern=None):
|
||||
print u'Search pattern: %s' % pattern if pattern else u'Last torrents'
|
||||
for backend, torrent in self.weboob.do('iter_torrents', pattern=pattern):
|
||||
self.format(torrent)
|
||||
|
|
@ -18,4 +18,4 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
|
||||
"""
|
||||
|
||||
from .application import WetBoobs
|
||||
from .wetboobs import WetBoobs
|
||||
|
|
|
|||
68
weboob/frontends/wetboobs/wetboobs.py
Normal file
68
weboob/frontends/wetboobs/wetboobs.py
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Copyright(C) 2010 Romain Bignon
|
||||
|
||||
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.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
"""
|
||||
|
||||
import logging
|
||||
|
||||
from weboob import CallErrors
|
||||
from weboob.capabilities.weather import ICapWeather, CityNotFound
|
||||
from weboob.tools.application import ConsoleApplication
|
||||
|
||||
|
||||
__all__ = ['WetBoobs']
|
||||
|
||||
|
||||
class WetBoobs(ConsoleApplication):
|
||||
APPNAME = 'wetboobs'
|
||||
VERSION = '1.0'
|
||||
COPYRIGHT = 'Copyright(C) 2010 Romain Bignon'
|
||||
|
||||
def main(self, argv):
|
||||
self.load_modules(ICapWeather)
|
||||
|
||||
return self.process_command(*argv[1:])
|
||||
|
||||
@ConsoleApplication.command('search cities')
|
||||
def command_search(self, pattern):
|
||||
for backend, city in self.weboob.do('iter_city_search', pattern):
|
||||
self.format(city)
|
||||
|
||||
@ConsoleApplication.command('get current weather')
|
||||
def command_current(self, city):
|
||||
try:
|
||||
for backend, current in self.weboob.do('get_current', city):
|
||||
self.format(current)
|
||||
except CallErrors, e:
|
||||
for error in e:
|
||||
if isinstance(error, CityNotFound):
|
||||
logging.error('City "%s" not found' % city)
|
||||
else:
|
||||
raise error
|
||||
|
||||
@ConsoleApplication.command('get forecasts')
|
||||
def command_forecasts(self, city):
|
||||
try:
|
||||
for backend, forecast in self.weboob.do('iter_forecast', city):
|
||||
self.format(forecast)
|
||||
except CallErrors, e:
|
||||
for error in e:
|
||||
if isinstance(error, CityNotFound):
|
||||
logging.error('City "%s" not found' % city)
|
||||
else:
|
||||
raise error
|
||||
Loading…
Reference in a new issue