尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
A modern, responsive web application for planning your film festival schedule with multiple viewing modes and smart optimization. Browse films in cards, table, or list view, manage screenings, optimize your schedule, and export to iCal or PDF. Fully accessible with keyboard navigation and screen reader support.查看完整 README ↗A modern, responsive web application for planning your film festival schedule with multiple viewing modes and smart optimization. Browse films in cards, table, or list view, manage screenings, optimize your schedule, and export to iCal or PDF. Fully accessible with keyboard navigation and screen reader support.
Key Features: Multiple view types • Smart schedule optimization • Conflict detection • Mobile-optimized • iCal & PDF export • Bilingual support (FI/EN) • Dark mode • Per-language festival page links • Themes, keywords, age ratings, countries & release years • Theme, keyword & age filtering
.ics file to import into any calendar appprefers-reduced-motion user preferenceThe application loads festival data dynamically, so it must be served via a web server (not opened directly as a local file).
# Clone the repository
git clone <repository-url>
cd film-schedule-planner
# Start a local web server (choose one):
# Python 3
python -m http.server 8000
# Python 2
python -m SimpleHTTPServer 8000
# Node.js (if you have npx)
npx serve
# PHP
php -S localhost:8000
# Then open in browser:
# http://localhost:8000
film-schedule-planner/
├── index.html # Main HTML structure
├── styles.css # All styling
├── script.js # Application logic
├── data/
│ ├── festivals.json # List of available festivals
│ ├── nightvisions_spring2026.json # Night Visions Spring 2026 data
│ ├── templates/
│ │ ├── template_films.csv # CSV template for film data
│ │ └── template_screenings.csv # CSV template for screenings
│ └── archive/ # Archived past festival data
├── scripts/
│ ├── csv_to_json.py # CSV to JSON converter
│ └── README.md # Data generation guide
└── README.md # This file
Adding your own festival data is easy! Use the included CSV templates and converter script to quickly generate festival data from spreadsheets. See the Adding New Festivals section below.
The CSVs are an authoring convenience only. Once the JSON is generated it is the app's sole runtime data source, so everything the app needs has to end up in the JSON.
The easiest way to add festival data is using the CSV-to-JSON converter:
Edit the CSV templates in Excel or Google Sheets:
ID, Title_EN, Title_FI and Duration are required; Director, Year, Country_EN/Country_FI, Age_Limit, Theme_EN/Theme_FI, Keyword_EN/Keyword_FI, Description_EN/Description_FI and URL_EN/URL_FI are all optionalRun the converter script:
python scripts/csv_to_json.py data/yourfestival_films.csv data/yourfestival_screenings.csv data/yourfestival2026.json
Add to festivals list in data/festivals.json:
{
"id": "yourfestival2026",
"name": "Your Festival",
"year": "2026",
"displayName": {
"en": "Your Festival 2026",
"fi": "Your Festival 2026"
},
"subtitle": {
"en": "Select films and create your schedule",
"fi": "Valitse elokuvat ja luo oma aikataulusi"
},
"dataFile": "data/yourfestival2026.json",
"startDate": "2026-10-15",
"endDate": "2026-10-20"
}
Benefits:
See scripts/README.md for detailed instructions and examples.
You can also create JSON files directly. The expected format is an object with two label registries and the films array:
{
"themeLabels": {
"midnight-mayhem": { "en": "Midnight Mayhem", "fi": "Midnight Mayhem" }
},
"keywordLabels": {
"horror": { "en": "Horror", "fi": "Kauhu" },
"thriller": { "en": "Thriller", "fi": "Trilleri" }
},
"films": [
{
"id": 1,
"title": { "en": "Film Title", "fi": "Elokuvan nimi" },
"director": "Director Name",
"year": "2026",
"duration": "120 min",
"country": { "en": ["Finland"], "fi": ["Suomi"] },
"ageLimit": "K16",
"themeKey": "midnight-mayhem",
"keywords": ["horror", "thriller"],
"urls": {
"en": "https://festival-website.com/en/films/film-title",
"fi": "https://festival-website.com/fi/elokuvat/elokuvan-nimi"
},
"description": {
"en": "English description",
"fi": "Suomenkielinen kuvaus"
},
"screenings": [
{ "date": "2026-10-15T14:00", "venue": "Main Theater" },
{ "date": "2026-10-16T20:30", "venue": "Screen 2" }
]
}
]
}
Films carry theme and keyword keys, not labels; the two registries resolve a key to its Finnish and English name at render time. That is what lets a user's filter selections survive a language switch. The converter derives keys from the English value, falling back to Finnish, so the same source value always yields the same key.
Note:
id,title,duration,descriptionandscreeningsare required — givedescriptionempty strings ({ "en": "", "fi": "" }) if you have no text, as the converter does.director,year,country,ageLimit,themeKey,keywordsandurlsare all optional and should be omitted entirely rather than written as""ornull— the app treats absence as absence. A field that no film in the dataset carries produces no UI at all: no theme anywhere means no theme badges, no theme filter and no contribution to the filter badge, and the same independently for keywords and age ratings.
Legacy formats: Older files still load. A bare array of films at the root is accepted, as are the previous
genresobject (converted to keywords) and a singleurlstring (applied to both languages).
MIT License