diff --git a/FreeboxMoviePlanner.py b/FreeboxMoviePlanner.py index a345bcb..71cd23c 100755 --- a/FreeboxMoviePlanner.py +++ b/FreeboxMoviePlanner.py @@ -59,15 +59,14 @@ class Movie: class TVGuideScraper: - TV_GUIDE_URL = 'https://www.programme-television.org/{}?bouquet=free' + TV_GUIDE_URL = 'https://programme-tv.nouvelobs.com/programme-free/categorie-film/{}/' def findAllMovies(): movies = [] days = deque(['lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche']) offset = datetime.datetime.today().weekday() - days.rotate(-1-offset) - days.appendleft('') + days.rotate(-offset) date = datetime.date.today() for day in days: movies += TVGuideScraper._getMovies(day, date) @@ -83,32 +82,32 @@ class TVGuideScraper: r.raise_for_status() html = BeautifulSoup(r.text, 'html.parser') movies = [] - for channel in html.select('.bloc_cnt'): - if len(channel.select('em')): - for movietag in channel.find_all(TVGuideScraper._tag_is_movie): + for channel in html.select('.tab_grille'): + for movietag in channel.select('.cat-film'): + try: movie = Movie() - movie.title = \ - movietag.select('.texte_titre a')[0]['title'] - movie.genre = movietag.select('.texte_cat a')[0].string - movie.channel = channel.select('em')[0]\ - .string.replace('Programme ', '') + movie.title = movietag.select('a.titre')[0].string + movie.genre = 'Film' # Genre is not available + movie.channel = channel.select('.logo_chaine_g img')[0]\ + ['alt'].replace('Programme ','') movie.day = day.title() movie.date = datetime.date.strftime(date, '%Y-%m-%d') movie.start_time = datetime.datetime.strptime( '{} {}'.format( movie.date, - movietag.select('.horaire')[0].string + movietag.select('span.t16')[0].string ), - '%Y-%m-%d %H:%M' + '%Y-%m-%d %H.%M' ) duration = TVGuideScraper._parse_duration( - movietag.select('.texte_cat')[0] - .contents[1].strip(' \n\t()') + re.search(r'\((.*) mn\)',movietag.text).group(1) ) movie.end_time = movie.start_time + duration logging.debug('Found movie: {0!r}'.format(movie)) movies.append(movie) + except: + logging.warning('Error parsing movie from tag: {0!r}'.format(movietag)) return movies @@ -125,14 +124,8 @@ class TVGuideScraper: @staticmethod def _parse_duration(text): - match = re.match(r"((?P\d+)h)?(?P\d+)mn", text) - if not match: - error = "Could not parse duration '{}'".format(text) - logging.error(error) - raise ValueError(error) - hours = int(match.group('hours')) if match.group('hours') else 0 - minutes = int(match.group('minutes')) - return datetime.timedelta(hours=hours, minutes=minutes) + minutes = int(text) + return datetime.timedelta(minutes=minutes) class FreeboxMoviePlanner: @@ -195,7 +188,7 @@ class FreeboxMoviePlanner: "Excluding '{}'".format(channel['name']) ) else: - self.channels[channel['name']] = channel['uuid'] + self.channels[channel['name'].lower()] = channel['uuid'] else: logging.debug("Dropping '{}'".format(channel['name'])) logging.debug('Got the following channels: {}'.format(self.channels)) @@ -267,7 +260,7 @@ class FreeboxMoviePlanner: logging.info('Dropping movies on unavailable channels: {}'.format( [m for m in self.movies if m.channel not in self.channels] )) - self.movies = [m for m in self.movies if m.channel in self.channels] + self.movies = [m for m in self.movies if m.channel.lower() in self.channels] logging.debug('Kept {}'.format(self.movies)) def excludeTelevisionMovie(self): @@ -340,6 +333,11 @@ if __name__ == '__main__': action='store_true', help='Display more log messages' ) + parser.add_argument( + '-b', '--debug', + action='store_true', + help='Display even more log messages' + ) parser.add_argument( '-e', '--exclude', action='append', @@ -357,7 +355,9 @@ if __name__ == '__main__': args = parser.parse_args() print("Working the magic, please wait…") - if args.log: + if args.debug: + logging.getLogger().setLevel(logging.DEBUG) + elif args.log: logging.getLogger().setLevel(logging.INFO) if args.day: movies = TVGuideScraper._getMovies() diff --git a/Readme.md b/Readme.md index 8cf191c..2375948 100644 --- a/Readme.md +++ b/Readme.md @@ -7,16 +7,12 @@ A Python script to help you select the movies you want to record with your Freeb Introduction --- -**Note du 11 janvier 2025 :** après 6 ans de bons et loyaux services, ce programme ne fonctionne plus. Le site que j’utilisais à totalement changé sont interface graphique et le programme ne fonctionne plus. Je ne regarde plus assez de films et je n’ai donc pas l’intention de l’adapter à court terme. Merci. - ----- - **FreeMoviePlanner** est un outil qui vous facilite la plannification d'enregistrements avec votre *Freebox*. Concrètement, l'outil effectue les opérations suivantes : - * Récupérer les film de la semaine à partir du [planning *Télé 7 Jours*](https://www.programme-television.org/?bouquet=free) + * Récupérer les film de la semaine à partir du [planning *NouvelObs*](https://programme-tv.nouvelobs.com/programme-free/categorie-film/) * Retirer les chaînes auxquelles vous n'avez pas accès * Trouver les notes des films sur [*TMDb*](https://www.themoviedb.org/) (*The Movie Database*) * Exclure les films en dessous d'une certaine note (paramétrable) @@ -74,6 +70,7 @@ optional arguments: -h, --help show this help message and exit -d, --day Search movies for current day only instead of a full week -l, --log Display more log messages + -b, --debug Display even more log messages -e EXCLUDE, --exclude EXCLUDE Exclude the following Channel -x EXCLUDE_DIRECTORY, --exclude-directory EXCLUDE_DIRECTORY