From 76fe4a0ac4858302ee5deedc7470d19631841bd1 Mon Sep 17 00:00:00 2001 From: BART! Date: Sat, 17 Jun 2023 15:07:36 +0200 Subject: [PATCH 01/12] chore(deps): update all deps --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b27fd9d..d4aff23 100644 --- a/package.json +++ b/package.json @@ -85,4 +85,4 @@ "lint-staged": { "*.ts": "eslint --cache --fix" } -} +} \ No newline at end of file From b6364ef67b95f619a58364f91c2b3a7ad3c4d8bc Mon Sep 17 00:00:00 2001 From: BART! Date: Sat, 17 Jun 2023 14:57:24 +0200 Subject: [PATCH 02/12] feat(cinemas): parse cinemas [kickoff] --- demo.ts | 5 +- src/helpers/cinema.helper.ts | 93 ++++++++++++++++++++++++++++++ src/index.ts | 19 +++++- src/interfaces/cinema.interface.ts | 17 ++++++ src/services/cinema.service.ts | 43 ++++++++++++++ src/vars.ts | 7 +++ 6 files changed, 180 insertions(+), 4 deletions(-) create mode 100644 src/helpers/cinema.helper.ts create mode 100644 src/interfaces/cinema.interface.ts create mode 100644 src/services/cinema.service.ts diff --git a/demo.ts b/demo.ts index d3f58fd..c10e1b9 100644 --- a/demo.ts +++ b/demo.ts @@ -2,12 +2,13 @@ import { csfd } from './src'; // Parse movie -csfd.movie(10135).then((movie) => console.log(movie)); +csfd.cinema(1).then((cinema) => console.log(cinema)); +// csfd.movie(10135).then((movie) => console.log(movie)); // csfd.search('matrix').then((search) => console.log(search)); // Parse creator -csfd.creator(2120).then((creator) => console.log(creator)); +// csfd.creator(2120).then((creator) => console.log(creator)); /** * USER RATINGS diff --git a/src/helpers/cinema.helper.ts b/src/helpers/cinema.helper.ts new file mode 100644 index 0000000..4d1ef6a --- /dev/null +++ b/src/helpers/cinema.helper.ts @@ -0,0 +1,93 @@ +import { CSFDCinemaMeta, CSFDCinemaMovie } from 'interfaces/cinema.interface'; +import { HTMLElement } from 'node-html-parser'; +import { CSFDColorRating } from '../interfaces/global'; +import { Colors } from '../interfaces/user-ratings.interface'; +import { parseColor, parseIdFromUrl } from './global.helper'; + +export const getColorRating = (el: HTMLElement): CSFDColorRating => { + return parseColor(el?.classNames.split(' ').pop() as Colors); +}; + +export const getId = (url: string): number => { + if (url) { + return parseIdFromUrl(url); + } + return null; +}; + +export const getName = (el: HTMLElement | null): string => { + return el.querySelector('h1').innerText.trim(); +}; + +export const getCoords = (el: HTMLElement | null): { lat: number; lng: number } => { + const link = el + ?.querySelector('.box-header img[alt="Google Maps"]') + .closest('a') + .getAttribute('href'); + const coords = link.split('q=')[1].split(','); + const [lat, lng] = coords; + return { lat: +lat, lng: +lng }; +}; + +export const getCinemaUrl = (el: HTMLElement | null): string => { + return el.querySelector('.box-header .cinema-logo a')?.attributes.href; +}; + +export const parseCinema = (el: HTMLElement | null): { city: string; name: string } => { + const title = el.querySelector('.box-header h2').innerText.trim(); + const [city, name] = title.split(' - '); + return { city, name }; +}; + +export const getGroupedFilmsByDate = (el: HTMLElement | null): any => { + const divs = el.querySelectorAll(':scope > div'); + const getDatesAndFilms = divs + .map((_, index) => index) + .filter((index) => index % 2 === 0) + .map((index) => { + const [date, films] = divs.slice(index, index + 2); + const dateText = date?.innerText.trim(); + return { date: dateText, films: getFilms('', films) }; + }); + + return getDatesAndFilms; +}; + +export const getFilms = (date: string, el: HTMLElement | null): CSFDCinemaMovie[] => { + const filmNodes = el.querySelectorAll('.cinema-table tr'); + + const films = filmNodes.map((filmNode) => { + const url = filmNode.querySelector('td.name h3 a')?.attributes.href; + const id = getId(url); + const title = filmNode.querySelector('.name h3')?.text.trim(); + const colorRating = getColorRating(filmNode.querySelector('.name .icon')); + const showTimes = filmNode.querySelectorAll('.td-time')?.map((x) => x.textContent.trim()); + const meta = filmNode.querySelectorAll('.td-title span')?.map((x) => x.text.trim()); + + return { + id, + title, + url, + colorRating, + showTimes, + meta: parseMeta(meta) + }; + }); + return films; +}; + +export const parseMeta = (meta: string[]): CSFDCinemaMeta[] => { + const metaConvert: CSFDCinemaMeta[] = []; + + for (const element of meta) { + if (element === 'T') { + metaConvert.push('subtitles'); + } else if (element === 'D') { + metaConvert.push('dubbing'); + } else { + metaConvert.push(element); + } + } + + return metaConvert; +}; diff --git a/src/index.ts b/src/index.ts index a03b40f..fa7fdbe 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,9 @@ +import { CSFDCinema } from 'interfaces/cinema.interface'; import { CSFDCreator } from './interfaces/creator.interface'; import { CSFDMovie } from './interfaces/movie.interface'; import { CSFDSearch } from './interfaces/search.interface'; import { CSFDUserRatingConfig, CSFDUserRatings } from './interfaces/user-ratings.interface'; +import { CinemaScraper } from './services/cinema.service'; import { CreatorScraper } from './services/creator.service'; import { MovieScraper } from './services/movie.service'; import { SearchScraper } from './services/search.service'; @@ -12,7 +14,8 @@ export class Csfd { private userRatingsService: UserRatingsScraper, private movieService: MovieScraper, private creatorService: CreatorScraper, - private searchService: SearchScraper + private searchService: SearchScraper, + private cinemaService: CinemaScraper ) {} public async userRatings( @@ -33,10 +36,22 @@ export class Csfd { public async search(text: string): Promise { return this.searchService.search(text); } + + public async cinema(district: number): Promise { + return this.cinemaService.cinemas(+district); + } } const movieScraper = new MovieScraper(); const userRatingsScraper = new UserRatingsScraper(); +const cinemaScraper = new CinemaScraper(); const creatorScraper = new CreatorScraper(); const searchScraper = new SearchScraper(); -export const csfd = new Csfd(userRatingsScraper, movieScraper, creatorScraper, searchScraper); + +export const csfd = new Csfd( + userRatingsScraper, + movieScraper, + creatorScraper, + searchScraper, + cinemaScraper +); diff --git a/src/interfaces/cinema.interface.ts b/src/interfaces/cinema.interface.ts new file mode 100644 index 0000000..7225dc6 --- /dev/null +++ b/src/interfaces/cinema.interface.ts @@ -0,0 +1,17 @@ +import { CSFDMovieListItem } from './movie.interface'; + +export interface CSFDCinema { + name: string; + city: string; + url: string; + coords: { lat: number; lng: number }; + region?: string; + screenings: CSFDCinemaMovie[]; +} + +export interface CSFDCinemaMovie extends CSFDMovieListItem { + meta: CSFDCinemaMeta[]; + showTimes: string[]; +} + +export type CSFDCinemaMeta = 'dubbing' | '3D' | 'subtitles' | string; diff --git a/src/services/cinema.service.ts b/src/services/cinema.service.ts new file mode 100644 index 0000000..22aaf83 --- /dev/null +++ b/src/services/cinema.service.ts @@ -0,0 +1,43 @@ +import { HTMLElement, parse } from 'node-html-parser'; +import { fetchPage } from '../fetchers'; +import { CSFDCinema } from '../interfaces/cinema.interface'; +import { cinemasUrl } from '../vars'; +import { + getCinemaUrl, + getCoords, + getGroupedFilmsByDate, + parseCinema +} from './../helpers/cinema.helper'; + +export class CinemaScraper { + private cinema: CSFDCinema[]; + + public async cinemas(district: number): Promise { + const url = cinemasUrl(district, 'week'); + const response = await fetchPage(url); + + const cinemasHtml = parse(response); + + const contentNode = cinemasHtml.querySelectorAll('#snippet--cinemas section.box'); + + this.buildCinemas(contentNode); + return this.cinema; + } + + private buildCinemas(contentNode: HTMLElement[]) { + const cinemas: CSFDCinema[] = []; + + contentNode.map((x) => { + const cinema = { + name: parseCinema(x)?.name, + city: parseCinema(x)?.city, + url: getCinemaUrl(x), + coords: getCoords(x), + screenings: getGroupedFilmsByDate(x) + }; + cinemas.push(cinema); + }); + + this.cinema = cinemas; + } +} diff --git a/src/vars.ts b/src/vars.ts index 673a3d1..f92bb1e 100644 --- a/src/vars.ts +++ b/src/vars.ts @@ -9,5 +9,12 @@ export const movieUrl = (movie: number): string => export const creatorUrl = (creator: number | string): string => `https://www.csfd.cz/tvurce/${encodeURIComponent(creator)}`; +export const cinemasUrl = ( + district: number | string = 1, + period: 'today' | 'weekend' | 'week' | 'tomorrow' | 'month' = 'today' +): string => { + return `https://www.csfd.cz/kino/?period=${period}&district=${district}`; +}; + export const searchUrl = (text: string): string => `https://www.csfd.cz/hledat/?q=${encodeURIComponent(text)}`; From 659e7d945af18ac791d21f2c09b59602f99d6b4d Mon Sep 17 00:00:00 2001 From: BART! Date: Fri, 21 Jul 2023 07:47:11 +0200 Subject: [PATCH 03/12] feat(cinemas): parse cinemas --- src/helpers/cinema.helper.ts | 13 +++++++++++-- src/index.ts | 6 +++--- src/interfaces/cinema.interface.ts | 10 +++++++++- src/services/cinema.service.ts | 13 +++++++++---- src/vars.ts | 7 +++---- 5 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/helpers/cinema.helper.ts b/src/helpers/cinema.helper.ts index 4d1ef6a..060cd0f 100644 --- a/src/helpers/cinema.helper.ts +++ b/src/helpers/cinema.helper.ts @@ -1,4 +1,8 @@ -import { CSFDCinemaMeta, CSFDCinemaMovie } from 'interfaces/cinema.interface'; +import { + CSFDCinemaGroupedFilmsByDate, + CSFDCinemaMeta, + CSFDCinemaMovie +} from 'interfaces/cinema.interface'; import { HTMLElement } from 'node-html-parser'; import { CSFDColorRating } from '../interfaces/global'; import { Colors } from '../interfaces/user-ratings.interface'; @@ -8,6 +12,11 @@ export const getColorRating = (el: HTMLElement): CSFDColorRating => { return parseColor(el?.classNames.split(' ').pop() as Colors); }; +export const getCinemaId = (el: HTMLElement | null): number => { + const id = el?.id?.split('-')[1]; + return +id; +}; + export const getId = (url: string): number => { if (url) { return parseIdFromUrl(url); @@ -39,7 +48,7 @@ export const parseCinema = (el: HTMLElement | null): { city: string; name: strin return { city, name }; }; -export const getGroupedFilmsByDate = (el: HTMLElement | null): any => { +export const getGroupedFilmsByDate = (el: HTMLElement | null): CSFDCinemaGroupedFilmsByDate[] => { const divs = el.querySelectorAll(':scope > div'); const getDatesAndFilms = divs .map((_, index) => index) diff --git a/src/index.ts b/src/index.ts index fa7fdbe..01ff266 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ -import { CSFDCinema } from 'interfaces/cinema.interface'; +import { CSFDCinema, CSFDCinemaPeriod } from 'interfaces/cinema.interface'; import { CSFDCreator } from './interfaces/creator.interface'; import { CSFDMovie } from './interfaces/movie.interface'; import { CSFDSearch } from './interfaces/search.interface'; @@ -37,8 +37,8 @@ export class Csfd { return this.searchService.search(text); } - public async cinema(district: number): Promise { - return this.cinemaService.cinemas(+district); + public async cinema(district: number, period: CSFDCinemaPeriod): Promise { + return this.cinemaService.cinemas(+district, period); } } diff --git a/src/interfaces/cinema.interface.ts b/src/interfaces/cinema.interface.ts index 7225dc6..d09f822 100644 --- a/src/interfaces/cinema.interface.ts +++ b/src/interfaces/cinema.interface.ts @@ -1,12 +1,18 @@ import { CSFDMovieListItem } from './movie.interface'; export interface CSFDCinema { + id: number; name: string; city: string; url: string; coords: { lat: number; lng: number }; region?: string; - screenings: CSFDCinemaMovie[]; + screenings: CSFDCinemaGroupedFilmsByDate[]; +} + +export interface CSFDCinemaGroupedFilmsByDate { + date: string; + films: CSFDCinemaMovie[]; } export interface CSFDCinemaMovie extends CSFDMovieListItem { @@ -15,3 +21,5 @@ export interface CSFDCinemaMovie extends CSFDMovieListItem { } export type CSFDCinemaMeta = 'dubbing' | '3D' | 'subtitles' | string; + +export type CSFDCinemaPeriod = 'today' | 'weekend' | 'week' | 'tomorrow' | 'month'; diff --git a/src/services/cinema.service.ts b/src/services/cinema.service.ts index 22aaf83..3f024de 100644 --- a/src/services/cinema.service.ts +++ b/src/services/cinema.service.ts @@ -1,8 +1,9 @@ import { HTMLElement, parse } from 'node-html-parser'; import { fetchPage } from '../fetchers'; -import { CSFDCinema } from '../interfaces/cinema.interface'; +import { CSFDCinema, CSFDCinemaPeriod } from '../interfaces/cinema.interface'; import { cinemasUrl } from '../vars'; import { + getCinemaId, getCinemaUrl, getCoords, getGroupedFilmsByDate, @@ -12,8 +13,11 @@ import { export class CinemaScraper { private cinema: CSFDCinema[]; - public async cinemas(district: number): Promise { - const url = cinemasUrl(district, 'week'); + public async cinemas( + district: number = 1, + period: CSFDCinemaPeriod = 'today' + ): Promise { + const url = cinemasUrl(district, period); const response = await fetchPage(url); const cinemasHtml = parse(response); @@ -28,7 +32,8 @@ export class CinemaScraper { const cinemas: CSFDCinema[] = []; contentNode.map((x) => { - const cinema = { + const cinema: CSFDCinema = { + id: getCinemaId(x), name: parseCinema(x)?.name, city: parseCinema(x)?.city, url: getCinemaUrl(x), diff --git a/src/vars.ts b/src/vars.ts index f92bb1e..f713e9d 100644 --- a/src/vars.ts +++ b/src/vars.ts @@ -1,3 +1,5 @@ +import { CSFDCinemaPeriod } from 'interfaces/cinema.interface'; + export const userRatingsUrl = (user: string | number, page?: number): string => `https://www.csfd.cz/uzivatel/${encodeURIComponent(user)}/hodnoceni/${ page ? '?page=' + page : '' @@ -9,10 +11,7 @@ export const movieUrl = (movie: number): string => export const creatorUrl = (creator: number | string): string => `https://www.csfd.cz/tvurce/${encodeURIComponent(creator)}`; -export const cinemasUrl = ( - district: number | string = 1, - period: 'today' | 'weekend' | 'week' | 'tomorrow' | 'month' = 'today' -): string => { +export const cinemasUrl = (district: number | string, period: CSFDCinemaPeriod): string => { return `https://www.csfd.cz/kino/?period=${period}&district=${district}`; }; From 99aa00d648abb9bea492db56c1b35c4dd592b840 Mon Sep 17 00:00:00 2001 From: BART! Date: Sun, 21 Jul 2024 11:23:49 +0200 Subject: [PATCH 04/12] reafactor(cinemas): temp --- demo.ts | 2 +- src/helpers/cinema.helper.ts | 2 +- tests/cinema.helper.test.ts | 67 + ...etchers.test.ts => fetchers.test.ts-depre} | 0 tests/mocks/cinema.html.ts | 11046 ++++++++++++++++ ...ings.test.ts => user-ratings.test.ts-depr} | 0 6 files changed, 11115 insertions(+), 2 deletions(-) create mode 100644 tests/cinema.helper.test.ts rename tests/{fetchers.test.ts => fetchers.test.ts-depre} (100%) create mode 100644 tests/mocks/cinema.html.ts rename tests/{user-ratings.test.ts => user-ratings.test.ts-depr} (100%) diff --git a/demo.ts b/demo.ts index c10e1b9..556f0a1 100644 --- a/demo.ts +++ b/demo.ts @@ -2,7 +2,7 @@ import { csfd } from './src'; // Parse movie -csfd.cinema(1).then((cinema) => console.log(cinema)); +csfd.cinema(1, 'today').then((cinema) => console.log(cinema)); // csfd.movie(10135).then((movie) => console.log(movie)); // csfd.search('matrix').then((search) => console.log(search)); diff --git a/src/helpers/cinema.helper.ts b/src/helpers/cinema.helper.ts index 060cd0f..c2cd1c5 100644 --- a/src/helpers/cinema.helper.ts +++ b/src/helpers/cinema.helper.ts @@ -39,7 +39,7 @@ export const getCoords = (el: HTMLElement | null): { lat: number; lng: number } }; export const getCinemaUrl = (el: HTMLElement | null): string => { - return el.querySelector('.box-header .cinema-logo a')?.attributes.href; + return el.querySelector('.box-header .cinema-logo a')?.attributes.href ?? ''; }; export const parseCinema = (el: HTMLElement | null): { city: string; name: string } => { diff --git a/tests/cinema.helper.test.ts b/tests/cinema.helper.test.ts new file mode 100644 index 0000000..2fc79c8 --- /dev/null +++ b/tests/cinema.helper.test.ts @@ -0,0 +1,67 @@ +import { HTMLElement, parse } from 'node-html-parser'; +import { describe, expect, test } from 'vitest'; + +import { + getCinemaId, + getCinemaUrl, + getCoords, + getGroupedFilmsByDate, + parseCinema +} from './../src/helpers/cinema.helper'; +import { cinemaMock } from './mocks/cinema.html'; + +const html = parse(cinemaMock); + +const contentNode: HTMLElement[] = html.querySelectorAll('#snippet--cinemas section.box'); + +describe('Cinema info', () => { + test('cinemaId', () => { + const item = getCinemaId(contentNode[0]); + expect(item).toEqual(110); + }); + + test('cinemaUrl 0', () => { + const item = getCinemaUrl(contentNode[0]); + expect(item).toEqual('http://www.cinestar.cz/cz/praha5/domu'); + }); + + test('cinemaUrl 2', () => { + const item = getCinemaUrl(contentNode[2]); + expect(item).toEqual(''); + }); + + test('cinemaCoords', () => { + const item = getCoords(contentNode[2]); + expect(item).toEqual({ + lat: 50.1000546, + lng: 14.4301766 + }); + }); + + test('parseCinema', () => { + const item = parseCinema(contentNode[2]); + expect(item).toEqual({ + city: 'Praha', + name: 'Bio Oko' + }); + }); +}); + +describe('Cinema films by date', () => { + test('getGroupedFilmsByDate', () => { + const item = getGroupedFilmsByDate(contentNode[2]); + expect(item[0]?.date).toEqual('sobota 13.01.2024'); + expect(item[0]?.films[0].title).toEqual('Cesta do fantazie'); + }); + + test('getFilms', () => { + const filmNode = contentNode[0].querySelectorAll('.cinema-table tr'); + + console.log('aas', filmNode[0].querySelectorAll('.td-title span')); + const meta = filmNode[0].querySelectorAll('.td-title span')?.map((x) => x.text.trim()); + expect(meta).toEqual({ + city: 'Praha', + name: 'Bio Oko' + }); + }); +}); diff --git a/tests/fetchers.test.ts b/tests/fetchers.test.ts-depre similarity index 100% rename from tests/fetchers.test.ts rename to tests/fetchers.test.ts-depre diff --git a/tests/mocks/cinema.html.ts b/tests/mocks/cinema.html.ts new file mode 100644 index 0000000..e658718 --- /dev/null +++ b/tests/mocks/cinema.html.ts @@ -0,0 +1,11046 @@ +export const cinemaMock = ` + + + + + + Kino | Program | ČSFD.cz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+

Reklama

+
+
+
+

Reklama

+
+
+
+ +
+ + + + +
+ +
+
+

+ Kino - Program +

+
+
+ +
+
+ + + +
+
+

Dnes nejžhavější v kinech

+
+ + + +
+
+ +
+
+

+ Hledat kina v okolí +

+
+
+ +
+
+
+ +
+
+
+
+
+ + + + Vybrat filmy + + + + + +
+
+ +
+ + + +
+
+

Praha - CineStar Praha - Anděl

+ + + +
+ tel. 800 288 288, + Radlická 3179/1e, Praha + + Google Maps + + +
+
+
+ sobota 13.01.2024 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Bratři

ČSFD Sál +
+ + + + + + + + + + + 20:10 + + +
+

Tancuj Matyldo

ČSFD Sál +
+ + + + + + + 16:00 + + + + + + +
+

Zásah štěstím

ČSFD Sál +
+ T + + + + + + + + + 18:10 + + + + +
+

Aquaman a ztracené království

Gold Class +
+ D + + + + 13:00 + + + + + + + + + +
+

Ferrari

Gold Class +
+ T + + + + + + + 16:00 + + + + + 20:00 + + +
+

Napoleon

Gold Class +
+ T + + + + + + + + + + 19:00 + + + +
+

To se mi snad zdá

Gold Class +
+ T + + + + + + + + 17:15 + + + + + +
+

Wonka

Gold Class +
+ T + + + + + 14:00 + + + + + + + + +
+

Aquaman a ztracené království

+ D + + 10:10 + + + + + 15:20 + + + 17:50 + + + + + +
+

Aquaman a ztracené království

+ T + + + 12:40 + + + + + 16:40 + + + + + + 21:10 + +
+

Ferrari

+ T + + 10:10 + + 12:00 + + + 14:40 + + + + 17:20 + + 18:30 + + + 20:00 + + +
+

Hunger Games: Balada o ptácích a hadech

+ T + + + 12:50 + + + + + + + + + 20:20 + + +
+

Jedeme na teambuilding

+ + 10:00 + + 12:15 + + + 14:30 + + + 16:45 + + + + 19:00 + + + 21:15 + +
+

Její tělo

+ + 10:00 + + + + + + + 17:30 + + + + + 21:50 + +
+

Krvavý Johann

+ + + + 13:00 + + + + + + + + + 21:30 + +
+

Napoleon

+ T + + 10:20 + + + 13:30 + + + + + + + 19:10 + + + +
+

Noční koupání

+ T + + 10:50 + + + + + 15:20 + + + + + + + +
+

Pan Blake k vašim službám

+ T + + + + + + + + + + 19:50 + + + +
+

Ptáci stěhováci

+ D + + 10:10 + + 12:30 + + + 14:30 + + + 16:30 + + + + + + +
+

Přání

+ D + + 11:00 + + + 13:10 + + + 15:15 + + + 17:20 + + + + + +
+

S tebou nikdy

+ T + + 10:15 + + 12:30 + + + 14:45 + + + + 17:00 + + + 19:15 + + + +
+

Tajemství a smysl života

+ + + 12:20 + + + + 15:30 + + + + 18:40 + + + + +
+

To se mi snad zdá

+ T + + + + + + + + + + 19:30 + + + 21:45 + +
+

Trollové 3

+ D + + 10:00 + + + + + + + + + + + +
+

Wonka

+ D + + 10:00 + + 12:10 + + + 14:40 + + + + 17:10 + + + 19:40 + + + +
+

Wonka

Dolby Atmos sál +
+ T + + 10:50 + + + 13:20 + + + 15:50 + + + + 18:20 + + + 20:50 + + +
+
+
+
+
+ +
+
+

Praha - CineStar Praha - Černý Most

+ + + +
+ tel. 800 288 288, + Chlumecká 712/8, Praha + + Google Maps + + +
+
+
+ sobota 13.01.2024 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Aquaman a ztracené království

+ D + + 10:20 + + + 13:00 + + + 15:40 + + + + 18:20 + + + + +
+

Ferrari

+ T + + + + + + 15:15 + + + 17:20 + + + + 20:20 + + +
+

Hunger Games: Balada o ptácích a hadech

+ T + + + 12:00 + + + + + + + + + + +
+

Jedeme na teambuilding

+ + + 12:15 + + + 14:30 + + 15:20 + + 16:45 + + + 18:00 + + 19:00 + + 20:15 + + 21:15 + +
+

Lítá v tom

+ + + + + 14:20 + + + + + + + + +
+

Mlsné medvědí příběhy: Na pól!

+ D + + + + 13:40 + + + + + + + + + +
+

Máša a medvěd 2 - Dvojitá zábava

+ D + + 10:00 + + + + + + + + + + + +
+

Méďovy vánoce

+ D + + 11:30 + + + + + + + + + + + +
+

Napoleon

+ T + + + + + + + + + + 19:50 + + + +
+

Noční koupání

+ T + + + + + + + + + + + + 21:10 + +
+

Pan Blake k vašim službám

+ T + + + + + + + + + + + 20:00 + + +
+

Ptáci stěhováci

+ D + + 11:30 + + + 13:40 + + + 15:50 + + + 17:40 + + + + + +
+

Přání

+ D + + 10:0011:30 + + 12:10 + + + + 15:10 + + + + + + + +
+

S tebou nikdy

+ T + + + + + + + 16:30 + + + 18:45 + + + + 21:00 + +
+

To se mi snad zdá

+ T + + + + + + + + + 18:00 + + + + +
+

Trollové 3

+ D + + 10:1011:00 + + + 13:10 + + + + + + + + + +
+

Wonka

+ D + + + + 13:30 + + + + 16:00 + + + 18:30 + + + + 21:00 + +
+

Aquaman a ztracené království

Theatre Deluxe +
+ D + + + + + + + + 17:30 + + + + 20:10 + + +
+

Wonka

Theatre Deluxe +
+ D + + 10:00 + + 12:30 + + + + 15:00 + + + + + + + +
+
+
+
+ +
+
+

Praha - Bio Oko

+ + +
+ tel. 233 382 606, + Františka Křížka 460/15, Praha + + Google Maps + + +
+
+
+ sobota 13.01.2024 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Cesta do fantazie

+ D + + + + + 14:00 + + + + + + + + +
+

Ferrari

+ T + + + + + + + + + 18:50 + + + + +
+

Létání pro začátečníky

+ T + + + + + + + + + + + + 21:30 + +
+

To se mi snad zdá

+ T + + + + + + + 16:35 + + + + + + +
+

Tonda, Slávka a kouzelné světlo

+ + 10:00 + + + + + + + + + + + +
+
+
+
+ +
+
+

Praha - Cinema City Flora

+ + +
+ tel. 255 742 021, + Vinohradská 1612/149, Praha + + Google Maps + + +
+
+
+ sobota 13.01.2024 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Aquaman a ztracené království

+ D + + 10:00 + + 12:40 + + + + 15:20 + + + + 18:00 + + + + +
+

Aquaman a ztracené království

+ T + + + + + + + + + + + 20:40 + + +
+

Ferrari

+ T + + + + 13:10 + + + + + + + 19:50 + + + +
+

Jedeme na teambuilding

+ + + + + 14:30 + + + 16:50 + + + + 19:10 + + + 21:30 + +
+

Jeden gól

+ T + + + 12:50 + + + + + + + + + + +
+

Krvavý Johann

+ + + + + + + + 17:30 + + + + + 21:50 + +
+

Noční koupání

+ T + + 10:30 + + + + + 15:10 + + + + + 19:40 + + + +
+

Pan Blake k vašim službám

+ T + + 10:45 + + + + + 15:50 + + + + 18:20 + + + 20:50 + + +
+

Ptáci stěhováci

+ D + + 10:1011:10 + + + 13:20 + + + 15:30 + + + 17:40 + + + + + +
+

Přání

+ D + + 10:10 + + 12:20 + + + + + + + + + + +
+

S tebou nikdy

+ T + + 10:20 + + 12:30 + + + 14:50 + + + + 17:00 + + + 19:10 + + + 21:20 + +
+

To se mi snad zdá

+ T + + + + + 14:20 + + + + + 18:50 + + + + 21:10 + +
+

Wonka

+ D + + 10:20 + + 12:50 + + + + 15:20 + + + 17:50 + + + + + +
+

Wonka

+ T + + + + + + + + + + + 20:20 + + +
+

Zásah štěstím

+ T + + + 12:15 + + + + + 16:40 + + + + + + +
+

Aquaman a ztracené království

IMAX +
+ T, + 3D + + + + + + + 16:20 + + + + 19:00 + + + 21:30 + +
+

Wonka

IMAX +
+ T + + 11:20 + + + 13:50 + + + + + + + + + +
+
+
+
+ +
+
+

Praha - Cinema City Chodov

+ + +
+ tel. 255 742 021, + Roztylská 2321/19, Praha + + Google Maps + + +
+
+
+ sobota 13.01.2024 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Aquaman a ztracené království

+ D + + 11:10 + + + 13:50 + + + + 16:30 + + + + 19:10 + + + +
+

Aquaman a ztracené království

+ T + + + + + + + + + 18:15 + + + + 21:00 + +
+

Chlapec a volavka

+ D + + 11:30 + + + + + + + + + + + +
+

Chlapec a volavka

+ T + + + + + 14:10 + + + + + + + + +
+

Den díkůvzdání

+ T + + + + + + + + + + + + 21:50 + +
+

Ferrari

+ T + + 11:20 + + + + 14:00 + + + 16:40 + + + + 19:20 + + + + 22:00 +
+

Godzilla Minus One

+ T + + + + + + + + + + 19:30 + + + +
+

Hunger Games: Balada o ptácích a hadech

+ T + + + + + + + 16:50 + + + + + + +
+

Jedeme na teambuilding

+ + 11:00 + + + 13:20 + + + 15:40 + + + 17:10 + + 18:00 + + 19:30 + + 20:20 + + 21:50 + +
+

Jeden gól

+ T + + + + + + 15:00 + + + + + + + 21:40 + +
+

Krvavý Johann

+ + + + + + + + + + 19:50 + + + 21:50 + +
+

Lítá v tom

+ + + 12:50 + + + + 15:00 + + + + + + + +
+

Mlsné medvědí příběhy: Na pól!

+ + 10:20 + + + + + + + + + + + +
+

Méďovy vánoce

+ D + + 11:00 + + + + + + + + + + + +
+

Napoleon

+ T + + + 12:20 + + + + + + + + + 20:30 + + +
+

Noční koupání

+ T + + + + + + 15:30 + + + 17:40 + + + + + + 22:10 +
+

Pan Blake k vašim službám

+ T + + + + + + 15:20 + + + 17:50 + + + + 20:20 + + +
+

Ptáci stěhováci

+ D + + 10:0011:00 + + 12:00 + + 13:10 + + 14:00 + + + 16:10 + + 17:20 + + + + + +
+

Přání

+ D + + 10:4011:50 + + 12:50 + + + 14:00 + + + 16:10 + + + + + + +
+

S tebou nikdy

+ T + + 10:40 + + 12:50 + + + + 15:00 + + + 17:10 + + + 19:20 + + + 21:30 + +
+

Tlapková patrola ve velkofilmu

+ D + + 10:20 + + + + + + + + + + + +
+

To se mi snad zdá

+ T + + 10:00 + + 12:10 + + + 14:20 + + + 16:30 + + + 18:40 + + + 20:50 + + +
+

Wonka

+ D + + 10:0011:40 + + 12:30 + + + 14:10 + + + 16:40 + + + + 19:10 + + + +
+

Zásah štěstím

+ T + + + + + + + + + 18:20 + + + + +
+

Aquaman a ztracené království

VIP +
+ D + + + + + 14:00 + + 15:50 + + + + + + + +
+

Ferrari

VIP +
+ T + + + + + + + + + + + 20:50 + + +
+

Jedeme na teambuilding

VIP +
+ + + + + + + + + + 19:00 + + + 21:20 + +
+

Noční koupání

VIP +
+ T + + + + + + + + + + + + 21:50 + +
+

Pan Blake k vašim službám

VIP +
+ T + + + + + + + 16:40 + + + + + + +
+

S tebou nikdy

VIP +
+ T + + + + + + + + + 18:30 + + + + +
+

To se mi snad zdá

VIP +
+ T + + + + + + + + + + 19:40 + + + +
+

Wonka

VIP +
+ D + + + + + 14:40 + + + + 17:10 + + + + + +
+

Aquaman a ztracené království

4DX sál +
+ D, + 3D + + + + + + 15:50 + + + + 18:30 + + + + +
+

Noční koupání

4DX sál +
+ T + + + + + + + + + + + + 21:10 + +
+

Ptáci stěhováci

4DX sál +
+ D + + 11:10 + + + + + + + + + + + +
+

Wonka

4DX sál +
+ D + + + + 13:20 + + + + + + + + + +
+

Wonka

Dolby Atmos sál +
+ T + + + + + + 15:00 + + + 17:30 + + + + 20:00 + + +
+
+
+
+ +
+
+

Praha - Cinema City Letňany

+ + +
+ tel. 255 742 021, + Veselská 663, Praha + + Google Maps + + +
+
+
+ sobota 13.01.2024 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Aquaman a ztracené království

+ D, + 3D + + 11:20 + + + + 14:00 + + + + + + + + +
+

Aquaman a ztracené království

+ D + + + 12:00 + + + 14:40 + + + + 17:20 + + + + 20:00 + + +
+

Aquaman a ztracené království

+ T + + + + + + + + + + + + 21:15 + +
+

Chlapec a volavka

+ D + + + + 13:00 + + + + + + + + + +
+

Ferrari

+ T + + + + + + 15:40 + + + + 18:20 + + + + 21:00 + +
+

Hunger Games: Balada o ptácích a hadech

+ T + + + + + + + + + 18:45 + + + + +
+

Jedeme na teambuilding

+ + + 12:10 + + + 14:30 + + + 16:50 + + 17:40 + + + 19:10 + + 20:00 + + 21:30 + + 22:15 +
+

Jeden gól

+ T + + + + + + + 16:45 + + + + + + 21:50 + +
+

Krvavý Johann

+ + + + + + + + + + 19:20 + + + 21:20 + +
+

Lítá v tom

+ + + + + 14:40 + + + + + + + + +
+

Méďovy vánoce

+ D + + 11:10 + + 12:40 + + + + + + + + + + +
+

Noční koupání

+ T + + + + + + + + + + 19:00 + + + 21:10 + +
+

Pan Blake k vašim službám

+ T + + + + + + 15:40 + + + + 18:00 + + + 20:20 + + +
+

Ptáci stěhováci

+ D + + 11:10 + + 12:10 + + 13:20 + + 14:20 + + 15:30 + + 16:30 + + + + 19:10 + + + +
+

Přání

+ D + + 11:30 + + 12:50 + + + + 15:00 + + + 17:10 + + + + + +
+

S tebou nikdy

+ T + + 11:00 + + + 13:10 + + + 15:20 + + + 17:30 + + + 19:40 + + + 21:50 + +
+

To se mi snad zdá

+ T + + + + 13:40 + + + + 16:00 + + + 18:20 + + + 20:40 + + +
+

Trollové 3

+ D + + 11:40 + + + 13:40 + + + + + + + + + +
+

Wonka

+ D + + 11:00 + + + 13:30 + + + + 16:00 + + + 18:30 + + + + +
+

Wonka

+ T + + + + + + + + + + + + 21:00 + +
+

Zásah štěstím

+ T + + + + + + + 16:40 + + + + + + +
+
+
+
+ +
+
+

Praha - Cinema City Nový Smíchov

+ + +
+ tel. 255 742 021, + Plzeňská 233/8, Praha + + Google Maps + + +
+
+
+ sobota 13.01.2024 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Aquaman a ztracené království

+ D + + + 12:40 + + + + 15:20 + + + + 18:00 + + + + +
+

Aquaman a ztracené království

+ T + + + + + 14:40 + + + + + + + + 21:30 + +
+

Dunki

+ T + + + + + + + 16:10 + + + + + + +
+

Ferrari

+ T + + + + + + 15:00 + + + 17:20 + + + + 20:10 + + +
+

Hunger Games: Balada o ptácích a hadech

+ T + + + + 13:00 + + + + + + + 19:30 + + + +
+

Jedeme na teambuilding

+ + 11:10 + + + 13:30 + + + 15:50 + + + + 18:10 + + + 20:30 + + +
+

Jeden gól

+ T + + + + + + + + 17:40 + + + + + +
+

Krvavý Johann

+ + + + + + + + + + + 20:40 + + +
+

Lítá v tom

+ + 10:20 + + 12:30 + + + + + + + + + + +
+

Méďovy vánoce

+ D + + 10:10 + + + + + + + + + + + +
+

Napoleon

+ T + + + + + + + + + + + 20:50 + + +
+

Noční koupání

+ T + + + + + + + + + + 19:50 + + + + 22:00 +
+

Pan Blake k vašim službám

+ T + + 11:00 + + + 13:30 + + + + 16:10 + + + 18:30 + + + + 21:00 + +
+

Ptáci stěhováci

+ D + + 10:50 + + 12:10 + + + 14:20 + + + 16:30 + + + 18:40 + + + + +
+

Přání

+ D + + 10:10 + + 12:15 + + + + + + + + + + +
+

S tebou nikdy

+ T + + 10:20 + + 12:30 + + + 14:40 + + + 16:50 + + + + 19:00 + + + 21:10 + +
+

Tlapková patrola ve velkofilmu

+ D + + 10:30 + + + + + + + + + + + +
+

To se mi snad zdá

+ T + + 10:40 + + 12:50 + + + + 15:00 + + + 17:10 + + + 19:20 + + + 21:30 + +
+

Trollové 3

+ D + + 10:40 + + 12:50 + + + + + + + + + + +
+

Wonka

+ D + + 11:20 + + + 13:50 + + + + 16:20 + + + 18:50 + + + + +
+

Wonka

+ T + + + + + 14:20 + + + 16:50 + + + + + + 21:20 + +
+

Zásah štěstím

+ T + + + + + + + + + + 19:20 + + + +
+

Aquaman a ztracené království

4DX sál +
+ D, + 3D + + + + + + + + + + 19:10 + + + +
+

Noční koupání

4DX sál +
+ T + + + + + + + + + + + + 21:50 + +
+

Ptáci stěhováci

4DX sál +
+ D + + 10:00 + + 12:00 + + + + + + + + + + +
+

Wonka

4DX sál +
+ D + + + + + 14:10 + + + 16:40 + + + + + + +
+
+
+
+ +
+
+

Praha - Cinema City Slovanský dům

+ + +
+ tel. 255 742 021, + Na Příkopě 859/22, Praha + + Google Maps + + +
+
+
+ sobota 13.01.2024 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Aquaman a ztracené království

+ D + + + 12:10 + + + + + + + + + + +
+

Aquaman a ztracené království

+ T + + + + + + + 16:30 + + + + 19:10 + + + +
+

Chlapec a volavka

+ T + + + + + + + 16:40 + + + + + + +
+

Ferrari

+ T + + + 12:30 + + + + 15:15 + + + + 18:00 + + + 20:45 + + +
+

Hunger Games: Balada o ptácích a hadech

+ T + + + 12:40 + + + + + + + + + + +
+

Jedeme na teambuilding

+ + + + + + 15:30 + + + 17:50 + + + + 20:10 + + +
+

Jeden gól

+ T + + + + + + + + 17:20 + + + + + +
+

Krvavý Johann

+ + + + + + + + + + 19:40 + + + 21:40 + +
+

Lítá v tom

+ + + + + + 15:50 + + + + + + + +
+

Méďovy vánoce

+ D + + + 12:30 + + + + + + + + + + +
+

Napoleon

+ T + + + + + + + + + + + + 21:20 + +
+

Noční koupání

+ T + + + + + 14:20 + + + + + + + + 21:50 + +
+

Pan Blake k vašim službám

+ T + + + + + 14:40 + + + + 17:00 + + + 19:30 + + + + 22:00 +
+

První den mého života

+ T + + + 12:50 + + + + + + + + + + +
+

Ptáci stěhováci

+ D + + + 12:20 + + + 14:30 + + + + + + + + +
+

Přání

+ D + + + 12:30 + + + + + + + + + + +
+

S tebou nikdy

+ T + + + 12:15 + + + 14:30 + + + 16:45 + + + + 19:00 + + + 21:20 + +
+

To se mi snad zdá

+ T + + + 12:00 + + + 14:10 + + + 16:30 + + + 18:50 + + + + 21:10 + +
+

Wonka

+ T + + + + 13:00 + + + 15:40 + + + + 18:20 + + + + 21:00 + +
+

Wonka

+ D + + + + + 14:50 + + + + + + + + +
+

Zásah štěstím

+ T + + + + + + + + + + 19:10 + + + 21:20 + +
+
+
+
+ +
+
+

Praha - Cinema City Zličín

+ + +
+ tel. 257 950 966, + Řevnická 121/1, Praha + + Google Maps + + +
+
+
+ sobota 13.01.2024 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Aquaman a ztracené království

+ D + + 11:00 + + 12:30 + + + + 15:10 + + + 17:50 + + + + 20:30 + + +
+

Den díkůvzdání

+ T + + + + + + + + + + + + + 22:00 +
+

Ferrari

+ T + + + + + + + + + + + 20:00 + + +
+

Hunger Games: Balada o ptácích a hadech

+ T + + + + 13:40 + + + + 16:10 + + + + + + +
+

Jedeme na teambuilding

+ + 11:10 + + + 13:30 + + + 15:50 + + + + 18:10 + + + 20:30 + + +
+

Jeden gól

+ T + + + + + 14:40 + + + + + + + + +
+

Její tělo

+ + + + + + + + + + + 20:40 + + +
+

Krvavý Johann

+ + + + + + + + + + + + 21:45 + +
+

Lítá v tom

+ + + + 13:30 + + + 15:40 + + + 17:50 + + + + + +
+

Méďovy vánoce

+ D + + + 12:40 + + + + + + + + + + +
+

Napoleon

+ T + + + + + + + + + + 19:20 + + + +
+

Noční koupání

+ T + + + + + + + + + 18:30 + + + + +
+

Pan Blake k vašim službám

+ T + + + + + + + 16:50 + + + + 19:10 + + + 21:30 + +
+

Ptáci stěhováci

+ D + + 11:00 + + 12:00 + + 13:10 + + 14:10 + + 15:20 + + 16:20 + + 17:30 + + + 19:40 + + + +
+

Přání

+ D + + 11:50 + + + + 14:00 + + + + + + + + +
+

S tebou nikdy

+ T + + + 12:00 + + + 14:15 + + + 16:30 + + + 18:45 + + + + 21:00 + +
+

To se mi snad zdá

+ T + + + + + + + + 17:00 + + + 19:20 + + + 21:40 + +
+

Wonka

+ D + + 11:00 + + 12:00 + + + 14:30 + + + + 17:00 + + + 19:30 + + + +
+
+
+
+ +
+
+

Praha - Divadlo Za plotem

+ + +
+ tel. 284 016 515, + Ústavní 249, Praha + + Google Maps + + +
+
+
+ sobota 13.01.2024 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Pan Blake k vašim službám

+ T + + + + + + + + 17:00 + + + + + +
+

Ptáci stěhováci

+ D + + + + + 14:30 + + + + + + + + +
+

To se mi snad zdá

+ T + + + + + + + + + + 19:30 + + + +
+
+
+
+ +
+
+

Praha - Dlabačov

+ + +
+ tel. 233 102 991, + Bělohorská 125/24, Praha + + Google Maps + + +
+
+
+ sobota 13.01.2024 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Ferrari

+ T + + + + + + + + + + + 20:00 + + +
+

Krvavý Johann

+ + + + + + + + + 18:00 + + + + +
+

Ptáci stěhováci

+ D + + + + + 14:00 + + + + + + + + +
+

Wonka

+ D + + + + + + + 16:00 + + + + + + +
+
+
+
+ +
+
+

Praha - Edison Filmhub

+ + +
+ + Jeruzalémská 1321/2, Praha + + Google Maps + + +
+
+
+ sobota 13.01.2024 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Caravaggiův stín

+ T + + + + + 14:00 + + + + + + + + +
+

Chlapec a volavka

+ D + + 11:30 + + + + + + + + + + + +
+

Pan Blake k vašim službám

+ T + + + + + + + + + + 19:00 + + + +
+

První den mého života

+ T + + + + + + + 16:30 + + + + + + +
+

S tebou nikdy

+ T + + + + + + + + + + + + 21:30 + +
+
+
+
+ +
+
+

Praha - Kino Aero

+ + +
+ tel. 271 771 349, + Biskupcova 1733/31, Praha + + Google Maps + + +
+
+
+ sobota 13.01.2024 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Jak postavit sněhuláka

+ + + + + + 15:00 + + + + + + + +
+

Jak se chtěl zajíček klouzat

+ + + + + + 15:00 + + + + + + + +
+

Kubula a Kuba Kubikula ve Vařečkách a Hrncích

+ + + + + + 15:00 + + + + + + + +
+

Napoleon

+ T + + + + + + + + 17:30 + + + + + +
+

To se mi snad zdá

+ T + + + + + + + + + + + 20:30 + + +
+

Čarovné lyže

+ + + + + + 15:00 + + + + + + + +
+
+
+
+ +
+
+

Praha - Kino Atlas

+ + +
+ tel. 774 500 025, + Sokolovská 371/1, Praha + + Google Maps + + +
+
+
+ sobota 13.01.2024 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Chlapec a volavka

+ D + + + + 13:00 + + + + + + + + + +
+

Zámek v oblacích

+ T + + + + + + + + + 18:00 + + + + +
+

Její tělo

+ + + + + + + + + + 19:30 + + + +
+

Karaoke blues

+ T + + + + + + + + + + + 20:30 + + +
+

Kouzelná Beruška a Černý kocour ve filmu

+ D + + + + 13:30 + + + + + + + + + +
+

Laputa: Nebeský zámek

+ T + + + + + + 15:30 + + + + + + + +
+

Láska nebeská

+ T + + + + + + + + 17:00 + + + + + +
+

Mlsné medvědí příběhy: Na pól!

+ + + + + + 15:45 + + + + + + + +
+
+
+
+ +
+
+

Praha - Kino Lucerna

+ + +
+ tel. 224 216 972, + Vodičkova 704/36, Praha + + Google Maps + + +
+
+
+ sobota 13.01.2024 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Caravaggiův stín

+ T + + + + + + + + + 18:00 + + + + +
+

Ferrari

+ T + + + + 13:00 + + + + + + + + 20:15 + + +
+

První den mého života

+ T + + + + + + + + + + + 20:30 + + +
+

Tancuj Matyldo

+ + + + + + 15:45 + + + + + + + +
+

To se mi snad zdá

+ T + + + + + + + + + 18:15 + + + + +
+

Wonka

+ D + + + + 13:30 + + + + + + + + + +
+

Zásah štěstím

+ T + + + + + + + 16:00 + + + + + + +
+
+
+
+ +
+
+

Praha - Kino MAT

+ + +
+ tel. 224 915 765, + Karlovo nám. 285/19, Praha + + Google Maps + + +
+
+
+ sobota 13.01.2024 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Godzilla Minus One

+ T + + + + + + + + + + + 20:30 + + +
+

Mikulášovy patálie: Jak to celé začalo

+ D + + + + + 14:15 + + + + + + + + +
+

Pan Blake k vašim službám

+ T + + + + + + + + + 18:15 + + + + +
+

Zásah štěstím

+ T + + + + + + + 16:15 + + + + + + +
+
+
+
+ +
+
+

Praha - Kino Pilotů

+ + +
+ tel. 723 985 986, + Donská 168/19, Praha 10 + + Google Maps + + +
+
+
+ sobota 13.01.2024 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Anatomie pádu

+ T + + + + + + + + + + + + 21:00 + +
+

Bod obnovy

+ + + + + 14:10 + + + + + + + + +
+

Chlapec a volavka

+ D + + 10:20 + + + + + + + + + + + +
+

EOS: Klimt & Polibek

+ T + + + + + + + + + 18:00 + + + + +
+

Hotel Palace

+ T + + + + + + + + 17:30 + + + 19:30 + + + +
+

Karaoke blues

+ T + + + 12:10 + + + + + + + + + + +
+

Létání pro začátečníky

+ T + + + + + + + 16:20 + + + + + + +
+

Mlsné medvědí příběhy: Na pól!

+ + 10:30 + + + + + + + + + + + +
+

Napoleon

+ T + + + + + 14:40 + + + + + + + + +
+

Pan Blake k vašim službám

+ T + + + 12:00 + + + + + + + + + + +
+

Ptáci stěhováci

+ D + + 10:00 + + + + + + + + + + + +
+

To se mi snad zdá

+ T + + + + + + + + + + + + 21:30 + +
+

Tonda, Slávka a kouzelné světlo

+ + + + + 14:00 + + + + + + + + +
+

Umění jíst a milovat

+ T + + + + + + + + + 18:20 + + + + +
+

Wonka

+ T + + + + + + 15:45 + + + + + + + +
+

Zabijáci rozkvetlého měsíce

+ T + + + + + + + + + + 19:50 + + + +
+

Zásah štěstím

+ T + + + 12:45 + + + + + + + + + + +
+
+
+
+ +
+
+

Praha - Kino Ponrepo

+ + +
+ tel. 224 233 281, 778 522 708, + Bartolomějská 291/11, Praha + + Google Maps + + +
+
+
+ sobota 13.01.2024 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Malomocná

+ T + + + + + + + + + 18:00 + + + + +
+

Synonyma

+ T + + + + + + + + + + + 20:30 + + +
+
+
+
+ +
+
+

Praha - Kino Radotín

+ + +
+ tel. 257 910 322, + Na Výšince 875/4, Praha + + Google Maps + + +
+
+
+ sobota 13.01.2024 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Aquaman a ztracené království

+ D + + + + + + + + + + + 20:00 + + +
+

Perinbaba a dva světy

+ + + + + + + + 17:00 + + + + + +
+
+
+
+ +
+
+

Praha - Kino Světozor

+ + +
+ tel. 224 946 824, + Vodičkova 791/41, Praha + + Google Maps + + +
+
+
+ sobota 13.01.2024 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Anatomie pádu

+ T + + + + + + + + + + + 20:15 + + +
+

Chlapec a volavka

+ T + + + + + + 15:00 + + + 17:30 + + + + + +
+

Ferrari

+ T + + + + + + + 16:45 + + + + + + +
+

Jeden gól

+ T + + + + + + 15:15 + + + + + + + +
+

Karaoke blues

+ T + + + + + 14:45 + + + + + + + + +
+

Létání pro začátečníky

+ T + + + 12:45 + + + + + + + + + + +
+

Oppenheimer

+ T + + + + + + + + + + 19:30 + + + +
+

To se mi snad zdá

+ T + + + + + + + + + + + 20:30 + + +
+

Tonda, Slávka a kouzelné světlo

+ + + 12:45 + + + + + + + + + + +
+

Wonka

+ D + + + 12:30 + + + + + + + + + + +
+

Wonka

+ T + + + + + + + + + 18:00 + + + + +
+
+
+
+ +
+
+

Praha - Kino 35

+ + +
+ tel. 221 401 011, + Štěpánská 644/35, Praha + + Google Maps + + +
+
+
+ sobota 13.01.2024 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Chlapec a volavka

+ D + + + + 13:30 + + + + + + + + + +
+

Pan Blake k vašim službám

+ T + + + + + + + + + 18:00 + + + + +
+

Pat a Mat: Kutilské trampoty

+ + + 12:00 + + + + + + + + + + +
+

Wonka

+ D + + + + + + 15:45 + + + + + + + +
+

Zásah štěstím

+ T + + + + + + + + + + + 20:00 + + +
+
+
+
+ +
+
+

Praha - Komorní kino Evald

+ + +
+ tel. 221 105 225, + Národní 60/28, Praha + + Google Maps + + +
+
+
+ sobota 13.01.2024 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Pan Blake k vašim službám

+ T + + + + + + + + + + + 20:00 + + +
+

To se mi snad zdá

+ T + + + + + + + + + 18:00 + + + + +
+

Tonda, Slávka a kouzelné světlo

+ + + + + 14:00 + + + + + + + + +
+

Tři mušketýři: Milady

+ T + + + + + + 15:45 + + + + + + + +
+
+
+
+ +
+
+

Praha - Městská knihovna v Praze - Ústřední knihovna

+ + +
+ tel. 222 113 555, + Mariánské nám. 98/1, Praha 1 + + Google Maps + + +
+
+
+ sobota 13.01.2024 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Chlapec a volavka

+ D + + + + + + + + 17:00 + + + + + +
+

Srdce dubu

+ + + + + + 15:00 + + + + + + + +
+
+
+
+ +
+
+

Praha - Modřanský biograf

+ + +
+ tel. 245 008 034, + U Kina 44/1, Praha + + Google Maps + + +
+
+
+ sobota 13.01.2024 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Laputa: Nebeský zámek

+ D + + + + + + + 16:00 + + + + + + +
+

Pan Blake k vašim službám

+ T + + + + + + + + + + + 20:15 + + +
+

Ptáci stěhováci

+ D + + + + + 14:15 + + + + + + + + +
+

Zásah štěstím

+ T + + + + + + + + + 18:25 + + + + +
+
+
+
+ +
+
+

Praha - Premiere Cinemas Praha Hostivař

+ + +
+ tel. 728 682 909, + Švehlova 1391/32, Praha + + Google Maps + + +
+
+
+ sobota 13.01.2024 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Aquaman a ztracené království

Dolby Atmos sál +
+ D + + 10:40 + + + 13:10 + + + 15:40 + + + + 18:10 + + + 20:40 + + +
+

Ferrari

+ T + + + + + + 15:25 + + + + + + 20:00 + + +
+

Jedeme na teambuilding

+ D + + 10:15 + + 12:35 + + + + 15:00 + + + 17:20 + + + 19:40 + + + +
+

Krvavý Johann

+ D + + + + + + + + + + + + 21:10 + +
+

Noční koupání

+ T + + + + + + + + + + + + 21:35 + +
+

Pan Blake k vašim službám

+ T + + 10:20 + + + + 14:50 + + + + + + 19:20 + + + +
+

Ptáci stěhováci

+ D + + 10:50 + + 12:50 + + + 14:50 + + + + + + + + +
+

Přání

+ D + + 11:00 + + + 13:10 + + + + + + + + + +
+

S tebou nikdy

+ T + + + 12:40 + + + + + + 17:10 + + + + + +
+

To se mi snad zdá

+ T + + + + + + + 16:50 + + + + 19:00 + + + +
+

Trollové 3

+ D + + 10:00 + + 12:00 + + + 14:00 + + + 16:00 + + + 18:00 + + + + +
+

Wonka

+ D + + 10:10 + + 12:45 + + + + 15:15 + + + 17:50 + + + + 20:20 + + +
+

Zásah štěstím

+ T + + + + + + + + + 18:00 + + + + +
+
+
+
+ +
+
+

Praha - Přítomnost Boutique Cinema

+ + +
+ tel. 770 124 558, + Siwiecova 1, Praha 3 + + Google Maps + + +
+
+
+ sobota 13.01.2024 +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

S tebou nikdy

+ T + + + + + + + + 17:30 + + + + + +
+

To se mi snad zdá

+ T + + + + + + + + + + + 20:30 + + +
+

Wonka

+ T + + + + + 14:30 + + + + + + + + +
+
+
+
+ +
+
+
+
+
+
+ +
+
+

Reklama

+
+
+
+
+
+

Reklama

+
+
+
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ + + + + + + + + + +`; diff --git a/tests/user-ratings.test.ts b/tests/user-ratings.test.ts-depr similarity index 100% rename from tests/user-ratings.test.ts rename to tests/user-ratings.test.ts-depr From b50d7eaedaeedbf4468bad83739c08c71e485303 Mon Sep 17 00:00:00 2001 From: BART! Date: Thu, 4 Sep 2025 11:02:48 +0200 Subject: [PATCH 05/12] fix(cinemas): url + coords --- src/helpers/cinema.helper.ts | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/helpers/cinema.helper.ts b/src/helpers/cinema.helper.ts index c2cd1c5..504a112 100644 --- a/src/helpers/cinema.helper.ts +++ b/src/helpers/cinema.helper.ts @@ -29,17 +29,26 @@ export const getName = (el: HTMLElement | null): string => { }; export const getCoords = (el: HTMLElement | null): { lat: number; lng: number } => { - const link = el - ?.querySelector('.box-header img[alt="Google Maps"]') - .closest('a') - .getAttribute('href'); - const coords = link.split('q=')[1].split(','); - const [lat, lng] = coords; - return { lat: +lat, lng: +lng }; + + const linkMapsEl = el.querySelector('a[href*="q="]'); + if (!linkMapsEl) return null; + + const linkMaps = linkMapsEl.getAttribute('href'); + const [_, latLng] = linkMaps.split('q='); + + const coords = latLng.split(','); + if (coords.length !== 2) return null; + + const lat = Number(coords[0]); + const lng = Number(coords[1]); + if (Number.isFinite(lat) && Number.isFinite(lng)) { + return { lat, lng }; + } + return null; }; export const getCinemaUrl = (el: HTMLElement | null): string => { - return el.querySelector('.box-header .cinema-logo a')?.attributes.href ?? ''; + return el.querySelector('a[title="Přejít na webovou stránku kina"]')?.attributes.href ?? ''; }; export const parseCinema = (el: HTMLElement | null): { city: string; name: string } => { From 4f44ec0623fac04bb11f4d3fbb515ed71f64d8aa Mon Sep 17 00:00:00 2001 From: BART! Date: Thu, 4 Sep 2025 11:37:50 +0200 Subject: [PATCH 06/12] test: fix tests --- src/helpers/cinema.helper.ts | 2 +- tests/cinema.helper.test.ts | 25 +- tests/mocks/cinema.html.ts | 5948 +++++++++++++++++----------------- 3 files changed, 3067 insertions(+), 2908 deletions(-) diff --git a/src/helpers/cinema.helper.ts b/src/helpers/cinema.helper.ts index 504a112..deaa68d 100644 --- a/src/helpers/cinema.helper.ts +++ b/src/helpers/cinema.helper.ts @@ -64,7 +64,7 @@ export const getGroupedFilmsByDate = (el: HTMLElement | null): CSFDCinemaGrouped .filter((index) => index % 2 === 0) .map((index) => { const [date, films] = divs.slice(index, index + 2); - const dateText = date?.innerText.trim(); + const dateText = date?.firstChild?.textContent?.trim() ?? ""; return { date: dateText, films: getFilms('', films) }; }); diff --git a/tests/cinema.helper.test.ts b/tests/cinema.helper.test.ts index 2fc79c8..ffbc903 100644 --- a/tests/cinema.helper.test.ts +++ b/tests/cinema.helper.test.ts @@ -27,22 +27,22 @@ describe('Cinema info', () => { test('cinemaUrl 2', () => { const item = getCinemaUrl(contentNode[2]); - expect(item).toEqual(''); + expect(item).toEqual('http://www.cinemacity.cz'); }); test('cinemaCoords', () => { const item = getCoords(contentNode[2]); expect(item).toEqual({ - lat: 50.1000546, - lng: 14.4301766 + lat: 50.0779486, + lng: 14.4605098 }); }); test('parseCinema', () => { - const item = parseCinema(contentNode[2]); + const item = parseCinema(contentNode[10]); expect(item).toEqual({ city: 'Praha', - name: 'Bio Oko' + name: 'Kino Aero' }); }); }); @@ -50,18 +50,13 @@ describe('Cinema info', () => { describe('Cinema films by date', () => { test('getGroupedFilmsByDate', () => { const item = getGroupedFilmsByDate(contentNode[2]); - expect(item[0]?.date).toEqual('sobota 13.01.2024'); - expect(item[0]?.films[0].title).toEqual('Cesta do fantazie'); + expect(item[0]?.date).toEqual('čtvrtek 04.09.2025'); + expect(item[0]?.films[0].title).toEqual('13 dní, 13 nocí'); }); - test('getFilms', () => { + test('getSubtitles', () => { const filmNode = contentNode[0].querySelectorAll('.cinema-table tr'); - - console.log('aas', filmNode[0].querySelectorAll('.td-title span')); - const meta = filmNode[0].querySelectorAll('.td-title span')?.map((x) => x.text.trim()); - expect(meta).toEqual({ - city: 'Praha', - name: 'Bio Oko' - }); + const meta = filmNode[0].querySelector('.td-title span')?.text.trim(); + expect(meta).toEqual('T'); }); }); diff --git a/tests/mocks/cinema.html.ts b/tests/mocks/cinema.html.ts index e658718..fcb0678 100644 --- a/tests/mocks/cinema.html.ts +++ b/tests/mocks/cinema.html.ts @@ -1,70 +1,28 @@ export const cinemaMock = ` + - Kino | Program | ČSFD.cz + Kino | Program | Praha | ČSFD.cz - + + - - + - + - - - + + + + - - - + + + + - - - - - + + + + + + + + + + + + + - - +
@@ -128,15 +99,9 @@ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
- -