{"id":39538368,"url":"https://github.com/petrusmatiros/didyousee","last_synced_at":"2026-01-18T06:34:53.036Z","repository":{"id":131110250,"uuid":"609305920","full_name":"petrusmatiros/didyousee","owner":"petrusmatiros","description":"🦉 An intuitive and modern web app where you can discover, share and organize your favorite movies and TV series. Personal lists (likes, watch lists, have watched, dislikes) with shareable links","archived":false,"fork":false,"pushed_at":"2024-12-17T08:41:41.000Z","size":949,"stargazers_count":6,"open_issues_count":10,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-12-17T09:39:57.216Z","etag":null,"topics":["movies","search-engine","watchlists","web","webapp"],"latest_commit_sha":null,"homepage":"https://didyousee-4b593.web.app/","language":"Vue","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/petrusmatiros.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-03-03T20:27:35.000Z","updated_at":"2024-12-17T08:41:44.000Z","dependencies_parsed_at":null,"dependency_job_id":"d1dd4f24-0856-499a-96d0-fdbe9dc1f6ad","html_url":"https://github.com/petrusmatiros/didyousee","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/petrusmatiros/didyousee","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/petrusmatiros%2Fdidyousee","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/petrusmatiros%2Fdidyousee/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/petrusmatiros%2Fdidyousee/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/petrusmatiros%2Fdidyousee/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/petrusmatiros","download_url":"https://codeload.github.com/petrusmatiros/didyousee/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/petrusmatiros%2Fdidyousee/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28531997,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T00:39:45.795Z","status":"online","status_checked_at":"2026-01-18T02:00:07.578Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["movies","search-engine","watchlists","web","webapp"],"created_at":"2026-01-18T06:34:52.448Z","updated_at":"2026-01-18T06:34:53.029Z","avatar_url":"https://github.com/petrusmatiros.png","language":"Vue","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n\u003cimg width=\"128px\" src=\"src/assets/didyousee.svg\" alt=\"didyousee logo. an owl with a binocular, looking for the next movie/series\" width=32 style=\"vertical-align:middle\"\u003e\n\u003ch1 align=\"center\"\u003edidyousee\u003c/h1\u003e\n\u003c/p\u003e\n\n## Table of Contents\n  - [Website URL](#website-url)\n  - [Project description](#project-description)\n  - [APIs](#apis)\n  - [Background](#background)\n  - [Progress (what we have done so far)](#progress-what-we-have-done-so-far)\n  - [Planning (what we still plan to do)](#planning-what-we-still-plan-to-do)\n  - [Files](#files)\n    - [File structure](#file-structure)\n    - [File descriptions](#file-descriptions)\n  - [Installation](#installation)\n    - [API keys](#api-keys)\n    - [Dependencies](#dependencies)\n  - [Developers](#developers)\n\n## Website URL\nhttps://didyousee-4b593.web.app/\n\n## Project description\nAn intuitive and modern web app where you can discover, share and organize your favourite movies and TV series. Personal lists (likes, watchlists, have watched, dislikes) with shareable links\n\n## APIs\n  - [TMDB](https://www.themoviedb.org/)\n  - [Open Trivia Database](https://opentdb.com/api_config.php)\n\n## Background\nThis was a group project for the course DH2642 *Interaction Programming and the Dynamic Web* at **KTH Royal Institute of Technology**. The project duration was about ~3 months.\n\n## Progress (what we have done so far)\nCurrently, we've implemented the following:\n- Basic layout (HTML \u0026 CSS): Home, Result, Profile, Login, Register\n- Basic routing (Vue router)\n- API call from TMDB\n- Firebase hosting and deployment\n- User authentication via Auth.js/Auth0/Firebase\n- Search functionality, with filters\n- Profile page with personal lists (liked, watchlist, have watched, dislikes)\n\n## Planning (what we still plan to do)\nWe plan to implement the following:\n- Improved UX/UI and usability\n- Improved accessibility\n- Shareable lists via URL and exportability of lists (CSV, JSON, etc.). Implemented partially in a PR.\n\n## Files \n### File structure\n```css\n.\n├── 404.html\n├── README.md\n├── firebase.json\n├── index.html\n├── package-lock.json\n├── package.json\n├── server\n│   ├── controllers\n│   │   └── models\n│   │       └── routes\n│   ├── firebase.ts\n│   ├── index.ts\n│   ├── middleware\n│   └── server.ts\n├── src\n│   ├── App.vue\n│   ├── assets\n│   │   ├── didyousee.svg\n│   │   ├── icons8-google.svg\n│   │   ├── no-backdrop.svg\n│   │   ├── no-content.svg\n│   │   ├── no-poster.svg\n│   │   └── tmdb_alt_short_blue.svg\n│   ├── components\n│   │   ├── CarouselCast.vue\n│   │   ├── CarouselMedia.vue\n│   │   ├── CastCard.vue\n│   │   ├── Filter.vue\n│   │   ├── ListCard.vue\n│   │   ├── MediaCard.vue\n│   │   ├── ReviewCard.vue\n│   │   ├── SearchBar.vue\n│   │   └── WatchProviders.vue\n│   ├── firebaseConfig.ts\n│   ├── main.ts\n│   ├── model\n│   │   ├── apiConfig.ts\n│   │   ├── apiEndpoints.ts\n│   │   ├── model.ts\n│   │   └── promiseHandler.ts\n│   ├── presenters\n│   │   ├── AboutPresenter.vue\n│   │   ├── CastPresenter.vue\n│   │   ├── ContentPresenter.vue\n│   │   ├── HomePresenter.vue\n│   │   ├── ListPresenter.vue\n│   │   ├── LoginPresenter.vue\n│   │   ├── PageNotFoundPresenter.vue\n│   │   ├── ProfilePresenter.vue\n│   │   ├── RegisterPresenter.vue\n│   │   ├── ReviewsPresenter.vue\n│   │   └── SearchResultsPresenter.vue\n│   ├── router\n│   │   └── routes.ts\n│   ├── style.css\n│   ├── types\n│   │   └── types.ts\n│   ├── utils\n│   │   └── utils.ts\n│   ├── views\n│   │   ├── AboutView.vue\n│   │   ├── CastView.vue\n│   │   ├── ContentView.vue\n│   │   ├── HomeView.vue\n│   │   ├── ListView.vue\n│   │   ├── LoginView.vue\n│   │   ├── PageNotFoundView.vue\n│   │   ├── ProfileView.vue\n│   │   ├── RegisterView.vue\n│   │   ├── ReviewsView.vue\n│   │   └── SearchResultsView.vue\n│   └── vite-env.d.ts\n├── tsconfig.json\n├── tsconfig.node.json\n└── vite.config.ts\n```\n### File descriptions\n| File/Folder | Description |\n| --- | --- |\n| 404.html | Error page |\n| README.md | Readme file |\n| firebase.json | Firebase configuration file |\n| index.html | Main HTML file |\n| package-lock.json | Dependency file |\n| package.json | Package configuration file |\n| server/ | Server folder |\n| server/controllers/ | Controllers folder |\n| server/controllers/models/ | Models folder |\n| server/controllers/models/routes/ | Routes folder |\n| server/firebase.ts | Firebase setup file |\n| server/index.ts | Server entry point |\n| server/middleware/ | Middleware folder |\n| server/server.ts | Server configuration file |\n| src/ | Source folder |\n| src/App.vue | Main Vue component |\n| src/assets/ | Assets folder |\n| src/assets/didyousee.svg | Asset file |\n| src/assets/icons8-google.svg | Asset file |\n| src/assets/no-backdrop.svg | Asset file |\n| src/assets/no-content.svg | Asset file |\n| src/assets/no-poster.svg | Asset file |\n| src/assets/tmdb_alt_short_blue.svg | Asset file |\n| src/components/ | Vue components folder |\n| src/components/CarouselCast.vue | Vue component |\n| src/components/CarouselMedia.vue | Vue component |\n| src/components/CastCard.vue | Vue component |\n| src/components/Filter.vue | Vue component |\n| src/components/ListCard.vue | Vue component |\n| src/components/MediaCard.vue | Vue component |\n| src/components/ReviewCard.vue | Vue component |\n| src/components/SearchBar.vue | Vue component |\n| src/components/WatchProviders.vue | Vue component |\n| src/firebaseConfig.ts | Firebase configuration file |\n| src/main.ts | Main TypeScript file |\n| src/model/ | Model folder |\n| src/model/apiConfig.ts | API configuration file |\n| src/model/apiEndpoints.ts | API endpoints file |\n| src/model/model.ts | Model file |\n| src/model/promiseHandler.ts | Promise handler file |\n| src/presenters/ | Vue presenters folder |\n| src/presenters/AboutPresenter.vue | Vue presenter |\n| src/presenters/CastPresenter.vue | Vue presenter |\n| src/presenters/ContentPresenter.vue | Vue presenter |\n| src/presenters/HomePresenter.vue | Vue presenter |\n| src/presenters/ListPresenter.vue | Vue presenter |\n| src/presenters/LoginPresenter.vue | Vue presenter |\n| src/presenters/PageNotFoundPresenter.vue | Vue presenter |\n| src/presenters/ProfilePresenter.vue | Vue presenter |\n| src/presenters/RegisterPresenter.vue | Vue presenter |\n| src/presenters/ReviewsPresenter.vue | Vue presenter |\n| src/presenters/SearchResultsPresenter.vue | Vue presenter |\n| src/router/ | Vue router folder |\n| src/router/routes.ts | Router configuration file |\n| src/style.css | Main CSS file |\n| src/types/ | TypeScript types folder |\n| src/types/types.ts | TypeScript types file |\n| src/utils/ | Utility folder |\n| src/utils/utils.ts | Utility file |\n| src/views/ | Vue views folder |\n| src/views/AboutView.vue | Vue view |\n| src/views/CastView.vue | Vue view |\n| src/views/ContentView.vue | Vue view |\n| src/views/HomeView.vue | Vue view |\n| src/views/ListView.vue | Vue view |\n| src/views/LoginView.vue | Vue view |\n| src/views/PageNotFoundView.vue | Vue view |\n| src/views/ProfileView.vue | Vue view |\n| src/views/RegisterView.vue | Vue view |\n| src/views/ReviewsView.vue | Vue view |\n| src/views/SearchResultsView.vue | Vue view |\n| vite-env.d.ts | Typescript definition file for Vite |\n| tsconfig.json | Typescript configuration file for the project |\n| tsconfig.node.json | Typescript configuration file for Node.js |\n| vite.config.ts | Configuration file for Vite |\n\n\n## Installation\nTo setup the site locally, install the packages and build the project.\n```\nnpm i\nnpm run build\n```\n\nTo get a development build, run `npm run dev`. This will run the server and the typescript checker in parallel.\n\n### API Keys\nNot included in the repository are the private api keys. To run the code locally you will need to acquire a TMDB api key and set up your own firebase and provide its config. The TMDB api key is provided through the environment, e.g. through a `.env` file in the root of the directory. The key is named `VITE_TMDB_API_KEY`.\n\nThe template of the firebase config file is. It is expected to reside at `src/firebaseConfig.ts`:\n\n``` javascript\n// Import the functions you need from the SDKs you need\nimport { initializeApp } from \"firebase/app\";\nimport { getAuth } from 'firebase/auth'\nimport { getDatabase } from \"firebase/database\";\n\nconst firebaseConfig = {\n// Insert your config here\n};\n\n// Initialize Firebase\nconst app = initializeApp(firebaseConfig);\n\n//initialize firebase auth\nconst auth = getAuth()\n\nconst db = getDatabase(app)\n\nexport { app, auth, db }// Import the functions you need from the SDKs you need\n```\n\n### Dependencies\n```json\n{\n  \"name\": \"didyousee\",\n  \"private\": true,\n  \"version\": \"0.0.0\",\n  \"type\": \"module\",\n  \"scripts\": {\n    \"dev\": \"concurrently \\\"vue-tsc --watch\\\" \\\"vite\\\"\",\n    \"dev-no-tsc\": \"vite\",\n    \"build\": \"vue-tsc \u0026\u0026 vite build\",\n    \"preview\": \"vite preview\"\n  },\n  \"devDependencies\": {\n    \"@types/numeral\": \"^2.0.2\",\n    \"@vitejs/plugin-vue\": \"^4.1.0\",\n    \"@vue/compiler-sfc\": \"^3.2.47\",\n    \"autoprefixer\": \"^10.4.14\",\n    \"concurrent\": \"^0.3.2\",\n    \"pinia\": \"^2.0.33\",\n    \"postcss\": \"^8.4.21\",\n    \"prettier\": \"^2.8.7\",\n    \"typescript\": \"^4.9.3\",\n    \"vite\": \"^4.2.1\",\n    \"vue\": \"^3.2.36\",\n    \"vue-tsc\": \"^1.2.0\"\n  },\n  \"dependencies\": {\n    \"@google-cloud/firestore\": \"^6.5.0\",\n    \"@splidejs/vue-splide\": \"^0.6.12\",\n    \"@types/express\": \"^4.17.17\",\n    \"auth-js\": \"^0.0.16\",\n    \"axios\": \"^1.3.5\",\n    \"better-logging\": \"^5.0.0\",\n    \"chart.js\": \"^4.2.1\",\n    \"concurrently\": \"^8.0.1\",\n    \"cors\": \"^2.8.5\",\n    \"dompurify\": \"^3.0.2\",\n    \"dotenv\": \"^16.0.3\",\n    \"express\": \"^4.18.2\",\n    \"firebase\": \"^9.20.0\",\n    \"fuse.js\": \"^6.6.2\",\n    \"fuzzy\": \"^0.1.3\",\n    \"numeral\": \"^2.0.6\",\n    \"vue-router\": \"^4.1.6\"\n  }\n}\n```\n\n## Developers\n- [Petrus Matiros](https://github.com/petrusmatiros)\n- Max Olof Isralesson ([Blezie](https://github.com/Blezie), [maxisr](https://github.com/maxisr))\n- [Sebastian Willenbrink](https://github.com/Willenbrink)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpetrusmatiros%2Fdidyousee","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpetrusmatiros%2Fdidyousee","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpetrusmatiros%2Fdidyousee/lists"}