映画のハシゴを爆速で計画!Flutter製アプリ「えいがの時間」開発裏話
こんにちは。映画はお好きですか? 私は大好きです。休日は映画館にこもって、新作を2本、3本とハシゴするのが至福の時間です。
しかし、映画のハシゴ(連チャン鑑賞)の計画を立てるのは非常に面倒ですよね。
上映終了時間と次の開始時間が重なっていたり...
移動時間や休憩時間も考慮しないといけない
そもそもどの劇場でどの回を見るのが効率的かわからない
複数の劇場サイトを行き来して、Excelやメモ帳でパズルを解くような作業...。 「これを自動化したい!」という個人的な情熱から生まれたのが、今回紹介するFlutterアプリ
「えいがの時間」 です。


アプリの概要
「えいがの時間」 は、観たい映画を選ぶだけで、最適な鑑賞スケジュールを自動生成してくれるアプリです。
主な機能
劇場選択: よく行く劇場や現在地近くの劇場を選択。
作品選択: その日上映されている作品リストから観たいものをピックアップ。
自動生成: ボタン一つで、移動時間や休憩時間を考慮した「ハシゴ可能なスケジュール」を複数提案。
技術スタック
開発には Flutter を採用しました。 iOS/Androidの両プラットフォームに対応でき、個人開発のスピード感を出すには最適でした。
Framework: Flutter (Dart)
State Management / DI: Provider
Networking: http
Scraping: html
Local Storage: shared_preferences
Monetization: google_mobile_ads (AdMob), purchases_flutter (RevenueCat)
Analytics: firebase_analytics
設計とアーキテクチャ
個人開発とはいえ、機能拡張やメンテナンス性を考慮して、簡易的な Clean Architecture 風の構成を採用しています。
lib/
├── core/ # 共通ユーティリティなど
├── data/ # データ層 (API通信, DB, Scraping)
│ ├── data_sources/
│ ├── models/
│ └── repositories/
├── domain/ # ドメイン層 (ビジネスロジック, Entity)
│ ├── entities/
│ ├── repositories/ # Interface definition
│ └── use_cases/
└── presentation/ # プレゼンテーション層 (UI, ViewModel/Provider)
こだわりポイント:スケジュールの自動生成ロジック
このアプリの核となるのが、domain/use_cases/generate_optimal_schedules_use_case.dart にあるスケジュール生成ロジックです。
ユーザーが選んだ「観たい映画リスト」と「対象の劇場」から、以下の制約を満たす組み合わせを探索します。
時間の重複なし: 映画Aが終わってから映画Bが始まること。
インターバル: ユーザーが設定した「休憩時間(移動時間)」を確保すること。
上映順: 効率的な順序であること。
単純な総当たりだと計算量が爆発するため、上映開始時間順にソートしたり、明らかに不可能な組み合わせを早期に枝刈りするなどの工夫をしています。
対応チェーン(一部):
- TOHOシネマズ
- MOVIX
- ユナイテッド・シネマ
- 109シネマズ
- シネマサンシャイン
まとめ
「自分が欲しいものを作る」という動機で開発を始めましたが、結果的にFlutterのステート管理やアーキテクチャ、複雑なロジックの実装など、多くの学びがありました。
もし映画館のハシゴ計画に悩んでいる方がいれば、ぜひ使ってみてください!
※本記事は開発中の内容を含みます。
Discussion