A comprehensive media discovery platform with support for movies, books, and music. Features include content browsing, reviews, ratings, and user profiles with profile picture upload functionality.
- Content Discovery: Browse movies, books, and music from local datasets
- Search & Filter: Advanced search functionality with filters
- Reviews & Ratings: Rate and review content
- User Profiles: Personal profiles with customizable settings
- Infinite Scrolling: Smooth browsing experience on movies page
- Click to Upload: Click on the profile avatar to upload a new picture
- Image Validation: Supports common image formats (JPEG, PNG, GIF, etc.)
- File Size Limit: 5MB maximum file size
- MongoDB Storage: Profile pictures are stored in MongoDB database
- Local File Storage: Images are saved to local file system
- Real-time Updates: Profile picture updates immediately after upload
- React 18 with TypeScript
- Tailwind CSS for styling
- Zustand for state management
- React Router for navigation
- Axios for API calls
- Node.js with Express
- MongoDB (optional) for user data and profile pictures
- Multer for file uploads
- CORS enabled for cross-origin requests
- Movies: Local CSV dataset with OMDb API integration for posters
- Books: Goodreads 10k dataset with cover images ( from Kaggle )
- Music: Kaggle Dataset
- Node.js (v16 or higher)
- npm or yarn
- MongoDB (optional, for full functionality)
-
Navigate to the server directory:
cd server -
Install dependencies:
npm install
-
Create a
.envfile with your configuration:PORT=5000 MONGODB_URI=your_mongodb_connection_string JWT_SECRET=your_jwt_secret OMDB_API_KEY=your_omdb_api_key
-
Start the server:
npm start
-
Install dependencies:
npm install
-
Start the development server:
npm start
- Navigate to Profile Page: Go to
/profilein the application - Click the Avatar: Click on the circular profile picture/avatar
- Select Image: Choose an image file from your device
- Automatic Upload: The image will be uploaded and displayed immediately
- JPEG (.jpg, .jpeg)
- PNG (.png)
- GIF (.gif)
- WebP (.webp)
- Other common image formats
- Maximum Size: 5MB
- Format: Image files only
- Dimensions: Any size (will be automatically resized for display)
POST /api/users/profile-picture- Upload profile pictureDELETE /api/users/profile-picture- Remove profile picturePUT /api/users/profile- Update user profileGET /api/users/profile- Get user profile
- Local Storage: Images saved to
uploads/profile-pictures/ - Database: Image URLs stored in MongoDB User model
- Static Serving: Images served via Express static middleware
- ProfilePage: Main profile interface with upload functionality
- File Input: Hidden file input triggered by avatar click
- Upload Progress: Loading indicator during upload
- Error Handling: Validation and error messages
POST /api/auth/register- User registrationPOST /api/auth/login- User loginPOST /api/auth/logout- User logout
GET /api/movies- Get movies with paginationGET /api/books- Get books with paginationGET /api/music- Get music with paginationGET /api/content/:id- Get specific content details
POST /api/reviews- Create a reviewGET /api/reviews/:contentId- Get reviews for contentPUT /api/reviews/:id- Update a reviewDELETE /api/reviews/:id- Delete a review
GET /api/users/profile- Get user profilePUT /api/users/profile- Update user profilePOST /api/users/profile-picture- Upload profile pictureDELETE /api/users/profile-picture- Remove profile picture
{
name: String,
email: String,
password: String,
profilePicture: String, // URL to uploaded image
role: String, // 'user' or 'admin'
favorites: {
movies: [String],
books: [String],
music: [String],
podcasts: [String],
articles: [String]
},
createdAt: Date,
updatedAt: Date
}# Terminal 1 - Backend
cd server && npm start
# Terminal 2 - Frontend
npm startproject/
├── src/ # Frontend source
│ ├── components/ # React components
│ ├── pages/ # Page components
│ ├── store/ # Zustand stores
│ ├── services/ # API services
│ └── types/ # TypeScript types
├── server/ # Backend source
│ ├── routes/ # API routes
│ ├── models/ # MongoDB models
│ └── server.js # Main server file
├── uploads/ # Uploaded files
│ └── profile-pictures/ # Profile pictures
└── datasets/ # Local CSV datasets
- Fork the repository
- Create a feature branch
- Make your changes
- Test thoroughly
- Submit a pull request
This project is licensed under the MIT License.