1 diff --git a/mytube/meta/plugin_mytube.xml b/mytube/meta/plugin_mytube.xml
2 index eb2a0fd..56e1686 100644
3 --- a/mytube/meta/plugin_mytube.xml
4 +++ b/mytube/meta/plugin_mytube.xml
6 <hardware type="dm8000" />
7 <hardware type="dm800" />
8 <hardware type="dm800se" />
9 - <hardware type="dm500hd" />
10 + <hardware type="dm500hd" />
11 + <hardware type="dm7020hd" />
12 <tag type="Multimedia" />
15 diff --git a/mytube/po/de.po b/mytube/po/de.po
16 index b487673..c56c84e 100644
19 @@ -7,9 +7,9 @@ msgid ""
21 "Project-Id-Version: tuxbox-enigma 0.0.1\n"
22 "Report-Msgid-Bugs-To: \n"
23 -"POT-Creation-Date: 2009-05-29 17:38+0200\n"
24 -"PO-Revision-Date: 2008-05-16 17:15+0100\n"
25 -"Last-Translator: Stefan Pluecken <mladen.horvat@multimedia-labs.de>\n"
26 +"POT-Creation-Date: 2011-06-12 19:07+0100\n"
27 +"PO-Revision-Date: 2011-06-12 19:22+0100\n"
28 +"Last-Translator: JuSt611 <Software@Strasdas.de>\n"
29 "Language-Team: none\n"
31 "Content-Type: text/plain; charset=UTF-8\n"
32 @@ -18,448 +18,690 @@ msgstr ""
33 "X-Poedit-Language: German\n"
34 "X-Poedit-Country: GERMANY\n"
35 "X-Poedit-SourceCharset: iso-8859-15\n"
36 +"X-Poedit-Basepath: .\n"
37 +"X-Poedit-SearchPath-0: ../src\n"
41 +#: ../src/MyTubeSearch.py:161
42 +#: ../src/plugin.py:52
47 -msgstr "Hinzugefügt: "
48 +#: ../src/MyTubeSearch.py:162
49 +#: ../src/plugin.py:53
55 +#: ../src/MyTubeSearch.py:163
56 +#: ../src/plugin.py:54
58 +msgstr "Veröffentlicht"
60 +#: ../src/MyTubeSearch.py:164
61 +#: ../src/plugin.py:55
65 +#: ../src/MyTubeSearch.py:168
66 +#: ../src/plugin.py:59
71 -msgid "An error occured."
72 -msgstr "Es ist ein Fehler aufgetreten."
73 +#: ../src/MyTubeSearch.py:169
74 +#: ../src/plugin.py:60
76 +msgstr "Diesen Monat"
80 +#: ../src/MyTubeSearch.py:170
81 +#: ../src/plugin.py:61
86 -msgstr "Nutzer fragen"
87 +#: ../src/MyTubeSearch.py:171
88 +#: ../src/plugin.py:62
94 +#: ../src/MyTubeSearch.py:175
95 +#: ../src/plugin.py:66
96 +#: ../src/plugin.py:619
97 +#: ../src/plugin.py:625
98 +#: ../src/plugin.py:1743
104 +#: ../src/MyTubeSearch.py:176
105 +#: ../src/plugin.py:67
106 +#: ../src/plugin.py:620
107 +#: ../src/plugin.py:626
111 +#: ../src/MyTubeSearch.py:180
112 +#: ../src/MyTubeSearch.py:200
113 +#: ../src/plugin.py:71
114 +#: ../src/plugin.py:91
118 +#: ../src/MyTubeSearch.py:181
119 +#: ../src/plugin.py:72
120 +msgid "Film & Animation"
121 +msgstr "Film & Animation"
123 +#: ../src/MyTubeSearch.py:182
124 +#: ../src/plugin.py:73
125 msgid "Autos & Vehicles"
126 msgstr "Autos und Fahrzeuge"
130 +#: ../src/MyTubeSearch.py:183
131 +#: ../src/plugin.py:74
137 +#: ../src/MyTubeSearch.py:184
138 +#: ../src/plugin.py:75
139 +msgid "Pets & Animals"
142 -msgid "Choose target folder"
143 -msgstr "Wähle Zielverzeichnis"
144 +#: ../src/MyTubeSearch.py:185
145 +#: ../src/plugin.py:76
149 -msgid "Clear history on Exit:"
150 -msgstr "Verlauf beim Verlassen löschen:"
151 +#: ../src/MyTubeSearch.py:186
152 +#: ../src/plugin.py:77
153 +msgid "Travel & Events"
154 +msgstr "Reisen & Events"
158 +#: ../src/MyTubeSearch.py:187
159 +#: ../src/plugin.py:78
160 +msgid "Short Movies"
163 +#: ../src/MyTubeSearch.py:188
164 +#: ../src/plugin.py:79
168 +#: ../src/MyTubeSearch.py:189
169 +#: ../src/plugin.py:80
173 -msgid "Czech Republic"
179 -msgid "Display search results by:"
180 -msgstr "Suchergebnisse anzeigen:"
182 -msgid "Do you want to see more entries?"
183 -msgstr "Weitere Videos?"
185 -msgid "Download Video"
186 -msgstr "Video runterladen"
188 -msgid "Download location"
189 -msgstr "Download Verzeichnis:"
190 +#: ../src/MyTubeSearch.py:190
191 +#: ../src/plugin.py:81
192 +msgid "People & Blogs"
193 +msgstr "Leute & Blogs"
195 -msgid "Downloading screenshots. Please wait..."
196 -msgstr "Bilder werden geladen. Bitte warten..."
197 +#: ../src/MyTubeSearch.py:191
198 +#: ../src/plugin.py:82
199 +msgid "News & Politics"
200 +msgstr "Nachrichten & Politik"
204 +#: ../src/MyTubeSearch.py:192
205 +#: ../src/plugin.py:83
206 +msgid "Entertainment"
207 +msgstr "Unterhaltung"
209 +#: ../src/MyTubeSearch.py:193
210 +#: ../src/plugin.py:84
214 -msgid "Enter your search term(s)"
215 -msgstr "Suchbegriff eingeben"
216 +#: ../src/MyTubeSearch.py:194
217 +#: ../src/plugin.py:85
218 +msgid "Howto & Style"
219 +msgstr "Tipps & Tricks"
221 -msgid "Entertainment"
222 -msgstr "Unterhaltung"
223 +#: ../src/MyTubeSearch.py:195
224 +#: ../src/plugin.py:86
225 +msgid "Nonprofits & Activism"
228 -msgid "Fetching feed entries"
230 +#: ../src/MyTubeSearch.py:196
231 +#: ../src/plugin.py:87
232 +msgid "Science & Technology"
233 +msgstr "Wissenschaft & Technik"
235 -msgid "Fetching search entries"
236 -msgstr "Lade Suchergebnisse"
237 +#: ../src/MyTubeSearch.py:201
238 +#: ../src/MyTubeSearch.py:208
239 +#: ../src/plugin.py:92
240 +#: ../src/plugin.py:99
244 -msgid "Film & Animation"
245 -msgstr "Film & Animation"
246 +#: ../src/MyTubeSearch.py:202
247 +#: ../src/plugin.py:93
251 +#: ../src/MyTubeSearch.py:203
252 +#: ../src/plugin.py:94
256 +#: ../src/MyTubeSearch.py:204
257 +#: ../src/plugin.py:95
258 +msgid "Czech Republic"
261 +#: ../src/MyTubeSearch.py:205
262 +#: ../src/plugin.py:96
269 +#: ../src/MyTubeSearch.py:206
270 +#: ../src/plugin.py:97
274 +#: ../src/MyTubeSearch.py:207
275 +#: ../src/plugin.py:98
276 msgid "Great Britain"
288 +#: ../src/MyTubeSearch.py:209
289 +#: ../src/plugin.py:100
293 +#: ../src/MyTubeSearch.py:210
294 +#: ../src/plugin.py:101
298 -msgid "Howto & Style"
299 -msgstr "Tipps & Tricks"
301 +#: ../src/MyTubeSearch.py:211
302 +#: ../src/plugin.py:102
306 +#: ../src/MyTubeSearch.py:212
307 +#: ../src/plugin.py:103
311 +#: ../src/MyTubeSearch.py:213
312 +#: ../src/plugin.py:104
316 +#: ../src/MyTubeSearch.py:214
317 +#: ../src/plugin.py:105
321 +#: ../src/MyTubeSearch.py:215
322 +#: ../src/plugin.py:106
326 -msgid "Load feed on startup:"
327 -msgstr "Feed beim Starten laden:"
329 +#: ../src/MyTubeSearch.py:216
330 +#: ../src/plugin.py:107
334 -msgid "More video entries."
335 -msgstr "Weitere Video Einträge."
336 +#: ../src/MyTubeSearch.py:217
337 +#: ../src/plugin.py:108
341 -msgid "Most discussed"
342 -msgstr "Heiß diskutiert"
343 +#: ../src/MyTubeSearch.py:218
344 +#: ../src/plugin.py:109
349 -msgstr "Am meisten verlinkt"
350 +#: ../src/MyTubeSearch.py:219
351 +#: ../src/plugin.py:110
355 -msgid "Most popular"
356 -msgstr "Beliebteste Videos"
357 +#: ../src/MyTubeSearch.py:220
358 +#: ../src/plugin.py:111
363 -msgstr "Neueste Videos"
364 +#: ../src/MyTubeSearch.py:221
365 +#: ../src/plugin.py:112
369 -msgid "Most responded"
370 -msgstr "Meiste Antworten"
371 +#: ../src/MyTubeSearch.py:222
372 +#: ../src/plugin.py:113
377 -msgstr "Meistgesehen"
378 +#: ../src/MyTubeSearch.py:223
379 +#: ../src/plugin.py:114
385 +#: ../src/MyTubeSearch.py:224
386 +#: ../src/plugin.py:115
387 +msgid "United States"
390 -msgid "My TubePlayer"
391 -msgstr "MyTube Player"
392 +#: ../src/MyTubeSearch.py:228
393 +#: ../src/plugin.py:119
395 +msgstr "Aufsteigend"
397 -msgid "MyTube Settings"
398 -msgstr "MyTube Einstellungen"
399 +#: ../src/MyTubeSearch.py:229
400 +#: ../src/plugin.py:120
404 -msgid "MyTubePlayer"
405 -msgstr "MyTube Player"
406 +#: ../src/MyTubeSearch.py:237
407 +#: ../src/plugin.py:128
408 +#: ../src/plugin.py:790
412 -msgid "MyTubePlayer Help"
413 -msgstr "MyTube Player Hilfe"
414 +#: ../src/MyTubeSearch.py:238
415 +#: ../src/plugin.py:129
416 +#: ../src/plugin.py:794
418 +msgstr "Meistgesehen"
420 -msgid "MyTubePlayer active video downloads"
421 -msgstr "aktive Video downloads"
422 +#: ../src/MyTubeSearch.py:239
423 +#: ../src/plugin.py:130
424 +#: ../src/plugin.py:792
426 +msgstr "Beste Bewertung"
428 -msgid "MyTubePlayer settings"
429 -msgstr "MyTube Player Einstellungen"
430 +#: ../src/MyTubeSearch.py:240
431 +#: ../src/plugin.py:131
432 +#: ../src/plugin.py:799
433 +msgid "Recently featured"
434 +msgstr "Kürzlich featured"
436 -msgid "MyTubeVideoInfoScreen"
437 -msgstr "MyTubeVideoInfoScreen"
438 +#: ../src/MyTubeSearch.py:241
439 +#: ../src/plugin.py:132
440 +#: ../src/plugin.py:797
441 +msgid "Most discussed"
442 +msgstr "Heiß diskutiert"
444 -msgid "MyTubeVideohelpScreen"
445 -msgstr "MyTubeVideohelpScreen"
446 +#: ../src/MyTubeSearch.py:242
447 +#: ../src/plugin.py:133
448 +#: ../src/plugin.py:793
449 +msgid "Top favorites"
450 +msgstr "Top-Favoriten"
453 -msgstr "Neu Seeland"
454 +#: ../src/MyTubeSearch.py:243
455 +#: ../src/plugin.py:134
456 +#: ../src/plugin.py:798
458 +msgstr "Am meisten verlinkt"
460 -msgid "News & Politics"
461 -msgstr "Nachrichten & Politik"
462 +#: ../src/MyTubeSearch.py:244
463 +#: ../src/plugin.py:135
464 +#: ../src/plugin.py:800
465 +msgid "Most responded"
466 +msgstr "Meiste Antworten"
470 +#: ../src/MyTubeSearch.py:245
471 +#: ../src/plugin.py:136
472 +#: ../src/plugin.py:796
474 +msgstr "Neueste Videos"
476 -msgid "No playable video found! Stop playing this movie?"
477 -msgstr "Kein abspielbares Video gefunden! Wiedergabe beenden?"
478 +#: ../src/MyTubeSearch.py:249
479 +#: ../src/MyTubeSearch.py:252
480 +#: ../src/plugin.py:139
481 +#: ../src/plugin.py:142
483 +msgstr "Nutzer fragen"
485 -msgid "No videos to display"
486 -msgstr "Keine Videos zum anzeigen"
487 +#: ../src/MyTubeSearch.py:249
488 +#: ../src/MyTubeSearch.py:252
489 +#: ../src/plugin.py:139
490 +#: ../src/plugin.py:142
491 +msgid "Return to movie list"
492 +msgstr "Zurück zur Videoliste"
494 -msgid "No, but play video again"
495 -msgstr "Nein, aber Video noch mal abspielen"
496 +#: ../src/MyTubeSearch.py:249
497 +#: ../src/plugin.py:139
498 +msgid "Play next video"
499 +msgstr "nächstes Video"
501 -msgid "No, but switch to video entries."
502 -msgstr "Nein, aber zu den Videos zurück."
503 +#: ../src/MyTubeSearch.py:249
504 +#: ../src/plugin.py:139
505 +msgid "Play video again"
506 +msgstr "Video noch mal abspielen"
508 -msgid "No, but switch to video search."
509 -msgstr "Nein, aber zur Videosuche zurück"
510 +#: ../src/MyTubeSearch.py:314
512 +msgstr " Ergebnisse"
514 -msgid "Nonprofits & Activism"
516 +#: ../src/MyTubeSearch.py:398
517 +#: ../src/MyTubeSearch.py:562
518 +#: ../src/plugin.py:281
519 +#: ../src/plugin.py:1280
520 +#: ../src/plugin.py:1466
524 -msgid "Not fetching feed entries"
525 -msgstr "Lade keine feed Einträge"
526 +#: ../src/MyTubeSearch.py:399
530 -msgid "People & Blogs"
531 -msgstr "Leute & Blogs"
532 +#: ../src/MyTubeSearch.py:412
533 +#: ../src/MyTubeSearch.py:415
534 +msgid "MyTubePlayer settings"
535 +msgstr "MyTube Player Einstellungen"
537 -msgid "Pets & Animals"
539 +#: ../src/MyTubeSearch.py:419
540 +msgid "Display search results by:"
541 +msgstr "Suchergebnisse anzeigen:"
543 -msgid "Play YouTube movies"
544 -msgstr "YouTube Videos abspielen"
545 +#: ../src/MyTubeSearch.py:420
546 +msgid "Search restricted content:"
547 +msgstr "Suche ohne Altersbeschränkung:"
549 -msgid "Play next video"
550 -msgstr "nächstes Video"
551 +#: ../src/MyTubeSearch.py:421
552 +msgid "Search category:"
553 +msgstr "Such-Kategorie:"
555 -msgid "Play video again"
556 -msgstr "Video noch mal abspielen"
557 +#: ../src/MyTubeSearch.py:422
558 +msgid "Search region:"
559 +msgstr "Such-Region:"
561 -msgid "Please enter your search term."
562 -msgstr "Bitte geben Sie einen Suchbegriff ein."
563 +#: ../src/MyTubeSearch.py:423
564 +msgid "Load feed on startup:"
565 +msgstr "Feed beim Starten laden:"
567 -msgid "Please select a standard feed or try searching for videos."
568 -msgstr "Wählen Sie einen Standard Feed oder suchen Sie nach Videos."
569 +#: ../src/MyTubeSearch.py:426
570 +msgid "Start with following feed:"
571 +msgstr "Beginne mit folgendem feed:"
575 +#: ../src/MyTubeSearch.py:427
576 +msgid "Videoplayer stop/exit behavior:"
577 +msgstr "Verhalten beim Drücken der STOPP/EXIT-Taste:"
580 -msgstr "Veröffentlicht"
581 +#: ../src/MyTubeSearch.py:428
582 +msgid "Videobrowser exit behavior:"
583 +msgstr "Verhalten nach Verlassen der Videoliste:"
587 +#: ../src/MyTubeSearch.py:435
588 +msgid "Download location"
589 +msgstr "Download Verzeichnis:"
592 -msgstr "Bewertungen: "
593 +#: ../src/MyTubeSearch.py:438
594 +msgid "Clear history on Exit:"
595 +msgstr "Verlauf beim Verlassen löschen:"
597 -msgid "Really quit MyTube Player?"
598 -msgstr "MyTube Player wirklich beenden?"
599 +#: ../src/MyTubeSearch.py:459
600 +msgid "Choose target folder"
601 +msgstr "Wähle Zielverzeichnis"
603 -msgid "Recently featured"
604 -msgstr "Kürzlich featured"
605 +#: ../src/MyTubeSearch.py:575
606 +#: ../src/MyTubeSearch.py:591
607 +msgid "MyTubePlayer active video downloads"
608 +msgstr "aktive Video downloads"
610 -msgid "Related video entries."
611 -msgstr "Ähnliche Videos"
612 +#: ../src/plugin.py:271
614 +"Welcome to the MyTube Youtube Player.\n"
616 +"While entering your search term(s) you will get suggestions displayed matching your search term.\n"
618 +"To select a suggestion press DOWN on your remote, select the desired result and press OK on your remote to start the search.\n"
620 +"Press exit to get back to the input field."
622 +"Herzlich Willkommen beim MyTube YouTube Player.\n"
624 +"Während der Eingabe Ihres Suchwortes erhalten Sie passende Vorschläge zu Ihrer Sucheingabe.\n"
626 +"Um einen Vorschlag auszuwählen, drücken Sie die NACH UNTEN-Taste, wählen den entsprechenden Eintrag aus und drücken die OK-Taste um die Suche zu starten.\n"
628 +"Um zur Such-Eingabemaske zurück zu gelangen, drücken Sie die EXIT-Taste."
632 +#: ../src/plugin.py:272
634 +"Welcome to the MyTube Youtube Player.\n"
636 +"Use the Bouqet+ button to navigate to the search field and the Bouqet- to navigate to the video entries.\n"
638 +"To play a movie just press OK on your remote control.\n"
640 +"Press info to see the movie description.\n"
642 +"Press the Menu button for additional options.\n"
644 +"The Help button shows this help again."
646 +"Herzlich Willkommen beim MyTube YouTube Player.\n"
648 +"Nutzen Sie die Bouqet+ Taste um zur Sucheingabe zu gelangen und die Bouqet- Taste für die Video Einträge.\n"
650 +"Um ein Video abzuspielen drücken Sie die OK-Taste auf Ihrer Fernbedienung.\n"
652 +"Mit der Info-Taste erhalten Sie die erweiterte Beschreibung zu einem Video.\n"
654 +"Für weitere Einstellungen drücken Sie die Menü-Taste.\n"
656 +"Um diese Hilfe erneut anzuzeigen, drücken Sie die Hilfe-Taste."
658 -msgid "Response video entries."
659 -msgstr "Video Antworten"
660 +#: ../src/plugin.py:282
664 -msgid "Return to movie list"
665 -msgstr "Zurück zur Videoliste"
666 +#: ../src/plugin.py:283
672 +#: ../src/plugin.py:398
673 +#: ../src/plugin.py:422
674 +#: ../src/plugin.py:464
675 +msgid "Genuine Dreambox validation failed!"
676 +msgstr "Prüfung auf Original-Dreambox gescheitert!"
680 +#: ../src/plugin.py:398
681 +#: ../src/plugin.py:422
682 +#: ../src/plugin.py:464
683 +msgid "Verify your Dreambox authenticity by running the genuine dreambox plugin!"
684 +msgstr "Bitte mit dem \"Genuine Dreambox Plugin\" auf Echtheit prüfen!"
686 -msgid "Science & Technology"
687 -msgstr "Wissenschaft & Technik"
688 +#: ../src/plugin.py:417
689 +#: ../src/plugin.py:476
690 +msgid "Fetching feed entries"
693 +#: ../src/plugin.py:417
694 +#: ../src/plugin.py:476
695 +msgid "Trying to download the Youtube feed entries. Please wait..."
696 +msgstr "YouTube feeds werden geladen, bitte warten..."
698 +#: ../src/plugin.py:434
699 +msgid "MyTubePlayer"
700 +msgstr "MyTube Player"
702 +#: ../src/plugin.py:438
703 msgid "Search Term(s)"
706 -msgid "Search category:"
707 -msgstr "Such-Kategorie:"
708 +#: ../src/plugin.py:478
709 +msgid "Fetching search entries"
710 +msgstr "Lade Suchergebnisse"
712 -msgid "Search region:"
713 -msgstr "Such-Region:"
714 +#: ../src/plugin.py:478
715 +msgid "Trying to download the Youtube search results. Please wait..."
716 +msgstr "YouTube Suchergebnisse werden geladen, bitte warten..."
718 -msgid "Search restricted content:"
719 -msgstr "Suche ohne Altersbeschränkung:"
720 +#: ../src/plugin.py:480
721 +msgid "An error occured."
722 +msgstr "Es ist ein Fehler aufgetreten."
724 -msgid "Select new feed to view."
725 -msgstr "Neuen feed auswählen"
726 +#: ../src/plugin.py:480
727 +msgid "There was an error getting the feed entries. Please try again."
728 +msgstr "Fehler beim Laden der Suchergebnisse. Noch mal probieren."
730 -msgid "Select your choice."
731 -msgstr "Treffen Sie Ihre Wahl."
732 +#: ../src/plugin.py:483
733 +msgid "No videos to display"
734 +msgstr "Keine Videos zum anzeigen"
736 -msgid "Short Movies"
738 +#: ../src/plugin.py:483
739 +msgid "Please select a standard feed or try searching for videos."
740 +msgstr "Wählen Sie einen Standard Feed oder suchen Sie nach Videos."
742 -msgid "Sorry, video is not available!"
743 -msgstr "Video nicht verfügbar!"
744 +#: ../src/plugin.py:485
745 +msgid "Not fetching feed entries"
746 +msgstr "Lade keine feed Einträge"
750 +#: ../src/plugin.py:485
751 +msgid "Please enter your search term."
752 +msgstr "Bitte geben Sie einen Suchbegriff ein."
756 +#: ../src/plugin.py:504
757 +#: ../src/plugin.py:506
758 +#: ../src/plugin.py:513
759 +msgid "MyTubePlayer Help"
760 +msgstr "MyTube Player Hilfe"
764 +#: ../src/plugin.py:525
765 +#: ../src/plugin.py:531
766 +msgid "MyTube Settings"
767 +msgstr "MyTube Einstellungen"
769 -msgid "Start with following feed:"
770 -msgstr "Beginne mit folgendem feed:"
771 +#: ../src/plugin.py:528
772 +#: ../src/plugin.py:543
773 +msgid "Select your choice."
774 +msgstr "Treffen Sie Ihre Wahl."
778 +#: ../src/plugin.py:533
779 +msgid "View related videos"
780 +msgstr "Ähnliche Videos"
782 -msgid "Stop playing this movie?"
783 -msgstr "Wiedergabe beenden?"
784 +#: ../src/plugin.py:534
785 +msgid "View response videos"
786 +msgstr "Video Antworten"
790 +#: ../src/plugin.py:538
791 +msgid "Download Video"
792 +msgstr "Video runterladen"
796 +#: ../src/plugin.py:539
797 +msgid "View active downloads"
798 +msgstr "Aktive Downloads anzeigen"
802 +#: ../src/plugin.py:577
803 +msgid "Enter your search term(s)"
804 +msgstr "Suchbegriff eingeben"
806 -msgid "There was an error getting the feed entries. Please try again."
807 -msgstr "Fehler beim Laden der Suchergebnisse. Noch mal probieren."
808 +#: ../src/plugin.py:621
809 +msgid "No, but switch to video entries."
810 +msgstr "Nein, aber zu den Videos zurück."
813 -msgstr "Diesen Monat"
814 +#: ../src/plugin.py:627
815 +msgid "No, but switch to video search."
816 +msgstr "Nein, aber zur Videosuche zurück"
819 -msgstr "Diese Woche"
820 +#: ../src/plugin.py:629
821 +msgid "Really quit MyTube Player?"
822 +msgstr "MyTube Player wirklich beenden?"
824 -msgid "This is the help screen. Feed me with something to display."
826 +#: ../src/plugin.py:722
827 +msgid "Sorry, video is not available!"
828 +msgstr "Video nicht verfügbar!"
832 +#: ../src/plugin.py:757
833 +msgid "Do you want to see more entries?"
834 +msgstr "Weitere Videos?"
836 -msgid "Top favorites"
837 -msgstr "Top-Favoriten"
838 +#: ../src/plugin.py:795
839 +msgid "Most popular"
840 +msgstr "Beliebteste Videos"
843 -msgstr "Beste Bewertung"
844 +#: ../src/plugin.py:802
845 +msgid "Select new feed to view."
846 +msgstr "Neuen feed auswählen"
848 -msgid "Travel & Events"
849 -msgstr "Reisen & Events"
850 +#: ../src/plugin.py:968
851 +msgid "More video entries."
852 +msgstr "Weitere Video Einträge."
854 -msgid "Trying to download the Youtube feed entries. Please wait..."
855 -msgstr "YouTube feeds werden geladen, bitte warten..."
856 +#: ../src/plugin.py:976
857 +msgid "Related video entries."
858 +msgstr "Ähnliche Videos"
860 -msgid "Trying to download the Youtube search results. Please wait..."
861 -msgstr "YouTube Suchergebnisse werden geladen, bitte warten..."
862 +#: ../src/plugin.py:984
863 +msgid "Response video entries."
864 +msgstr "Video Antworten"
866 -msgid "United States"
868 +#: ../src/plugin.py:1103
869 +#: ../src/plugin.py:1341
871 +msgstr "Hinzugefügt: "
873 -msgid "Videobrowser exit behavior:"
874 -msgstr "Verhalten nach Verlassen der Videoliste:"
875 +#: ../src/plugin.py:1103
876 +#: ../src/plugin.py:1344
880 -msgid "Videoplayer stop/exit behavior:"
881 -msgstr "Verhalten beim Drücken der STOPP/EXIT-Taste:"
882 +#: ../src/plugin.py:1103
883 +#: ../src/plugin.py:1335
889 +#: ../src/plugin.py:1103
891 +msgstr "Bewertungen: "
893 -msgid "View active downloads"
894 -msgstr "Aktive Downloads anzeigen"
895 +#: ../src/plugin.py:1309
896 +msgid "Downloading screenshots. Please wait..."
897 +msgstr "Bilder werden geladen. Bitte warten..."
899 -msgid "View related videos"
900 -msgstr "Ähnliche Videos"
901 +#: ../src/plugin.py:1338
905 -msgid "View response videos"
906 -msgstr "Video Antworten"
907 +#: ../src/plugin.py:1347
913 +#: ../src/plugin.py:1350
914 +msgid "MyTubeVideoInfoScreen"
915 +msgstr "MyTubeVideoInfoScreen"
918 -"Welcome to the MyTube Youtube Player.\n"
920 -"Use the Bouqet+ button to navigate to the search field and the Bouqet- to "
921 -"navigate to the video entries.\n"
923 -"To play a movie just press OK on your remote control.\n"
925 -"Press info to see the movie description.\n"
927 -"Press the Menu button for additional options.\n"
929 -"The Help button shows this help again."
931 -"Herzlich Willkommen beim MyTube YouTube Player.\n"
933 -"Nutzen Sie die Bouqet+ Taste um zur Sucheingabe zu gelangen und die Bouqet- "
934 -"Taste für die Video Einträge.\n"
936 -"Um ein Video abzuspielen drücken Sie die OK-Taste auf Ihrer Fernbedienung.\n"
938 -"Mit der Info-Taste erhalten Sie die erweiterte Beschreibung zu einem Video.\n"
940 -"Für weitere Einstellungen drücken Sie die Menü-Taste.\n"
942 -"Um diese Hilfe erneut anzuzeigen, drücken Sie die Hilfe-Taste."
943 +#: ../src/plugin.py:1484
948 -"Welcome to the MyTube Youtube Player.\n"
950 -"While entering your search term(s) you will get suggestions displayed "
951 -"matching your search term.\n"
953 -"To select a suggestion press DOWN on your remote, select the desired result "
954 -"and press OK on your remote to start the search.\n"
956 -"Press exit to get back to the input field."
958 -"Herzlich Willkommen beim MyTube YouTube Player.\n"
960 -"Während der Eingabe Ihres Suchwortes erhalten Sie passende Vorschläge zu "
961 -"Ihrer Sucheingabe.\n"
963 -"Um einen Vorschlag auszuwählen drücken Sie die NACH UNTEN-Taste, wählen den "
964 -"entsprechenden Eintrag aus und drücken die OK-Taste um die Suche zu "
967 -"Um zur Such-Eingabemaske zurück zu gelangen drücken Sie die EXIT-Taste."
968 +#: ../src/plugin.py:1488
969 +msgid "This is the help screen. Feed me with something to display."
970 +msgstr "Dies ist die MyTube Hilfe. Bitte ausfüllen."
974 +#: ../src/plugin.py:1493
975 +msgid "MyTubeVideohelpScreen"
976 +msgstr "MyTubeVideohelpScreen"
978 +#: ../src/plugin.py:1744
979 +msgid "No, but play video again"
980 +msgstr "Nein, aber Video noch mal abspielen"
982 +#: ../src/plugin.py:1745
983 msgid "Yes, but play next video"
984 msgstr "Ja, aber nächstes Video abspielen"
986 +#: ../src/plugin.py:1746
987 msgid "Yes, but play previous video"
988 msgstr "Ja, aber vorheriges Video abspielen"
990 +#: ../src/plugin.py:1749
991 +msgid "Stop playing this movie?"
992 +msgstr "Wiedergabe beenden?"
994 +#: ../src/plugin.py:1751
995 +msgid "No playable video found! Stop playing this movie?"
996 +msgstr "Kein abspielbares Video gefunden! Wiedergabe beenden?"
998 +#: ../src/plugin.py:1797
999 +msgid "My TubePlayer"
1000 +msgstr "MyTube Player"
1002 +#: ../src/plugin.py:1798
1003 +msgid "Play YouTube movies"
1004 +msgstr "YouTube Videos abspielen"
1006 #~ msgid "View Downloads"
1007 #~ msgstr "Downloads anzeigen"
1008 diff --git a/mytube/src/MyTubeSearch.py b/mytube/src/MyTubeSearch.py
1009 index be63669..a1a324c 100755
1010 --- a/mytube/src/MyTubeSearch.py
1011 +++ b/mytube/src/MyTubeSearch.py
1013 +from enigma import eListboxPythonMultiContent, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, gFont, eTimer
1014 from MyTubeService import GoogleSuggestions
1015 from Screens.Screen import Screen
1016 from Screens.LocationBox import MovieLocationBox
1017 -from Components.config import config, Config, ConfigSelection, ConfigText, getConfigListEntry, ConfigSubsection, ConfigYesNo, ConfigIP, ConfigNumber,ConfigLocations
1018 +from Components.config import config, ConfigText, getConfigListEntry
1019 +from Components.config import KEY_DELETE, KEY_BACKSPACE, KEY_ASCII, KEY_TIMEOUT
1020 from Components.ConfigList import ConfigListScreen
1021 -from Components.config import KEY_DELETE, KEY_BACKSPACE, KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_TOGGLEOW, KEY_ASCII, KEY_TIMEOUT
1022 from Components.ActionMap import ActionMap
1023 from Components.Button import Button
1024 from Components.Label import Label
1025 -from Components.ScrollLabel import ScrollLabel
1026 from Components.Sources.List import List
1027 -from Components.Pixmap import Pixmap
1028 -from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest
1029 -from Components.Task import Task, Job, job_manager
1030 -from enigma import eListboxPythonMultiContent, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, gFont, eListbox,ePoint,eTimer
1031 +from Components.MultiContent import MultiContentEntryText
1032 from Components.Task import job_manager
1033 -from Tools.Directories import pathExists, fileExists, resolveFilename, SCOPE_HDD
1034 +from Tools.Directories import resolveFilename, SCOPE_HDD
1036 from threading import Thread
1037 from threading import Condition
1038 from xml.etree.cElementTree import parse as cet_parse
1039 from StringIO import StringIO
1044 from urllib import FancyURLopener
1046 class MyOpener(FancyURLopener):
1047 version = 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12'
1050 class ConfigTextWithGoogleSuggestions(ConfigText):
1051 class SuggestionsThread(Thread):
1052 def __init__(self, suggestionsService):
1053 @@ -151,122 +146,14 @@ class ConfigTextWithGoogleSuggestions(ConfigText):
1054 if self.suggestionsWindow is not None:
1055 self.suggestionsWindow.enableSelection(value)
1058 -config.plugins.mytube = ConfigSubsection()
1059 -config.plugins.mytube.search = ConfigSubsection()
1061 -config.plugins.mytube.search.searchTerm = ConfigTextWithGoogleSuggestions("", False, threaded = True)
1062 -config.plugins.mytube.search.orderBy = ConfigSelection(
1064 - ("relevance", _("Relevance")),
1065 - ("viewCount", _("View Count")),
1066 - ("published", _("Published")),
1067 - ("rating", _("Rating"))
1069 -config.plugins.mytube.search.time = ConfigSelection(
1071 - ("all_time", _("All Time")),
1072 - ("this_month", _("This Month")),
1073 - ("this_week", _("This Week")),
1074 - ("today", _("Today"))
1076 -config.plugins.mytube.search.racy = ConfigSelection(
1078 - ("include", _("Yes")),
1079 - ("exclude", _("No"))
1081 -config.plugins.mytube.search.categories = ConfigSelection(
1084 - ("Film", _("Film & Animation")),
1085 - ("Autos", _("Autos & Vehicles")),
1086 - ("Music", _("Music")),
1087 - ("Animals", _("Pets & Animals")),
1088 - ("Sports", _("Sports")),
1089 - ("Travel", _("Travel & Events")),
1090 - ("Shortmov", _("Short Movies")),
1091 - ("Games", _("Gaming")),
1092 - ("Comedy", _("Comedy")),
1093 - ("People", _("People & Blogs")),
1094 - ("News", _("News & Politics")),
1095 - ("Entertainment", _("Entertainment")),
1096 - ("Education", _("Education")),
1097 - ("Howto", _("Howto & Style")),
1098 - ("Nonprofit", _("Nonprofits & Activism")),
1099 - ("Tech", _("Science & Technology"))
1101 -config.plugins.mytube.search.lr = ConfigSelection(
1104 - ("au", _("Australia")),
1105 - ("br", _("Brazil")),
1106 - ("ca", _("Canada")),
1107 - ("cz", _("Czech Republic")),
1108 - ("fr", _("France")),
1109 - ("de", _("Germany")),
1110 - ("gb", _("Great Britain")),
1111 - ("au", _("Australia")),
1112 - ("nl", _("Holland")),
1113 - ("hk", _("Hong Kong")),
1114 - ("in", _("India")),
1115 - ("ie", _("Ireland")),
1116 - ("il", _("Israel")),
1117 - ("it", _("Italy")),
1118 - ("jp", _("Japan")),
1119 - ("mx", _("Mexico")),
1120 - ("nz", _("New Zealand")),
1121 - ("pl", _("Poland")),
1122 - ("ru", _("Russia")),
1123 - ("kr", _("South Korea")),
1124 - ("es", _("Spain")),
1125 - ("se", _("Sweden")),
1126 - ("tw", _("Taiwan")),
1127 - ("us", _("United States"))
1129 -config.plugins.mytube.search.sortOrder = ConfigSelection(
1131 - ("ascending", _("Ascending")),
1132 - ("descending", _("Descending"))
1135 -config.plugins.mytube.general = ConfigSubsection()
1136 -config.plugins.mytube.general.showHelpOnOpen = ConfigYesNo(default = True)
1137 -config.plugins.mytube.general.loadFeedOnOpen = ConfigYesNo(default = True)
1138 -config.plugins.mytube.general.startFeed = ConfigSelection(
1140 - ("hd", _("HD videos")),
1141 - ("most_viewed", _("Most viewed")),
1142 - ("top_rated", _("Top rated")),
1143 - ("recently_featured", _("Recently featured")),
1144 - ("most_discussed", _("Most discussed")),
1145 - ("top_favorites", _("Top favorites")),
1146 - ("most_linked", _("Most linked")),
1147 - ("most_responded", _("Most responded")),
1148 - ("most_recent", _("Most recent"))
1151 -config.plugins.mytube.general.on_movie_stop = ConfigSelection(default = "ask", choices = [
1152 - ("ask", _("Ask user")), ("quit", _("Return to movie list")), ("playnext", _("Play next video")), ("playagain", _("Play video again")) ])
1154 -config.plugins.mytube.general.on_exit = ConfigSelection(default = "ask", choices = [
1155 - ("ask", _("Ask user")), ("quit", _("Return to movie list"))])
1158 default = resolveFilename(SCOPE_HDD)
1159 tmp = config.movielist.videodirs.value
1160 if default not in tmp:
1162 -config.plugins.mytube.general.videodir = ConfigSelection(default = default, choices = tmp)
1163 -config.plugins.mytube.general.history = ConfigText(default="")
1164 -config.plugins.mytube.general.clearHistoryOnClose = ConfigYesNo(default = False)
1166 -#config.plugins.mytube.general.useHTTPProxy = ConfigYesNo(default = False)
1167 -#config.plugins.mytube.general.ProxyIP = ConfigIP(default=[0,0,0,0])
1168 -#config.plugins.mytube.general.ProxyPort = ConfigNumber(default=8080)
1170 class MyTubeSuggestionsListScreen(Screen):
1172 - <screen name="MyTubeSuggestionsListScreen" position="60,93" zPosition="6" size="610,160" flags="wfNoBorder" >
1173 + <screen name="MyTubeSuggestionsListScreen" title="MyTube - Search" position="60,93" zPosition="6" size="610,160" flags="wfNoBorder" >
1174 <ePixmap position="0,0" zPosition="-1" size="610,160" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/MyTube/suggestions_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/>
1175 <widget source="suggestionslist" render="Listbox" position="10,5" zPosition="7" size="580,150" scrollbarMode="showOnDemand" transparent="1" >
1176 <convert type="TemplatedMultiContent">
1177 @@ -366,7 +253,7 @@ class MyTubeSuggestionsListScreen(Screen):
1179 class MyTubeSettingsScreen(Screen, ConfigListScreen):
1181 - <screen name="MyTubeSettingsScreen" flags="wfNoBorder" position="0,0" size="720,576" title="MyTubePlayerMainScreen..." >
1182 + <screen name="MyTubeSettingsScreen" flags="wfNoBorder" position="0,0" size="720,576" title="MyTube - Settings" >
1183 <ePixmap position="0,0" zPosition="-1" size="720,576" pixmap="~/mytubemain_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/>
1184 <widget name="title" position="60,50" size="600,50" zPosition="5" valign="center" halign="left" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
1185 <widget name="config" zPosition="2" position="60,120" size="610,370" scrollbarMode="showOnDemand" transparent="1" />
1186 @@ -524,7 +411,7 @@ class MyTubeSettingsScreen(Screen, ConfigListScreen):
1188 class MyTubeTasksScreen(Screen):
1190 - <screen name="MyTubeTasksScreen" flags="wfNoBorder" position="0,0" size="720,576" title="MyTubePlayerMainScreen..." >
1191 + <screen name="MyTubeTasksScreen" flags="wfNoBorder" position="0,0" size="720,576" title="MyTube - Tasks" >
1192 <ePixmap position="0,0" zPosition="-1" size="720,576" pixmap="~/mytubemain_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/>
1193 <widget name="title" position="60,50" size="600,50" zPosition="5" valign="center" halign="left" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
1194 <widget source="tasklist" render="Listbox" position="60,120" size="610,370" zPosition="7" scrollbarMode="showOnDemand" transparent="1" >
1195 @@ -610,7 +497,7 @@ class MyTubeTasksScreen(Screen):
1197 class MyTubeHistoryScreen(Screen):
1199 - <screen name="MyTubeHistoryScreen" position="60,93" zPosition="6" size="610,160" flags="wfNoBorder" >
1200 + <screen name="MyTubeHistoryScreen" position="60,93" zPosition="6" size="610,160" flags="wfNoBorder" title="MyTube - History">
1201 <ePixmap position="0,0" zPosition="-1" size="610,160" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/MyTube/suggestions_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/>
1202 <widget source="historylist" render="Listbox" position="10,5" zPosition="7" size="580,150" scrollbarMode="showOnDemand" transparent="1" >
1203 <convert type="TemplatedMultiContent">
1204 diff --git a/mytube/src/MyTubeService.py b/mytube/src/MyTubeService.py
1205 index 246575c..fc3dafd 100755
1206 --- a/mytube/src/MyTubeService.py
1207 +++ b/mytube/src/MyTubeService.py
1209 # -*- coding: iso-8859-1 -*-
1210 -from __init__ import bin2long, long2bin, rsa_pub1024, decrypt_block
1211 +from enigma import ePythonMessagePump
1213 +from __init__ import decrypt_block
1214 +from ThreadQueue import ThreadQueue
1215 import gdata.youtube
1216 import gdata.youtube.service
1217 from gdata.service import BadAuthentication
1218 -from Tools.LoadPixmap import LoadPixmap
1219 -from Components.config import config, Config, ConfigSelection, ConfigText, getConfigListEntry, ConfigSubsection, ConfigYesNo, ConfigIP, ConfigNumber
1220 -from Components.ConfigList import ConfigListScreen
1221 -from Components.config import KEY_DELETE, KEY_BACKSPACE, KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_TOGGLEOW, KEY_ASCII, KEY_TIMEOUT
1223 from twisted.web import client
1224 from twisted.internet import reactor
1225 -from urllib2 import Request, URLError, HTTPError, urlopen as urlopen2
1226 -from socket import gaierror,error
1227 -import re, os, sys, socket
1228 +from urllib2 import Request, URLError, urlopen as urlopen2
1229 +from socket import gaierror, error
1231 from urllib import quote, unquote_plus, unquote
1233 -from httplib import HTTPConnection,CannotSendRequest,BadStatusLine,HTTPException
1234 -HTTPConnection.debuglevel = 1
1235 +from httplib import HTTPConnection, CannotSendRequest, BadStatusLine, HTTPException
1237 from urlparse import parse_qs
1238 +from threading import Thread
1240 +HTTPConnection.debuglevel = 1
1242 def validate_cert(cert, key):
1243 buf = decrypt_block(cert[8:], key)
1244 @@ -50,7 +51,7 @@ std_headers = {
1246 class GoogleSuggestions():
1247 def __init__(self, callback, ds = None, json = None, hl = None):
1248 - self.callback = callback
1249 + self.gotFeed = callback
1250 self.conn = HTTPConnection("google.com")
1251 #GET /complete/search?output=toolbar&ds=yt&hl=en&jsonp=self.gotSuggestions&q=s
1252 self.prepQuerry = "/complete/search?output=toolbar&"
1253 @@ -63,7 +64,7 @@ class GoogleSuggestions():
1254 self.prepQuerry = self.prepQuerry + "jsonp=self.gotSuggestions&q="
1256 def gotSuggestions(self, suggestslist):
1257 - self.callback(suggestslist)
1258 + self.gotFeed(suggestslist)
1260 def getSuggestions(self, querryString):
1261 if querryString is not "":
1262 @@ -72,22 +73,22 @@ class GoogleSuggestions():
1263 self.conn.request("GET", querry)
1264 except (CannotSendRequest, gaierror, error):
1265 print "[MyTube] Can not send request for suggestions"
1266 - self.callback(None)
1267 + self.gotFeed(None)
1270 response = self.conn.getresponse()
1271 except BadStatusLine:
1272 print "[MyTube] Can not get a response from google"
1273 - self.callback(None)
1274 + self.gotFeed(None)
1276 if response.status == 200:
1277 data = response.read()
1278 self.gotSuggestions(data)
1280 - self.callback(None)
1281 + self.gotFeed(None)
1284 - self.callback(None)
1285 + self.gotFeed(None)
1288 class MyTubeFeedEntry():
1289 @@ -224,16 +225,16 @@ class MyTubeFeedEntry():
1291 infopage = urlopen2(request).read()
1292 videoinfo = parse_qs(infopage)
1293 - if 'fmt_url_map' in videoinfo:
1294 + if ('url_encoded_fmt_stream_map' or 'fmt_url_map') in videoinfo:
1296 except (URLError, HTTPException, socket.error), err:
1297 print "[MyTube] Error: unable to download video infopage",str(err)
1300 - if 'fmt_url_map' not in videoinfo:
1301 + if ('url_encoded_fmt_stream_map' or 'fmt_url_map') not in videoinfo:
1302 # Attempt to see if YouTube has issued an error message
1303 if 'reason' not in videoinfo:
1304 - print '[MyTube] Error: unable to extract "fmt_url_map" parameter for unknown reason'
1305 + print '[MyTube] Error: unable to extract "fmt_url_map" or "url_encoded_fmt_stream_map" parameter for unknown reason'
1307 reason = unquote_plus(videoinfo['reason'][0])
1308 print '[MyTube] Error: YouTube said: %s' % reason.decode('utf-8')
1309 @@ -241,22 +242,30 @@ class MyTubeFeedEntry():
1313 - tmp_fmtUrlDATA = videoinfo['fmt_url_map'][0].split(',')
1314 + if videoinfo.has_key('url_encoded_fmt_stream_map'):
1315 + tmp_fmtUrlDATA = videoinfo['url_encoded_fmt_stream_map'][0].split(',url=')
1317 + tmp_fmtUrlDATA = videoinfo['fmt_url_map'][0].split(',')
1318 for fmtstring in tmp_fmtUrlDATA:
1319 - (fmtid,fmturl) = fmtstring.split('|')
1320 + if videoinfo.has_key('url_encoded_fmt_stream_map'):
1321 + (fmturl, fmtid) = fmtstring.split('&itag=')
1322 + if fmturl.find("url=") !=-1:
1323 + fmturl = fmturl.replace("url=","")
1325 + (fmtid,fmturl) = fmtstring.split('|')
1326 if VIDEO_FMT_PRIORITY_MAP.has_key(fmtid):
1327 video_fmt_map[VIDEO_FMT_PRIORITY_MAP[fmtid]] = { 'fmtid': fmtid, 'fmturl': unquote_plus(fmturl) }
1328 fmt_infomap[int(fmtid)] = unquote_plus(fmturl)
1329 print "[MyTube] got",sorted(fmt_infomap.iterkeys())
1330 if video_fmt_map and len(video_fmt_map):
1331 print "[MyTube] found best available video format:",video_fmt_map[sorted(video_fmt_map.iterkeys())[0]]['fmtid']
1332 - video_url = video_fmt_map[sorted(video_fmt_map.iterkeys())[0]]['fmturl']
1333 + video_url = video_fmt_map[sorted(video_fmt_map.iterkeys())[0]]['fmturl'].split(';')[0]
1334 print "[MyTube] found best available video url:",video_url
1338 def getRelatedVideos(self):
1339 - print "[MyTubeFeedEntry] getResponseVideos()"
1340 + print "[MyTubeFeedEntry] getRelatedVideos()"
1341 for link in self.entry.link:
1342 #print "Related link: ", link.rel.endswith
1343 if link.rel.endswith("video.related"):
1344 @@ -279,13 +288,14 @@ class MyTubePlayerService():
1345 print "[MyTube] MyTubePlayerService - init"
1346 self.feedentries = []
1350 def startService(self):
1351 print "[MyTube] MyTubePlayerService - startService"
1352 - self.yt_service = gdata.youtube.service.YouTubeService()
1353 - self.yt_service.developer_key = 'AI39si4AjyvU8GoJGncYzmqMCwelUnqjEMWTFCcUtK-VUzvWygvwPO-sadNwW5tNj9DDCHju3nnJEPvFy4WZZ6hzFYCx8rJ6Mw'
1354 - self.yt_service.client_id = 'ytapi-dream-MyTubePlayer-i0kqrebg-0'
1355 - self.loggedIn = False
1356 + self.yt_service = gdata.youtube.service.YouTubeService(
1357 + developer_key = 'AI39si4AjyvU8GoJGncYzmqMCwelUnqjEMWTFCcUtK-VUzvWygvwPO-sadNwW5tNj9DDCHju3nnJEPvFy4WZZ6hzFYCx8rJ6Mw',
1358 + client_id = 'ytapi-dream-MyTubePlayer-i0kqrebg-0'
1360 +# self.loggedIn = False
1361 #os.environ['http_proxy'] = 'http://169.229.50.12:3128'
1362 #proxy = os.environ.get('http_proxy')
1363 #print "FOUND ENV PROXY-->",proxy
1364 @@ -295,23 +305,18 @@ class MyTubePlayerService():
1365 def stopService(self):
1366 print "[MyTube] MyTubePlayerService - stopService"
1368 - self.loggedIn = False
1370 - def isLoggedIn(self):
1371 - return self.loggedIn
1373 - def getFeed(self, url):
1374 + def getFeed(self, url, callback = None, errorback = None):
1375 print "[MyTube] MyTubePlayerService - getFeed:",url
1376 self.feedentries = []
1377 - self.feed = self.yt_service.GetYouTubeVideoFeed(url)
1378 - for entry in self.feed.entry:
1379 - MyFeedEntry = MyTubeFeedEntry(self, entry)
1380 - self.feedentries.append(MyFeedEntry)
1382 + queryThread = YoutubeQueryThread(self.yt_service.GetYouTubeVideoFeed, url, self.gotFeed, self.gotFeedError, callback, errorback)
1383 + queryThread.start()
1384 + return queryThread
1386 def search(self, searchTerms, startIndex = 1, maxResults = 25,
1387 orderby = "relevance", racy = "include",
1388 - author = "", lr = "", categories = "", sortOrder = "ascending"):
1389 + author = "", lr = "", categories = "", sortOrder = "ascending",
1390 + callback = None, errorback = None):
1391 print "[MyTube] MyTubePlayerService - search()"
1392 self.feedentries = []
1393 query = gdata.youtube.service.YouTubeVideoQuery()
1394 @@ -325,17 +330,24 @@ class MyTubePlayerService():
1395 query.categories = categories
1396 query.start_index = startIndex
1397 query.max_results = maxResults
1399 - feed = self.yt_service.YouTubeQuery(query)
1402 + queryThread = YoutubeQueryThread(self.yt_service.YouTubeQuery, query, self.gotFeed, self.gotFeedError, callback, errorback)
1403 + queryThread.start()
1404 + return queryThread
1406 + def gotFeed(self, feed, callback):
1407 if feed is not None:
1409 for entry in self.feed.entry:
1410 MyFeedEntry = MyTubeFeedEntry(self, entry)
1411 self.feedentries.append(MyFeedEntry)
1414 + if callback is not None:
1415 + callback(self.feed)
1417 + def gotFeedError(self, exception, errorback):
1418 + if errorback is not None:
1419 + errorback(exception)
1423 return self.feed.title.text
1425 @@ -354,5 +366,38 @@ class MyTubePlayerService():
1430 +class YoutubeQueryThread(Thread):
1431 + def __init__(self, query, param, gotFeed, gotFeedError, callback, errorback):
1432 + Thread.__init__(self)
1433 + self.messagePump = ePythonMessagePump()
1434 + self.messages = ThreadQueue()
1435 + self.gotFeed = gotFeed
1436 + self.gotFeedError = gotFeedError
1437 + self.callback = callback
1438 + self.errorback = errorback
1439 + self.query = query
1440 + self.param = param
1441 + self.canceled = False
1442 + self.messagePump.recv_msg.get().append(self.finished)
1445 + self.canceled = True
1449 + feed = self.query(self.param)
1450 + self.messages.push((True, feed, self.callback))
1451 + self.messagePump.send(0)
1452 + except Exception, ex:
1453 + self.messages.push((False, ex, self.errorback))
1454 + self.messagePump.send(0)
1456 + def finished(self, val):
1457 + if not self.canceled:
1458 + message = self.messages.pop()
1460 + self.gotFeed(message[1], message[2])
1462 + self.gotFeedError(message[1], message[2])
1464 myTubeService = MyTubePlayerService()
1465 diff --git a/mytube/src/ThreadQueue.py b/mytube/src/ThreadQueue.py
1466 new file mode 100644
1467 index 0000000..ddec604
1469 +++ b/mytube/src/ThreadQueue.py
1471 +from threading import Lock
1474 + def __init__(self):
1476 + self.__lock = Lock()
1478 + def push(self, val):
1479 + lock = self.__lock
1481 + self.__list.append(val)
1485 + lock = self.__lock
1487 + ret = self.__list.pop()
1491 diff --git a/mytube/src/__init__.py b/mytube/src/__init__.py
1492 index c8c21ef..b7b3a56 100755
1493 --- a/mytube/src/__init__.py
1494 +++ b/mytube/src/__init__.py
1496 # -*- coding: ISO-8859-1 -*-
1497 from Components.Language import language
1498 from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_LANGUAGE
1501 +import os, gettext, hashlib
1502 PluginLanguageDomain = "MyTube"
1503 PluginLanguagePath = "Extensions/MyTube/locale"
1505 @@ -35,7 +34,7 @@ def decrypt_block(src, mod):
1506 if len(src) != 128 and len(src) != 202:
1508 dest = rsa_pub1024(src[:128], mod)
1509 - hash = sha.new(dest[1:107])
1510 + hash = hashlib.sha1(dest[1:107])
1512 hash.update(src[131:192])
1513 result = hash.digest()
1514 diff --git a/mytube/src/plugin.py b/mytube/src/plugin.py
1515 index 93b54c1..84b98c4 100755
1516 --- a/mytube/src/plugin.py
1517 +++ b/mytube/src/plugin.py
1519 -from Plugins.Plugin import PluginDescriptor
1520 -from MyTubeService import GoogleSuggestions, validate_cert, get_rnd
1521 -from MyTubeSearch import ConfigTextWithGoogleSuggestions
1522 -from Tools.BoundFunction import boundFunction
1523 -from Screens.MessageBox import MessageBox
1524 -from Screens.Screen import Screen
1525 -from Screens.ChoiceBox import ChoiceBox
1526 -from Screens.InfoBar import MoviePlayer
1527 -from Screens.VirtualKeyBoard import VirtualKeyBoard
1528 -from Components.ActionMap import ActionMap, NumberActionMap
1529 +from Components.AVSwitch import AVSwitch
1530 +from Components.ActionMap import ActionMap
1531 +from Components.Button import Button
1532 +from Components.ConfigList import ConfigListScreen
1533 from Components.Label import Label
1534 -from Components.ScrollLabel import ScrollLabel
1535 -from Components.ProgressBar import ProgressBar
1536 +from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest
1537 from Components.Pixmap import Pixmap
1538 -from Components.Button import Button
1539 +from Components.ProgressBar import ProgressBar
1540 +from Components.ScrollLabel import ScrollLabel
1541 +from Components.ServiceEventTracker import ServiceEventTracker
1542 from Components.Sources.List import List
1543 -from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest
1544 -from Components.AVSwitch import AVSwitch
1545 -from Components.ActionMap import HelpableActionMap
1546 -from Components.config import config, Config, ConfigSelection, ConfigSubsection, ConfigText, getConfigListEntry, ConfigYesNo, ConfigIP, ConfigNumber,ConfigLocations
1547 -from Components.config import KEY_DELETE, KEY_BACKSPACE, KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_TOGGLEOW, KEY_ASCII, KEY_TIMEOUT
1548 -from Components.ConfigList import ConfigListScreen
1549 -from Components.ServiceEventTracker import ServiceEventTracker, InfoBarBase
1550 -from Components.Console import Console
1551 -from Components.Sources.Source import Source
1552 from Components.Task import Task, Job, job_manager
1553 +from Components.config import config, ConfigSelection, ConfigSubsection, ConfigText, ConfigYesNo, getConfigListEntry
1554 +#, ConfigIP, ConfigNumber, ConfigLocations
1555 +from MyTubeSearch import ConfigTextWithGoogleSuggestions, MyTubeSettingsScreen, MyTubeTasksScreen, MyTubeHistoryScreen
1556 +from MyTubeService import validate_cert, get_rnd, myTubeService
1557 +from Plugins.Plugin import PluginDescriptor
1558 +from Screens.ChoiceBox import ChoiceBox
1559 +from Screens.InfoBarGenerics import InfoBarNotifications
1560 +from Screens.MessageBox import MessageBox
1561 +from Screens.Screen import Screen
1562 +from Screens.VirtualKeyBoard import VirtualKeyBoard
1563 +from Tools.BoundFunction import boundFunction
1564 +from Tools.Directories import resolveFilename, SCOPE_HDD, SCOPE_CURRENT_PLUGIN
1565 +from Tools.Downloader import downloadWithProgress
1567 -from threading import Thread
1568 -from threading import Condition
1569 +from __init__ import decrypt_block
1571 -from Tools.Directories import pathExists, fileExists, resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE, SCOPE_HDD, SCOPE_CURRENT_PLUGIN
1572 -from Tools.LoadPixmap import LoadPixmap
1573 -from Tools.Downloader import HTTPProgressDownloader, downloadWithProgress
1574 -from enigma import eTimer, quitMainloop,eListbox,ePoint, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, RT_VALIGN_CENTER, eListboxPythonMultiContent, eListbox, gFont, getDesktop, ePicLoad, eServiceCenter, iServiceInformation, eServiceReference,iSeekableService,iServiceInformation, iPlayableService, iPlayableServicePtr
1575 -from os import path as os_path, system as os_system, unlink, stat, mkdir, popen, makedirs, listdir, access, rename, remove, W_OK, R_OK, F_OK
1576 +from enigma import eTPM, eTimer, ePoint, RT_HALIGN_LEFT, RT_VALIGN_CENTER, gFont, ePicLoad, eServiceReference, iPlayableService
1577 +from os import path as os_path, remove as os_remove
1578 from twisted.web import client
1579 -from twisted.internet import reactor
1580 -from time import time
1582 -from Screens.InfoBarGenerics import InfoBarShowHide, InfoBarSeek, InfoBarNotifications, InfoBarServiceNotifications
1583 -from enigma import eTPM
1584 -from __init__ import bin2long, long2bin, rsa_pub1024, decrypt_block
1588 rootkey = ['\x9f', '|', '\xe4', 'G', '\xc9', '\xb4', '\xf4', '#', '&', '\xce', '\xb3', '\xfe', '\xda', '\xc9', 'U', '`', '\xd8', '\x8c', 's', 'o', '\x90', '\x9b', '\\', 'b', '\xc0', '\x89', '\xd1', '\x8c', '\x9e', 'J', 'T', '\xc5', 'X', '\xa1', '\xb8', '\x13', '5', 'E', '\x02', '\xc9', '\xb2', '\xe6', 't', '\x89', '\xde', '\xcd', '\x9d', '\x11', '\xdd', '\xc7', '\xf4', '\xe4', '\xe4', '\xbc', '\xdb', '\x9c', '\xea', '}', '\xad', '\xda', 't', 'r', '\x9b', '\xdc', '\xbc', '\x18', '3', '\xe7', '\xaf', '|', '\xae', '\x0c', '\xe3', '\xb5', '\x84', '\x8d', '\r', '\x8d', '\x9d', '2', '\xd0', '\xce', '\xd5', 'q', '\t', '\x84', 'c', '\xa8', ')', '\x99', '\xdc', '<', '"', 'x', '\xe8', '\x87', '\x8f', '\x02', ';', 'S', 'm', '\xd5', '\xf0', '\xa3', '_', '\xb7', 'T', '\t', '\xde', '\xa7', '\xf1', '\xc9', '\xae', '\x8a', '\xd7', '\xd2', '\xcf', '\xb2', '.', '\x13', '\xfb', '\xac', 'j', '\xdf', '\xb1', '\x1d', ':', '?']
1590 config.plugins.mytube = ConfigSubsection()
1591 config.plugins.mytube.search = ConfigSubsection()
1594 config.plugins.mytube.search.searchTerm = ConfigTextWithGoogleSuggestions("", False, threaded = True)
1595 config.plugins.mytube.search.orderBy = ConfigSelection(
1597 @@ -152,6 +145,7 @@ config.plugins.mytube.general.clearHistoryOnClose = ConfigYesNo(default = False)
1598 #config.plugins.mytube.general.ProxyIP = ConfigIP(default=[0,0,0,0])
1599 #config.plugins.mytube.general.ProxyPort = ConfigNumber(default=8080)
1602 class downloadJob(Job):
1603 def __init__(self, url, file, title):
1604 Job.__init__(self, title)
1605 @@ -189,8 +183,6 @@ class downloadTask(Task):
1609 -from MyTubeService import myTubeService
1610 -from MyTubeSearch import MyTubeSettingsScreen,MyTubeTasksScreen,MyTubeHistoryScreen
1613 class MyTubePlayerMainScreen(Screen, ConfigListScreen):
1614 @@ -198,7 +190,7 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
1616 #(entry, Title, Description, TubeID, thumbnail, PublishedDate,Views,duration,ratings )
1618 - <screen name="MyTubePlayerMainScreen" flags="wfNoBorder" position="0,0" size="720,576" title="MyTubePlayerMainScreen..." >
1619 + <screen name="MyTubePlayerMainScreen" flags="wfNoBorder" position="0,0" size="720,576" title="MyTube - Browser" >
1620 <ePixmap position="0,0" zPosition="-1" size="720,576" pixmap="~/mytubemain_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/>
1621 <widget name="config" zPosition="2" position="60,60" size="600,50" scrollbarMode="showNever" transparent="1" />
1622 <widget source="feedlist" render="Listbox" position="49,110" size="628,385" zPosition="1" scrollbarMode="showOnDemand" transparent="1" backgroundPixmap="~/list_bg.png" selectionPixmap="~/list_sel.png" >
1623 @@ -248,6 +240,8 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
1625 self.currentFeedName = None
1627 + self.queryThread = None
1628 + self.queryRunning = False
1630 self.video_playlist = []
1631 self.statuslist = []
1632 @@ -339,6 +333,7 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
1633 "nextBouquet": self.switchToConfigList,
1634 "green": self.keyStdFeed,
1635 "yellow": self.handleHistory,
1636 + "menu": self.handleMenu
1639 self["historyactions"] = ActionMap(["ShortcutActions", "WizardActions", "MediaPlayerActions", "MovieSelectionActions", "HelpActions"],
1640 @@ -385,10 +380,12 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
1641 current = self["config"].getCurrent()
1642 if current[1].help_window.instance is not None:
1643 current[1].help_window.instance.hide()
1645 self.statuslist.append(( _("Fetching feed entries"), _("Trying to download the Youtube feed entries. Please wait..." ) ))
1646 self["feedlist"].style = "state"
1647 self['feedlist'].setList(self.statuslist)
1648 - self.Timer.start(200)
1649 + self.Timer.start(200)
1651 def TimerFire(self):
1653 if config.plugins.mytube.general.loadFeedOnOpen.value:
1654 @@ -473,7 +470,7 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
1655 self.switchToConfigList()
1657 def handleMenu(self):
1658 - if self.currList == "configlist":
1659 + if self.currList == "configlist" or self.currList == "status":
1661 (_("MyTube Settings"), "settings"),
1663 @@ -644,6 +641,7 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
1664 config.plugins.mytube.general.history.save()
1665 config.plugins.mytube.general.save()
1666 config.plugins.mytube.save()
1667 + self.cancelThread()
1671 @@ -901,16 +899,8 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
1672 self.propagateUpDownNormally = True
1674 def getFeed(self, feedUrl, feedName):
1676 - feed = myTubeService.getFeed(feedUrl)
1677 - except Exception, e:
1679 - print "Error querying feed :",feedName
1681 - self.setState('Error')
1682 - if feed is not None:
1683 - self.ytfeed = feed
1684 - self.buildEntryList()
1685 + self.queryStarted()
1686 + self.queryThread = myTubeService.getFeed(feedUrl, self.gotFeed, self.gotFeedError)
1688 def getNextEntries(self, result):
1690 @@ -943,26 +933,53 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
1691 self.searchFeed(searchContext)
1693 def searchFeed(self, searchContext):
1694 - print "[MyTubePlayer] searchFeed"
1695 + print "[MyTubePlayer] searchFeed"
1696 + self.queryStarted()
1697 self.appendEntries = False
1699 - feed = myTubeService.search(searchContext,
1700 + self.queryThread = myTubeService.search(searchContext,
1701 orderby = config.plugins.mytube.search.orderBy.value,
1702 racy = config.plugins.mytube.search.racy.value,
1703 lr = config.plugins.mytube.search.lr.value,
1704 categories = [ config.plugins.mytube.search.categories.value ],
1705 - sortOrder = config.plugins.mytube.search.sortOrder.value)
1706 - except Exception, e:
1708 - print "Error querying search for :",config.plugins.mytube.search.searchTerm.value
1710 - self.setState('Error')
1711 + sortOrder = config.plugins.mytube.search.sortOrder.value,
1712 + callback = self.gotSearchFeed, errorback = self.gotSearchFeedError)
1714 + def queryStarted(self):
1715 + if self.queryRunning:
1716 + self.cancelThread()
1717 + self.queryRunning = True
1719 + def queryFinished(self):
1720 + self.queryRunning = False
1722 + def cancelThread(self):
1723 + print "[MyTubePlayer] cancelThread"
1724 + if self.queryThread is not None:
1725 + self.queryThread.cancel()
1726 + self.queryFinished()
1728 + def gotFeed(self, feed):
1729 + print "[MyTubePlayer] gotFeed"
1730 + self.queryFinished()
1731 if feed is not None:
1733 - if self.FirstRun == True:
1734 - self.FirstRun = False
1735 self.buildEntryList()
1738 + def gotFeedError(self, exception):
1739 + print "[MyTubePlayer] gotFeedError"
1740 + self.queryFinished()
1741 + self.setState('Error')
1743 + def gotSearchFeed(self, feed):
1745 + self.FirstRun = False
1746 + self.gotFeed(feed)
1748 + def gotSearchFeedError(self, exception):
1750 + self.FirstRun = False
1751 + self.gotFeedError(exception)
1753 def buildEntryList(self):
1754 self.mytubeentries = None
1755 self.screenshotList = []
1756 @@ -989,7 +1006,7 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
1757 self["feedlist"].setIndex(0)
1758 self["feedlist"].setList(self.videolist)
1759 self["feedlist"].updateList(self.videolist)
1760 - if self.FirstRun == True:
1761 + if self.FirstRun and not config.plugins.mytube.general.loadFeedOnOpen.value:
1762 self.switchToConfigList()
1764 self.switchToFeedList()
1765 @@ -1157,7 +1174,7 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
1766 if self.Details.has_key(tubeid):
1767 self.Details[tubeid]["thumbnail"] = ptr
1768 if (os_path.exists(thumbnailFile) == True):
1769 - remove(thumbnailFile)
1770 + os_remove(thumbnailFile)
1771 del self.picloads[tubeid]
1773 del self.picloads[tubeid]
1774 @@ -1186,7 +1203,7 @@ class MyTubePlayerMainScreen(Screen, ConfigListScreen):
1776 class MyTubeVideoInfoScreen(Screen):
1778 - <screen name="MyTubeVideoInfoScreen" flags="wfNoBorder" position="0,0" size="720,576" title="MyTubePlayerMainScreen..." >
1779 + <screen name="MyTubeVideoInfoScreen" flags="wfNoBorder" position="0,0" size="720,576" title="MyTube - Video Info" >
1780 <ePixmap position="0,0" zPosition="-1" size="720,576" pixmap="~/mytubemain_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/>
1781 <widget name="title" position="60,50" size="600,50" zPosition="5" valign="center" halign="left" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
1782 <widget name="starsbg" pixmap="~/starsbar_empty.png" position="560,220" zPosition="5" size="100,20" transparent="1" alphatest="on" />
1783 @@ -1361,7 +1378,7 @@ class MyTubeVideoInfoScreen(Screen):
1784 self.thumbnails[picindex][3] = ptr
1785 if (os_path.exists(self.thumbnails[picindex][2]) == True):
1786 print "removing", self.thumbnails[picindex][2]
1787 - remove(self.thumbnails[picindex][2])
1788 + os_remove(self.thumbnails[picindex][2])
1789 del self.picloads[picindex]
1790 if len(self.picloads) == 0:
1791 self.timer.startLongTimer(3)
1792 @@ -1400,7 +1417,7 @@ class MyTubeVideoInfoScreen(Screen):
1794 class MyTubeVideoHelpScreen(Screen):
1796 - <screen name="MyTubeVideoHelpScreen" flags="wfNoBorder" position="0,0" size="720,576" title="MyTubePlayerMainScreen..." >
1797 + <screen name="MyTubeVideoHelpScreen" flags="wfNoBorder" position="0,0" size="720,576" title="MyTube - Help" >
1798 <ePixmap position="0,0" zPosition="-1" size="720,576" pixmap="~/mytubemain_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/>
1799 <widget name="title" position="60,50" size="600,50" zPosition="5" valign="center" halign="left" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
1800 <widget name="detailtext" position="60,120" size="610,370" zPosition="10" font="Regular;21" transparent="1" halign="left" valign="top"/>
1801 @@ -1561,7 +1578,6 @@ class MyTubePlayer(Screen, InfoBarNotifications):
1802 if self.infoCallback is not None:
1806 def playNextFile(self):
1807 print "playNextFile"
1808 nextservice,error = self.nextCallback()