weboob-devel/weboob/applications/galleroob/galleroob.py
Florent 3914d76287 s/dev\/null/os.devnull + add binary flag
For windows compatibility
2015-09-08 08:43:04 +02:00

155 lines
4.7 KiB
Python

# -*- coding: utf-8 -*-
# Copyright(C) 2010-2011 Noé Rubinstein
#
# This file is part of weboob.
#
# weboob is free software: you can redistribute it and/or modify
# 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
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
from __future__ import print_function
import os
from re import search, sub
from weboob.tools.application.repl import ReplApplication, defaultcount
from weboob.capabilities.base import empty
from weboob.capabilities.gallery import CapGallery, BaseGallery, BaseImage
from weboob.tools.application.formatters.iformatter import PrettyFormatter
__all__ = ['Galleroob']
class GalleryListFormatter(PrettyFormatter):
MANDATORY_FIELDS = ('id', 'title')
def get_title(self, obj):
s = obj.title
if hasattr(obj, 'cardinality') and not empty(obj.cardinality):
s += u' (%d pages)' % obj.cardinality
return s
def get_description(self, obj):
if hasattr(obj, 'description') and obj.description:
return obj.description
class Galleroob(ReplApplication):
APPNAME = 'galleroob'
VERSION = '1.1'
COPYRIGHT = u'Copyright(C) 2011-2014 Noé Rubinstein'
DESCRIPTION = 'galleroob browses and downloads web image galleries'
SHORT_DESCRIPTION = 'browse and download web image galleries'
CAPS = CapGallery
EXTRA_FORMATTERS = {'gallery_list': GalleryListFormatter}
COMMANDS_FORMATTERS = {'search': 'gallery_list', 'ls': 'gallery_list'}
COLLECTION_OBJECTS = (BaseGallery, BaseImage, )
def __init__(self, *args, **kwargs):
ReplApplication.__init__(self, *args, **kwargs)
@defaultcount(10)
def do_search(self, pattern):
"""
search PATTERN
List galleries matching a PATTERN.
"""
if not pattern:
print('This command takes an argument: %s' % self.get_command_help('search', short=True), file=self.stderr)
return 2
self.start_format(pattern=pattern)
for gallery in self.do('search_galleries', pattern=pattern):
self.cached_format(gallery)
def do_download(self, line):
"""
download ID [FIRST [FOLDER]]
Download a gallery.
Begins at page FIRST (default: 0) and saves to FOLDER (default: title)
"""
_id, first, dest = self.parse_command_args(line, 3, 1)
if first is None:
first = 0
else:
first = int(first)
gallery = None
_id, backend = self.parse_id(_id)
for result in self.do('get_gallery', _id, backends=backend):
if result:
gallery = result
if not gallery:
print('Gallery not found: %s' % _id, file=self.stderr)
return 3
self.weboob[backend].fillobj(gallery, ('title',))
if dest is None:
dest = sub('/', ' ', gallery.title)
print("Downloading to %s" % dest)
try:
os.mkdir(dest)
except OSError:
pass # ignore error on existing directory
os.chdir(dest) # fail here if dest couldn't be created
i = 0
for img in self.weboob[backend].iter_gallery_images(gallery):
i += 1
if i < first:
continue
self.weboob[backend].fillobj(img, ('url', 'data'))
if img.data is None:
self.weboob[backend].fillobj(img, ('url', 'data'))
if img.data is None:
print("Couldn't get page %d, exiting" % i, file=self.stderr)
break
ext = search(r"\.([^\.]{1,5})$", img.url)
if ext:
ext = ext.group(1)
else:
ext = "jpg"
name = '%03d.%s' % (i, ext)
print('Writing file %s' % name)
with open(name, 'wb') as f:
f.write(img.data)
os.chdir(os.path.pardir)
def do_info(self, line):
"""
info ID
Get information about a gallery.
"""
_id, = self.parse_command_args(line, 1, 1)
gallery = self.get_object(_id, 'get_gallery')
if not gallery:
print('Gallery not found: %s' % _id, file=self.stderr)
return 3
self.start_format()
self.format(gallery)