انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید




نویسنده موضوع: اسکریپت تعمیر زیرنویس های فارسی  (دفعات بازدید: 6150 بار)

0 کاربر و 7 مهمان درحال مشاهده موضوع.

آفلاین moeinroid

  • Jr. Member
  • *
  • ارسال: 33
  • جنسیت : پسر
    • وبلاگ شخصی
اسکریپت تعمیر زیرنویس های فارسی
« : 25 آذر 1395، 06:08 ب‌ظ »
سلام
اسکریپت Persian Subtitle Fixer رو امروز با بش نوشتم (با کمک از آموزش های آقای امیرصمیمی و جادی) که زیرنویس‌هاتون رو بصورت دسته‌جمعی تعمیر می‌کنه
لینک گیت‌هاب :‌ https://github.com/moeinroid/PersianSubtitleFixer
که زیرنویس های شما رو به UTF-8 تبدیل میکنه
برای اجرا کافیه اول بهش دسترسی اجرایی بدید با دستور زیر:
chmod +x PersianSubtitleFixer.shبعد با دستور زیر اجراش می‌کنیم :
./PersianSubtitleFixer.shدر مرحله اول شما باید نام پوشه رو انتخاب کنید که در مسیر خانه شما ایجاد میشه و زیرنویس های تبدیل شده در اون قرار می‌گیرند
بعد باید مسیر زیرنویس هاتون رو بدید (مسیر خود زیر نویس رو نه!)
بعد منتظر میمونید تا همه‌ی زیر نویس های موجود توی اون مسیر به UTF-8 تبدیل بشه
روزخوش
« آخرین ویرایش: 26 آذر 1395، 02:32 ب‌ظ توسط moeinroid »
چیزهایی که جالب می‌بینم و یاد می‌گیرم این‌جا می‌نویسم.

آفلاین علیرضا احسانی

  • Full Member
  • *
  • ارسال: 153
  • جنسیت : پسر
  • گنو/لینوکس به خاطر آزادی. نه بخاطر قیمت
    • لینوکس و من
پاسخ : اسکریپت تعمیر زیرنویس های فارسی
« پاسخ #1 : 25 آذر 1395، 07:57 ب‌ظ »
دمت گرم کاربردیه.یه دوستی یه سایت برا همین کار درست کرده بود اونم خوبه
http://subtitlefixer.ir/
موفق باشی :)
لینوکس و من حاصل تجربه هامون از  سرو کله زدن با گنو/لینوکس و نرم افزار های آزاد:)

آفلاین amir2009

  • Sr. Member
  • *
  • ارسال: 452
پاسخ : اسکریپت تعمیر زیرنویس های فارسی
« پاسخ #2 : 26 آذر 1395، 01:24 ق‌ظ »
اینگونه فعالیتها خوبه.
فقط جهت اطلاع برنامه subtitle fixer دارای رابط گرافیکی qt4 چندسال پیش نوشته شده که منم ازون استفاده میکنم.امکانات خوبی داره و راحته.
اگه کسی بتونه رابط گرافیکی رو بهبود بده مثلا qt5 خیلی عالی میشه.

آفلاین Ma$oud

  • Sr. Member
  • *
  • ارسال: 293
  • جنسیت : پسر
پاسخ : اسکریپت تعمیر زیرنویس های فارسی
« پاسخ #3 : 26 آذر 1395، 02:02 ب‌ظ »
اینگونه فعالیتها خوبه.
فقط جهت اطلاع برنامه subtitle fixer دارای رابط گرافیکی qt4 چندسال پیش نوشته شده که منم ازون استفاده میکنم.امکانات خوبی داره و راحته.
اگه کسی بتونه رابط گرافیکی رو بهبود بده مثلا qt5 خیلی عالی میشه.

مثلا چه امکاناتی؟؟  ???
بگید شاید من بتونم بهبود ببخشم  ;D

آفلاین ارباب!

  • Sr. Member
  • *
  • ارسال: 448
  • جنسیت : پسر
پاسخ : اسکریپت تعمیر زیرنویس های فارسی
« پاسخ #4 : 26 آذر 1395، 03:16 ب‌ظ »
خیلی خوبه..
مثلا اگه تو منوی راست کلیک یه چیزی بیاد که تمام زیرنویس های انتخاب شده رو ببره به utf-8 خیلی خوب می شه (در همون فایل ها).. و قبلش یه بک آپ بگیره ازشون جهت احتیاط بهتره به نظرم..
« آخرین ویرایش: 26 آذر 1395، 03:18 ب‌ظ توسط ارباب! »
Void Linux + XFCE

آفلاین Ma$oud

  • Sr. Member
  • *
  • ارسال: 293
  • جنسیت : پسر
پاسخ : اسکریپت تعمیر زیرنویس های فارسی
« پاسخ #5 : 27 آذر 1395، 01:27 ق‌ظ »
خیلی خوبه..
مثلا اگه تو منوی راست کلیک یه چیزی بیاد که تمام زیرنویس های انتخاب شده رو ببره به utf-8 خیلی خوب می شه (در همون فایل ها).. و قبلش یه بک آپ بگیره ازشون جهت احتیاط بهتره به نظرم..

خواستم تاپیک جدید بزنم ولی موضوع یکیه دیگه (ولی خب پیشنهاد می کنم به پست اول اضافه بشه):

طبق چیزی که دوستمون گفت: تمام زیرنویس های انتخاب شده به utf-8 می بره و قبلش در یک فولدر بک آپ می گیره ازشون (واقعا ایده خیلی خوبی بود  :D)

فقط فایل پیوست شده رو با نام Convert to UTF8 در مسیر : $HOME/.local/share/nautilus/scripts/ کپی کنید و دسترسی اجرایی بهش بدید : chmod +x $HOME/.local/share/nautilus/scripts/Convert\ to\ UTF8 و تمام!

حالا روی زیرنویس(ها)ی مورد نظر کلیک راست کنید و از قسمت Scripts گزینه Convert to UTF8 رو بزنید!  :D

آفلاین Sosha

  • High Sr. Member
  • *
  • ارسال: 689
  • جنسیت : پسر
  • Only Ubuntu <3
    • نوشته های یک دوستدار گنو
پاسخ : اسکریپت تعمیر زیرنویس های فارسی
« پاسخ #6 : 07 دی 1395، 02:56 ق‌ظ »
دمتون گرم \\:D/
اگه این ارسال بهت کمک کرد، دنبال دکمهٔ تشکر نگرد. به جاش برو خدا رو شکر کن که با دمپایی نیومدم سراغت!

آفلاین moeinroid

  • Jr. Member
  • *
  • ارسال: 33
  • جنسیت : پسر
    • وبلاگ شخصی
پاسخ : اسکریپت تعمیر زیرنویس های فارسی
« پاسخ #7 : 16 دی 1395، 04:34 ب‌ظ »
--نسخه جدید--
سلام
نسخه جدید اسکریپت رو توی گیت‌هاب قرار دادم.
تغییرات:
-امکان آدرس دهی و نام‌گذاری با آرگومان
-رفع مشکلات جزئی

برای این کار شما می‌تونید بصورت زیر عمل کنید:
./PersianSubtitleFixer [YOUR SUBTITLES LOCATION] [NAME OF FIXED SUBTITLES DIRECTORY IN YOUR HOME]
برای مثال اگر زیرنویس های شما در مسیر /home/name/video قرار داره و اسمی که برای پوشه زیرنویس‌های تعمیر شده می‌خواید بزاید fixed باشه به این صورت عمل می‌کنیم:
./PersianSubtitleFixer.sh "/home/name/video" "fixed"
پیشنهاد می‌کنم شماهم توی "" قرار بدید که به مشکل نخورید.
اگر هم که به این صورت نگید بهش ازتون سوال می‌کنه برای اسم و مسیر.
روزخوش
« آخرین ویرایش: 16 دی 1395، 05:11 ب‌ظ توسط moeinroid »
چیزهایی که جالب می‌بینم و یاد می‌گیرم این‌جا می‌نویسم.

آفلاین ارباب!

  • Sr. Member
  • *
  • ارسال: 448
  • جنسیت : پسر
پاسخ : اسکریپت تعمیر زیرنویس های فارسی
« پاسخ #8 : 16 دی 1395، 07:49 ب‌ظ »
خیلی خوبه..
مثلا اگه تو منوی راست کلیک یه چیزی بیاد که تمام زیرنویس های انتخاب شده رو ببره به utf-8 خیلی خوب می شه (در همون فایل ها).. و قبلش یه بک آپ بگیره ازشون جهت احتیاط بهتره به نظرم..

خواستم تاپیک جدید بزنم ولی موضوع یکیه دیگه (ولی خب پیشنهاد می کنم به پست اول اضافه بشه):

طبق چیزی که دوستمون گفت: تمام زیرنویس های انتخاب شده به utf-8 می بره و قبلش در یک فولدر بک آپ می گیره ازشون (واقعا ایده خیلی خوبی بود  :D)

فقط فایل پیوست شده رو با نام Convert to UTF8 در مسیر : $HOME/.local/share/nautilus/scripts/ کپی کنید و دسترسی اجرایی بهش بدید : chmod +x $HOME/.local/share/nautilus/scripts/Convert\ to\ UTF8 و تمام!

حالا روی زیرنویس(ها)ی مورد نظر کلیک راست کنید و از قسمت Scripts گزینه Convert to UTF8 رو بزنید!  :D

سلام..
ممنون که این ایده رو عملی کردید.. یه تغییراتی دادم:
#!/bin/bash

# ~/.local/share/nautilus/scripts/

IFS=$'\t\n'

BACK_DIR=".subtitle.backup"       
if [ ! -d "$BACK_DIR" ]; then
    mkdir ./$BACK_DIR
fi

for fileName in `echo $*`; do

    encoding=`file -b "$fileName" | awk {'print $1'}`

    if cp "$fileName" "$BACK_DIR"; then
if [ "$encoding" == "Little-endian" ]; then
iconv -f UTF-16LE -t UTF-8 "$fileName" > "./.$fileName.utf8"
mv "./.$fileName.utf8" "$fileName"
elif [ "$encoding" == "Non-ISO" ]; then
iconv -f CP1256 -t UTF-8 "$fileName" > "./.$fileName.utf8"
mv "./.$fileName.utf8" "$fileName"
elif [ "$encoding" == "ISO-8859" ]; then     
iconv -f CP1256 -t UTF-8 "$fileName" > "./.$fileName.utf8"
mv "./.$fileName.utf8" "$fileName"
fi
    fi
done
چک کردن برای ISO-8859 رو بهش اضافه کردم.. برای من بدون این کار نمی کرد..
یه مشکل دیگه هم در convert کردن فایل هایی که تو نامشون space هست وجود داشت.. که اون رو حل کردم.. در عوض یه مشکل دیگه به وجود اومد.. و اونم این که حالا فقط یه فایل رو می شه convert کرد و چند تا فایل رو به صورت همزمان نمی شه..:
cp: cannot stat 'b (4th copy).srt b (5th copy).srt b (another copy).srt b (another copy)d.srt': No such file or directoryراه حل درستش چیه..؟ کسی ایده ای به ذهنش می رسه..؟

الان بخوام بهتر توضیح بدم:
در اسکریپت قبلی اگه یه فایل تو نامش space بود از محل space تقسیم می شد اسم و به مشکل می خوردیم..
پس تو اسکریپت جدید برای این که این تقسیم شدنه اتفاق نیافته این متغیر رو از این مقدار:
IFS=$' \t\n'به این مقدار تغییر دادم:
IFS=$'\t\n'ولی خوب این کار خودش یه مشکل دیگه رو ایجاد می کنه.. که پیغامش خطای cannot stat رو بالا گذاشته بودم..
برای این که متوجه بشید اون پیغام خط از کجا می آد می تونید nautilus رو این جوری اجرا کنید..:
nautilus -q
nautilus --no-desktop
و پنجره رو نبندید تا پیغام ها رو بخونید..
بعد که اسکریپت رو با انتخاب این چند فایل اجرا می کنید:
b (4th copy).srt
b (5th copy).srt
b (another copy).srt
b (another copy)d.srt
اون پیغام می آد..
چون آرگومان ها به این شکل با space دریافت شده:
b (4th copy).srt b (5th copy).srt b (another copy).srt b (another copy)d.srt
که خوب الان با تنظیم کردن اون IFS گفتیم دیگه از محل space ها نام فایل رو جدا نکن که حداقل واسه فایل هایی که نامشون space داشته مشکلی ایجاد نشه.. ولی خوب الان این خط بالا کلش یه نام فایل در نظر گرفته می شه..
حالا نکته اینه که اصن برفرض که ما می خواستیم از محل space ها جدا کنیم.. از کجا معلوم که از کدوم محل ها باید جدا کنیم..
مثلا احتمالش هست که b دوم آخرین کاراکتر فایل اول بوده باشه نه اولین کاراکتر فایل دوم..
« آخرین ویرایش: 16 دی 1395، 08:54 ب‌ظ توسط ارباب! »
Void Linux + XFCE

آفلاین ارباب!

  • Sr. Member
  • *
  • ارسال: 448
  • جنسیت : پسر
پاسخ : اسکریپت تعمیر زیرنویس های فارسی
« پاسخ #9 : 16 دی 1395، 07:52 ب‌ظ »
--نسخه جدید--
سلام
نسخه جدید اسکریپت رو توی گیت‌هاب قرار دادم.
تغییرات:
-امکان آدرس دهی و نام‌گذاری با آرگومان
-رفع مشکلات جزئی

برای این کار شما می‌تونید بصورت زیر عمل کنید:
./PersianSubtitleFixer [YOUR SUBTITLES LOCATION] [NAME OF FIXED SUBTITLES DIRECTORY IN YOUR HOME]
برای مثال اگر زیرنویس های شما در مسیر /home/name/video قرار داره و اسمی که برای پوشه زیرنویس‌های تعمیر شده می‌خواید بزاید fixed باشه به این صورت عمل می‌کنیم:
./PersianSubtitleFixer.sh "/home/name/video" "fixed"
پیشنهاد می‌کنم شماهم توی "" قرار بدید که به مشکل نخورید.
اگر هم که به این صورت نگید بهش ازتون سوال می‌کنه برای اسم و مسیر.
روزخوش

سلام..
خیلی ممنون.. کدتون امکانات جالبی داره.. ولی اگه بشه این قابلیت استفاده توسط راست کلیک رو هم براش طراحی کرد خیلی خوب می شه.. مخصوصا که فقط برای nautilus نباشه و برای یه سری فایل منیجر های دیگه هم بشه..
Void Linux + XFCE

آفلاین Ma$oud

  • Sr. Member
  • *
  • ارسال: 293
  • جنسیت : پسر
پاسخ : اسکریپت تعمیر زیرنویس های فارسی
« پاسخ #10 : 16 دی 1395، 08:03 ب‌ظ »
--نسخه جدید--
سلام
نسخه جدید اسکریپت رو توی گیت‌هاب قرار دادم.
تغییرات:
-امکان آدرس دهی و نام‌گذاری با آرگومان
-رفع مشکلات جزئی

برای این کار شما می‌تونید بصورت زیر عمل کنید:
./PersianSubtitleFixer [YOUR SUBTITLES LOCATION] [NAME OF FIXED SUBTITLES DIRECTORY IN YOUR HOME]
برای مثال اگر زیرنویس های شما در مسیر /home/name/video قرار داره و اسمی که برای پوشه زیرنویس‌های تعمیر شده می‌خواید بزاید fixed باشه به این صورت عمل می‌کنیم:
./PersianSubtitleFixer.sh "/home/name/video" "fixed"
پیشنهاد می‌کنم شماهم توی "" قرار بدید که به مشکل نخورید.
اگر هم که به این صورت نگید بهش ازتون سوال می‌کنه برای اسم و مسیر.
روزخوش

خط ۳۶، ۳۷
به جای else و if می تونی از elif استفاده کنی  ;)

آفلاین Ma$oud

  • Sr. Member
  • *
  • ارسال: 293
  • جنسیت : پسر
پاسخ : اسکریپت تعمیر زیرنویس های فارسی
« پاسخ #11 : 16 دی 1395، 09:50 ب‌ظ »
خیلی خوبه..
مثلا اگه تو منوی راست کلیک یه چیزی بیاد که تمام زیرنویس های انتخاب شده رو ببره به utf-8 خیلی خوب می شه (در همون فایل ها).. و قبلش یه بک آپ بگیره ازشون جهت احتیاط بهتره به نظرم..

خواستم تاپیک جدید بزنم ولی موضوع یکیه دیگه (ولی خب پیشنهاد می کنم به پست اول اضافه بشه):

طبق چیزی که دوستمون گفت: تمام زیرنویس های انتخاب شده به utf-8 می بره و قبلش در یک فولدر بک آپ می گیره ازشون (واقعا ایده خیلی خوبی بود  :D)

فقط فایل پیوست شده رو با نام Convert to UTF8 در مسیر : $HOME/.local/share/nautilus/scripts/ کپی کنید و دسترسی اجرایی بهش بدید : chmod +x $HOME/.local/share/nautilus/scripts/Convert\ to\ UTF8 و تمام!

حالا روی زیرنویس(ها)ی مورد نظر کلیک راست کنید و از قسمت Scripts گزینه Convert to UTF8 رو بزنید!  :D

سلام..
ممنون که این ایده رو عملی کردید.. یه تغییراتی دادم:
#!/bin/bash

# ~/.local/share/nautilus/scripts/

IFS=$'\t\n'

BACK_DIR=".subtitle.backup"       
if [ ! -d "$BACK_DIR" ]; then
    mkdir ./$BACK_DIR
fi

for fileName in `echo $*`; do

    encoding=`file -b "$fileName" | awk {'print $1'}`

    if cp "$fileName" "$BACK_DIR"; then
if [ "$encoding" == "Little-endian" ]; then
iconv -f UTF-16LE -t UTF-8 "$fileName" > "./.$fileName.utf8"
mv "./.$fileName.utf8" "$fileName"
elif [ "$encoding" == "Non-ISO" ]; then
iconv -f CP1256 -t UTF-8 "$fileName" > "./.$fileName.utf8"
mv "./.$fileName.utf8" "$fileName"
elif [ "$encoding" == "ISO-8859" ]; then     
iconv -f CP1256 -t UTF-8 "$fileName" > "./.$fileName.utf8"
mv "./.$fileName.utf8" "$fileName"
fi
    fi
done
چک کردن برای ISO-8859 رو بهش اضافه کردم.. برای من بدون این کار نمی کرد..
یه مشکل دیگه هم در convert کردن فایل هایی که تو نامشون space هست وجود داشت.. که اون رو حل کردم.. در عوض یه مشکل دیگه به وجود اومد.. و اونم این که حالا فقط یه فایل رو می شه convert کرد و چند تا فایل رو به صورت همزمان نمی شه..:
cp: cannot stat 'b (4th copy).srt b (5th copy).srt b (another copy).srt b (another copy)d.srt': No such file or directoryراه حل درستش چیه..؟ کسی ایده ای به ذهنش می رسه..؟

الان بخوام بهتر توضیح بدم:
در اسکریپت قبلی اگه یه فایل تو نامش space بود از محل space تقسیم می شد اسم و به مشکل می خوردیم..
پس تو اسکریپت جدید برای این که این تقسیم شدنه اتفاق نیافته این متغیر رو از این مقدار:
IFS=$' \t\n'به این مقدار تغییر دادم:
IFS=$'\t\n'ولی خوب این کار خودش یه مشکل دیگه رو ایجاد می کنه.. که پیغامش خطای cannot stat رو بالا گذاشته بودم..
برای این که متوجه بشید اون پیغام خط از کجا می آد می تونید nautilus رو این جوری اجرا کنید..:
nautilus -q
nautilus --no-desktop
و پنجره رو نبندید تا پیغام ها رو بخونید..
بعد که اسکریپت رو با انتخاب این چند فایل اجرا می کنید:
b (4th copy).srt
b (5th copy).srt
b (another copy).srt
b (another copy)d.srt
اون پیغام می آد..
چون آرگومان ها به این شکل با space دریافت شده:
b (4th copy).srt b (5th copy).srt b (another copy).srt b (another copy)d.srt
که خوب الان با تنظیم کردن اون IFS گفتیم دیگه از محل space ها نام فایل رو جدا نکن که حداقل واسه فایل هایی که نامشون space داشته مشکلی ایجاد نشه.. ولی خوب الان این خط بالا کلش یه نام فایل در نظر گرفته می شه..
حالا نکته اینه که اصن برفرض که ما می خواستیم از محل space ها جدا کنیم.. از کجا معلوم که از کدوم محل ها باید جدا کنیم..
مثلا احتمالش هست که b دوم آخرین کاراکتر فایل اول بوده باشه نه اولین کاراکتر فایل دوم..

راه حله استانداردی نیست بنظرم ولی میتونی با sed بگی جاهایی که srt و بعدش space رو به \n تغییر بده
اما چون هدف اجرا روی فایلای srt هست نباید مشکلی پیش بیاد  ;)

آفلاین ارباب!

  • Sr. Member
  • *
  • ارسال: 448
  • جنسیت : پسر
پاسخ : اسکریپت تعمیر زیرنویس های فارسی
« پاسخ #12 : 17 دی 1395، 02:55 ب‌ظ »
سلام دوستان!
مشکل convert کردن چند فایل در nautilus به صورت هم زمان هم حل شد:

#!/bin/bash

# ~/.local/share/nautilus/scripts/

IFS=$'\t\n'

BACK_DIR=".subtitle.backup"       
if [ ! -d "$BACK_DIR" ]; then
    mkdir ./$BACK_DIR
fi

for filePath in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS; do
fileName=$(basename "$filePath")

    encoding=`file -b "$fileName" | awk {'print $1'}`

    if cp "$fileName" "$BACK_DIR"; then
if [ "$encoding" == "Little-endian" ]; then
iconv -f UTF-16LE -t UTF-8 "$fileName" > "./.$fileName.utf8"
mv "./.$fileName.utf8" "$fileName"
elif [ "$encoding" == "Non-ISO" ]; then
iconv -f CP1256 -t UTF-8 "$fileName" > "./.$fileName.utf8"
mv "./.$fileName.utf8" "$fileName"
elif [ "$encoding" == "ISO-8859" ]; then     
iconv -f CP1256 -t UTF-8 "$fileName" > "./.$fileName.utf8"
mv "./.$fileName.utf8" "$fileName"
fi
    fi
done

الان وقتی چند فایل (local) رو در nautilus انتخاب می کنید
و راست کلیک می کنید و از منوی Scripts این script رو برای اجرا انتخاب می کنید
نه تنها می تونه تو نام فایل ها space باشه
بلکه به دلیل این که script می آد path ها رو به صورت جدا شده توسط newline دریافت می کنه
ابهامی پیش نمی آد و می تونه همه رو convert کنه..
که مسیر این فایل ها در NAUTILUS_SCRIPT_SELECTED_FILE_PATHS قرار داره..

Void Linux + XFCE

آفلاین افشین

  • Sr. Member
  • *
  • ارسال: 318
  • جنسیت : پسر
    • لیبره‌آفیسِ فارسی
پاسخ : اسکریپت تعمیر زیرنویس های فارسی
« پاسخ #13 : 20 اسفند 1395، 11:59 ق‌ظ »
ممکن است اسکرپیت را با میز کار Cinnamon هم سازگار کنید؟
متشکرم.