পরবর্তীতে কোন টিভি শো বা মুভিটি দেখতে হবে তা নির্ধারণ করতে আপনি কি কখনও লড়াই করেছেন? আপনার পরবর্তী দ্বি-ঘড়ি সম্পর্কে সিদ্ধান্ত নেওয়া কখনই সহজ নয় কারণ বিভিন্ন স্ট্রিমিং প্রদানকারীতে অ্যাক্সেসযোগ্য অনেকগুলি বিকল্প রয়েছে।
আমাদের পরবর্তী সিনেমার বিষয়ে সিদ্ধান্ত নেওয়ার সময়, আমরা প্রাথমিকভাবে বিভিন্ন রেটিং এজেন্সি (যেমন IMDB) থেকে পর্যালোচনা এবং রেটিং এর উপর নির্ভর করি। যাইহোক, এই প্রতিষ্ঠানগুলির প্রাচুর্যের কারণে কোন রেটিংটিতে বিশ্বাস করতে হবে তা বেছে নেওয়া কঠিন হতে পারে।
এই বলে যে, এই সংস্থাগুলির একটি সংখ্যা থেকে ভাল নম্বর পেয়েছে এমন একটি চলচ্চিত্র দেখা প্রায়শই নিরাপদ। কিন্তু এমন মুভি খুঁজে পাওয়া কি কঠিন নয়? হ্যাঁ, এটা!
এই তিন-ব্লগ সিরিজে, আমরা এই সঠিক সমস্যার সমাধান করার জন্য একটি সফ্টওয়্যার সমাধান তৈরি করব! এই জ্যাঙ্গো অ্যাপ্লিকেশন, যাকে আমরা ফ্লিক্স-ফাইন্ডার বলব, এটি ব্যবহারকারীকে বিভিন্ন রেটিং এজেন্সির রেটিংগুলির উপর ভিত্তি করে চলচ্চিত্রগুলি ফিল্টার করার অনুমতি দেবে৷
আমরা আমাদের অ্যাপ্লিকেশনের জন্য প্রয়োজনীয় ডেটা সংগ্রহ করতে BrightData-এর পরিষেবাগুলি ব্যবহার করব।
তাই আর কোনো ঝামেলা ছাড়াই, চলুন ফ্লিক্স-ফাইন্ডার তৈরি করা শুরু করি।
এই বিভাগটি শুরু করার আগে, নিশ্চিত করুন যে আপনার সিস্টেমে জ্যাঙ্গো ইনস্টল করা আছে!
আপনার সিস্টেমে জ্যাঙ্গো ইনস্টল করা থাকলে নিম্নলিখিত কমান্ডটি কাজ করবে।
python3 -m django --version
জ্যাঙ্গো ইনস্টল করতে পিপ ব্যবহার করুন যদি এটি আপনার সিস্টেমে ইনস্টল না থাকে!
python3 -m pip install Django
আমাদের জ্যাঙ্গো প্রজেক্ট সেট আপ করে শুরু করা যাক। নিম্নলিখিত কমান্ড ব্যবহার করে একটি নতুন প্রকল্প তৈরি করুন।
rishabh@my-ubuntu:~/projects$ python3 -m django startproject flix_finder
নতুন তৈরি প্রকল্প ডিরেক্টরি flix_finder
এ ডিরেক্টরি পরিবর্তন করুন। এখানে আপনার প্রিয় কোড সম্পাদক খুলুন. Django দ্বারা স্বয়ংক্রিয়ভাবে তৈরি করা এই ডিরেক্টরিতে আপনি নিম্নলিখিত ফাইলগুলি দেখতে পাবেন।
rishabh@my-ubuntu:~/projects/flix_finder$ tree . . ├── flix_finder │ ├── asgi.py │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py └── manage.py 1 directory, 6 files
এই ফাইলগুলি সম্পর্কে আরও জানতে, Django দ্বারা প্রদত্ত এই ব্যাখ্যাটি পড়ুন৷
সেটআপ সঠিকভাবে সম্পন্ন হয়েছে তা নিশ্চিত করতে জ্যাঙ্গো সার্ভার চালানোর চেষ্টা করুন এবং localhost:8000
অ্যাক্সেস করুন!
rishabh@my-ubuntu:~/projects/flix_finder$ python3 manage.py runserver
একটি জ্যাঙ্গো অ্যাপ (বা জ্যাঙ্গো অ্যাপ্লিকেশন) একটি বৃহত্তর জ্যাঙ্গো প্রকল্পের একটি উপাদানকে বোঝায় যা একটি স্বতন্ত্র বৈশিষ্ট্য বা কার্যকারিতাকে অন্তর্ভুক্ত করে। জ্যাঙ্গো অ্যাপগুলি পুনঃব্যবহারযোগ্য এবং স্বাধীন উপাদান। তারা মডেল, ভিউ, টেমপ্লেট, পরীক্ষা এবং অন্যান্য ফাইল নিয়ে গঠিত।
আমাদের প্রকল্পের সমস্ত সুপারিশকারী যুক্তি recommender
নামক একটি অ্যাপ্লিকেশনে থাকবে। এই অ্যাপটি তৈরি করতে, নিম্নলিখিত কমান্ডটি চালান।
rishabh@my-ubuntu:~/projects/flix_finder$ python3 manage.py startapp recommender
উপরের কমান্ডটি recommender
নামে একটি নতুন ফোল্ডার তৈরি করবে। আমাদের অ্যাপ্লিকেশনের সমস্ত যুক্তি এই ফোল্ডারের ভিতরে যাবে।
আমাদের অ্যাপ্লিকেশন সফলভাবে তৈরি হয়েছে তা বলার আগে আরও একটি ধাপ বাকি আছে। এগিয়ে যান এবং flix_finder/settings.py
অধীনে উপস্থিত INSTALLED_APPS
তালিকায় নতুন তৈরি অ্যাপের নাম যোগ করুন।
# flix_finder/settings.py INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'recommender' ]
এটি দিয়ে, আমরা সফলভাবে আমাদের recommender
অ্যাপ তৈরি করেছি।
এখন, আমাদের প্রথম ভিউ তৈরি করা যাক।
জ্যাঙ্গোতে, ভিউ হল পাইথন ফাংশন যা HTTP অনুরোধ গ্রহণ করে এবং HTTP প্রতিক্রিয়া প্রদান করে। কিছু ব্যবসায়িক যুক্তির উপর ভিত্তি করে ব্যবহারকারীদের কাছে ডেটা উপস্থাপনে ভিউ একটি গুরুত্বপূর্ণ ভূমিকা পালন করে।
recommender/views.py
এর অধীনে একটি নতুন পদ্ধতি তৈরি করুন। এই পদ্ধতিটি localhost:8000/
মাধ্যমে আসা অনুরোধগুলি পরিবেশন করবে। আপাতত, এই শেষ পয়েন্টটি কেবল একটি হ্যালো বার্তা প্রদান করে।
from django.http import HttpResponse def index(request): return HttpResponse("Hello From Recommender!")
আমরা অনুরোধটি পরিচালনা করার জন্য ভিউ পদ্ধতি তৈরি করেছি, কিন্তু আমরা নির্দিষ্ট করিনি (আমাদের প্রকল্পে) কোন শেষ পয়েন্টগুলি এই দৃষ্টিভঙ্গির সাথে সামঞ্জস্যপূর্ণ। আমরা urls.py
ফাইলে এটি করি।
সুপারিশকারী অ্যাপের ভিতরে একটি নতুন ফাইল তৈরি করুন এবং এটির নাম দিন urls.py
এখানে, আমরা URL এবং ভিউ পদ্ধতির মধ্যে এই চিঠিপত্রটি নির্দিষ্ট করি।
from django.urls import path from . import views urlpatterns = [ path("", views.index, name = "index") ]
আমাদের এখন জ্যাঙ্গোকে এই নতুন URL এর ফাইল সম্পর্কে সচেতন করতে হবে। flix_finder/urls.py
ফাইলটি নিম্নলিখিতটিতে আপডেট করুন।
from django.urls import path, include urlpatterns = [ path('', include("recommender.urls")), path('admin/', admin.site.urls), ]
আপনার সার্ভার শুরু করুন, যদি না আগে থেকেই থাকে, এবং আপনার ব্রাউজারে localhost:8000
খুলুন। আপনি হ্যালো বার্তা দেখতে হবে.
অভিনন্দন, আপনি এইমাত্র আপনার প্রথম দৃশ্য তৈরি সম্পূর্ণ করেছেন!
আসুন আমরা সম্মত হব... প্রতিক্রিয়া হিসাবে একটি স্ট্রিং পাঠানো জিনিসগুলির মধ্যে দুর্দান্ত নয়। আমরা পরিবর্তে একটি সঠিক HTML প্রতিক্রিয়া পাঠাতে হবে. এবং এই সঠিক উদ্দেশ্যে, আমরা জ্যাঙ্গো টেমপ্লেট ব্যবহার করব।
recommender
পরিচালকের অধীনে একটি ডিরেক্টরি templates
তৈরি করুন। এই সদ্য তৈরি ফোল্ডারটির নাম বিশেষ কারণ জ্যাঙ্গো বাই-ডিফল্ট templates
নামের ডিরেক্টরিতে HTML ফাইলের জন্য অনুসন্ধান করে।
নতুন তৈরি ডিরেক্টরির ভিতরে index.html
নামে একটি নতুন ফাইল তৈরি করুন। এই ফাইলের ভিতরে, আমরা HTML লিখব যা আমরা রেন্ডার করতে চাই যখন ব্যবহারকারীরা localhost:8000
এ যান।
যেহেতু এইচটিএমএল লেখা এখানে মূল ফোকাস নয়, আমি সেই অংশটি ব্যাখ্যা করা এড়িয়ে যাব এবং আপনি এখান থেকে এইচটিএমএল কপি করতে পারেন।
এই এইচটিএমএল ফাইল (বা জ্যাঙ্গো টেমপ্লেট) সম্পর্কে আপনার জানা দরকার এমন কিছু জিনিস এখানে রয়েছে -
(1) এই HTML ওয়েবপেজে চারটি জিনিস প্রদর্শন করে - নেভিগেশন বার, ক্যারোজেল, মুভি সার্চ ফর্ম এবং মুভি সার্চ রেজাল্ট।
(2) এটি জ্যাঙ্গো টেমপ্লেট ভাষা ব্যবহার করে সরাসরি HTML এর ভিতরে পাইথন ভেরিয়েবল ব্যবহার করার অনুমতি দেয়।
(3) এটি প্রেক্ষাপটে featured_movies
ভেরিয়েবলের প্রত্যাশা করে (ডেটা টেমপ্লেটে পাস করা হয়েছে) এবং এটি ক্যারোজেল প্রদর্শন করতে ব্যবহার করবে।
(4) এটি আশা করে যে form
ভেরিয়েবলটি একটি জ্যাঙ্গো ফর্ম অবজেক্ট দিয়ে পূরণ করা হবে এবং এটি মুভি অনুসন্ধান ফর্ম প্রদর্শন করতে ব্যবহার করবে।
(5) এটি filtered_movie_list
ভেরিয়েবলের প্রত্যাশা করে এবং অনুসন্ধানের ফলাফল প্রদর্শন করতে এটি ব্যবহার করবে।
(6) এটি no_result_error
ভেরিয়েবলও আশা করে যেটি নির্দেশ করে যে অনুসন্ধানের ফলে একটি খালি প্রতিক্রিয়া হয়েছে কিনা।
আমাদের স্টাইলিং এর জন্য কিছু CSS যোগ করতে হবে। recommender
ডিরেক্টরির অধীনে static
একটি ডিরেক্টরি তৈরি করুন। এই ফোল্ডারটি সমস্ত স্ট্যাটিক ফাইল ধারণ করবে।
style.css
নামে একটি নতুন ফাইল তৈরি করুন এবং এই URL থেকে CSS পেস্ট করুন।
এটির সাথে, আমাদের কাছে প্রয়োজনীয় সমস্ত HTML এবং CSS রয়েছে। এর পরে, আমাদের মুভি অনুসন্ধান ফর্ম তৈরি করতে হবে।
যেহেতু আমাদের টেমপ্লেটের জন্য আমাদের একটি ফর্ম অবজেক্ট প্রদান করতে হবে, তাই আমাদের একটি তৈরি করতে হবে।
Django ফর্ম কি নিশ্চিত না? ChatGPT পড়ুন এর ব্যাখ্যা করুন-
জ্যাঙ্গো ফর্মগুলি জ্যাঙ্গো ফ্রেমওয়ার্কের একটি মডিউল যা এইচটিএমএল ফর্ম তৈরি এবং কাজ করতে ব্যবহৃত হয়। তারা প্লেইন এইচটিএমএল ফর্ম ব্যবহার করে বিভিন্ন সুবিধা প্রদান করে:
সুপারিশকারীর অ্যাপ ডিরেক্টরির ভিতরে forms.py
নামে একটি ফাইল তৈরি করুন। এটিতে নিম্নলিখিত কোডটি যুক্ত করুন।
from django import forms class MovieSearchForm(forms.Form): imdb_rating = forms.DecimalField(min_value=0.1, max_value=9.9, required=True, label='Minimum IMDB Rating') release_year = forms.IntegerField(required=True)
আমরা এইমাত্র আমাদের মুভি অনুসন্ধান ফর্মের জন্য একটি ফর্ম ক্লাস তৈরি করেছি৷ এই ফর্মটিতে ক্লাসে বর্ণিত দুটি ক্ষেত্র থাকবে। আপনি যদি ফর্ম সম্পর্কে আরও জানতে চান তবে এটি দেখুন।
টেমপ্লেট সেটের জন্য প্রয়োজনীয় সমস্ত জিনিস সহ, এখন আমাদের এই নতুন তৈরি টেমপ্লেটটি ব্যবহার করার জন্য আমাদের ভিউ পদ্ধতি আপডেট করতে হবে।
from .forms import MovieSearchForm # We use a hard-code list here, we will make it dynamic in subsequent parts featured_movie_list = [ { "img_src": "https://images.thedirect.com/media/article_full/amazing-spider-man-3-andrew-garfield-movie-mcu.jpg", "img_alt": "...", "active": True }, { "img_src": "https://static1.colliderimages.com/wordpress/wp-content/uploads/2022/11/avatar-the-way-of-water-poster.jpg", "img_alt": "...", "active": False } ] def index(request): context = { "featured_movies": featured_movie_list, "form": MovieSearchForm() } return render(request, 'index.html', context)
আপনার সার্ভার শুরু করুন এবং localhost:8000
। আপনি নিম্নলিখিত পৃষ্ঠা দেখতে হবে.
সমস্ত ভিউ, ইউআরএল, টেমপ্লেট এবং ফর্মের জায়গায়, আমরা এখন সেই ডেটা বিবেচনা করতে পারি যা আমাদের অ্যাপ্লিকেশন কাজ করবে। আমাদের প্রোগ্রামের একাধিক রেটিং এজেন্সি (IMDB, শুরুতে) থেকে ডেটার প্রয়োজন হবে।
দুর্ভাগ্যবশত, কোন সু-সংজ্ঞায়িত API নেই যার মাধ্যমে আমরা এই ডেটা পুনরুদ্ধার করতে পারি। এই তথ্য পাওয়ার জন্য একটি পদ্ধতি হল পাইথন সেলেনিয়াম ব্যবহার করে আমাদের নিজস্ব স্ক্র্যাপার তৈরি করা। যাইহোক, এটির জন্য আরও বেশি পরিশ্রমের প্রয়োজন হবে এবং সবাই এই ধরনের প্রযুক্তির সাথে স্বাচ্ছন্দ্য বোধ করে না।
একটি ভাল সমাধান হল ব্রাইটডেটার মত তৃতীয় পক্ষের পরিষেবাগুলি ব্যবহার করা। BrightData এই সমস্ত তথ্য প্রাপ্ত করা সহজ করে তোলে।
এই ১ম অংশের জন্য, আমরা ব্রাইটডেটা থেকে একটি প্রি-কিউরেটেড IMDB ডেটাসেট ব্যবহার করব। BrightData-এ উপলব্ধ অনেকগুলি ডেটাসেটের মধ্যে এটি একটি। এইভাবে আমরা এটি পেতে পারি।
(1) ব্রাইটডেটাতে একটি অ্যাকাউন্টের জন্য সাইন আপ করুন।
(2) হয় ব্রাউজার থেকে brightdata.com/cp/datasets
এ যান অথবা বাম দিক থেকে Datasets & WebScraper IDE
মেনু খুলুন।
(3) ডেটাসেট মার্কেটপ্লেসে যান এবং IMDB media dataset
অনুসন্ধান করুন।
(4) View Dataset-এ ক্লিক করুন এবং CSV ফরম্যাটে নমুনা ডেটাসেট ডাউনলোড করুন।
একবার ডাউনলোড হয়ে গেলে, ফাইলটির নাম পরিবর্তন করে IMDB.csv
করুন এবং recommender/static
ফোল্ডারের ভিতরে রাখুন। এই নমুনা CSV-এ 1000+ সিনেমার জন্য 28টি IMDB বৈশিষ্ট্য রয়েছে। আমাদের অ্যাপ্লিকেশন এই অংশের জন্য এই IMDB ডেটাসেটে কাজ করবে।
আসুন অনুসন্ধানের অনুরোধগুলি প্রক্রিয়া করার জন্য ভিউ পদ্ধতি আপডেট করি।
ফর্ম থেকে সমস্ত অনুসন্ধান অনুরোধ POST অনুরোধ হিসাবে আসে। ফর্মটি সঠিকভাবে পূরণ হয়েছে তা নিশ্চিত করার পরে, আমরা ডাউনলোড করা CSV ফাইল থেকে সমস্ত মুভির তালিকা করব এবং ফিল্টার মাপদণ্ডের সাথে মেলে না সেগুলি ফিল্টার করব৷ আপডেট করা কোডটি দেখতে কেমন তা এখানে।
def index(request): if request.method == 'POST': form = MovieSearchForm(request.POST) if form.is_valid(): movie_list = _getIMDBMovieDataList() filtered_movie_list = _filter_imdb_movie_list(movie_list, form) context = { "featured_movies": featured_movie_list, "form": MovieSearchForm(), "filtered_movie_list": filtered_movie_list, "no_result_error": len(filtered_movie_list)==0 } return render(request, 'index.html', context) context = { "featured_movies": featured_movie_list, "form": MovieSearchForm() } return render(request, 'index.html', context)
_getIMDBMovieDataList
এবং _filter_imdb_movie_list
পদ্ধতিগুলির বাস্তবায়ন জ্যাঙ্গোর জন্য নির্দিষ্ট কিছু নয় এবং এটি কেবল বিশুদ্ধ পাইথন। আমি এইভাবে এখানে যে সম্পর্কে কথা বলা এড়িয়ে যান. সম্পূর্ণ views.py
ফাইলটি এখানে পাওয়া যাবে।
এই পয়েন্টে পৌঁছানোর জন্য অভিনন্দন. আপনি যদি সমস্ত পদক্ষেপগুলি সঠিকভাবে অনুসরণ করেন তবে আপনি সার্ভার চালাতে এবং UI এর মাধ্যমে অনুসন্ধানগুলি সম্পাদন করতে সক্ষম হবেন। এখানে সার্চ ফলাফল দেখতে কেমন হবে.
এই সিরিজের একটি অংশ হিসাবে তৈরি করা সমস্ত কোড এই GitHub সংগ্রহস্থলে উপলব্ধ হবে। এই অংশের চূড়ান্ত ফলাফল Part1
নামের এই শাখায় রয়েছে।
কিছু ভুল আছে কিনা তা পরীক্ষা করার জন্য রেপোতে উপস্থিত একটির সাথে আপনার কোড ক্রস-চেক করা সর্বদা একটি ভাল ধারণা।
এর সাথে, আমরা এই তিন পর্বের সিরিজের প্রথম পর্বের শেষে চলে এসেছি। পরবর্তী অংশে, আমরা অন্যান্য রেটিং এজেন্সি থেকে ডেটা সংগ্রহ করতে BrightData-এর WebScraper IDE ব্যবহার করব। তারপরে আমরা আমাদের ফর্ম আপডেট করব, এইভাবে ব্যবহারকারীদের আরও জটিল অনুসন্ধান করতে অনুমতি দেবে।
এছাড়াও আমরা ক্যারোজেল উপাদানকে গতিশীল করে তুলব!
পরের বার দেখা হবে... ততক্ষণ, হ্যাপি লার্নিং! 🙂