├── .gitignore ├── AUTHORS ├── LICENSE-ar.txt ├── LICENSE-en.txt ├── MANIFEST.in ├── PKG-INFO ├── README ├── THANKS ├── TODO ├── changelog ├── curlew ├── curlew.desktop ├── curlew.svg ├── deb_prepare.sh ├── debian ├── changelog ├── compat ├── control ├── copyright ├── curlew.1 ├── docs ├── manpages ├── patches │ ├── disable_po_files_auto_update.diff │ └── series ├── rules ├── source │ └── format └── watch ├── done.ogg ├── formats.cfg ├── install.sh ├── modules ├── __init__.py ├── about.py ├── codecsdialog.py ├── configs.py ├── consts.py ├── curlew.py ├── customwidgets.py ├── errdialog.py ├── favdialog.py ├── formateditor.py ├── formats.py ├── functions.py ├── infobars.py ├── languages.py ├── logdialog.py ├── players.py ├── tray.py └── waitdialog.py ├── po ├── ar.po ├── br.po ├── cs.po ├── curlew.pot ├── de.po ├── en.po ├── es.po ├── eu.po ├── fr.po ├── it.po ├── nl.po ├── pl.po ├── ru.po ├── sr.po └── zh_TW.po ├── setup.py └── uninstall.sh /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__/ 2 | *.pyc 3 | 4 | .settings/ 5 | .project 6 | .pydevproject 7 | .metadata/ 8 | 9 | *.mo 10 | *~ 11 | MANIFEST 12 | gitstart 13 | 14 | build/ 15 | dist/ 16 | 17 | locale/ 18 | hicolor/ 19 | 20 | -------------------------------------------------------------------------------- /AUTHORS: -------------------------------------------------------------------------------- 1 | Fayssal Chamekh 2 | Ehab El-Gedawy 3 | -------------------------------------------------------------------------------- /LICENSE-ar.txt: -------------------------------------------------------------------------------- 1 | بسم الله الرحمن الرحيم 2 | 3 | رخصة "وقف" العامة 4 | 5 | مقدمة 6 | 7 | إن نشر أي عمل فكري (برنامج حاسوبي أو كتاب على سبيل المثال لا الحصر) لا يكون بالبيع وإن بدا 8 | كذلك بل يكون باتفاقية ضمنية لا قيمة لها لولا مفهوم الملكية الفكرية الذي رسخته القوانين الوضعة 9 | التي يفترض أنها وضعت لحفز نشر الأعمال الفكرية النافعة. ترتكز الملكية الفكرية على أن أول مودع 10 | العمل (يسمى المالك Owner أو copyright holder وسنشير له في هذه الوثيقة باسم صاحب العمل) يملك 11 | الحق في العمل بصورته المعنوية على أي وسيط مادي كان وله حق التصرف في ملكه المزعوم. إن أي 12 | استعمال للعمل الفكري دون الإذن المسبق الصريح من مالك العمل يعد مكافئا أخلاقيا لسرقة السفن أو 13 | “قرصنة” بنظرهم. هذا الإذن يسمى “رخصة License” وتهدف تلك الرخص غالبا لإعطاء المالك (غالبا 14 | الناشر) أفضلية في السوق أمام الناشرين الآخرين من خلال احتكار العمل وذلك بفرض قيود على 15 | المستخدمين لا الناشرين. تسمى مثل تلك الأعمال بالأعمال “المملوكة Proprietary”. 16 | 17 | إننا نرى أن هذه الاتفاقيات (الرخص المملوكة) مجحفة جدا لكننا ندرك إن قبول اتفاقية معينة (مثل 18 | رخص البرامج المملوكة) وأنت تضمر مسبقا خرقها أمر غير أخلاقي ^1). لهذا فنحن لا نحل المشكلة 19 | بمشكلة أخرى بل إننا نقدم البديل. 20 | 21 | نحن لدينا رؤية مختلفة فنحن نقدم أعمالنا الفكرية من برامج حاسوبية وغيرها ابتغاء وجه الله، والتي 22 | هي الركيزة الأساسية لهذه الرخصة التي تميزها عن الرخص المملوكة وعلى أي غاية آخرى (مثل نشر العلم 23 | النافع أو جني الأرباح) أن تتحقق بوسيلة لا تخالف هذا الهدف الأسمى. 24 | 25 | في قناعتنا - التي لا نلزم أحدا بها والتي لا يضيرك أن لا تشترك معنا فيها - أن الاسلام يحرم 26 | وبشكل قطعي حكر العلم والمعرفة والانتاج الفكري على وجه العموم، وهذا التحريم يأتي من عدة أوجه : 27 | 28 | * الحديث النبوي الشريف : “من كتم علما ألجمه الله يوم القيامة بلجام من نار” ^2) وقد جاءت 29 | كلمة العلم نكرة عامة فهي تنطبق على كل علم ينتفع الناس به سواء علم ديني أو دنيوي. 30 | * أن الإسلام حدد ما يصح أن يكون مملوكا وذلك لا ينطبق على العمل الفكري لأنه ليس عينا محصورا 31 | وأغلب شروط البرمجيات المملوكة تقع في بيع الغرر (ذاك أن ما لا يجوز بيعه لا يجوز تملكه) دل 32 | عليه ما ورد من النهي عن بيع الغرر في صحيح مسلم (ويدخل فيه مسائل كثيرة غير منحصرة كبيع 33 | المعدوم والمجهول وما لا يقدر على تسليمه وما لم يتم ملك البائع عليه) وما ورد عن الأئمة 34 | الأربعة من فهمهم لهذا. 35 | * لسنا بحاجة لابتداع شيء لنشر العلم لأن الأعمال الفكرية ليست محدثة وأن قرون الخير الأولى 36 | نشرت العلم دون تملكها. 37 | * حبس المعرفة والعلم عمن يحتاجه هو إضرار بالناس لصالح قلة منهم، وهذا مما نهى عنه الشارع ولا 38 | يبرر هكذا فعل إلا من يؤمن بالرأسمالية الذاتية التي تطرفت في تعظيم مصلحة الفرد. 39 | * انتفاء مبرر المصلحة إذا وجدت طرق لنشر الأعمال الفكرية والتربح منها دون كتمها. 40 | * إن المتمعن في قوانين الملكية الفكرية المختلفة يجد في أنها تتلخص بإعطاء “المالك” المزعوم 41 | الحق في تحريم ما أحله الله ليكون ذلك مدخلا له في كسب مادي ولا علاقة لها بتقديم خدمة أو 42 | منتج معين. 43 | * الغموض الذي يحيط بماهية الشيء المزعوم ملكه تفتح الباب أمام جبات “الأتاوات” حيث تتكسب بعض 44 | الشركات من التهديد بخطر المقاضاة حتى على أشياء لا تملكها والقضاء الأمريكي يغص بمثل هذه 45 | القضايا. 46 | 47 | فإن كانت الغاية قد بررت الوسيلة لواضعي الدستور الأمريكي حين أقروا مفهوم ”الملكية الفكرية” 48 | كحق مكتسب (غير فطري باعترافهم) يخدم ما تؤمن به ثقافتهم من تعظيم المصلحة الذاتية وتقديمها على 49 | كل شيء؛ ذاك لا يعنينا في شيء ونحن نؤمن بعدم صلاحية ذلك لعموم البشر، لهذا جاءت رخصة “وقف” 50 | العامة (كما غيرها الكثير من رخص التوزيع المضادة لحكر التوزيع)، فهي وضعت لكي تؤكد لمستهلك العمل 51 | الفكري أن لا قيد يفرضه صاحب العمل على استخدم منتجه والإفادة منه أو إعادة انتاجه وتوزيعه. أي أن 52 | تجعل حقوق الطبع والتوزيع “ممنوحة” أو مرفوعة وليس “محفوظة” (وبالإنجليزية يشار لها باسم copyleft 53 | او copy-wrong تهكما على copyright) 54 | 55 | فمعادلة وتفاصيل تركيب الدواء هي عمل فكري، وبرمجية الحاسوب هي عمل فكري وقصيدة الشعر هي عمل 56 | فكري. وهي بشكل عام كل فكرة تنفع الناس تصلهم على شكل منتج. وعندما نتكلم عن العمل الفكري فإننا 57 | نحدد التعريف بالفكر الذي ينفع الناس نشره ولا نقصد به عموم الفكر فلكل منا خصوصيته وأسراره التي 58 | لايشارك بها الاخرين. فأسماء الزبائن وأرقام المناقصات وسياسة الدولة العسكرية أو السياسية ليست 59 | أعمالا فكرية. 60 | 61 | وهنا يجدر الوقوف عند مسألتين : 62 | 63 | * الأولى، أن الحق الأدبي للصاحب العمل يبقى للمبتكر الأصلي على كل الأحوال. فلا يجوز لأحد أن 64 | يأخذ هذا العمل وينتحله ويدعيه لنفسه. 65 | * والثانية، أن لصحاب العمل ولغيره (ممن عندهم الكفاية) الإفادة المادية من العمل كأن يطلب 66 | أتعابا أو يتقاضى أجرا عن تحسينه أوتطويره أو أجرا عن تدريسه وهكذا. ولكن ما وراء ذلك فلا يحق 67 | له إدعاء ملكيته للفكرة أو العمل في صورته المعنوية ولا يحق له منع الآخرين من اعادة نشرها 68 | والاستفادة منها. وهذا لا تناقض مع كون العمل موقوفا لأن الموقوف هو أصل العمل الفكري بصورته 69 | المعنوية وليس الوسيط أو الخدمة ^3) 70 | 71 | تعريفات 72 | 73 | تكون التعريفات هنا هي المقصودة عند استخدامها في الرخصة : 74 | 75 | * العمل الفكري (أو اختصارا العمل): هو أي عمل فكري نافع غير مادي ولا ملموس ويمكن لمن يتلقاه 76 | عمل نسخ منه ونقله إلى آخرين دون أي عبء على من قام بإيصال النسخة اليه. 77 | * صاحب العمل : هو الشخص المُبتكِر أو الجهة التي قامت بتطوير وتوفير العمل الفكري (والتي تملك 78 | حقوق النسخ عند الجهات الرسمية إن لزم الأمر). 79 | * المُنتًفع (المستخدِم): هو الشخص أو الجهة التي ترغب بالانتفاع من العمل الفكري. 80 | * رخصة الاستخدام (أو اختصارا الرخصة): هي هذا العقد الذي بين يديك وهو عقد بين صاحب العمل 81 | والمنتفع يحق للمنتفع بموجبه وضمن شروطه الاستفادة والانتفاع من العمل. ونظرا لتوفر العمل 82 | بشكل مفتوح للجميع فإن قيام المنتفع بالاستفادة من العمل الفكري يعني بالضرورة إقراره 83 | وموافقته على كافة شروط الرخصة. فإذا لم يكن المنتفع موافقا على الرخصة تنتفي عنه حقوق الحقوق 84 | الممنوحة بموجبها ويصبح أي انتفاع بالعمل غير مشروع ويعرض نفسه للمقاضاة. 85 | 86 | بنود الرخصة 87 | 88 | رخصة وقف العامة، يرمز لها اختصارا بـ “وقف”، هي رخصة لتوزيع العمل الفكري (من برمجيات أو مؤلفات 89 | مكتوبة أو إنتاج فني على سبيل المثال لا الحصر). تتشابه هذه الرخصه في اهدافها مع رخص البرمجيات 90 | الحرة والتوثيق الحر و رخصة الانتاج المشترك. ولكنها تزيد عليها ببعض الجوانب المتعلقة بالهدف من 91 | وراء الانتاج و حدود الاستخدام. 92 | 93 | رخصة وقف وكما يقترح الاسم هي إقرار من صاحب العمل بأن هذا العمل هو وقف لله تعالى ويتقصد به نوال 94 | رضاه من خلال انتفاع الناس به، أي أن هذا العمل هو صدقة جارية لوجه الله تعالى. وبذلك فإن رخصة 95 | وقف تقر بأن للمنتفع -أيا كان جنسه أو لونه أو عقيدته- الحق في الإفادة من العمل وإعادة توزيعه 96 | وحتى تطويره ضمن الشروط التالية: 97 | 98 | * أولا - أوجه الاستخدام : 99 | 100 | يحق للمنتفع استخدام العمل ضمن أي غرض فيه منفعة ولايجوز استخدامه فيما يسئ للأخرين أو يخالف 101 | مبادئ الإسلام السمحة. مع ملاحظة أن الأعمال التي يغلب الظن أنها الضارة لا يجوز أن توضع تحت هذه 102 | الرخصة أصلا. 103 | 104 | * ثانيا - حق التوزيع : 105 | 106 | يحق للمنتفع إعادة توزيع العمل بصورته الأصلية ودون تعديل وتحت شروط رخصة وقف، بالكم الذي يريد مع 107 | صون ذكر الحق الأدبي لصاحب العمل. 108 | 109 | * ثالثا - حق التعديل : 110 | 111 | يحق للمنتفع الحصول على النسخة المصدرية للعمل كما ويحق له التعديل عليها بما يناسب احتياجاته 112 | وضمن الحدود الموضحة في بند أولا. 113 | 114 | * رابعا - حق توزيع النسخة المُعدّلة : 115 | 116 | يحق للمنتفع إعادة توزيع العمل المعدّل فقط تحت رخصة وقف العامة وعلى أن يذكر أصل العمل المعدل 117 | وطبيعة التعديل وأن يكون واضحا بما لايدع مجالا للبس أن هذه النسخة معدلة وليست هي النسخة الأصلية 118 | التي انتجها صاحب العمل الأول. 119 | 120 | * خامسا - عدم المسؤلية : 121 | 122 | لا يتحمل صاحب العمل أية مسؤوليه لا قانونية ولا أخلاقية عن حسن أو إساءة استخدام العمل أو 123 | الأضرار المباشرة أو غير المباشرة الناتجة عنه إلى أقصى حد يسمح به القانون. وصاحب العمل بهذا لا 124 | يقدم أية ضمانة لا ضمنا ولا تصريحا بقدرة المنتج على تحقيق أي غرض. 125 | 126 | المسؤولية الكاملة تقع على عاتق المنتفع والضمانة الوحيدة المقدمة له هي مصدر العمل. 127 | 128 | الخلاصة 129 | 130 | استخدام رخصة وقف العامة يساعد في نشر الوعي على خطر مفاهيم الملكية الفكرية. كما ويقدم البديل 131 | القانوني وإن كنّا لانؤمن بقانونية تلك الملكيات. 132 | 133 | ^1) انظر http://www.islam-qa.com/ar/ref/454 134 | ^2) الحديث صحيح رواه أحمد وأبو داود والترمذي وابن ماجه انظر “رفع المنار بطرق حديث من 135 | كتم علماً ألجمه الله بلجام من نار” 136 | ^3) مثلا يجوز أخذ أجر على نقل ثمار أرض موقوفة أو عصرها 137 | 138 | 139 | -------------------------------------------------------------------------------- /LICENSE-en.txt: -------------------------------------------------------------------------------- 1 | بسم الله الرحمن الرحيم 2 | 3 | In the name of Allah, Most Gracious, Most Merciful 4 | 5 | "Waqf" General Public License 6 | 7 | This is the informal English translation of Waqf General Public License. 8 | Anything but the Arabic version of the license has no value except for 9 | convenience of our English speaking users. When we talk about the License 10 | we refer to the Arabic version, which is the only one we officially 11 | offer, we will try our best to make other translation as accurate as 12 | possible but because of the nature of human languages we use one single 13 | reference language. 14 | 15 | Preamble 16 | 17 | Publishing any intellectual work (including but not limited to books and 18 | Computer Software) is not done by selling even if it appeared to be so, 19 | but it's about getting an implied license that has no enforcement without 20 | the concept of intellectual property granted by man-made laws which was 21 | acquired as they claim to promote the publication of science and the 22 | useful arts. The concept of the so called “intellectual property” is 23 | centered around giving ownership to the first one who register the work 24 | (called owner or copyright holder and we will refer to him/her/it as 25 | holder) then the holder practice his rights on the work in it's intangible 26 | form on any media it's carried, and thus using the intellectual work 27 | without explicit prior permission is according to them ethically 28 | equivalent to hijacking ships or “piracy” as they call it. This permission 29 | is called License and it's aimed to give the holder (usually the 30 | publisher) an advantage in the market against other publishers through 31 | monopoly on providing that work by imposing restrictions on the users not 32 | the publishers. Such works are called “Proprietary”. 33 | 34 | We see that such agreements (proprietary licenses) are evil, but we also 35 | acknowledge that making an agreement with a prior intention to violate it 36 | is another immoral evil ^1). We don't solve problems with problems, we 37 | offer an alternative. 38 | 39 | We have a different vision, we offer our work (like computer software) to 40 | please Allah, and this is the pillar of this license which distinguish it 41 | from proprietary licenses. Any other intention (like spreading knowledge 42 | or getting profits) should be accomplished in ways that does not go 43 | against our primary moral aim. 44 | 45 | According to our believes (which we don't enforce on any one, and you may 46 | or may not share it with us) that Islam certainly forbids monopoly and 47 | concealing knowledge in general, and this comes from: 48 | 49 | * The sound Hadith (saying of prophet Muhammad PBUH): “Who conceal any 50 | type of knowledge will be bridle with a bridle of fire on the Day of 51 | Resurrection.” ^2) 52 | * Islamic Jurisprudence has specified what can be owned, and the rules 53 | does not apply to ideas as it's not a bounded tangible object and 54 | almost all the terms of proprietary agreements fall in ruling of 55 | forbidden Gharar^3) (a kind of fraud that use uncertainty to 56 | fool the customers) as we see in Imam Muslim Sahih description of that 57 | term {and below that term we classify so many actions like selling 58 | negligible objects or unknowns or what can't be delivered or things 59 | that are not full owned by the seller} and such view is also shared by 60 | the four major scholars. 61 | * The laws of Fiqh (Islamic Jurisprudence) have been perfected in the 62 | good centuries and no new rulings are allowed to be brought except for 63 | newly discovered things and this does not apply ideas as they did 64 | exist in the past centuries and Muslims massively spread them without 65 | owning them. FYI: Almost all the Islamic literature is freely 66 | available on the internet. 67 | * Concealing useful knowledge from those who need it impose damage to 68 | people for temporal gains to few individuals. This can not be 69 | justified by Shari'a (Islamic Law), it's only justified by 70 | individualist capitalism ^4) 71 | * Even bringing interests to software publishers is not a valid excuse 72 | because there are some companies produce and publish software without 73 | owning them (proprietary software) and yet they gain profits. 74 | * the so call “Intellectual Proprietary” is all about giving owners the 75 | right to forbid what Allah had made lawful to gain money, not by 76 | providing service nor goods. 77 | * The uncertainty and untangable nature of the claimed owned product is 78 | the source of “protection money collecting” where some company 79 | threaten some smaller company by copyright infringement lawsuit on 80 | some purposely ambiguous product which the later can't afford so they 81 | go safe and pay. 82 | 83 | If the good intentions made excuses to introduce “intellectual 84 | proprietary” by the Machiavellists who wrote the American constitution 85 | as an acquired right (at least they admit it's not a natural right), they 86 | serve their own way of life which is not international. We don't take 87 | that. We have our own high moral standards. We introduce Waqf General 88 | Public License to place it among the anti-copyright licenses. This license 89 | is designed to grant rights to users not to restrict them, it's uses the 90 | concept of copyleft/copy-wrong as opposed to the concept of copyright. 91 | 92 | Computer software, Medicine formula or even poems are considered to be 93 | intellectual works and thus can be covered by “Waqf”. An intellectual work 94 | is any useful idea that can be delivered or utilized by people. “Waqf” is 95 | not meant for ideas in general, but for intellectual work which is 96 | beneficial to people if published. As we support protecting privacy for 97 | example one shouldn't publish names of his customers, bid prices, 98 | government military or political secrets because those are not 99 | intellectual works. 100 | 101 | We should clarify two things: 102 | 103 | * First: The favor and ethical rights of the holder are preserved and 104 | acknowledged 105 | * Second: original author and any other party (if they have the 106 | intention and the ability) have the right to get fees on enhancing the 107 | work or developing it or to provide paid services or paid courses 108 | …etc. but not the work in its intangible form. There is not 109 | contradiction between getting fees on services because what is covered 110 | by “Waqf” is the source form of the work not the media nor the service 111 | (the same way one can take fees on shipping fruits for a charitable 112 | Waqf fruit field or make juice) 113 | 114 | Definitions 115 | 116 | The following terms would have the corresponding meanings in this license 117 | 118 | * The intellectual work (or The work for short): is any useful 119 | intangible intellectual product that can be passed on to others or 120 | replicated withno cost imposed on the original author or the one who 121 | pass it on before. 122 | * The holder: is the creative author or the party which carried the 123 | process of developing the work and make it available (and the one who 124 | holds the copyrights on the product before the governmental offices). 125 | * the licensee or the user: any one or party who uses the work (runs, 126 | copies, modifies or otherwise takes benefits provided by the work). 127 | * The license: this agreement (the Arabic version of “Waqf”) between the 128 | two parties (the holder and the user) covering the usage of the second 129 | party on the work provided by the first party. The usage of the 130 | product is with accordance to the terms of this license. And because 131 | of the intangible nature of the work, this agreement applies by using 132 | the product (in any way) without signing the agreement. One do not 133 | accept the terms looses the rights given by this license and his/her 134 | usage of the work is considered illegal and will be sued. 135 | 136 | The Terms 137 | 138 | Waqf General Public license (or “Waqf” for short) covers intellectual 139 | works (including but not limited to Software and paper publications, 140 | scientific theses, art works) and have many common features with FLOSS 141 | licenses. Waf is distinguished with its moral intentions behind the work 142 | and usage limits. 143 | 144 | As the name suggests, with “Waqf” ^5) the holder announce his/her work 145 | was produced and made available to the public for the sake of Allah aimed 146 | to please Allah by providing people with useful works. It's a form of 147 | “Sadaqa Jariah” ^6). 148 | 149 | “Waqf” gives users (regardless of their nationality, color, race, 150 | religion) the right to benefit from the work with running, copying, 151 | redistribution, or even develop and only with according to the following 152 | 153 | * First - Usage : 154 | 155 | The user may use the work for any good purpose and he may not use it to 156 | harm others or violate the permissive principles of Islam ^7). Notice 157 | that any work that is most likely harmful can't be put under Waqf in the 158 | first place. 159 | 160 | * Second - Redistribution : 161 | 162 | The user have the right to redistribute the unmodified work in any 163 | quantity to any third party under the terms of this license, acknowledging 164 | the favor and ethical rights of the holder to the third party. 165 | 166 | * Third - Modifications : 167 | 168 | The user has the right to get the source form of the work and make 169 | modifications enhancing or adopting to the user's needs to the limits 170 | given by this license. 171 | 172 | * Fourth - Redistribute modifications: 173 | 174 | The user can redistribute modifications only under this license provided 175 | that he points to previous original work (the unmodified work) and its 176 | author and the nature of modification clearly to the third party to whom 177 | the modified work is presented in a way that no one may reasonably get 178 | confused between it and the original unmodified work of the previous 179 | author. 180 | 181 | * Fourth - Disclaimer of responsibility : 182 | 183 | The holder does not take any legal nor moral direct or indirect 184 | responsibility nor liability on the good or bad usage or damages caused by 185 | the work to the farthest level allowed by the law. THIS SOFTWARE IS 186 | PROVIDED AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 187 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 188 | PARTICULAR PURPOSE ARE DISCLAIMED BY THE HOLDER. 189 | 190 | The entire responsibility is on the user and the only warranty given to 191 | him is the source of the work. 192 | 193 | Conclusion 194 | 195 | Applying Waqf public license help to spread the awareness of dangers 196 | caused by intellectual property. And provide people with a legal 197 | alternative even though we don't believe on the validity of such man made 198 | laws. 199 | 200 | ^1) http://www.islam-qa.com/ar/ref/454 201 | ^2) This is an authentic sound/Sahih as it's narrated by Imam 202 | Ahmad, Abu Dawood, AlTirmithi and Ibn Majah. Refer to “Hoisting the 203 | Lighthouse : A synopsis of the Various narrations of the Hadith: Whoever 204 | conceals knowledge, Allah will bridle him with a bridle of fire” or in 205 | Arabic “رفع المنار بطرق حديث من كتم علماً ألجمه الله بلجام من نار”. 206 | ^3) Some information about Ghrar is available at 207 | http://www.investopedia.com/terms/g/gharar.asp 208 | ^4) Although Islamic economy is a kind of liberal capitalism economy 209 | but it's regulated with so many moral rulings that guarantee social 210 | justice 211 | ^5) The name Waqf means to prevent the source or assets from being 212 | consumed while giving away for charity the proceeds. 213 | ^6) Sadaqa Jariah means sustainable charity which is a kind of charity 214 | that continue to be beneficial to people even after the death of the one 215 | who give it like giving the fruits of a field but not the field, more over 216 | prophet Muhammad PBUH specifically named useful knowledge as a form of 217 | that kind of charity. 218 | ^7) Some scholars use the term Maqasid Alsharia and summarize them by 219 | saying that it aims to protect people rights in religion, lives, sanity, 220 | breed, and properties. 221 | 222 | 223 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include LICENSE-ar.txt LICENSE-en.txt AUTHORS THANKS changelog README TODO 2 | include curlew.desktop curlew.svg curlew.spec po/curlew.pot 3 | include stdeb.cfg deb_prepare.sh install.sh uninstall.sh 4 | recursive-include po *.po 5 | -------------------------------------------------------------------------------- /PKG-INFO: -------------------------------------------------------------------------------- 1 | Metadata-Version: 1.1 2 | Name: curlew 3 | Version: 0.2.1 4 | Summary: Easy to use multimedia converter in Linux 5 | Home-page: http://sourceforge.net/projects/curlew 6 | Author: Fayssal Chamekh 7 | Author-email: chamfay@gmail.com 8 | License: Waqf License 9 | Description: Curlew written in python and GTK3 and it depends on (ffmpeg/avconv). 10 | 11 | Main Features: 12 | - Easy to use with simple user interface. 13 | - Hide the advanced options with the ability to show them. 14 | - Convert to more than 100 different formats. 15 | - Show file information (duration, remaining time, estimated size, progress value). 16 | - Allow to skip or remove file during conversion process. 17 | - Preview file before conversion. 18 | - Convert a specified portion of file. 19 | - Combine subtitle with video file. 20 | - Show error details if exist. 21 | - And more ... 22 | Keywords: convert,audio,video,ffmpeg,avconv 23 | Platform: Linux 24 | Classifier: Programming Language :: Python :: 3 25 | Classifier: Operating System :: POSIX :: Linux 26 | Classifier: Development Status :: 5 - Production/Stable 27 | Classifier: Environment :: X11 Applications :: GTK 28 | Classifier: Natural Language :: English 29 | Classifier: Natural Language :: Arabic 30 | Classifier: Natural Language :: French 31 | Classifier: Intended Audience :: End Users/Desktop 32 | Classifier: Topic :: Desktop Environment :: Gnome 33 | Classifier: Topic :: Multimedia :: Sound/Audio :: Conversion 34 | Classifier: Topic :: Utilities 35 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | Curlew Multimedia Converter: 2 | ---------------------------- 3 | 4 | Description: 5 | ------------ 6 | 7 | Easy to use, Free and Open-Source Multimedia converter for Linux. 8 | Curlew written in python and GTK3 and it depends on (ffmpeg/avconv). 9 | 10 | Main Features: 11 | 12 | - Easy to use and clean user interface. 13 | - Hide the advanced options with the ability to show them. 14 | - Convert to more than 100 different formats. 15 | - Edit formats. 16 | - Shutdown or suspend PC after a conversion process. 17 | - Show file information (duration, remaining time, estimated size, progress value). 18 | - Show file details using mediainfo. 19 | - Skip or remove file during conversion process. 20 | - Preview file before conversion. 21 | - Show video thumbnail. 22 | - Convert a specified portion of file. 23 | - Combine subtitle with video. 24 | - Crop and pad video. 25 | - Show error details if exist. 26 | - And more ... 27 | 28 | 29 | Dependencies: 30 | ------------- 31 | 32 | For Curlew: 33 | 34 | - python >= 3.3 35 | - python3-gi >= 3.12 36 | - python3-dbus 37 | - gir1.2-gtk-3.0 >> 3.12 38 | - gir1.2-gstreamer-1.0 39 | - libav-tools >= 0.8 (or ffmpeg) 40 | - libavcodec-extra (Ubuntu/Debian) 41 | - xdg-utils 42 | - mediainfo 43 | - gnome-icon-theme-symbolic 44 | 45 | For installer (setup.py): 46 | 47 | - librsvg2-bin (or something similar) to convert .svg to .png. 48 | - intltool-debian (or intltool) to compile translations files. 49 | 50 | NB: This dependencies names may change if you are using another distribution than Ubuntu/Debian or its sons. 51 | 52 | 53 | License: 54 | -------- 55 | 56 | Waqf public license. 57 | Please see: LICENSE-ar.txt/LICENSE-en.txt files for more information. 58 | 59 | 60 | Installation: 61 | ------------- 62 | 63 | In terminal, run the following (as root): 64 | > python3 setup.py install --prefix=/usr 65 | Or run script (as root): 66 | > ./install 67 | 68 | 69 | Remove (Uninstall): 70 | ------------------- 71 | 72 | In terminal run the following (as root): 73 | > python3 setup.py uninstall 74 | Or run script (as root): 75 | > ./uninstall 76 | 77 | 78 | Clean Project: 79 | -------------- 80 | 81 | > sudo python3 setup.py clean 82 | 83 | -------------------------------------------------------------------------------- /THANKS: -------------------------------------------------------------------------------- 1 | I have to say THANKS to all who contribute in this application. 2 | 3 | Contributors: 4 | ------------ 5 | Ehab El-Gedawy 6 | Ken 7 | Andrej Kvasnica 8 | OLEG N 9 | Matteo Alessio Carrara 10 | Booker 11 | Abdelkarim Guettaf 12 | Gayan C. Karunarathna 13 | 14 | 15 | Translators: 16 | ------------ 17 | Basque: Alexander Gabilondo 18 | Traditional Chinese: by taijuin 19 | Czech: Pavel Fric 20 | German: Rainer Peichl 21 | Italian: bersil 22 | Nederlands: JohnV 23 | Polish: Daniel Napora 24 | Português - Brazil: by vagner 25 | Serbian: Ch_Brozović 26 | Spanish: bersil , Toni Estévez 27 | Russian: VitalD 28 | 29 | 30 | Designers: 31 | ---------- 32 | Smail 33 | 34 | 35 | Others: 36 | ------- 37 | Curlew sound: Pete Smith 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /TODO: -------------------------------------------------------------------------------- 1 | بسم الله الرحمن الرحيم 2 | 3 | 4 | Fixes: 5 | * Prevent to duplicate file in the same session. 6 | * Error log empty fix. 7 | 8 | Changes: 9 | 10 | 11 | Features: 12 | * Show error log in the main window. 13 | * Added GIF support. 14 | 15 | -------------------------------------------------------------------------------- /changelog: -------------------------------------------------------------------------------- 1 | Version 0.2.5 2 | ------------- 3 | 4 | * Added an option to include all audio tracks of file. 5 | * Added support for merging files. 6 | * Added Fade In/Out filter feature. 7 | * Added paste "from the Clipboard" feature. 8 | * Use Home directory as default converting destination. 9 | * Hide unused page/widget. 10 | * Add xplayer to players list. 11 | * Colored buttons (Convert/Close). 12 | * Removed CSD option. 13 | * Deleted stdeb config files and use native debian packaging system. 14 | * Fix disabled convert button issue. 15 | * Updated translations. 16 | * Bug fixes and code enhancements. 17 | 18 | 19 | Version 0.2.4 20 | ------------- 21 | 22 | * Excluded non media files to be loaded in the list. 23 | * Removed 'Players Dialog' and let Curlew choose the player. 24 | * Enhanced Favorite. 25 | * Added a welcome page. 26 | * Show Files information inside the main window. 27 | * Added an option to show/hide status bar, and make it invisible by default. 28 | * Some interface improvements... 29 | 30 | 31 | Version 0.2.3 32 | ------------- 33 | 34 | * Show dialog in the first install to choose the favorite player. 35 | * Added "German" translation (by Rainer Peichl). 36 | * Fix infobar hiding (workaround https://bugzilla.gnome.org/show_bug.cgi?id=710888). 37 | * Stop player on exit. 38 | * Add an option for bad-index files (AVI,M2V,TS,dump-stream MPEG). 39 | * Don't start the conversion if codecs are missing. 40 | * Accept folder as argument and only add audio/video mimetypes. 41 | * Updated Spanish translation. 42 | 43 | Version 0.2.2 44 | ------------- 45 | 46 | * Added -Use CSD- option, to enable/disable HeaderBar. 47 | * Limited Favorite list to only 10 elements. 48 | * Fixed bug when add files/folders contains special characters. 49 | * Updated translations and some other changes. 50 | 51 | Version 0.2.1 52 | ------------- 53 | 54 | * Fix bugs. 55 | 56 | Version 0.2.0 57 | ------------- 58 | 59 | * Check availability of codecs according to encoder 60 | * Show availabe codecs. 61 | * Enhanced video thumbnail (showed with correct aspect ratio). 62 | * New favorite list 63 | * Add global menu (Gnome Shell) 64 | * Allow to choose a player. 65 | * Allow to edit formats. 66 | * Enhanced interface. 67 | * ... 68 | 69 | Version 0.2.0 beta 70 | ------------------ 71 | 72 | * Redesigned UI. 73 | * Added OPUS audio format. 74 | * Ported code to Python 3. 75 | * New Dialog for formats with search entry. 76 | * Enhanced setup and reduced dependencies. 77 | * Removed mencoder and depends only on ffmpeg static build. 78 | * Fix bug in restore last size and position. 79 | * Removed double-click option to add file. 80 | * And more... 81 | 82 | 83 | Version 0.1.22.3 84 | ---------------- 85 | 86 | * Remember last size and position. 87 | * Added "Português - Brazil" translation (by vagner ). 88 | * Added missing dialog icons (by Ken ). 89 | * Updated russian translation. 90 | 91 | 92 | Version 0.1.22.2 93 | ---------------- 94 | 95 | * Added serbian translation (by Ch_Brozović ). 96 | 97 | 98 | Version 0.1.22.1 99 | ---------------- 100 | 101 | * Updated polish and russian translation. 102 | * sync filesystem before suspend. 103 | 104 | 105 | Version 0.1.22 106 | -------------- 107 | 108 | * Updated arabic, czech and basque translations. 109 | * Option to rename input file after successfull conversion. 110 | * Save/load last audio and video properties (restaured). 111 | * Bugs fixes and some UI enhancements. 112 | 113 | 114 | Version 0.1.21 115 | -------------- 116 | 117 | * New icons. 118 | * Show file duration in files list. 119 | * Added button in menu-bar allow to add files from folder directly. 120 | * Added "Browse source" item in menu. 121 | * Added "File information" button (using mediainfo program). 122 | * Added "File information" entry in the menu. 123 | * Removed "libfaac" codec. 124 | * Disabled "favorite" button during conversion. 125 | * Functions improvement. 126 | 127 | 128 | Version 0.1.20.6 129 | ---------------- 130 | 131 | * Added Polish translation (Thanks to Daniel Napora ) 132 | 133 | 134 | Version 0.1.20.5 135 | ---------------- 136 | 137 | * Added Russian translation (by VitalD ) 138 | 139 | 140 | Version 0.1.20.4 141 | ---------------- 142 | 143 | * Added Traditional Chinese language (by taijuin ) 144 | 145 | 146 | Version 0.1.20.3 147 | ---------------- 148 | 149 | * Added Spanish and Italian languages (by bersil ) 150 | * Sorted languages list. 151 | 152 | 153 | Version 0.1.20.2 154 | ---------------- 155 | 156 | * Updated Czech translation. 157 | 158 | 159 | Version 0.1.20.1 160 | ---------------- 161 | 162 | * Updated basque translation. 163 | * Bug fixes... 164 | 165 | 166 | Version 0.1.20 167 | -------------- 168 | 169 | * Enhanced layouts. 170 | * Added information sidebar (image preview with some infos.). 171 | * Removed tooltip infos (used sidebar instead). 172 | * Enhancements and bugs fixes. 173 | 174 | 175 | Version 0.1.19.2 176 | ---------------- 177 | 178 | * Added basque language (by Itzultzailearen kredituak). 179 | * Fixes... 180 | 181 | 182 | Version 0.1.19.1 183 | ---------------- 184 | 185 | * Added 'aac' codec. 186 | * French translation updated. 187 | 188 | 189 | Version 0.1.19 190 | -------------- 191 | 192 | * Added 'libvo_aacenc' audio codec. 193 | * Added 'Copy Mode' option (to split too faster without converting). 194 | * Added 'to the end' option. 195 | * Added Czech language (Pavel Fric ). 196 | 197 | 198 | Version 0.1.18.4 199 | ---------------- 200 | 201 | * Added support for SSA/ASS subtitle. 202 | * Enhnaced favorite list dialog (added delete key shortcut). 203 | * Enhanced saving/loading functions. 204 | * Update translation. 205 | 206 | 207 | Version 0.1.18.3 208 | ---------------- 209 | 210 | * Added Dutch translation (by vertalers). 211 | * Ability to add current format to your favorite list. 212 | * Some fixes... 213 | 214 | 215 | Version 0.1.18.2 216 | ---------------- 217 | 218 | * Bug fixes. 219 | 220 | 221 | Version 0.1.18.1 222 | ---------------- 223 | 224 | * Show elapsed time for each conversion process. 225 | * Added harddup option (work with mencoder only). 226 | * Updates... 227 | 228 | 229 | Version 0.1.18 230 | -------------- 231 | 232 | * Removed makefiles and moved all install stuffs to setup.py file. 233 | * Replace duration by file size in the files list (treeview). 234 | * Show file without extension in the files list (treeview). 235 | * Fixed a bug in when add file via command line. 236 | * Some fixes... 237 | 238 | Version 0.1.17 239 | -------------- 240 | 241 | Commited by Ehab El-Gedawy 242 | * Sorted formats. 243 | * Added program to Video/Audio files menu. 244 | * Makefile 245 | * rpm initial packing (making a .spec file). 246 | 247 | Commited by Andrej Kvasnica 248 | * Save/load last audio and video properties. 249 | * Suspend computer after finish. 250 | 251 | Update: Fixed a bug in Makefile. 252 | 253 | 254 | Version 0.1.16.2 255 | ---------------- 256 | 257 | * Allow to add file(s) via command line (Thanks to Ehab El-Gedawy ). 258 | 259 | 260 | Version 0.1.16.1 261 | ---------------- 262 | 263 | * Bug fixes in "Pad option". 264 | 265 | 266 | Version 0.1.16 267 | -------------- 268 | 269 | * Added Crop option. 270 | * Added Pad option. 271 | * Many changes and improvements inside. 272 | 273 | 274 | Version 0.1.15.4 275 | ---------------- 276 | 277 | * Allow to remove the source file after conversion. 278 | * Some corrections in french translation. 279 | 280 | 281 | Version 0.1.15.3 282 | ---------------- 283 | 284 | * Added french language. 285 | * Removed preview file after aborting process. 286 | 287 | 288 | Version 0.1.15.2 289 | ---------------- 290 | 291 | * Added option to show/hide toolbar's icons text. 292 | * Update translation. 293 | * Corrections and fixes. 294 | 295 | 296 | Version 0.1.15.1 297 | ---------------- 298 | 299 | * Corrected bug in curlew.desktop file. 300 | * Some bug fixes. 301 | 302 | 303 | Version 0.1.15 304 | -------------- 305 | 306 | * Added option to swicth manualy between available languages. 307 | * Added new icons set (Thanks to Smail ). 308 | * Added option to change toolbar icons, or make your own icons. 309 | * Added option shutdown computer after finish (after 20 seconds). 310 | * Fixed bug in "same quality" option. 311 | * Update translation. 312 | 313 | Version 0.1.14.2 314 | ---------------- 315 | 316 | * Bug fixes (setup.py, "Source quality" option with ffmpeg) 317 | * Other updates and fixes. 318 | 319 | 320 | Version 0.1.14.1 321 | ---------------- 322 | 323 | * Update Arabic translation. 324 | * Changed application icons. 325 | * Changed place of "Same Quality" option. 326 | * Other fixes. 327 | 328 | 329 | Version 0.1.14 330 | -------------- 331 | 332 | * Added icon to system tray. 333 | * Run only one instance of the program. 334 | * Added Escape key to cancel preview or to stop conversion. 335 | * Translation bugs fixed. 336 | 337 | 338 | Version 0.1.13.2 339 | ---------------- 340 | 341 | * Fixed translation bug in some untranslated words. 342 | * Added more description in README file. 343 | 344 | 345 | Version 0.1.13.1 346 | ---------------- 347 | 348 | * DND (drag and drop) bug Fixed. 349 | 350 | 351 | Version 0.1.13 352 | -------------- 353 | 354 | * Used the default installed encoder. 355 | * Fixed a translation bug. 356 | * Some notable fixes and improvements. 357 | 358 | 359 | Version 0.1.12 360 | -------------- 361 | 362 | * Added tooltip information about the file when cursor moved over it. 363 | * Added subtitle delay option, can be negative value. 364 | 365 | 366 | Version 0.1.11 367 | -------------- 368 | 369 | * Added Matroska format(mkv container with libvorbis and libvpx). 370 | * Added double-click in the treeview (if empty) to add new file(s). 371 | * Saved last used font name. 372 | * Removed duplicated formats (vcd, dvd, svcd). 373 | * Removed version number from title bar. 374 | 375 | 376 | Version 0.1.10 377 | -------------- 378 | 379 | * Removed Quality combobox. 380 | * Reorganized the source code. 381 | * Cleanup. 382 | 383 | 384 | Version 0.1.9r5 385 | -------------- 386 | 387 | * Show more details for errors. 388 | * Many other fixes. 389 | 390 | 391 | Version 0.1.9r4 392 | -------------- 393 | 394 | * Added threads number option. 395 | * Press return key to play file. 396 | * Double click to play file. 397 | 398 | 399 | Version 0.1.9r3 400 | -------------- 401 | 402 | * Added duration column to the treeview. 403 | * Disabled controls during conversion process. 404 | * Some fixes. 405 | 406 | 407 | Version 0.1.9r2 408 | -------------- 409 | 410 | * Added H.264 video with subtitle. 411 | * Enhanced (XviD, DivX) with subtitle formats (some parameters). 412 | * No preview during conversion process. 413 | * Show current pass (P-1 or P-2) when using 2-Pass option. 414 | 415 | 416 | Version 0.1.9r1 417 | -------------- 418 | 419 | * Enhanced preview function (remove the notification before preview) 420 | * Removed "gir1.2-notify-0.7" dependency package (reduced dependencies :)). 421 | * Removed temporary preview file after played it. 422 | 423 | 424 | Version 0.1.9 425 | -------------- 426 | 427 | * Added two-pass encoding option. 428 | * Enhanced spliting for a long begin time (pulse progressbar during processing). 429 | * Allowed choosing between ffmpeg or avconv. 430 | * Used internal player (avplay/ffplay) for playing and preview files. 431 | * Added option to extract only video (no sound). 432 | * Add option to change output sound volume. 433 | * Add option to switch between overwrite/rename/skip existed file. 434 | * Some fixes. 435 | 436 | 437 | Version 0.1.8r1 438 | --------------- 439 | 440 | * Updated arabic translation. 441 | * Some fixes. 442 | 443 | 444 | Version 0.1.8 445 | --------------- 446 | 447 | * New version released! 448 | 449 | 450 | Version 0.1.7r1 451 | --------------- 452 | 453 | * Added some presets formats (16 formats). 454 | * No wrapping in formats combobox popup menu. 455 | 456 | 457 | Version 0.1.7 458 | --------------- 459 | 460 | * Added more presets formats (from winff). 461 | * Removed save window size and save expanded options. 462 | * Enhanced some functions in the code source. 463 | 464 | 465 | Version 0.1.6r2 466 | --------------- 467 | 468 | * Possibility to save and load settings. 469 | * Fixed bug in stop button. 470 | 471 | 472 | Version 0.1.6r1 473 | --------------- 474 | 475 | * Reorganized the source code. 476 | * Add an option to convert with the same quality as source file quality. 477 | * Update icons (more shiny than ever). 478 | 479 | 480 | Version 0.1.6 481 | --------------- 482 | 483 | * Converted project to Python package. 484 | * Fixed bugs in "Preview" and "Split" functions. 485 | * Updated source code. 486 | * Cleanup... 487 | 488 | 489 | Version 0.1.5r3 490 | --------------- 491 | 492 | * Replaced "string" and "user" modules. 493 | * Updated Arabic Translation. 494 | * Some revisions and fixes. 495 | 496 | 497 | Version 0.1.5r2 498 | --------------- 499 | 500 | * Used "avconv" program instead of deparcated "ffmpeg" program. 501 | * Added browse destination option in popup menu. 502 | * Fixed drag and drop. 503 | * Code enchancements... 504 | 505 | 506 | Version 0.1.5r1 507 | --------------- 508 | 509 | * delete uncompleted file. 510 | 511 | 512 | Version 0.1.5 513 | --------------- 514 | 515 | * Fixed devision by zero error 'Fedora system' 516 | * Replaced 'os.system and commands' by subprocess (prepare to python3) 517 | * Fixed encoding problem. 518 | * Curlew tested on Ubuntu 12.04, Mint 12, Ojuba 16. 519 | 520 | 521 | 522 | Version 0.1.4r3 523 | --------------- 524 | 525 | * Add drag and drop function. 526 | * Fix bug in ubuntu 12.04 527 | * Fix some bugs 528 | 529 | 530 | Version 0.1.4r2 531 | --------------- 532 | 533 | * Quit app. with confirmation (during conversion). 534 | * Add ogg format (audio/video) encoding. 535 | * Update translation. 536 | * Some impovements. 537 | 538 | 539 | Version 0.1.4r1 540 | --------------- 541 | 542 | * Fix bug in aspect ratio. 543 | 544 | 545 | Version 0.1.4 546 | -------------- 547 | 548 | * Reorganized source tree. 549 | * Updated setup.py file. 550 | * Use png format instead of svg (ToolBar). 551 | 552 | 553 | Version 0.1.3 554 | -------------- 555 | 556 | * Add 3gp encoding support. 557 | * Fix bug when removing file during conversion. 558 | * Add homepage. 559 | * Update README file (requirements) 560 | * Some improvements. 561 | 562 | Version 0.1.2 563 | -------------- 564 | 565 | * Add Application icon. 566 | * Update toolbar icons. 567 | * Update Arabic translation. 568 | * Some improvements. 569 | 570 | Version 0.1.1 571 | -------------- 572 | 573 | * Uploaded to github. 574 | 575 | Version 0.1.0 576 | -------------- 577 | 578 | * Initial release. 579 | -------------------------------------------------------------------------------- /curlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | from site import addsitedir 4 | addsitedir('/usr/share/curlew') 5 | addsitedir('/usr/local/share/curlew') 6 | 7 | import sys 8 | from modules.curlew import main 9 | main(*sys.argv[1:]) 10 | -------------------------------------------------------------------------------- /curlew.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Categories=AudioVideo;Video; 3 | Comment[en_US]=Easy to use Multimedia Converter for Linux 4 | Comment=Easy to use Multimedia Converter for Linux 5 | Comment[ar]=محول وسائط على لينكس سهل الاستخدام 6 | Comment[fr]=Un Convertisseur Multimédia simple à utiliser sous Linux 7 | Encoding=UTF-8 8 | Exec=curlew %U 9 | GenericName[en_US]=Curlew 10 | GenericName=Curlew 11 | Icon=curlew 12 | MimeType= 13 | Name[en_US]=Curlew 14 | Name=Curlew 15 | Name[ar]=كروان 16 | StartupNotify=true 17 | Terminal=false 18 | Type=Application 19 | -------------------------------------------------------------------------------- /curlew.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 24 | 27 | 31 | 35 | 36 | 38 | 42 | 46 | 47 | 50 | 54 | 58 | 59 | 61 | 65 | 69 | 70 | 72 | 76 | 80 | 84 | 85 | 87 | 91 | 95 | 99 | 100 | 102 | 106 | 110 | 114 | 115 | 117 | 121 | 125 | 129 | 130 | 132 | 136 | 140 | 144 | 148 | 149 | 151 | 155 | 159 | 163 | 167 | 168 | 171 | 175 | 179 | 180 | 182 | 186 | 190 | 194 | 195 | 197 | 201 | 205 | 206 | 208 | 212 | 216 | 220 | 221 | 223 | 227 | 231 | 235 | 236 | 238 | 242 | 246 | 250 | 251 | 253 | 257 | 261 | 265 | 266 | 269 | 273 | 277 | 278 | 281 | 285 | 289 | 290 | 292 | 296 | 300 | 304 | 305 | 308 | 312 | 316 | 317 | 320 | 324 | 328 | 329 | 339 | 348 | 358 | 367 | 376 | 386 | 395 | 404 | 414 | 424 | 434 | 443 | 453 | 454 | 474 | 476 | 477 | 479 | image/svg+xml 480 | 482 | 483 | 484 | 485 | 486 | 491 | 493 | 501 | 504 | 509 | 514 | 519 | 520 | 521 | 522 | 523 | -------------------------------------------------------------------------------- /deb_prepare.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # python3-stdeb package needed. 3 | 4 | python3 setup.py --command-packages=stdeb.command debianize 5 | 6 | # 7 | sed -i 's|Package: python3-curlew|Package: curlew|g' $PWD/debian/control 8 | 9 | # Make deb 10 | #debuild -b 11 | -------------------------------------------------------------------------------- /debian/changelog: -------------------------------------------------------------------------------- 1 | curlew (0.2.4-1) testing; urgency=medium 2 | 3 | * New upstream release 4 | * Excluded non media files to be loaded in the list. 5 | * Removed 'Players Dialog' and let Curlew choose the player. 6 | * Enhanced Favorite. 7 | * Added a welcome page. 8 | * Show Files information inside the main window. 9 | * Added an option to show/hide status bar, and make it invisible by default. 10 | * Some interface improvements... 11 | 12 | -- Fayssal Chamekh Sun, 23 Jul 2017 07:36:22 +0100 13 | 14 | curlew (0.2.3-1) testing; urgency=low 15 | 16 | * Initial packaging. 17 | * Show dialog in the first install to choose the favorite player. 18 | * Added "German" translation (by Rainer Peichl). 19 | * Fix infobar hiding (workaround https://bugzilla.gnome.org/show_bug.cgi?id=710888). 20 | * Stop player on exit. 21 | * Add an option for bad-index files (AVI,M2V,TS,dump-stream MPEG). 22 | * Don't start the conversion if codecs are missing. 23 | * Accept folder as argument and only add audio/video mimetypes. 24 | * Updated Spanish translation. 25 | 26 | -- Fayssal Chamekh Mon, 16 Jan 2017 03:13:33 +0100 27 | -------------------------------------------------------------------------------- /debian/compat: -------------------------------------------------------------------------------- 1 | 9 2 | -------------------------------------------------------------------------------- /debian/control: -------------------------------------------------------------------------------- 1 | Source: curlew 2 | Section: video 3 | Priority: optional 4 | Maintainer: Fayssal Chamekh 5 | Build-Depends: debhelper (>= 9), python3, librsvg2-bin, intltool | intltool-debian 6 | X-Python3-Version: >= 3.3 7 | Standards-Version: 3.9.8 8 | Homepage: https://curlew.sourceforge.io/ 9 | Vcs-Git: git://github.com/chamfay/Curlew.git 10 | Vcs-Browser: https://github.com/chamfay/Curlew 11 | 12 | Package: curlew 13 | Architecture: all 14 | Depends: ${misc:Depends}, ${python3:Depends}, mediainfo, python3-dbus, python3-gi (>= 3.12), xdg-utils, gir1.2-gtk-3.0 (>= 3.12), gir1.2-gstreamer-1.0, ffmpeg | libav-tools (>= 0.8), gnome-icon-theme-symbolic 15 | Suggests: libavcodec-extra 16 | Description: Easy to use multimedia converter 17 | Easy to use, Free and Open-Source Multimedia converter for Linux. 18 | Curlew written in python and GTK3 and it depends on (ffmpeg/avconv). 19 | . 20 | Main Features: 21 | - Easy to use and clean user interface. 22 | - Hide the advanced options with the ability to show them. 23 | - Convert to more than 100 different formats. 24 | - Edit formats. 25 | - Shutdown or suspend PC after a conversion process. 26 | - Show file information (duration, remaining time, estimated size 27 | , progress value). 28 | - Show file details using mediainfo. 29 | - Skip or remove file during conversion process. 30 | - Preview file before conversion. 31 | - Show video thumbnail. 32 | - Convert a specified portion of file. 33 | - Combine subtitle with video. 34 | - Crop and pad video. 35 | - Show error details if exist. 36 | - And more ... 37 | -------------------------------------------------------------------------------- /debian/copyright: -------------------------------------------------------------------------------- 1 | Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ 2 | Upstream-Name: curlew 3 | Source: https://github.com/chamfay/Curlew 4 | 5 | Files: * 6 | Copyright: 2012 Fayssal Chamekh chamfay@gmail.com 7 | License: Waqf 8 | This package is free software; you can redistribute it and/or modify 9 | it under the terms of the Waqf Public License as published by 10 | the Ojuba project. 11 | . 12 | This package is distributed in the hope that it will be useful, 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | Waqf Public License for more details. 16 | . 17 | You should have received a copy of the Waqf Public License 18 | along with this program. If not, see 19 | 20 | Files: debian/* 21 | Copyright: 2017 Fayssal Chamekh 22 | License: GPL-2+ 23 | This package is free software; you can redistribute it and/or modify 24 | it under the terms of the GNU General Public License as published by 25 | the Free Software Foundation; either version 2 of the License, or 26 | (at your option) any later version. 27 | . 28 | This package is distributed in the hope that it will be useful, 29 | but WITHOUT ANY WARRANTY; without even the implied warranty of 30 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 31 | GNU General Public License for more details. 32 | . 33 | You should have received a copy of the GNU General Public License 34 | along with this program. If not, see 35 | . 36 | On Debian systems, the complete text of the GNU General 37 | Public License version 2 can be found in "/usr/share/common-licenses/GPL-2". 38 | -------------------------------------------------------------------------------- /debian/curlew.1: -------------------------------------------------------------------------------- 1 | .TH Curlew "1" "January 2017" "Curlew" "User Commands" 2 | .SH NAME 3 | curlew \- Easy to use multimedia converter 4 | .SH DESCRIPTION 5 | Curlew is an easy to use, Free and Open-Source Multimedia converter for Linux. 6 | .br 7 | Curlew written in python and GTK3 and it depends on (ffmpeg/avconv). 8 | .SH AUTHOR 9 | Written by Fayssal Chamekh 10 | .SH "REPORTING BUGS" 11 | Homepage: 12 | .br 13 | Report bugs to 14 | .SH COPYRIGHT 15 | (C) Copyright 2012 Fayssal Chamekh 16 | .br 17 | License: Waqf Public License 18 | .br 19 | the complete text of the Waqf Public License 20 | .br 21 | can be found at `http://ojuba.org/waqf/license' 22 | .PP 23 | This is free software: you are free to change and redistribute it. 24 | .br 25 | There is NO WARRANTY, to the extent permitted by law 26 | .br 27 | -------------------------------------------------------------------------------- /debian/docs: -------------------------------------------------------------------------------- 1 | LICENSE-ar.txt 2 | LICENSE-en.txt 3 | README 4 | TODO 5 | -------------------------------------------------------------------------------- /debian/manpages: -------------------------------------------------------------------------------- 1 | debian/curlew.1 2 | -------------------------------------------------------------------------------- /debian/patches/disable_po_files_auto_update.diff: -------------------------------------------------------------------------------- 1 | --- a/setup.py 2 | +++ b/setup.py 3 | @@ -40,8 +40,8 @@ def generate_icons(): 4 | # Update locales 5 | def update_locale(): 6 | # Make curlew.pot file from python source files. 7 | - py_files = " ".join(glob("modules/*.py")) 8 | - call("xgettext --keyword=_ -o po/curlew.pot {}".format(py_files), shell=True) 9 | + # py_files = " ".join(glob("modules/*.py")) 10 | + # call("xgettext --keyword=_ -o po/curlew.pot {}".format(py_files), shell=True) 11 | 12 | po_files = glob("po/*.po") 13 | for po_file in po_files: 14 | @@ -49,8 +49,8 @@ def update_locale(): 15 | mo_path = "locale/{}/LC_MESSAGES/curlew.mo".format(lang) 16 | 17 | # Update po files 18 | - if call("{} -x -g po/curlew -d po/{}".format(UPDATE, lang), shell=True) > 0: 19 | - return 1 20 | + # if call("{} -x -g po/curlew -d po/{}".format(UPDATE, lang), shell=True) > 0: 21 | + # return 1 22 | 23 | # Make locale directories 24 | call("mkdir -p locale/{}/LC_MESSAGES/".format(lang), shell=True) 25 | -------------------------------------------------------------------------------- /debian/patches/series: -------------------------------------------------------------------------------- 1 | disable_po_files_auto_update.diff 2 | -------------------------------------------------------------------------------- /debian/rules: -------------------------------------------------------------------------------- 1 | #!/usr/bin/make -f 2 | # See debhelper(7) (uncomment to enable) 3 | # output every command that modifies files on the build system. 4 | #DH_VERBOSE = 1 5 | 6 | # see EXAMPLES in dpkg-buildflags(1) and read /usr/share/dpkg/* 7 | DPKG_EXPORT_BUILDFLAGS = 1 8 | include /usr/share/dpkg/default.mk 9 | 10 | # see FEATURE AREAS in dpkg-buildflags(1) 11 | #export DEB_BUILD_MAINT_OPTIONS = hardening=+all 12 | 13 | # see ENVIRONMENT in dpkg-buildflags(1) 14 | # package maintainers to append CFLAGS 15 | #export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic 16 | # package maintainers to append LDFLAGS 17 | #export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed 18 | 19 | 20 | # main packaging script based on dh7 syntax 21 | %: 22 | dh $@ --with=python3 --buildsystem=pybuild 23 | 24 | # debmake generated override targets 25 | # This is example for Cmake (See http://bugs.debian.org/641051 ) 26 | #override_dh_auto_configure: 27 | # dh_auto_configure -- \ 28 | # -DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH) 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /debian/source/format: -------------------------------------------------------------------------------- 1 | 3.0 (quilt) 2 | -------------------------------------------------------------------------------- /debian/watch: -------------------------------------------------------------------------------- 1 | # to check for upstream updates and more. 2 | # See uscan(1) for format 3 | 4 | version=3 5 | 6 | opts=filenamemangle=s/.+\/v?(\d\S+)\.tar\.gz/-$1\.tar\.gz/ \ 7 | https://github.com/chamfay/Curlew/tags .*/v?(\d\S+)\.tar\.gz 8 | -------------------------------------------------------------------------------- /done.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chamfay/Curlew/10aa181c3839a3ec31faea849ed02fac0a5f9d91/done.ogg -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ $UID -eq 0 ]; then 4 | python3 setup.py install --prefix=/usr 5 | else 6 | echo "Run me as root!" 7 | fi 8 | 9 | -------------------------------------------------------------------------------- /modules/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Curlew - Easy to use multimedia converter 4 | # 5 | # Copyright (C) 2012-2018 Fayssal Chamekh 6 | # 7 | # Released under terms on waqf public license. 8 | # 9 | # Curlew is free software; you can redistribute it and/or modify it 10 | # under the terms of the latest version waqf public license as published by 11 | # ojuba.org. 12 | # 13 | # Curlew is distributed in the hope that it will be useful, but WITHOUT 14 | # ANY WARRANTY; without even the implied warranty 15 | # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 | # 17 | # The latest version of the license can be found on: 18 | # http://waqf.ojuba.org/license 19 | 20 | from gi.repository import GLib 21 | 22 | from modules.consts import CONF_FILE, USR_FFILE, CONF_PATH 23 | from os.path import exists 24 | import os 25 | 26 | # Create ".curlew" folder if not exist 27 | if not exists(CONF_PATH): os.mkdir(CONF_PATH) 28 | 29 | # Create empty config file (curlew.cfg). 30 | if not exists(CONF_FILE): 31 | conf = GLib.KeyFile() 32 | conf.set_string('configs', 'formats_file', USR_FFILE) 33 | conf.save_to_file(CONF_FILE) 34 | conf.unref() 35 | 36 | -------------------------------------------------------------------------------- /modules/about.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Curlew - Easy to use multimedia converter 4 | # 5 | # Copyright (C) 2012-2018 Fayssal Chamekh 6 | # 7 | # Released under terms on waqf public license. 8 | # 9 | # Curlew is free software; you can redistribute it and/or modify it 10 | # under the terms of the latest version waqf public license as published by 11 | # ojuba.org. 12 | # 13 | # Curlew is distributed in the hope that it will be useful, but WITHOUT 14 | # ANY WARRANTY; without even the implied warranty 15 | # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 | # 17 | # The latest version of the license can be found on: 18 | # http://waqf.ojuba.org/license 19 | 20 | import gi 21 | gi.require_version('Gtk', '3.0') 22 | 23 | from gi.repository import Gtk 24 | 25 | PROGRAMMER = 'Fayssal Chamekh ' 26 | WEBSITE = 'https://curlew.sourceforge.io' 27 | VERSION = '0.2.5' 28 | 29 | 30 | class About(Gtk.AboutDialog): 31 | def __init__(self, parent): 32 | Gtk.AboutDialog.__init__(self, parent=parent, wrap_license=True) 33 | self.set_program_name(_('Curlew')) 34 | self.set_authors([PROGRAMMER, 'Ehab El-Gedawy ', 'Andrej Kvasnica ']) 35 | self.set_copyright("Copyright © 2012-2017 Fayssal Chamekh ") 36 | self.set_version(VERSION) 37 | self.set_title(_('About Curlew')) 38 | self.set_logo_icon_name('curlew') 39 | self.set_icon_name('curlew') 40 | self.set_comments(_('Easy to use Multimedia Converter for Linux')) 41 | self.set_license(""" 42 | Released under terms on waqf public license. 43 | 44 | This program is free software; you can redistribute it and/or modify it under the terms of the latest version waqf public license as published by ojuba.org. 45 | 46 | This program is distributed in the hope that it will be useful, but without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose. 47 | 48 | The latest version of the license can be found on: 49 | http://waqf.ojuba.org/license 50 | """) 51 | self.set_website(WEBSITE) 52 | self.set_website_label(WEBSITE) 53 | self.set_translator_credits(_("translator-credits")) 54 | self.set_artists([PROGRAMMER, 'Smail ']) 55 | 56 | def show(self): 57 | self.run() 58 | self.destroy() 59 | -------------------------------------------------------------------------------- /modules/codecsdialog.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Curlew - Easy to use multimedia converter 4 | # 5 | # Copyright (C) 2012-2018 Fayssal Chamekh 6 | # 7 | # Released under terms on waqf public license. 8 | # 9 | # Curlew is free software; you can redistribute it and/or modify it 10 | # under the terms of the latest version waqf public license as published by 11 | # ojuba.org. 12 | # 13 | # Curlew is distributed in the hope that it will be useful, but WITHOUT 14 | # ANY WARRANTY; without even the implied warranty 15 | # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 | # 17 | # The latest version of the license can be found on: 18 | # http://waqf.ojuba.org/license 19 | 20 | import gi 21 | gi.require_version('Gtk', '3.0') 22 | 23 | from gi.repository import Gtk, Pango 24 | from modules.functions import get_available_codecs 25 | 26 | class CodecsDialog(Gtk.Dialog): 27 | def __init__(self, prnt, encoder, title): 28 | Gtk.Dialog.__init__(self, parent=prnt, use_header_bar=True) 29 | self.set_title(title) 30 | self.set_size_request(700, 600) 31 | self.set_border_width(6) 32 | self.vbox.set_spacing(6) 33 | 34 | txt_info = Gtk.TextView() 35 | txt_info.set_editable(False) 36 | txt_info.set_cursor_visible(False) 37 | txt_info.set_border_width(8) 38 | 39 | scroll = Gtk.ScrolledWindow() 40 | scroll.set_shadow_type(Gtk.ShadowType.IN) 41 | scroll.add(txt_info) 42 | self.vbox.pack_start(scroll, True, True, 0) 43 | 44 | font_desc = Pango.FontDescription('Monospace') 45 | txt_info.override_font(font_desc) 46 | 47 | txt_buffer = Gtk.TextBuffer() 48 | txt_info.set_buffer(txt_buffer) 49 | 50 | # Show Codecs 51 | buff = get_available_codecs(encoder) 52 | txt_buffer.set_text(buff) 53 | 54 | 55 | 56 | def show_dialog(self): 57 | self.show_all() 58 | self.run() 59 | self.destroy() 60 | -------------------------------------------------------------------------------- /modules/configs.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Curlew - Easy to use multimedia converter 4 | # 5 | # Copyright (C) 2012-2018 Fayssal Chamekh 6 | # 7 | # Released under terms on waqf public license. 8 | # 9 | # Curlew is free software; you can redistribute it and/or modify it 10 | # under the terms of the latest version waqf public license as published by 11 | # ojuba.org. 12 | # 13 | # Curlew is distributed in the hope that it will be useful, but WITHOUT 14 | # ANY WARRANTY; without even the implied warranty 15 | # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 | # 17 | # The latest version of the license can be found on: 18 | # http://waqf.ojuba.org/license 19 | 20 | 21 | from gi.repository import GLib 22 | from modules.consts import CONF_FILE 23 | 24 | GROUP = 'configs' 25 | 26 | def set_b_config(key, value): 27 | conf = GLib.KeyFile() 28 | conf.load_from_file(CONF_FILE, GLib.KeyFileFlags.NONE) 29 | conf.set_boolean(GROUP, key, value) 30 | conf.save_to_file(CONF_FILE) 31 | 32 | def get_b_config(key): 33 | bool_value = True 34 | try: 35 | conf = GLib.KeyFile() 36 | conf.load_from_file(CONF_FILE, GLib.KeyFileFlags.NONE) 37 | bool_value = conf.get_boolean(GROUP, key) 38 | except: 39 | pass 40 | return bool_value 41 | 42 | def set_s_config(key, value): 43 | conf = GLib.KeyFile() 44 | conf.load_from_file(CONF_FILE, GLib.KeyFileFlags.NONE) 45 | conf.set_string(GROUP, key, value) 46 | conf.save_to_file(CONF_FILE) 47 | 48 | def get_s_config(key): 49 | str_value = '' 50 | try: 51 | conf = GLib.KeyFile() 52 | conf.load_from_file(CONF_FILE, GLib.KeyFileFlags.NONE) 53 | str_value = conf.get_string(GROUP, key) 54 | except: 55 | pass 56 | return str_value 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /modules/consts.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Curlew - Easy to use multimedia converter 4 | # 5 | # Copyright (C) 2012-2018 Fayssal Chamekh 6 | # 7 | # Released under terms on waqf public license. 8 | # 9 | # Curlew is free software; you can redistribute it and/or modify it 10 | # under the terms of the latest version waqf public license as published by 11 | # ojuba.org. 12 | # 13 | # Curlew is distributed in the hope that it will be useful, but WITHOUT 14 | # ANY WARRANTY; without even the implied warranty 15 | # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 | # 17 | # The latest version of the license can be found on: 18 | # http://waqf.ojuba.org/license 19 | 20 | import os 21 | from os.path import join, dirname, realpath 22 | 23 | HOME = os.getenv("HOME") 24 | CONF_PATH = join(HOME, '.curlew') 25 | 26 | CONF_FILE = join(CONF_PATH, 'curlew.cfg') 27 | 28 | PKG_DIR = dirname(realpath(__file__)) 29 | DTA_DIR = join(PKG_DIR, '../') 30 | 31 | SOUND_FILE = join(DTA_DIR, 'done.ogg') 32 | 33 | ORG_FFILE = join(DTA_DIR, 'formats.cfg') 34 | USR_FFILE = join(CONF_PATH, 'formats.cfg') 35 | 36 | -------------------------------------------------------------------------------- /modules/customwidgets.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Curlew - Easy to use multimedia converter 4 | # 5 | # Copyright (C) 2012-2018 Fayssal Chamekh 6 | # 7 | # Released under terms on waqf public license. 8 | # 9 | # Curlew is free software; you can redistribute it and/or modify it 10 | # under the terms of the latest version waqf public license as published by 11 | # ojuba.org. 12 | # 13 | # Curlew is distributed in the hope that it will be useful, but WITHOUT 14 | # ANY WARRANTY; without even the implied warranty 15 | # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 | # 17 | # The latest version of the license can be found on: 18 | # http://waqf.ojuba.org/license 19 | 20 | import gi 21 | gi.require_version('Gtk', '3.0') 22 | 23 | from gi.repository import Gtk 24 | 25 | 26 | class SpinsFrame(Gtk.Frame): 27 | '''4 SpinButton collection''' 28 | def __init__(self, title): 29 | Gtk.Frame.__init__(self) 30 | 31 | self._top = 0 32 | self._bottom = 0 33 | self._left = 0 34 | self._right = 0 35 | self._sum = 0 36 | 37 | hbox = Gtk.Box(sensitive=False, spacing=4, border_width=4) 38 | self.add(hbox) 39 | 40 | self.check_btn = Gtk.CheckButton(title) 41 | self.set_label_widget(self.check_btn) 42 | 43 | # Adjustments 44 | adj_top = Gtk.Adjustment(0, 0, 10000, 1) 45 | adj_bottom = Gtk.Adjustment(0, 0, 10000, 1) 46 | adj_left = Gtk.Adjustment(0, 0, 10000, 1) 47 | adj_right = Gtk.Adjustment(0, 0, 10000, 1) 48 | 49 | # Top spin 50 | self.spin_top = Gtk.SpinButton(adjustment=adj_top) 51 | self.spin_top.set_numeric(True) 52 | hbox.pack_start(Gtk.Label(_('Top')), False, False, 0) 53 | hbox.pack_start(self.spin_top, False, False, 0) 54 | 55 | hbox.pack_start(Gtk.VSeparator(), False, False, 8) 56 | 57 | # bottom spin 58 | self.spin_bottom = Gtk.SpinButton(adjustment=adj_bottom) 59 | self.spin_bottom.set_numeric(True) 60 | hbox.pack_start(Gtk.Label(_('Bottom')), False, False, 0) 61 | hbox.pack_start(self.spin_bottom, False, False, 0) 62 | 63 | hbox.pack_start(Gtk.VSeparator(), False, False, 8) 64 | 65 | # Left Spin 66 | self.spin_left = Gtk.SpinButton(adjustment=adj_left) 67 | self.spin_left.set_numeric(True) 68 | hbox.pack_start(Gtk.Label(_('Left')), False, False, 0) 69 | hbox.pack_start(self.spin_left, False, False, 0) 70 | 71 | hbox.pack_start(Gtk.VSeparator(), False, False, 8) 72 | 73 | # Right spin 74 | self.spin_right = Gtk.SpinButton(adjustment=adj_right) 75 | self.spin_right.set_numeric(True) 76 | hbox.pack_start(Gtk.Label(_('Right')), False, False, 0) 77 | hbox.pack_start(self.spin_right, False, False, 0) 78 | 79 | 80 | # Connection 81 | self.spin_top.connect('value-changed', self._on_spins_changed) 82 | self.spin_bottom.connect('value-changed', self._on_spins_changed) 83 | self.spin_left.connect('value-changed', self._on_spins_changed) 84 | self.spin_right.connect('value-changed', self._on_spins_changed) 85 | self.check_btn.connect('toggled', self._on_check_cb, hbox) 86 | 87 | def _on_check_cb(self, check_btn, hbox): 88 | hbox.set_sensitive(check_btn.get_active()) 89 | 90 | def _on_spins_changed(self, spin): 91 | self._top = self.spin_top.get_value_as_int() 92 | self._bottom = self.spin_bottom.get_value_as_int() 93 | self._left = self.spin_left.get_value_as_int() 94 | self._right = self.spin_right.get_value_as_int() 95 | 96 | self._sum = self._top + self._bottom + self._left + self._right 97 | 98 | def get_active(self): 99 | return self.check_btn.get_active() and self._sum != 0 100 | 101 | def get_crop(self): 102 | return 'crop=iw-{}:ih-{}:{}:{}'.format(self._left+self._right, 103 | self._top+self._bottom, 104 | self._left, self._top) 105 | 106 | def get_pad(self): 107 | return 'pad=iw+{}:ih+{}:{}:{}'.format(self._left+self._right, 108 | self._top+self._bottom, 109 | self._left, self._top) 110 | 111 | 112 | class HScale(Gtk.HScale): 113 | def __init__(self, container, def_value, min_value, max_value, step=1): 114 | Gtk.HScale.__init__(self) 115 | container.pack_start(self, True, True, 0) 116 | adj = Gtk.Adjustment.new(def_value, min_value, max_value, step, step, 0) 117 | self.set_adjustment(adj) 118 | self.set_value_pos(Gtk.PositionType.RIGHT) 119 | self.set_digits(0) 120 | 121 | 122 | class LabeledHBox(Gtk.Box): 123 | ''' hbox with label''' 124 | def __init__(self, label, container=None): 125 | Gtk.Box.__init__(self, spacing=4) 126 | _label = Gtk.Label(label, use_markup=True) 127 | _label.set_alignment(0, 0.5) 128 | self.pack_start(_label, False, False, 0) 129 | if container != None: 130 | container.pack_start(self, False, False, 0) 131 | 132 | 133 | class LabeledGrid(Gtk.Grid): 134 | def __init__(self, container=None): 135 | Gtk.Grid.__init__(self) 136 | self.set_column_spacing(2) 137 | self.set_row_spacing(4) 138 | self.set_row_homogeneous(False) 139 | self._n_childs = 0 140 | if container: 141 | container.pack_start(self, False, False, 0) 142 | 143 | def append_row(self, label, widget, expanded=False): 144 | _label = Gtk.Label(label, use_markup=True) 145 | _label.set_alignment(0.0, 0.5) 146 | _hbox = Gtk.Box() 147 | _hbox.set_hexpand(True) 148 | _hbox.pack_start(widget, expanded, expanded, 8) 149 | self.attach(_label, 0, self._n_childs, 1, 1) 150 | self.attach(_hbox, 1, self._n_childs, 1, 1) 151 | self._n_childs += 1 152 | 153 | def append_title(self, label): 154 | _label = Gtk.Label('{}'.format(label), use_markup=True) 155 | _label.set_alignment(0, 0.5) 156 | self.attach(_label, 0, self._n_childs, 1, 1) 157 | self._n_childs += 1 158 | 159 | def append_widget(self, widget): 160 | self.attach(widget, 0, self._n_childs, 2, 1) 161 | self._n_childs += 1 162 | 163 | 164 | class TimeLayout(Gtk.Box): 165 | def __init__(self, container, label): 166 | ''' Time widget ''' 167 | Gtk.Box.__init__(self) 168 | self._spin_h = Gtk.SpinButton().new_with_range(0, 5, 1) 169 | self._spin_m = Gtk.SpinButton().new_with_range(0, 59, 1) 170 | self._spin_s = Gtk.SpinButton().new_with_range(0, 59, 1) 171 | 172 | _label = Gtk.Label(label, use_markup=True) 173 | _label.set_alignment(0, 0.5) 174 | _label.set_width_chars(10) 175 | 176 | self.pack_start(_label, False, False, 0) 177 | 178 | self.pack_start(self._spin_h, False, False, 3) 179 | self.pack_start(Gtk.Label(label=_('hr')), False, False, 0) 180 | 181 | self.pack_start(Gtk.Label(6*' '), False, False, 0) 182 | 183 | self.pack_start(self._spin_m, False, False, 3) 184 | self.pack_start(Gtk.Label(label=_('min')), False, False, 0) 185 | 186 | self.pack_start(Gtk.Label(6*' '), False, False, 0) 187 | 188 | self.pack_start(self._spin_s, False, False, 3) 189 | self.pack_start(Gtk.Label(label=_('sec')), False, False, 0) 190 | 191 | container.pack_start(self, False, False, 0) 192 | 193 | def set_duration(self, duration): 194 | ''' Set duration in seconds ''' 195 | self._spin_h.set_value(duration/3600) 196 | self._spin_m.set_value((duration%3600)/60) 197 | self._spin_s.set_value((duration%3600)%60) 198 | 199 | def get_duration(self): 200 | ''' Return duration in sec ''' 201 | return self._spin_h.get_value()*3600 \ 202 | + self._spin_m.get_value()*60 \ 203 | + self._spin_s.get_value() 204 | 205 | def get_time_str(self): 206 | ''' 207 | Return time str like 00:00:00 208 | ''' 209 | return '{:02.0f}:{:02.0f}:{:02.0f}'.format(self._spin_h.get_value(), 210 | self._spin_m.get_value(), 211 | self._spin_s.get_value()) 212 | 213 | 214 | class ComboWithEntry(Gtk.ComboBoxText): 215 | ''' 216 | Custom ComboBoxText with entry 217 | ''' 218 | def __init__(self, with_entry=True): 219 | Gtk.ComboBoxText.__init__(self, has_entry=with_entry) 220 | self.connect('changed', self._on_combo_changed) 221 | self.set_entry_text_column(0) 222 | 223 | def set_list(self, list_of_elements): 224 | ''' Fill combobox with list directly [] ''' 225 | self.remove_all() 226 | for i in list_of_elements: self.append_text(i) 227 | self.set_active(0) 228 | 229 | def get_text(self): 230 | return self.get_active_text() 231 | 232 | def set_text(self, text): 233 | ''' Set text to Entry ''' 234 | entry = self.get_child() 235 | entry.set_text(text) 236 | 237 | def _on_combo_changed(self, *args): 238 | enabled = self.get_text() == 'default' and len(self.get_model()) < 2 239 | self.set_sensitive(not enabled) 240 | 241 | def is_not_default(self): 242 | return self.get_active_text() != 'default' 243 | 244 | def find_text(self, text_to_find): 245 | model = self.get_model() 246 | for row in model: 247 | if row[0] == text_to_find: 248 | return True 249 | return False 250 | 251 | class ButtonWithIcon(Gtk.Button): 252 | def __init__(self, icon_name=None, icon_size=Gtk.IconSize.BUTTON): 253 | Gtk.Button.__init__(self) 254 | self.set_size_request(36, 36) 255 | if icon_name: 256 | img = Gtk.Image.new_from_icon_name(icon_name, icon_size) 257 | self.set_image(img) 258 | 259 | class ToggleBtnWithIcon(Gtk.ToggleButton): 260 | def __init__(self, icon_name=None, icon_size=Gtk.IconSize.BUTTON): 261 | Gtk.Button.__init__(self) 262 | self.set_size_request(36, 36) 263 | if icon_name: 264 | img = Gtk.Image.new_from_icon_name(icon_name, icon_size) 265 | self.set_image(img) 266 | 267 | 268 | 269 | -------------------------------------------------------------------------------- /modules/errdialog.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Curlew - Easy to use multimedia converter 4 | # 5 | # Copyright (C) 2012-2018 Fayssal Chamekh 6 | # 7 | # Released under terms on waqf public license. 8 | # 9 | # Curlew is free software; you can redistribute it and/or modify it 10 | # under the terms of the latest version waqf public license as published by 11 | # ojuba.org. 12 | # 13 | # Curlew is distributed in the hope that it will be useful, but WITHOUT 14 | # ANY WARRANTY; without even the implied warranty 15 | # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 | # 17 | # The latest version of the license can be found on: 18 | # http://waqf.ojuba.org/license 19 | 20 | 21 | import gi 22 | gi.require_version('Gtk', '3.0') 23 | 24 | from gi.repository import Gtk, Pango 25 | 26 | class ErrDialog(Gtk.Dialog): 27 | def __init__(self, prnt, err_file, title): 28 | Gtk.Dialog.__init__(self, parent=prnt, use_header_bar=True) 29 | self.set_size_request(600, 300) 30 | self.set_border_width(6) 31 | self.set_title(title) 32 | scroll = Gtk.ScrolledWindow() 33 | scroll.set_shadow_type(Gtk.ShadowType.IN) 34 | text_log = Gtk.TextView() 35 | text_log.set_wrap_mode(Gtk.WrapMode.WORD_CHAR) 36 | text_log.set_border_width(6) 37 | text_log.set_editable(False) 38 | text_log.set_cursor_visible(False) 39 | 40 | font_desc = Pango.FontDescription('Monospace') 41 | text_log.override_font(font_desc) 42 | 43 | text_buffer = Gtk.TextBuffer() 44 | text_log.set_buffer(text_buffer) 45 | 46 | scroll.add(text_log) 47 | self.vbox.set_spacing(4) 48 | self.vbox.pack_start(scroll, True, True, 0) 49 | 50 | button = self.add_button(_('_Close'), Gtk.ResponseType.CLOSE) 51 | self.set_default(button) 52 | 53 | text_buffer.set_text(err_file.read()) 54 | 55 | 56 | def show_dialog(self): 57 | self.show_all() 58 | self.run() 59 | self.destroy() 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /modules/favdialog.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Curlew - Easy to use multimedia converter 4 | # 5 | # Copyright (C) 2012-2018 Fayssal Chamekh 6 | # 7 | # Released under terms on waqf public license. 8 | # 9 | # Curlew is free software; you can redistribute it and/or modify it 10 | # under the terms of the latest version waqf public license as published by 11 | # ojuba.org. 12 | # 13 | # Curlew is distributed in the hope that it will be useful, but WITHOUT 14 | # ANY WARRANTY; without even the implied warranty 15 | # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 | # 17 | # The latest version of the license can be found on: 18 | # http://waqf.ojuba.org/license 19 | 20 | import gi 21 | gi.require_version('Gtk', '3.0') 22 | 23 | from gi.repository import Gtk, Gdk 24 | import pickle 25 | 26 | class FavoriteDialog(Gtk.Dialog): 27 | def __init__(self, prnt, fav_list): 28 | Gtk.Dialog.__init__(self, parent=prnt, use_header_bar=True) 29 | self.set_title(_('Favorite list')) 30 | self.set_icon_name('curlew') 31 | self.set_border_width(4) 32 | self.set_size_request(450, 400) 33 | self.store = Gtk.ListStore(str) 34 | self.list_view = Gtk.TreeView(self.store) 35 | self.list_view.connect("key-press-event", self.on_key_press) 36 | 37 | header = self.get_header_bar() 38 | 39 | cell = Gtk.CellRendererText() 40 | col = Gtk.TreeViewColumn(_("Format"), cell, text=0) 41 | self.list_view.append_column(col) 42 | 43 | g_vbox = Gtk.Box(spacing=6, orientation=Gtk.Orientation.VERTICAL) 44 | 45 | scroll = Gtk.ScrolledWindow() 46 | scroll.set_shadow_type(Gtk.ShadowType.IN) 47 | scroll.add(self.list_view) 48 | 49 | g_vbox.pack_start(scroll, True, True, 0) 50 | 51 | box_up_down = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) 52 | Gtk.StyleContext.add_class(box_up_down.get_style_context(), "linked") 53 | header.pack_end(box_up_down) 54 | 55 | btn_up = Gtk.Button() 56 | btn_up.set_tooltip_text(_('Up')) 57 | btn_up.set_image(Gtk.Image.new_from_icon_name('go-up-symbolic', Gtk.IconSize.MENU)) 58 | btn_up.connect('clicked', self.go_up) 59 | box_up_down.pack_start(btn_up, False, False, 0) 60 | 61 | btn_down = Gtk.Button() 62 | btn_down.set_tooltip_text(_('Down')) 63 | btn_down.set_image(Gtk.Image.new_from_icon_name('go-down-symbolic', Gtk.IconSize.MENU)) 64 | btn_down.connect('clicked', self.go_down) 65 | box_up_down.pack_start(btn_down, False, False, 0) 66 | 67 | btn_delete = Gtk.Button() 68 | btn_delete.set_tooltip_text(_('Remove')) 69 | btn_delete.set_image(Gtk.Image.new_from_icon_name('list-remove-symbolic', Gtk.IconSize.MENU)) 70 | btn_delete.connect('clicked', self.delete_item) 71 | 72 | header.pack_end(btn_delete) 73 | 74 | self.vbox.pack_start(g_vbox, True, True, 0) 75 | 76 | # load 77 | for fformat in fav_list: 78 | self.store.append((fformat,)) 79 | 80 | self.show_all() 81 | 82 | # Delete Item 83 | def delete_item(self, *args): 84 | sele = self.get_selected_iter() 85 | if sele: 86 | self.store.remove(sele) 87 | 88 | def go_up(self, widget): 89 | sel_iter = self.get_selected_iter() 90 | if sel_iter: 91 | self.store.move_before(sel_iter, self.store.iter_previous(sel_iter)) 92 | 93 | def go_down(self, widget): 94 | sel_iter = self.get_selected_iter() 95 | if sel_iter: 96 | self.store.move_after(sel_iter, self.store.iter_next(sel_iter)) 97 | 98 | def get_selected_iter(self): 99 | return self.list_view.get_selection().get_selected()[1] 100 | 101 | def save(self, file_name): 102 | fav_list = [] 103 | for row in self.store: 104 | fav_list.append(row[0]) 105 | favfile = open(file_name, "wb") 106 | pickle.dump(fav_list, favfile) 107 | favfile.close() 108 | 109 | def on_key_press(self, widget, event): 110 | if event.keyval == Gdk.KEY_Delete: 111 | self.delete_item() 112 | 113 | -------------------------------------------------------------------------------- /modules/formateditor.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Curlew - Easy to use multimedia converter 4 | # 5 | # Copyright (C) 2012-2018 Fayssal Chamekh 6 | # 7 | # Released under terms on waqf public license. 8 | # 9 | # Curlew is free software; you can redistribute it and/or modify it 10 | # under the terms of the latest version waqf public license as published by 11 | # ojuba.org. 12 | # 13 | # Curlew is distributed in the hope that it will be useful, but WITHOUT 14 | # ANY WARRANTY; without even the implied warranty 15 | # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 | # 17 | # The latest version of the license can be found on: 18 | # http://waqf.ojuba.org/license 19 | 20 | from configparser import ConfigParser, NoSectionError 21 | 22 | import gi 23 | gi.require_version('Gtk', '3.0') 24 | 25 | from gi.repository import Gtk, GLib 26 | 27 | from modules.customwidgets import LabeledGrid, ButtonWithIcon 28 | from modules.consts import CONF_FILE, ORG_FFILE 29 | from modules.functions import show_message 30 | 31 | 32 | class FormatEditor(Gtk.Dialog): 33 | 34 | # Save settings 35 | def on_btn_save(self, *args): 36 | # Confirm 37 | if show_message(self, 38 | _('Are you sure you want to save settings?'), 39 | Gtk.MessageType.QUESTION, 40 | Gtk.ButtonsType.YES_NO) == Gtk.ResponseType.NO: 41 | return 42 | 43 | conf = ConfigParser() 44 | conf.read(self.ffile) 45 | 46 | section = self.entry_frmt.get_text() 47 | 48 | if not conf.has_section(section): 49 | conf.add_section(section) 50 | conf[section]['type'] = conf[self.format]['type'] 51 | try: 52 | conf[section]['ff'] = conf[self.format]['ff'] 53 | except: pass 54 | conf[section]['ext'] = conf[self.format]['ext'] 55 | conf[section]['flag'] = 'custom' 56 | 57 | # audio 58 | if self.entry_ab.get_sensitive(): 59 | ab = self.entry_ab.get_text() 60 | conf[section]['ab'] = ab 61 | lab = ab.split() 62 | conf[section]['def_ab'] = lab[self.spin_def_ab.get_value_as_int()-1] 63 | if self.entry_afreq.get_sensitive(): 64 | conf[section]['afreq'] = self.entry_afreq.get_text() 65 | if self.entry_ach.get_sensitive(): 66 | conf[section]['ach'] = self.entry_ach.get_text() 67 | if self.entry_acodec.get_sensitive(): 68 | conf[section]['acodec'] = self.entry_acodec.get_text() 69 | 70 | # video 71 | if self.entry_vb.get_sensitive(): 72 | vb = self.entry_vb.get_text() 73 | conf[section]['vb'] = vb 74 | lvb = vb.split() 75 | conf[section]['def_vb'] = lvb[self.spin_def_vb.get_value_as_int()-1] 76 | if self.entry_vfps.get_sensitive(): 77 | conf[section]['vfps'] = self.entry_vfps.get_text() 78 | if self.entry_vsize.get_sensitive(): 79 | conf[section]['vsize'] = self.entry_vsize.get_text() 80 | if self.entry_vcodec.get_sensitive(): 81 | conf[section]['vcodec'] = self.entry_vcodec.get_text() 82 | if self.entry_vratio.get_sensitive(): 83 | conf[section]['vratio'] = self.entry_vratio.get_text() 84 | 85 | if self.entry_extra.get_sensitive(): 86 | conf[section]['extra'] = self.entry_extra.get_text() 87 | 88 | with open(self.ffile, 'w') as configfile: 89 | conf.write(configfile) 90 | 91 | if section != self.format: 92 | self.store.append([section]) 93 | 94 | # close dialog 95 | self.close() 96 | 97 | def on_btn_def(self, *args): 98 | 99 | section = self.format 100 | 101 | conf_src = ConfigParser() 102 | conf_src.read(ORG_FFILE) 103 | conf_dest = ConfigParser() 104 | conf_dest.read(self.ffile) 105 | 106 | try: 107 | opts = conf_src.options(section) 108 | except NoSectionError: 109 | show_message(self, 110 | _('You can\'t restore a custom format to defaults.'), 111 | Gtk.MessageType.WARNING) 112 | return 113 | 114 | for opt in opts: 115 | conf_dest[section][opt] = conf_src[section][opt] 116 | 117 | with open(self.ffile, 'w') as configfile: 118 | conf_dest.write(configfile) 119 | 120 | self.load_settings() 121 | 122 | 123 | def get_formats_file(self): 124 | conf = GLib.KeyFile() 125 | conf.load_from_file(CONF_FILE, GLib.KeyFileFlags.NONE) 126 | frmts_file = conf.get_string('configs', 'formats_file') 127 | conf.unref() 128 | return frmts_file 129 | 130 | 131 | def set_sensitivity(self, media_type): 132 | sens = { 133 | 'audio': [True, True, True, True, False, False, False, False, False], 134 | 'video': [True, True, True, True, True, True, True, True, True], 135 | 'presets': [False, False, False, False, False, False, False, False, False], 136 | 'copy': [False, False, False, False, False, False, False, False, False] 137 | } 138 | 139 | self.entry_ab.set_sensitive(sens[media_type][0]) 140 | self.spin_def_ab.set_sensitive(sens[media_type][0]) 141 | self.entry_afreq.set_sensitive(sens[media_type][1]) 142 | self.entry_ach.set_sensitive(sens[media_type][2]) 143 | self.entry_acodec.set_sensitive(sens[media_type][3]) 144 | 145 | self.entry_vb.set_sensitive(sens[media_type][4]) 146 | self.spin_def_vb.set_sensitive(sens[media_type][4]) 147 | self.entry_vfps.set_sensitive(sens[media_type][5]) 148 | self.entry_vsize.set_sensitive(sens[media_type][6]) 149 | self.entry_vcodec.set_sensitive(sens[media_type][7]) 150 | self.entry_vratio.set_sensitive(sens[media_type][8]) 151 | 152 | 153 | def load_settings(self): 154 | conf = ConfigParser() 155 | conf.read(self.ffile) 156 | section = self.format 157 | 158 | self.btn_remove.set_sensitive(conf.has_option(section, 'flag')) 159 | 160 | self.set_sensitivity(conf[section]['type']) 161 | self.entry_frmt.set_text(section) 162 | 163 | # audio 164 | if conf.has_option(section, 'ab'): 165 | abitrate = conf[section]['ab'] 166 | self.entry_ab.set_text(abitrate) 167 | abitrates = abitrate.split() 168 | if conf.has_option(section, 'def_ab'): 169 | self.spin_def_ab.set_value(abitrates.index(conf[section]['def_ab'])+1) 170 | if conf.has_option(section, 'afreq'): 171 | self.entry_afreq.set_text(conf[section]['afreq']) 172 | if conf.has_option(section, 'ach'): 173 | self.entry_ach.set_text(conf[section]['ach']) 174 | if conf.has_option(section, 'acodec'): 175 | self.entry_acodec.set_text(conf[section]['acodec']) 176 | 177 | # video 178 | if conf.has_option(section, 'vb'): 179 | vbitrate = conf[section]['vb'] 180 | self.entry_vb.set_text(vbitrate) 181 | vbitrates = vbitrate.split() 182 | if conf.has_option(section, 'def_vb'): 183 | self.spin_def_vb.set_value(vbitrates.index(conf[section]['def_vb'])+1) 184 | if conf.has_option(section, 'vfps'): 185 | self.entry_vfps.set_text(conf[section]['vfps']) 186 | if conf.has_option(section, 'vsize'): 187 | self.entry_vsize.set_text(conf[section]['vsize']) 188 | if conf.has_option(section, 'vcodec'): 189 | self.entry_vcodec.set_text(conf[section]['vcodec']) 190 | if conf.has_option(section, 'vratio'): 191 | self.entry_vratio.set_text(conf[section]['vratio']) 192 | 193 | if conf.has_option(section, 'extra'): 194 | self.entry_extra.set_text(conf[section]['extra']) 195 | 196 | 197 | def on_bitrate_changed(self, w, spin): 198 | list_len = len(w.get_text().split()) 199 | spin.set_range(1, list_len) 200 | 201 | 202 | def remove_format(self, *args): 203 | # Confirm 204 | if show_message(self, 205 | _('Are you sure you want to remove this format?'), 206 | Gtk.MessageType.QUESTION, 207 | Gtk.ButtonsType.YES_NO) == Gtk.ResponseType.NO: 208 | return 209 | 210 | conf = ConfigParser() 211 | conf.read(self.ffile) 212 | conf.remove_section(self.format) 213 | with open(self.ffile, 'w') as configfile: 214 | conf.write(configfile) 215 | 216 | # remove iter 217 | prev_iter = None 218 | next_iter = None 219 | for row in self.store: 220 | if row[0] == self.format: 221 | prev_iter = self.store.iter_previous(row.iter) 222 | next_iter = self.store.iter_next(row.iter) 223 | self.store.remove(row.iter) 224 | break 225 | # 226 | if prev_iter == None: 227 | self.main_win.btn_formats.set_label(self.store[next_iter][0]) 228 | else: 229 | self.main_win.btn_formats.set_label(self.store[prev_iter][0]) 230 | 231 | # Update fav menu 232 | self.main_win.remove_from_fav(self.format) 233 | 234 | # close dialog 235 | self.close() 236 | 237 | 238 | def __init__(self, prnt, frmt, store): 239 | Gtk.Dialog.__init__(self, 240 | parent=prnt, 241 | use_header_bar=True) 242 | self.set_size_request(700, 450) 243 | self.set_border_width(4) 244 | self.set_title(_('Edition')) 245 | 246 | self.format = frmt 247 | self.store = store 248 | self.titlebar = self.get_titlebar() 249 | self.main_win = prnt 250 | 251 | self.vbox.set_spacing(6) 252 | grid = LabeledGrid(self.vbox) 253 | 254 | # Warning 255 | lbl_warn = Gtk.Label(_('WARNING: Please change these values with care!'), use_markup=True) 256 | self.vbox.pack_end(lbl_warn, False, False, 0) 257 | self.vbox.pack_end(Gtk.Separator(), False, False, 0) 258 | 259 | grid.append_title(_('Audio:')) 260 | 261 | self.entry_ab = Gtk.Entry() 262 | self.spin_def_ab = Gtk.SpinButton.new_with_range(1, 4, 1) 263 | self.entry_ab.connect('changed', self.on_bitrate_changed, self.spin_def_ab) 264 | 265 | box_ab = Gtk.Box(spacing=6) 266 | box_ab.pack_start(self.entry_ab, True, True, 0) 267 | box_ab.pack_start(Gtk.Label(_('Default')), False, False, 0) 268 | box_ab.pack_start(self.spin_def_ab, False, False, 0) 269 | 270 | grid.append_row(_('Audio Bitrates'), box_ab, True) 271 | self.entry_afreq = Gtk.Entry() 272 | grid.append_row(_('Audio Frequencies'), self.entry_afreq, True) 273 | self.entry_ach = Gtk.Entry() 274 | grid.append_row(_('Audio Channels'), self.entry_ach, True) 275 | self.entry_acodec = Gtk.Entry() 276 | grid.append_row(_('Audio Codecs'), self.entry_acodec, True) 277 | 278 | # video 279 | grid.append_title(_('Video:')) 280 | self.entry_vb = Gtk.Entry() 281 | self.spin_def_vb = Gtk.SpinButton().new_with_range(1, 4, 1) 282 | self.entry_vb.connect('changed', self.on_bitrate_changed, self.spin_def_vb) 283 | 284 | box_vb = Gtk.Box(spacing=6) 285 | box_vb.pack_start(self.entry_vb, True, True, 0) 286 | box_vb.pack_start(Gtk.Label(_('Default')), False, False, 0) 287 | box_vb.pack_start(self.spin_def_vb, False, False, 0) 288 | 289 | grid.append_row(_('Video Bitrates'), box_vb, True) 290 | self.entry_vfps = Gtk.Entry() 291 | grid.append_row(_('Video FPS'), self.entry_vfps, True) 292 | self.entry_vsize = Gtk.Entry() 293 | grid.append_row(_('Video Sizes'), self.entry_vsize, True) 294 | self.entry_vcodec = Gtk.Entry() 295 | grid.append_row(_('Video Codecs'), self.entry_vcodec, True) 296 | self.entry_vratio = Gtk.Entry() 297 | grid.append_row(_('Aspect Ratios'), self.entry_vratio, True) 298 | 299 | grid.append_title(_('Other Options:')) 300 | self.entry_extra = Gtk.Entry() 301 | grid.append_row(_('Extra Options'), self.entry_extra, True) 302 | 303 | box_title = Gtk.Box() 304 | Gtk.StyleContext.add_class(box_title.get_style_context(), "linked") 305 | 306 | # Format Entry 307 | self.entry_frmt = Gtk.Entry() 308 | self.entry_frmt.set_alignment(0.5) 309 | self.entry_frmt.set_size_request(320, 1) 310 | box_title.pack_start(self.entry_frmt, True, True, 0) 311 | 312 | # Save Button 313 | btn_save = ButtonWithIcon('document-save-symbolic') 314 | btn_save.set_tooltip_text(_('Save')) 315 | btn_save.connect('clicked', self.on_btn_save) 316 | box_title.pack_start(btn_save, True, True, 0) 317 | 318 | # Remove button 319 | self.btn_remove = ButtonWithIcon('edit-delete-symbolic') 320 | self.btn_remove.set_tooltip_text(_('Remove')) 321 | self.btn_remove.connect('clicked', self.remove_format) 322 | box_title.pack_start(self.btn_remove, False, False, 0) 323 | 324 | self.titlebar.set_custom_title(box_title) 325 | 326 | # Set to default button 327 | btn_def = ButtonWithIcon('view-refresh-symbolic') 328 | btn_def.set_tooltip_text(_('Restore default')) 329 | btn_def.connect('clicked', self.on_btn_def) 330 | self.titlebar.pack_end(btn_def) 331 | 332 | self.set_focus(btn_save) 333 | 334 | # work 335 | self.ffile = self.get_formats_file() 336 | self.load_settings() 337 | 338 | 339 | 340 | def show_dialog(self): 341 | self.show_all() 342 | self.run() 343 | self.destroy() 344 | -------------------------------------------------------------------------------- /modules/formats.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Curlew - Easy to use multimedia converter 4 | # 5 | # Copyright (C) 2012-2018 Fayssal Chamekh 6 | # 7 | # Released under terms on waqf public license. 8 | # 9 | # Curlew is free software; you can redistribute it and/or modify it 10 | # under the terms of the latest version waqf public license as published by 11 | # ojuba.org. 12 | # 13 | # Curlew is distributed in the hope that it will be useful, but WITHOUT 14 | # ANY WARRANTY; without even the implied warranty 15 | # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 | # 17 | # The latest version of the license can be found on: 18 | # http://waqf.ojuba.org/license 19 | 20 | import gi 21 | gi.require_version('Gtk', '3.0') 22 | 23 | from gi.repository import Gtk 24 | from modules.formateditor import FormatEditor 25 | from modules.customwidgets import ButtonWithIcon 26 | 27 | class Formats(Gtk.Popover): 28 | 29 | def on_select_format(self, *args): 30 | selected_iter = self.tree_sel.get_selected()[1] 31 | if selected_iter == None: 32 | self.lbl.set_markup(self.no_format) 33 | return 34 | self.selected_format = self.tree_filter[selected_iter][0] 35 | self.wind.btn_formats.set_label(self.selected_format) 36 | self.hide() 37 | self.wind.fill_options() 38 | 39 | 40 | def on_edit_format(self, widget): 41 | selected_iter = self.tree_sel.get_selected()[1] 42 | if selected_iter == None: 43 | self.lbl.set_markup(self.no_format) 44 | return 45 | self.selected_format = self.tree_filter[selected_iter][0] 46 | self.hide() 47 | dlg = FormatEditor(self.wind, self.selected_format, self.store) 48 | dlg.show_dialog() 49 | 50 | 51 | def on_closed(self, *args): 52 | self.lbl.set_markup('') 53 | 54 | 55 | def __init__(self, wind, formats_list, curr_format, store): 56 | self.wind = wind 57 | self.formats_list = formats_list 58 | self.selected_format = curr_format 59 | 60 | self.no_format = _('No format selected!') 61 | 62 | Gtk.Popover.__init__(self) 63 | self.set_border_width(4) 64 | self.connect('closed', self.on_closed) 65 | 66 | vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=4) 67 | self.add(vbox) 68 | 69 | # 70 | self.e_search = Gtk.SearchEntry() 71 | self.e_search.set_activates_default(True) 72 | self.e_search.connect('changed', self.on_entry_search) 73 | self.e_search.set_direction(Gtk.TextDirection.LTR) 74 | vbox.pack_start(self.e_search, False, True, 2) 75 | 76 | 77 | # 78 | self.store = store # Gtk.ListStore(str) 79 | self.tree_filter = self.store.filter_new() 80 | self.tree_filter.set_visible_func(self.match_func) 81 | 82 | self.tree_formats = Gtk.TreeView(self.tree_filter) 83 | self.tree_formats.set_headers_visible(False) 84 | self.tree_formats.set_direction(Gtk.TextDirection.LTR) 85 | self.tree_formats.set_grid_lines(Gtk.TreeViewGridLines.HORIZONTAL) 86 | self.tree_formats.connect('row-activated', self.on_choosed_format) 87 | 88 | self.tree_sel = self.tree_formats.get_selection() 89 | 90 | # cell 91 | cell = Gtk.CellRendererText() 92 | col = Gtk.TreeViewColumn(None, cell, text=0) 93 | self.tree_formats.append_column(col) 94 | 95 | scroll = Gtk.ScrolledWindow() 96 | scroll.set_size_request(450, 220) 97 | scroll.set_shadow_type(Gtk.ShadowType.ETCHED_IN) 98 | scroll.add(self.tree_formats) 99 | vbox.pack_start(scroll, True, True, 0) 100 | 101 | # Load formats 102 | for fmt in self.formats_list: 103 | self.store.append([fmt]) 104 | 105 | self.store.set_sort_column_id(0, Gtk.SortType.ASCENDING) 106 | 107 | # hbox btns 108 | hbox_btns = Gtk.Box() 109 | vbox.pack_start(hbox_btns, True, True, 0) 110 | 111 | # edit btn 112 | btn_edit = ButtonWithIcon('preferences-other-symbolic') 113 | btn_edit.set_tooltip_text(_('Edit')) 114 | btn_edit.connect('clicked', self.on_edit_format) 115 | hbox_btns.pack_start(btn_edit, False, True, 0) 116 | 117 | self.lbl = Gtk.Label() 118 | hbox_btns.pack_start(self.lbl, True, False, 0) 119 | 120 | # select btn 121 | btn_select = Gtk.Button(_('Choose')) 122 | btn_select.set_size_request(80, 1) 123 | btn_select.set_tooltip_text(_('Choose')) 124 | btn_select.connect('clicked', self.on_select_format) 125 | hbox_btns.pack_end(btn_select, False, True, 0) 126 | 127 | # finally 128 | vbox.show_all() 129 | 130 | def on_entry_search(self, w): 131 | self.tree_filter.refilter() 132 | 133 | def match_func(self, model, tree_iter, data=None): 134 | txt = self.e_search.get_text() 135 | value = model.get_value(tree_iter, 0) 136 | 137 | if (txt == "") or (txt.lower() in value.lower()): 138 | return True 139 | self.tree_formats.set_cursor(0) 140 | return False 141 | 142 | def on_choosed_format(self, tree, path, col): 143 | model = tree.get_model() 144 | self.selected_format = model[path][0] 145 | self.wind.btn_formats.set_label(self.selected_format) 146 | self.hide() 147 | self.wind.fill_options() 148 | 149 | 150 | -------------------------------------------------------------------------------- /modules/functions.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Curlew - Easy to use multimedia converter 4 | # 5 | # Copyright (C) 2012-2018 Fayssal Chamekh 6 | # 7 | # Released under terms on waqf public license. 8 | # 9 | # Curlew is free software; you can redistribute it and/or modify it 10 | # under the terms of the latest version waqf public license as published by 11 | # ojuba.org. 12 | # 13 | # Curlew is distributed in the hope that it will be useful, but WITHOUT 14 | # ANY WARRANTY; without even the implied warranty 15 | # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 | # 17 | # The latest version of the license can be found on: 18 | # http://waqf.ojuba.org/license 19 | 20 | 21 | import gi 22 | gi.require_version('Gtk', '3.0') 23 | 24 | from gi.repository import Gtk 25 | from subprocess import Popen, PIPE 26 | 27 | def show_message(parent, 28 | message, 29 | message_type, 30 | button_type=Gtk.ButtonsType.CLOSE): 31 | ''' Show custom message dialog''' 32 | mess_dlg = Gtk.MessageDialog(parent, 33 | Gtk.DialogFlags.MODAL, 34 | message_type, 35 | button_type) 36 | mess_dlg.set_markup(message) 37 | if not parent: 38 | mess_dlg.set_keep_above(True) 39 | resp = mess_dlg.run() 40 | mess_dlg.destroy() 41 | return resp 42 | 43 | def get_format_size(size): 44 | ''' formating file size ''' 45 | size_str = '' 46 | if 0 <= size <= 1024: 47 | size_str = '{:.2f}'.format(size) + _(' KB') 48 | elif 1024 <= size < 1024 * 1024: 49 | e_size = size / 1024.0 50 | size_str = '{:.2f}'.format(e_size) + _(' MB') 51 | elif size >= 1024 * 1024: 52 | e_size = size / 1048576.0 53 | size_str = '{:.2f}'.format(e_size) + _(' GB') 54 | return size_str 55 | 56 | 57 | def duration_to_time(duration): 58 | ''' Convert duration (sec) to time 0:00:00 ''' 59 | if duration < 0: duration = 0 60 | return '{:.0f}:{:02.0f}:{:02.0f}'.format( 61 | duration/3600, 62 | (duration%3600)/60, 63 | (duration%3600)%60 64 | ) 65 | 66 | def time_to_duration(time): 67 | ''' Convert time like 0:00:00.00 to duration (sec)''' 68 | times = time.split(':') 69 | return int(times[0])*3600 + int(times[1])*60 + float(times[2]) 70 | 71 | def get_available_codecs(encoder): 72 | proc = Popen('{} -encoders'.format(encoder), shell=True, 73 | stdout=PIPE, stderr=PIPE, universal_newlines=True, bufsize=-1) 74 | codecs = proc.stdout.read() 75 | return codecs 76 | 77 | def check_codec(encoder, codec): 78 | if codec in ['default', 'copy']: return True 79 | new_codec = ' {} '.format(codec) 80 | codecs = get_available_codecs(encoder) 81 | if new_codec in codecs: 82 | return True 83 | return False 84 | 85 | 86 | -------------------------------------------------------------------------------- /modules/infobars.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Curlew - Easy to use multimedia converter 4 | # 5 | # Copyright (C) 2012-2018 Fayssal Chamekh 6 | # 7 | # Released under terms on waqf public license. 8 | # 9 | # Curlew is free software; you can redistribute it and/or modify it 10 | # under the terms of the latest version waqf public license as published by 11 | # ojuba.org. 12 | # 13 | # Curlew is distributed in the hope that it will be useful, but WITHOUT 14 | # ANY WARRANTY; without even the implied warranty 15 | # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 | # 17 | # The latest version of the license can be found on: 18 | # http://waqf.ojuba.org/license 19 | 20 | import gi 21 | gi.require_version('Gtk', '3.0') 22 | 23 | from gi.repository import Gtk 24 | 25 | class InfoBar(Gtk.InfoBar): 26 | def __init__(self): 27 | Gtk.InfoBar.__init__(self, show_close_button=True) 28 | self.set_no_show_all(True) 29 | self.connect('response', self.on_response) 30 | 31 | self.lbl_bar = Gtk.Label() 32 | self.lbl_bar.set_use_markup(True) 33 | self.lbl_bar.show() 34 | self.get_content_area().add(self.lbl_bar) 35 | 36 | self.fix_infobar() 37 | 38 | # Workaround for infobar hiding bug. 39 | def fix_infobar(self): 40 | # Work around https://bugzilla.gnome.org/show_bug.cgi?id=710888 41 | def make_sure_revealer_does_nothing(widget): 42 | if not isinstance(widget, Gtk.Revealer): 43 | return 44 | widget.set_transition_type(Gtk.RevealerTransitionType.CROSSFADE) 45 | self.forall(make_sure_revealer_does_nothing) 46 | 47 | def show_message(self, msg, message_type=Gtk.MessageType.INFO): 48 | self.lbl_bar.set_label('{}'.format(msg)) 49 | self.set_message_type(message_type) 50 | self.show() 51 | 52 | def on_response(self, info_bar, response_id): 53 | self.hide() 54 | 55 | 56 | -------------------------------------------------------------------------------- /modules/languages.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Curlew - Easy to use multimedia converter 4 | # 5 | # Copyright (C) 2012-2018 Fayssal Chamekh 6 | # 7 | # Released under terms on waqf public license. 8 | # 9 | # Curlew is free software; you can redistribute it and/or modify it 10 | # under the terms of the latest version waqf public license as published by 11 | # ojuba.org. 12 | # 13 | # Curlew is distributed in the hope that it will be useful, but WITHOUT 14 | # ANY WARRANTY; without even the implied warranty 15 | # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 | # 17 | # The latest version of the license can be found on: 18 | # http://waqf.ojuba.org/license 19 | 20 | 21 | LANGUAGES = { 22 | 'العربية': 'ar', 23 | 'Português - Brazil': 'br', 24 | 'Český': 'cs', 25 | 'Deutsch': 'de', 26 | 'English': 'en', 27 | 'Español': 'es', 28 | 'Euskara': 'eu', 29 | 'Français': 'fr', 30 | 'Italiano': 'it', 31 | 'Nederlands': 'nl', 32 | 'Polski': 'pl', 33 | 'Русский': 'ru', 34 | 'Srpski': 'sr', 35 | 'Traditional Chinese: 正體中文': 'zh_TW' 36 | } 37 | -------------------------------------------------------------------------------- /modules/logdialog.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Curlew - Easy to use multimedia converter 4 | # 5 | # Copyright (C) 2012-2018 Fayssal Chamekh 6 | # 7 | # Released under terms on waqf public license. 8 | # 9 | # Curlew is free software; you can redistribute it and/or modify it 10 | # under the terms of the latest version waqf public license as published by 11 | # ojuba.org. 12 | # 13 | # Curlew is distributed in the hope that it will be useful, but WITHOUT 14 | # ANY WARRANTY; without even the implied warranty 15 | # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 | # 17 | # The latest version of the license can be found on: 18 | # http://waqf.ojuba.org/license 19 | 20 | 21 | import gi 22 | gi.require_version('Gtk', '3.0') 23 | 24 | from gi.repository import Gtk, Pango 25 | 26 | class LogDialog(Gtk.Dialog): 27 | def __init__(self, prnt, log_file): 28 | self._log_file = log_file 29 | Gtk.Dialog.__init__(self, parent=prnt, use_header_bar=True) 30 | self.set_size_request(600, 450) 31 | self.set_border_width(6) 32 | self.set_title(_('Conversion Error')) 33 | scroll = Gtk.ScrolledWindow() 34 | scroll.set_shadow_type(Gtk.ShadowType.IN) 35 | text_log = Gtk.TextView() 36 | text_log.set_wrap_mode(Gtk.WrapMode.WORD_CHAR) 37 | text_log.set_border_width(6) 38 | text_log.set_editable(False) 39 | text_log.set_cursor_visible(False) 40 | 41 | font_desc = Pango.FontDescription('Monospace') 42 | text_log.override_font(font_desc) 43 | 44 | text_buffer = Gtk.TextBuffer() 45 | text_log.set_buffer(text_buffer) 46 | 47 | scroll.add(text_log) 48 | self.vbox.set_spacing(4) 49 | self.vbox.pack_start(scroll, True, True, 0) 50 | 51 | button = self.add_button(_('_Close'), Gtk.ResponseType.CLOSE) 52 | self.set_default(button) 53 | 54 | with open(log_file, 'r') as log: 55 | text_buffer.set_text(log.read()) 56 | 57 | 58 | def show_dialog(self): 59 | self.show_all() 60 | self.run() 61 | self.destroy() 62 | 63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /modules/players.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Curlew - Easy to use multimedia converter 4 | # 5 | # Copyright (C) 2012-2018 Fayssal Chamekh 6 | # 7 | # Released under terms on waqf public license. 8 | # 9 | # Curlew is free software; you can redistribute it and/or modify it 10 | # under the terms of the latest version waqf public license as published by 11 | # ojuba.org. 12 | # 13 | # Curlew is distributed in the hope that it will be useful, but WITHOUT 14 | # ANY WARRANTY; without even the implied warranty 15 | # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 | # 17 | # The latest version of the license can be found on: 18 | # http://waqf.ojuba.org/license 19 | 20 | from shutil import which 21 | from modules.configs import set_s_config 22 | 23 | PLAYERS_LIST = [ 24 | 'mpv', 25 | 'avplay', 26 | 'ffplay', 27 | 'mplayer', 28 | 'smplayer', 29 | 'vlc', 30 | 'totem', 31 | 'kplayer', 32 | 'kmplayer', 33 | 'parole', 34 | 'xplayer' 35 | ] 36 | 37 | def choose_player(): 38 | for player in PLAYERS_LIST: 39 | if which(player): 40 | set_s_config('player', player) 41 | return player 42 | return None 43 | 44 | 45 | -------------------------------------------------------------------------------- /modules/tray.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Curlew - Easy to use multimedia converter 4 | # 5 | # Copyright (C) 2012-2018 Fayssal Chamekh 6 | # 7 | # Released under terms on waqf public license. 8 | # 9 | # Curlew is free software; you can redistribute it and/or modify it 10 | # under the terms of the latest version waqf public license as published by 11 | # ojuba.org. 12 | # 13 | # Curlew is distributed in the hope that it will be useful, but WITHOUT 14 | # ANY WARRANTY; without even the implied warranty 15 | # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 | # 17 | # The latest version of the license can be found on: 18 | # http://waqf.ojuba.org/license 19 | 20 | 21 | import gi 22 | gi.require_version('Gtk', '3.0') 23 | 24 | from gi.repository import Gtk 25 | 26 | class StatusIcon(Gtk.StatusIcon): 27 | def __init__(self, window): 28 | Gtk.StatusIcon.__init__(self) 29 | 30 | self._window = window 31 | 32 | self.set_from_icon_name('curlew') 33 | self.set_tooltip_text(_('Curlew')) 34 | 35 | #---- Build menu 36 | self.menu = Gtk.Menu() 37 | 38 | # Show main window 39 | self.show_item = Gtk.MenuItem(_('Hide')) 40 | self.show_item.connect("activate", self.show_hide) 41 | 42 | # Stop conversion 43 | stop_item = Gtk.MenuItem(_('Stop Conversion')) 44 | stop_item.connect("activate", self.stop) 45 | 46 | # Quit application 47 | quit_item = Gtk.MenuItem(_('Quit application')) 48 | quit_item.connect("activate", self.quit) 49 | 50 | # Append menu items and show all 51 | self.menu.append(self.show_item) 52 | self.menu.append(stop_item) 53 | self.menu.append(quit_item) 54 | 55 | # Make connection 56 | self.connect('popup-menu', self.on_popup_menu, stop_item) 57 | self.connect('activate', self.show_hide) 58 | 59 | self.set_visible(False) 60 | 61 | 62 | def on_popup_menu(self, icon, button, time, stop_item): 63 | 64 | # stop_item sensitivity 65 | stop_item.set_sensitive(self._window.is_converting) 66 | 67 | # show/hide 68 | if self._window.get_visible(): 69 | self.show_item.set_label(_('Hide')) 70 | else: 71 | self.show_item.set_label(_('Show')) 72 | 73 | self.menu.show_all() 74 | self.menu.popup(None, None, Gtk.StatusIcon.position_menu, 75 | icon, button, time) 76 | 77 | 78 | def show_hide(self, *agrs): 79 | if self._window.get_visible(): 80 | self._window.hide() 81 | else: 82 | self._window.present() 83 | 84 | def stop(self, stop_item): 85 | if self._window.on_btn_stop_clicked(): 86 | self._window.present() 87 | 88 | def quit(self, *args): 89 | self._window.quit_cb() 90 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /modules/waitdialog.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Curlew - Easy to use multimedia converter 4 | # 5 | # Copyright (C) 2012-2018 Fayssal Chamekh 6 | # 7 | # Released under terms on waqf public license. 8 | # 9 | # Curlew is free software; you can redistribute it and/or modify it 10 | # under the terms of the latest version waqf public license as published by 11 | # ojuba.org. 12 | # 13 | # Curlew is distributed in the hope that it will be useful, but WITHOUT 14 | # ANY WARRANTY; without even the implied warranty 15 | # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 | # 17 | # The latest version of the license can be found on: 18 | # http://waqf.ojuba.org/license 19 | 20 | import gi 21 | gi.require_version('Gtk', '3.0') 22 | 23 | from gi.repository import Gtk 24 | 25 | class WaitDialog(Gtk.Dialog): 26 | def __init__(self, parent): 27 | 28 | self.skip = False 29 | 30 | Gtk.Dialog.__init__(self, parent=parent) 31 | self.set_size_request(650, 50) 32 | self.set_border_width(8) 33 | self.set_resizable(False) 34 | self.set_title(_('Adding files...')) 35 | 36 | self.text_file = Gtk.Label() 37 | self.text_file.set_alignment(0, 0.5) 38 | self.text_file.set_max_width_chars(50) 39 | self.vbox.pack_start(self.text_file, False, False, 6) 40 | 41 | self.prog_bar = Gtk.ProgressBar() 42 | self.prog_bar.set_show_text(True) 43 | self.vbox.pack_start(self.prog_bar, False, False, 6) 44 | 45 | btn_skip = self.add_button(_('_Cancel'), Gtk.ResponseType.CANCEL) 46 | btn_skip.connect('clicked', self.__skip) 47 | 48 | self.show_all() 49 | self.connect('delete-event', self.__skip) 50 | 51 | 52 | def set_filename(self, filename): 53 | self.text_file.set_markup(_('File: ')+filename) 54 | 55 | def set_progress(self, value): 56 | self.prog_bar.set_fraction(value) 57 | self.prog_bar.set_text('{:.0f}%'.format(value*100)) 58 | 59 | def __skip(self, *args): 60 | self.skip = True 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /po/curlew.pot: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PACKAGE VERSION\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2017-07-24 11:03+0100\n" 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 13 | "Last-Translator: FULL NAME \n" 14 | "Language-Team: LANGUAGE \n" 15 | "Language: \n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=CHARSET\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | 20 | #: modules/customwidgets.py:52 21 | msgid "Top" 22 | msgstr "" 23 | 24 | #: modules/customwidgets.py:60 25 | msgid "Bottom" 26 | msgstr "" 27 | 28 | #: modules/customwidgets.py:68 29 | msgid "Left" 30 | msgstr "" 31 | 32 | #: modules/customwidgets.py:76 33 | msgid "Right" 34 | msgstr "" 35 | 36 | #: modules/customwidgets.py:179 37 | msgid "hr" 38 | msgstr "" 39 | 40 | #: modules/customwidgets.py:184 41 | msgid "min" 42 | msgstr "" 43 | 44 | #: modules/customwidgets.py:189 modules/curlew.py:814 45 | msgid "sec" 46 | msgstr "" 47 | 48 | #: modules/formats.py:60 49 | msgid "No format selected!" 50 | msgstr "" 51 | 52 | #: modules/formats.py:113 53 | msgid "Edit" 54 | msgstr "" 55 | 56 | #: modules/formats.py:121 modules/formats.py:123 57 | msgid "Choose" 58 | msgstr "" 59 | 60 | #: modules/logdialog.py:32 61 | msgid "Conversion Error" 62 | msgstr "" 63 | 64 | #: modules/logdialog.py:51 modules/errdialog.py:50 65 | msgid "_Close" 66 | msgstr "" 67 | 68 | #: modules/formateditor.py:38 69 | msgid "Are you sure you want to save settings?" 70 | msgstr "" 71 | 72 | #: modules/formateditor.py:110 73 | msgid "You can't restore a custom format to defaults." 74 | msgstr "" 75 | 76 | #: modules/formateditor.py:205 77 | msgid "Are you sure you want to remove this format?" 78 | msgstr "" 79 | 80 | #: modules/formateditor.py:244 81 | msgid "Edition" 82 | msgstr "" 83 | 84 | #: modules/formateditor.py:255 85 | msgid "" 86 | "WARNING: Please change these values with " 87 | "care!" 88 | msgstr "" 89 | 90 | #: modules/formateditor.py:259 91 | msgid "Audio:" 92 | msgstr "" 93 | 94 | #: modules/formateditor.py:267 modules/formateditor.py:286 95 | msgid "Default" 96 | msgstr "" 97 | 98 | #: modules/formateditor.py:270 99 | msgid "Audio Bitrates" 100 | msgstr "" 101 | 102 | #: modules/formateditor.py:272 103 | msgid "Audio Frequencies" 104 | msgstr "" 105 | 106 | #: modules/formateditor.py:274 modules/curlew.py:662 107 | msgid "Audio Channels" 108 | msgstr "" 109 | 110 | #: modules/formateditor.py:276 111 | msgid "Audio Codecs" 112 | msgstr "" 113 | 114 | #: modules/formateditor.py:279 115 | msgid "Video:" 116 | msgstr "" 117 | 118 | #: modules/formateditor.py:289 119 | msgid "Video Bitrates" 120 | msgstr "" 121 | 122 | #: modules/formateditor.py:291 modules/curlew.py:702 123 | msgid "Video FPS" 124 | msgstr "" 125 | 126 | #: modules/formateditor.py:293 127 | msgid "Video Sizes" 128 | msgstr "" 129 | 130 | #: modules/formateditor.py:295 131 | msgid "Video Codecs" 132 | msgstr "" 133 | 134 | #: modules/formateditor.py:297 135 | msgid "Aspect Ratios" 136 | msgstr "" 137 | 138 | #: modules/formateditor.py:299 139 | msgid "Other Options:" 140 | msgstr "" 141 | 142 | #: modules/formateditor.py:301 143 | msgid "Extra Options" 144 | msgstr "" 145 | 146 | #: modules/formateditor.py:314 147 | msgid "Save" 148 | msgstr "" 149 | 150 | #: modules/formateditor.py:320 modules/favdialog.py:68 modules/curlew.py:2626 151 | msgid "Remove" 152 | msgstr "" 153 | 154 | #: modules/formateditor.py:328 155 | msgid "Restore default" 156 | msgstr "" 157 | 158 | #: modules/tray.py:33 modules/curlew.py:223 modules/about.py:33 159 | msgid "Curlew" 160 | msgstr "" 161 | 162 | #: modules/tray.py:39 modules/tray.py:69 163 | msgid "Hide" 164 | msgstr "" 165 | 166 | #: modules/tray.py:43 167 | msgid "Stop Conversion" 168 | msgstr "" 169 | 170 | #: modules/tray.py:47 171 | msgid "Quit application" 172 | msgstr "" 173 | 174 | #: modules/tray.py:71 175 | msgid "Show" 176 | msgstr "" 177 | 178 | #: modules/favdialog.py:29 modules/curlew.py:599 179 | msgid "Favorite list" 180 | msgstr "" 181 | 182 | #: modules/favdialog.py:40 183 | msgid "Format" 184 | msgstr "" 185 | 186 | #: modules/favdialog.py:56 187 | msgid "Up" 188 | msgstr "" 189 | 190 | #: modules/favdialog.py:62 191 | msgid "Down" 192 | msgstr "" 193 | 194 | #: modules/functions.py:47 195 | msgid " KB" 196 | msgstr "" 197 | 198 | #: modules/functions.py:50 199 | msgid " MB" 200 | msgstr "" 201 | 202 | #: modules/functions.py:53 203 | msgid " GB" 204 | msgstr "" 205 | 206 | #: modules/curlew.py:115 207 | msgid "{} Codec not found!" 208 | msgstr "" 209 | 210 | #: modules/curlew.py:170 211 | msgid "You can't add more than 10 elements." 212 | msgstr "" 213 | 214 | #: modules/curlew.py:177 215 | msgid "\"{}\" is already exist in favorite list!" 216 | msgstr "" 217 | 218 | #: modules/curlew.py:195 219 | msgid "No Favorites List." 220 | msgstr "" 221 | 222 | #: modules/curlew.py:231 223 | msgid "About" 224 | msgstr "" 225 | 226 | #: modules/curlew.py:236 227 | msgid "Quit" 228 | msgstr "" 229 | 230 | #: modules/curlew.py:287 231 | msgid "Available Codecs" 232 | msgstr "" 233 | 234 | #: modules/curlew.py:315 235 | msgid "Add Files" 236 | msgstr "" 237 | 238 | #: modules/curlew.py:320 239 | msgid "Add Folders" 240 | msgstr "" 241 | 242 | #: modules/curlew.py:330 243 | msgid "Remove Files" 244 | msgstr "" 245 | 246 | #: modules/curlew.py:335 247 | msgid "Clear Files List" 248 | msgstr "" 249 | 250 | #: modules/curlew.py:341 251 | msgid "File Information" 252 | msgstr "" 253 | 254 | #: modules/curlew.py:352 255 | msgid "Advanced Options" 256 | msgstr "" 257 | 258 | #: modules/curlew.py:356 modules/curlew.py:2685 259 | msgid "Convert" 260 | msgstr "" 261 | 262 | #: modules/curlew.py:358 modules/curlew.py:2686 263 | msgid "Start Conversion" 264 | msgstr "" 265 | 266 | #: modules/curlew.py:365 267 | msgid "Select Action" 268 | msgstr "" 269 | 270 | #: modules/curlew.py:387 271 | msgid "Convert Files" 272 | msgstr "" 273 | 274 | #: modules/curlew.py:388 275 | msgid "Merge Files" 276 | msgstr "" 277 | 278 | #: modules/curlew.py:394 279 | msgid "Stop Process" 280 | msgstr "" 281 | 282 | #: modules/curlew.py:411 283 | msgid "" 284 | "Welcome to Curlew Multimedia Converter!" 285 | msgstr "" 286 | 287 | #: modules/curlew.py:419 288 | msgid "Click" 289 | msgstr "" 290 | 291 | #: modules/curlew.py:421 292 | msgid "to add files, or" 293 | msgstr "" 294 | 295 | #: modules/curlew.py:423 296 | msgid "to add files from folders," 297 | msgstr "" 298 | 299 | #: modules/curlew.py:432 300 | msgid "or you can drag files and drop them to here." 301 | msgstr "" 302 | 303 | #: modules/curlew.py:509 modules/curlew.py:976 304 | msgid "Show Sidebar" 305 | msgstr "" 306 | 307 | #: modules/curlew.py:532 308 | msgid "File" 309 | msgstr "" 310 | 311 | #: modules/curlew.py:539 312 | msgid "Size" 313 | msgstr "" 314 | 315 | #: modules/curlew.py:545 316 | msgid "Duration" 317 | msgstr "" 318 | 319 | #: modules/curlew.py:551 320 | msgid "Estimated size" 321 | msgstr "" 322 | 323 | #: modules/curlew.py:558 324 | msgid "Elapsed time" 325 | msgstr "" 326 | 327 | #: modules/curlew.py:565 328 | msgid "Remaining time" 329 | msgstr "" 330 | 331 | #: modules/curlew.py:571 332 | msgid "Progress" 333 | msgstr "" 334 | 335 | #: modules/curlew.py:583 336 | msgid "Choose a format" 337 | msgstr "" 338 | 339 | #: modules/curlew.py:594 340 | msgid "Add to Favorite" 341 | msgstr "" 342 | 343 | #: modules/curlew.py:615 344 | msgid "Edit Favorite List" 345 | msgstr "" 346 | 347 | #: modules/curlew.py:645 modules/curlew.py:838 348 | msgid "Audio" 349 | msgstr "" 350 | 351 | #: modules/curlew.py:660 352 | msgid "Audio Bitrate" 353 | msgstr "" 354 | 355 | #: modules/curlew.py:661 356 | msgid "Audio Frequency" 357 | msgstr "" 358 | 359 | #: modules/curlew.py:663 360 | msgid "Audio Codec" 361 | msgstr "" 362 | 363 | #: modules/curlew.py:666 364 | msgid "Volume (%)" 365 | msgstr "" 366 | 367 | #: modules/curlew.py:672 368 | msgid "Audio Quality" 369 | msgstr "" 370 | 371 | #: modules/curlew.py:684 modules/curlew.py:838 372 | msgid "Video" 373 | msgstr "" 374 | 375 | #: modules/curlew.py:701 376 | msgid "Video Bitrate" 377 | msgstr "" 378 | 379 | #: modules/curlew.py:703 380 | msgid "Video Size" 381 | msgstr "" 382 | 383 | #: modules/curlew.py:704 384 | msgid "Video Codec" 385 | msgstr "" 386 | 387 | #: modules/curlew.py:705 388 | msgid "Aspect Ratio" 389 | msgstr "" 390 | 391 | #: modules/curlew.py:711 392 | msgid "2-Pass" 393 | msgstr "" 394 | 395 | #: modules/curlew.py:715 396 | msgid "Video only" 397 | msgstr "" 398 | 399 | #: modules/curlew.py:720 400 | msgid "Fix bad index" 401 | msgstr "" 402 | 403 | #: modules/curlew.py:727 404 | msgid "Video Quality" 405 | msgstr "" 406 | 407 | #: modules/curlew.py:738 408 | msgid "Subtitle" 409 | msgstr "" 410 | 411 | #: modules/curlew.py:744 412 | msgid "Use Subtitle (ffmpeg only)" 413 | msgstr "" 414 | 415 | #: modules/curlew.py:760 416 | msgid "Subtitle: " 417 | msgstr "" 418 | 419 | #: modules/curlew.py:778 420 | msgid "Size: " 421 | msgstr "" 422 | 423 | #: modules/curlew.py:807 424 | msgid "Encoding: " 425 | msgstr "" 426 | 427 | #: modules/curlew.py:822 428 | msgid "Filters" 429 | msgstr "" 430 | 431 | #: modules/curlew.py:824 432 | msgid "Fade In / Fade Out" 433 | msgstr "" 434 | 435 | #: modules/curlew.py:829 436 | msgid "Duration (sec)" 437 | msgstr "" 438 | 439 | #: modules/curlew.py:833 440 | msgid "At the beginning" 441 | msgstr "" 442 | 443 | #: modules/curlew.py:833 444 | msgid "At the end" 445 | msgstr "" 446 | 447 | #: modules/curlew.py:833 modules/curlew.py:838 448 | msgid "Both" 449 | msgstr "" 450 | 451 | #: modules/curlew.py:834 452 | msgid "Position" 453 | msgstr "" 454 | 455 | #: modules/curlew.py:839 456 | msgid "Type" 457 | msgstr "" 458 | 459 | #: modules/curlew.py:843 460 | msgid "Crop / Pad" 461 | msgstr "" 462 | 463 | #: modules/curlew.py:846 464 | msgid "Crop" 465 | msgstr "" 466 | 467 | #: modules/curlew.py:850 468 | msgid "Pad" 469 | msgstr "" 470 | 471 | #: modules/curlew.py:855 472 | msgid "More" 473 | msgstr "" 474 | 475 | #: modules/curlew.py:858 476 | msgid "Split File" 477 | msgstr "" 478 | 479 | #: modules/curlew.py:868 480 | msgid "Begin time: " 481 | msgstr "" 482 | 483 | #: modules/curlew.py:871 484 | msgid "Duration: " 485 | msgstr "" 486 | 487 | #: modules/curlew.py:872 488 | msgid "To the end" 489 | msgstr "" 490 | 491 | #: modules/curlew.py:878 492 | msgid "Use Copy Mode" 493 | msgstr "" 494 | 495 | #: modules/curlew.py:879 496 | msgid "Keep the same codecs as the input file" 497 | msgstr "" 498 | 499 | #: modules/curlew.py:887 500 | msgid "Other opts:" 501 | msgstr "" 502 | 503 | #: modules/curlew.py:891 504 | msgid "Threads:" 505 | msgstr "" 506 | 507 | #: modules/curlew.py:904 508 | msgid "Converter:" 509 | msgstr "" 510 | 511 | #: modules/curlew.py:910 512 | msgid "Player:" 513 | msgstr "" 514 | 515 | #: modules/curlew.py:950 516 | msgid "Please select a player" 517 | msgstr "" 518 | 519 | #: modules/curlew.py:959 520 | msgid "Configs" 521 | msgstr "" 522 | 523 | #: modules/curlew.py:966 524 | msgid "Your language will appear after restart Curlew" 525 | msgstr "" 526 | 527 | #: modules/curlew.py:973 528 | msgid "Language:" 529 | msgstr "" 530 | 531 | #: modules/curlew.py:981 532 | msgid "Show tray icon" 533 | msgstr "" 534 | 535 | #: modules/curlew.py:986 536 | msgid "Show Statusbar" 537 | msgstr "" 538 | 539 | #: modules/curlew.py:994 540 | msgid "Shutdown computer after finish" 541 | msgstr "" 542 | 543 | #: modules/curlew.py:999 544 | msgid "Suspend computer after finish" 545 | msgstr "" 546 | 547 | #: modules/curlew.py:1004 548 | msgid "Play sound after finish" 549 | msgstr "" 550 | 551 | #: modules/curlew.py:1010 552 | msgid "Output" 553 | msgstr "" 554 | 555 | #: modules/curlew.py:1016 556 | msgid "Source Path" 557 | msgstr "" 558 | 559 | #: modules/curlew.py:1021 560 | msgid "Destination:" 561 | msgstr "" 562 | 563 | #: modules/curlew.py:1024 564 | msgid "This name is for merged file" 565 | msgstr "" 566 | 567 | #: modules/curlew.py:1025 568 | msgid "Output Filename:" 569 | msgstr "" 570 | 571 | #: modules/curlew.py:1030 572 | msgid "Overwrite it" 573 | msgstr "" 574 | 575 | #: modules/curlew.py:1031 576 | msgid "Choose another name" 577 | msgstr "" 578 | 579 | #: modules/curlew.py:1032 580 | msgid "Skip conversion" 581 | msgstr "" 582 | 583 | #: modules/curlew.py:1033 584 | msgid "File exist:" 585 | msgstr "" 586 | 587 | #: modules/curlew.py:1047 588 | msgid "Delete input file after conversion" 589 | msgstr "" 590 | 591 | #: modules/curlew.py:1052 592 | msgid "Rename input file after conversion" 593 | msgstr "" 594 | 595 | #: modules/curlew.py:1143 596 | msgid "Do you want to quit Curlew and abort process?" 597 | msgstr "" 598 | 599 | #: modules/curlew.py:1160 600 | msgid "Add file" 601 | msgstr "" 602 | 603 | #: modules/curlew.py:1162 modules/curlew.py:1252 modules/curlew.py:1283 604 | #: modules/curlew.py:2662 605 | msgid "_OK" 606 | msgstr "" 607 | 608 | #: modules/curlew.py:1164 modules/curlew.py:1254 modules/curlew.py:1284 609 | #: modules/curlew.py:1854 modules/curlew.py:2664 modules/waitdialog.py:45 610 | msgid "_Cancel" 611 | msgstr "" 612 | 613 | #: modules/curlew.py:1173 614 | msgid "All supported files" 615 | msgstr "" 616 | 617 | #: modules/curlew.py:1180 618 | msgid "Video files" 619 | msgstr "" 620 | 621 | #: modules/curlew.py:1186 622 | msgid "Audio files" 623 | msgstr "" 624 | 625 | #: modules/curlew.py:1192 modules/curlew.py:1867 626 | msgid "All files" 627 | msgstr "" 628 | 629 | #: modules/curlew.py:1236 modules/curlew.py:1965 630 | msgid "Ready!" 631 | msgstr "" 632 | 633 | #: modules/curlew.py:1250 634 | msgid "Add folder" 635 | msgstr "" 636 | 637 | #: modules/curlew.py:1281 638 | msgid "Choose destination" 639 | msgstr "" 640 | 641 | #: modules/curlew.py:1611 642 | msgid "Destination path is not valid." 643 | msgstr "" 644 | 645 | #: modules/curlew.py:1618 646 | msgid "Destination path is not accessible." 647 | msgstr "" 648 | 649 | #: modules/curlew.py:1634 650 | msgid "\"{}\" audio codec not found." 651 | msgstr "" 652 | 653 | #: modules/curlew.py:1638 654 | msgid "\"{}\" video codec not found." 655 | msgstr "" 656 | 657 | #: modules/curlew.py:1670 modules/curlew.py:1718 modules/curlew.py:2111 658 | msgid "Skipped!" 659 | msgstr "" 660 | 661 | #: modules/curlew.py:1683 662 | msgid "Not found!" 663 | msgstr "" 664 | 665 | #: modules/curlew.py:1760 666 | msgid "Encoder not found (ffmpeg/avconv)." 667 | msgstr "" 668 | 669 | #: modules/curlew.py:1789 670 | msgid "Do you want to stop conversion process?" 671 | msgstr "" 672 | 673 | #: modules/curlew.py:1850 674 | msgid "Select subtitle" 675 | msgstr "" 676 | 677 | #: modules/curlew.py:1853 678 | msgid "_Add" 679 | msgstr "" 680 | 681 | #: modules/curlew.py:1858 682 | msgid "Subtitle files" 683 | msgstr "" 684 | 685 | #: modules/curlew.py:1960 modules/curlew.py:2171 686 | msgid "Wait..." 687 | msgstr "" 688 | 689 | #: modules/curlew.py:2041 690 | msgid "Done!" 691 | msgstr "" 692 | 693 | #: modules/curlew.py:2059 694 | msgid "Failed!" 695 | msgstr "" 696 | 697 | #: modules/curlew.py:2406 698 | msgid "" 699 | "System will shutdown after {} sec." 701 | msgstr "" 702 | 703 | #: modules/curlew.py:2419 704 | msgid "" 705 | "System will suspend after {} sec." 707 | msgstr "" 708 | 709 | #: modules/curlew.py:2496 710 | msgid "" 711 | "Duration: {}\n" 712 | "Size: {}\n" 713 | "Extension: {}\n" 714 | msgstr "" 715 | 716 | #: modules/curlew.py:2540 717 | msgid "Please install \"mediainfo\" package." 718 | msgstr "" 719 | 720 | #: modules/curlew.py:2620 721 | msgid "Play" 722 | msgstr "" 723 | 724 | #: modules/curlew.py:2623 725 | msgid "_Preview" 726 | msgstr "" 727 | 728 | #: modules/curlew.py:2629 729 | msgid "Browse source" 730 | msgstr "" 731 | 732 | #: modules/curlew.py:2632 733 | msgid "Browse destination" 734 | msgstr "" 735 | 736 | #: modules/curlew.py:2660 737 | msgid "Choose Encoder" 738 | msgstr "" 739 | 740 | #: modules/curlew.py:2680 741 | msgid "Merge" 742 | msgstr "" 743 | 744 | #: modules/curlew.py:2681 745 | msgid "Start Merging" 746 | msgstr "" 747 | 748 | #: modules/curlew.py:2690 749 | msgid "Make GIF" 750 | msgstr "" 751 | 752 | #: modules/curlew.py:2691 753 | msgid "Make GIF file" 754 | msgstr "" 755 | 756 | #: modules/curlew.py:2739 757 | msgid "Merging files, please wait..." 758 | msgstr "" 759 | 760 | #: modules/curlew.py:2740 761 | msgid "Percent: 0 %" 762 | msgstr "" 763 | 764 | #: modules/curlew.py:2757 765 | msgid "Percent: {:.0f} %" 766 | msgstr "" 767 | 768 | #: modules/curlew.py:2769 769 | msgid "Merging operation completed successfully!" 770 | msgstr "" 771 | 772 | #: modules/curlew.py:2776 773 | msgid "Merge Error" 774 | msgstr "" 775 | 776 | #: modules/about.py:37 777 | msgid "About Curlew" 778 | msgstr "" 779 | 780 | #: modules/about.py:40 781 | msgid "Easy to use Multimedia Converter for Linux" 782 | msgstr "" 783 | 784 | #: modules/about.py:53 785 | msgid "translator-credits" 786 | msgstr "" 787 | 788 | #: modules/waitdialog.py:34 789 | msgid "Adding files..." 790 | msgstr "" 791 | 792 | #: modules/waitdialog.py:53 793 | msgid "File: " 794 | msgstr "" 795 | -------------------------------------------------------------------------------- /po/de.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: \n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2017-07-24 11:03+0100\n" 11 | "PO-Revision-Date: 2016-09-24 16:01+0200\n" 12 | "Last-Translator: Rainer Peichl \n" 13 | "Language-Team: \n" 14 | "Language: de_DE\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "X-Generator: Poedit 1.8.9\n" 19 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 20 | 21 | #: modules/customwidgets.py:52 22 | msgid "Top" 23 | msgstr "Oben" 24 | 25 | #: modules/customwidgets.py:60 26 | msgid "Bottom" 27 | msgstr "Unten" 28 | 29 | #: modules/customwidgets.py:68 30 | msgid "Left" 31 | msgstr "Links" 32 | 33 | #: modules/customwidgets.py:76 34 | msgid "Right" 35 | msgstr "Rechts" 36 | 37 | #: modules/customwidgets.py:179 38 | msgid "hr" 39 | msgstr "hr" 40 | 41 | #: modules/customwidgets.py:184 42 | msgid "min" 43 | msgstr "Min" 44 | 45 | #: modules/customwidgets.py:189 modules/curlew.py:814 46 | msgid "sec" 47 | msgstr "Sek" 48 | 49 | #: modules/formats.py:60 50 | msgid "No format selected!" 51 | msgstr "Kein Format gewählt!" 52 | 53 | #: modules/formats.py:113 54 | msgid "Edit" 55 | msgstr "Bearbeiten" 56 | 57 | #: modules/formats.py:121 modules/formats.py:123 58 | msgid "Choose" 59 | msgstr "Auswahl" 60 | 61 | #: modules/logdialog.py:32 62 | #, fuzzy 63 | msgid "Conversion Error" 64 | msgstr "Stoppe die Konvertierung" 65 | 66 | #: modules/logdialog.py:51 modules/errdialog.py:50 67 | msgid "_Close" 68 | msgstr "_Schließen" 69 | 70 | #: modules/formateditor.py:38 71 | msgid "Are you sure you want to save settings?" 72 | msgstr "Sind Sie sicher, dass Sie die Einstellungen speichern möchten?" 73 | 74 | #: modules/formateditor.py:110 75 | msgid "You can't restore a custom format to defaults." 76 | msgstr "" 77 | "Sie können ein benutzerdefiniertes Format auf die Standardwerte zurücksetzen." 78 | 79 | #: modules/formateditor.py:205 80 | msgid "Are you sure you want to remove this format?" 81 | msgstr "Sind Sie sicher, dass Sie dieses Format entfernen wollen?" 82 | 83 | #: modules/formateditor.py:244 84 | #, fuzzy 85 | msgid "Edition" 86 | msgstr "Bearbeiten" 87 | 88 | #: modules/formateditor.py:255 89 | msgid "" 90 | "WARNING: Please change these values with " 91 | "care!" 92 | msgstr "" 93 | 94 | #: modules/formateditor.py:259 95 | msgid "Audio:" 96 | msgstr "Audio:" 97 | 98 | #: modules/formateditor.py:267 modules/formateditor.py:286 99 | msgid "Default" 100 | msgstr "Standard" 101 | 102 | #: modules/formateditor.py:270 103 | msgid "Audio Bitrates" 104 | msgstr "Audio Bitrates" 105 | 106 | #: modules/formateditor.py:272 107 | msgid "Audio Frequencies" 108 | msgstr "Audio Frequenzen" 109 | 110 | #: modules/formateditor.py:274 modules/curlew.py:662 111 | msgid "Audio Channels" 112 | msgstr "Audi Kanäle" 113 | 114 | #: modules/formateditor.py:276 115 | msgid "Audio Codecs" 116 | msgstr "Audio Codecs" 117 | 118 | #: modules/formateditor.py:279 119 | msgid "Video:" 120 | msgstr "Video:" 121 | 122 | #: modules/formateditor.py:289 123 | msgid "Video Bitrates" 124 | msgstr "Video Bitrates" 125 | 126 | #: modules/formateditor.py:291 modules/curlew.py:702 127 | msgid "Video FPS" 128 | msgstr "Video FPS" 129 | 130 | #: modules/formateditor.py:293 131 | msgid "Video Sizes" 132 | msgstr "Video Größe" 133 | 134 | #: modules/formateditor.py:295 135 | msgid "Video Codecs" 136 | msgstr "Video Codecs" 137 | 138 | #: modules/formateditor.py:297 139 | msgid "Aspect Ratios" 140 | msgstr "Seitenverhältnis" 141 | 142 | #: modules/formateditor.py:299 143 | msgid "Other Options:" 144 | msgstr "Andere Optionen:" 145 | 146 | #: modules/formateditor.py:301 147 | msgid "Extra Options" 148 | msgstr "Extra Optionen" 149 | 150 | #: modules/formateditor.py:314 151 | msgid "Save" 152 | msgstr "Speichern" 153 | 154 | #: modules/formateditor.py:320 modules/favdialog.py:68 modules/curlew.py:2626 155 | msgid "Remove" 156 | msgstr "Entfernen" 157 | 158 | #: modules/formateditor.py:328 159 | msgid "Restore default" 160 | msgstr "Standard wiederherstellen" 161 | 162 | #: modules/tray.py:33 modules/curlew.py:223 modules/about.py:33 163 | msgid "Curlew" 164 | msgstr "Curlew" 165 | 166 | #: modules/tray.py:39 modules/tray.py:69 167 | msgid "Hide" 168 | msgstr "Verbergen" 169 | 170 | #: modules/tray.py:43 171 | msgid "Stop Conversion" 172 | msgstr "Stoppe die Konvertierung" 173 | 174 | #: modules/tray.py:47 175 | msgid "Quit application" 176 | msgstr "Anwendung beenden" 177 | 178 | #: modules/tray.py:71 179 | msgid "Show" 180 | msgstr "Anzeigen" 181 | 182 | #: modules/favdialog.py:29 modules/curlew.py:599 183 | msgid "Favorite list" 184 | msgstr "Favoritenliste" 185 | 186 | #: modules/favdialog.py:40 187 | msgid "Format" 188 | msgstr "Format" 189 | 190 | #: modules/favdialog.py:56 191 | msgid "Up" 192 | msgstr "Hoch" 193 | 194 | #: modules/favdialog.py:62 195 | msgid "Down" 196 | msgstr "Runter" 197 | 198 | #: modules/functions.py:47 199 | msgid " KB" 200 | msgstr " KB" 201 | 202 | #: modules/functions.py:50 203 | msgid " MB" 204 | msgstr " MB" 205 | 206 | #: modules/functions.py:53 207 | msgid " GB" 208 | msgstr " GB" 209 | 210 | #: modules/curlew.py:115 211 | msgid "{} Codec not found!" 212 | msgstr "{} Codec nicht gefunden!" 213 | 214 | #: modules/curlew.py:170 215 | msgid "You can't add more than 10 elements." 216 | msgstr "" 217 | 218 | #: modules/curlew.py:177 219 | msgid "\"{}\" is already exist in favorite list!" 220 | msgstr "" 221 | 222 | #: modules/curlew.py:195 223 | #, fuzzy 224 | msgid "No Favorites List." 225 | msgstr "Favoritenliste" 226 | 227 | #: modules/curlew.py:231 228 | msgid "About" 229 | msgstr "Über" 230 | 231 | #: modules/curlew.py:236 232 | msgid "Quit" 233 | msgstr "Verlassen" 234 | 235 | #: modules/curlew.py:287 236 | msgid "Available Codecs" 237 | msgstr "Verfügbare Codecs" 238 | 239 | #: modules/curlew.py:315 240 | msgid "Add Files" 241 | msgstr "Dateien hinzufügen" 242 | 243 | #: modules/curlew.py:320 244 | msgid "Add Folders" 245 | msgstr "Ordner hinzufügen" 246 | 247 | #: modules/curlew.py:330 248 | msgid "Remove Files" 249 | msgstr "Dateien entfernen" 250 | 251 | #: modules/curlew.py:335 252 | msgid "Clear Files List" 253 | msgstr "Löschen der Dateiliste" 254 | 255 | #: modules/curlew.py:341 256 | msgid "File Information" 257 | msgstr "Datei Informationen" 258 | 259 | #: modules/curlew.py:352 260 | msgid "Advanced Options" 261 | msgstr "Erweiterte Optionen" 262 | 263 | #: modules/curlew.py:356 modules/curlew.py:2685 264 | msgid "Convert" 265 | msgstr "Konvertieren" 266 | 267 | #: modules/curlew.py:358 modules/curlew.py:2686 268 | msgid "Start Conversion" 269 | msgstr "Konvertierung starten" 270 | 271 | #: modules/curlew.py:365 272 | #, fuzzy 273 | msgid "Select Action" 274 | msgstr "Untertitel wählen" 275 | 276 | #: modules/curlew.py:387 277 | #, fuzzy 278 | msgid "Convert Files" 279 | msgstr "Dateien entfernen" 280 | 281 | #: modules/curlew.py:388 282 | #, fuzzy 283 | msgid "Merge Files" 284 | msgstr "Dateien entfernen" 285 | 286 | #: modules/curlew.py:394 287 | msgid "Stop Process" 288 | msgstr "" 289 | 290 | #: modules/curlew.py:411 291 | msgid "" 292 | "Welcome to Curlew Multimedia Converter!" 293 | msgstr "" 294 | 295 | #: modules/curlew.py:419 296 | msgid "Click" 297 | msgstr "" 298 | 299 | #: modules/curlew.py:421 300 | msgid "to add files, or" 301 | msgstr "" 302 | 303 | #: modules/curlew.py:423 304 | msgid "to add files from folders," 305 | msgstr "" 306 | 307 | #: modules/curlew.py:432 308 | msgid "or you can drag files and drop them to here." 309 | msgstr "" 310 | 311 | #: modules/curlew.py:509 modules/curlew.py:976 312 | msgid "Show Sidebar" 313 | msgstr "Zeige die Seitenleiste" 314 | 315 | #: modules/curlew.py:532 316 | msgid "File" 317 | msgstr "Datei" 318 | 319 | #: modules/curlew.py:539 320 | msgid "Size" 321 | msgstr "Größe" 322 | 323 | #: modules/curlew.py:545 324 | msgid "Duration" 325 | msgstr "Dauer" 326 | 327 | #: modules/curlew.py:551 328 | msgid "Estimated size" 329 | msgstr "Geschätzte Größe" 330 | 331 | #: modules/curlew.py:558 332 | msgid "Elapsed time" 333 | msgstr "Verstrichene Zeit" 334 | 335 | #: modules/curlew.py:565 336 | msgid "Remaining time" 337 | msgstr "Verbleibende Zeit" 338 | 339 | #: modules/curlew.py:571 340 | msgid "Progress" 341 | msgstr "Fortschritt" 342 | 343 | #: modules/curlew.py:583 344 | msgid "Choose a format" 345 | msgstr "Wählen Sie ein Format" 346 | 347 | #: modules/curlew.py:594 348 | msgid "Add to Favorite" 349 | msgstr "Zu den Favoriten hinzufügen" 350 | 351 | #: modules/curlew.py:615 352 | #, fuzzy 353 | msgid "Edit Favorite List" 354 | msgstr "Favoritenliste" 355 | 356 | #: modules/curlew.py:645 modules/curlew.py:838 357 | msgid "Audio" 358 | msgstr "Audio" 359 | 360 | #: modules/curlew.py:660 361 | msgid "Audio Bitrate" 362 | msgstr "Audio Bitrate" 363 | 364 | #: modules/curlew.py:661 365 | msgid "Audio Frequency" 366 | msgstr "Audio Frequenz" 367 | 368 | #: modules/curlew.py:663 369 | msgid "Audio Codec" 370 | msgstr "Audio Codec" 371 | 372 | #: modules/curlew.py:666 373 | msgid "Volume (%)" 374 | msgstr "Volume (%)" 375 | 376 | #: modules/curlew.py:672 377 | msgid "Audio Quality" 378 | msgstr "Audio Qualität" 379 | 380 | #: modules/curlew.py:684 modules/curlew.py:838 381 | msgid "Video" 382 | msgstr "Video" 383 | 384 | #: modules/curlew.py:701 385 | msgid "Video Bitrate" 386 | msgstr "Video Bitrate" 387 | 388 | #: modules/curlew.py:703 389 | msgid "Video Size" 390 | msgstr "Video Größe" 391 | 392 | #: modules/curlew.py:704 393 | msgid "Video Codec" 394 | msgstr "Video Codec" 395 | 396 | #: modules/curlew.py:705 397 | msgid "Aspect Ratio" 398 | msgstr "Seitenverhältnis" 399 | 400 | #: modules/curlew.py:711 401 | msgid "2-Pass" 402 | msgstr "2-Pass" 403 | 404 | #: modules/curlew.py:715 405 | msgid "Video only" 406 | msgstr "Nur Video" 407 | 408 | #: modules/curlew.py:720 409 | msgid "Fix bad index" 410 | msgstr "" 411 | 412 | #: modules/curlew.py:727 413 | msgid "Video Quality" 414 | msgstr "Video Qualität" 415 | 416 | #: modules/curlew.py:738 417 | msgid "Subtitle" 418 | msgstr "Untertitel" 419 | 420 | #: modules/curlew.py:744 421 | msgid "Use Subtitle (ffmpeg only)" 422 | msgstr "Benutze Untertitel (ffmpeg only) " 423 | 424 | #: modules/curlew.py:760 425 | msgid "Subtitle: " 426 | msgstr "Untertitel:" 427 | 428 | #: modules/curlew.py:778 429 | msgid "Size: " 430 | msgstr "Größe:" 431 | 432 | #: modules/curlew.py:807 433 | msgid "Encoding: " 434 | msgstr "Encoding: " 435 | 436 | #: modules/curlew.py:822 437 | msgid "Filters" 438 | msgstr "" 439 | 440 | #: modules/curlew.py:824 441 | msgid "Fade In / Fade Out" 442 | msgstr "" 443 | 444 | #: modules/curlew.py:829 445 | #, fuzzy 446 | msgid "Duration (sec)" 447 | msgstr "Dauer:" 448 | 449 | #: modules/curlew.py:833 450 | msgid "At the beginning" 451 | msgstr "" 452 | 453 | #: modules/curlew.py:833 454 | #, fuzzy 455 | msgid "At the end" 456 | msgstr "Bis zum Ende" 457 | 458 | #: modules/curlew.py:833 modules/curlew.py:838 459 | msgid "Both" 460 | msgstr "" 461 | 462 | #: modules/curlew.py:834 463 | #, fuzzy 464 | msgid "Position" 465 | msgstr "Bearbeiten" 466 | 467 | #: modules/curlew.py:839 468 | msgid "Type" 469 | msgstr "" 470 | 471 | #: modules/curlew.py:843 472 | msgid "Crop / Pad" 473 | msgstr "Schnitt / Block" 474 | 475 | #: modules/curlew.py:846 476 | msgid "Crop" 477 | msgstr "Schnitt" 478 | 479 | #: modules/curlew.py:850 480 | msgid "Pad" 481 | msgstr "Block" 482 | 483 | #: modules/curlew.py:855 484 | msgid "More" 485 | msgstr "Mehr" 486 | 487 | #: modules/curlew.py:858 488 | msgid "Split File" 489 | msgstr "Datei splitten" 490 | 491 | #: modules/curlew.py:868 492 | msgid "Begin time: " 493 | msgstr "Startzeit:" 494 | 495 | #: modules/curlew.py:871 496 | msgid "Duration: " 497 | msgstr "Dauer:" 498 | 499 | #: modules/curlew.py:872 500 | msgid "To the end" 501 | msgstr "Bis zum Ende" 502 | 503 | #: modules/curlew.py:878 504 | msgid "Use Copy Mode" 505 | msgstr "Verwende den Kopiermodus " 506 | 507 | #: modules/curlew.py:879 508 | msgid "Keep the same codecs as the input file" 509 | msgstr "Die selben Codecs wie die Eingabedatei " 510 | 511 | #: modules/curlew.py:887 512 | msgid "Other opts:" 513 | msgstr "Andere Optionen:" 514 | 515 | #: modules/curlew.py:891 516 | msgid "Threads:" 517 | msgstr "Prozesse:" 518 | 519 | #: modules/curlew.py:904 520 | msgid "Converter:" 521 | msgstr "Konverter:" 522 | 523 | #: modules/curlew.py:910 524 | msgid "Player:" 525 | msgstr "Player:" 526 | 527 | #: modules/curlew.py:950 528 | msgid "Please select a player" 529 | msgstr "" 530 | 531 | #: modules/curlew.py:959 532 | msgid "Configs" 533 | msgstr "Konfigurationen" 534 | 535 | #: modules/curlew.py:966 536 | msgid "Your language will appear after restart Curlew" 537 | msgstr "Ihre Sprache erscheint nach dem Neustart der Anwendung" 538 | 539 | #: modules/curlew.py:973 540 | msgid "Language:" 541 | msgstr "Sprache:" 542 | 543 | #: modules/curlew.py:981 544 | msgid "Show tray icon" 545 | msgstr "Tray-Icon anzeigen" 546 | 547 | #: modules/curlew.py:986 548 | #, fuzzy 549 | msgid "Show Statusbar" 550 | msgstr "Zeige die Seitenleiste" 551 | 552 | #: modules/curlew.py:994 553 | msgid "Shutdown computer after finish" 554 | msgstr "Computer am Ende ausschalten" 555 | 556 | #: modules/curlew.py:999 557 | msgid "Suspend computer after finish" 558 | msgstr "Computer am Ende in Bereitschaft" 559 | 560 | #: modules/curlew.py:1004 561 | msgid "Play sound after finish" 562 | msgstr "Sound am Ende abspielen" 563 | 564 | #: modules/curlew.py:1010 565 | msgid "Output" 566 | msgstr "Ausgabe" 567 | 568 | #: modules/curlew.py:1016 569 | msgid "Source Path" 570 | msgstr "Quellpfad " 571 | 572 | #: modules/curlew.py:1021 573 | msgid "Destination:" 574 | msgstr "Ziel:" 575 | 576 | #: modules/curlew.py:1024 577 | msgid "This name is for merged file" 578 | msgstr "" 579 | 580 | #: modules/curlew.py:1025 581 | msgid "Output Filename:" 582 | msgstr "" 583 | 584 | #: modules/curlew.py:1030 585 | msgid "Overwrite it" 586 | msgstr "Überschreiben" 587 | 588 | #: modules/curlew.py:1031 589 | msgid "Choose another name" 590 | msgstr "Wählen Sie einen anderen Namen" 591 | 592 | #: modules/curlew.py:1032 593 | msgid "Skip conversion" 594 | msgstr "Überspringe Umwandlung" 595 | 596 | #: modules/curlew.py:1033 597 | msgid "File exist:" 598 | msgstr "Datei existiert:" 599 | 600 | #: modules/curlew.py:1047 601 | msgid "Delete input file after conversion" 602 | msgstr "Lösche die Ausgangsdatei nach der Konvertierung" 603 | 604 | #: modules/curlew.py:1052 605 | msgid "Rename input file after conversion" 606 | msgstr "Die Ausgangsdatei nach der Konvertierung umbenennen" 607 | 608 | #: modules/curlew.py:1143 609 | #, fuzzy 610 | msgid "Do you want to quit Curlew and abort process?" 611 | msgstr "Wollen Sie Curlew beenden und Umwandlungsprozess abbrechen?" 612 | 613 | #: modules/curlew.py:1160 614 | msgid "Add file" 615 | msgstr "Datei hinzufügen" 616 | 617 | #: modules/curlew.py:1162 modules/curlew.py:1252 modules/curlew.py:1283 618 | #: modules/curlew.py:2662 619 | msgid "_OK" 620 | msgstr "_OK" 621 | 622 | #: modules/curlew.py:1164 modules/curlew.py:1254 modules/curlew.py:1284 623 | #: modules/curlew.py:1854 modules/curlew.py:2664 modules/waitdialog.py:45 624 | msgid "_Cancel" 625 | msgstr "_Beenden" 626 | 627 | #: modules/curlew.py:1173 628 | msgid "All supported files" 629 | msgstr "Alle unterstützten Dateien" 630 | 631 | #: modules/curlew.py:1180 632 | msgid "Video files" 633 | msgstr "Video Dateien" 634 | 635 | #: modules/curlew.py:1186 636 | msgid "Audio files" 637 | msgstr "Audio Dateien" 638 | 639 | #: modules/curlew.py:1192 modules/curlew.py:1867 640 | msgid "All files" 641 | msgstr "Alle Dateien" 642 | 643 | #: modules/curlew.py:1236 modules/curlew.py:1965 644 | msgid "Ready!" 645 | msgstr "Fertig!" 646 | 647 | #: modules/curlew.py:1250 648 | msgid "Add folder" 649 | msgstr "Ordner hinzufügen" 650 | 651 | #: modules/curlew.py:1281 652 | msgid "Choose destination" 653 | msgstr "Ziel auswählen" 654 | 655 | #: modules/curlew.py:1611 656 | msgid "Destination path is not valid." 657 | msgstr "Zielpfad ist nicht gültig." 658 | 659 | #: modules/curlew.py:1618 660 | msgid "Destination path is not accessible." 661 | msgstr "Zielpfad ist nicht zugänglich." 662 | 663 | #: modules/curlew.py:1634 664 | msgid "\"{}\" audio codec not found." 665 | msgstr "" 666 | 667 | #: modules/curlew.py:1638 668 | msgid "\"{}\" video codec not found." 669 | msgstr "" 670 | 671 | #: modules/curlew.py:1670 modules/curlew.py:1718 modules/curlew.py:2111 672 | msgid "Skipped!" 673 | msgstr "Übersprungen!" 674 | 675 | #: modules/curlew.py:1683 676 | msgid "Not found!" 677 | msgstr "Nichts gefunden!" 678 | 679 | #: modules/curlew.py:1760 680 | msgid "Encoder not found (ffmpeg/avconv)." 681 | msgstr "" 682 | 683 | #: modules/curlew.py:1789 684 | msgid "Do you want to stop conversion process?" 685 | msgstr "Wollen Sie Umwandlungsprozess zu stoppen?" 686 | 687 | #: modules/curlew.py:1850 688 | msgid "Select subtitle" 689 | msgstr "Untertitel wählen" 690 | 691 | #: modules/curlew.py:1853 692 | msgid "_Add" 693 | msgstr "_Hinzufügen" 694 | 695 | #: modules/curlew.py:1858 696 | msgid "Subtitle files" 697 | msgstr "Untertitel Datei" 698 | 699 | #: modules/curlew.py:1960 modules/curlew.py:2171 700 | msgid "Wait..." 701 | msgstr "Warten..." 702 | 703 | #: modules/curlew.py:2041 704 | msgid "Done!" 705 | msgstr "Erledigt!" 706 | 707 | #: modules/curlew.py:2059 708 | msgid "Failed!" 709 | msgstr "Gescheitert!" 710 | 711 | #: modules/curlew.py:2406 712 | msgid "" 713 | "System will shutdown after {} sec." 715 | msgstr "" 716 | "Computer wird ausgeschaltet in {} " 717 | "Sek." 718 | 719 | #: modules/curlew.py:2419 720 | msgid "" 721 | "System will suspend after {} sec." 723 | msgstr "" 724 | "Computer geht in Bereitschaft in {} " 725 | "Sek." 726 | 727 | #: modules/curlew.py:2496 728 | msgid "" 729 | "Duration: {}\n" 730 | "Size: {}\n" 731 | "Extension: {}\n" 732 | msgstr "" 733 | "Dauer: {}\n" 734 | "Größe: {}\n" 735 | "Erweiterung: {}\n" 736 | 737 | #: modules/curlew.py:2540 738 | msgid "Please install \"mediainfo\" package." 739 | msgstr "Bitte installieren Sie das \"mediainfo\" Paket." 740 | 741 | #: modules/curlew.py:2620 742 | msgid "Play" 743 | msgstr "Abspielen" 744 | 745 | #: modules/curlew.py:2623 746 | msgid "_Preview" 747 | msgstr "_Vorschau" 748 | 749 | #: modules/curlew.py:2629 750 | msgid "Browse source" 751 | msgstr "Quelle durchsuchen" 752 | 753 | #: modules/curlew.py:2632 754 | msgid "Browse destination" 755 | msgstr "Ziel durchsuchen" 756 | 757 | #: modules/curlew.py:2660 758 | msgid "Choose Encoder" 759 | msgstr "Encoder auswählen" 760 | 761 | #: modules/curlew.py:2680 762 | msgid "Merge" 763 | msgstr "" 764 | 765 | #: modules/curlew.py:2681 766 | #, fuzzy 767 | msgid "Start Merging" 768 | msgstr "Konvertierung starten" 769 | 770 | #: modules/curlew.py:2690 771 | msgid "Make GIF" 772 | msgstr "" 773 | 774 | #: modules/curlew.py:2691 775 | msgid "Make GIF file" 776 | msgstr "" 777 | 778 | #: modules/curlew.py:2739 779 | msgid "Merging files, please wait..." 780 | msgstr "" 781 | 782 | #: modules/curlew.py:2740 783 | msgid "Percent: 0 %" 784 | msgstr "" 785 | 786 | #: modules/curlew.py:2757 787 | msgid "Percent: {:.0f} %" 788 | msgstr "" 789 | 790 | #: modules/curlew.py:2769 791 | msgid "Merging operation completed successfully!" 792 | msgstr "" 793 | 794 | #: modules/curlew.py:2776 795 | msgid "Merge Error" 796 | msgstr "" 797 | 798 | #: modules/about.py:37 799 | msgid "About Curlew" 800 | msgstr "Über Curlew" 801 | 802 | #: modules/about.py:40 803 | msgid "Easy to use Multimedia Converter for Linux" 804 | msgstr "Ein einfacher Multimedia-Konverter für Linux" 805 | 806 | #: modules/about.py:53 807 | msgid "translator-credits" 808 | msgstr "Rainer Peichl " 809 | 810 | #: modules/waitdialog.py:34 811 | msgid "Adding files..." 812 | msgstr "Datei hinzufügen.." 813 | 814 | #: modules/waitdialog.py:53 815 | msgid "File: " 816 | msgstr "Datei: " 817 | 818 | #~ msgid "Errors detail" 819 | #~ msgstr "Fehler Detail" 820 | 821 | #~ msgid "Use CSD" 822 | #~ msgstr "Benutze CSD" 823 | 824 | #~ msgid "" 825 | #~ "There are some errors occured.\n" 826 | #~ "Do you want to show more details?" 827 | #~ msgstr "" 828 | #~ "Es sind einige Fehler aufgetreten.\n" 829 | #~ "Möchten Sie weitere Details anzeigen?" 830 | 831 | #~ msgid "Edit List" 832 | #~ msgstr "Liste bearbeiten" 833 | -------------------------------------------------------------------------------- /po/en.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: 0.1\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2017-07-24 11:03+0100\n" 11 | "PO-Revision-Date: 2013-03-07 14:21-0000\n" 12 | "Last-Translator: Fayssal Chamekh \n" 13 | "Language-Team: English \n" 14 | "Language: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=utf-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "X-Poedit-Language: English\n" 19 | "X-Poedit-SourceCharset: utf-8\n" 20 | 21 | #: modules/customwidgets.py:52 22 | msgid "Top" 23 | msgstr "" 24 | 25 | #: modules/customwidgets.py:60 26 | msgid "Bottom" 27 | msgstr "" 28 | 29 | #: modules/customwidgets.py:68 30 | msgid "Left" 31 | msgstr "" 32 | 33 | #: modules/customwidgets.py:76 34 | msgid "Right" 35 | msgstr "" 36 | 37 | #: modules/customwidgets.py:179 38 | msgid "hr" 39 | msgstr "" 40 | 41 | #: modules/customwidgets.py:184 42 | msgid "min" 43 | msgstr "" 44 | 45 | #: modules/customwidgets.py:189 modules/curlew.py:814 46 | msgid "sec" 47 | msgstr "" 48 | 49 | #: modules/formats.py:60 50 | msgid "No format selected!" 51 | msgstr "" 52 | 53 | #: modules/formats.py:113 54 | msgid "Edit" 55 | msgstr "" 56 | 57 | #: modules/formats.py:121 modules/formats.py:123 58 | msgid "Choose" 59 | msgstr "" 60 | 61 | #: modules/logdialog.py:32 62 | msgid "Conversion Error" 63 | msgstr "" 64 | 65 | #: modules/logdialog.py:51 modules/errdialog.py:50 66 | msgid "_Close" 67 | msgstr "" 68 | 69 | #: modules/formateditor.py:38 70 | msgid "Are you sure you want to save settings?" 71 | msgstr "" 72 | 73 | #: modules/formateditor.py:110 74 | msgid "You can't restore a custom format to defaults." 75 | msgstr "" 76 | 77 | #: modules/formateditor.py:205 78 | msgid "Are you sure you want to remove this format?" 79 | msgstr "" 80 | 81 | #: modules/formateditor.py:244 82 | msgid "Edition" 83 | msgstr "" 84 | 85 | #: modules/formateditor.py:255 86 | msgid "" 87 | "WARNING: Please change these values with " 88 | "care!" 89 | msgstr "" 90 | 91 | #: modules/formateditor.py:259 92 | msgid "Audio:" 93 | msgstr "" 94 | 95 | #: modules/formateditor.py:267 modules/formateditor.py:286 96 | msgid "Default" 97 | msgstr "" 98 | 99 | #: modules/formateditor.py:270 100 | msgid "Audio Bitrates" 101 | msgstr "" 102 | 103 | #: modules/formateditor.py:272 104 | msgid "Audio Frequencies" 105 | msgstr "" 106 | 107 | #: modules/formateditor.py:274 modules/curlew.py:662 108 | msgid "Audio Channels" 109 | msgstr "" 110 | 111 | #: modules/formateditor.py:276 112 | msgid "Audio Codecs" 113 | msgstr "" 114 | 115 | #: modules/formateditor.py:279 116 | msgid "Video:" 117 | msgstr "" 118 | 119 | #: modules/formateditor.py:289 120 | msgid "Video Bitrates" 121 | msgstr "" 122 | 123 | #: modules/formateditor.py:291 modules/curlew.py:702 124 | msgid "Video FPS" 125 | msgstr "" 126 | 127 | #: modules/formateditor.py:293 128 | msgid "Video Sizes" 129 | msgstr "" 130 | 131 | #: modules/formateditor.py:295 132 | msgid "Video Codecs" 133 | msgstr "" 134 | 135 | #: modules/formateditor.py:297 136 | msgid "Aspect Ratios" 137 | msgstr "" 138 | 139 | #: modules/formateditor.py:299 140 | msgid "Other Options:" 141 | msgstr "" 142 | 143 | #: modules/formateditor.py:301 144 | msgid "Extra Options" 145 | msgstr "" 146 | 147 | #: modules/formateditor.py:314 148 | msgid "Save" 149 | msgstr "" 150 | 151 | #: modules/formateditor.py:320 modules/favdialog.py:68 modules/curlew.py:2626 152 | msgid "Remove" 153 | msgstr "" 154 | 155 | #: modules/formateditor.py:328 156 | msgid "Restore default" 157 | msgstr "" 158 | 159 | #: modules/tray.py:33 modules/curlew.py:223 modules/about.py:33 160 | msgid "Curlew" 161 | msgstr "" 162 | 163 | #: modules/tray.py:39 modules/tray.py:69 164 | msgid "Hide" 165 | msgstr "" 166 | 167 | #: modules/tray.py:43 168 | msgid "Stop Conversion" 169 | msgstr "" 170 | 171 | #: modules/tray.py:47 172 | msgid "Quit application" 173 | msgstr "" 174 | 175 | #: modules/tray.py:71 176 | msgid "Show" 177 | msgstr "" 178 | 179 | #: modules/favdialog.py:29 modules/curlew.py:599 180 | msgid "Favorite list" 181 | msgstr "" 182 | 183 | #: modules/favdialog.py:40 184 | msgid "Format" 185 | msgstr "" 186 | 187 | #: modules/favdialog.py:56 188 | msgid "Up" 189 | msgstr "" 190 | 191 | #: modules/favdialog.py:62 192 | msgid "Down" 193 | msgstr "" 194 | 195 | #: modules/functions.py:47 196 | msgid " KB" 197 | msgstr "" 198 | 199 | #: modules/functions.py:50 200 | msgid " MB" 201 | msgstr "" 202 | 203 | #: modules/functions.py:53 204 | msgid " GB" 205 | msgstr "" 206 | 207 | #: modules/curlew.py:115 208 | msgid "{} Codec not found!" 209 | msgstr "" 210 | 211 | #: modules/curlew.py:170 212 | msgid "You can't add more than 10 elements." 213 | msgstr "" 214 | 215 | #: modules/curlew.py:177 216 | msgid "\"{}\" is already exist in favorite list!" 217 | msgstr "" 218 | 219 | #: modules/curlew.py:195 220 | msgid "No Favorites List." 221 | msgstr "" 222 | 223 | #: modules/curlew.py:231 224 | msgid "About" 225 | msgstr "" 226 | 227 | #: modules/curlew.py:236 228 | msgid "Quit" 229 | msgstr "" 230 | 231 | #: modules/curlew.py:287 232 | msgid "Available Codecs" 233 | msgstr "" 234 | 235 | #: modules/curlew.py:315 236 | msgid "Add Files" 237 | msgstr "" 238 | 239 | #: modules/curlew.py:320 240 | msgid "Add Folders" 241 | msgstr "" 242 | 243 | #: modules/curlew.py:330 244 | msgid "Remove Files" 245 | msgstr "" 246 | 247 | #: modules/curlew.py:335 248 | msgid "Clear Files List" 249 | msgstr "" 250 | 251 | #: modules/curlew.py:341 252 | msgid "File Information" 253 | msgstr "" 254 | 255 | #: modules/curlew.py:352 256 | msgid "Advanced Options" 257 | msgstr "" 258 | 259 | #: modules/curlew.py:356 modules/curlew.py:2685 260 | msgid "Convert" 261 | msgstr "" 262 | 263 | #: modules/curlew.py:358 modules/curlew.py:2686 264 | msgid "Start Conversion" 265 | msgstr "" 266 | 267 | #: modules/curlew.py:365 268 | msgid "Select Action" 269 | msgstr "" 270 | 271 | #: modules/curlew.py:387 272 | msgid "Convert Files" 273 | msgstr "" 274 | 275 | #: modules/curlew.py:388 276 | msgid "Merge Files" 277 | msgstr "" 278 | 279 | #: modules/curlew.py:394 280 | msgid "Stop Process" 281 | msgstr "" 282 | 283 | #: modules/curlew.py:411 284 | msgid "" 285 | "Welcome to Curlew Multimedia Converter!" 286 | msgstr "" 287 | 288 | #: modules/curlew.py:419 289 | msgid "Click" 290 | msgstr "" 291 | 292 | #: modules/curlew.py:421 293 | msgid "to add files, or" 294 | msgstr "" 295 | 296 | #: modules/curlew.py:423 297 | msgid "to add files from folders," 298 | msgstr "" 299 | 300 | #: modules/curlew.py:432 301 | msgid "or you can drag files and drop them to here." 302 | msgstr "" 303 | 304 | #: modules/curlew.py:509 modules/curlew.py:976 305 | msgid "Show Sidebar" 306 | msgstr "" 307 | 308 | #: modules/curlew.py:532 309 | msgid "File" 310 | msgstr "" 311 | 312 | #: modules/curlew.py:539 313 | msgid "Size" 314 | msgstr "" 315 | 316 | #: modules/curlew.py:545 317 | msgid "Duration" 318 | msgstr "" 319 | 320 | #: modules/curlew.py:551 321 | msgid "Estimated size" 322 | msgstr "" 323 | 324 | #: modules/curlew.py:558 325 | msgid "Elapsed time" 326 | msgstr "" 327 | 328 | #: modules/curlew.py:565 329 | msgid "Remaining time" 330 | msgstr "" 331 | 332 | #: modules/curlew.py:571 333 | msgid "Progress" 334 | msgstr "" 335 | 336 | #: modules/curlew.py:583 337 | msgid "Choose a format" 338 | msgstr "" 339 | 340 | #: modules/curlew.py:594 341 | msgid "Add to Favorite" 342 | msgstr "" 343 | 344 | #: modules/curlew.py:615 345 | msgid "Edit Favorite List" 346 | msgstr "" 347 | 348 | #: modules/curlew.py:645 modules/curlew.py:838 349 | msgid "Audio" 350 | msgstr "" 351 | 352 | #: modules/curlew.py:660 353 | msgid "Audio Bitrate" 354 | msgstr "" 355 | 356 | #: modules/curlew.py:661 357 | msgid "Audio Frequency" 358 | msgstr "" 359 | 360 | #: modules/curlew.py:663 361 | msgid "Audio Codec" 362 | msgstr "" 363 | 364 | #: modules/curlew.py:666 365 | msgid "Volume (%)" 366 | msgstr "" 367 | 368 | #: modules/curlew.py:672 369 | msgid "Audio Quality" 370 | msgstr "" 371 | 372 | #: modules/curlew.py:684 modules/curlew.py:838 373 | msgid "Video" 374 | msgstr "" 375 | 376 | #: modules/curlew.py:701 377 | msgid "Video Bitrate" 378 | msgstr "" 379 | 380 | #: modules/curlew.py:703 381 | msgid "Video Size" 382 | msgstr "" 383 | 384 | #: modules/curlew.py:704 385 | msgid "Video Codec" 386 | msgstr "" 387 | 388 | #: modules/curlew.py:705 389 | msgid "Aspect Ratio" 390 | msgstr "" 391 | 392 | #: modules/curlew.py:711 393 | msgid "2-Pass" 394 | msgstr "" 395 | 396 | #: modules/curlew.py:715 397 | msgid "Video only" 398 | msgstr "" 399 | 400 | #: modules/curlew.py:720 401 | msgid "Fix bad index" 402 | msgstr "" 403 | 404 | #: modules/curlew.py:727 405 | msgid "Video Quality" 406 | msgstr "" 407 | 408 | #: modules/curlew.py:738 409 | msgid "Subtitle" 410 | msgstr "" 411 | 412 | #: modules/curlew.py:744 413 | msgid "Use Subtitle (ffmpeg only)" 414 | msgstr "" 415 | 416 | #: modules/curlew.py:760 417 | msgid "Subtitle: " 418 | msgstr "" 419 | 420 | #: modules/curlew.py:778 421 | msgid "Size: " 422 | msgstr "" 423 | 424 | #: modules/curlew.py:807 425 | msgid "Encoding: " 426 | msgstr "" 427 | 428 | #: modules/curlew.py:822 429 | msgid "Filters" 430 | msgstr "" 431 | 432 | #: modules/curlew.py:824 433 | msgid "Fade In / Fade Out" 434 | msgstr "" 435 | 436 | #: modules/curlew.py:829 437 | msgid "Duration (sec)" 438 | msgstr "" 439 | 440 | #: modules/curlew.py:833 441 | msgid "At the beginning" 442 | msgstr "" 443 | 444 | #: modules/curlew.py:833 445 | msgid "At the end" 446 | msgstr "" 447 | 448 | #: modules/curlew.py:833 modules/curlew.py:838 449 | msgid "Both" 450 | msgstr "" 451 | 452 | #: modules/curlew.py:834 453 | msgid "Position" 454 | msgstr "" 455 | 456 | #: modules/curlew.py:839 457 | msgid "Type" 458 | msgstr "" 459 | 460 | #: modules/curlew.py:843 461 | msgid "Crop / Pad" 462 | msgstr "" 463 | 464 | #: modules/curlew.py:846 465 | msgid "Crop" 466 | msgstr "" 467 | 468 | #: modules/curlew.py:850 469 | msgid "Pad" 470 | msgstr "" 471 | 472 | #: modules/curlew.py:855 473 | msgid "More" 474 | msgstr "" 475 | 476 | #: modules/curlew.py:858 477 | msgid "Split File" 478 | msgstr "" 479 | 480 | #: modules/curlew.py:868 481 | msgid "Begin time: " 482 | msgstr "" 483 | 484 | #: modules/curlew.py:871 485 | msgid "Duration: " 486 | msgstr "" 487 | 488 | #: modules/curlew.py:872 489 | msgid "To the end" 490 | msgstr "" 491 | 492 | #: modules/curlew.py:878 493 | msgid "Use Copy Mode" 494 | msgstr "" 495 | 496 | #: modules/curlew.py:879 497 | msgid "Keep the same codecs as the input file" 498 | msgstr "" 499 | 500 | #: modules/curlew.py:887 501 | msgid "Other opts:" 502 | msgstr "" 503 | 504 | #: modules/curlew.py:891 505 | msgid "Threads:" 506 | msgstr "" 507 | 508 | #: modules/curlew.py:904 509 | msgid "Converter:" 510 | msgstr "" 511 | 512 | #: modules/curlew.py:910 513 | msgid "Player:" 514 | msgstr "" 515 | 516 | #: modules/curlew.py:950 517 | msgid "Please select a player" 518 | msgstr "" 519 | 520 | #: modules/curlew.py:959 521 | msgid "Configs" 522 | msgstr "" 523 | 524 | #: modules/curlew.py:966 525 | msgid "Your language will appear after restart Curlew" 526 | msgstr "" 527 | 528 | #: modules/curlew.py:973 529 | msgid "Language:" 530 | msgstr "" 531 | 532 | #: modules/curlew.py:981 533 | msgid "Show tray icon" 534 | msgstr "" 535 | 536 | #: modules/curlew.py:986 537 | msgid "Show Statusbar" 538 | msgstr "" 539 | 540 | #: modules/curlew.py:994 541 | msgid "Shutdown computer after finish" 542 | msgstr "" 543 | 544 | #: modules/curlew.py:999 545 | msgid "Suspend computer after finish" 546 | msgstr "" 547 | 548 | #: modules/curlew.py:1004 549 | msgid "Play sound after finish" 550 | msgstr "" 551 | 552 | #: modules/curlew.py:1010 553 | msgid "Output" 554 | msgstr "" 555 | 556 | #: modules/curlew.py:1016 557 | msgid "Source Path" 558 | msgstr "" 559 | 560 | #: modules/curlew.py:1021 561 | msgid "Destination:" 562 | msgstr "" 563 | 564 | #: modules/curlew.py:1024 565 | msgid "This name is for merged file" 566 | msgstr "" 567 | 568 | #: modules/curlew.py:1025 569 | msgid "Output Filename:" 570 | msgstr "" 571 | 572 | #: modules/curlew.py:1030 573 | msgid "Overwrite it" 574 | msgstr "" 575 | 576 | #: modules/curlew.py:1031 577 | msgid "Choose another name" 578 | msgstr "" 579 | 580 | #: modules/curlew.py:1032 581 | msgid "Skip conversion" 582 | msgstr "" 583 | 584 | #: modules/curlew.py:1033 585 | msgid "File exist:" 586 | msgstr "" 587 | 588 | #: modules/curlew.py:1047 589 | msgid "Delete input file after conversion" 590 | msgstr "" 591 | 592 | #: modules/curlew.py:1052 593 | msgid "Rename input file after conversion" 594 | msgstr "" 595 | 596 | #: modules/curlew.py:1143 597 | msgid "Do you want to quit Curlew and abort process?" 598 | msgstr "" 599 | 600 | #: modules/curlew.py:1160 601 | msgid "Add file" 602 | msgstr "" 603 | 604 | #: modules/curlew.py:1162 modules/curlew.py:1252 modules/curlew.py:1283 605 | #: modules/curlew.py:2662 606 | msgid "_OK" 607 | msgstr "" 608 | 609 | #: modules/curlew.py:1164 modules/curlew.py:1254 modules/curlew.py:1284 610 | #: modules/curlew.py:1854 modules/curlew.py:2664 modules/waitdialog.py:45 611 | msgid "_Cancel" 612 | msgstr "" 613 | 614 | #: modules/curlew.py:1173 615 | msgid "All supported files" 616 | msgstr "" 617 | 618 | #: modules/curlew.py:1180 619 | msgid "Video files" 620 | msgstr "" 621 | 622 | #: modules/curlew.py:1186 623 | msgid "Audio files" 624 | msgstr "" 625 | 626 | #: modules/curlew.py:1192 modules/curlew.py:1867 627 | msgid "All files" 628 | msgstr "" 629 | 630 | #: modules/curlew.py:1236 modules/curlew.py:1965 631 | msgid "Ready!" 632 | msgstr "" 633 | 634 | #: modules/curlew.py:1250 635 | msgid "Add folder" 636 | msgstr "" 637 | 638 | #: modules/curlew.py:1281 639 | msgid "Choose destination" 640 | msgstr "" 641 | 642 | #: modules/curlew.py:1611 643 | msgid "Destination path is not valid." 644 | msgstr "" 645 | 646 | #: modules/curlew.py:1618 647 | msgid "Destination path is not accessible." 648 | msgstr "" 649 | 650 | #: modules/curlew.py:1634 651 | msgid "\"{}\" audio codec not found." 652 | msgstr "" 653 | 654 | #: modules/curlew.py:1638 655 | msgid "\"{}\" video codec not found." 656 | msgstr "" 657 | 658 | #: modules/curlew.py:1670 modules/curlew.py:1718 modules/curlew.py:2111 659 | msgid "Skipped!" 660 | msgstr "" 661 | 662 | #: modules/curlew.py:1683 663 | msgid "Not found!" 664 | msgstr "" 665 | 666 | #: modules/curlew.py:1760 667 | msgid "Encoder not found (ffmpeg/avconv)." 668 | msgstr "" 669 | 670 | #: modules/curlew.py:1789 671 | msgid "Do you want to stop conversion process?" 672 | msgstr "" 673 | 674 | #: modules/curlew.py:1850 675 | msgid "Select subtitle" 676 | msgstr "" 677 | 678 | #: modules/curlew.py:1853 679 | msgid "_Add" 680 | msgstr "" 681 | 682 | #: modules/curlew.py:1858 683 | msgid "Subtitle files" 684 | msgstr "" 685 | 686 | #: modules/curlew.py:1960 modules/curlew.py:2171 687 | msgid "Wait..." 688 | msgstr "" 689 | 690 | #: modules/curlew.py:2041 691 | msgid "Done!" 692 | msgstr "" 693 | 694 | #: modules/curlew.py:2059 695 | msgid "Failed!" 696 | msgstr "" 697 | 698 | #: modules/curlew.py:2406 699 | msgid "" 700 | "System will shutdown after {} sec." 702 | msgstr "" 703 | 704 | #: modules/curlew.py:2419 705 | msgid "" 706 | "System will suspend after {} sec." 708 | msgstr "" 709 | 710 | #: modules/curlew.py:2496 711 | msgid "" 712 | "Duration: {}\n" 713 | "Size: {}\n" 714 | "Extension: {}\n" 715 | msgstr "" 716 | 717 | #: modules/curlew.py:2540 718 | msgid "Please install \"mediainfo\" package." 719 | msgstr "" 720 | 721 | #: modules/curlew.py:2620 722 | msgid "Play" 723 | msgstr "" 724 | 725 | #: modules/curlew.py:2623 726 | msgid "_Preview" 727 | msgstr "" 728 | 729 | #: modules/curlew.py:2629 730 | msgid "Browse source" 731 | msgstr "" 732 | 733 | #: modules/curlew.py:2632 734 | msgid "Browse destination" 735 | msgstr "" 736 | 737 | #: modules/curlew.py:2660 738 | msgid "Choose Encoder" 739 | msgstr "" 740 | 741 | #: modules/curlew.py:2680 742 | msgid "Merge" 743 | msgstr "" 744 | 745 | #: modules/curlew.py:2681 746 | msgid "Start Merging" 747 | msgstr "" 748 | 749 | #: modules/curlew.py:2690 750 | msgid "Make GIF" 751 | msgstr "" 752 | 753 | #: modules/curlew.py:2691 754 | msgid "Make GIF file" 755 | msgstr "" 756 | 757 | #: modules/curlew.py:2739 758 | msgid "Merging files, please wait..." 759 | msgstr "" 760 | 761 | #: modules/curlew.py:2740 762 | msgid "Percent: 0 %" 763 | msgstr "" 764 | 765 | #: modules/curlew.py:2757 766 | msgid "Percent: {:.0f} %" 767 | msgstr "" 768 | 769 | #: modules/curlew.py:2769 770 | msgid "Merging operation completed successfully!" 771 | msgstr "" 772 | 773 | #: modules/curlew.py:2776 774 | msgid "Merge Error" 775 | msgstr "" 776 | 777 | #: modules/about.py:37 778 | msgid "About Curlew" 779 | msgstr "" 780 | 781 | #: modules/about.py:40 782 | msgid "Easy to use Multimedia Converter for Linux" 783 | msgstr "" 784 | 785 | #: modules/about.py:53 786 | msgid "translator-credits" 787 | msgstr "" 788 | 789 | #: modules/waitdialog.py:34 790 | msgid "Adding files..." 791 | msgstr "" 792 | 793 | #: modules/waitdialog.py:53 794 | msgid "File: " 795 | msgstr "" 796 | -------------------------------------------------------------------------------- /po/zh_TW.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: 0.1\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2017-07-24 11:03+0100\n" 11 | "PO-Revision-Date: 2013-09-26 12:58+0800\n" 12 | "Last-Translator: taijuin \n" 13 | "Language-Team: taijuin \n" 14 | "Language: zh_TW\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "X-Poedit-SourceCharset: UTF-8\n" 19 | "X-Generator: Poedit 1.5.4\n" 20 | 21 | #: modules/customwidgets.py:52 22 | msgid "Top" 23 | msgstr "頂端" 24 | 25 | #: modules/customwidgets.py:60 26 | msgid "Bottom" 27 | msgstr "底部" 28 | 29 | #: modules/customwidgets.py:68 30 | msgid "Left" 31 | msgstr "左" 32 | 33 | #: modules/customwidgets.py:76 34 | msgid "Right" 35 | msgstr "右" 36 | 37 | #: modules/customwidgets.py:179 38 | msgid "hr" 39 | msgstr "小時" 40 | 41 | #: modules/customwidgets.py:184 42 | msgid "min" 43 | msgstr "分鐘" 44 | 45 | #: modules/customwidgets.py:189 modules/curlew.py:814 46 | msgid "sec" 47 | msgstr "秒鐘" 48 | 49 | #: modules/formats.py:60 50 | msgid "No format selected!" 51 | msgstr "" 52 | 53 | #: modules/formats.py:113 54 | #, fuzzy 55 | msgid "Edit" 56 | msgstr "編輯清單" 57 | 58 | #: modules/formats.py:121 modules/formats.py:123 59 | #, fuzzy 60 | msgid "Choose" 61 | msgstr "選擇其他名稱" 62 | 63 | #: modules/logdialog.py:32 64 | #, fuzzy 65 | msgid "Conversion Error" 66 | msgstr "停止轉換" 67 | 68 | #: modules/logdialog.py:51 modules/errdialog.py:50 69 | msgid "_Close" 70 | msgstr "" 71 | 72 | #: modules/formateditor.py:38 73 | msgid "Are you sure you want to save settings?" 74 | msgstr "" 75 | 76 | #: modules/formateditor.py:110 77 | msgid "You can't restore a custom format to defaults." 78 | msgstr "" 79 | 80 | #: modules/formateditor.py:205 81 | msgid "Are you sure you want to remove this format?" 82 | msgstr "" 83 | 84 | #: modules/formateditor.py:244 85 | #, fuzzy 86 | msgid "Edition" 87 | msgstr "編輯清單" 88 | 89 | #: modules/formateditor.py:255 90 | msgid "" 91 | "WARNING: Please change these values with " 92 | "care!" 93 | msgstr "" 94 | 95 | #: modules/formateditor.py:259 96 | #, fuzzy 97 | msgid "Audio:" 98 | msgstr "音訊" 99 | 100 | #: modules/formateditor.py:267 modules/formateditor.py:286 101 | msgid "Default" 102 | msgstr "" 103 | 104 | #: modules/formateditor.py:270 105 | #, fuzzy 106 | msgid "Audio Bitrates" 107 | msgstr "音訊位元率" 108 | 109 | #: modules/formateditor.py:272 110 | #, fuzzy 111 | msgid "Audio Frequencies" 112 | msgstr "音訊頻率" 113 | 114 | #: modules/formateditor.py:274 modules/curlew.py:662 115 | msgid "Audio Channels" 116 | msgstr "音訊頻道" 117 | 118 | #: modules/formateditor.py:276 119 | #, fuzzy 120 | msgid "Audio Codecs" 121 | msgstr "音訊編解碼器" 122 | 123 | #: modules/formateditor.py:279 124 | #, fuzzy 125 | msgid "Video:" 126 | msgstr "影片" 127 | 128 | #: modules/formateditor.py:289 129 | #, fuzzy 130 | msgid "Video Bitrates" 131 | msgstr "影片位元率" 132 | 133 | #: modules/formateditor.py:291 modules/curlew.py:702 134 | msgid "Video FPS" 135 | msgstr "畫面更新率" 136 | 137 | #: modules/formateditor.py:293 138 | #, fuzzy 139 | msgid "Video Sizes" 140 | msgstr "影片大小" 141 | 142 | #: modules/formateditor.py:295 143 | #, fuzzy 144 | msgid "Video Codecs" 145 | msgstr "視訊編解碼器" 146 | 147 | #: modules/formateditor.py:297 148 | #, fuzzy 149 | msgid "Aspect Ratios" 150 | msgstr "長寬比" 151 | 152 | #: modules/formateditor.py:299 153 | #, fuzzy 154 | msgid "Other Options:" 155 | msgstr "其他選項:" 156 | 157 | #: modules/formateditor.py:301 158 | msgid "Extra Options" 159 | msgstr "" 160 | 161 | #: modules/formateditor.py:314 162 | msgid "Save" 163 | msgstr "" 164 | 165 | #: modules/formateditor.py:320 modules/favdialog.py:68 modules/curlew.py:2626 166 | msgid "Remove" 167 | msgstr "移除" 168 | 169 | #: modules/formateditor.py:328 170 | msgid "Restore default" 171 | msgstr "" 172 | 173 | #: modules/tray.py:33 modules/curlew.py:223 modules/about.py:33 174 | msgid "Curlew" 175 | msgstr "Curlew" 176 | 177 | #: modules/tray.py:39 modules/tray.py:69 178 | msgid "Hide" 179 | msgstr "隱藏" 180 | 181 | #: modules/tray.py:43 182 | msgid "Stop Conversion" 183 | msgstr "停止轉換" 184 | 185 | #: modules/tray.py:47 186 | msgid "Quit application" 187 | msgstr "結束應用程式" 188 | 189 | #: modules/tray.py:71 190 | msgid "Show" 191 | msgstr "顯示" 192 | 193 | #: modules/favdialog.py:29 modules/curlew.py:599 194 | msgid "Favorite list" 195 | msgstr "收藏清單" 196 | 197 | #: modules/favdialog.py:40 198 | msgid "Format" 199 | msgstr "格式" 200 | 201 | #: modules/favdialog.py:56 202 | msgid "Up" 203 | msgstr "" 204 | 205 | #: modules/favdialog.py:62 206 | msgid "Down" 207 | msgstr "" 208 | 209 | #: modules/functions.py:47 210 | msgid " KB" 211 | msgstr " KB" 212 | 213 | #: modules/functions.py:50 214 | msgid " MB" 215 | msgstr " MB" 216 | 217 | #: modules/functions.py:53 218 | msgid " GB" 219 | msgstr " GB" 220 | 221 | #: modules/curlew.py:115 222 | msgid "{} Codec not found!" 223 | msgstr "" 224 | 225 | #: modules/curlew.py:170 226 | msgid "You can't add more than 10 elements." 227 | msgstr "" 228 | 229 | #: modules/curlew.py:177 230 | msgid "\"{}\" is already exist in favorite list!" 231 | msgstr "" 232 | 233 | #: modules/curlew.py:195 234 | #, fuzzy 235 | msgid "No Favorites List." 236 | msgstr "收藏清單" 237 | 238 | #: modules/curlew.py:231 239 | msgid "About" 240 | msgstr "關於" 241 | 242 | #: modules/curlew.py:236 243 | msgid "Quit" 244 | msgstr "結束" 245 | 246 | #: modules/curlew.py:287 247 | msgid "Available Codecs" 248 | msgstr "" 249 | 250 | #: modules/curlew.py:315 251 | #, fuzzy 252 | msgid "Add Files" 253 | msgstr "加入檔案" 254 | 255 | #: modules/curlew.py:320 256 | #, fuzzy 257 | msgid "Add Folders" 258 | msgstr "加入檔案" 259 | 260 | #: modules/curlew.py:330 261 | #, fuzzy 262 | msgid "Remove Files" 263 | msgstr "移除檔案" 264 | 265 | #: modules/curlew.py:335 266 | #, fuzzy 267 | msgid "Clear Files List" 268 | msgstr "清空檔案清單" 269 | 270 | #: modules/curlew.py:341 271 | msgid "File Information" 272 | msgstr "" 273 | 274 | #: modules/curlew.py:352 275 | msgid "Advanced Options" 276 | msgstr "" 277 | 278 | #: modules/curlew.py:356 modules/curlew.py:2685 279 | msgid "Convert" 280 | msgstr "轉換" 281 | 282 | #: modules/curlew.py:358 modules/curlew.py:2686 283 | msgid "Start Conversion" 284 | msgstr "開始轉換" 285 | 286 | #: modules/curlew.py:365 287 | #, fuzzy 288 | msgid "Select Action" 289 | msgstr "選擇字幕" 290 | 291 | #: modules/curlew.py:387 292 | #, fuzzy 293 | msgid "Convert Files" 294 | msgstr "移除檔案" 295 | 296 | #: modules/curlew.py:388 297 | #, fuzzy 298 | msgid "Merge Files" 299 | msgstr "移除檔案" 300 | 301 | #: modules/curlew.py:394 302 | msgid "Stop Process" 303 | msgstr "" 304 | 305 | #: modules/curlew.py:411 306 | msgid "" 307 | "Welcome to Curlew Multimedia Converter!" 308 | msgstr "" 309 | 310 | #: modules/curlew.py:419 311 | msgid "Click" 312 | msgstr "" 313 | 314 | #: modules/curlew.py:421 315 | msgid "to add files, or" 316 | msgstr "" 317 | 318 | #: modules/curlew.py:423 319 | msgid "to add files from folders," 320 | msgstr "" 321 | 322 | #: modules/curlew.py:432 323 | msgid "or you can drag files and drop them to here." 324 | msgstr "" 325 | 326 | #: modules/curlew.py:509 modules/curlew.py:976 327 | #, fuzzy 328 | msgid "Show Sidebar" 329 | msgstr "顯示側邊欄" 330 | 331 | #: modules/curlew.py:532 332 | msgid "File" 333 | msgstr "檔案" 334 | 335 | #: modules/curlew.py:539 336 | msgid "Size" 337 | msgstr "大小" 338 | 339 | #: modules/curlew.py:545 340 | #, fuzzy 341 | msgid "Duration" 342 | msgstr "持續時間︰" 343 | 344 | #: modules/curlew.py:551 345 | msgid "Estimated size" 346 | msgstr "估計大小" 347 | 348 | #: modules/curlew.py:558 349 | msgid "Elapsed time" 350 | msgstr "已用時間" 351 | 352 | #: modules/curlew.py:565 353 | msgid "Remaining time" 354 | msgstr "剩餘時間" 355 | 356 | #: modules/curlew.py:571 357 | msgid "Progress" 358 | msgstr "進展" 359 | 360 | #: modules/curlew.py:583 361 | #, fuzzy 362 | msgid "Choose a format" 363 | msgstr "選擇其他名稱" 364 | 365 | #: modules/curlew.py:594 366 | #, fuzzy 367 | msgid "Add to Favorite" 368 | msgstr "加入收藏" 369 | 370 | #: modules/curlew.py:615 371 | #, fuzzy 372 | msgid "Edit Favorite List" 373 | msgstr "收藏清單" 374 | 375 | #: modules/curlew.py:645 modules/curlew.py:838 376 | msgid "Audio" 377 | msgstr "音訊" 378 | 379 | #: modules/curlew.py:660 380 | msgid "Audio Bitrate" 381 | msgstr "音訊位元率" 382 | 383 | #: modules/curlew.py:661 384 | msgid "Audio Frequency" 385 | msgstr "音訊頻率" 386 | 387 | #: modules/curlew.py:663 388 | msgid "Audio Codec" 389 | msgstr "音訊編解碼器" 390 | 391 | #: modules/curlew.py:666 392 | msgid "Volume (%)" 393 | msgstr "音量 (%)" 394 | 395 | #: modules/curlew.py:672 396 | msgid "Audio Quality" 397 | msgstr "音訊品質" 398 | 399 | #: modules/curlew.py:684 modules/curlew.py:838 400 | msgid "Video" 401 | msgstr "影片" 402 | 403 | #: modules/curlew.py:701 404 | msgid "Video Bitrate" 405 | msgstr "影片位元率" 406 | 407 | #: modules/curlew.py:703 408 | msgid "Video Size" 409 | msgstr "影片大小" 410 | 411 | #: modules/curlew.py:704 412 | msgid "Video Codec" 413 | msgstr "視訊編解碼器" 414 | 415 | #: modules/curlew.py:705 416 | msgid "Aspect Ratio" 417 | msgstr "長寬比" 418 | 419 | #: modules/curlew.py:711 420 | msgid "2-Pass" 421 | msgstr "2-Pass" 422 | 423 | #: modules/curlew.py:715 424 | msgid "Video only" 425 | msgstr "僅限視訊" 426 | 427 | #: modules/curlew.py:720 428 | msgid "Fix bad index" 429 | msgstr "" 430 | 431 | #: modules/curlew.py:727 432 | msgid "Video Quality" 433 | msgstr "影片品質" 434 | 435 | #: modules/curlew.py:738 436 | msgid "Subtitle" 437 | msgstr "字幕" 438 | 439 | #: modules/curlew.py:744 440 | #, fuzzy 441 | msgid "Use Subtitle (ffmpeg only)" 442 | msgstr "使用字幕" 443 | 444 | #: modules/curlew.py:760 445 | msgid "Subtitle: " 446 | msgstr "字幕:" 447 | 448 | #: modules/curlew.py:778 449 | msgid "Size: " 450 | msgstr "大小:" 451 | 452 | #: modules/curlew.py:807 453 | msgid "Encoding: " 454 | msgstr "編碼:" 455 | 456 | #: modules/curlew.py:822 457 | msgid "Filters" 458 | msgstr "" 459 | 460 | #: modules/curlew.py:824 461 | msgid "Fade In / Fade Out" 462 | msgstr "" 463 | 464 | #: modules/curlew.py:829 465 | #, fuzzy 466 | msgid "Duration (sec)" 467 | msgstr "持續時間︰" 468 | 469 | #: modules/curlew.py:833 470 | msgid "At the beginning" 471 | msgstr "" 472 | 473 | #: modules/curlew.py:833 474 | #, fuzzy 475 | msgid "At the end" 476 | msgstr "到末尾" 477 | 478 | #: modules/curlew.py:833 modules/curlew.py:838 479 | msgid "Both" 480 | msgstr "" 481 | 482 | #: modules/curlew.py:834 483 | #, fuzzy 484 | msgid "Position" 485 | msgstr "位置:" 486 | 487 | #: modules/curlew.py:839 488 | msgid "Type" 489 | msgstr "" 490 | 491 | #: modules/curlew.py:843 492 | msgid "Crop / Pad" 493 | msgstr "裁剪 / 填補" 494 | 495 | #: modules/curlew.py:846 496 | msgid "Crop" 497 | msgstr "裁剪" 498 | 499 | #: modules/curlew.py:850 500 | msgid "Pad" 501 | msgstr "填補" 502 | 503 | #: modules/curlew.py:855 504 | msgid "More" 505 | msgstr "更多" 506 | 507 | #: modules/curlew.py:858 508 | msgid "Split File" 509 | msgstr "分割檔案" 510 | 511 | #: modules/curlew.py:868 512 | msgid "Begin time: " 513 | msgstr "開始時間:" 514 | 515 | #: modules/curlew.py:871 516 | msgid "Duration: " 517 | msgstr "持續時間︰" 518 | 519 | #: modules/curlew.py:872 520 | msgid "To the end" 521 | msgstr "到末尾" 522 | 523 | #: modules/curlew.py:878 524 | msgid "Use Copy Mode" 525 | msgstr "使用複製模式" 526 | 527 | #: modules/curlew.py:879 528 | msgid "Keep the same codecs as the input file" 529 | msgstr "保持和輸入檔案相同的編解碼器" 530 | 531 | #: modules/curlew.py:887 532 | msgid "Other opts:" 533 | msgstr "其他選項:" 534 | 535 | #: modules/curlew.py:891 536 | msgid "Threads:" 537 | msgstr "" 538 | 539 | #: modules/curlew.py:904 540 | msgid "Converter:" 541 | msgstr "轉換器:" 542 | 543 | #: modules/curlew.py:910 544 | msgid "Player:" 545 | msgstr "" 546 | 547 | #: modules/curlew.py:950 548 | msgid "Please select a player" 549 | msgstr "" 550 | 551 | #: modules/curlew.py:959 552 | msgid "Configs" 553 | msgstr "設定" 554 | 555 | #: modules/curlew.py:966 556 | #, fuzzy 557 | msgid "Your language will appear after restart Curlew" 558 | msgstr "您的語言將在重新啟動 Curlew 後出現" 559 | 560 | #: modules/curlew.py:973 561 | msgid "Language:" 562 | msgstr "語言:" 563 | 564 | #: modules/curlew.py:981 565 | msgid "Show tray icon" 566 | msgstr "顯示系統匣圖示" 567 | 568 | #: modules/curlew.py:986 569 | #, fuzzy 570 | msgid "Show Statusbar" 571 | msgstr "顯示側邊欄" 572 | 573 | #: modules/curlew.py:994 574 | msgid "Shutdown computer after finish" 575 | msgstr "完成後關閉電腦" 576 | 577 | #: modules/curlew.py:999 578 | msgid "Suspend computer after finish" 579 | msgstr "完成後電腦待機" 580 | 581 | #: modules/curlew.py:1004 582 | #, fuzzy 583 | msgid "Play sound after finish" 584 | msgstr "完成後電腦待機" 585 | 586 | #: modules/curlew.py:1010 587 | msgid "Output" 588 | msgstr "" 589 | 590 | #: modules/curlew.py:1016 591 | msgid "Source Path" 592 | msgstr "同來源路徑" 593 | 594 | #: modules/curlew.py:1021 595 | #, fuzzy 596 | msgid "Destination:" 597 | msgstr "目的地:" 598 | 599 | #: modules/curlew.py:1024 600 | msgid "This name is for merged file" 601 | msgstr "" 602 | 603 | #: modules/curlew.py:1025 604 | msgid "Output Filename:" 605 | msgstr "" 606 | 607 | #: modules/curlew.py:1030 608 | msgid "Overwrite it" 609 | msgstr "覆蓋它" 610 | 611 | #: modules/curlew.py:1031 612 | msgid "Choose another name" 613 | msgstr "選擇其他名稱" 614 | 615 | #: modules/curlew.py:1032 616 | msgid "Skip conversion" 617 | msgstr "跳過轉換" 618 | 619 | #: modules/curlew.py:1033 620 | msgid "File exist:" 621 | msgstr "檔案存在:" 622 | 623 | #: modules/curlew.py:1047 624 | msgid "Delete input file after conversion" 625 | msgstr "轉換後刪除輸入檔" 626 | 627 | #: modules/curlew.py:1052 628 | #, fuzzy 629 | msgid "Rename input file after conversion" 630 | msgstr "轉換後刪除輸入檔" 631 | 632 | #: modules/curlew.py:1143 633 | #, fuzzy 634 | msgid "Do you want to quit Curlew and abort process?" 635 | msgstr "您想要結束 Curlew 和中止轉換過程嗎?" 636 | 637 | #: modules/curlew.py:1160 638 | msgid "Add file" 639 | msgstr "加入檔案" 640 | 641 | #: modules/curlew.py:1162 modules/curlew.py:1252 modules/curlew.py:1283 642 | #: modules/curlew.py:2662 643 | msgid "_OK" 644 | msgstr "" 645 | 646 | #: modules/curlew.py:1164 modules/curlew.py:1254 modules/curlew.py:1284 647 | #: modules/curlew.py:1854 modules/curlew.py:2664 modules/waitdialog.py:45 648 | msgid "_Cancel" 649 | msgstr "" 650 | 651 | #: modules/curlew.py:1173 652 | msgid "All supported files" 653 | msgstr "所有支援的檔案" 654 | 655 | #: modules/curlew.py:1180 656 | msgid "Video files" 657 | msgstr "影片檔" 658 | 659 | #: modules/curlew.py:1186 660 | msgid "Audio files" 661 | msgstr "音訊檔" 662 | 663 | #: modules/curlew.py:1192 modules/curlew.py:1867 664 | msgid "All files" 665 | msgstr "所有檔案" 666 | 667 | #: modules/curlew.py:1236 modules/curlew.py:1965 668 | msgid "Ready!" 669 | msgstr "準備好了!" 670 | 671 | #: modules/curlew.py:1250 672 | #, fuzzy 673 | msgid "Add folder" 674 | msgstr "加入檔案" 675 | 676 | #: modules/curlew.py:1281 677 | msgid "Choose destination" 678 | msgstr "選擇目的地" 679 | 680 | #: modules/curlew.py:1611 681 | msgid "Destination path is not valid." 682 | msgstr "目標路徑是無效的。" 683 | 684 | #: modules/curlew.py:1618 685 | msgid "Destination path is not accessible." 686 | msgstr "目標路徑不可存取的。" 687 | 688 | #: modules/curlew.py:1634 689 | msgid "\"{}\" audio codec not found." 690 | msgstr "" 691 | 692 | #: modules/curlew.py:1638 693 | msgid "\"{}\" video codec not found." 694 | msgstr "" 695 | 696 | #: modules/curlew.py:1670 modules/curlew.py:1718 modules/curlew.py:2111 697 | msgid "Skipped!" 698 | msgstr "跳過!" 699 | 700 | #: modules/curlew.py:1683 701 | msgid "Not found!" 702 | msgstr "沒有找到!" 703 | 704 | #: modules/curlew.py:1760 705 | msgid "Encoder not found (ffmpeg/avconv)." 706 | msgstr "" 707 | 708 | #: modules/curlew.py:1789 709 | msgid "Do you want to stop conversion process?" 710 | msgstr "您想要停止轉換過程?" 711 | 712 | #: modules/curlew.py:1850 713 | msgid "Select subtitle" 714 | msgstr "選擇字幕" 715 | 716 | #: modules/curlew.py:1853 717 | msgid "_Add" 718 | msgstr "" 719 | 720 | #: modules/curlew.py:1858 721 | msgid "Subtitle files" 722 | msgstr "字幕檔" 723 | 724 | #: modules/curlew.py:1960 modules/curlew.py:2171 725 | msgid "Wait..." 726 | msgstr "等待..." 727 | 728 | #: modules/curlew.py:2041 729 | msgid "Done!" 730 | msgstr "完成!" 731 | 732 | #: modules/curlew.py:2059 733 | msgid "Failed!" 734 | msgstr "失敗!" 735 | 736 | #: modules/curlew.py:2406 737 | msgid "" 738 | "System will shutdown after {} sec." 740 | msgstr "在 {} 秒後,系統關閉。" 741 | 742 | #: modules/curlew.py:2419 743 | msgid "" 744 | "System will suspend after {} sec." 746 | msgstr "" 747 | " 在 {} 秒後,系統將暫停。" 748 | 749 | #: modules/curlew.py:2496 750 | msgid "" 751 | "Duration: {}\n" 752 | "Size: {}\n" 753 | "Extension: {}\n" 754 | msgstr "" 755 | "持續時間︰ {}\n" 756 | "大小: {}\n" 757 | "擴展: {}\n" 758 | 759 | #: modules/curlew.py:2540 760 | msgid "Please install \"mediainfo\" package." 761 | msgstr "" 762 | 763 | #: modules/curlew.py:2620 764 | msgid "Play" 765 | msgstr "" 766 | 767 | #: modules/curlew.py:2623 768 | #, fuzzy 769 | msgid "_Preview" 770 | msgstr "預覽" 771 | 772 | #: modules/curlew.py:2629 773 | msgid "Browse source" 774 | msgstr "" 775 | 776 | #: modules/curlew.py:2632 777 | msgid "Browse destination" 778 | msgstr "瀏覽目的地" 779 | 780 | #: modules/curlew.py:2660 781 | #, fuzzy 782 | msgid "Choose Encoder" 783 | msgstr "選擇其他名稱" 784 | 785 | #: modules/curlew.py:2680 786 | msgid "Merge" 787 | msgstr "" 788 | 789 | #: modules/curlew.py:2681 790 | #, fuzzy 791 | msgid "Start Merging" 792 | msgstr "開始轉換" 793 | 794 | #: modules/curlew.py:2690 795 | msgid "Make GIF" 796 | msgstr "" 797 | 798 | #: modules/curlew.py:2691 799 | msgid "Make GIF file" 800 | msgstr "" 801 | 802 | #: modules/curlew.py:2739 803 | msgid "Merging files, please wait..." 804 | msgstr "" 805 | 806 | #: modules/curlew.py:2740 807 | msgid "Percent: 0 %" 808 | msgstr "" 809 | 810 | #: modules/curlew.py:2757 811 | msgid "Percent: {:.0f} %" 812 | msgstr "" 813 | 814 | #: modules/curlew.py:2769 815 | msgid "Merging operation completed successfully!" 816 | msgstr "" 817 | 818 | #: modules/curlew.py:2776 819 | msgid "Merge Error" 820 | msgstr "" 821 | 822 | #: modules/about.py:37 823 | msgid "About Curlew" 824 | msgstr "關於 Curlew" 825 | 826 | #: modules/about.py:40 827 | msgid "Easy to use Multimedia Converter for Linux" 828 | msgstr "適用於Linux,且易於使用之多媒體轉換器" 829 | 830 | #: modules/about.py:53 831 | msgid "translator-credits" 832 | msgstr "翻譯者榮譽榜" 833 | 834 | #: modules/waitdialog.py:34 835 | #, fuzzy 836 | msgid "Adding files..." 837 | msgstr "加入檔案" 838 | 839 | #: modules/waitdialog.py:53 840 | #, fuzzy 841 | msgid "File: " 842 | msgstr "格式:" 843 | 844 | #~ msgid "Errors detail" 845 | #~ msgstr "錯誤細節" 846 | 847 | #~ msgid "" 848 | #~ "There are some errors occured.\n" 849 | #~ "Do you want to show more details?" 850 | #~ msgstr "" 851 | #~ "有一些錯誤發生。\n" 852 | #~ "您想要顯示更多的細節嗎?" 853 | 854 | #, fuzzy 855 | #~ msgid "Edit List" 856 | #~ msgstr "編輯清單" 857 | 858 | #~ msgid "Preview" 859 | #~ msgstr "預覽" 860 | 861 | #, fuzzy 862 | #~ msgid "Convert to:" 863 | #~ msgstr "格式:" 864 | 865 | #~ msgid "Font: " 866 | #~ msgstr "字型:" 867 | 868 | #~ msgid "Delay: " 869 | #~ msgstr "延遲:" 870 | 871 | #~ msgid "Harddup" 872 | #~ msgstr "Harddup" 873 | 874 | #~ msgid "Use SSA/ASS subtitle" 875 | #~ msgstr "使用 SSA/ASS 字幕" 876 | 877 | #~ msgid "Source Quality" 878 | #~ msgstr "來源品質" 879 | 880 | #~ msgid "Use the same quality as source file" 881 | #~ msgstr "使用和來源檔案相同的品質" 882 | 883 | #~ msgid "Show sidebar" 884 | #~ msgstr "顯示側邊欄" 885 | 886 | #, fuzzy 887 | #~ msgid "Multimedia Converter" 888 | #~ msgstr "適用於Linux,且易於使用之多媒體轉換器" 889 | 890 | #~ msgid "Preview before converting" 891 | #~ msgstr "轉換前預覽" 892 | 893 | #~ msgid "Advanced" 894 | #~ msgstr "進階的設定" 895 | 896 | #~ msgid "Add" 897 | #~ msgstr "加入" 898 | 899 | #~ msgid "Add files" 900 | #~ msgstr "加入檔案" 901 | 902 | #, fuzzy 903 | #~ msgid "Add folders" 904 | #~ msgstr "加入檔案" 905 | 906 | #~ msgid "Clear" 907 | #~ msgstr "清空" 908 | 909 | #~ msgid "Stop" 910 | #~ msgstr "停止" 911 | 912 | #~ msgid "Show toolbar's buttons text" 913 | #~ msgstr "顯示工具列的按鈕文字" 914 | 915 | #~ msgid "Icons:" 916 | #~ msgstr "圖示:" 917 | 918 | #~ msgid "" 919 | #~ "Format:\t{}\n" 920 | #~ "Extension:\t{}\n" 921 | #~ "Encoder:\t{}" 922 | #~ msgstr "" 923 | #~ "格式:\t{}\n" 924 | #~ "擴展:\t{}\n" 925 | #~ "編碼器:\t{}" 926 | 927 | #, fuzzy 928 | #~ msgid "About data" 929 | #~ msgstr "關於" 930 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from distutils.core import setup 2 | from glob import glob 3 | from subprocess import call 4 | import sys 5 | from os.path import splitext, split 6 | 7 | # IMPORTANT! 8 | # You MUST have this packages installed in your system: 9 | # "librsvg2-bin" to use rsvg-convert command. 10 | # "intltool-debian" or "intltool" to use intltool-update command. 11 | 12 | VERSION = '0.2.5' 13 | SVG_CONVERT = 'rsvg-convert' 14 | UPDATE = 'intltool-update' 15 | UPDATE_DEBIAN = '/usr/share/intltool-debian/intltool-update' 16 | 17 | doc_files = ['LICENSE-ar.txt', 'LICENSE-en.txt', 'AUTHORS', 'THANKS', 'changelog', 'README'] 18 | data_files = [('share/applications/', ['curlew.desktop']), 19 | ('share/icons/hicolor/scalable/apps', ['curlew.svg']), 20 | ('share/pixmaps', ['curlew.svg']), 21 | ('share/doc/curlew', doc_files), 22 | ('share/curlew', ['formats.cfg', 'done.ogg']), 23 | #('share/curlew', ['formats.cfg', 'ffmpeg']), # Portable version 24 | ('share/curlew/modules', glob("modules/*.py")) 25 | ] 26 | 27 | # Prepare curlew icons 28 | def generate_icons(): 29 | # Generate curlew.png icons 30 | for i in [16, 22, 24, 32, 36, 48, 64, 72, 96, 128]: 31 | call("mkdir -p hicolor/{0}x{0}/apps/".format(i), shell=True) 32 | if call("{0} curlew.svg -w {1} -h {1} -o hicolor/{1}x{1}/apps/curlew.png".format(SVG_CONVERT, i), shell=True) > 0: 33 | return 1 34 | 35 | icons = map(lambda i: ('share/icons/'+i, [i+'/curlew.png', ]), glob("hicolor/*/apps")) 36 | data_files.extend(icons) 37 | return 0 38 | 39 | 40 | # Update locales 41 | def update_locale(): 42 | # Make curlew.pot file from python source files. 43 | py_files = " ".join(glob("modules/*.py")) 44 | call("xgettext --keyword=_ -o po/curlew.pot {}".format(py_files), shell=True) 45 | 46 | po_files = glob("po/*.po") 47 | for po_file in po_files: 48 | lang = splitext(split(po_file)[1])[0] 49 | mo_path = "locale/{}/LC_MESSAGES/curlew.mo".format(lang) 50 | 51 | # Update po files 52 | if call("{} -x -g po/curlew -d po/{}".format(UPDATE, lang), shell=True) > 0: 53 | return 1 54 | 55 | # Make locale directories 56 | call("mkdir -p locale/{}/LC_MESSAGES/".format(lang), shell=True) 57 | 58 | # Generate mo files 59 | call("msgfmt {} -o {}".format(po_file, mo_path), shell=True) 60 | 61 | locales = map(lambda i: ('share/curlew/'+i, [i+'/curlew.mo', ]), glob('locale/*/LC_MESSAGES')) 62 | data_files.extend(locales) 63 | 64 | return 0 65 | 66 | 67 | def clean_all(): 68 | print("Clean...") 69 | 70 | call("rm -rfv hicolor dist locale build", shell=True) 71 | call("rm -rfv dist locale build", shell=True) 72 | call("rm -fv MANIFEST po/*.mo", shell=True) 73 | call("rm -fv modules/icons/*/*.png", shell=True) 74 | call("rm -fv modules/*.pyc *.pyc", shell=True) 75 | call("rm -rfv modules/__pycache__", shell=True) 76 | exit(0) 77 | 78 | 79 | 80 | def uninstall_all(): 81 | print("Uninstall...") 82 | 83 | # Remove icons 84 | call("rm -rfv /usr/share/icons/hicolor/*/apps/curlew*", shell=True) 85 | call("rm -rfv /usr/*/share/icons/hicolor/*/apps/curlew*", shell=True) 86 | call("rm -rfv /usr/share/pixmaps/curlew*", shell=True) 87 | call("rm -rfv /usr/*/share/pixmaps/curlew*", shell=True) 88 | 89 | # Remove packages 90 | call("rm -rfv /usr/lib/python*/*-packages/[cC]urlew*", shell=True) 91 | call("rm -rfv /usr/*/lib/python*/*-packages/[cC]urlew*", shell=True) 92 | 93 | # Remove Docs 94 | call("rm -rfv /usr/share/doc/curlew", shell=True) 95 | call("rm -rfv /usr/*/share/doc/curlew", shell=True) 96 | 97 | # Remove .desktop file 98 | call("rm -rfv /usr/share/applications/curlew*", shell=True) 99 | call("rm -rfv /usr/*/share/applications/curlew*", shell=True) 100 | 101 | # Remove data files 102 | call("rm -rfv /usr/share/curlew", shell=True) 103 | call("rm -rfv /usr/*/share/curlew", shell=True) 104 | 105 | # Remove script 106 | call("rm -rfv /usr/bin/curlew", shell=True) 107 | call("rm -rfv /usr/*/bin/curlew", shell=True) 108 | 109 | # Remove configurations 110 | call("rm -rfv ~/.curlew/curlew.cfg", shell=True) 111 | call("rm -rfv ~/.curlew/fav.list", shell=True) 112 | 113 | exit(0) 114 | 115 | 116 | # Begin 117 | if len(sys.argv) < 2: exit(1) 118 | 119 | # Check intltool 120 | if call('which /usr/share/intltool-debian/intltool-update > /dev/null', shell=True) == 0: 121 | UPDATE = UPDATE_DEBIAN 122 | 123 | if sys.argv[1] in ['bdist', 'bdist_rpm', 'build', 'install']: 124 | if (generate_icons() > 0 ) or (update_locale() > 0): 125 | exit(1) 126 | elif sys.argv[1] == 'clean': clean_all() 127 | elif sys.argv[1] == 'uninstall': uninstall_all() 128 | 129 | 130 | setup( 131 | name="curlew", 132 | description='Easy to use multimedia converter in Linux', 133 | long_description='''Curlew written in python and GTK3 and it depends on (ffmpeg/avconv). 134 | 135 | Main Features: 136 | - Easy to use and clean user interface. 137 | - Hide the advanced options with the ability to show them. 138 | - Convert to more than 100 different formats. 139 | - Allow to edit formats. 140 | - Shutdown or suspend PC after a conversion process. 141 | - Show file information (duration, remaining time, estimated size, progress value). 142 | - Show file details using mediainfo. 143 | - Allow to skip or remove file during conversion process. 144 | - Preview file before conversion. 145 | - Show video thumbnail. 146 | - Convert a specified portion of file. 147 | - Combine subtitle with video. 148 | - Allow to crop and pad video. 149 | - Show error details if exist. 150 | - And more ...''', 151 | version=VERSION, 152 | author='Fayssal Chamekh', 153 | author_email='chamfay@gmail.com', 154 | url='https://curlew.sourceforge.io', 155 | license='Waqf License', 156 | platforms='Linux', 157 | scripts=['curlew'], 158 | keywords=['convert', 'audio', 'video', 'ffmpeg', 'avconv'], 159 | classifiers=[ 160 | 'Programming Language :: Python :: 3', 161 | 'Operating System :: POSIX :: Linux', 162 | 'Development Status :: 5 - Production/Stable', 163 | 'Environment :: X11 Applications :: GTK', 164 | 'Natural Language :: English', 165 | 'Natural Language :: Arabic', 166 | 'Natural Language :: French', 167 | 'Intended Audience :: End Users/Desktop', 168 | 'Topic :: Desktop Environment :: Gnome', 169 | 'Topic :: Multimedia :: Sound/Audio :: Conversion', 170 | 'Topic :: Utilities'], 171 | data_files=data_files 172 | ) 173 | -------------------------------------------------------------------------------- /uninstall.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ $UID -eq 0 ]; then 4 | python3 setup.py uninstall 5 | else 6 | echo "Run me as root!" 7 | fi 8 | 9 | --------------------------------------------------------------------------------