diff --git a/weboob/applications/cineoob/__init__.py b/weboob/applications/cineoob/__init__.py
new file mode 100644
index 00000000..385551a3
--- /dev/null
+++ b/weboob/applications/cineoob/__init__.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+
+# Copyright(C) 2013 Julien Veyssier
+#
+# 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 .
+
+
+from .cineoob import Cineoob
+
+__all__ = ['Cineoob']
diff --git a/weboob/applications/cineoob/cineoob.py b/weboob/applications/cineoob/cineoob.py
new file mode 100644
index 00000000..c214d4fa
--- /dev/null
+++ b/weboob/applications/cineoob/cineoob.py
@@ -0,0 +1,224 @@
+# -*- coding: utf-8 -*-
+
+# Copyright(C) 2013 Julien Veyssier
+#
+# 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 .
+
+from __future__ import with_statement
+
+import sys
+from datetime import datetime
+
+from weboob.capabilities.cinema import ICapCinema
+from weboob.tools.application.repl import ReplApplication
+from weboob.tools.application.formatters.iformatter import IFormatter, PrettyFormatter
+from weboob.core import CallErrors
+
+
+__all__ = ['Cineoob']
+
+
+class MovieInfoFormatter(IFormatter):
+ MANDATORY_FIELDS = ('id', 'original_title', 'release_date', 'other_titles', 'duration', 'description', 'note', 'awards','roles')
+
+ def format_obj(self, obj, alias):
+ result = u'%s%s%s\n' % (self.BOLD, obj.original_title, self.NC)
+ result += 'ID: %s\n' % obj.fullid
+ result += 'Other titles: %s\n' % obj.other_titles
+ result += 'Released: %s\n' % obj.release_date
+ result += 'Duration: %d\n' % obj.duration
+ result += 'Note: %s\n' % obj.note
+ if obj.roles:
+ result += '\n%sRelated persons%s\n' % (self.BOLD, self.NC)
+ for role,lpersons in obj.roles.items():
+ result += ' -- %s\n' % role
+ for person in lpersons:
+ result += ' * %s\n' % person.name
+ if obj.awards:
+ result += '\n%sAwards%s\n' % (self.BOLD, self.NC)
+ for a in obj.awards:
+ result += ' * %s\n' % a
+ result += '\n%sDescription%s\n' % (self.BOLD, self.NC)
+ result += obj.description
+ return result
+
+
+class MovieListFormatter(PrettyFormatter):
+ MANDATORY_FIELDS = ('id', 'original_title', 'release_date', 'duration', 'note')
+
+ def get_title(self, obj):
+ return obj.original_title
+
+ def get_description(self, obj):
+ return 'Released: %s (note: %d, duration: %d)' % (obj.release_date, obj.note, obj.duration)
+
+def num_years(begin, end=None):
+ if end is None:
+ end = datetime.now()
+ num_years = int((end - begin).days / 365.25)
+ if begin > yearsago(num_years, end):
+ return num_years - 1
+ else:
+ return num_years
+
+class PersonInfoFormatter(IFormatter):
+ MANDATORY_FIELDS = ('id', 'name', 'real_name', 'birth_date', 'birth_place', 'gender', 'nationality', 'biography', 'awards','roles')
+
+ def format_obj(self, obj, alias):
+ result = u'%s%s%s\n' % (self.BOLD, obj.name, self.NC)
+ result += 'ID: %s\n' % obj.fullid
+ result += 'Real name: %s\n' % obj.real_name
+ result += 'Birth date: %s\n' % obj.birth_date
+ age = num_years(obj.birth_date)
+ result += 'Age: %s\n' % obj.age
+ result += 'Birth place: %d\n' % obj.birth_place
+ result += 'Gender: %s\n' % obj.gender
+ result += 'Nationality: %s\n' % obj.nationality
+ if obj.roles:
+ result += '\n%sRelated movies%s\n' % (self.BOLD, self.NC)
+ for role,lmovies in obj.roles.items():
+ result += ' -- %s\n' % role
+ for movie in lmovies:
+ result += ' * %s\n' % movie.original_title
+ if obj.awards:
+ result += '\n%sAwards%s\n' % (self.BOLD, self.NC)
+ for a in obj.awards:
+ result += ' * %s\n' % a
+ result += '\n%Biography%s\n' % (self.BOLD, self.NC)
+ result += obj.biography
+ return result
+
+
+class PersonListFormatter(PrettyFormatter):
+ MANDATORY_FIELDS = ('id', 'name', 'real_name', 'birth_date', 'nationality', 'gender')
+
+ def get_title(self, obj):
+ return obj.name
+
+ def get_description(self, obj):
+ age = num_years(obj.birth_date)
+ return 'Real name: %s (age: %d, nationality: %s, gender: %s)' % (obj.real_name, age, obj.nationality, obj.gender)
+
+
+class Cineoob(ReplApplication):
+ APPNAME = 'cineoob'
+ VERSION = '0.f'
+ COPYRIGHT = 'Copyright(C) 2013 Julien Veyssier'
+ DESCRIPTION = "Console application allowing to search for movies and persons on various cinema databases " \
+ ", list persons related to a movie and list movies related to a person."
+ SHORT_DESCRIPTION = "search movies and persons around cinema"
+ CAPS = ICapCinema
+ EXTRA_FORMATTERS = {'movie_list': MovieListFormatter,
+ 'movie_info': MovieInfoFormatter,
+ 'person_list': PersonListFormatter,
+ 'person_info': PersonInfoFormatter,
+ }
+ COMMANDS_FORMATTERS = {'search_movie': 'movie_list',
+ 'info_movie': 'movie_info',
+ 'search_person': 'person_list',
+ 'info_person': 'person_info',
+ 'casting': 'person_list',
+ 'filmography': 'movie_list'
+ }
+
+ def complete_info(self, text, line, *ignored):
+ args = line.split(' ')
+ if len(args) == 2:
+ return self._complete_object()
+
+ def do_info_movie(self, id):
+ """
+ info_movie ID
+
+ Get information about a movie.
+ """
+
+ movie = self.get_object(id, 'get_movie')
+ if not movie:
+ print >>sys.stderr, 'Movie not found: %s' % id
+ return 3
+
+ self.start_format()
+ self.format(movie)
+ self.flush()
+
+ def do_info_person(self, id):
+ """
+ info_person ID
+
+ Get information about a person.
+ """
+
+ person = self.get_object(id, 'get_person')
+ if not person:
+ print >>sys.stderr, 'Person not found: %s' % id
+ return 3
+
+ self.start_format()
+ self.format(person)
+ self.flush()
+
+ def do_search_movie(self, pattern):
+ """
+ search [PATTERN]
+
+ Search movies.
+ """
+ self.change_path([u'search movies'])
+ if not pattern:
+ pattern = None
+
+ self.start_format(pattern=pattern)
+ for backend, movie in self.do('iter_movies', pattern=pattern):
+ self.cached_format(movie)
+ self.flush()
+
+ def do_search_person(self, pattern):
+ """
+ search [PATTERN]
+
+ Search persons.
+ """
+ self.change_path([u'search persons'])
+ if not pattern:
+ pattern = None
+
+ self.start_format(pattern=pattern)
+ for backend, person in self.do('iter_persons', pattern=pattern):
+ self.cached_format(person)
+ self.flush()
+
+ def do_casting(self, movie_id):
+ """
+ casting movie_id
+
+ List persons related to a movie.
+ """
+ self.change_path([u'casting'])
+ for backend, person in self.do('iter_movie_persons', movie_id):
+ self.cached_format(person)
+ self.flush()
+
+ def do_filmography(self, person_id):
+ """
+ filmography person_id
+
+ List movies of a person.
+ """
+ self.change_path([u'filmography'])
+ for backend, movie in self.do('iter_person_movies', person_id):
+ self.cached_format(movie)
+ self.flush()
diff --git a/weboob/applications/suboob/suboob.py b/weboob/applications/suboob/suboob.py
index ac7054db..6edd960f 100644
--- a/weboob/applications/suboob/suboob.py
+++ b/weboob/applications/suboob/suboob.py
@@ -64,7 +64,7 @@ class SubtitleListFormatter(PrettyFormatter):
class Suboob(ReplApplication):
APPNAME = 'suboob'
VERSION = '0.f'
- COPYRIGHT = 'Copyright(C) 2010-2012 Julien Veyssier'
+ COPYRIGHT = 'Copyright(C) 2013 Julien Veyssier'
DESCRIPTION = "Console application allowing to search for subtitles on various services " \
"and download them."
SHORT_DESCRIPTION = "search and download subtitles"
diff --git a/weboob/capabilities/cinema.py b/weboob/capabilities/cinema.py
index c2294e77..702a3954 100644
--- a/weboob/capabilities/cinema.py
+++ b/weboob/capabilities/cinema.py
@@ -49,7 +49,6 @@ class Person(CapBaseObject):
name = StringField('Star name of a person')
real_name = StringField('Real name of a person')
birth_date = DateField('Birth date of a person')
- age = IntField('Current age of a person in year')
birth_place = StringField('City and country of birth of a person')
gender = StringField('Gender of a person')
nationality = StringField('Nationality of a person')
@@ -96,7 +95,7 @@ class ICapCinema(IBaseCap):
"""
raise NotImplementedError()
- def get_movie_actors(self, _id):
+ def iter_movie_persons(self, _id):
"""
Get the list of persons who are related to a movie.
@@ -126,7 +125,7 @@ class ICapCinema(IBaseCap):
"""
raise NotImplementedError()
- def get_person_movies(self, _id):
+ def iter_person_movies(self, _id):
"""
Get the list of movies related to a person.