feat(data): add new subtitle files for episodes 1, 2, and 3 to enhance user experience and accessibility

feat(subtitles): add support for loading and displaying subtitles in the application
feat(video): implement video capture and frame navigation functionality
feat(ui): create main window UI for subtitle and video management
test: add unit tests for utility functions related to subtitle processing
chore: set up project structure with necessary files and directories for functionality

feat(ui_hardsubripper.py): add UI implementation for HardSubRipper application to provide a graphical interface for subtitle extraction and translation functionalities
This commit is contained in:
Djalim Simaila 2025-02-06 00:34:06 +01:00
commit b792802e47
14 changed files with 7228 additions and 0 deletions

945
data/ass/ep1.ass Normal file
View File

@ -0,0 +1,945 @@
1
00:00:10,130 --> 00:00:14,260
الحب قد يزهر
2
00:00:15,510 --> 00:00:20,770
داخل روحك
3
00:00:26,940 --> 00:00:29,650
نحن نحب بعضنا البعض
4
00:00:30,530 --> 00:00:33,150
قبل القبلة
5
00:00:34,200 --> 00:00:36,820
نحن نحب بعضنا البعض
6
00:00:37,780 --> 00:00:40,540
سوف ننظر في عينيك
7
00:00:41,450 --> 00:00:45,870
ويغرق في حبك
8
00:00:48,090 --> 00:00:51,670
السعادة - أنا أحبك
9
00:00:51,670 --> 00:00:56,390
السعادة - انظر
10
00:00:56,390 --> 00:00:58,890
السعادة - ممتن
11
00:00:58,890 --> 00:01:08,730
السعادة ، السعادة - أنا أنت ، أنا أنت
12
00:01:08,730 --> 00:01:11,440
نحن نحب بعضنا البعض
13
00:01:12,360 --> 00:01:15,070
وسنكون معاً إلى الأبد
14
00:01:15,950 --> 00:01:18,660
نحن نحب بعضنا البعض
15
00:01:19,620 --> 00:01:22,370
سوف ننظر في عينيك
16
00:01:23,290 --> 00:01:34,960
ويغرق في حبك
ويغرق في حبك
17
00:03:18,890 --> 00:03:22,560
هيا بسرعه
18
00:03:26,110 --> 00:03:32,410
موكو اويجنجي خاصتك داخلي
19
00:03:33,530 --> 00:03:34,450
بيكو ...
20
00:03:39,000 --> 00:03:44,000
MY PICO
الجزء الأول
21
00:06:10,570 --> 00:06:11,610
تعال.
22
00:06:20,160 --> 00:06:22,160
بيكو ، لدينا زائر.
23
00:06:22,540 --> 00:06:23,870
نعم نعم!
24
00:06:27,040 --> 00:06:28,290
أهلا وسهلا بك.
25
00:06:32,420 --> 00:06:35,510
ابن ابنة زيارة لي في اجازة.
26
00:06:42,310 --> 00:06:45,100
و ... ماذا تطلب؟
27
00:06:46,020 --> 00:06:46,890
حسنا ...
28
00:06:47,690 --> 00:06:48,730
كالعادة
29
00:06:51,360 --> 00:06:54,150
آه ... نعم ، كالعادة
30
00:07:01,070 --> 00:07:02,330
مع الحليب؟
31
00:07:02,740 --> 00:07:04,410
نعم قليلا.
32
00:07:05,750 --> 00:07:08,000
مع الأصدقاء في ditenka سيئة هنا.
33
00:07:08,040 --> 00:07:10,460
ربما لعب معا؟
34
00:07:10,880 --> 00:07:13,040
هل انت انا
35
00:07:14,630 --> 00:07:16,510
أنت لست مشغولاً للغاية ، أليس كذلك؟
36
00:07:22,720 --> 00:07:24,010
معذرة!
37
00:07:27,100 --> 00:07:28,270
اسف ...
38
00:07:28,850 --> 00:07:30,770
هل دائما ... تقلق كثيرا؟
39
00:07:33,440 --> 00:07:37,070
حسناً ، المزيد من الحليب ليس كذلك ، نعم ...
40
00:08:06,310 --> 00:08:08,020
نظرة!
42
00:08:18,360 --> 00:08:19,530
نعم ...
43
00:08:20,240 --> 00:08:21,610
فقط لماذا "Moku"؟
44
00:08:21,780 --> 00:08:23,700
إذا كان اسمك هو تاموتو ، فسوف تكون Moku.
45
00:08:23,740 --> 00:08:24,780
أكثر متعة.
46
00:08:30,660 --> 00:08:32,710
Moku ، اصطحابي.
47
00:08:33,000 --> 00:08:34,920
أريد أن أنظر إلى الأسفل.
48
00:08:35,630 --> 00:08:37,750
بدلا من ذلك ، سوف يمر الوقت!
49
00:08:39,460 --> 00:08:41,380
نعم ، انظر ، انظر!
50
00:08:42,380 --> 00:08:43,630
أوه ، طائر صغير!
51
00:08:44,010 --> 00:08:45,090
ارفعها أعلى.
52
00:08:46,720 --> 00:08:47,470
إلى هذا الحد؟
53
00:08:47,850 --> 00:08:49,390
نعم حسنا
54
00:08:51,560 --> 00:08:55,610
واو ...
55
00:08:58,230 --> 00:08:59,440
الجمال.
56
00:09:11,370 --> 00:09:12,750
انتهى الوقت.
57
00:09:13,540 --> 00:09:15,500
هل تريد رؤية المزيد؟
58
00:09:16,130 --> 00:09:18,130
لا ، لا تفعل.
59
00:09:18,960 --> 00:09:21,300
هنا أريد الآيس كريم!
60
00:09:22,220 --> 00:09:23,050
كل الحق.
61
00: 09: 46،240 -> 00: 09: 48،830
سوف تكون
62
00:09:49,760 --> 00:09:51,060
آي ، بارد!
63
00:09:51,580 --> 00:09:54,250
لا يمكنك أن تضيع.
64
00:10:05,260 --> 00:10:06,590
لعقها ...
65
00:10:08,760 --> 00:10:10,720
لعق لسانك.
66
00:10:12,140 --> 00:10:14,230
ثم يجف ويصبح لزجًا.
67
00:10:36,460 --> 00:10:38,330
موكو ، أنت غشاش
68
00:10:46,470 --> 00:10:47,510
لماذا؟
69
00:10:48,180 --> 00:10:49,220
لا؟
70
00:10:50,800 --> 00:10:52,260
نعم لا ...
71
00:11:05,070 --> 00:11:06,940
سوف يسقط الآيس كريم ...
72
00:11:07,240 --> 00:11:09,070
امسك حتى لا تسقط.
73
00:11:09,530 --> 00:11:10,740
لكن ...
74
00:11:17,960 --> 00:11:20,460
هل السيارة ربما جديدة؟
75
00:11:24,420 --> 00:11:26,380
هنا لذلك عقد.
76
00:12:21,520 --> 00:12:25,270
Moku ... أنا غريبة نوعا ما ...
77
00:12:27,730 --> 00:12:28,570
هنا؟
78
00:12:34,070 --> 00:12:36,910
الآن سأجعلك أكثر غرابة
79
00:12:38,330 --> 00:12:39,910
لكن ...
80
00:12:39,950 --> 00:12:43,330
لا تخف. ليس لديك ما تخشاه. خير؟
81
00:13:11,240 --> 00:13:14,530
أوه ... لا ...
82
00:13:26,000 --> 00:13:27,290
ما هو شعورك؟
83
00:13:28,920 --> 00:13:31,420
لا ادري ...
84
00:13:55,700 --> 00:13:57,280
هل هذه اول مرة لك؟
85
00:13:58,030 --> 00:13:59,080
نعم ...
86
00:13:59,370 --> 00:14:00,620
هل يعجبك؟
87
00:14:04,910 --> 00:14:06,460
أنت لا تؤذي ، أليس كذلك؟
88
00:14:07,290 --> 00:14:10,130
لا ... أنت لطيف أكثر ...
89
00:14:18,050 --> 00:14:19,970
آي ، لا!
90
00:14:32,940 --> 00:14:35,400
من هناك الآن سوف يتدفق شيء ...
91
00:15:15,990 --> 00:15:17,400
Moku ...
92
00:15:20,280 --> 00:15:22,120
لقد تركت الآيس كريم.
93
00:15:24,540 --> 00:15:27,960
ثم عليك معاقبة لك.
94
00:15:54,610 --> 00:15:55,980
حسنا ، لقد ذهبت.
95
00:16:18,670 --> 00:16:21,470
اللعنة ، غارقة مثل الكلاب.
96
00:16:22,260 --> 00:16:25,300
في توقعات حول المطر لم يقل أي شيء.
97
00:16:25,350 --> 00:16:28,520
كنت قد عرفت - سوف تذهب بالسيارة.
98
00:16:29,390 --> 00:16:30,600
اللئيم.
99
00:16:30,730 --> 00:16:31,850
لماذا؟
100
00:16:32,520 --> 00:16:34,520
في السيارة ، سوف تبدأ بالتأكيد مضايقة.
101
00:16:35,230 --> 00:16:36,150
بالدا.
102
00:16:53,880 --> 00:16:56,090
Moku ، ماذا لديك لارتداء ملابسك؟
103
00:16:56,130 --> 00:16:56,920
الان ...
104
00:17:02,680 --> 00:17:04,390
لمن هذا؟
105
00:17:04,430 --> 00:17:06,350
اشتريتها لك
106
00:17:07,050 --> 00:17:08,350
بالنسبة لي
107
00:17:08,930 --> 00:17:10,480
اعتقدت أنك ستذهب
108
00:17:10,520 --> 00:17:11,270
جربها.
109
00:17:13,020 --> 00:17:14,810
أنا ولد!
110
00:17:14,850 --> 00:17:16,520
اذن ماذا؟ جربها.
111
00:17:17,190 --> 00:17:18,730
ولكن بعد كل شيء ...
112
00:17:18,770 --> 00:17:20,530
ستكون جميلة ، أنا أقول.
113
00:17:22,240 --> 00:17:24,990
أو لا تحب هذا؟
114
00:17:26,700 --> 00:17:29,700
حسنا ، نعم ، أنت ولد.
115
00:17:32,330 --> 00:17:35,290
فقط لا نقب عن تغيير الملابس!
116
00:17:51,890 --> 00:17:52,890
حسنا كيف؟
117
00:17:55,140 --> 00:17:58,110
كما فكرت ، أنت جميلة جدا.
118
00:17:59,110 --> 00:18:00,190
حقا؟
119
00:18:00,610 --> 00:18:03,860
نعم. أكثر جمالا من أي فتاة.
120
00:18:30,350 --> 00:18:33,930
Moku ... انه يحتسي معدتي.
121
00:18:33,980 --> 00:18:37,190
إنه خطأك ، وأنت تفهم.
122
00:18:37,230 --> 00:18:39,940
هو نفسه طلب مني تغيير الملابس.
123
00:18:55,040 --> 00:18:57,790
لا تنظر ، أتردد.
124
00:18:57,830 --> 00:19:00,500
لا ، أريد أن أرى كل شيء.
125
00:19:02,880 --> 00:19:04,090
مهما فعلت.
126
00:19:05,970 --> 00:19:07,260
بالدا.
127
00:19:57,310 --> 00:19:58,230
انا اسف
128
00:19:58,850 --> 00:20:02,900
حسنا ، هذا الزي الجديد كله متسخ.
129
00:20:03,610 --> 00:20:07,280
حسنا ، يمكنك شراء واحدة أخرى.
130
00:20:07,990 --> 00:20:09,990
هل يمكنني اختيار؟
131
00:20:10,660 --> 00:20:11,530
نعم.
132
00:20:29,130 --> 00:20:32,510
كان هو نفسه ضدها ، والآن كم هو عظيم معك ...
133
00:20:33,300 --> 00:20:35,050
لا ...
134
00:20:35,970 --> 00:20:38,720
الآن سوف أجعلك أفضل.
135
00:20:43,690 --> 00:20:47,280
لا ... أنا خجولة جدا ...
136
00: 20: 53،030 -> 00: 20: 58،580
إنه أمر غريب ... لكنني أشعر أنني بحالة جيدة ...
137
00:21:00,660 --> 00:21:05,080
لا ، Moku ...
138
00:21:12,130 --> 00:21:12,930
حسنا كيف؟
139
00:21:13,930 --> 00:21:15,260
ما هو شعورك؟
140
00:21:16,300 --> 00:21:17,140
هل يعجبك؟
141
00:21:17,810 --> 00:21:18,970
قل لي.
142
00:21:19,270 --> 00:21:20,730
أنت سيئة
143
00:21:21,560 --> 00:21:22,770
و كذلك؟
144
00:21:26,480 --> 00:21:27,480
هل يعجبك؟ نعم؟
145
00:21:29,230 --> 00:21:32,950
Moku ... أنت سيئة ...
146
00:21:35,820 --> 00:21:36,870
Moku؟
147
00:21:39,700 --> 00:21:42,160
لا تخف. ثق بي.
148
00:21:49,880 --> 00:21:51,170
حسنا كيف؟
149
00:21:53,930 --> 00:21:55,470
لا ادري ...
150
00:21:55,720 --> 00:21:56,970
هل كل شيء على ما يرام
151
00:21:58,760 --> 00:21:59,890
Moku؟
152
00:22:01,810 --> 00:22:04,140
هل انت بخير
153
00:22:04,190 --> 00:22:06,850
نعم ... على غير العادة.
154
00:22:07,770 --> 00:22:09,110
حقا؟
155
00:22:09,150 --> 00:22:12,400
نعم. لم يسبق لي مثيل في حياتي.
156
00:22:13,240 --> 00:22:16,240
ثم ... كل شيء على ما يرام.
157
00:22:27,040 --> 00:22:28,130
ما هو؟
158
00:22:30,550 --> 00:22:32,460
شيء غريب معي
159
00:22:37,390 --> 00:22:41,470
- لا! توقف!
ماذا؟
160
00:22:42,100 --> 00:22:44,810
لا تلمس ... يا جمل ...
161
00:22:44,810 --> 00:22:47,100
كنت أخذت ... الحمار كله ...
162
00:22:49,690 --> 00:22:56,700
هي هناك ... أخذت بكسيا كل مؤخرتي ...
163
00:22:59,370 --> 00:23:00,200
لا استطيع الوقوف عليه!
164
00:23:24,270 --> 00:23:25,390
يا موكو
165
00:23:29,480 --> 00:23:30,190
ماذا؟
166
00:23:31,020 --> 00:23:32,270
لا تهتم.
167
00:23:33,270 --> 00:23:34,820
أردت فقط أن أتصل بك
168
00:23:35,570 --> 00:23:36,490
غريب لك.
169
00:23:38,280 --> 00:23:39,910
يا موكو
170
00:23:42,780 --> 00:23:44,660
من أنا لك؟
171
00:23:48,370 --> 00:23:50,080
حسنا ...
172
00:23:54,630 --> 00:23:57,050
بيكو! بيكو!
173
00:23:57,920 --> 00:23:58,720
توقف!
174
00:24:07,270 --> 00:24:12,650
بيكو! بيكو! بيكو!
175
00:24:15,530 --> 00:24:18,190
بيكو! بيكو!
176
00:25:05,580 --> 00:25:06,620
بيكو.
177
00:25:11,080 --> 00:25:12,210
لماذا أتيت؟
178
00:25:13,540 --> 00:25:15,500
بيكو ، يمكنك قص شعرك ...
179
00:25:17,090 --> 00:25:18,800
لماذا أتيت؟
180
00:25:18,840 --> 00:25:21,510
لأنك اختفت فجأة ...
181
00:25:22,340 --> 00:25:23,300
وكل شيء؟
182
00:25:23,340 --> 00:25:25,340
ماذا تعني "وكل شيء"؟
183
00:25:25,720 --> 00:25:27,010
لماذا أتيت؟
184
00:25:27,560 --> 00:25:28,390
بيكو ...
185
00:25:31,640 --> 00:25:33,390
لنذهب الى البيت معا.
186
00:25:38,230 --> 00:25:40,320
تعال ، بيكو.
187
00:25:41,570 --> 00:25:43,070
بالدا لك ، موكو.
188
00:25:48,030 --> 00:25:48,790
بيكو؟
189
00:25:52,290 --> 00:25:53,160
حسنا ، هل نحن ذاهبون؟
190
00:25:54,620 --> 00:25:55,580
نعم ...
191
00:25:58,500 --> 00:25:59,880
انتظر يا بيكو!
192
00:26:04,050 --> 00:26:06,840
مرحباً ماذا أنت أوه ، أنت مخادع!
193
00:26:07,300 --> 00:26:09,180
Moku ، أنت المعكرونة!
194
00:26:09,180 --> 00:26:10,680
مرحبًا ، توقف!
195
00:26:17,690 --> 00:26:19,480
الآن أنا مبلل
196
00:26:49,850 --> 00:26:50,850
ماذا؟
197
00:26:54,730 --> 00:26:56,940
لا ، لا تكن هنا.
198
00:26:57,600 --> 00:26:58,770
لماذا؟
199
00:26:59,480 --> 00:27:01,520
فجأة سيروننا.
200
00:27:03,820 --> 00:27:06,490
أنت لا تريد أن ترانا معا؟
201
00:27:08,360 --> 00:27:09,320
بالدا ...
202
00:27:22,380 --> 00:27:25,590
Moku ، سأنهي الآن ...
203
00:27:40,860 --> 00:27:45,440
Moku ... PIS الخاص بك هو صعب جدا ... كذلك ...
204
00:27:45,860 --> 00:27:48,240
هل أنت متحمس جدا ، بيكو؟
205
00:27:58,660 --> 00:28:01,830
انها ساخنة جدا الآن ...
206
00:28:02,670 --> 00:28:04,000
لا أستطيع بعد الآن
207
00:28:04,050 --> 00:28:08,880
أدخلني من الخلف ... أريد أن نائب الرئيس ...
208
00:28:44,960 --> 00:28:49,970
إنها مثل ... أنا أتحول إلى كس ...
209
00:28:59,980 --> 00:29:03,440
لا أستطيع الوقوف ... أنا الآن ...
210
00:29:04,480 --> 00:29:05,570
Moku!
211
00:29:06,230 --> 00:29:08,400
Moku! Moku!
212
00:29:39,270 --> 00:29:40,310
أنا أحب ...
214
00:29:56,620 --> 00:29:59,210
قبل القبلة
215
00:30:00,250 --> 00:30:02,920
نحن نحب بعضنا البعض
216
00:30:03,880 --> 00:30:06,550
سوف ننظر في عينيك
217
00:30:07,510 --> 00:30:11,810
ويغرق في حبك
218
00:30:14,810 --> 00:30:16,060
هنا ، يدا بيد
219
00:30:18,360 --> 00:30:24,360
نحن ننتظر تحت اشارة المرور
الضوء الأخضر ، تضيء
220
00:30:25,240 --> 00:30:27,950
تنهد لانغدج سماع الخاص بك
221
00:30:31,160 --> 00:30:33,870
نحن نحب بعضنا البعض
222
00:30:34,830 --> 00:30:37,540
قبل القبلة
223
00:30:38,420 --> 00:30:41,130
نحن نحب بعضنا البعض
224
00:30:42,090 --> 00:30:45,090
وأنا لن أدعك تذهب
225
00: 30: 45،760 -> 00: 30: 48،430
فوقنا هو نفس السماء
226
00:30:49,340 --> 00:30:52,060
اشراق اكثر اشراقا
227
00:30:52,970 --> 00:30:55,680
قلب أقوى سوف يضرب
228
00:30:56,600 --> 00:30:59,270
أسمع له أنك تدق
229
00:31:00,230 --> 00:31:04,570
والرياح ستطير في الماضي
230
00:31:05,070 --> 00:31:08,610
السعادة - سأقدم لك
231
00:31:08,610 --> 00:31:11,450
السعادة هي فقط لأجلك
232
00:31:12,370 --> 00:31:15,870
السعادة - أنا أحبك
233
00:31:15,870 --> 00:31:23,710
السعادة ، السعادة - أنت فقط ، أنت فقط
234
00:31:25,710 --> 00:31:28,380
نحن نحب بعضنا البعض
235
00:31:29,340 --> 00:31:32,050
وسنكون معاً إلى الأبد
236
00:31:32,930 --> 00:31:35,640
نحن نحب بعضنا البعض
237
00:31:36,600 --> 00:31:39,350
سوف ننظر في عينيك
238
00:31:40,230 --> 00:31:51,950
ويغرق في حبك
ويغرق في حبك

1268
data/ass/ep2.ass Normal file

File diff suppressed because it is too large Load Diff

999
data/ass/ep3.ass Normal file
View File

@ -0,0 +1,999 @@
1
00:00:21,700 --> 00:00:23,700
بدلا من ذلك ، خذها!
2
00:00:27,300 --> 00:00:29,300
بدلا من ذلك ، خذها!
3
00:00:30,700 --> 00:00:32,000
خذها
4
00:00:33,100 --> 00:00:35,000
بدلا من ذلك ، خذها!
5
00:00:36,300 --> 00:00:37,500
خذها
6
00:00:42,000 --> 00:00:46,000
الآن لن تكون وحيدًا
7
00:00:47,930 --> 00:00:51,150
الآن دون أي شخص لن تكون كذلك
8
00:00:53,150 --> 00:00:58,500
فقط امسك يدك وستولد الحب
9
00:00:58,500 --> 00:01:03,000
لم يعد باستطاعتي ان اعجلني
10
00:01:03,000 --> 00:01:06,000
خذني قريبا
11
00:01:06,000 --> 00:01:09,000
الحب بدلا مني!
12
00:01:09,000 --> 00:01:15,000
خذني الآن ها هو الحب الحقيقي! الصيحة!
13
00:01:16,000 --> 00:01:19,490
الآن لم نعد بحاجة للتحدث
14
00:01:21,620 --> 00:01:25,000
الآن لم نعد بحاجة إلى أعذار
15
00:01:26,870 --> 00:01:32,500
فقط عانقني في رقصة الحب
16
00:01:32,550 --> 00:01:36,200
أغلق عيني وأطلبها
17
00:01:37,200 --> 00:01:40,000
خذني قريبا
18
00:01:40,000 --> 00:01:43,000
الحب بدلا مني!
19
00:01:43,000 --> 00:01:49,000
خذني الآن بعد كل شيء ، لا أستطيع من دونك! الصيحة!
20
00:01:49,000 --> 00:01:51,500
خذني قريبا
21
00:01:51,500 --> 00:01:54,280
الحب بدلا مني!
22
00:01:54,280 --> 00:01:56,500
خذني قريبا
23
00:01:56,500 --> 00:02:00,000
تعال ، خذني!
24
00:02:03,300 --> 00:02:05,000
بدلا من ذلك ، خذها!
25
00:02:06,700 --> 00:02:08,000
خذها
26
00:02:09,000 --> 00:02:11,000
بدلا من ذلك ، خذها!
27
00:02:12,210 --> 00:02:13,000
خذها
28
00:02:31,520 --> 00:02:33,900
بيكو ... أنت جميلة.
29
00:03:22,000 --> 00:03:27,500
PICO ، CHICO و TUTA
الجزء 3
30
00:03:30,580 --> 00:03:34,460
حسنا و؟ اين انت الان شيكو؟
31
00:03:34,630 --> 00:03:40,210
قلت ، ترى كلب النوم - اتجه يمينا ، سترى متجر!
32
00:03:40,670 --> 00:03:42,220
كلب؟
33
00:03:42,260 --> 00:03:46,350
لقد رسمت حواجبها باستخدام قلم ملون بحيث تتعرف عليها فوراً!
34
00:03:49,850 --> 00:03:52,980
يمكنك تسمية معلم أفضل؟
35
00:03:53,020 --> 00:03:57,230
ماذا؟ آه ... حسنا ، كان لا يزال هناك سيارة رياضية باردة هناك.
36
00:03:57,270 --> 00:03:59,610
الأحمر ، مع أجنحة بيضاء على الجانبين.
37
00:04:00,610 --> 00:04:03,900
هل هناك أي شيء يلفت انتباهك ، لا تمشي ولا تقود السيارة؟
38
00:04:03,950 --> 00:04:08,240
حسنا ... أوه ، انظر البرج الأحمر!
39
00:04:08,280 --> 00:04:10,740
هي وأستطيع أن أرى من هنا!
40
00:04:10,790 --> 00:04:13,250
حسناً ... ساعة كبيرة هنا ...
41
00:04:14,750 --> 00:04:17,750
[لا توجد إشارة]
42
00:04:16,080 --> 00:04:17,130
و؟
43
00:05:39,540 --> 00:05:42,460
هناك ... الصيحة!
44
00:05:42,500 --> 00:05:44,630
تشيكو ، أنت سيد
45
00:05:44,670 --> 00:05:46,550
حسنا ، ما هو؟
46
00:05:48,180 --> 00:05:50,800
حسنا ، مرة أخرى ، ليس ذلك.
47
00:05:52,180 --> 00:05:53,810
على ، خذها بنفسك.
48
00:05:53,850 --> 00:05:55,390
واحد أكثر؟
49
00:05:55,430 --> 00:05:58,390
ربما بالفعل بما فيه الكفاية؟
50
00:05:58,440 --> 00:06:01,110
حسنا ، لا ، حتى أحصل على الماء ، لن أرتاح.
51
00:06:01,150 --> 00:06:03,150
الآن مرة أخرى لا أنك سوف تمتد.
52
00:06:04,030 --> 00:06:05,690
حسنا ، لماذا لا؟
53
00:06:07,450 --> 00:06:09,030
لماذا لا هذا؟
54
00:06:09,490 --> 00:06:10,910
إنها جميلة.
55
00:06:13,790 --> 00:06:15,490
صحيح انهم جميلون؟
56
00:06:17,080 --> 00:06:18,750
نعم ...
57
00:06:18,790 --> 00:06:21,040
هل تريد واحدة؟
58
00:06:21,330 --> 00:06:22,960
واحد فقط؟
59
00:06:24,130 --> 00:06:28,470
إذا ترك الباقي ، سيكون وحيداً.
60
00:06:30,010 --> 00:06:34,260
خذ هذا ... وهذا ... وهذا واحد صغير.
61
00:06:43,440 --> 00:06:46,190
ها هي الآن لن يترك أي منهم بمفرده.
62
00:06:46,230 --> 00:06:47,860
هل تمانع؟
63
00:06:47,900 --> 00:06:49,400
لا ...
64
00:06:50,160 --> 00:06:51,110
شكرا!
65
00:07:01,000 --> 00:07:03,200
اسمي كوكو
كوكو باليابانيه تشبه كلمه هنا وتقراء كوكو
67
00:07:03,210 --> 00:07:04,000
كوكو؟
68
00:07:04,090 --> 00:07:08,170
نعم. كوكو أو كوكو ، لأني سأكون دائما هنا.
69
00:07:08,210 --> 00:07:10,220
هل هذا في طوكيو؟
70
00:07:10,680 --> 00:07:12,760
لا ، على هذا الكوكب.
71
00:07:13,430 --> 00:07:14,930
على هذا الكوكب؟
72
00:07:15,640 --> 00:07:17,970
حسنا ، نعم! تريد أن تزورني؟
73
00:07:18,930 --> 00:07:21,600
رائع!
74
00:07:21,640 --> 00:07:23,810
أليس مخيفًا السير هنا؟
75
00:07:23,810 --> 00:07:28,480
إذا كنت تتحدث عني ، فأنا أحب المشي. إذا كان "هنا" بمعنى "هنا" ، فهذه فروعًا مغلقة.
76
00:07:28,900 --> 00:07:30,860
أوه ، لا تذهب القطارات هنا بعد الآن.
77
00:07:30,900 --> 00:07:32,530
لا ، اذهب
78
00:07:35,830 --> 00:07:37,280
هنا!
79
00:07:40,580 --> 00:07:42,710
هنا - هنا.
80
00:07:43,750 --> 00:07:45,580
هنا - هنا.
81
00:07:47,170 --> 00:07:49,210
ثم - في نهاية المطاف.
82
00:07:51,680 --> 00:07:52,680
أنا أعيش
83
00:07:55,220 --> 00:07:56,850
أهلا وسهلا!
84
00:07:57,350 --> 00:08:00,060
نجاح باهر ، مخبأ سري!
85
00:08:00,100 --> 00:08:01,890
لديك النور هنا!
86
00:08:01,940 --> 00:08:03,600
عندما يكون هناك ، عندما لا يكون.
87
00:08:08,780 --> 00:08:09,610
هل ترى
88
00:08:12,530 --> 00:08:15,950
كوكو ، هل تعيش حقا هنا؟
89
00:08:15,990 --> 00:08:18,280
نعم ، لست مضطرا لدفع ثمن السكن.
90
00:08:19,790 --> 00:08:22,080
إذا شعرت بالجوع ، خذ ما تريد.
91
00:08:29,630 --> 00:08:30,920
الاستماع ، بيكو ...
92
00:08:30,960 --> 00:08:32,130
ماذا؟
93
00:08:34,180 --> 00:08:36,470
كيف حالك لم يفاجأ؟
94
00:08:36,510 --> 00:08:40,970
هل تتحدث عن هذا المكان أم عن كوكوو؟
95
00:08:40,970 --> 00:08:42,060
عن كل شيء!
96
00:08:43,890 --> 00:08:49,310
كل شيء مثير للاهتمام هنا. و كوكو جميل جدا ...
97
00:08:51,150 --> 00:08:52,070
نعم ...
98
00:09:09,380 --> 00:09:11,050
انا اسف
99
00:09:28,270 --> 00:09:31,070
غدا سأريكم شيئًا مثيرًا للاهتمام.
100
00:09:31,070 --> 00:09:31,690
تعال!
101
00:09:31,730 --> 00:09:33,280
ليلة سعيدة
102
00:09:33,320 --> 00:09:34,400
ليلة سعيدة
103
00:09:34,440 --> 00:09:35,820
ليلة سعيدة يا كوكو!
104
00:10:03,770 --> 00:10:07,060
شيكو! شيكو!
105
00:11:57,630 --> 00:12:00,590
و ... آسف.
106
00:12:01,380 --> 00:12:08,470
لا شيء ... لقد رأيتك أيضاً
107
00:13:22,300 --> 00:13:24,090
لا ... لا ... لذلك من المستحيل ...
108
00:13:40,900 --> 00:13:45,400
آسف جدا في وقت مبكر ...
109
00:13:45,400 --> 00:13:47,400
لا شيء ... أنت جميلة.
110
00:14:45,710 --> 00:14:46,590
كيف؟
111
00:14:47,260 --> 00:14:50,720
لكن ... أنا لست كل ...
112
00:14:52,010 --> 00:14:55,640
لا ... لا أكثر ...
113
00:14:55,680 --> 00:14:57,680
لكن اريد المزيد!
114
00:15:04,150 --> 00:15:07,480
كوكو ... أنا ... الآن ...
115
00:15:09,990 --> 00:15:11,530
أنا أيضًا ...
116
00:15:47,570 --> 00:15:48,980
هم ...
117
00:15:52,110 --> 00:15:56,200
شيكو! تعال هنا!
118
00:15:57,080 --> 00:15:59,540
انتظر الآن!
119
00:16:01,210 --> 00:16:03,580
أوه ، كم هي جميلة!
120
00:16:04,130 --> 00:16:05,790
اختر ما تريد.
121
00:16:05,840 --> 00:16:06,790
هل استطيع؟
122
00:16:26,190 --> 00:16:27,860
أنا فراشة!
123
00:16:40,660 --> 00:16:43,500
تريد معرفة المزيد عن المدينة - تسألني.
124
00:16:43,540 --> 00:16:45,170
أنا أعرف كل شيء هنا.
125
00:16:45,710 --> 00:16:46,580
حقا؟
126
00:16:47,000 --> 00:16:52,460
المدينة كبيرة ، وهناك العديد من الأماكن الغامضة والقصص الغامضة.
127
00:16:54,050 --> 00:16:55,260
على سبيل المثال ...
128
00:16:55,300 --> 00:16:58,680
إذا خرجت في محطة "ثلاث غرف الشاي" ، سوف تأتي في الربع الثالث ...
129
00:16:58,720 --> 00:17:04,730
في الساعة الثالثة صباحا وسترى كيف أن ثلاثة رقصة ثلاثية السامبا ترقص السامبا ، عندها سيكون لديك ثلاث مرات ثلاثة تناسخ ، أي تسعة!
130
00:17:04,770 --> 00:17:05,850
حسنا
131
00:17:05,900 --> 00:17:06,940
نعم.
132
00:17:06,980 --> 00:17:08,360
الهراء هو كل شيء.
133
00:17:08,360 --> 00:17:09,730
و لا
134
00:17:09,770 --> 00:17:15,450
وحتى لو كاليكو القط يمكن لأحد أن القط، فإنك سوف تكون قادرة على تجديد وتسع وتسعين مرة!
135
00:17:16,070 --> 00:17:18,070
القطط لا ترقص السامبا.
136
00:17:18,070 --> 00:17:20,910
لقد رأيت ذلك بنفسي في الحياة الماضية.
137
00:17:20,950 --> 00:17:21,870
في الحياة الماضية؟
138
00:17:21,910 --> 00:17:25,500
نعم. هذا هو التناسخ الثالث.
139
00:17:27,460 --> 00:17:29,380
ماذا تعرف ايضا؟
140
00:17:30,630 --> 00:17:36,590
في بعض الأحيان في الليل ، عندما تضيء الأضواء على البرج الأحمر ، يمكنك رؤية جنيات المدينة.
141
00: 17: 36،630 -> 00: 17: 37،930
طفولي؟
142
00:17:38,390 --> 00:17:39,090
نعم.
143
00:17:39,890 --> 00:17:42,930
هناك دائما الجنيات في المدن الكبرى.
144
00:17:46,600 --> 00:17:51,070
لم نطلب رقم هاتفك أبداً.
145
00:17:51,110 --> 00:17:51,940
نعم ، أخبرنا!
146
00:17:51,980 --> 00:17:54,490
حسنا. أي واحد تريد؟
147
00:17:54,530 --> 00:17:55,780
هل هو كل شيء لك؟
148
00:17:55,780 --> 00:17:58,570
لو كنت بمفردي ، سيكون وحيداً.
149
00:17:58,620 --> 00:18:01,280
وحيدا؟ الهاتف؟
150
00:18:01,330 --> 00:18:05,120
عندما يكونون معا ، مثل هذا ، في بعض الأحيان يتحدثون إلى بعضهم البعض.
151
00:18:05,160 --> 00:18:09,960
هذا الأحمر والأزرق صديقان عظيمان ، إنهما يدردشان كثيرًا.
152
00:18:10,460 --> 00:18:15,800
لكن هذا الأبيض يبدأ بالغيرة ويسمّي بهدوء اللون الأزرق.
153
00:18:15,840 --> 00:18:18,590
إذا كنت تشاهدها لفترة أطول قليلاً ، يمكنك أن ترى كيف تغمز.
154
00:18:21,100 --> 00:18:24,310
هذا يعني أن لديهم روح.
155
00:18:24,350 --> 00:18:25,720
هل الهواتف؟
156
00:18:26,140 --> 00:18:31,650
عندما يتصل هاتف بآخر أو ينطفئ ، فإنه يشبه النبضات العصبية.
157
00:18:31,650 --> 00:18:37,820
إذا قمت بتجميع الكثير من الهواتف ، فإنها تتحول إلى دماغ ، وتولد نفسًا.
158
00:18:38,360 --> 00:18:43,910
لقد ولدت جميع الأرواح الجديدة هنا وهناك ، فهم يتحدون ويتفرقون ويتغيرون مع مرور الوقت.
159
00:18:43,910 --> 00:18:45,910
هذه مدينة
160
00:18:46,830 --> 00:18:53,380
المدينة لديها مكان يتجمع فيه الكثير من الكهرباء. يعيش هناك أكبر روح.
161
00:18:53,380 --> 00:18:57,550
وهناك أيضا الجنيات الحضرية.
162
00:18:58,590 --> 00:19:01,050
وأين هذا المكان؟
163
00:19:01,680 --> 00:19:02,760
هناك.
164
00:19:04,680 --> 00:19:06,390
على هذا البرج.
165
00:19:12,190 --> 00:19:14,610
الآن سوف تحصل على الماء!
166
00:19:14,650 --> 00:19:16,030
مرة أخرى؟
167
00:19:16,070 --> 00:19:18,110
انتظر ، أنا في لمح البصر!
168
00:19:18,110 --> 00:19:20,360
هنا هو حكة له ...
169
00:19:21,450 --> 00:19:23,870
أنا أحبه على أي حال ، إنه لطيف.
170
00:19:27,410 --> 00:19:29,200
بارد!
171
00:19:45,220 --> 00:19:46,010
اه ...
172
00:19:46,310 --> 00:19:47,140
اوه ...
173
00:19:47,520 --> 00:19:49,350
Yyy ...
174
00:19:53,440 --> 00:19:56,520
حسنا! أكثر رازيك!
175
00:21:22,030 --> 00:21:25,280
فقط قليلا ... هذا كل شيء! تعال!
176
00:21:38,460 --> 00:21:40,670
حسنا ، أشعر بتحسن؟
177
00:21:41,170 --> 00:21:44,470
نعم ... شكرا.
178
00:22:11,080 --> 00:22:14,700
اشتعلت النيران! بيكو ، اشتعلت النار!
179
00:22:14,750 --> 00:22:16,250
حقا؟
180
00:22:16,290 --> 00:22:19,580
الأحمر مع الأزرق تحدثت للتو!
181
00:22:37,520 --> 00:22:39,060
شيكو؟
182
00:23:00,830 --> 00:23:03,170
تشيكو ، أنت جميلة.
183
00:23:04,750 --> 00:23:06,760
لا ...
184
00:24:00,890 --> 00:24:03,900
كوكو ، خذنا إلى البرج الأحمر!
185
00:24:03,900 --> 00:24:05,060
الآن؟
186
00:24:05,110 --> 00:24:08,320
نعم! فجأة سوف نرى الجنيات هناك!
187
00:24:08,360 --> 00:24:09,690
حسنا ، أنا لا أعرف ...
188
00:24:09,690 --> 00:24:12,610
تعال ، كوكو!
189
00:24:12,660 --> 00:24:15,370
حسنا تعال ، بيكو.
190
00:24:16,200 --> 00:24:19,410
شيء متردد بالنسبة لي.
191
00:24:22,870 --> 00:24:23,960
بيكو؟
192
00:24:23,960 --> 00:24:27,290
تذهب معًا ، وسأنتظرك.
193
00:24:27,300 --> 00:24:28,590
بيكو ...
194
00:24:29,840 --> 00:24:31,050
ومن هنا! تحية!
195
00:24:37,060 --> 00:24:39,350
حظا سعيدا لك. وداعا وداعا!
196
00:24:43,270 --> 00:24:46,020
كوكو؟ كوكو!
197
00:24:51,070 --> 00:24:52,490
كوكو!
198
00:24:58,330 --> 00:25:00,200
بيكو ، انتظرني!
199
00:25:07,420 --> 00:25:08,590
هم ...
200
00:25:10,710 --> 00:25:12,510
فارغ ...
201
00:25:28,940 --> 00:25:30,320
كوكو ...
202
00:25:35,320 --> 00:25:38,120
إلى أين يذهب؟
203
00:25:38,870 --> 00:25:40,330
ربما يكرهنا؟
204
00:25:41,240 --> 00:25:43,290
ربما لن نراه مرة أخرى؟
205
00:25:43,790 --> 00:25:47,960
أو ربما كوكو جنية حضرية؟
206
00:25:48,000 --> 00:25:49,590
طفولي؟
207
00:25:51,300 --> 00:25:52,550
برج الحمراء!
208
00:26:25,330 --> 00:26:26,370
كوكو!
209
00: 26: 30،630 -> 00: 26: 32،000
كوكو ...
210
00:26:33,380 --> 00:26:37,090
مع ذلك ، الأفضل معًا.
211
00:26:37,630 --> 00:26:39,090
نعم!
212
00:28:23,700 --> 00:28:25,410
لماذا أنا فقط ...
213
00:28:28,040 --> 00:28:31,250
لأننا بالملل جدا.
214
00:28:31,290 --> 00:28:33,710
وكنا قلقين جدا.
215
00:28:45,800 --> 00:28:50,930
انتظر ... أنا أريد ...
216
00:29:24,880 --> 00:29:26,800
لن تذهب بعيدا؟
217
00:29:32,640 --> 00:29:34,850
سوف أكون دائما معك.
218
00:29:37,650 --> 00:29:40,770
حقا؟ بصراحة؟
219
00:29:41,940 --> 00:29:43,280
أعدك ...
220
00:31:35,430 --> 00:31:38,600
آمل أن نراك مرة أخرى.
221
00:31:53,700 --> 00:31:55,700
بدلا من ذلك ، خذها!
222
00:31:59,300 --> 00:32:01,300
بدلا من ذلك ، خذها!
223
00:32:02,700 --> 00:32:04,000
خذها
224
00:32:05,100 --> 00:32:07,000
بدلا من ذلك ، خذها!
225
00:32:08,300 --> 00:32:09,500
خذها
226
00:32:14,000 --> 00:32:18,000
الآن لن تكون وحيدًا
227
00:32:19,930 --> 00:32:23,150
الآن دون أي شخص لن تكون كذلك
228
00:32:25,150 --> 00:32:30,500
فقط امسك يدك وستولد الحب
229
00:32:30,500 --> 00:32:35,000
لم يعد باستطاعتي ان اعجلني
230
00:32:35,000 --> 00:32:38,000
خذني قريبا
231
00:32:38,000 --> 00:32:41,000
الحب بدلا مني!
232
00:32:41,000 --> 00:32:47,000
خذني الآن ها هو الحب الحقيقي! الصيحة!
233
00:32:48,000 --> 00:32:51,490
الآن لم نعد بحاجة للتحدث
234
00:32:53,620 --> 00:32:57,000
الآن لم نعد بحاجة إلى أعذار
235
00:32:58,870 --> 00:33:04,500
فقط عانقني في رقصة الحب
236
00:33:04,550 --> 00:33:08,200
أغلق عيني وأطلبها
237
00:33:09,200 --> 00:33:12,000
خذني قريبا
238
00:33:12,000 --> 00:33:15,000
الحب بدلا مني!
239
00:33:15,000 --> 00:33:21,000
خذني الآن بعد كل شيء ، لا أستطيع من دونك! الصيحة!
240
00:33:21,000 --> 00:33:23,500
خذني قريبا
241
00:33:23,500 --> 00:33:26,280
الحب بدلا مني!
242
00:33:26,280 --> 00:33:28,500
خذني قريبا
243
00:33:28,500 --> 00:33:32,000
تعال ، خذني!
244
00:33:35,300 --> 00:33:37,000
بدلا من ذلك ، خذها!
245
00:33:38,700 --> 00:33:40,000
خذها
246
00:33:41,000 --> 00:33:43,000
بدلا من ذلك ، خذها!
247
00:33:44,210 --> 00:33:45,000
خذها
248
00:33:46,500 --> 00:33:48,000
بدلا من ذلك ، خذها!
249
00:33:49,700 --> 00:33:50,800
خذها
250
00:33:52,000 --> 00:33:54,000
بدلا من ذلك ، خذها!
251
00:33:55,000 --> 00:33:56,000
خذها

957
data/srt/ep1.srt Normal file
View File

@ -0,0 +1,957 @@
1
00:00:10,130 --> 00:00:14,260
Любовь пусть расцветает
2
00:00:15,510 --> 00:00:20,770
Внутри твоей души
3
00:00:26,940 --> 00:00:29,650
Полюбим мы друг друга
4
00:00:30,530 --> 00:00:33,150
Ещё до поцелуя
5
00:00:34,200 --> 00:00:36,820
Полюбим мы друг друга
6
00:00:37,780 --> 00:00:40,540
В глаза твои взгляну я
7
00:00:41,450 --> 00:00:45,870
И утону в любви твоей
8
00:00:48,090 --> 00:00:51,670
Счастье - я люблю тебя
9
00:00:51,670 --> 00:00:56,390
Счастье - посмотри
10
00:00:56,390 --> 00:00:58,890
Счастье - благодарен
11
00:00:58,890 --> 00:01:08,730
Счастье, счастье - я тебе, я тебе
12
00:01:08,730 --> 00:01:11,440
Полюбим мы друг друга
13
00:01:12,360 --> 00:01:15,070
И вечно будем вместе
14
00:01:15,950 --> 00:01:18,660
Полюбим мы друг друга
15
00:01:19,620 --> 00:01:22,370
В глаза твои взгляну я
16
00:01:23,290 --> 00:01:34,960
И утону в любви твоей
И утону в любви твоей
17
00:03:18,890 --> 00:03:22,560
Войди в меня... скорее...
18
00:03:26,110 --> 00:03:32,410
Моку... войди в меня... своей писей...
19
00:03:33,530 --> 00:03:34,450
Пико...
20
00:03:39,000 --> 00:03:44,000
МОЙ ПИКО
Часть 1
21
00:06:10,570 --> 00:06:11,610
Проходите.
22
00:06:20,160 --> 00:06:22,160
Пико, у нас посетитель.
23
00:06:22,540 --> 00:06:23,870
Да-да!
24
00:06:27,040 --> 00:06:28,290
Добро пожаловать.
25
00:06:32,420 --> 00:06:35,510
Дочкино дитё. Гостит у меня на каникулах.
26
00:06:42,310 --> 00:06:45,100
А... что закажете?
27
00:06:46,020 --> 00:06:46,890
Ну...
28
00:06:47,690 --> 00:06:48,730
Как обычно.
29
00:06:51,360 --> 00:06:54,150
А... да, как обычно.
30
00:07:01,070 --> 00:07:02,330
С молоком?
31
00:07:02,740 --> 00:07:04,410
Да, немного.
32
00:07:05,750 --> 00:07:08,000
С друзьями у дитёнка здесь плохо.
33
00:07:08,040 --> 00:07:10,460
Может, поиграете вместе?
34
00:07:10,880 --> 00:07:13,040
Это вы мне?
35
00:07:14,630 --> 00:07:16,510
Вы ведь не сильно заняты?
36
00:07:22,720 --> 00:07:24,010
Простите!
37
00:07:27,100 --> 00:07:28,270
Извините...
38
00:07:28,850 --> 00:07:30,770
Ты всегда... так волнуешься?
39
00:07:33,440 --> 00:07:37,070
Что ж, побольше молока тоже ничего, да...
40
00:08:06,310 --> 00:08:08,020
Смотри!
41
00:08:15,360 --> 00:08:17,400
Моку, иди сюда!
42
00:08:18,360 --> 00:08:19,530
Угу...
43
00:08:20,240 --> 00:08:21,610
Только почему "Моку"?
44
00:08:21,780 --> 00:08:23,700
Раз тебя зовут Тамоцу, будешь Моку.
45
00:08:23,740 --> 00:08:24,780
Так прикольнее.
46
00:08:30,660 --> 00:08:32,710
Моку, подними меня.
47
00:08:33,000 --> 00:08:34,920
Хочу взглянуть пониже.
48
00:08:35,630 --> 00:08:37,750
Скорее, время выйдет!
49
00:08:39,460 --> 00:08:41,380
Ага, вижу, вижу!
50
00:08:42,380 --> 00:08:43,630
О, птичка!
51
00:08:44,010 --> 00:08:45,090
Подними повыше.
52
00:08:46,720 --> 00:08:47,470
Так?
53
00:08:47,850 --> 00:08:49,390
Да, нормально.
54
00:08:51,560 --> 00:08:55,610
Ух ты...
55
00:08:58,230 --> 00:08:59,440
Красота.
56
00:09:11,370 --> 00:09:12,750
Время вышло.
57
00:09:13,540 --> 00:09:15,500
Хочешь ещё посмотреть?
58
00:09:16,130 --> 00:09:18,130
Нет, не надо.
59
00:09:18,960 --> 00:09:21,300
Вот мороженого хочу!
60
00:09:22,220 --> 00:09:23,050
Ладно.
61
00:09:46,240 --> 00:09:48,830
Ты будешь?
62
00:09:49,760 --> 00:09:51,060
Ай, холодное!
63
00:09:51,580 --> 00:09:54,250
Нельзя, чтобы пропало.
64
00:10:05,260 --> 00:10:06,590
Слижи...
65
00:10:08,760 --> 00:10:10,720
Слижи языком.
66
00:10:12,140 --> 00:10:14,230
А то присохнет и станет липкое.
67
00:10:36,460 --> 00:10:38,330
Моку, ты обманщик.
68
00:10:46,470 --> 00:10:47,510
Почему?
69
00:10:48,180 --> 00:10:49,220
Не надо?
70
00:10:50,800 --> 00:10:52,260
Да нет...
71
00:11:05,070 --> 00:11:06,940
Мороженое упадёт...
72
00:11:07,240 --> 00:11:09,070
Держи, чтобы не упало.
73
00:11:09,530 --> 00:11:10,740
Но...
74
00:11:17,960 --> 00:11:20,460
Машина, наверное, новая?
75
00:11:24,420 --> 00:11:26,380
Вот потому и держи.
76
00:12:21,520 --> 00:12:25,270
Моку... мне как-то странно...
77
00:12:27,730 --> 00:12:28,570
Вот здесь?
78
00:12:34,070 --> 00:12:36,910
Сейчас я сделаю тебе ещё страннее.
79
00:12:38,330 --> 00:12:39,910
Но...
80
00:12:39,950 --> 00:12:43,330
Не бойся. Тебе нечего бояться. Хорошо?
81
00:13:11,240 --> 00:13:14,530
Ой... не надо...
82
00:13:26,000 --> 00:13:27,290
Что ты чувствуешь?
83
00:13:28,920 --> 00:13:31,420
Не знаю...
84
00:13:55,700 --> 00:13:57,280
С тобой такое впервые?
85
00:13:58,030 --> 00:13:59,080
Да...
86
00:13:59,370 --> 00:14:00,620
Тебе нравится?
87
00:14:04,910 --> 00:14:06,460
Тебе ведь не больно?
88
00:14:07,290 --> 00:14:10,130
Нет... ты только понежнее...
89
00:14:18,050 --> 00:14:19,970
Ай, нет!
90
00:14:32,940 --> 00:14:35,400
Оттуда сейчас что-то вытечет...
91
00:15:15,990 --> 00:15:17,400
Моку...
92
00:15:20,280 --> 00:15:22,120
Я уронил мороженое.
93
00:15:24,540 --> 00:15:27,960
Тогда придётся тебя наказать.
94
00:15:54,610 --> 00:15:55,980
Ну, я пошёл.
95
00:16:18,670 --> 00:16:21,470
Вот чёрт, вымокли, как собаки.
96
00:16:22,260 --> 00:16:25,300
В прогнозе про дождь ничего не говорилось.
97
00:16:25,350 --> 00:16:28,520
Знал бы - поехали бы на машине.
98
00:16:29,390 --> 00:16:30,600
Шалун.
99
00:16:30,730 --> 00:16:31,850
Почему?
100
00:16:32,520 --> 00:16:34,520
В машине ты бы точно начал приставать.
101
00:16:35,230 --> 00:16:36,150
Балда.
102
00:16:53,880 --> 00:16:56,090
Моку, во что у тебя есть одеться?
103
00:16:56,130 --> 00:16:56,920
Сейчас...
104
00:17:02,680 --> 00:17:04,390
Это чьё?
105
00:17:04,430 --> 00:17:06,350
Это я тебе купил.
106
00:17:07,050 --> 00:17:08,350
Мне?
107
00:17:08,930 --> 00:17:10,480
Подумал, тебе пойдёт.
108
00:17:10,520 --> 00:17:11,270
Примерь.
109
00:17:13,020 --> 00:17:14,810
Я же мальчик!
110
00:17:14,850 --> 00:17:16,520
Ну и что? Примерь.
111
00:17:17,190 --> 00:17:18,730
Но ведь...
112
00:17:18,770 --> 00:17:20,530
Будет красиво, я говорю.
113
00:17:22,240 --> 00:17:24,990
Или тебе такое не нравится?
114
00:17:26,700 --> 00:17:29,700
Ну да, ты же мальчик.
115
00:17:32,330 --> 00:17:35,290
Только не подглядывай, как я переодеваюсь!
116
00:17:51,890 --> 00:17:52,890
Ну как?
117
00:17:55,140 --> 00:17:58,110
Как я и думал, ты очень красивый.
118
00:17:59,110 --> 00:18:00,190
Правда?
119
00:18:00,610 --> 00:18:03,860
Да. Красивее любой девушки.
120
00:18:30,350 --> 00:18:33,930
Моку... Он трётся мне о живот.
121
00:18:33,980 --> 00:18:37,190
Это ты виноват, ты и разбирайся.
122
00:18:37,230 --> 00:18:39,940
Сам же попросил меня переодеться.
123
00:18:55,040 --> 00:18:57,790
Не смотри, я стесняюсь.
124
00:18:57,830 --> 00:19:00,500
Нет, я хочу всё видеть.
125
00:19:02,880 --> 00:19:04,090
Всё, что ты делаешь.
126
00:19:05,970 --> 00:19:07,260
Балда.
127
00:19:57,310 --> 00:19:58,230
Прости.
128
00:19:58,850 --> 00:20:02,900
Ну вот, весь новый наряд испачкал.
129
00:20:03,610 --> 00:20:07,280
Ну, можно купить тебе другой.
130
00:20:07,990 --> 00:20:09,990
А можно я буду выбирать?
131
00:20:10,660 --> 00:20:11,530
Ага.
132
00:20:29,130 --> 00:20:32,510
Сам был против, а теперь вон он какой большой у тебя...
133
00:20:33,300 --> 00:20:35,050
Нет...
134
00:20:35,970 --> 00:20:38,720
Сейчас я сделаю тебе ещё лучше.
135
00:20:43,690 --> 00:20:47,280
Нет... я стесняюсь...
136
00:20:53,030 --> 00:20:58,580
Это так странно... но мне хорошо...
137
00:21:00,660 --> 00:21:05,080
Нет, Моку...
138
00:21:12,130 --> 00:21:12,930
Ну как?
139
00:21:13,930 --> 00:21:15,260
Что ты чувствуешь?
140
00:21:16,300 --> 00:21:17,140
Тебе нравится?
141
00:21:17,810 --> 00:21:18,970
Скажи.
142
00:21:19,270 --> 00:21:20,730
Ты противный...
143
00:21:21,560 --> 00:21:22,770
А так?
144
00:21:26,480 --> 00:21:27,480
Нравится так? Да?
145
00:21:29,230 --> 00:21:32,950
Моку... ты противный...
146
00:21:35,820 --> 00:21:36,870
Моку?
147
00:21:39,700 --> 00:21:42,160
Не бойся. Доверься мне.
148
00:21:49,880 --> 00:21:51,170
Ну как?
149
00:21:53,930 --> 00:21:55,470
Не знаю...
150
00:21:55,720 --> 00:21:56,970
Всё нормально?
151
00:21:58,760 --> 00:21:59,890
Моку?
152
00:22:01,810 --> 00:22:04,140
Тебе хорошо?
153
00:22:04,190 --> 00:22:06,850
Да... необыкновенно.
154
00:22:07,770 --> 00:22:09,110
Правда?
155
00:22:09,150 --> 00:22:12,400
Да. Как никогда в жизни.
156
00:22:13,240 --> 00:22:16,240
Тогда... всё нормально.
157
00:22:27,040 --> 00:22:28,130
Что такое?
158
00:22:30,550 --> 00:22:32,460
Со мной что-то странное...
159
00:22:37,390 --> 00:22:41,470
- Нет! Перестань!
- Что?
160
00:22:42,100 --> 00:22:44,810
Не трогай... мою писю...
161
00:22:44,810 --> 00:22:47,100
Ты занял... всю попу...
162
00:22:49,690 --> 00:22:56,700
Она там... твоя пися заняла всю мою попу...
163
00:22:59,370 --> 00:23:00,200
Я не выдержу!
164
00:23:24,270 --> 00:23:25,390
Эй, Моку.
165
00:23:29,480 --> 00:23:30,190
Что?
166
00:23:31,020 --> 00:23:32,270
Ничего.
167
00:23:33,270 --> 00:23:34,820
Просто захотелось тебя позвать.
168
00:23:35,570 --> 00:23:36,490
Странный ты.
169
00:23:38,280 --> 00:23:39,910
Эй, Моку.
170
00:23:42,780 --> 00:23:44,660
Кто я для тебя?
171
00:23:48,370 --> 00:23:50,080
Ну...
172
00:23:54,630 --> 00:23:57,050
Пико! Пико!
173
00:23:57,920 --> 00:23:58,720
Стой!
174
00:24:07,270 --> 00:24:12,650
Пико! Пико! Пико!
175
00:24:15,530 --> 00:24:18,190
Пико! Пико!
176
00:25:05,580 --> 00:25:06,620
Пико.
177
00:25:11,080 --> 00:25:12,210
Зачем ты пришёл?
178
00:25:13,540 --> 00:25:15,500
Пико, ты постригся...
179
00:25:17,090 --> 00:25:18,800
Зачем ты пришёл?
180
00:25:18,840 --> 00:25:21,510
Потому что ты вдруг пропал...
181
00:25:22,340 --> 00:25:23,300
И всё?
182
00:25:23,340 --> 00:25:25,340
Что значит "и всё"?
183
00:25:25,720 --> 00:25:27,010
Зачем ты пришёл?
184
00:25:27,560 --> 00:25:28,390
Пико...
185
00:25:31,640 --> 00:25:33,390
Пойдём домой. Вместе.
186
00:25:38,230 --> 00:25:40,320
Идём же, Пико.
187
00:25:41,570 --> 00:25:43,070
Балда ты, Моку.
188
00:25:48,030 --> 00:25:48,790
Пико?
189
00:25:52,290 --> 00:25:53,160
Ну, мы идём?
190
00:25:54,620 --> 00:25:55,580
Угу...
191
00:25:58,500 --> 00:25:59,880
Подожди, Пико!
192
00:26:04,050 --> 00:26:06,840
Эй, ты чего? Ах ты проказник!
193
00:26:07,300 --> 00:26:09,180
Моку, ты балда!
194
00:26:09,180 --> 00:26:10,680
Эй, прекрати!
195
00:26:17,690 --> 00:26:19,480
Теперь я весь мокрый.
196
00:26:49,850 --> 00:26:50,850
Чего?
197
00:26:54,730 --> 00:26:56,940
Нет, не надо здесь.
198
00:26:57,600 --> 00:26:58,770
Почему?
199
00:26:59,480 --> 00:27:01,520
Вдруг нас увидят.
200
00:27:03,820 --> 00:27:06,490
Ты не хочешь, чтобы нас видели вместе?
201
00:27:08,360 --> 00:27:09,320
Балда...
202
00:27:22,380 --> 00:27:25,590
Моку, я сейчас кончу...
203
00:27:40,860 --> 00:27:45,440
Моку... Твоя пися такая твёрдая... как хорошо...
204
00:27:45,860 --> 00:27:48,240
Тебя тоже возбуждает, Пико?
205
00:27:58,660 --> 00:28:01,830
Она теперь такая горячая...
206
00:28:02,670 --> 00:28:04,000
Я больше не могу.
207
00:28:04,050 --> 00:28:08,880
Войди в меня сзади... я хочу кончить...
208
00:28:44,960 --> 00:28:49,970
Я будто... весь превращаюсь в твою писю...
209
00:28:59,980 --> 00:29:03,440
Я не выдержу... я сейчас всё...
210
00:29:04,480 --> 00:29:05,570
Моку!
211
00:29:06,230 --> 00:29:08,400
Моку! Моку!
212
00:29:39,270 --> 00:29:40,310
Люблю...
213
00:29:53,000 --> 00:29:55,710
Полюбим мы друг друга
214
00:29:56,620 --> 00:29:59,210
Ещё до поцелуя
215
00:30:00,250 --> 00:30:02,920
Полюбим мы друг друга
216
00:30:03,880 --> 00:30:06,550
В глаза твои взгляну я
217
00:30:07,510 --> 00:30:11,810
И утону в любви твоей
218
00:30:14,810 --> 00:30:16,060
Вот, рука в руке
219
00:30:18,360 --> 00:30:24,360
Мы ждём под светофором
Свет зелёный, загорись
220
00:30:25,240 --> 00:30:27,950
Томный вздох слышу твой
221
00:30:31,160 --> 00:30:33,870
Полюбим мы друг друга
222
00:30:34,830 --> 00:30:37,540
Ещё до поцелуя
223
00:30:38,420 --> 00:30:41,130
Полюбим мы друг друга
224
00:30:42,090 --> 00:30:45,090
И я тебя не отпущу
225
00:30:45,760 --> 00:30:48,430
Над нами то же небо
226
00:30:49,340 --> 00:30:52,060
Поярче засияет
227
00:30:52,970 --> 00:30:55,680
Сильней забьётся сердце
228
00:30:56,600 --> 00:30:59,270
Услышь его ты стук
229
00:31:00,230 --> 00:31:04,570
И ветер мимо пролетит
230
00:31:05,070 --> 00:31:08,610
Счастье - подарю тебе
231
00:31:08,610 --> 00:31:11,450
Счастье - лишь тебе
232
00:31:12,370 --> 00:31:15,870
Счастье - я люблю тебя
233
00:31:15,870 --> 00:31:23,710
Счастье, счастье - лишь тебя, лишь тебя
234
00:31:25,710 --> 00:31:28,380
Полюбим мы друг друга
235
00:31:29,340 --> 00:31:32,050
И вечно будем вместе
236
00:31:32,930 --> 00:31:35,640
Полюбим мы друг друга
237
00:31:36,600 --> 00:31:39,350
В глаза твои взгляну я
238
00:31:40,230 --> 00:31:51,950
И утону в любви твоей
И утону в любви твоей

1273
data/srt/ep2.srt Normal file

File diff suppressed because it is too large Load Diff

1005
data/srt/ep3.srt Normal file

File diff suppressed because it is too large Load Diff

14
main.py Normal file
View File

@ -0,0 +1,14 @@
from PyQt6.QtWidgets import QApplication, QWidget
from windows.mainwindow import MainWindow
import sys
# You need one (and only one) QApplication instance per application.
# Pass in sys.argv to allow command line arguments for your app.
# If you know you won't use command line arguments QApplication([]) works too.
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show() # IMPORTANT!!!!! Windows are hidden by default.
app.exec()

6
tests/test_utils.py Normal file
View File

@ -0,0 +1,6 @@
import pytest
from utils.utils import milliseconds_to_framenumber
@Test
def test_that_the_frame_at_one_second_is_twenty_four():
assert milliseconds_to_framenumber(1000,24) == 24;

130
threads/inputvideo.py Normal file
View File

@ -0,0 +1,130 @@
from PyQt6.QtCore import QThread, pyqtSignal, pyqtSlot, QMutexLocker, QMutex, QObject
import cv2
from time import sleep
import numpy as np
class VideoThread(QObject):
#Input signals
pause_signal = pyqtSignal()
stop_signal = pyqtSignal()
go_to_frame_signal = pyqtSignal(int)
change_fps_signal = pyqtSignal(int)
change_pixmap_signal = pyqtSignal(tuple)
current_frame_signal = pyqtSignal(int)
def __init__(self, cap,type="video"):
super().__init__()
self.frame_index = 0
self.cap_mutex = QMutex()
self.cap = cap
self.fps = 24
self.fps_mutex = QMutex()
self.pause = False
self.pause_mutex = QMutex()
self.stop = False
self.stop_mutex = QMutex()
self.type = type
self.buffered_frame = None
self.frameskip = 0
self.frameskip_mutex = QMutex()
if self.type == "video":
self.get_frame = self.get_frame_video
else:
self.get_frame = self.get_frame_camera
def get_frame_video(self):
with QMutexLocker(self.cap_mutex):
frame_index = int(self.cap.get(cv2.CAP_PROP_POS_FRAMES))
ret, cv_img = self.cap.read()
return ret, cv_img, frame_index
def get_frame_camera(self):
with QMutexLocker(self.cap_mutex):
frame_index = self.frame_index
self.frame_index += 1
ret, cv_img = self.cap.read()
return ret, cv_img, frame_index
@pyqtSlot(int)
def go_to_frame(self, frame):
if self.type != "video":
return
with QMutexLocker(self.cap_mutex):
self.cap.set(cv2.CAP_PROP_POS_FRAMES, frame)
self.current_frame_signal.emit(int(self.cap.get(cv2.CAP_PROP_POS_FRAMES)))
with QMutexLocker(self.pause_mutex):
if self.pause:
_, cv_img = self.cap.read()
self.buffered_frame = cv_img
@pyqtSlot(int)
def change_fps(self, fps):
with QMutexLocker(self.fps_mutex):
self.fps = fps
@pyqtSlot(int)
def change_frameskip(self, frameskip):
with QMutexLocker(self.frameskip_mutex):
self.frameskip = frameskip
@pyqtSlot()
def pause_capture(self):
with QMutexLocker(self.cap_mutex):
with QMutexLocker(self.pause_mutex):
self.pause = not self.pause
if self.type == "video":
self.frame_index = int(self.cap.get(cv2.CAP_PROP_POS_FRAMES))
_, cv_img = self.cap.read()
self.buffered_frame = cv_img
@pyqtSlot()
def stop_capture(self):
with QMutexLocker(self.stop_mutex):
self.stop = True
def run(self):
self.change_fps_signal.connect(self.change_fps)
self.go_to_frame_signal.connect(self.go_to_frame)
self.pause_signal.connect(self.pause_capture)
self.stop_signal.connect(self.stop_capture)
while True:
with QMutexLocker(self.stop_mutex):
if self.stop:
break
fps = None
with QMutexLocker(self.fps_mutex):
fps = self.fps
with QMutexLocker(self.pause_mutex):
if self.pause:
if self.buffered_frame is not None:
self.change_pixmap_signal.emit((self.buffered_frame.copy(),self.frame_index))
sleep(1/fps)
continue
ret, cv_img, frame_count = self.get_frame()
if ret:
current_frame = (cv_img, frame_count)
self.change_pixmap_signal.emit(current_frame)
self.current_frame_signal.emit(int(self.cap.get(cv2.CAP_PROP_POS_FRAMES)))
#next frame
with QMutexLocker(self.frameskip_mutex):
if self.frameskip != 0:
frameskip = self.frameskip
current_frame = int(self.cap.get(cv2.CAP_PROP_POS_FRAMES))
frameskip += 1
next_frame = current_frame if current_frame % frameskip == 0 else current_frame + frameskip - current_frame % frameskip
with QMutexLocker(self.cap_mutex):
self.cap.set(cv2.CAP_PROP_POS_FRAMES, next_frame)
sleep(1/fps)
self.cap.release()
return

73
utils/Subtitles.py Normal file
View File

@ -0,0 +1,73 @@
debug = False
class TimeStamp:
def __init__(self, start, end):
self.start = start
self.end = end
def getStartInMilliseconds(self):
hours, minutes, seconds = self.start.split(':')
return int(hours)*3600000 + int(minutes)*60000 + int(seconds.split(',')[0])*1000 + int(seconds.split(',')[1])
def getEndInMilliseconds(self):
hours, minutes, seconds = self.end.split(':')
return int(hours)*3600000 + int(minutes)*60000 + int(seconds.split(',')[0])*1000 + int(seconds.split(',')[1])
def getStartInSeconds(self):
hours, minutes, seconds = self.start.split(':')
return int(hours)*3600 + int(minutes)*60 + int(seconds.split(',')[0])
def getEndInSeconds(self):
hours, minutes, seconds = self.end.split(':')
return int(hours)*3600 + int(minutes)*60 + int(seconds.split(',')[0])
def getDurationInSeconds(self):
return self.getEndInSeconds() - self.getStartInSeconds()
class Line:
def __init__(self, number, text, start, end):
self.number = number
self.text = text
self.time = TimeStamp(start, end)
def __repr__(self):
return f'{self.time.start} --> {self.time.end}\n{self.text}\n'
def __str__(self):
return f'{self.time.start} --> {self.time.end}\n{self.text}\n'
class Subtitles:
def __init__(self):
self.subtitles = {}
self.number_of_lines = 0
self.timestamps = {}
def load(self,lang, path):
self.subtitles[lang] = {}
with open(path, 'r',encoding='utf-8-sig') as file:
lines = file.readlines()
for i in range(len(lines)):
if lines[i].strip().isdigit():
start, end = lines[i+1].strip().split(' --> ')
text = lines[i+2].strip()
if debug :print(f'{lines[i].strip()} {start} {end} {text}')
self.subtitles[lang][int(lines[i].strip())] = Line(int(lines[i].strip()), text, start, end)
self.timestamps[int(lines[i].strip())] = TimeStamp(start, end)
self.number_of_lines = int(lines[i].strip()) if int(lines[i].strip()) > self.number_of_lines else self.number_of_lines
def getLine(self, lang, number)->Line:
return self.subtitles[lang][number]
def getLine(self, number)->str:
line = ""
for lang in self.subtitles:
if number in self.subtitles[lang]:
line += self.subtitles[lang][number].text + "\n"
return line
def getLines(self, lang):
return self.subtitles[lang]
def getLinesCount(self, lang):
return len(self.subtitles[lang])

14
utils/utils.py Normal file
View File

@ -0,0 +1,14 @@
import math
def milliseconds_to_framenumber(milliseconds,framerate)->int:
"""
This function takes a time in ms and a framerate then converts the time in ms
to a framenumber
:params:
:milliseconds (int) : the millisecond time to convert
:framerate (int) : the framerate of the video
:return (int): the framenumber correspondind to the millisecond
"""
return math.floor(milliseconds * framerate / 1000)

249
windows/HardSubRipper.ui Normal file
View File

@ -0,0 +1,249 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>HardSubRipper</class>
<widget class="QMainWindow" name="HardSubRipper">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>782</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>HardSubRipper</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<layout class="QGridLayout" name="MainLayout">
<item row="0" column="1">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QPushButton" name="opensub">
<property name="text">
<string>Ouvrir des sous titres</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="openvid">
<property name="text">
<string>Ouvir une video</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="selected_sub_label">
<property name="text">
<string>sous titres :</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="selected_video_label">
<property name="text">
<string>video :</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="translate">
<property name="text">
<string>Traduire</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item row="0" column="1">
<layout class="QGridLayout" name="gridLayout">
<item row="2" column="1">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLabel" name="frame_pixmap">
<property name="maximumSize">
<size>
<width>640</width>
<height>360</height>
</size>
</property>
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="xminmax">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>10</height>
</size>
</property>
<property name="text">
<string>X min/max</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QSpinBox" name="xmin"/>
</item>
<item>
<widget class="QSpinBox" name="xmax"/>
</item>
</layout>
</item>
<item>
<widget class="QLabel" name="label_3">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>10</height>
</size>
</property>
<property name="text">
<string>Y min/max</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QSpinBox" name="ymin"/>
</item>
<item>
<widget class="QSpinBox" name="ymax"/>
</item>
</layout>
</item>
<item>
<widget class="QPlainTextEdit" name="translated">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>50</height>
</size>
</property>
</widget>
</item>
<item>
<widget class="QPlainTextEdit" name="ia_translated">
<property name="maximumSize">
<size>
<width>560533</width>
<height>50</height>
</size>
</property>
</widget>
</item>
<item>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<widget class="QSpinBox" name="subcounter"/>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="next">
<property name="text">
<string>Next</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QPushButton" name="previous">
<property name="text">
<string>Previous</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QPushButton" name="gotoframe">
<property name="text">
<string>Go to frame</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item row="3" column="1">
<widget class="QPushButton" name="savetofile">
<property name="text">
<string>Sauvegarder les sous titres</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>782</width>
<height>22</height>
</rect>
</property>
<widget class="QMenu" name="menuFichier">
<property name="title">
<string>Fichier</string>
</property>
<addaction name="actionOuvrir_des_sous_titres"/>
<addaction name="actionOuvrir_une_video"/>
<addaction name="separator"/>
<addaction name="actionEngeristrer_les_sous_titres"/>
<addaction name="separator"/>
<addaction name="actionFermer"/>
</widget>
<widget class="QMenu" name="menuA_propos">
<property name="title">
<string>A propos</string>
</property>
<addaction name="actionA_propos"/>
</widget>
<addaction name="menuFichier"/>
<addaction name="menuA_propos"/>
</widget>
<widget class="QStatusBar" name="statusbar"/>
<action name="actionOuvrir_des_sous_titres">
<property name="text">
<string>Ouvrir des sous titres</string>
</property>
</action>
<action name="actionOuvrir_une_video">
<property name="text">
<string>Ouvrir une video</string>
</property>
</action>
<action name="actionEngeristrer_les_sous_titres">
<property name="text">
<string>Engeristrer les sous titres</string>
</property>
</action>
<action name="actionFermer">
<property name="text">
<string>Fermer</string>
</property>
</action>
<action name="actionA_propos">
<property name="text">
<string>A propos</string>
</property>
</action>
</widget>
<resources/>
<connections/>
</ui>

134
windows/mainwindow.py Normal file
View File

@ -0,0 +1,134 @@
from windows.ui_hardsubripper import Ui_HardSubRipper
from utils.utils import milliseconds_to_framenumber
from PyQt6 import QtWidgets, QtGui, QtCore
import cv2
from utils.Subtitles import Subtitles
class MainWindow(QtWidgets.QMainWindow, Ui_HardSubRipper):
def __init__(self,parent=None):
super(MainWindow,self).__init__(parent)
#
self.video= None
self.subtitles = None
self.cap = None
self.current_subtitle = 0
self.current_frame = 0
self.current_frame_img = None
self.new_subtitles = None
#
self.video_height = 720
self.video_width = 1280
self.setupUi(self)
self.setupPixmap()
self.opensub.clicked.connect(self.load_subtitles)
self.openvid.clicked.connect(self.open_video)
self.next.clicked.connect(self.go_to_next_line)
self.previous.clicked.connect(self.go_to_previous_line)
self.translate.clicked.connect(self.extract_useful_frames)
def translate_all(self):
def setupPixmap(self):
placeholder = QtGui.QPixmap(self.video_width,self.video_height)
placeholder.fill(QtGui.QColor(255,0,0))
self.frame_pixmap.setPixmap(placeholder)
def goToFrame(self,int):
self.cap.set(cv2.CAP_PROP_POS_FRAMES,int)
ret, cv_img = self.cap.read()
self.current_frame_img = cv_img
self.current_frame = int
self.crop_frame()
def crop_frame(self):
x = self.xmin.value()
y = self.ymin.value()
w = self.xmax.value() - x
h = self.ymax.value() - y
cropped = self.current_frame_img[y:y+h, x:x+w]
self.frame_pixmap.setScaledContents(True)
self.frame_pixmap.setPixmap(self.convert_cv_qt(cropped))
def extract_useful_frames(self):
pass
def open_video(self):
self.new_subtitles = {}
path = QtWidgets.QFileDialog.getOpenFileName(self, 'Open file', '.', "Video files (*.mp4 *.avi), All files (*.*)")
if path[0] == '':
return
path = path[0]
self.video = path
self.cap = cv2.VideoCapture(path)
self.video_height = int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
self.video_width = int(self.cap.get(cv2.CAP_PROP_FRAME_WIDTH))
self.current_frame = int(self.cap.get(cv2.CAP_PROP_POS_FRAMES))
self.xmin.setMaximum(self.video_width)
self.xmax.setMaximum(self.video_width)
self.ymin.setMaximum(self.video_height)
self.ymax.setMaximum(self.video_height)
self.xmax.setValue(self.video_width)
self.ymax.setValue(self.video_height)
ret, cv_img = self.cap.read()
self.frame_pixmap.setPixmap(self.convert_cv_qt(cv_img))
self.xmin.valueChanged.connect(self.crop_frame)
self.ymin.valueChanged.connect(self.crop_frame)
self.xmax.valueChanged.connect(self.crop_frame)
self.ymax.valueChanged.connect(self.crop_frame)
def go_to_previous_line(self):
if self.subtitles is None: return
if self.current_subtitle > 1:
self.current_subtitle -= 1
self.translated.document().setPlainText(self.subtitles.getLine(self.current_subtitle))
if self.video is not None:
frame = milliseconds_to_framenumber(self.subtitles.timestamps[self.current_subtitle].getStartInMilliseconds(), self.cap.get(cv2.CAP_PROP_FPS))
self.goToFrame(frame)
def go_to_next_line(self):
if self.subtitles is None: return
if self.current_subtitle < self.subtitles.number_of_lines:
self.current_subtitle += 1
self.translated.document().setPlainText(self.subtitles.getLine(self.current_subtitle))
if self.video is not None:
frame = milliseconds_to_framenumber(self.subtitles.timestamps[self.current_subtitle].getStartInMilliseconds(), self.cap.get(cv2.CAP_PROP_FPS))
self.goToFrame(frame)
def load_subtitles(self):
path = QtWidgets.QFileDialog.getOpenFileName(self, 'Open file', '.', "SubRip files (*.srt), All files (*.*)")
print(path)
if path[0] == '':
return
path = path[0]
#create a widget to ask for the language
lang = QtWidgets.QInputDialog.getText(self, 'Language', 'Enter the language of the subtitles')
if lang[1] == False:
return
self.subtitles = Subtitles()
self.subtitles.load(lang, path)
self.current_subtitle = 1
self.translated.document().setPlainText(self.subtitles.getLine(1))
def convert_cv_qt(self, cv_img):
"""Convert from an opencv image to QPixmap"""
rgb_image = cv2.cvtColor(cv_img, cv2.COLOR_BGR2RGB)
h, w, ch = rgb_image.shape
bytes_per_line = ch * w
convert_to_qt_format = QtGui.QImage(rgb_image.data, w, h, bytes_per_line, QtGui.QImage.Format.Format_RGB888)
p = convert_to_qt_format.scaled(self.video_width, self.video_height, QtCore.Qt.AspectRatioMode.KeepAspectRatio)
return QtGui.QPixmap.fromImage(p)

161
windows/ui_hardsubripper.py Normal file
View File

@ -0,0 +1,161 @@
# Form implementation generated from reading ui file 'HardSubRipper.ui'
#
# Created by: PyQt6 UI code generator 6.6.1
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_HardSubRipper(object):
def setupUi(self, HardSubRipper):
HardSubRipper.setObjectName("HardSubRipper")
HardSubRipper.resize(782, 600)
self.centralwidget = QtWidgets.QWidget(parent=HardSubRipper)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout_2 = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout_2.setObjectName("gridLayout_2")
self.MainLayout = QtWidgets.QGridLayout()
self.MainLayout.setObjectName("MainLayout")
self.verticalLayout = QtWidgets.QVBoxLayout()
self.verticalLayout.setObjectName("verticalLayout")
self.opensub = QtWidgets.QPushButton(parent=self.centralwidget)
self.opensub.setObjectName("opensub")
self.verticalLayout.addWidget(self.opensub)
self.openvid = QtWidgets.QPushButton(parent=self.centralwidget)
self.openvid.setObjectName("openvid")
self.verticalLayout.addWidget(self.openvid)
self.selected_sub_label = QtWidgets.QLabel(parent=self.centralwidget)
self.selected_sub_label.setObjectName("selected_sub_label")
self.verticalLayout.addWidget(self.selected_sub_label)
self.selected_video_label = QtWidgets.QLabel(parent=self.centralwidget)
self.selected_video_label.setObjectName("selected_video_label")
self.verticalLayout.addWidget(self.selected_video_label)
self.translate = QtWidgets.QPushButton(parent=self.centralwidget)
self.translate.setObjectName("translate")
self.verticalLayout.addWidget(self.translate)
self.MainLayout.addLayout(self.verticalLayout, 0, 1, 1, 1)
self.gridLayout_2.addLayout(self.MainLayout, 0, 0, 1, 1)
self.gridLayout = QtWidgets.QGridLayout()
self.gridLayout.setObjectName("gridLayout")
self.verticalLayout_2 = QtWidgets.QVBoxLayout()
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.frame_pixmap = QtWidgets.QLabel(parent=self.centralwidget)
self.frame_pixmap.setMaximumSize(QtCore.QSize(640, 360))
self.frame_pixmap.setObjectName("frame_pixmap")
self.verticalLayout_2.addWidget(self.frame_pixmap)
self.xminmax = QtWidgets.QLabel(parent=self.centralwidget)
self.xminmax.setMaximumSize(QtCore.QSize(16777215, 10))
self.xminmax.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
self.xminmax.setObjectName("xminmax")
self.verticalLayout_2.addWidget(self.xminmax)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.xmin = QtWidgets.QSpinBox(parent=self.centralwidget)
self.xmin.setObjectName("xmin")
self.horizontalLayout.addWidget(self.xmin)
self.xmax = QtWidgets.QSpinBox(parent=self.centralwidget)
self.xmax.setObjectName("xmax")
self.horizontalLayout.addWidget(self.xmax)
self.verticalLayout_2.addLayout(self.horizontalLayout)
self.label_3 = QtWidgets.QLabel(parent=self.centralwidget)
self.label_3.setMaximumSize(QtCore.QSize(16777215, 10))
self.label_3.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
self.label_3.setObjectName("label_3")
self.verticalLayout_2.addWidget(self.label_3)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.ymin = QtWidgets.QSpinBox(parent=self.centralwidget)
self.ymin.setObjectName("ymin")
self.horizontalLayout_2.addWidget(self.ymin)
self.ymax = QtWidgets.QSpinBox(parent=self.centralwidget)
self.ymax.setObjectName("ymax")
self.horizontalLayout_2.addWidget(self.ymax)
self.verticalLayout_2.addLayout(self.horizontalLayout_2)
self.translated = QtWidgets.QPlainTextEdit(parent=self.centralwidget)
self.translated.setMaximumSize(QtCore.QSize(16777215, 50))
self.translated.setObjectName("translated")
self.verticalLayout_2.addWidget(self.translated)
self.ia_translated = QtWidgets.QPlainTextEdit(parent=self.centralwidget)
self.ia_translated.setMaximumSize(QtCore.QSize(560533, 50))
self.ia_translated.setObjectName("ia_translated")
self.verticalLayout_2.addWidget(self.ia_translated)
self.gridLayout_3 = QtWidgets.QGridLayout()
self.gridLayout_3.setObjectName("gridLayout_3")
self.subcounter = QtWidgets.QSpinBox(parent=self.centralwidget)
self.subcounter.setObjectName("subcounter")
self.gridLayout_3.addWidget(self.subcounter, 0, 0, 1, 1)
self.next = QtWidgets.QPushButton(parent=self.centralwidget)
self.next.setObjectName("next")
self.gridLayout_3.addWidget(self.next, 1, 1, 1, 1)
self.previous = QtWidgets.QPushButton(parent=self.centralwidget)
self.previous.setObjectName("previous")
self.gridLayout_3.addWidget(self.previous, 1, 0, 1, 1)
self.gotoframe = QtWidgets.QPushButton(parent=self.centralwidget)
self.gotoframe.setObjectName("gotoframe")
self.gridLayout_3.addWidget(self.gotoframe, 0, 1, 1, 1)
self.verticalLayout_2.addLayout(self.gridLayout_3)
self.gridLayout.addLayout(self.verticalLayout_2, 2, 1, 1, 1)
self.savetofile = QtWidgets.QPushButton(parent=self.centralwidget)
self.savetofile.setObjectName("savetofile")
self.gridLayout.addWidget(self.savetofile, 3, 1, 1, 1)
self.gridLayout_2.addLayout(self.gridLayout, 0, 1, 1, 1)
HardSubRipper.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(parent=HardSubRipper)
self.menubar.setGeometry(QtCore.QRect(0, 0, 782, 22))
self.menubar.setObjectName("menubar")
self.menuFichier = QtWidgets.QMenu(parent=self.menubar)
self.menuFichier.setObjectName("menuFichier")
self.menuA_propos = QtWidgets.QMenu(parent=self.menubar)
self.menuA_propos.setObjectName("menuA_propos")
HardSubRipper.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(parent=HardSubRipper)
self.statusbar.setObjectName("statusbar")
HardSubRipper.setStatusBar(self.statusbar)
self.actionOuvrir_des_sous_titres = QtGui.QAction(parent=HardSubRipper)
self.actionOuvrir_des_sous_titres.setObjectName("actionOuvrir_des_sous_titres")
self.actionOuvrir_une_video = QtGui.QAction(parent=HardSubRipper)
self.actionOuvrir_une_video.setObjectName("actionOuvrir_une_video")
self.actionEngeristrer_les_sous_titres = QtGui.QAction(parent=HardSubRipper)
self.actionEngeristrer_les_sous_titres.setObjectName("actionEngeristrer_les_sous_titres")
self.actionFermer = QtGui.QAction(parent=HardSubRipper)
self.actionFermer.setObjectName("actionFermer")
self.actionA_propos = QtGui.QAction(parent=HardSubRipper)
self.actionA_propos.setObjectName("actionA_propos")
self.menuFichier.addAction(self.actionOuvrir_des_sous_titres)
self.menuFichier.addAction(self.actionOuvrir_une_video)
self.menuFichier.addSeparator()
self.menuFichier.addAction(self.actionEngeristrer_les_sous_titres)
self.menuFichier.addSeparator()
self.menuFichier.addAction(self.actionFermer)
self.menuA_propos.addAction(self.actionA_propos)
self.menubar.addAction(self.menuFichier.menuAction())
self.menubar.addAction(self.menuA_propos.menuAction())
self.retranslateUi(HardSubRipper)
QtCore.QMetaObject.connectSlotsByName(HardSubRipper)
def retranslateUi(self, HardSubRipper):
_translate = QtCore.QCoreApplication.translate
HardSubRipper.setWindowTitle(_translate("HardSubRipper", "HardSubRipper"))
self.opensub.setText(_translate("HardSubRipper", "Ouvrir des sous titres"))
self.openvid.setText(_translate("HardSubRipper", "Ouvir une video"))
self.selected_sub_label.setText(_translate("HardSubRipper", "sous titres :"))
self.selected_video_label.setText(_translate("HardSubRipper", "video :"))
self.translate.setText(_translate("HardSubRipper", "Traduire"))
self.frame_pixmap.setText(_translate("HardSubRipper", "TextLabel"))
self.xminmax.setText(_translate("HardSubRipper", "X min/max"))
self.label_3.setText(_translate("HardSubRipper", "Y min/max"))
self.next.setText(_translate("HardSubRipper", "Next"))
self.previous.setText(_translate("HardSubRipper", "Previous"))
self.gotoframe.setText(_translate("HardSubRipper", "Go to frame"))
self.savetofile.setText(_translate("HardSubRipper", "Sauvegarder les sous titres"))
self.menuFichier.setTitle(_translate("HardSubRipper", "Fichier"))
self.menuA_propos.setTitle(_translate("HardSubRipper", "A propos"))
self.actionOuvrir_des_sous_titres.setText(_translate("HardSubRipper", "Ouvrir des sous titres"))
self.actionOuvrir_une_video.setText(_translate("HardSubRipper", "Ouvrir une video"))
self.actionEngeristrer_les_sous_titres.setText(_translate("HardSubRipper", "Engeristrer les sous titres"))
self.actionFermer.setText(_translate("HardSubRipper", "Fermer"))
self.actionA_propos.setText(_translate("HardSubRipper", "A propos"))