فیلم دیدن به طعم پاپکورن! - قسمت اول

لوگوی باحال پاپکورن!
لوگوی باحال پاپکورن!


دقیقا عید سال ۹۹ بود که با شروع کرونا، قرنطینه خانگی شروع و دیدن فیلم به اصلی‌ترین سرگرمی خانواده‌ها و افراد تبدیل شده بود. به همین دلیل پیدا کردن فیلم و سریال برای دریافت و دیدن یکی از اصلی‌ترین دغدغه‌ها بود. در ادامه، در چندین پست در روزهای آتی به مناسبت تولد یک سالگی پاپکورن مسیر طی شده از رسیدن به ۱۰۰ هزار کاربر بدون هزینه مارکتینگ و رد کردن نقطه سر به سر را توضیح می‌دهم. ابتدا چند مقاله فنی و سپس قسمت بیزینسی ماجرا را تعریف میکنم.

پاپکورن یک پلتفرم تماشای و دریافت فیلم هست که از لینک‌های دیگر سایت‌ها و فایل‌ها تلگرامی پشتیبانی میکند. سیستمی شبیه آهنگیفای و ملوبات که در خود آهنگ جای دادند. هدف پاپکورن دیگر دریافت فیلم نیست و در ادامه اهداف مهم‌تری، یعنی کمک به انتخاب فیلم را هم در برنامه دارد.

نیاز از آنجایی شروع شد که سایت‌هایی که فیلم‌های مختلف را قرار میدادند، به سمت حذفیات متعدد از صحنه‌های فیلم به دلایل مختلف رفته بودند. در بعضی از موارد آنقدر حذفیات اذیت کننده بود که خریدن اکانت‌های سایت‌های داخلی برای استریم و تماشای آنلاین به صرفه‌تر بود. (من به شخصه کاملا با سایت‌های VOD موافقم و اتفاقا اکانت هم دارم! مشکل اصلی من با انحصار همیشگی است) پس برای پیدا کردن یک فیلم باید چندین سایت مختلف را زیر و رو می‌کردیم تا فیلم و سریال دلخواه برسیم. اولین جرقه‌ی پاپکورن از ایجاد یک سیستم یکپارچه برای دریافت فیلم و سریال بود.




سیستم یکپارچه پاپکورن به این صورت عمل می‌کرد (و می‌کند) که از سایت‌های مشخص شده داخل سیستم به صورت اتوماتیک لینک‌های موجود را خوانده و آنها را به صورت مرتب، با جداسازی کیفیت، انکودر، رزولوشن و … داخل دیتابیس نگه میدارد. در اصل کرالری (crawler) بر روی سایت‌ها وجود دارد.


حال ما نمی‌خواستیم که ابتدا کل سایت‌ها را کرال کنیم و لینک‌ها را بدست بیاوریم! بلکه به ازای جست‌وجوی کاربر (On Demand) برویم و از سایت مورد نظر لینک‌های مورد نیاز را پیدا کنیم و در دیتابیس نگه داریم. برای همین ساختار زیر به وجود آمد.

نکته: البته بعد از بزرگ شدن سیستم، این رویه تغییر کرد که جلوتر در قسمت‌ها بعدی به آن اشاره می‌کنیم. اما در حال حاضر باز هم اگر فیلمی در سیستم موجود نباشد، سیستم دوباره سایت‌ها ایندکس شده را میگردد.

ساختار کلی پیدا شدن فیلم
ساختار کلی پیدا شدن فیلم


در قسمت کرال کردن ۲ دسته سایت وجود دارد:

‍۱. سایت‌هایی که به صورت پیش‌فرض IMDB ID را در خود دارند

۲. سایت‌هایی که با اسم فیلم، فیلم‌ها پیدا می‌شدند.

به همین دلیل، ۲ نوع هم کرالر داریم. یکی که با استفاده از ای‌دی و دیگری با استفاده از اسم فیلم داخل سایت جست‌وجو می‌کند.

ساختار کلی کرالر‌ها یکی هستند و به این شکل هستند:

الگوریتم کلی کرالر‌ها!
الگوریتم کلی کرالر‌ها!


نکته‌ای در اینجاست که باید برای هر سایت، قسمت جست‌وجو در صفحه سرچ و همچنین کرال کردن صفحه فیلم را به صورت مجزا نوشت. ما می‌دانیم چه فیلمی می‌خواهیم و به همین دلیل اطلاعات دیگری از صفحه لازم نیست.

از چالش‌های موجود میتوان به وجود Cloudflare اشاره کرد که اجازه کرال کردن سایت‌ها را با BeautifulSoup نمی‌دهد. برای همین نمیتوانستیم سایت‌هایی که این مورد را فعال کرده بودند را کرال کنیم. در ادامه هم مشکلات فیلتر شدن سایت‌ها و … را داشتیم و داریم که خود یک داستان است…

چالش بعدی داستان سریال‌ها بودند! تا مرداد (حدود ۴ ۵ ماه) سیستم فقط از فیلم پشتیبانی می‌کرد! بعد از اضافه شدن سریال‌ها، دسته بندی لینک‌‌ها برای اینکه چه قسمتی از چه فصلی است یکی از چالش‌هایی بود که در قسمت تجزیه اسم فیلم و لینک داشتیم! حدود ۳ الگوریتم مختلف برای پیدا کردن فصل و قسمت سریال داریم که باز هم خطا دارد! مثلا فیلم‌های ترکی و انیمه از سخت‌ترین‌ها هستند! مخصوصا در قسمت کرال کردن فایل‌ها تلگرامی که جلوتر می‌گوییم این اصلی‌ترین چالش موجود است!

مشکلاتی که همیشه هست و باید حل بشند!
مشکلاتی که همیشه هست و باید حل بشند!


در حال حاضر، بعد از تعطیل شدن تعداد زیادی سایت و … ۱۰ سایت در سیستم قرار دارند. اتفاقی که امسال داشتیم، بعد از فیلتر شدن تعداد زیادی از لینک‌های سایت‌ها حدود ۸۰۰ هزار لینک کرال شده‌ی ما هم از دست رفت!! برای همین مجبور شدیم که یک سیستم Validation برای لینک‌ها داشته باشیم و هر هفته لینک‌ها را از نظر صحت چک کند!

برای دریافت اطلاعات فیلم‌ها، ابتدا ما به سراغ سایت مرجع IMDB رفتیم. سیستم‌های دیگری هم مانند TMDB و … وجود دارند اما IMDB بدلیل اینکه مرجع است و تقریبا تمام اطلاعات لازم از فیلم‌ها داخلش هست این سایت را انتخاب کردیم. برای کرال کردن و دریافت اطلاعات از IMDB با توجه استک پایتون سیستم از IMDBPY استفاده کردیم. مشکلاتی که توی استفاده از این کتابخانه داشتیم، خطاها و نبود مرجعی که ببینیم چه چیزهایی روی سایت هست (مانند انواع فیلم‌ها، ژانرها و … ) باعث که سیستم با خطاهای زیادی مواجه شود و در طول مسیر بهبود پیدا کند. در ادامه TMDB را هم به سیستم اضافه کردیم و از اطلاعات آن هم استفاده می‌کنیم

در ابتدا ساختاری که برای سیستم داشتیم یک لایه سرویس بود. به این شکل همان لایه سرویس مسئولیت کرال کردن سایت‌ها و … را به عهده داشت (قاعدتا میخواستیم فقط تست کنیم) در مسیر وجود یک Worker خودش را بیشتر نشان داد و celery نیز به سیستم اضافه شد. در celery ابتدا انجام کرال سایت‌ها انتقال داده شد که لایه سرویس سریع‌تر به درخواست کاربران پاسخ دهد و بعد هم موارد دیگر از لایه سرویس به لایه ووکر انتقال داده شد. در حال حاضر معماری سیستم به صورت زیر می‌باشد:


معماری خیلی ساده‌ای است اما خوب نیاز سیستم در همین حد است و بیشتر تمرکز روی بخش‌ها دیگر است. برای مثال در ابتدا از redis به عنوان Broker استفاده می‌شد اما با افزایش تعداد تسک‌ها به Rabbit مهاجرت کردیم! الان Redis بیشتر به عنوان یک کش و یک محل ذخیره موقت استفاده می‌شود.

استک موجود به صورت کلی روی Django قرار دارد و محل استقرار سیستم هم روی فندق می‌باشد. دلیل انتخاب فندق، وارد نشدن به قسمت زیرساختی و افزایش منابع و … بود. به عنوان مثال با ۵۰۰ مگابایت رم سیستم کار خودش را شروع کرد اما الان فقط بروکر ما ۵۰۰ مگابایت رم استفاده میکند! استفاده از فندق، راحتی در اتصال دامین و … را به ما میدهد و دیگر نیاز به مشکلات SSL و … هم نیست! همچنین مهم‌ترین ویژگی این است که سرور‌ها خارج ایران با یک قیمت مناسب قرار دارد که خود بسیار حائز اهمیت است. تجربه‌ای که از فندق دارم نسبت به لیارا و … این است که با میزان کمتری رم، سیستم‌ها بازدهی بیشتری دارند! انگار که از نظر زیرساختی فندق جایگاه بهتری دارد.

در حال حاضر سیستم حدود ۱۰ سرویس مختلف را به صورت همزمان در مدار دارد و بر روی فندق در حال کار هستند.

به صورت کلی الگوریتم‌ها نسبتا ساده هستند. نکته‌ای اصلی در اینجاست که شما فقط موارد لازم را در سیستم خودتان ندارید بلکه از تعداد زیادی بازگیر سوم استفاده میکنید و واسط آنها هستید که باید شما جلوی نشر خطا را بگیرید! به همین دلیل خطاهایی که دریافت میکنید بسیار زیاد است و همین موضوع باعث می‌شود کدی نسبتا کثیف داشته باشید! همچنین خیلی از جاها معماری شما را هم تحت تاثیر قرار میدهد!

در اینجا خیلی خلاصه معماری قسمت اولیه سیستم را توضیح دادیم! قاعدتا در پشت پرده ریزه کاری‌ها و پیچیدگی‌های بیشتری داریم که بتوانیم خدمات بهتری بدهیم.

خوشحالیم که حداقل دیگر لازم نیست خودمان دنبال فیلم بگردیم و پاپکورن همه‌ی فیلم‌ها را داخل خودش دارد! بیش از ۵۰ هزار فیلم و بیش از ۶ هزار سريال داریم که حداقل یکبار توسط کاربران سرچ شده است! (حداقل ۴ فایل یا لینک هم برای آنها داریم!)

همین حالا شما هم عضو پاپکورن بشید و دیگر نگران فیلم دیدن نباشید!