{"id":15056777,"url":"https://github.com/codingforentrepreneurs/video-membership","last_synced_at":"2025-09-01T18:41:17.871Z","repository":{"id":46868005,"uuid":"434327871","full_name":"codingforentrepreneurs/video-membership","owner":"codingforentrepreneurs","description":"Create a Video Membership app using FastAPI \u0026 NoSQL","archived":false,"fork":false,"pushed_at":"2021-12-22T20:42:26.000Z","size":95,"stargazers_count":106,"open_issues_count":3,"forks_count":31,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-04-10T04:40:53.154Z","etag":null,"topics":["algolia","astradb","cassandra","cassandra-driver","datastax","fastapi","htmx","http-only-cookies","jinja2","jwt","pydantic","python3","tutorial","user-authentication","video-analytics","video-membership","youtube-player-api"],"latest_commit_sha":null,"homepage":"https://www.codingforentrepreneurs.com/projects/video-membership/","language":"Python","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/codingforentrepreneurs.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}},"created_at":"2021-12-02T18:15:05.000Z","updated_at":"2025-03-06T04:28:03.000Z","dependencies_parsed_at":"2022-09-18T03:40:25.162Z","dependency_job_id":null,"html_url":"https://github.com/codingforentrepreneurs/video-membership","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/codingforentrepreneurs/video-membership","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codingforentrepreneurs%2Fvideo-membership","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codingforentrepreneurs%2Fvideo-membership/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codingforentrepreneurs%2Fvideo-membership/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codingforentrepreneurs%2Fvideo-membership/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/codingforentrepreneurs","download_url":"https://codeload.github.com/codingforentrepreneurs/video-membership/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codingforentrepreneurs%2Fvideo-membership/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273174567,"owners_count":25058469,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-01T02:00:09.058Z","response_time":120,"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":["algolia","astradb","cassandra","cassandra-driver","datastax","fastapi","htmx","http-only-cookies","jinja2","jwt","pydantic","python3","tutorial","user-authentication","video-analytics","video-membership","youtube-player-api"],"created_at":"2024-09-24T21:56:25.538Z","updated_at":"2025-09-01T18:41:17.808Z","avatar_url":"https://github.com/codingforentrepreneurs.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Video Membership Logo](https://static.codingforentrepreneurs.com/media/projects/video-membership/images/share/Video_Membership_Share.jpg)](https://www.codingforentrepreneurs.com/projects/video-membership)\n\n# Video Membership\n\nCreate a Video Membership app using FastAPI \u0026 NoSQL. In this series, we're going to explore building a membership application using FastAPI and a managed Cassandra database called [AstraDB](https://dtsx.io/3lAUmnG).\n\nIn this one, we'll learn how to implement a number of key features in building a video membership site including:\n\n- Creating Users (with custom fields) from scratch\n- Saving Secure, Hashed, Passwords\n- Authentication\n- Video Analytics \u0026 Resumable Videos\n- Search Engine\n- And much more\n\n\n### Chapter Links\n- [00:00:00 -  Welcome](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=0)\n\n- [00:05:27 -  Requirements](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=327)\n\n- [00:06:51 -  Setup VSCode \u0026 Python Virtual Environment](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=411)\n\n- [00:12:12 -  Hello World with FastAPI](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=732)\n\n- [00:18:58 -  Picking a Database](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=1138)\n\n- [00:24:56 -  Create our NoSQL Database with AstraDB](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=1496)\n\n- [00:27:48 -  Basic AstraDB Configuration for FastAPI](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=1668)\n\n- [00:35:54 -  Configuration \u0026 Environment Variables](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=2154)\n\n- [00:43:30 -  Create our User model with Python \u0026 Cassandra](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=2610)\n\n- [00:51:08 -  Sync Cassandra Tabels via FastAPI On Startup](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=3068)\n\n- [00:58:40 -  Create a user via shell](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=3520)\n\n- [01:02:05 -  List Stored Values on API Endpoint](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=3725)\n\n- [01:05:15 -  User Create Method \u0026 Email Valdiation](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=3915)\n\n- [01:13:12 -  Security \u0026 Password Hashing](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=4392)\n\n- [01:22:45 -  Interactive Notebook to Analyze New Features](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=4965)\n\n- [01:32:18 -  Automated Tests](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=5538)\n\n- [01:50:25 -  Jinja Templates to Render HTML](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=6625)\n\n- [02:00:00 -  Jinja Template Inheritance \u0026 More](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=7200)\n\n- [02:06:44 -  FastAPI Forms FastAPI Login \u0026 Sign Up Forms](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=7604)\n\n- [02:15:16 -   User Data Validation with pydantic](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=8116)\n\n- [02:26:10 -  Implement pydantic Data Validation](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=8770)\n\n- [02:35:44 -  Pydantic Valid Data or Error Method](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=9344)\n\n- [02:44:06 -  Experiment with JWT Tokens](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=9846)\n\n- [02:58:02 -  Implement Auth Methods for JWT Tokens](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=10682)\n\n- [03:07:53 -  Shortcut Method for Rendering Jinja Templates](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=11273)\n\n- [03:19:53 -  Using Cookies \u0026 httponly within FastAPI](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=11993)\n\n- [03:27:54 -  Login \u0026 Set JWT](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=12474)\n\n- [03:37:09 -  Redirect Shortcut](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=13029)\n\n- [03:41:53 -  Login Required Decorator](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=13313)\n\n- [03:52:36 -  Render a template for HTTP Errors](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=13956)\n\n- [04:04:24 -  Authentication Middleware Backend](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=14664)\n\n- [04:20:50 -  Video Model](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=15650)\n\n- [04:27:57 -  YouTube Video ID Extraction](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=16077)\n\n- [04:35:17 -  Notebook to Verify Video Add Feature ](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=16517)\n\n- [04:41:51 -  Custom Exception Classes for Videos](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=16911)\n\n- [04:46:21 -  Routers for Sub Modules in FastAPI](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=17181)\n\n- [04:52:51 -  Video Create Schema](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=17571)\n\n- [05:02:59 -  Video Create View](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=18179)\n\n- [05:06:00 -  Video Create View Form](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=18360)\n\n- [05:18:52 -  Video List View \u0026 Title Field](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=19132)\n\n- [05:29:43 -  Dynamic URL Routing \u0026 Video Detail View](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=19783)\n\n- [05:40:50 -  Render Video on Detail Page](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=20450)\n\n- [05:46:56 -  The YouTube JavaScript Player](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=20816)\n\n- [06:34:13 -  Video Watch Events Endpoint in FastAPI](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=23653)\n\n- [06:45:17 -  Watch Event Model](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=24317)\n\n- [06:55:30 -  Drop Table from Cassandra Database via Notebook](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=24930)\n\n- [07:03:45 -  More Watch Event Data](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=25425)\n\n- [07:09:24 -  Pydantic Model for Watch Event Data](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=25764)\n\n- [07:17:40 -  Watch Event Router](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=26260)\n\n- [07:22:32 -  Get Video Resume Time](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=26552)\n\n- [07:30:07 -  Playlist Model \u0026 Cassandra List Column](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=27007)\n\n- [07:34:42 -  Playlist Tests in Notebooks](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=27282)\n\n- [07:45:25 -  Playlist Routing \u0026 Templates](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=27925)\n\n- [07:55:36 -  HTMX, FastAPI, \u0026 Jinja](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=28536)\n\n- [08:04:07 -  Use HTMX to Handle Form Data](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=29047)\n\n- [08:16:36 -  Get or Create Video for Playlists](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=29796)\n\n- [08:24:49 -  Playlist Routers for Handling Video Additions](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=30289)\n\n- [08:37:23 -  Playlist Video Schema](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=31043)\n\n- [08:48:58 -  Remove Playlist Item via HTMX](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=31738)\n\n- [09:01:13 -  Edit or Remove Video](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=32473)\n\n- [09:11:04 -  Edit or Remove Video via HTMX](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=33064)\n\n- [09:27:16 -  Add Bootstrap \u0026 Improve Usablity](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=34036)\n\n- [10:07:19 -  Login Required HTMX Redirect Header](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=36439)\n\n- [10:11:10 -  Logout View](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=36670)\n\n- [10:18:58 -  Prepare our Search Index](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=37138)\n\n- [10:33:00 -  Implement Algolia Client \u0026 API](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=37980)\n\n- [10:41:43 -  Update Search Index](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=38503)\n\n- [10:49:46 -  Search View \u0026 Update Index Method](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=38986)\n\n- [11:03:25 -  Thank you and next steps](https://www.youtube.com/watch?v=KQ-u4RcFLBY\u0026t=39805)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodingforentrepreneurs%2Fvideo-membership","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcodingforentrepreneurs%2Fvideo-membership","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodingforentrepreneurs%2Fvideo-membership/lists"}