دانلود فیلم به شکل گیکی، دانلود خودکار فیلم از YIFY روی کامپیوتر

فکر کنم همینکه یه بخش برای معرفی فیلم دارم نشون بده که اهل فیلم دیدنم و سایت مورد علاقم هم برای دانلود yts.to هست که رلیزهای YIFY توش برای دانلود قرار داره. گاهی که منتظر اومدن یک فیلم هستم خیلی واسم اعصاب خورد کنه که هی هر روز چک کنم ببینم اون فیلم برای دانلود اومده یا نه بعد اگه اومده بود تورنتش رو مستقیم کنم و لینک دانلودش رو از رو سرور خودم بردارم و بذارم تو لیست دانلودهام. برای همین گفتم بیام این فرایند رو خودکار کنم! اما قبل شروع کار بگم که اگه شما هم میخواین دقیقا عین کار من رو انجام بدین لازمه تا اول Deluge رو روی سرورتون نصب کنین و مثل من هم دانلوداتون رو انجام بدین. خب بریم وارد جزئیات کار بشیم!

اول از همه ببینیم دقیقا قراره چیکار کنیم! کدی که میخوایم بنویسیم اول باید بره ببینه اون فیلم مورد نظر برای دانلود اومده یا نه، بعد اگه اومده بود ببینه نسخه مورد نظرمون که برای من ۷۲۰ هست هم رلیز شده یا نه. بعد اگه نسخه مورد نظر هم اومده بود لینک دانلودش رو بده به Deluge تا دانلودش کنه و وقتی دانلودش کامل شد لینک دانلود فیلم بیاد تو لیست دانلودهام! قبل از اینکه بریم سراغ کدهای مورد نیاز این رو بگم که مسلما این روش که من دارم میرم بهترین روش نیست و این کد هم بهینه‌ترین کد ممکن نیست، ولی مهم اینه که در حال حاظر کاری رو که من میخوام بدون هیچ مشکلی انجام میده :))

برای شروع کار یه فایل میسازم که توش قراره لینک دانلود فیلم مورد نظرمون قرار بگیره و البته باید تو مسیری باشه که از مرورگر هم بشه بهش دسترسی داشت. و البته باید سطح دسترسیش رو ۷۷۷ هم بذاریم. حالا اینکه چرا این فایل رو الآن ساختیم و سطح دسترسیش رو کردیم ۷۷۷ رو بعدا بهش میرسیم.

touch /var/www/html/address.txt
chmod 777 /var/www/html/address.txt

 

خب، بریم سراغ اصل کد! لازمه ببینیم که فیلممون برای دانلود اومده یا نه! برای این کار محتویات صفحه اول yts.to رو توی یک فایل میریزیم و داخل اون فایل دنبال اسم فیلممون میگردیم. نیازی نیست که حتما دنبال اسم کامل فیلم بگردیم. برای نوشتن کد فرض رو بر این میذارم که مثل من منتظر فیلم Furious 7 هستین و بر همین اساس میریم جلو. خب اینم کدی که اسم فیلم رو پیدا میکنه:

w3m -dump yts.to > yts
a="$(grep "Furious" yts)"

 

با این کد اگه اسم فیلممون تو سایت باشه یه عبارتی حالا هرچی توی متغییر a ذخیره میشه و خالی نبودن متغییر a فیلم اومده برای دانلود و باید دنبال لینک دانلودش بگیردیم. برای این کار اول از یه شرط استفاده میکنیم تا متغییر a رو چک کنه:

if [ "$a" != "" ]
then

fi

 

از اینجا به بعد کد داخل این شرط قرار میگیره. امیدوارم بتونم بقیه کار رو خوب بتونم توضیح بدم! حالا که فیلم اومده باید ببینیم که نسخه ۷۲۰ هم اومده یا نه. اول بیاین یه نگاهی به سورس سایت yts.to بندازیم برای یک فیلم:

class="browse-movie-title">Cinderella</a> <div class="browse-movie-year">2015</div>  <div class="browse-movie-tags">   <a href="https://yts.to/torrent/download/6EB6804A6A4650FD64C9FC3257C2B2ECB7808F50.torrent">720p</a>    <a href="https://yts.to/torrent/download/93E545F95354D90539C51BC3A59AC685B613C75C.torrent">1080p</a>   </div>  </div> </div>

خب تو سورس قسمتی که مربوط به دانلود فیلم هست در ابتداش اسم فیلم به همراه یک < قبلش قرار داره و در انتها هم سه تا div قرار دارن. پس اول سورس صفحه رو توی یک فایل ذخیره میکنیم:

wget -O - yts.to > yts

 

و تو سورس صفحه هم با دستور egrep دنبال قسمت مربوط به فیلممون میگردیم. آپشن o هم که بکار بردم دلیلش این هست که فقط اون قسمتی که کد فیلم توش هست رو برگردونه نه کل محتویات فایل رو و کد مربوط به بخش دانلود فیلم رو توی متغییر temp‌ میریزیم:

temp="$(egrep -o "(>Furious).{10,400}(</div>  </div> </div>)" yts)"

درباره قسمت (>Furious).{10,400}(</div>  </div> </div>) هم بگم که یه ساختار regex هست (اسمش رو گوگل کنید تا بتونید هم اطلاعات بیشتری ازش کسب کنید هم یاد بگیرید چجوریه، خودمم با گوگل یاد گرفتمش) که میگه عبارت >Furious رو پیدا کن و بعد ۱۰ تا ۴۰۰ کاراکتر برو جلو تا به عبارت برسی. خب حالا باید ببینیم عبارت 720 توی متغییر temp‌ هست یا نه و اگه بود یعنی نسخه ۷۲۰ برای دانلود آمادست. پس توی متغییر temp رو میگردم:

temp="$(echo $temp | grep 720)"

 

حالا اگه نسخه ۷۲۰ اومده باشه یه چیزی توی متغییر temp‌ ذخیره میشه. پس یه شرط میذاریم تا متغییر temp رو چک کنه و ادامه کدمون رو توی اون شرط میذاریم:

if [ "$temp" != "" ]
then

fi

 

حالا تا اینجای کار میدونیم که فیلممون نسخه ۷۲۰ش برای دانلود اومده و باید از تو سرورس صفحه که توی فایل yts ذخیره شده لینک رو برداریم. برای برداشتن لینک مجددا سراغ egrep و ساختار regex‌میریم و البته قبلش هم با استفاده از mutt یه ایمیل میفرستم که بدونم فیلم روی yts اومده:

mutt -s "Furious 7" address@domain.com <<< "Ready To Download On YTS!"
tlink="$(egrep -o "(>Furious).{10,400}(</div>  </div> </div>)" yts | egrep -o "(http).{77}(720)" | egrep -o "(http).{1,100}(torrent)" | tail -1)"

درباره ساختار کد پیدا کردن لینک واقعا نمیدونم چجوری توضیح بدم فقط میتونم بگم خودتون مرحله به مرحله اجراش کنین سر در میارین چی به چیه و اون tail -1 آخر هم برای اینه که تو شرایطی خاص ممکنه لینک دانلود ۲ یا ۳ بار برگردونده بشه که با این دستور میکنیمش یکی و در نهایت هم لینک رو توی متغییر tlink داریم. حالا باید لینک رو بدیم به deluge. برای این کار از deluge-console استفاده میکنیم. اول روی سرور نصبش میکنیم که خوشبختانه تو مخازن موجود هست و با نوشتن deluge-console اجراش میکنیم و اخطار زیبای Failed to connect to 127.0.0.1:58846 with reason: Username does not exist مواجه میشیم. با نوشتن exit از برنامه deluge-console خارج میشیم و این دستور رو میزنیم:

cp /var/lib/deluge/.config/deluge/auth ~/.config/deluge/auth

 

حالا مجددا وارد deluge-console میشیم و میبینیم که هیچ پیغام خطایی نمیده. با نوشتن عبارت help هم میتونیم آپشن‌هایی که برای استفاده داره رو ببینیم.

deluge-console

 

کارمون فعلا با سرور تموم شد و میریم سراغ ادامه کدمون.  برای اضافه کردن فایل تورنت به deluge هم از این دستور استفاده میکنیم:

deluge-console add $tlink

لینک به deluge اضافه شده و باید صبر کنیم دانلود بشه. اول یک ساعت صبر میکنیم و اگه فایل دانلود نشده بود دوباره هر ۵دقیقه وضعیتش رو چک میکنیم:

sleep 3600
complete="$(deluge-console info Furious | wc -l)"
while [ "$complete" = "9" ]
do
	sleep 300
	complete="$(deluge-console info Furious | wc -l)"
done

با دستور info‌ میتونیم اطلاعات یک تورنت رو بگیریم و اگه تورنت کامل دانلود نشده باشه خروجیش میشه ۹ خط که تعداد خطوط خروجی رو هم با wc -l میشمریم و تا زمانی که دانلود تورنت کامل نشده باشه کد رو این قسمت گیر میکنه.‌حالا که دانلودش روی سرور کامل شده دوباره به خودم یه ایمیل میفرستم که بدونم دانلودش تموم شده:

mutt -s "Furious 7" address@domain.com <<< "Ready To Download On Your Computer!"

حالا باید برم سراغ تولید لینک دانلود فایل. من تورنت‌هام تو مسیر var/www/html/torrents دانلود میشن پس از این دستور برای ساخت لینک دانلود فایل و ذخیرش در متغییر address استفاده میکنم:

address="http://server_ip/torrents/""$(cd /var/www/html/torrents && ls | grep Furious)""/""$(cd /var/www/html/torrents/Furious* && ls | grep mp4)"

اینم توضیح خاصی نداره 😀 حالا لینک دانلود رو تو فایل address.txt که اول کار ساختیم میریزیم:

echo $address > /var/www/html/address.txt

خب باید به سیستم هم بفهمونیم که بره از این فایل لینک دانلود رو برداره. برای این کار این دستور رو توی کرون تب یک دقیقه قبل از شروع دانلود شبانه میزنیم:

w3m -dump http://server_ip/address.txt >> /home/hamed/dllinks

دلیل این هم که فایل address.txt رو اول کار رو سرور درست کردم این بود که اگه این فایل وجود نداشته باشه و سیستم سعی کنه محتویاتش رو بگیره ارور ۴۰۴ دریافت میکنه و نوشته‌های ارور ۴۰۴ تو لیست دانلودم قرار میگیره و این اصلا جالب نیست ولی اگه این فایل وجود داشته باشه و داخلش خالی باشه همون هیچی تو لیست دانلودهام قرار میگیره و هیچ مشکلی ایجاد نمیشه! اما یه مشکل دیگه هم هست! اومدیم و این فایل داخلش لینک دانلود فیلممون قرار گرفت و ما هم این فیلم رو دانلود کردیم، شب‌های بعد هم سیستم میره دوباره از اینجا لینک دانلود فیلم رو برمیداره و میذاره تو لیستمون! برای اینکه این کار انجام نشه میام و از تابع shell_exec‌ تو php استفاده میکنم که باهاش میشه دستورات خط فرمان رو اجرا کرد. دلیل تغییر سطح دسترسی فایل address.txt به ۷۷۷ هم این بود که بتونیم راحت از طریق فایل php تغییرش بدیم. خب فایل php مورد نیاز رو ایجاد میکنیم:

nano /var/www/html/rmadr.php

و داخلش این کد رو قرار میدم:

<?php
shell_exec('echo "" > address.txt');
?>

حالا هر دفعه که این فایل رو اجرا کنیم متویات فایل حاوی لینک خالی میشه. روی سیستم خودم هم این آدرس رو درست بعد از اینکه محتویات فایل address.txt رو دریافت کردم اجرا میکنم تا فایل آدرس خالی بشه و نتیجه این دستور میشه که یک دقیقه قبل از شروع دانلود شبانه اجرا میشه:

w3m -dump http://server_ip/address.txt >> /home/hamed/dllinks && w3m -dump http://server_ip/rmadr.php

اوه! تقریبا یادم رفت کد کاملی که قراره روی سرور اجرا بشه رو بذارم. کدنهایی که روی سرور باید اجرا بشه این هست:

w3m -dump yts.to > yts
a="$(grep "Furious" yts)"
if [ "$a" != "" ]
then
	wget -O - yts.to > yts
	temp="$(egrep -o "(>Furious).{10,400}(</div>  </div> </div>)" yts)"
	temp="$(echo $temp | grep 720)"
	if [ "$temp" != "" ]
	then
		mutt -s "Furious 7" address@domain.com <<< "Ready To Download On YTS!"
		tlink="$(egrep -o "(>Furious).{10,400}(</div>  </div> </div>)" yts | egrep -o "(http).{77}(720)" | egrep -o "(http).{1,100}(torrent)" | tail -1)"
		deluge-console add $tlink
		sleep 3600
		complete="$(deluge-console info Furious | wc -l)"
		while [ "$complete" = "9" ]
		do
			sleep 300
			complete="$(deluge-console info Furious | wc -l)"
		done
		mutt -s "Furious 7" address@domain.com <<< "Ready To Download On Your Computer!"
		address="http://server_ip/torrents/""$(cd /var/www/html/torrents && ls | grep Furious)""/""$(cd /var/www/html/torrents/Furious* && ls | grep mp4)"
		echo $address > /var/www/html/address.txt
	fi
fi

این کد نهایی هست که باید هر چند دقیقه اجرا بشه و چک کنه که فیلم برای دانلود اومده. که میشه این کار رو با crontab‌کرد که هر چند دقیقه یکبار اجرا بشه. البته باید یکم تغییرات ایجاد کنین که وقتی یکبار کد اجرا شد و لینک دانلود نسخه۷۲۰ رو داد به deluge‌کد دیگه اجرا نشه. نمیدونم چرا ولی من نتونستم از طریق crontab این کد رو اجرا کنم. برای همین کل کد رو داخل یک حلقه while قرار دادم که تا زمانیکه نسخه ۷۲۰ رو پیدا میکنه و به deluge‌ میدش در حال اجرا باشه!

work=0
while [ "$work" = 0 ]
do
	sleep 900
	w3m -dump yts.to > yts
	a="$(grep "Furious" yts)"
	if [ "$a" != "" ]
	then
		wget -O - yts.to > yts
		temp="$(egrep -o "(>Furious).{10,400}(</div>  </div> </div>)" yts)"
		temp="$(echo $temp | grep 720)"
		if [ "$temp" != "" ]
		then
			work=1
			mutt -s "Furious 7" address@domain.com <<< "Ready To Download On YTS!"
			tlink="$(egrep -o "(>Furious).{10,400}(</div>  </div> </div>)" yts | egrep -o "(http).{77}(720)" | egrep -o "(http).{1,100}(torrent)" | tail -1)"
			deluge-console add $tlink
			sleep 3600
			complete="$(deluge-console info Furious | wc -l)"
			while [ "$complete" = "9" ]
			do
				sleep 300
				complete="$(deluge-console info Furious | wc -l)"
			done
			mutt -s "Furious 7" address@domain.com <<< "Ready To Download On Your Computer!"
			address="http://server_ip/torrents/""$(cd /var/www/html/torrents && ls | grep Furious)""/""$(cd /var/www/html/torrents/Furious* && ls | grep mp4)"
			echo $address > /var/www/html/address.txt
		fi
	fi
done

برای این هم که کد حتی بعد از قطع اتصال ssh درحال اجرا بمونه اول برنامه screen رو از تو مخازن نصب کردم. بعد از اون با نوشتن screen وارد برنامه شدم و برای رد کردنم توضیحات هم space رو زدم و داخل برنامه screen کد رو اجرا کردم. حالا برنامه همیشه درحال اجرا میمونه روی سرور و هر ۱۵ دقیقه یکبار سایت yts.to رو چک میکنه تا اگه فیلم اومد کارای مورد نیاز رو انجام بده.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.