ویکی‌پدیا:سیاست ربات‌رانی/درخواست مجوز/HujiBot/وظیفه ۲۴

HujiBot (وظیفه ۲۴) ویرایش

ربات‌ران: Huji (بحثمشارکت‌هاانتقال‌هابسته شودبسته‌شدن‌هااختیاراتآمارآمار پیشرفته)

خودکار، نیمه‌خودکار یا دستی: خودکار

کد ربات: https://github.com/PersianWikipedia/fawikibot/blob/master/HujiBot/image_resizer.py

خلاصهٔ عملکرد: کوچک کردن تصاویر غیرآزادی که زیادی بزرگ هستند

تناوب اجرا: یکبار برای حدود ۲۰۰۰ تصویر، پس از آن هفتگی

تخمین تعداد صفحه‌هایی که ویرایش می‌شوند: دست کم ۲۰۰۰

گذر از الگوی {{nobots}} (بله/خیر): بله

آیا در ویکی دیگری پرچم دارد (بله/خیر): خیر

شرح روش اجرا: مطابق en:WP:IMAGERES تصاویری که غیرآزاد هستند (به بیان خودمانی: تصاویر منصفانه) نباید ابعادشان بزرگتر از کمترین مقداری باشد که برای مقاله کافی است. در همان صفحه یک قاعدهٔ کلی توضیح داده شده که طبق آن، ابعاد تصاویر منصفانه بایست چنان باشد که کل پیکسل‌های تصویر کمتر از ۱۰۰٬۰۰۰ باشد. مثلاً تصویری که در ابعاد ۱۰۲۴×۷۶۸ بارگذاری شده زیادی بزرگ است ( ) و چنین تصویری را باید کوچک کرد؛ اگر این کوچک کردن با حفظ نسبت ابعاد تصویر انجام شود، می‌توان تصویری به اندازهٔ ۳۶۵×۲۷۳ از آن به دست آورد ( ).

ربات دقیقاً همین کار را می‌کند. ابتدا توی ردهٔ رده:محتویات غیر آزاد می‌گردد تا مواردی را پیدا کند که اندازه‌شان از حدی که بالا ذکر شد بزرگتر است. سپس با یک فرمول سادهٔ ریاضی، تصویر کوچکتر را می‌سازد و روی نسخهٔ قبلی بارگذاری می‌کند. البته سیاست مذکور اجازه می‌دهد برخی تصاویر به خاطر حفظ خوانایی محتوایشان در ابعاد بزرگتری نگهداری شوند و برای این منظور توصیه می‌کند که در صفحهٔ پرونده از الگوی {{Non-free no reduce}} استفاده شود. در نتیجه ربات هم دقت می‌کند که اگر این الگو یا معادل فارسی‌اش ({{پرهیز از نسخه کوچکتر}}) در صفحه بود به آن دست نزند.

برای آزمایش، ربات را روی پرونده:--مجید جمالی فشی--.jpeg راندم تا ببینید که چطور عمل می‌کند. همچنین به ربات سپردم تمام تصاویر منصفانه را بررسی کند و مواردی که نیاز به اصلاح دارند را شناسایی کند؛ تعدادشان حدود ۲۰۰۰ عدد است و در کاربر:Huji/oversize images/details فهرست شده‌اند. عمدهٔ این تصاویر توسط رضابات چند کاربر دیگر بارگذاری شده‌اند که به آن‌هایی که مکرراً این سیاست را نقض کرده‌اند پیام راهنمایی خواهم فرستاد. همچنین صحیح آن است که پس از بارگذاری نسخهٔ کوچکتر، نسخهٔ بزرگتر از تاریخچهٔ پرونده حذف شود که این کار را برای مثال بالا (مجید جمالی) انجام ندادم تا بتوانید تفاوت دو نسخه را ببینید و از حفظ کیفیت اطمینان حاصل کنید اما بعداً حذف نسخهٔ بزرگتر را نیز در دستور کار قرار خواهم داد. — حجت/بحث ‏۶ مارس ۲۰۲۱، ساعت ۲۲:۴۹ (UTC)[پاسخ]

بحث ویرایش

کاربر:Huji: عالی است، ~۱۵ مورد جهت اطمینان بیشتر و به همراه حذف نسخهٔ پیشین برانید و لطفاً من را پینگ کنید. امکان دارد در خلاصهٔ ویرایش بارگذاری جدید به گونه‌ای بارگذار اصلی پرونده و به همراه خلاصهٔ ویرایش آن را هم ذکر کنید؟ دربارهٔ ربات رضا، اگر کدش در همان مخزن وجود دارد امکان دارد از کدتان در آن استفادهٔ مجدد کنید؟ احتمالاً بشود عملکردهای مشترک را در فایلی قرار داد که هر دو ربات به آن دسترسی داشته باشد و یک تست سریع و مستقل از ویکی از اینکه بابت چه ورودی‌های عددی. چه خروجی‌هایی می‌دهد داشته باشد. ممنونم Ebrahim (بحث) ‏۹ مارس ۲۰۲۱، ساعت ۰۹:۱۶ (UTC)[پاسخ]
@Ebrahim: موارد خوبی گفتید. جدا جواب می‌دهم:
  • ۱۵ مورد را خواهم راند. فعلاً حذف نسخهٔ قدیمی را دستی باید انجام بدهم. قابلیتش در پای‌ویکی‌بات وجود ندارد و در phab:T276725 خودم کدش را نوشتم که امیدوارم به زودی پذیرفته شود.
  • دلیل اشاره به بارگذار اصلی و خلاصهٔ ویرایش اصلی را نمی‌فهمم. توجه دارد که اگر چه خود «پروندهٔ» قدیمی حذف می‌شود اما «نسخهٔ» قدیمی در تاریخچه می‌ماند (فقط خود پرونده‌اش دیگر برای عموم در دسترس نیست).
  • منظورتان از استفادهٔ مجدد از کد رضا را هم نمی‌فهمم. ربات رضا کاری که می‌کند این است که در مقاله‌های ما دنبال جعبهٔ اطلاعات بدون عکس می‌گردد، عکس مشابه را از مقالهٔ ویکی‌پدیای انگلیسی شناسایی، بارگیری و در ویکی‌پدیای فارسی بارگذاری می‌کند و بعد جعبهٔ اطلاعات را به‌روز می‌کند. این وسط اگر تصویر نسخهٔ انگلیسی اندازه‌اش نامناسب باشد، کپی فارسی هم مشکل‌دار خواهد بود. لذا اگر قرار است که تغییری داده شود، در جهت عکس پیشنهاد شما خواهد بود: این رضاست که در رباتش باید از کد این ربات بهره بگیرد و تصاویر را قبل از بارگذاری، کوچک کند. نه؟ کاری که من می‌توانم بکنم این است که متد مربوط در کد خودم را بیشتر خرد کنم تا یک متد فقط برای چک کردن ابعاد تصویر داشته باشد. این طوری کد او می‌تواند کد ربات من را (که کلاس است و قابل نمونه‌سازی) عیناً استفاده کند. دلیل این که ربات‌هایم را به صورت کلاس می‌نویسم دقیقاً همین امکان استفادهٔ مجدد در کدهای دیگر است. — حجت/بحث ‏۹ مارس ۲۰۲۱، ساعت ۱۷:۳۸ (UTC)[پاسخ]
    ۱، عالی‌ست، اگر دیدید دارند معطل می‌کنند شاید همان کد را بشود در خود ربات گذاشت. ۲، آیا نتیجه مانند این خواهد بود؟ اگر که بله و کل آن سطر پاک نمی‌شود و فقط تصویرش پاک می‌شود که عالی است. ۳، منظورم همین است که حالا که کدتان مشخصاً به فکر استفادهٔ مجدد نوشته شده ایدهٔ بدی نیست خارج از بحث این صفحه خودتان هم در کد ربات رضا اگر در همان مخزن است تغییر اندازهٔ تصویر را حین جابجایی اعمال کنید، قطعاً وظیفهٔ شما نیست فقط شاید وقتی که چنین کاری کنید کدتان ساختار بهتری پیدا می‌کند یا به شیوه‌ای کد سازماندهی بیابد که کار رضا برای این تغییر راحتتر باشد، مشخصاً این مورد به صورت اختیاری مطرح کرده‌ام. Ebrahim (بحث) ‏۱۰ مارس ۲۰۲۱، ساعت ۱۸:۴۲ (UTC)[پاسخ]
  • ضمناً با همان کدی که در T276725 گذاشتم یک مورد حذف تاریخچه هم انجام دادم (در پرونده:Takeoffemovie.jpg به تاریخچه و سیاههٔ حذف نگاه کنید). اگر مخالفتی نباشد ۱۴ مورد دیگر هم انجام می‌دهم. — حجت/بحث ‏۱۰ مارس ۲۰۲۱، ساعت ۱۵:۲۱ (UTC)[پاسخ]
    امکان دارد حذف مانند این این انجام شود؟ Ebrahim (بحث) ‏۱۰ مارس ۲۰۲۱، ساعت ۱۸:۴۳ (UTC)[پاسخ]
    @Ebrahim: آن مدل حذفی که شما مثال زدید، حذف نسخه‌است که در phab:T276726 مطرحش کردم و هنوز نرسیده‌ام که کدش را بسازم. پیچیدگی کدش بسیاری بیشتر از phab:T276725 است چون انواع حالات مختلف حذف نسخه را باید پشتیبانی کند، احیای نسخه را هم باید پشتیبانی کند.
    بگذارید رویش کار کنم. اما آیا معتقدید پرچم باید منوط به آن باشد یا نه؟ — حجت/بحث ‏۱۰ مارس ۲۰۲۱، ساعت ۲۳:۳۸ (UTC)[پاسخ]
    به نظرم بحث پرچم را اصلاً کنار بگذاریم منظورم از جهت فنی است و اینکه که حیف است که این حذف‌ها انجام شود و سطر بارگذار اصلی از جدول حذف شود در صورتی که امکان بهتر و ظاهراً رایجتری هم وجود داشت، نمی‌شود در حد استفاده در رباتتان و همان مورد خاص اینجا درون ربات کدش را اضافه کنید تا بعداً به هستهٔ pywiki اضافه شود؟ تاجایی که یادم می‌آید امکانی برای اجرای دلخواه هر API در کد ربات داشت ولی احتمالاً ملاحظاتی دارد که من مطلع نباشم. در نهایت که آنقدر ربات خوبی شده که شاید بشود به خود pywiki هم آن را اضافه کرد. ممنونم Ebrahim (بحث) ‏۱۱ مارس ۲۰۲۱، ساعت ۰۶:۵۵ (UTC)[پاسخ]
    @Ebrahim: من این را چنین برداشت می‌کنم که شما پرچم را منوط به حذف نسخه می‌کنید. این اشکالی ندارد. انگیزه می‌شود که آن یکی فب را هم خودم حل کنم! — حجت/بحث ‏۱۱ مارس ۲۰۲۱، ساعت ۱۲:۳۵ (UTC)[پاسخ]
    کاربر:Huji: بله دقیقاً منظورم از قسمت ربات رضا و این‌ها هم صرفاً همفکری برای بهتر شدن چیز خیلی خوبی که همین الآن درست کرده‌اید بود Ebrahim (بحث) ‏۱۱ مارس ۲۰۲۱، ساعت ۱۷:۰۲ (UTC)[پاسخ]

@Ebrahim: کد را توانستم بنویسم. در پرونده:Takeoffemovie.jpg آزمودم و درست کار کرد. در حال تلفیقش با کد قبلی خودم هستم. همچنین وصلهٔ مربوط به T276726 را به زودی ارائه خواهم کرد. — حجت/بحث ‏۱۳ مارس ۲۰۲۱، ساعت ۰۳:۲۱ (UTC)[پاسخ]

کاربر:Huji: این را می‌دیدم که ظاهراً در pillow 2.7 دیگر نیاز نیست صراحتاً گفته شود و حیف که upload امکان پذیرفتن فایلی در حافظه مانند این را ندارد که بتوان چنین کاری کرد،
diff --git a/HujiBot/image_resizer.py b/HujiBot/image_resizer.py
index 165f0df..ba9fd41 100644
--- a/HujiBot/image_resizer.py
+++ b/HujiBot/image_resizer.py
@@ -60,16 +60,17 @@ class ImageResizerBot:
         newheight = math.floor(height * math.sqrt(100000 / (width * height)))
 
         img = self.get_image_from_image_page(filepage)
-        newimg = img.resize((newwidth, newheight))
-        filepath = '/tmp/' + filepage.title(with_ns=False)
 
-        newimg.save(filepath)
+        byte_io = io.BytesIO()
+        newimg = img.thumbnail((newwidth, newheight), Image.ANTIALIAS) # که اگر نسخهٔ جدید باشد احتمالاً نیاز نیست
+        newimg.save(byte_io, img.format)
+        byte_io.seek(0)
+
         self.site.upload(
             filepage,
-            source_filename=filepath,
+            source_filename=byte_io, # که در حال حاضر چیزی مشابه این ظاهراً پشتیبانی نمی‌شود
             comment=self.summary,
             ignore_warnings=True)
-        os.remove(filepath)
 
     def run(self):
         cat = pywikibot.Category(self.site, self.cat)
که upload صراحتاً از آن پشتیبانی نمی‌کند ظاهراً متأسفانه که شاید بشود pywiki را بعدها اصلاح کرد Ebrahim (بحث) ‏۱۳ مارس ۲۰۲۱، ساعت ۰۸:۵۴ (UTC)[پاسخ]
@Ebrahim: مشکل از پای‌ویکی نیست؛ از مدیاویکی است که استریم را به عنوان ورودی قبول نمی‌کند و باید ورودی فایل باشد. پای‌ویکی می‌تواند که این را دور بزند (استریم را بگیرد، مثل کاری که من کردم فایل موقت از آن بسازد و فایل را بارگذاری کند) اما این وسط باید یک سری تصمیم بگیرد (مثل نام فایل) که بهتر آن است که خود کاربر بگیرد نه پای‌ویکی‌بات.
بگذریم؛ با تغییری که بالا دادم، ۱۵ تا برانم؟ — حجت/بحث ‏۱۳ مارس ۲۰۲۱، ساعت ۱۳:۳۸ (UTC)[پاسخ]
کاربر:Huji: بله آزمایشی را حتماً برانید که سریعاً کارمان اینجا تمام شود، حتماً، اگر pywiki فقط بتواند BytesIO را هم بپذیرد عالی می‌شود چون با تغییر کوچکی ممکن است و می‌توانم تغییرش را ارسال کنم ولی تغییر APIش دردسر می‌شود، برای هماهنگی بیشتر با انواع ماشین‌ها اگر مایل بودید به جای /tmp/ دستی از https://docs.python.org/3/library/tempfile.html استفاده کنید.
اگر سورس نسخهٔ جدید هم محبت کنید قرار دهید که عالی می‌شود چون متوجه شدم که نیاز است یک نسخهٔ جاواسکریپتی هم از این ربات درست کنم و قسمت‌هایی از آن را در بارگذار tofawiki هم اضافه کنم که حین بارگذاری این موضوع را هم برای تصاویر منصفانه اعمال کند، قسمت از آن را هم نوشته‌ام و اینجا قرار داده‌ام مدیاویکی:FairUseResize.js. Ebrahim (بحث) ‏۱۳ مارس ۲۰۲۱، ساعت ۱۴:۴۰ (UTC)[پاسخ]
نسخهٔ قابل اجرا برای مدیران مدیاویکی:FairUseResize.js به نظر قابل استفاده شده است و آن را به ظاهر مدیران افزودم Ebrahim (بحث) ‏۱۳ مارس ۲۰۲۱، ساعت ۲۱:۳۶ (UTC)[پاسخ]

@Ebrahim: نسخهٔ جاوااسکریپتی را آزمودم؛ به درستی کار کرد.

نسخهٔ ربات هم در همان نشانی بالا به روز شد. روی شانزده تصویر هم راندمش. — حجت/بحث ‏۱۴ مارس ۲۰۲۱، ساعت ۰۲:۳۹ (UTC)[پاسخ]

  مجوز دارد. اعمال‌ها را بررسی کردم، عالی‌ست، ممنون و خسته نباشید، از آنجایی که تعدادی pdf و svg هم در لیست قرار دارد شاید نیاز باشد کاری در رابطه با آن‌ها انجام شود، tiffهای چند صفحه‌ای و pdfهای چندصفحه‌ای منصفانه که به کل عجیب هستند که pdf چندصفحه‌ای منصفانه را هم بین آن‌ها دیدم که آن موردی که دیدم احتمالاً نیاز به برچسب منصفانه نداشت، به هر حال حین اجرا احتمالاً خودتان هم بررسی می‌کنید و جای نگرانی نیست. Ebrahim (بحث) ‏۱۴ مارس ۲۰۲۱، ساعت ۰۷:۵۱ (UTC)[پاسخ]