<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Mohammad</title>
        <link>https://virgool.io/feed/@Mth</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-21 21:54:12</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/12397/avatar/XU9qF3.png?height=120&amp;width=120</url>
            <title>Mohammad</title>
            <link>https://virgool.io/@Mth</link>
        </image>

                    <item>
                <title>دانلود ویدیو از آپارات</title>
                <link>https://virgool.io/@Mth/%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF-%D9%88%DB%8C%D8%AF%DB%8C%D9%88-%D8%A7%D8%B2-%D8%A2%D9%BE%D8%A7%D8%B1%D8%A7%D8%AA-fccmgmr1i2xk</link>
                <description>بعضیا پیش میاد که لازم هست تا یکسری ویدیو را از آپارات دانلود بشه. در آپارات این امکان وجود داره که ویدیوها مربوط به یک موضوع را به صورت لیست پخش ایجاد کرد تا با این دسته بندی دسترسی به ویدیوهای یک موضع راحتر باشه.لیست پخش در آپاراتاگر بخواهیم که از ویدیوهای آپارات یک نسخه آفلاین داشته باشیم امکان دانلود در  سایت برای مراجعین وجود دارد و به راحتی می توان از بین کیفیت های مختلف دانلود را شروع کرد.اما اگر کسی مثل من تبل باشد و بخواهد کل لیست پخش را دانلود کند کار خسته کننده ای برایش خواهد بود. چون می خواستم یکسری ویدیو را به صورت آفلاین استفاده کنم به فکر نوشتن کد برای دانلود دسته جمعی لیست پخش افتادم که اگر بعدها هم خواستم بتوانم از کد استفاده کنم.با سرچ در اینترنت کتابخانه BeautifulSoup را پیدا کردم که برای خواندن یک صفحه وب و استخراج اطلاعات از میان تگهای آن استفاده می شه. با راهنمایی اینترنتی کدی که بتواند دانلود را انجام دهد، نه لزوما خوب، را نوشتم. در ادامه می خوام این کد را اینجا کپی پیست کنم :)، چون نمی تونم دقیق خط به خط بنویسم چه اتفاقی افتاده D:؛ برای کار از 3 پکیچ پایتونی استفاده کردم که باید آنها را به کد اضافه کنیم:import os
import requests
from bs4 import BeautifulSoup یک تابع کوچیک برای دانلود فایل از یک ویدیو در آپارت به صورت زیر نوشتم:def downlaod_video(url, path=os.getcwd()):
    #درخواست صفحه وب
    page = requests.get(url)
    # بارگزاری صفحه وب
    soup = BeautifulSoup(page.content, &#039;html.parser&#039;)
    #دریافت عنوان ویدیو 
    #موجود در تگ h1

    #id=videoTitle
    title = soup.find(&#039;h1&#039;, attrs={&#039;id&#039;: &#039;videoTitle&#039;}).text.strip()
    #ایجاد مسیر ذخیر فایل
    file_name = title + &#039;.mp4&#039;
    file_path = os.path.join(path, file_name)
   #اگر فایل قبلا وجود داشت دانلود نمی کنه
    if os.path.exists(file_path)==False:
        #بدست آوردن آدرس فایل ویدیو
        file_url = soup.find(&#039;div&#039;, attrs={&#039;class&#039;: &#039;download-dropdown&#039;}).find_all(&#039;li&#039;)[-1].find(&#039;a&#039;)[&#039;href&#039;]          
        #دانلود ویدیو
        r = requests.get(file_url, stream = True)   
        with open(file_path,&amp;quotwb&amp;quot) as video: 
            for chunk in r.iter_content(chunk_size=1024):   
                if chunk: 
                    video.write(chunk) `تابع بالا 2 ورودی دارد:صفحه ویدیو در آپارات و محل ذخیره ویدیو. اگر موقع فراخوانی ویدیو محل ذخیره خالی باشد محل اجرای کد را محل پیش فرض در نظر می گیرد.آدرس فایل دانلود داخل یک تگ DIV با کلاس download-dropdown قرار دارد. داخل این تگ به تعداد کیفیت های موجود از ویدیو تگ li وجود دارد که  بهترین فرمت در آخرین تگ li قرار داد به همین دلیل آخرین تگ فراخوان می شود. داخل این تگ یک لینک وجود دارد که href موجود در آن آدرس دانلود است.حال می توان به راحتی یک صفحه را فراخوانی کرد و فایل را دانلود کرد.`url  = &#039;https://www.aparat.com/v/j2GCq&#039;
downlaod_video(url)تابع فوق فقط ویدیوی موجود در یک صفحه را دانلود می کند و اگر بخواهیم همه ویدیوهای یک لیست پخش را دانلود کنیم می شه به صورت زیر عمل کرد:یکی از صفحات رو خوانده می شه:url  = &#039;https://www.aparat.com/v/j2GCq&#039;
page = requests.get(URL)
soup = BeautifulSoup(page.content, &#039;html.parser&#039;)`بعد لیست پخش و آیتمهای موجود در اون لیست پخش در متغیر قرار می گیره:playlist_body = soup.find(&#039;div&#039;, attrs={&#039;class&#039;: &#039;playlist-body&#039;})
playlist_items = playlist_body.find_all(&#039;div&#039;, attrs={&#039;class&#039;: &#039;item&#039;})و می شه یک پوشه در درایو خاصی ایجاد که فایل های دانلودی در اونجا قرار بگیرند. اسم فولد بر اساس اسم لیست پخش تعیین می شه:playlist = playlist = soup.find(&#039;header&#039;, attrs={&#039;class&#039;: &#039;playlist-head&#039;})
path = &#039;d:\\&#039; + playlist.find(&#039;a&#039;, attrs={&#039;id&#039;:&#039;playlistTitle&#039;}).get_text()
try:
    os.mkdir(path)
except:
    print(&#039;This folder is exist&#039;)`در انتها داخل یک حلقه کلیه آیتمها خونده می شه و صفحات مربوطه استخراج و به تابع بالا ارسال می شه تا دانلود فیلم را انجام بده.برای اینکه تعداد دانلود ها هم نمایش داده بشه از کتابخانه تقدم برای سر نرفتن حوصله هم استفاده کردم:from tqdm.notebook import tqdm
with tqdm(total  =len(playlist_items)) as pbar:
    for index, a in enumerate(playlist_items):
        a_tag = a.find(&#039;a&#039;, href=True, text=True)
        item_url = &#039;https://www.aparat.com&#039; + a_tag[&#039;href&#039;]
        downlaod_video(item_url, path, index+1)
        pbar.update(1)`در کد بالا با فرض اینکه آیتمهای موجود در لیست پخش به ترتیب قرار دارند با index ترتیب ت مشخص می شه. برای همین در تابع 2 تغییر زیر باید انجام بشه:def downlaod_video(url, path=os.getcwd(), index=None):`وfile_name = str(index) + &#039;_&#039; + title + &#039;.mp4&#039; if index != None else title + &#039;.mp4&#039;`با اجرای این کد البته در جوپیتر فایلها ویدیوی آپارت دانلود می شه. نتیجه نهاییبا کمی دقت می تونید بفهمید چی شده :)</description>
                <category>Mohammad</category>
                <author>Mohammad</author>
                <pubDate>Thu, 16 Jan 2020 16:20:50 +0330</pubDate>
            </item>
                    <item>
                <title>خزر</title>
                <link>https://virgool.io/@Mth/%D8%AE%D8%B2%D8%B1-at82diyoggca</link>
                <description>اخیرا بحث در مورد حق ایران در مورد خزر رو زیاد می‌شنوم؛ مخصوصا در سالگرد استقلال بحرین از ایران این موضوع شدت گرفت. شاید بیشتر به این دلیل بوده که موضوع استقلال بحرین به حاشیه کشیده بشه؛ بحث‌ها چنان زیاد شده که حتی برای منی که تیتر خوان هستم هم موضوع جالب بود.موضع قوی این هست که ایران 50 درصد حقی که دریای خزر دارد را بخشیده به روسیه و از حقش گذشته.یکی از دوستان می گفت که صد در صد ما خزر را به روسیه بخشیدیم ، اون‌ها فقط با کسب اجازه از ما حق نگاه کردن به دریا را دارند نه چیز دیگری؛ لازم به ذکر است چون این دوست ما حاضر نشد ساقیش رو به ما هم معرفی کنه الان 5 ماهه به تخت بستیمش (این پاراگراف صد درصد دروغ است)نقشه خزر (از سایت دنیای سفر)وقتی به نقشه خزر نگاه می کنم اینکه ایران باید100 درصد خزر را داشته باشه کمی!!! اغراق  آمیز می‌شه، اما ایران و روسیه و بعدش شوروی چندین قرارداد داشته‌اند که 50 درصدی‌ها احتمالا بر اساس آن‌ها محاسباتشان را انجام می‌دهند. چون زیاد از اصطلاحات حقوقی سر در نمیارم زیاد متوجه محاسبات 50 درصدی‌ها نشدم، پس کمی خواستم قراردادها را مطالعه کنم و چون همانطور که گفتم از اصطلاحات سر در نمی‌آرم به ویکی‌پدیا رفتم. در ویکی مواردی را که در مورد سهم هست آورده و کسی که واقعا می‌خواهد نظر بدهد باید اصل قراردادها را دقیق مطالعه کند. با اینکه ویکی یک منبع قابل استناد نیست (مخصوصا ویکی فارسی که همیشه به سمت خاصی بایاس می‌باشد) اما چون عادت به تیتر خوانی (شما چیز دیگری می‌گویید) اجازه نمی‌دهد زیاد دقیق بشم پس به ویکی اکتفا کردم و چند نکته که برداشت کردم به این صورت است:ایران و شوروی هر کدام تا 10 مایل دریای می‌توانند در ساحلشان ماهیگیری کنند، یعنی کشتی‌هایشان بیشتر از 10 مایل دریای حق ندارند ماهیگیری کنند. (اینکه آیا از سال 1940 به این‌ور اگر کشتی ایرانی بیشتر از 10 مایل ساحل ایران برای ماهیگیری می‌رفت آیا با لایک شوروی مواجه می شد و یا ایران می‌توانست به کشتی‌های شوروی که این موضوع را نقض کنند لایک نشان بده را جایی ندیدم. و آیا کشتی‌های نظامی ایران می توانستند از 10 مایل دریا بیشتر برند را هم نمی‌دانم)همه کشتی‌های ایران و شوروی وقتی به بندری وارد می‌شوند مثل کشتی مقصد خواهد بود و قوانین دیگری براشون فرض نمی شه.هر دو کشور آزادانه می‌توانند با بیرق‌های خود تو خزر کشتی‌رانی کنند.تقریبا همه مسائل به کشتی رانی و مسائل گمرکی بر می‌گردد و یک عده اختیارات خاص تجاری برای شوروی. قبلا ایران حق کشتیرانی در خزر را نداشت که با سر کار آمدن شوروی، شوروی حق کشتیرانی را در تاریخ 1921 به ایران برگرداند و در 1940 مسائل گمرکی بحث شد. تنها بحثی که از حق حاکمیتی گفته شده 10 مایل دریای از ساحل طرفین آن هم برای ماهیگیری می‌باشد (و معلوم نیست مال آن کشور است یا نه؛ یعنی ایران). با چیزی که من استنباط کردم ایران نمی‌توانست در 10 مایلی شوروی ماهیگیری کند و برعکس، ولی احتمالا  می‌توانستند در کل آن کشتیرانی کنند. (برای کشتی‌ها نظامی مطلبی نبوده است)تنها موضوعی که برای دو کشور حق مالکیت قائل شده است حق ماهیگیری است و اینکه آیا ایران در همان قسمت ماهیگیری هم امکان عملیات نظامی مثلا با ناو جنگی داشته یا نه مشخص نیست.اگر بخواهیم حق مالکیت را  فقط بر اساس محدوده ماهیگیری برای دو کشور مشخص کنیم باید سهم هر کدام را محاسبه کنیم. طول سواحل دریای خزر در سایت موسسه بین‌المللی مطالعات  دریای خزر بدین صورت می‌باشد: قزاقستان  = 1900 روسیه =  1355آذربایجان =  820 ترکمنستان = 1768  ایران = 657 در این صورت خواهیم داشت:کل سواحل = 6500شوروی = 5843مساحت خزر در ویکی پدیا 371000 کیلومتر مربع نوشته شده است.بر اساس حق 10 مایل دریایی ماهیگیری برای ایران و شوروی، مساحتی که ایران برای ماهیگیری دارد را احتمالا به صورت زیر می‌توان تقریب زد (10 مایل برابر 18.52 کیلومتر):12167.64 = 18.52 * 657سهم ماهیگیری ایران از مساحت کل، 3.78 درصد می شودبا فرض درست بودن روش بالا سهم مساحت ماهیگیری شوروی را هم می توان به صورت زیر تقریب زد:108212.36 = 18.52 * 5843سهم ماهیگیری شوروی از مساحت کل، 29.17 درصد می شوداز اینجابا این فرض که محاسبات بالا درست می باشد موارد زیر را خواهیم داشت (در صورت نادرست بودن یا اصلاح می کنم و یا نوشته را حذف می کنم؛ اینطوریه):حال مساحت باقی مانده برای چانی زنی به صورت زیر خواهد بود:67.05 = 29.17 - 3.78 - 100یعنی این 67 درصد کاملا مساوی فرض شده است البته فقط کشتیرانی و اگر شوروی می خواست استفاده از منابع زیرزمینی را در قرارداد لحاظ کند چه اتفاقی می‌افتاد؟ اما اگر بخواهد برای استفاده از 67 درصد تصمیمی گرفته شود بعضی از مواردی که می‌توان به آنها اشاره کرد به صورت زیر است.استفاده به روش قبلی: کسی نتواند در 67 درصد ماهیگیری کند و یا از منابع زیرزمینی استفاده کند و یا همه بتوانند و هر کی بیشتر بتونه برداشت کنه (از ماهی، نفت، گاز) خوش به حالش هم می‌شه. و ...می شه تقسیم علی پروینی، یعنی :70.83 درصد سهم ایران96.22 درصد سهم شورویتقسیم مساوی خزر (50 درصد به همه):46.22 درصد به ایران  20.83 درصد به شورویاز این 46.22 درصد حدود 7 درصد داخل ایران است و 39 درصد از 10 مایلی شوروی بیرون. واقعا با نگاه به نقشه شوروی این کار رو می کنه آیا؟تقسیم مساوی سهم مشترک: یعنی 33.525 درصد به دو کشور برسد. در این صورت سهم‌ها به صورت زیر می‌شود.37.305 درصد سهم ایران62.695 درصد سهم شورویهمه سهم مشترک را به ایران داد:70.83 درصد سهم ایران29.17 درصد سهم شورویهمه سهم مشترک را به شوروی داد:3.78 درصد سهم ایران96.22 درصد سهم شورویبر اساس طول ساحل محاسبه کرد. 10.11 درصد از ساحل برای ایران می‌باشد، یعنی 6.78 درصد از 67.05 درصد برای ایران در مجموع 10.56 درصد سهم ایران و مابقی یعنی 89.44 درصد سهم شوروی می شود.بین 5 کشور تقسیم شود. در قرارداد 1940 آمده که دو کشور حق مساوی در کشتی‌رانی دارند، پس کشورهای استقلال یافته هم از این حق باید برخوردار باشند. به همین علت 67.05 درصد مشترک را بین همه تقسیم کنیم در اینصورت سهم هر کشور 13.41 درصد می‌شود و سهم کل ایران 17.19 درصد خواهد شد.با توجه به اینکه در ابتدای محاسبات هم گفتم فرض بر این است که محاسبات صحیح می‌باشد و حتی مواردی مانند نقاط مرزی و غیره در اینجا لحاظ نشده.</description>
                <category>Mohammad</category>
                <author>Mohammad</author>
                <pubDate>Thu, 29 Aug 2019 21:12:42 +0430</pubDate>
            </item>
                    <item>
                <title>تبدیل زیر نویس با فرمت vtt به srt با پایتون</title>
                <link>https://virgool.io/@Mth/%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%D8%B2%DB%8C%D8%B1-%D9%86%D9%88%DB%8C%D8%B3-%D8%A8%D8%A7-%D9%81%D8%B1%D9%85%D8%AA-vtt-%D8%A8%D9%87-srt-%D8%A8%D8%A7-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-bpxxxreziu90</link>
                <description>زیرنویس بعضی از فیلم ها (مانند فیلم های آموزشی udacity و coursera ) با فرمت .vtt می باشند؛ که بعضی از پلیرها از این فرمت زیر نویس پشتیبانی نمی کنند.یکی از فرمت های عمومی زیرنویس فرمت .srt هست که اکثر پلیرها از آن پشتیبانی می کنند. در صورتیکه با این مشکل مواجه هستید و پایتون هم بلد هستید می توانید با کد زیر فرمت .vtt را به .srt تبدیل کنید:ابتدا ماژول webvtt را باید نصب کنید:pip install webvtt-pyو بعد کد زیر را اجرا کنید:import webvtt
import os
path =&amp;quotمسیر پوشه اصلی&amp;quot
for r,d,fs in os.walk(path):
    for f in fs:   
        if f.endswith(&#039;.vtt&#039;):
            vtt = webvtt.read(os.path.join(r,f))
            vtt.save_as_srt()  این کد داخل هر پوشه و کنار فایل .vtt یک فایل .srt ایجاد می کند.با این ماژول می توانید برعکس هم عمل کنید. یعنی تبدیل .srt به .vtt .</description>
                <category>Mohammad</category>
                <author>Mohammad</author>
                <pubDate>Wed, 21 Aug 2019 11:29:02 +0430</pubDate>
            </item>
            </channel>
</rss>