Ticket #6346: MythVideo.SeasSubEp.4.23.09.diff
File MythVideo.SeasSubEp.4.23.09.diff, 108.2 KB (added by , 15 years ago) |
---|
-
mythplugins/mythvideo/theme/default/video-ui.xml
477 477 </buttonlist> 478 478 479 479 <textarea name="title" from="basetextarea"> 480 <area>40, 20,700,100</area>480 <area>40,15,700,100</area> 481 481 <multiline>yes</multiline> 482 482 <font>baseextralarge</font> 483 483 </textarea> 484 484 485 <textarea name="subtitle" from="basetextarea"> 486 <area>40,45,500,100</area> 487 <multiline>yes</multiline> 488 <font>basemedium</font> 489 </textarea> 490 491 <textarea name="##x##" from="basetextarea"> 492 <area>560,45,100,100</area> 493 <multiline>yes</multiline> 494 <font>basemedium</font> 495 </textarea> 496 485 497 <imagetype name="coverimage"> 486 498 <area>30,90,203,311</area> 487 499 <preserveaspect>yes</preserveaspect> … … 493 505 </textarea> 494 506 495 507 <textarea name="dirlbl" from="basetextarea"> 496 <area>240,6 5,115,35</area>508 <area>240,68,115,35</area> 497 509 <value>Directed by</value> 498 510 <align>right</align> 499 511 </textarea> 500 512 501 513 <textarea name="director" from="basetextarea"> 502 <area>360,6 3,350,35</area>514 <area>360,66,350,35</area> 503 515 <font>basemedium</font> 504 516 </textarea> 505 517 … … 586 598 587 599 <window name="gallery"> 588 600 <textarea name="title" from="basetextarea"> 589 <area>70, 20,460,50</area>601 <area>70,15,460,50</area> 590 602 <cutdown>yes</cutdown> 591 603 <font>baselarge</font> 592 604 </textarea> 593 605 606 <textarea name="subtitle" from="basetextarea"> 607 <area>70,40,360,50</area> 608 <cutdown>yes</cutdown> 609 <font>basemedium</font> 610 </textarea> 611 612 <textarea name="##x##" from="basetextarea"> 613 <area>440,40,70,50</area> 614 <cutdown>yes</cutdown> 615 <font>basemedium</font> 616 </textarea> 617 594 618 <buttonlist name="videos"> 595 619 <area>15,0,770,585</area> 596 620 <layout>grid</layout> … … 662 686 </buttonlist> 663 687 664 688 <textarea name="position" from="basetextarea"> 665 <area>530, 20,110,40</area>689 <area>530,15,110,40</area> 666 690 <align>hcenter,vcenter</align> 667 691 <font>basemedium</font> 668 692 </textarea> … … 728 752 <font>baselarge</font> 729 753 </textarea> 730 754 755 <textarea name="subtitle" from="basetextarea"> 756 <area>50,360,425,30</area> 757 </textarea> 758 759 <textarea name="##x##" from="basetextarea"> 760 <area>500,360,80,30</area> 761 <align>right</align> 762 </textarea> 763 731 764 <textarea name="director" from="basetextarea"> 732 <area>50,3 67,450,30</area>765 <area>50,390,450,30</area> 733 766 </textarea> 734 767 735 768 <textarea name="year" from="basetextarea"> 736 <area>500,3 67,80,30</area>769 <area>500,390,80,30</area> 737 770 <align>right</align> 738 771 </textarea> 739 772 740 773 <textarea name="plot" from="basetextarea"> 741 <area>40, 395,530,80</area>774 <area>40,418,530,80</area> 742 775 <align>left,top</align> 743 776 <multiline>yes</multiline> 744 777 <cutdown>yes</cutdown> 745 778 </textarea> 746 779 747 780 <textarea name="cast" from="basetextarea"> 748 <area>60, 480,505,70</area>781 <area>60,503,505,50</area> 749 782 <align>left,top</align> 750 783 <multiline>yes</multiline> 751 784 <cutdown>no</cutdown> … … 867 900 <!-- Labels --> 868 901 869 902 <textarea name="title_text" from="basetextarea"> 870 <area>50, 90,250,40</area>871 <value> Name:</value>903 <area>50,80,250,40</area> 904 <value>Title:</value> 872 905 <align>right,top</align> 873 906 </textarea> 874 907 908 <textarea name="subtitle_text" from="basetextarea"> 909 <area>50,138,250,40</area> 910 <value>Subtitle:</value> 911 <align>right,top</align> 912 </textarea> 913 914 <textarea name="season_text" from="basetextarea"> 915 <area>50,185,250,40</area> 916 <value>Season:</value> 917 <align>right,top</align> 918 </textarea> 919 920 <textarea name="episode_text" from="basetextarea"> 921 <area>370,185,150,40</area> 922 <value>Episode:</value> 923 <align>right,top</align> 924 </textarea> 925 875 926 <textarea name="category_text" from="title_text"> 876 <position>50,152</position> 927 <area>370,232,150,40</area> 928 <align>right</align> 877 929 <value>Category:</value> 878 930 </textarea> 879 931 880 932 <textarea name="level_text" from="title_text"> 881 <position>50,202</position> 933 <area>20,232,200,40</area> 934 <align>right</align> 882 935 <value>Parental Control:</value> 883 936 </textarea> 884 937 885 938 <textarea name="child_text" from="title_text"> 886 <position>50,247</position> 939 <area>20,277,200,40</area> 940 <align>right</align> 887 941 <value>File to Always Play Next:</value> 888 942 </textarea> 889 943 890 944 <textarea name="browse_text" from="title_text"> 891 <position>50,292</position> 945 <area>500,277,200,40</area> 946 <align>left</align> 892 947 <value>Include while Browsing:</value> 893 948 </textarea> 894 949 … … 925 980 <!-- Widgets --> 926 981 927 982 <textedit name="title_edit" from="basetextedit"> 928 <position>310, 80</position>983 <position>310,70</position> 929 984 </textedit> 930 985 931 < buttonlist name="category_select" from="baseselector">932 <position>310,1 45</position>933 </ buttonlist>986 <textedit name="subtitle_edit" from="basetextedit"> 987 <position>310,126</position> 988 </textedit> 934 989 990 <spinbox name="season" from="basespinbox"> 991 <position>310,181</position> 992 </spinbox> 993 994 <spinbox name="episode" from="basespinbox"> 995 <position>530,181</position> 996 </spinbox> 997 935 998 <buttonlist name="level_select" from="baseselector"> 936 <position> 310,195</position>999 <position>230,225</position> 937 1000 </buttonlist> 938 1001 1002 <buttonlist name="category_select" from="baseselector"> 1003 <position>530,225</position> 1004 </buttonlist> 1005 939 1006 <buttonlist name="child_select" from="baseselector"> 940 <position> 310,240</position>1007 <position>230,270</position> 941 1008 </buttonlist> 942 1009 943 1010 <checkbox name="browse_check" from="basecheckbox"> 944 <position> 310,290</position>1011 <position>680,275</position> 945 1012 </checkbox> 946 1013 947 1014 <button name="coverart_button" from="basesearchbutton"> -
mythplugins/mythvideo/theme/default-wide/video-ui.xml
467 467 </imagetype> 468 468 469 469 <textarea name="title" from="basetextarea"> 470 <area>370,12, 700,40</area>470 <area>370,12,400,40</area> 471 471 <multiline>yes</multiline> 472 472 <font>baselarge</font> 473 473 </textarea> 474 474 475 <textarea name="subtitle" from="basetextarea"> 476 <area>800,12,400,40</area> 477 <multiline>yes</multiline> 478 <font>baselarge</font> 479 </textarea> 480 475 481 <textarea name="currentvideo" from="basetextarea"> 476 482 <area>150,486,500,35</area> 477 483 <align>top,vcenter</align> … … 487 493 <font>basemedium</font> 488 494 </textarea> 489 495 496 <textarea name="s##e##" from="basetextarea"> 497 <area>1010,63,150,35</area> 498 <font>basemedium</font> 499 </textarea> 500 490 501 <textarea name="plot" from="basetextarea"> 491 502 <area>380,97,840,145</area> 492 503 <multiline>yes</multiline> … … 572 583 573 584 <window name="gallery"> 574 585 <textarea name="title" from="basetextarea"> 575 <area>70,15, 800,50</area>586 <area>70,15,420,50</area> 576 587 <cutdown>yes</cutdown> 577 588 <font>baselarge</font> 578 589 </textarea> … … 646 657 </state> 647 658 </statetype> 648 659 </buttonlist> 660 661 <textarea name="subtitle" from="basetextarea"> 662 <area>500,15,350,40</area> 663 <align>hcenter,vcenter</align> 664 <font>basemedium</font> 665 </textarea> 649 666 667 <textarea name="s##e##" from="basetextarea"> 668 <area>870,15,100,40</area> 669 <align>hcenter,vcenter</align> 670 <font>basemedium</font> 671 </textarea> 672 650 673 <textarea name="position" from="basetextarea"> 651 <area> 890,15,200,40</area>674 <area>1000,15,200,40</area> 652 675 <align>hcenter,vcenter</align> 653 676 <font>basemedium</font> 654 677 </textarea> … … 713 736 <font>baselarge</font> 714 737 </textarea> 715 738 739 <textarea name="s##e##" from="basetextarea"> 740 <area>50,380,400,30</area> 741 <font>basemedium</font> 742 </textarea> 743 744 <textarea name="subtitle" from="basetextarea"> 745 <area>50,420,400,30</area> 746 <font>basemedium</font> 747 </textarea> 748 716 749 <textarea name="director" from="basetextarea"> 717 <area>50, 367,450,30</area>750 <area>50,467,450,30</area> 718 751 </textarea> 719 752 720 753 <textarea name="year" from="basetextarea"> 721 <area>500, 367,80,30</area>754 <area>500,467,80,30</area> 722 755 <align>right</align> 723 756 </textarea> 724 757 725 758 <textarea name="plot" from="basetextarea"> 726 <area>40, 395,530,80</area>759 <area>40,495,530,80</area> 727 760 <align>left,top</align> 728 761 <multiline>yes</multiline> 729 762 <cutdown>yes</cutdown> 730 763 </textarea> 731 764 732 765 <textarea name="cast" from="basetextarea"> 733 <area>60, 480,505,70</area>766 <area>60,580,505,70</area> 734 767 <align>left,top</align> 735 768 <multiline>yes</multiline> 736 769 <cutdown>no</cutdown> 737 770 </textarea> 738 771 739 772 <textarea name="position" from="basetextarea"> 740 <area>266, 555,266,40</area>773 <area>266,655,266,40</area> 741 774 <font>basemedium</font> 742 775 <align>hcenter,vcenter</align> 743 776 </textarea> … … 843 876 <window name="edit_metadata"> 844 877 845 878 <textarea name="title" from="basetextarea"> 846 <area>10, 50,1260,50</area>879 <area>10,30,760,50</area> 847 880 <value>Edit Video Information</value> 848 881 <align>hcenter,vcenter</align> 849 882 <font>baselarge</font> … … 852 885 <!-- Labels --> 853 886 854 887 <textarea name="title_text" from="basetextarea"> 855 <area> 250,110,250,40</area>856 <value> Name:</value>888 <area>50,80,250,40</area> 889 <value>Title:</value> 857 890 <align>right,top</align> 858 891 </textarea> 859 892 893 <textarea name="subtitle_text" from="basetextarea"> 894 <area>50,138,250,40</area> 895 <value>Subtitle:</value> 896 <align>right,top</align> 897 </textarea> 898 899 <textarea name="season_text" from="basetextarea"> 900 <area>50,185,250,40</area> 901 <value>Season:</value> 902 <align>right,top</align> 903 </textarea> 904 905 <textarea name="episode_text" from="basetextarea"> 906 <area>370,185,150,40</area> 907 <value>Episode:</value> 908 <align>right,top</align> 909 </textarea> 910 860 911 <textarea name="category_text" from="title_text"> 861 <position>250,172</position> 912 <area>420,232,150,40</area> 913 <align>right</align> 862 914 <value>Category:</value> 863 915 </textarea> 864 916 865 917 <textarea name="level_text" from="title_text"> 866 <position>250,222</position> 918 <area>20,232,200,40</area> 919 <align>right</align> 867 920 <value>Parental Control:</value> 868 921 </textarea> 869 922 870 923 <textarea name="child_text" from="title_text"> 871 <position>250,267</position> 924 <area>20,277,200,40</area> 925 <align>right</align> 872 926 <value>File to Always Play Next:</value> 873 927 </textarea> 874 928 875 929 <textarea name="browse_text" from="title_text"> 876 <position>250,312</position> 930 <area>470,277,280,40</area> 931 <align>left</align> 877 932 <value>Include while Browsing:</value> 878 933 </textarea> 879 934 880 935 <textarea name="coverart_text_label" from="title_text"> 881 <position> 250,348</position>936 <position>50,328</position> 882 937 <value>Cover Art:</value> 883 938 </textarea> 884 939 885 940 <textarea name="screenshot_text_label" from="title_text"> 886 <position> 250,377</position>941 <position>50,357</position> 887 942 <value>Screenshot:</value> 888 943 </textarea> 889 944 890 945 <textarea name="banner_text_label" from="title_text"> 891 <position> 250,406</position>946 <position>50,386</position> 892 947 <value>Banner:</value> 893 948 </textarea> 894 949 895 950 <textarea name="fanart_text_label" from="title_text"> 896 <position> 250,435</position>951 <position>50,415</position> 897 952 <value>Fanart:</value> 898 953 </textarea> 899 954 900 955 <textarea name="trailer_text_label" from="title_text"> 901 <position> 250,464</position>956 <position>50,447</position> 902 957 <value>Trailer:</value> 903 958 </textarea> 904 959 905 960 <textarea name="player_text" from="title_text"> 906 <position> 250,510</position>961 <position>50,487</position> 907 962 <value>Unique Player Command:</value> 908 963 </textarea> 909 964 910 965 <!-- Widgets --> 911 966 912 967 <textedit name="title_edit" from="basetextedit"> 913 <position> 510,100</position>968 <position>310,70</position> 914 969 </textedit> 915 970 916 < buttonlist name="category_select" from="baseselector">917 <position> 510,165</position>918 </ buttonlist>971 <textedit name="subtitle_edit" from="basetextedit"> 972 <position>310,126</position> 973 </textedit> 919 974 975 <spinbox name="season" from="basespinbox"> 976 <position>310,181</position> 977 </spinbox> 978 979 <spinbox name="episode" from="basespinbox"> 980 <position>530,181</position> 981 </spinbox> 982 920 983 <buttonlist name="level_select" from="baseselector"> 921 <position> 510,215</position>984 <position>230,225</position> 922 985 </buttonlist> 923 986 987 <buttonlist name="category_select" from="baseselector"> 988 <position>580,225</position> 989 </buttonlist> 990 924 991 <buttonlist name="child_select" from="baseselector"> 925 <position> 510,260</position>992 <position>230,270</position> 926 993 </buttonlist> 927 994 928 995 <checkbox name="browse_check" from="basecheckbox"> 929 <position> 510,310</position>996 <position>735,275</position> 930 997 </checkbox> 931 998 932 <button name="coverart_button" from="basesearchbutton"> 933 <position>510,343</position> 999 <button name="coverart_button"> 1000 <area>310,323,32,32</area> 1001 <statetype name="buttonstate"> 1002 <state name="active"> 1003 <imagetype name="background"> 1004 <filename>blankbutton_off.png</filename> 1005 </imagetype> 1006 </state> 1007 <state name="selected" from="active"> 1008 <imagetype name="background"> 1009 <filename>blankbutton_on.png</filename> 1010 </imagetype> 1011 </state> 1012 <state name="disabled" from="active" /> 1013 <state name="pushed" from="active"> 1014 <imagetype name="background"> 1015 <filename>blankbutton_pushed.png</filename> 1016 </imagetype> 1017 </state> 1018 </statetype> 934 1019 </button> 935 1020 936 1021 <textarea name="coverart_text" from="basetextarea"> 937 <area> 550,348,250,40</area>1022 <area>350,328,250,40</area> 938 1023 <value>/path/to/the/thing.jpg</value> 939 1024 </textarea> 940 1025 941 <button name="screenshot_button" from="basesearchbutton"> 942 <position>510,372</position> 1026 <button name="screenshot_button"> 1027 <area>310,352,32,32</area> 1028 <statetype name="buttonstate"> 1029 <state name="active"> 1030 <imagetype name="background"> 1031 <filename>blankbutton_off.png</filename> 1032 </imagetype> 1033 </state> 1034 <state name="selected" from="active"> 1035 <imagetype name="background"> 1036 <filename>blankbutton_on.png</filename> 1037 </imagetype> 1038 </state> 1039 <state name="disabled" from="active" /> 1040 <state name="pushed" from="active"> 1041 <imagetype name="background"> 1042 <filename>blankbutton_pushed.png</filename> 1043 </imagetype> 1044 </state> 1045 </statetype> 943 1046 </button> 944 1047 945 1048 <textarea name="screenshot_text" from="basetextarea"> 946 <area> 550,377,250,40</area>1049 <area>350,357,250,40</area> 947 1050 <value>/path/to/the/thing.jpg</value> 948 1051 </textarea> 949 1052 950 <button name="banner_button" from="basesearchbutton"> 951 <position>510,401</position> 1053 <button name="banner_button"> 1054 <area>310,381,32,32</area> 1055 <statetype name="buttonstate"> 1056 <state name="active"> 1057 <imagetype name="background"> 1058 <filename>blankbutton_off.png</filename> 1059 </imagetype> 1060 </state> 1061 <state name="selected" from="active"> 1062 <imagetype name="background"> 1063 <filename>blankbutton_on.png</filename> 1064 </imagetype> 1065 </state> 1066 <state name="disabled" from="active" /> 1067 <state name="pushed" from="active"> 1068 <imagetype name="background"> 1069 <filename>blankbutton_pushed.png</filename> 1070 </imagetype> 1071 </state> 1072 </statetype> 952 1073 </button> 953 1074 954 1075 <textarea name="banner_text" from="basetextarea"> 955 <area> 550,406,250,40</area>1076 <area>350,386,250,40</area> 956 1077 <value>/path/to/the/thing.jpg</value> 957 1078 </textarea> 958 1079 959 <button name="fanart_button" from="basesearchbutton"> 960 <position>510,430</position> 1080 <button name="fanart_button"> 1081 <area>310,412,32,32</area> 1082 <statetype name="buttonstate"> 1083 <state name="active"> 1084 <imagetype name="background"> 1085 <filename>blankbutton_off.png</filename> 1086 </imagetype> 1087 </state> 1088 <state name="selected" from="active"> 1089 <imagetype name="background"> 1090 <filename>blankbutton_on.png</filename> 1091 </imagetype> 1092 </state> 1093 <state name="disabled" from="active" /> 1094 <state name="pushed" from="active"> 1095 <imagetype name="background"> 1096 <filename>blankbutton_pushed.png</filename> 1097 </imagetype> 1098 </state> 1099 </statetype> 961 1100 </button> 962 1101 963 1102 <textarea name="fanart_text" from="basetextarea"> 964 <area> 550,435,250,40</area>1103 <area>350,415,250,40</area> 965 1104 <value>/path/to/the/thing.jpg</value> 966 1105 </textarea> 967 1106 968 <button name="trailer_button" from="basesearchbutton"> 969 <position>510,460</position> 1107 <button name="trailer_button"> 1108 <area>310,442,32,32</area> 1109 <statetype name="buttonstate"> 1110 <state name="active"> 1111 <imagetype name="background"> 1112 <filename>blankbutton_off.png</filename> 1113 </imagetype> 1114 </state> 1115 <state name="selected" from="active"> 1116 <imagetype name="background"> 1117 <filename>blankbutton_on.png</filename> 1118 </imagetype> 1119 </state> 1120 <state name="disabled" from="active" /> 1121 <state name="pushed" from="active"> 1122 <imagetype name="background"> 1123 <filename>blankbutton_pushed.png</filename> 1124 </imagetype> 1125 </state> 1126 </statetype> 970 1127 </button> 971 1128 972 1129 <textarea name="trailer_text" from="basetextarea"> 973 <area> 550,465,250,40</area>1130 <area>350,447,250,40</area> 974 1131 <value>/path/to/the/thing.jpg</value> 975 1132 </textarea> 976 1133 1134 977 1135 <textedit name="player_edit" from="basetextedit"> 978 <position> 510,495</position>1136 <position>310,477</position> 979 1137 </textedit> 980 1138 981 1139 <button name="done_button" from="basebutton"> 982 <position> 510,565</position>1140 <position>310,537</position> 983 1141 <value>Done</value> 984 1142 </button> 985 1143 -
mythplugins/mythvideo/mythvideo/videodlg.h
28 28 29 29 enum CoverDownloadErrorState { esOK, esError, esTimeout }; 30 30 enum FanartDownloadErrorState { fesOK, fesError, fesTimeout }; 31 enum BannerDownloadErrorState { besOK, besError, besTimeout }; 31 32 32 33 class VideoDialog : public MythScreenType 33 34 { … … 68 69 69 70 void EditMetadata(); 70 71 void VideoSearch(); 72 void TitleSubtitleSearch(); 73 void ImageOnlyDownload(); 71 74 void ManualVideoUID(); 72 75 void ManualVideoTitle(); 73 76 void ResetMetadata(); … … 93 96 94 97 // Called when the underlying data for an item changes 95 98 void OnVideoSearchListSelection(QString video_uid); 99 void OnVideoImgSearchListSelection(QString video_uid); 96 100 97 101 void OnManualVideoUID(QString video_uid); 98 102 void OnManualVideoTitle(QString title); … … 140 144 // OnVideoPosterSetDone() stop wait background 141 145 void StartVideoPosterSet(Metadata *metadata); 142 146 void StartVideoFanartSet(Metadata *metadata); 147 void StartVideoBannerSet(Metadata *metadata); 143 148 144 149 // StartVideoSearchByUID() start wait background 145 150 // OnVideoSearchByUIDDone() stop wait background … … 150 155 // OnVideoSearchByTitleDone() 151 156 void StartVideoSearchByTitle(QString video_uid, QString title, 152 157 Metadata *metadata); 158 void StartVideoSearchByTitleSubtitle(QString title, 159 QString subtitle, Metadata *metadata); 153 160 154 161 private slots: 155 162 // called during StartVideoPosterSet … … 159 166 void OnFanartURL(QString uri, Metadata *metadata); 160 167 void OnFanartCopyFinished(FanartDownloadErrorState error, QString errorMsg, 161 168 Metadata *metadata); 169 void OnBannerURL(QString uri, Metadata *metadata); 170 void OnBannerCopyFinished(BannerDownloadErrorState error, QString errorMsg, 171 Metadata *metadata); 162 172 163 173 // called during StartVideoSearchByTitle 164 174 void OnVideoSearchByTitleDone(bool normal_exit, 165 175 const SearchListResults &results, 166 176 Metadata *metadata); 177 void OnVideoSearchByTitleSubtitleDone(bool normal_exit, 178 QStringList result, 179 Metadata *metadata); 180 void OnVideoImageOnlyDone(bool normal_exit, 181 const SearchListResults &results, 182 Metadata *metadata); 167 183 168 184 // and now the end points 169 185 170 186 // StartVideoPosterSet end 171 187 void OnVideoPosterSetDone(Metadata *metadata); 172 188 void OnVideoFanartSetDone(Metadata *metadata); 189 void OnVideoBannerSetDone(Metadata *metadata); 173 190 174 191 // StartVideoSearchByUID end 175 192 void OnVideoSearchByUIDDone(bool normal_exit, -
mythplugins/mythvideo/mythvideo/metadatalistmanager.cpp
112 112 MSqlQuery query(MSqlQuery::InitCon()); 113 113 query.setForwardOnly(true); 114 114 const QString BaseMetadataQuery( 115 "SELECT title, director, plot, rating, year, userrating," 116 "length, filename, showlevel, coverfile, inetref, childid," 117 "browse, playcommand, category, intid, trailer, screenshot," 118 "banner, fanart, host FROM videometadata"); 115 "SELECT title, director, plot, rating, year, " 116 "userrating, length, filename, showlevel, " 117 "coverfile, inetref, childid, browse, playcommand, category, " 118 "intid, trailer, screenshot, banner, fanart, " 119 "subtitle, season, episode, host FROM videometadata"); 119 120 120 121 query.prepare(BaseMetadataQuery); 121 122 -
mythplugins/mythvideo/mythvideo/metadata.cpp
89 89 public: 90 90 MetadataImp(const QString &filename, const QString &trailer, const QString &coverfile, 91 91 const QString &screenshot, const QString &banner, const QString &fanart, 92 const QString &title, int year,92 const QString &title, const QString &subtitle, int year, 93 93 const QString &inetref, const QString &director, 94 94 const QString &plot, float userrating, 95 95 const QString &rating, int length, 96 int season, int episode, 96 97 int id, ParentalLevel::Level showlevel, int categoryID, 97 98 int childID, bool browse, 98 99 const QString &playcommand, const QString &category, … … 100 101 const country_list &countries, 101 102 const cast_list &cast, 102 103 const QString &host = "") : 103 m_title(title), 104 m_title(title), m_subtitle(subtitle), 104 105 m_inetref(inetref), m_director(director), m_plot(plot), 105 106 m_rating(rating), m_playcommand(playcommand), m_category(category), 106 107 m_genres(genres), m_countries(countries), m_cast(cast), 107 108 m_filename(filename), m_trailer(trailer), m_coverfile(coverfile), 108 109 m_screenshot(screenshot), m_banner(banner), m_fanart(fanart), 109 110 m_host(host), m_categoryID(categoryID), m_childID(childID), 110 m_year(year), m_length(length), m_showlevel(showlevel), 111 m_year(year), m_length(length), m_season(season), 112 m_episode(episode), m_showlevel(showlevel), 111 113 m_browse(browse), m_id(id), m_userrating(userrating) 112 114 { 113 115 VideoCategory::GetCategory().get(m_categoryID, m_category); … … 128 130 if (this != &rhs) 129 131 { 130 132 m_title = rhs.m_title; 133 m_subtitle = rhs.m_subtitle; 131 134 m_inetref = rhs.m_inetref; 132 135 m_director = rhs.m_director; 133 136 m_plot = rhs.m_plot; … … 148 151 m_childID = rhs.m_childID; 149 152 m_year = rhs.m_year; 150 153 m_length = rhs.m_length; 154 m_season = rhs.m_season; 155 m_episode = rhs.m_episode; 151 156 m_showlevel = rhs.m_showlevel; 152 157 m_browse = rhs.m_browse; 153 158 m_id = rhs.m_id; … … 180 185 m_title = title; 181 186 } 182 187 188 const QString &getSubtitle() const { return m_subtitle; } 189 void SetSubtitle(const QString &subtitle) { m_subtitle = subtitle; } 190 183 191 const QString &GetInetRef() const { return m_inetref; } 184 192 void SetInetRef(const QString &inetRef) { m_inetref = inetRef; } 185 193 … … 249 257 int GetLength() const { return m_length; } 250 258 void SetLength(int length) { m_length = length; } 251 259 260 int GetSeason() const { return m_season; } 261 void SetSeason(int season) { m_season = season; } 262 263 int GetEpisode() const { return m_episode; } 264 void SetEpisode(int episode) { m_episode = episode; } 265 252 266 ParentalLevel::Level GetShowLevel() const { return m_showlevel; } 253 267 void SetShowLevel(ParentalLevel::Level showLevel) 254 268 { … … 289 303 290 304 private: 291 305 QString m_title; 306 QString m_subtitle; 292 307 QString m_inetref; 293 308 QString m_director; 294 309 QString m_plot; … … 310 325 int m_childID; 311 326 int m_year; 312 327 int m_length; 328 int m_season; 329 int m_episode; 313 330 ParentalLevel::Level m_showlevel; 314 331 bool m_browse; 315 332 unsigned int m_id; // videometadata.intid … … 383 400 { 384 401 MetadataImp tmp(m_filename, VIDEO_TRAILER_DEFAULT, VIDEO_COVERFILE_DEFAULT, 385 402 VIDEO_SCREENSHOT_DEFAULT, VIDEO_BANNER_DEFAULT, 386 VIDEO_FANART_DEFAULT, Metadata::FilenameToTitle(m_filename), 387 VIDEO_YEAR_DEFAULT, VIDEO_INETREF_DEFAULT, 388 VIDEO_DIRECTOR_DEFAULT, VIDEO_PLOT_DEFAULT, 0.0, 389 VIDEO_RATING_DEFAULT, 0, m_id, 403 VIDEO_FANART_DEFAULT, Metadata::FilenameToMeta(m_filename, 1), 404 Metadata::FilenameToMeta(m_filename, 4), VIDEO_YEAR_DEFAULT, 405 VIDEO_INETREF_DEFAULT, VIDEO_DIRECTOR_DEFAULT, 406 VIDEO_PLOT_DEFAULT, 0.0, 407 VIDEO_RATING_DEFAULT, 0, 408 Metadata::FilenameToMeta(m_filename, 2).toInt(), 409 Metadata::FilenameToMeta(m_filename, 3).toInt(), m_id, 390 410 ParentalLevel::plLowest, 0, -1, true, "", "", 391 411 Metadata::genre_list(), Metadata::country_list(), 392 412 Metadata::cast_list(), m_host); … … 484 504 m_screenshot = query.value(17).toString(); 485 505 m_banner = query.value(18).toString(); 486 506 m_fanart = query.value(19).toString(); 487 m_host = query.value(20).toString(); 507 m_subtitle = query.value(20).toString(); 508 m_season = query.value(21).toInt(); 509 m_episode = query.value(22).toInt(); 510 m_host = query.value(23).toString(); 488 511 489 512 VideoCategory::GetCategory().get(m_categoryID, m_category); 490 513 … … 501 524 void MetadataImp::saveToDatabase() 502 525 { 503 526 if (m_title.isEmpty()) 504 m_title = Metadata::FilenameToTitle(m_filename); 527 m_title = Metadata::FilenameToMeta(m_filename, 1); 528 if (m_subtitle.isEmpty()) 529 m_subtitle = Metadata::FilenameToMeta(m_filename, 4); 505 530 if (m_director.isEmpty()) 506 531 m_director = VIDEO_DIRECTOR_UNKNOWN; 507 532 if (m_plot.isEmpty()) 508 533 m_plot = VIDEO_PLOT_DEFAULT; 509 534 if (m_rating.isEmpty()) 510 535 m_rating = VIDEO_RATING_DEFAULT; 536 if (m_season == 0) 537 m_season = Metadata::FilenameToMeta(m_filename, 2).toInt(); 538 if (m_episode == 0) 539 m_episode = Metadata::FilenameToMeta(m_filename, 3).toInt(); 511 540 if (m_coverfile.isEmpty()) 512 541 m_coverfile = VIDEO_COVERFILE_DEFAULT; 513 542 if (m_screenshot.isEmpty()) … … 533 562 { 534 563 m_browse = gContext->GetNumSetting("VideoNewBrowsable", 1); 535 564 536 query.prepare("INSERT INTO videometadata (title, director,plot,"537 "rating,year,userrating,length, filename,showlevel,"538 " coverfile,inetref,browse,trailer,screenshot,banner,"539 "fanart,host) VALUES (:TITLE, : DIRECTOR, :PLOT, :RATING, "540 ": YEAR, :USERRATING, :LENGTH, :FILENAME, :SHOWLEVEL, "541 ": COVERFILE, :INETREF, :BROWSE, :TRAILER, :SCREENSHOT, "542 ": BANNER, :FANART, :HOST)");565 query.prepare("INSERT INTO videometadata (title,subtitle,director,plot," 566 "rating,year,userrating,length,season,episode,filename," 567 "showlevel,coverfile,inetref,browse,trailer,screenshot,banner," 568 "fanart,host) VALUES (:TITLE, :SUBTITLE, :DIRECTOR, :PLOT, " 569 ":RATING, :YEAR, :USERRATING, :LENGTH, :SEASON, :EPISODE, " 570 ":FILENAME, :SHOWLEVEL, :COVERFILE, :INETREF, :BROWSE, " 571 ":TRAILER, :SCREENSHOT, :BANNER, :FANART, :HOST)"); 543 572 } 544 573 else 545 574 { 546 query.prepare("UPDATE videometadata SET title = :TITLE, "575 query.prepare("UPDATE videometadata SET title = :TITLE, subtitle = :SUBTITLE, " 547 576 "director = :DIRECTOR, plot = :PLOT, rating= :RATING, " 548 577 "year = :YEAR, userrating = :USERRATING, " 549 "length = :LENGTH, filename = :FILENAME, trailer = :TRAILER, " 578 "length = :LENGTH, season = :SEASON, episode = :EPISODE, " 579 "filename = :FILENAME, trailer = :TRAILER, " 550 580 "showlevel = :SHOWLEVEL, coverfile = :COVERFILE, " 551 581 "screenshot = :SCREENSHOT, banner = :BANNER, fanart = :FANART, " 552 582 "inetref = :INETREF, browse = :BROWSE, host = :HOST, " … … 560 590 } 561 591 562 592 query.bindValue(":TITLE", m_title); 593 query.bindValue(":SUBTITLE", m_subtitle); 563 594 query.bindValue(":DIRECTOR", m_director); 564 595 query.bindValue(":PLOT", m_plot); 565 596 query.bindValue(":RATING", m_rating); 566 597 query.bindValue(":YEAR", m_year); 567 598 query.bindValue(":USERRATING", m_userrating); 568 599 query.bindValue(":LENGTH", m_length); 600 query.bindValue(":SEASON", m_season); 601 query.bindValue(":EPISODE", m_episode); 569 602 query.bindValue(":FILENAME", m_filename); 570 603 query.bindValue(":TRAILER", m_trailer); 571 604 query.bindValue(":SHOWLEVEL", m_showlevel); … … 795 828 } 796 829 } 797 830 798 QString Metadata::FilenameTo Title(const QString &file_name)831 QString Metadata::FilenameToMeta(const QString &file_name, int position) 799 832 { 833 // position 1 returns title, 2 returns season, 834 // 3 returns episode, 4 returns subtitle 835 800 836 QString title = file_name.right(file_name.length() - 801 837 file_name.lastIndexOf('/') - 1); 838 802 839 title.replace(QRegExp("_"), " "); 803 840 title.replace(QRegExp("%20"), " "); 841 title.replace(QRegExp("-"), " "); 804 842 title = title.left(title.lastIndexOf('.')); 805 843 title.replace(QRegExp("\\."), " "); 806 844 807 title = eatBraces(title, "[", "]"); 808 title = eatBraces(title, "(", ")"); 809 title = eatBraces(title, "{", "}"); 845 QRegExp group("^(.*[^s0-9])" // title 846 "(?:[s])?(\\d{1,3})(?:\\s|-)?(?:[ex])" //Season 847 "(?:\\s|-)?(\\d{1,3})" // Episode 848 "(.*)$", // subtitle 849 Qt::CaseInsensitive); 850 int pos = group.indexIn(title); 851 if (pos > -1) 852 { 853 QString groupResult = group.cap(0); 854 QString title = group.cap(1); 855 QString season = group.cap(2); 856 QString episode = group.cap(3); 857 QString subtitle = group.cap(4); 858 if (position == 1 && !title.isEmpty()) 859 return title.trimmed(); 860 else if (position == 2) 861 return season.trimmed(); 862 else if (position == 3) 863 return episode.trimmed(); 864 else if (position == 4) 865 return subtitle.trimmed(); 866 } 867 else if (position == 1) 868 { 869 title = eatBraces(title, "[", "]"); 870 title = eatBraces(title, "(", ")"); 871 title = eatBraces(title, "{", "}"); 872 return title.trimmed(); 873 } 874 else if (position == 2 || position == 3) 875 return QString("0"); 810 876 811 return title.trimmed();877 return QString(""); 812 878 } 813 879 814 880 namespace … … 829 895 return ret; 830 896 } 831 897 832 Metadata::Metadata(const QString &filename, const QString &trailer, 833 const QString &coverfile, const QString &screenshot, 834 const QString &banner, const QString &fanart, 835 const QString &title, int year,898 Metadata::Metadata(const QString &filename, const QString &trailer, 899 const QString &coverfile, const QString &screenshot, 900 const QString &banner, const QString &fanart, 901 const QString &title, const QString &subtitle, int year, 836 902 const QString &inetref, const QString &director, 837 903 const QString &plot, float userrating, 838 904 const QString &rating, int length, 905 int season, int episode, 839 906 int id, ParentalLevel::Level showlevel, int categoryID, 840 907 int childID, bool browse, 841 908 const QString &playcommand, const QString &category, … … 845 912 const QString &host) 846 913 { 847 914 m_imp = new MetadataImp(filename, trailer, coverfile, screenshot, banner, 848 fanart, title, year, inetref, director, plot,849 userrating, rating, length, id, showlevel,850 categoryID, childID, browse, playcommand, category,851 genres, countries, cast, host);915 fanart, title, subtitle, year, inetref, director, plot, 916 userrating, rating, length, season, episode, id, 917 showlevel, categoryID, childID, browse, playcommand, 918 category, genres, countries, cast, host); 852 919 } 853 920 854 921 Metadata::~Metadata() … … 911 978 m_imp->SetTitle(title); 912 979 } 913 980 981 const QString &Metadata::GetSubtitle() const 982 { 983 return m_imp->getSubtitle(); 984 } 985 986 void Metadata::SetSubtitle(const QString &subtitle) 987 { 988 m_imp->SetSubtitle(subtitle); 989 } 990 914 991 int Metadata::GetYear() const 915 992 { 916 993 return m_imp->getYear(); … … 981 1058 m_imp->SetLength(length); 982 1059 } 983 1060 1061 int Metadata::GetSeason() const 1062 { 1063 return m_imp->GetSeason(); 1064 } 1065 1066 void Metadata::SetSeason(int season) 1067 { 1068 m_imp->SetSeason(season); 1069 } 1070 1071 int Metadata::GetEpisode() const 1072 { 1073 return m_imp->GetEpisode(); 1074 } 1075 1076 void Metadata::SetEpisode(int episode) 1077 { 1078 m_imp->SetEpisode(episode); 1079 } 1080 984 1081 unsigned int Metadata::GetID() const 985 1082 { 986 1083 return m_imp->GetID(); -
mythplugins/mythvideo/mythvideo/globalsettings.cpp
235 235 return gc; 236 236 } 237 237 238 HostLineEdit *SearchTVListingsCommand() 239 { 240 HostLineEdit *gc = new HostLineEdit("mythvideo.TVListCommandLine"); 241 gc->setLabel(QObject::tr("Command to search for TV shows in MythVideo")); 242 gc->setValue(GetShareDir() + "mythvideo/scripts/ttvdb.py -M"); 243 gc->setHelpText(QObject::tr("This command must be " 244 "executable by the user running MythVideo.")); 245 return gc; 246 } 247 248 HostLineEdit *GetTVPostersCommand() 249 { 250 HostLineEdit *gc = new HostLineEdit("mythvideo.TVPosterCommandLine"); 251 gc->setLabel(QObject::tr("Command to search for TV Season posters")); 252 gc->setValue(GetShareDir() + "mythvideo/scripts/ttvdb.py -mP"); 253 gc->setHelpText(QObject::tr("This command must be " 254 "executable by the user running MythVideo.")); 255 return gc; 256 } 257 258 HostLineEdit *GetTVFanartCommand() 259 { 260 HostLineEdit *gc = new HostLineEdit("mythvideo.TVFanartCommandLine"); 261 gc->setLabel(QObject::tr("Command to search for TV fanart")); 262 gc->setValue(GetShareDir() + "mythvideo/scripts/ttvdb.py -tF"); 263 gc->setHelpText(QObject::tr("This command must be " 264 "executable by the user running MythVideo.")); 265 return gc; 266 } 267 268 HostLineEdit *GetTVBannerCommand() 269 { 270 HostLineEdit *gc = new HostLineEdit("mythvideo.TVBannerCommandLine"); 271 gc->setLabel(QObject::tr("Command to search for TV banners")); 272 gc->setValue(GetShareDir() + "mythvideo/scripts/ttvdb.py -tB"); 273 gc->setHelpText(QObject::tr("This command must be " 274 "executable by the user running MythVideo.")); 275 return gc; 276 } 277 278 HostLineEdit *GetTVDataCommand() 279 { 280 HostLineEdit *gc = new HostLineEdit("mythvideo.TVDataCommandLine"); 281 gc->setLabel(QObject::tr("Command to extract data for TV Episodes")); 282 gc->setValue(GetShareDir() + "mythvideo/scripts/ttvdb.py -D"); 283 gc->setHelpText(QObject::tr("This command must be " 284 "executable by the user running MythVideo.")); 285 return gc; 286 } 287 288 HostLineEdit *GetTVTitleSubCommand() 289 { 290 HostLineEdit *gc = new HostLineEdit("mythvideo.TVTitleSubCommandLine"); 291 gc->setLabel(QObject::tr("Command to search for TV by Title/Subtitle")); 292 gc->setValue(GetShareDir() + "mythvideo/scripts/ttvdb.py -N"); 293 gc->setHelpText(QObject::tr("This command must be " 294 "executable by the user running MythVideo.")); 295 return gc; 296 } 297 238 298 HostLineEdit *VideoStartupDirectory() 239 299 { 240 300 HostLineEdit *gc = new HostLineEdit("VideoStartupDir"); … … 776 836 VConfigPage page7(pages, false); 777 837 page7->addChild(trlr); 778 838 839 // page 8 840 VerticalConfigurationGroup *tvman = 841 new VerticalConfigurationGroup(true, false); 842 tvman->setLabel(QObject::tr("Television in MythVideo")); 843 tvman->addChild(SearchTVListingsCommand()); 844 tvman->addChild(GetTVPostersCommand()); 845 tvman->addChild(GetTVFanartCommand()); 846 tvman->addChild(GetTVBannerCommand()); 847 tvman->addChild(GetTVDataCommand()); 848 tvman->addChild(GetTVTitleSubCommand()); 849 850 VConfigPage page8(pages, false); 851 page8->addChild(tvman); 852 779 853 int page_num = 1; 780 854 for (ConfigPage::PageList::const_iterator p = pages.begin(); 781 855 p != pages.end(); ++p, ++page_num) -
mythplugins/mythvideo/mythvideo/videofilter.h
54 54 kOrderByUserRatingDescending = 2, 55 55 kOrderByLength = 3, 56 56 kOrderByFilename = 4, 57 kOrderByID = 5 57 kOrderByID = 5, 58 kOrderBySeasonEp = 6 58 59 }; 59 60 60 61 int GetCategory() const { return category; } -
mythplugins/mythvideo/mythvideo/dbcheck.cpp
38 38 const QString lastMythDVDDBVersion = "1002"; 39 39 const QString lastMythVideoVersion = "1010"; 40 40 41 const QString currentDatabaseVersion = "102 3";41 const QString currentDatabaseVersion = "1024"; 42 42 43 43 const QString OldMythVideoVersionName = "VideoDBSchemaVer"; 44 44 const QString OldMythDVDVersionName = "DVDDBSchemaVer"; … … 834 834 performActualUpdate(updates, "1023", dbver, MythVideoVersionName); 835 835 } 836 836 837 if (dbver == "1023") 838 { 839 QStringList updates; 840 updates += "ALTER TABLE videometadata ADD `subtitle` TEXT " 841 "NOT NULL AFTER `title`;"; 842 updates += "ALTER TABLE videometadata ADD `season` SMALLINT " 843 "UNSIGNED NOT NULL DEFAULT '0' AFTER `length`;"; 844 updates += "ALTER TABLE videometadata ADD `episode` SMALLINT " 845 "UNSIGNED NOT NULL DEFAULT '0' AFTER `season`;"; 846 performActualUpdate(updates, "1024", dbver, MythVideoVersionName); 847 } 837 848 838 849 } 839 850 } -
mythplugins/mythvideo/mythvideo/videoutils.cpp
139 139 return QString("%1 minutes").arg(length); 140 140 } 141 141 142 QString GetDisplaySeasonEpisode(int seasEp, int digits) 143 { 144 QString seasEpNum = QString::number(seasEp); 145 146 if (digits == 2 && seasEpNum.size() < 2) 147 seasEpNum.prepend("0"); 148 149 return seasEpNum; 150 } 151 142 152 QString GetDisplayBrowse(bool browse) 143 153 { 144 154 return browse ? QObject::tr("Yes") : QObject::tr("No"); -
mythplugins/mythvideo/mythvideo/editmetadata.h
10 10 class MythUIText; 11 11 class MythUITextEdit; 12 12 class MythUIButton; 13 class MythUISpinBox; 13 14 class MythUICheckBox; 14 15 15 16 class EditMetadataDialog : public MythScreenType … … 34 35 public slots: 35 36 void SaveAndExit(); 36 37 void SetTitle(); 38 void SetSubtitle(); 37 39 void SetCategory(MythUIButtonListItem*); 38 40 void SetPlayer(); 41 void SetSeason(); 42 void SetEpisode(); 39 43 void SetLevel(MythUIButtonListItem*); 40 44 void SetChild(MythUIButtonListItem*); 41 45 void ToggleBrowse(); … … 60 64 // 61 65 62 66 MythUITextEdit *m_titleEdit; 67 MythUITextEdit *m_subtitleEdit; 63 68 MythUITextEdit *m_playerEdit; 69 MythUISpinBox *m_seasonSpin; 70 MythUISpinBox *m_episodeSpin; 64 71 MythUIButtonList *m_categoryList; 65 72 MythUIButtonList *m_levelList; 66 73 MythUIButtonList *m_childList; -
mythplugins/mythvideo/mythvideo/videodlg.cpp
288 288 FanartDownloadErrorState m_error_state; 289 289 }; 290 290 291 class BannerDownloadProxy : public QObject 292 { 293 Q_OBJECT 294 295 signals: 296 void SigFinished(BannerDownloadErrorState reason, QString errorMsg, 297 Metadata *item); 298 public: 299 static BannerDownloadProxy *Create(const QUrl &url, const QString &dest, 300 Metadata *item) 301 { 302 return new BannerDownloadProxy(url, dest, item); 303 } 304 305 public: 306 void StartCopy() 307 { 308 m_id = m_http.get(m_url.toString(), &m_data_buffer); 309 310 m_timer.start(gContext->GetNumSetting("BannerDownloadTimeout", 30) 311 * 1000); 312 } 313 314 void Stop() 315 { 316 if (m_timer.isActive()) 317 m_timer.stop(); 318 319 VERBOSE(VB_GENERAL, tr("Banner download stopped.")); 320 m_http.abort(); 321 } 322 323 private: 324 BannerDownloadProxy(const QUrl &url, const QString &dest, 325 Metadata *item) : m_item(item), m_dest_file(dest), 326 m_id(0), m_url(url), m_error_state(besOK) 327 { 328 connect(&m_http, SIGNAL(requestFinished(int, bool)), 329 SLOT(OnFinished(int, bool))); 330 331 connect(&m_timer, SIGNAL(timeout()), SLOT(OnDownloadTimeout())); 332 m_timer.setSingleShot(true); 333 m_http.setHost(m_url.host()); 334 } 335 336 ~BannerDownloadProxy() {} 337 338 private slots: 339 void OnDownloadTimeout() 340 { 341 VERBOSE(VB_IMPORTANT, QString("Copying of '%1' timed out") 342 .arg(m_url.toString())); 343 m_error_state = besTimeout; 344 Stop(); 345 } 346 347 void OnFinished(int id, bool error) 348 { 349 QString errorMsg; 350 if (error) 351 errorMsg = m_http.errorString(); 352 353 if (id == m_id) 354 { 355 if (m_timer.isActive()) 356 m_timer.stop(); 357 358 if (!error) 359 { 360 QFile dest_file(m_dest_file); 361 if (dest_file.exists()) 362 dest_file.remove(); 363 364 if (dest_file.open(QIODevice::WriteOnly)) 365 { 366 const QByteArray &data = m_data_buffer.data(); 367 qint64 size = dest_file.write(data); 368 if (size != data.size()) 369 { 370 errorMsg = tr("Error writing data to file %1.") 371 .arg(m_dest_file); 372 m_error_state = besError; 373 } 374 } 375 else 376 { 377 errorMsg = tr("Error: file error '%1' for file %2"). 378 arg(dest_file.errorString()).arg(m_dest_file); 379 m_error_state = besError; 380 } 381 } 382 383 emit SigFinished(m_error_state, errorMsg, m_item); 384 } 385 } 386 387 private: 388 Metadata *m_item; 389 QHttp m_http; 390 QBuffer m_data_buffer; 391 QString m_dest_file; 392 int m_id; 393 QTimer m_timer; 394 QUrl m_url; 395 BannerDownloadErrorState m_error_state; 396 }; 397 291 398 /** \class ExecuteExternalCommand 292 399 * 293 400 * \brief Base class for executing an external script or other process, must … … 467 574 void Run(QString title, Metadata *item) 468 575 { 469 576 m_item = item; 577 int m_season, m_episode; 578 QString cmd; 579 m_season = m_item->GetSeason(); 580 m_episode = m_item->GetEpisode(); 470 581 471 QString def_cmd = QDir::cleanPath(QString("%1/%2") 582 if (m_season > 0 || m_episode > 0) 583 { 584 const QString def_cmd = QDir::cleanPath(QString("%1/%2") 472 585 .arg(GetShareDir()) 586 .arg("mythvideo/scripts/ttvdb.py -M")); 587 cmd = gContext->GetSetting("mythvideo.TVListCommandLine", 588 def_cmd); 589 } 590 else 591 { 592 QString def_cmd = QDir::cleanPath(QString("%1/%2") 593 .arg(GetShareDir()) 473 594 .arg("mythvideo/scripts/tmdb.pl -M")); 474 595 475 QStringcmd = gContext->GetSetting("MovieListCommandLine", def_cmd);476 477 QStringList args;478 args += title;479 StartRun(cmd, args, "Video Search");596 cmd = gContext->GetSetting("MovieListCommandLine", def_cmd); 597 } 598 QStringList args; 599 args += title; 600 StartRun(cmd, args, "Video Search"); 480 601 } 481 602 482 603 private: … … 505 626 Metadata *m_item; 506 627 }; 507 628 629 /** \class VideoTitleSubtitleSearch 630 * 631 * \brief Executes the external command to do video title/subtitle searches. 632 * 633 */ 634 class VideoTitleSubtitleSearch : public ExecuteExternalCommand 635 { 636 Q_OBJECT 637 638 signals: 639 void SigSearchResults(bool normal_exit, QStringList result, 640 Metadata *item); 641 642 public: 643 VideoTitleSubtitleSearch(QObject *oparent) : 644 ExecuteExternalCommand(oparent), m_item(0) {} 645 646 void Run(QString title, QString subtitle, Metadata *item) 647 { 648 m_item = item; 649 QString cmd; 650 651 const QString def_cmd = QDir::cleanPath(QString("%1/%2") 652 .arg(GetShareDir()) 653 .arg("mythvideo/scripts/ttvdb.py -N")); 654 cmd = gContext->GetSetting("mythvideo.TVTitleSubCommandLine", 655 def_cmd); 656 QStringList args; 657 args += title; 658 args += subtitle; 659 StartRun(cmd, args, "Video Search"); 660 } 661 662 private: 663 ~VideoTitleSubtitleSearch() {} 664 665 void OnExecDone(bool normal_exit, QStringList out, QStringList err) 666 { 667 (void) err; 668 669 emit SigSearchResults(normal_exit, out, m_item); 670 deleteLater(); 671 } 672 673 private: 674 Metadata *m_item; 675 }; 676 508 677 /** \class VideoUIDSearch 509 678 * 510 679 * \brief Execute the command to do video searches based on their ID. … … 525 694 void Run(QString video_uid, Metadata *item) 526 695 { 527 696 m_item = item; 528 m_video_uid = video_uid; 697 m_video_uid = video_uid; 698 int m_season, m_episode; 699 m_season = m_item->GetSeason(); 700 m_episode = m_item->GetEpisode(); 529 701 530 const QString def_cmd = QDir::cleanPath(QString("%1/%2") 702 if (m_season > 0 || m_episode > 0) 703 { 704 const QString def_cmd = QDir::cleanPath(QString("%1/%2") 531 705 .arg(GetShareDir()) 706 .arg("mythvideo/scripts/ttvdb.py -mD")); 707 const QString cmd = gContext->GetSetting("mythvideo.TVDataCommandLine", 708 def_cmd); 709 QStringList args; 710 args << video_uid << QString::number(m_season) 711 << QString::number(m_episode); 712 StartRun(cmd, args, "Video Data Query"); 713 } 714 else 715 { 716 const QString def_cmd = QDir::cleanPath(QString("%1/%2") 717 .arg(GetShareDir()) 532 718 .arg("mythvideo/scripts/tmdb.pl -D")); 533 const QString cmd = gContext->GetSetting("MovieDataCommandLine",719 const QString cmd = gContext->GetSetting("MovieDataCommandLine", 534 720 def_cmd); 535 536 StartRun(cmd, QStringList(video_uid), "Video Data Query");721 StartRun(cmd, QStringList(video_uid), "Video Data Query"); 722 } 537 723 } 538 724 539 725 private: … … 570 756 void Run(QString video_uid, Metadata *item) 571 757 { 572 758 m_item = item; 759 int m_season, m_episode; 760 m_season = m_item->GetSeason(); 761 m_episode = m_item->GetEpisode(); 573 762 574 const QString default_cmd = 763 if (m_season > 0 || m_episode > 0) 764 { 765 const QString def_cmd = QDir::cleanPath(QString("%1/%2") 766 .arg(GetShareDir()) 767 .arg("mythvideo/scripts/ttvdb.py -mP")); 768 const QString cmd = gContext->GetSetting("mythvideo.TVPosterCommandLine", 769 def_cmd); 770 QStringList args; 771 args << video_uid << QString::number(m_season) 772 << QString::number(m_episode); 773 StartRun(cmd, args, "Poster Query"); 774 } 775 else 776 { 777 const QString default_cmd = 575 778 QDir::cleanPath(QString("%1/%2") 576 779 .arg(GetShareDir()) 577 780 .arg("mythvideo/scripts/tmdb.pl -P")); 578 const QString cmd = gContext->GetSetting("MoviePosterCommandLine",781 const QString cmd = gContext->GetSetting("MoviePosterCommandLine", 579 782 default_cmd); 580 StartRun(cmd, QStringList(video_uid), "Poster Query"); 783 784 StartRun(cmd, QStringList(video_uid), "Poster Query"); 785 } 581 786 } 582 787 583 788 private: … … 627 832 void Run(QString video_uid, Metadata *item) 628 833 { 629 834 m_item = item; 835 int m_season, m_episode; 836 m_season = m_item->GetSeason(); 837 m_episode = m_item->GetEpisode(); 630 838 631 const QString default_cmd = 839 if (m_season > 0 || m_episode > 0) 840 { 841 const QString def_cmd = QDir::cleanPath(QString("%1/%2") 842 .arg(GetShareDir()) 843 .arg("mythvideo/scripts/ttvdb.py -tF")); 844 const QString cmd = gContext->GetSetting("mythvideo.TVFanartCommandLine", 845 def_cmd); 846 QStringList args; 847 args << video_uid << QString::number(m_season) 848 << QString::number(m_episode); 849 StartRun(cmd, args, "Fanart Query"); 850 } 851 else 852 { 853 const QString default_cmd = 632 854 QDir::cleanPath(QString("%1/%2") 633 855 .arg(GetShareDir()) 634 856 .arg("mythvideo/scripts/tmdb.pl -B")); 635 const QString cmd = gContext->GetSetting("MovieFanartCommandLine",857 const QString cmd = gContext->GetSetting("MovieFanartCommandLine", 636 858 default_cmd); 637 StartRun(cmd, QStringList(video_uid), "Fanart Query"); 859 StartRun(cmd, QStringList(video_uid), "Fanart Query"); 860 } 638 861 } 639 862 640 863 private: … … 665 888 Metadata *m_item; 666 889 }; 667 890 891 /** \class VideoBannerSearch 892 * 893 * \brief Execute external video banner command. 894 * 895 */ 896 class VideoBannerSearch : public ExecuteExternalCommand 897 { 898 Q_OBJECT 668 899 900 signals: 901 void SigBannerURL(QString url, Metadata *item); 902 903 public: 904 VideoBannerSearch(QObject *oparent) : 905 ExecuteExternalCommand(oparent), m_item(0) {} 906 907 void Run(QString video_uid, Metadata *item) 908 { 909 m_item = item; 910 int m_season, m_episode; 911 m_season = m_item->GetSeason(); 912 m_episode = m_item->GetEpisode(); 913 914 const QString def_cmd = QDir::cleanPath(QString("%1/%2") 915 .arg(GetShareDir()) 916 .arg("mythvideo/scripts/ttvdb.py -tB")); 917 const QString cmd = gContext->GetSetting("mythvideo.TVBannerCommandLine", 918 def_cmd); 919 QStringList args; 920 args << video_uid << QString::number(m_season) 921 << QString::number(m_episode); 922 StartRun(cmd, args, "Banner Query"); 923 } 924 925 private: 926 ~VideoBannerSearch() {} 927 928 void OnExecDone(bool normal_exit, QStringList out, QStringList err) 929 { 930 (void) err; 931 QString url; 932 if (normal_exit && out.size()) 933 { 934 for (QStringList::const_iterator p = out.begin(); 935 p != out.end(); ++p) 936 { 937 if ((*p).length()) 938 { 939 url = *p; 940 break; 941 } 942 } 943 } 944 945 emit SigBannerURL(url, m_item); 946 deleteLater(); 947 } 948 949 private: 950 Metadata *m_item; 951 }; 952 669 953 class ParentalLevelNotifyContainer : public QObject 670 954 { 671 955 Q_OBJECT … … 790 1074 } 791 1075 }; 792 1076 793 bool GetLocalVideoPoster(const QString &video_uid, const QString &filename, 794 const QStringList &in_dirs, QString &poster) 1077 bool GetLocalVideoImage(const QString &video_uid, const QString &filename, 1078 const QStringList &in_dirs, QString &image, 1079 QString title, int season) 795 1080 { 796 1081 QStringList search_dirs(in_dirs); 797 1082 … … 821 1106 ext != image_exts.end(); ++ext) 822 1107 { 823 1108 QStringList sfn; 1109 if (season > 0) 1110 sfn += fntm.arg(*dir).arg(QString("%1 Season %2") 1111 .arg(title).arg(QString::number(season))) 1112 .arg(*ext); 824 1113 sfn += fntm.arg(*dir).arg(base_name).arg(*ext); 825 1114 sfn += fntm.arg(*dir).arg(video_uid).arg(*ext); 826 1115 … … 829 1118 { 830 1119 if (QFile::exists(*i)) 831 1120 { 832 poster= *i;1121 image = *i; 833 1122 return true; 834 1123 } 835 1124 } … … 1016 1305 1017 1306 tmp["filename"] = metadata->GetFilename(); 1018 1307 tmp["title"] = metadata->GetTitle(); 1308 tmp["subtitle"] = metadata->GetSubtitle(); 1019 1309 tmp["director"] = metadata->GetDirector(); 1020 1310 tmp["plot"] = metadata->GetPlot(); 1021 1311 tmp["genres"] = GetDisplayGenres(*metadata); … … 1025 1315 tmp["length"] = GetDisplayLength(metadata->GetLength()); 1026 1316 tmp["year"] = GetDisplayYear(metadata->GetYear()); 1027 1317 tmp["userrating"] = GetDisplayUserRating(metadata->GetUserRating()); 1318 tmp["season"] = GetDisplaySeasonEpisode(metadata->GetSeason(), 1); 1319 tmp["episode"] = GetDisplaySeasonEpisode(metadata->GetEpisode(), 1); 1028 1320 1321 if (metadata->GetSeason() > 0 || metadata->GetEpisode() > 0) 1322 { 1323 tmp["s##e##"] = QString("s%1e%2").arg(GetDisplaySeasonEpisode 1324 (metadata->GetSeason(), 2)) 1325 .arg(GetDisplaySeasonEpisode(metadata->GetEpisode(), 2)); 1326 tmp["##x##"] = QString("%1x%2").arg(GetDisplaySeasonEpisode 1327 (metadata->GetSeason(), 1)) 1328 .arg(GetDisplaySeasonEpisode(metadata->GetEpisode(), 2)); 1329 } 1330 else 1331 tmp["s##e##"] = tmp["##x##"] = ""; 1332 1029 1333 tmp["userratingstate"] = 1030 1334 QString::number((int)(metadata->GetUserRating())); 1031 1335 tmp["videolevel"] = ParentalLevelToState(metadata->GetShowLevel()); … … 1075 1379 h.handleText("player"); 1076 1380 h.handleText("filename"); 1077 1381 h.handleText("title"); 1382 h.handleText("subtitle"); 1078 1383 h.handleText("director"); 1079 1384 h.handleText("plot"); 1080 1385 h.handleText("genres"); … … 1082 1387 h.handleText("cast"); 1083 1388 h.handleText("rating"); 1084 1389 h.handleText("length"); 1390 h.handleText("season"); 1391 h.handleText("s##e##"); 1392 h.handleText("##x##"); 1393 h.handleText("episode"); 1085 1394 h.handleText("year"); 1086 1395 h.handleText("userrating"); 1087 1396 … … 1254 1563 1255 1564 m_artDir = gContext->GetSetting("VideoArtworkDir"); 1256 1565 m_fanDir = gContext->GetSetting("mythvideo.fanartDir"); 1566 m_banDir = gContext->GetSetting("mythvideo.bannerDir"); 1257 1567 } 1258 1568 1259 1569 ~VideoDialogPrivate() … … 1322 1632 } 1323 1633 } 1324 1634 1635 void AddBannerDownload(BannerDownloadProxy *download) 1636 { 1637 m_running_bdownloads.insert(download); 1638 } 1639 1640 void RemoveBannerDownload(BannerDownloadProxy *download) 1641 { 1642 if (download) 1643 { 1644 banner_download_list::iterator p = 1645 m_running_bdownloads.find(download); 1646 if (p != m_running_bdownloads.end()) 1647 m_running_bdownloads.erase(p); 1648 } 1649 } 1650 1325 1651 void StopAllRunningCoverDownloads() 1326 1652 { 1327 1653 cover_download_list tmp(m_running_downloads); … … 1336 1662 (*p)->Stop(); 1337 1663 } 1338 1664 1665 void StopAllRunningBannerDownloads() 1666 { 1667 banner_download_list tmp(m_running_bdownloads); 1668 for (banner_download_list::iterator p = tmp.begin(); p != tmp.end(); ++p) 1669 (*p)->Stop(); 1670 } 1339 1671 1340 1672 public: 1341 1673 typedef std::set<CoverDownloadProxy *> cover_download_list; 1342 1674 cover_download_list m_running_downloads; 1343 1675 typedef std::set<FanartDownloadProxy *> fanart_download_list; 1344 1676 fanart_download_list m_running_fdownloads; 1677 typedef std::set<BannerDownloadProxy *> banner_download_list; 1678 banner_download_list m_running_bdownloads; 1345 1679 ParentalLevelNotifyContainer m_parentalLevel; 1346 1680 bool m_switchingLayout; 1347 1681 … … 1364 1698 1365 1699 QString m_artDir; 1366 1700 QString m_fanDir; 1701 QString m_banDir; 1367 1702 VideoScanner *m_scanner; 1368 1703 1369 1704 QString m_lastTreeNodePath; … … 2275 2610 2276 2611 m_menuPopup->AddButton(tr("Edit Metadata"), SLOT(EditMetadata())); 2277 2612 m_menuPopup->AddButton(tr("Download Metadata"), SLOT(VideoSearch())); 2613 m_menuPopup->AddButton(tr("Download Images Only"), 2614 SLOT(ImageOnlyDownload())); 2615 m_menuPopup->AddButton(tr("Search TV by Title/Subtitle"), 2616 SLOT(TitleSubtitleSearch())); 2278 2617 m_menuPopup->AddButton(tr("Manually Enter Video #"), 2279 2618 SLOT(ManualVideoUID())); 2280 2619 m_menuPopup->AddButton(tr("Manually Enter Video Title"), … … 2581 2920 metadata); 2582 2921 } 2583 2922 2923 void VideoDialog::TitleSubtitleSearch() 2924 { 2925 Metadata *metadata = GetMetadata(GetItemCurrent()); 2926 2927 if (metadata) 2928 StartVideoSearchByTitleSubtitle(metadata->GetTitle(), 2929 metadata->GetSubtitle(), metadata); 2930 } 2931 2932 void VideoDialog::ImageOnlyDownload() 2933 { 2934 Metadata *metadata = GetMetadata(GetItemCurrent()); 2935 QString title = metadata->GetTitle(); 2936 2937 if (metadata->GetInetRef() != VIDEO_INETREF_DEFAULT) 2938 StartVideoPosterSet(metadata); 2939 else 2940 { 2941 createBusyDialog(title); 2942 2943 VideoTitleSearch *vts = new VideoTitleSearch(this); 2944 connect(vts, SIGNAL(SigSearchResults(bool, const SearchListResults &, 2945 Metadata *)), 2946 SLOT(OnVideoImageOnlyDone(bool, const SearchListResults &, 2947 Metadata *))); 2948 vts->Run(title, metadata); 2949 } 2950 } 2951 2584 2952 void VideoDialog::ToggleBrowseable() 2585 2953 { 2586 2954 Metadata *metadata = GetMetadata(GetItemCurrent()); … … 2624 2992 } 2625 2993 } 2626 2994 2995 void VideoDialog::OnVideoImgSearchListSelection(QString video_uid) 2996 { 2997 Metadata *metadata = GetMetadata(GetItemCurrent()); 2998 if (metadata && !video_uid.isEmpty()) 2999 { 3000 metadata->SetInetRef(video_uid); 3001 metadata->UpdateDatabase(); 3002 UpdateItem(GetItemCurrent()); 3003 StartVideoPosterSet(metadata); 3004 } 3005 } 3006 2627 3007 void VideoDialog::OnParentalChange(int amount) 2628 3008 { 2629 3009 Metadata *metadata = GetMetadata(GetItemCurrent()); … … 2757 3137 metadata->Reset(); 2758 3138 2759 3139 QString cover_file; 2760 if (GetLocalVideoPoster(metadata->GetInetRef(), metadata->GetFilename(), 2761 QStringList(m_d->m_artDir), cover_file)) 3140 if (GetLocalVideoImage(metadata->GetInetRef(), metadata->GetFilename(), 3141 QStringList(m_d->m_artDir), cover_file, 3142 metadata->GetTitle(), metadata->GetSeason())) 2762 3143 { 2763 3144 metadata->SetCoverFile(cover_file); 2764 3145 } 2765 3146 3147 QString fanart_file; 3148 if (GetLocalVideoImage(metadata->GetInetRef(), metadata->GetFilename(), 3149 QStringList(m_d->m_fanDir), fanart_file, 3150 metadata->GetTitle(), metadata->GetSeason())) 3151 { 3152 metadata->SetFanart(fanart_file); 3153 } 3154 3155 QString banner_file; 3156 if (GetLocalVideoImage(metadata->GetInetRef(), metadata->GetFilename(), 3157 QStringList(m_d->m_banDir), banner_file, 3158 metadata->GetTitle(), metadata->GetSeason())) 3159 { 3160 metadata->SetBanner(banner_file); 3161 } 3162 2766 3163 metadata->UpdateDatabase(); 2767 3164 2768 3165 UpdateItem(item); … … 2777 3174 //createBusyDialog(QObject::tr("Fetching poster for %1 (%2)") 2778 3175 // .arg(metadata->InetRef()) 2779 3176 // .arg(metadata->Title())); 2780 QStringList search_dirs;2781 search_dirs += m_d->m_artDir;3177 QStringList cover_dirs; 3178 cover_dirs += m_d->m_artDir; 2782 3179 2783 3180 QString cover_file; 2784 3181 2785 if (GetLocalVideoPoster(metadata->GetInetRef(), metadata->GetFilename(), 2786 search_dirs, cover_file)) 3182 if (GetLocalVideoImage(metadata->GetInetRef(), metadata->GetFilename(), 3183 cover_dirs, cover_file, metadata->GetTitle(), 3184 metadata->GetSeason())) 2787 3185 { 2788 3186 metadata->SetCoverFile(cover_file); 2789 3187 OnVideoPosterSetDone(metadata); … … 2798 3196 vps->Run(metadata->GetInetRef(), metadata); 2799 3197 } 2800 3198 3199 QStringList fanart_dirs; 3200 fanart_dirs += m_d->m_fanDir; 3201 3202 QString fanart_file; 3203 3204 if (GetLocalVideoImage(metadata->GetInetRef(), metadata->GetFilename(), 3205 fanart_dirs, fanart_file, metadata->GetTitle(), 3206 metadata->GetSeason())) 3207 { 3208 metadata->SetFanart(fanart_file); 3209 OnVideoFanartSetDone(metadata); 3210 } 3211 2801 3212 if (metadata->GetFanart().isEmpty()) 2802 3213 { 2803 3214 // Obtain video fanart … … 2806 3217 SLOT(OnFanartURL(QString, Metadata *))); 2807 3218 vfs->Run(metadata->GetInetRef(), metadata); 2808 3219 } 3220 3221 QStringList banner_dirs; 3222 banner_dirs += m_d->m_banDir; 3223 3224 QString banner_file; 3225 3226 if (GetLocalVideoImage(metadata->GetInetRef(), metadata->GetFilename(), 3227 banner_dirs, banner_file, metadata->GetTitle(), 3228 metadata->GetSeason())) 3229 { 3230 metadata->SetBanner(banner_file); 3231 OnVideoBannerSetDone(metadata); 3232 } 3233 3234 if (metadata->GetBanner().isEmpty() && 3235 (metadata->GetSeason() > 0 || metadata->GetEpisode() > 0)) 3236 { 3237 // Obtain video banner (only for TV) 3238 VideoBannerSearch *vbs = new VideoBannerSearch(this); 3239 connect(vbs, SIGNAL(SigBannerURL(QString, Metadata *)), 3240 SLOT(OnBannerURL(QString, Metadata *))); 3241 vbs->Run(metadata->GetInetRef(), metadata); 3242 } 2809 3243 } 2810 3244 2811 3245 void VideoDialog::OnPosterURL(QString uri, Metadata *metadata) … … 2838 3272 QUrl url(uri); 2839 3273 2840 3274 QString ext = QFileInfo(url.path()).suffix(); 2841 QString dest_file = QString("%1/%2.%3").arg(fileprefix) 2842 .arg(metadata->GetInetRef()).arg(ext); 3275 QString dest_file; 3276 3277 if (metadata->GetSeason() > 0 || 3278 metadata->GetEpisode() > 0) 3279 { 3280 // Name TV downloads so that they already work with the PBB 3281 QString title = QString("%1 Season %2").arg(metadata->GetTitle()) 3282 .arg(metadata->GetSeason()); 3283 dest_file = QString("%1/%2.%3").arg(fileprefix) 3284 .arg(title).arg(ext); 3285 } 3286 else 3287 dest_file = QString("%1/%2.%3").arg(fileprefix) 3288 .arg(metadata->GetInetRef()).arg(ext); 3289 2843 3290 VERBOSE(VB_IMPORTANT, QString("Copying '%1' -> '%2'...") 2844 3291 .arg(url.toString()).arg(dest_file)); 2845 3292 … … 2932 3379 QUrl url(uri); 2933 3380 2934 3381 QString ext = QFileInfo(url.path()).suffix(); 2935 QString dest_file = QString("%1/%2.%3").arg(fileprefix) 2936 .arg(metadata->GetInetRef()).arg(ext); 3382 QString dest_file; 3383 3384 if (metadata->GetSeason() > 0 || 3385 metadata->GetEpisode() > 0) 3386 { 3387 // Name TV downloads so that they already work with the PBB 3388 QString title = QString("%1 Season %2").arg(metadata->GetTitle()) 3389 .arg(metadata->GetSeason()); 3390 dest_file = QString("%1/%2.%3").arg(fileprefix) 3391 .arg(title).arg(ext); 3392 } 3393 else 3394 dest_file = QString("%1/%2.%3").arg(fileprefix) 3395 .arg(metadata->GetInetRef()).arg(ext); 3396 2937 3397 VERBOSE(VB_IMPORTANT, QString("Copying '%1' -> '%2'...") 2938 3398 .arg(url.toString()).arg(dest_file)); 2939 3399 … … 2996 3456 UpdateItem(GetItemCurrent()); 2997 3457 } 2998 3458 3459 void VideoDialog::OnBannerURL(QString uri, Metadata *metadata) 3460 { 3461 if (metadata) 3462 { 3463 if (uri.length()) 3464 { 3465 QString fileprefix = m_d->m_banDir; 3466 3467 QDir dir; 3468 3469 // If the fanart setting hasn't been set default to 3470 // using ~/.mythtv/MythVideo/Banners 3471 if (fileprefix.length() == 0) 3472 { 3473 fileprefix = GetConfDir(); 3474 3475 dir.setPath(fileprefix); 3476 if (!dir.exists()) 3477 dir.mkdir(fileprefix); 3478 3479 fileprefix += "/MythVideo/Banners"; 3480 } 3481 3482 dir.setPath(fileprefix); 3483 if (!dir.exists()) 3484 dir.mkdir(fileprefix); 3485 3486 QUrl url(uri); 3487 3488 QString ext = QFileInfo(url.path()).suffix(); 3489 QString dest_file; 3490 3491 if (metadata->GetSeason() > 0 || 3492 metadata->GetEpisode() > 0) 3493 { 3494 // Name TV downloads so that they already work with the PBB 3495 QString title = QString("%1 Season %2").arg(metadata->GetTitle()) 3496 .arg(metadata->GetSeason()); 3497 dest_file = QString("%1/%2.%3").arg(fileprefix) 3498 .arg(title).arg(ext); 3499 } 3500 else 3501 dest_file = QString("%1/%2.%3").arg(fileprefix) 3502 .arg(metadata->GetInetRef()).arg(ext); 3503 3504 VERBOSE(VB_IMPORTANT, QString("Copying '%1' -> '%2'...") 3505 .arg(url.toString()).arg(dest_file)); 3506 3507 BannerDownloadProxy *d = 3508 BannerDownloadProxy::Create(url, dest_file, metadata); 3509 metadata->SetBanner(dest_file); 3510 3511 connect(d, SIGNAL(SigFinished(BannerDownloadErrorState, 3512 QString, Metadata *)), 3513 SLOT(OnBannerCopyFinished(BannerDownloadErrorState, 3514 QString, Metadata *))); 3515 3516 d->StartCopy(); 3517 m_d->AddBannerDownload(d); 3518 } 3519 else 3520 { 3521 metadata->SetBanner(""); 3522 OnVideoBannerSetDone(metadata); 3523 } 3524 } 3525 else 3526 OnVideoBannerSetDone(metadata); 3527 } 3528 3529 void VideoDialog::OnBannerCopyFinished(BannerDownloadErrorState error, 3530 QString errorMsg, Metadata *item) 3531 { 3532 QObject *src = sender(); 3533 if (src) 3534 m_d->RemoveBannerDownload(dynamic_cast<BannerDownloadProxy *> 3535 (src)); 3536 3537 if (error != besOK && item) 3538 item->SetBanner(""); 3539 3540 VERBOSE(VB_IMPORTANT, tr("Banner download finished: %1 %2") 3541 .arg(errorMsg).arg(error)); 3542 3543 if (error == besTimeout) 3544 { 3545 createOkDialog(tr("Banner exists for this item but could not be " 3546 "retrieved within the timeout period.\n")); 3547 } 3548 3549 OnVideoBannerSetDone(item); 3550 } 3551 3552 // This is the final call as part of a StartVideoBannerSet 3553 void VideoDialog::OnVideoBannerSetDone(Metadata *metadata) 3554 { 3555 // The metadata has a banner set 3556 if (m_busyPopup) 3557 { 3558 m_busyPopup->Close(); 3559 m_busyPopup = NULL; 3560 } 3561 3562 metadata->UpdateDatabase(); 3563 UpdateItem(GetItemCurrent()); 3564 } 3565 2999 3566 void VideoDialog::StartVideoSearchByUID(QString video_uid, Metadata *metadata) 3000 3567 { 3001 3568 // Starting the busy dialog here triggers a bizarre segfault … … 3026 3593 { 3027 3594 data[(*p).section(':', 0, 0)] = (*p).section(':', 1); 3028 3595 } 3029 // set known values 3596 // Set known values, but always set Title. 3597 // Allows for partial fill. Reset Metadata for full fill. 3598 3030 3599 metadata->SetTitle(data["Title"]); 3031 metadata->SetYear(data["Year"].toInt()); 3032 metadata->SetDirector(data["Director"]); 3033 metadata->SetPlot(data["Plot"]); 3034 metadata->SetUserRating(data["UserRating"].toFloat()); 3035 metadata->SetRating(data["MovieRating"]); 3036 metadata->SetLength(data["Runtime"].toInt()); 3600 metadata->SetSubtitle(data["Subtitle"]); 3037 3601 3602 if (metadata->GetYear() == 1895) 3603 metadata->SetYear(data["Year"].toInt()); 3604 if (metadata->GetDirector() == VIDEO_DIRECTOR_UNKNOWN) 3605 metadata->SetDirector(data["Director"]); 3606 if (metadata->GetPlot() == VIDEO_PLOT_DEFAULT) 3607 metadata->SetPlot(data["Plot"]); 3608 if (metadata->GetUserRating() == 0) 3609 metadata->SetUserRating(data["UserRating"].toFloat()); 3610 if (metadata->GetRating() == VIDEO_RATING_DEFAULT) 3611 metadata->SetRating(data["MovieRating"]); 3612 if (metadata->GetLength() == 0) 3613 metadata->SetLength(data["Runtime"].toInt()); 3614 if (metadata->GetSeason() == 0) 3615 metadata->SetSeason(data["Season"].toInt()); 3616 if (metadata->GetEpisode() == 0) 3617 metadata->SetEpisode(data["Episode"].toInt()); 3618 3038 3619 m_d->AutomaticParentalAdjustment(metadata); 3039 3620 3040 3621 // Cast … … 3166 3747 } 3167 3748 } 3168 3749 3750 void VideoDialog::OnVideoImageOnlyDone(bool normal_exit, 3751 const SearchListResults &results, Metadata *metadata) 3752 { 3753 if (m_busyPopup) 3754 { 3755 m_busyPopup->Close(); 3756 m_busyPopup = NULL; 3757 } 3758 3759 (void) normal_exit; 3760 VERBOSE(VB_IMPORTANT, 3761 QString("GetVideoList returned %1 possible matches") 3762 .arg(results.size())); 3763 3764 if (results.size() == 1) 3765 { 3766 // Only one search result, fetch data. 3767 if (results.begin().value().isEmpty()) 3768 return; 3769 else 3770 { 3771 metadata->SetInetRef(results.begin().key()); 3772 metadata->UpdateDatabase(); 3773 UpdateItem(GetItemCurrent()); 3774 StartVideoPosterSet(metadata); 3775 } 3776 } 3777 else if (results.size() < 1) 3778 { 3779 createOkDialog(tr("No matches were found.")); 3780 } 3781 else 3782 { 3783 SearchResultsDialog *resultsdialog = 3784 new SearchResultsDialog(m_popupStack, results); 3785 3786 if (resultsdialog->Create()) 3787 m_popupStack->AddScreen(resultsdialog); 3788 3789 connect(resultsdialog, SIGNAL(haveResult(QString)), 3790 SLOT(OnVideoImgSearchListSelection(QString)), 3791 Qt::QueuedConnection); 3792 } 3793 } 3794 3795 void VideoDialog::StartVideoSearchByTitleSubtitle(QString title, 3796 QString subtitle, Metadata *metadata) 3797 { 3798 createBusyDialog(title); 3799 3800 VideoTitleSubtitleSearch *vtss = new VideoTitleSubtitleSearch(this); 3801 3802 connect(vtss, SIGNAL(SigSearchResults(bool, QStringList, 3803 Metadata *)), 3804 SLOT(OnVideoSearchByTitleSubtitleDone(bool, QStringList, 3805 Metadata *))); 3806 vtss->Run(title, subtitle, metadata); 3807 } 3808 3809 void VideoDialog::OnVideoSearchByTitleSubtitleDone(bool normal_exit, 3810 QStringList result, Metadata *metadata) 3811 { 3812 if (m_busyPopup) 3813 { 3814 m_busyPopup->Close(); 3815 m_busyPopup = NULL; 3816 } 3817 3818 (void) normal_exit; 3819 3820 QString SeasEp = result.takeAt(0); 3821 3822 if (!SeasEp.isEmpty()) 3823 { 3824 3825 // Stuff to parse Season and Episode here 3826 QString season, episode = NULL; 3827 3828 QRegExp group("(?:[s])?(\\d{1,3})(?:\\s|-)?(?:[ex])" //Season 3829 "(?:\\s|-)?(\\d{1,3})", // Episode 3830 Qt::CaseInsensitive); 3831 3832 int pos = group.indexIn(SeasEp); 3833 if (pos > -1) 3834 { 3835 QString groupResult = group.cap(0); 3836 season = group.cap(1); 3837 episode = group.cap(2); 3838 } 3839 3840 VERBOSE(VB_IMPORTANT, 3841 QString("Season and Episode found! It was: %1") 3842 .arg(SeasEp)); 3843 3844 if (!season.isNull() && !episode.isNull()) 3845 { 3846 metadata->SetSeason(season.toInt()); 3847 metadata->SetEpisode(episode.toInt()); 3848 StartVideoSearchByTitle(VIDEO_INETREF_DEFAULT, 3849 metadata->GetTitle(), metadata); 3850 } 3851 } 3852 else 3853 createOkDialog(tr("No matches were found.")); 3854 } 3855 3169 3856 void VideoDialog::doVideoScan() 3170 3857 { 3171 3858 if (!m_d->m_scanner) -
mythplugins/mythvideo/mythvideo/videolist.cpp
1267 1267 QString title = qfi.completeBaseName(); 1268 1268 if (m_infer_title) 1269 1269 { 1270 QString tmptitle(Metadata::FilenameTo Title(file_string));1270 QString tmptitle(Metadata::FilenameToMeta(file_string, 1)); 1271 1271 if (tmptitle.length()) 1272 1272 title = tmptitle; 1273 1273 } -
mythplugins/mythvideo/mythvideo/videoscan.cpp
267 267 VIDEO_SCREENSHOT_DEFAULT, 268 268 VIDEO_BANNER_DEFAULT, 269 269 VIDEO_FANART_DEFAULT, 270 Metadata::FilenameToTitle(p->first), 270 Metadata::FilenameToMeta(p->first, 1), 271 Metadata::FilenameToMeta(p->first, 4), 271 272 VIDEO_YEAR_DEFAULT, 272 273 VIDEO_INETREF_DEFAULT, VIDEO_DIRECTOR_DEFAULT, 273 VIDEO_PLOT_DEFAULT, 0.0, VIDEO_RATING_DEFAULT, 274 0, 0, ParentalLevel::plLowest); 274 VIDEO_PLOT_DEFAULT, 0.0, VIDEO_RATING_DEFAULT, 0, 275 Metadata::FilenameToMeta(p->first, 2).toInt(), 276 Metadata::FilenameToMeta(p->first, 3).toInt(), 277 0, ParentalLevel::plLowest); 275 278 276 279 VERBOSE(VB_GENERAL, QString("Adding : %1 : %2") 277 280 .arg(newFile.GetHost()).arg(newFile.GetFilename())); -
mythplugins/mythvideo/mythvideo/videofilter.cpp
353 353 ret = lhs_key < rhs_key; 354 354 break; 355 355 } 356 case kOrderBySeasonEp: 357 { 358 if ((lhs.GetSeason() == rhs.GetSeason()) 359 && (lhs.GetEpisode() == rhs.GetEpisode()) 360 && (lhs.GetSeason() == 0) 361 && (rhs.GetSeason() == 0) 362 && (lhs.GetEpisode() == 0) 363 && (rhs.GetEpisode() == 0)) 364 { 365 Metadata::SortKey lhs_key; 366 Metadata::SortKey rhs_key; 367 if (lhs.HasSortKey() && rhs.HasSortKey()) 368 { 369 lhs_key = lhs.GetSortKey(); 370 rhs_key = rhs.GetSortKey(); 371 } 372 else 373 { 374 lhs_key = Metadata::GenerateDefaultSortKey(lhs, 375 sort_ignores_case); 376 rhs_key = Metadata::GenerateDefaultSortKey(rhs, 377 sort_ignores_case); 378 } 379 ret = lhs_key < rhs_key; 380 } 381 else if (lhs.GetSeason() == rhs.GetSeason() 382 && lhs.GetTitle() == rhs.GetTitle()) 383 ret = lhs.GetEpisode() < rhs.GetEpisode(); 384 else 385 ret = lhs.GetSeason() < rhs.GetSeason(); 386 break; 387 } 356 388 case kOrderByYearDescending: 357 389 { 358 390 ret = lhs.GetYear() > rhs.GetYear(); … … 649 681 // Order by 650 682 new MythUIButtonListItem(m_orderbyList, QObject::tr("Title"), 651 683 VideoFilterSettings::kOrderByTitle); 684 new MythUIButtonListItem(m_orderbyList, QObject::tr("Season/Episode"), 685 VideoFilterSettings::kOrderBySeasonEp); 652 686 new MythUIButtonListItem(m_orderbyList, QObject::tr("Year"), 653 687 VideoFilterSettings::kOrderByYearDescending); 654 688 new MythUIButtonListItem(m_orderbyList, QObject::tr("User Rating"), -
mythplugins/mythvideo/mythvideo/metadata.h
13 13 14 14 enum { VIDEO_YEAR_DEFAULT = 1895 }; 15 15 16 const QString VIDEO_SUBTITLE_DEFAULT = ""; 17 16 18 struct SortData; 17 19 18 20 class Metadata … … 44 46 45 47 public: 46 48 static SortKey GenerateDefaultSortKey(const Metadata &m, bool ignore_case); 47 static QString FilenameTo Title(const QString &file_name);49 static QString FilenameToMeta(const QString &file_name, int position); 48 50 static QString TrimTitle(const QString &title, bool ignore_case); 49 51 50 52 public: … … 55 57 const QString &banner = QString(), 56 58 const QString &fanart = QString(), 57 59 const QString &title = QString(), 60 const QString &subtitle = QString(), 58 61 int year = VIDEO_YEAR_DEFAULT, 59 62 const QString &inetref = QString(), 60 63 const QString &director = QString(), … … 62 65 float userrating = 0.0, 63 66 const QString &rating = QString(), 64 67 int length = 0, 68 int season = 0, 69 int episode = 0, 65 70 int id = 0, 66 71 ParentalLevel::Level showlevel = ParentalLevel::plLowest, 67 72 int categoryID = 0, … … 89 94 const QString &GetTitle() const; 90 95 void SetTitle(const QString& title); 91 96 97 const QString &GetSubtitle() const; 98 void SetSubtitle(const QString &subtitle); 99 92 100 int GetYear() const; 93 101 void SetYear(int year); 94 102 … … 110 118 int GetLength() const; 111 119 void SetLength(int length); 112 120 121 int GetSeason() const; 122 void SetSeason(int season); 123 124 int GetEpisode() const; 125 void SetEpisode(int episode); 126 113 127 unsigned int GetID() const; 114 128 void SetID(int id); 115 129 -
mythplugins/mythvideo/mythvideo/editmetadata.cpp
12 12 #include <mythtv/libmythui/mythuitextedit.h> 13 13 #include <mythtv/libmythui/mythuibutton.h> 14 14 #include <mythtv/libmythui/mythuicheckbox.h> 15 #include <mythtv/libmythui/mythuispinbox.h> 15 16 16 17 #include "globals.h" 17 18 #include "dbaccess.h" … … 22 23 EditMetadataDialog::EditMetadataDialog(MythScreenStack *lparent, 23 24 QString lname, Metadata *source_metadata, 24 25 const MetadataListManager &cache) : MythScreenType(lparent, lname), 25 m_origMetadata(source_metadata), m_titleEdit(0), m_playerEdit(0), 26 m_categoryList(0), m_levelList(0), m_childList(0), m_browseCheck(0), 27 m_coverartButton(0), m_coverartText(0), 26 m_origMetadata(source_metadata), m_titleEdit(0), m_subtitleEdit(0), 27 m_playerEdit(0), m_seasonSpin(0), m_episodeSpin(0), 28 m_categoryList(0), m_levelList(0), m_childList(0), 29 m_browseCheck(0), m_coverartButton(0), m_coverartText(0), 28 30 m_screenshotButton(0), m_screenshotText(0), 29 31 m_bannerButton(0), m_bannerText(0), 30 32 m_fanartButton(0), m_fanartText(0), … … 47 49 48 50 bool err = false; 49 51 UIUtilE::Assign(this, m_titleEdit, "title_edit", &err); 52 UIUtilE::Assign(this, m_subtitleEdit, "subtitle_edit", &err); 50 53 UIUtilE::Assign(this, m_playerEdit, "player_edit", &err); 51 54 55 UIUtilE::Assign(this, m_seasonSpin, "season", &err); 56 UIUtilE::Assign(this, m_episodeSpin, "episode", &err); 57 52 58 UIUtilE::Assign(this, m_coverartText, "coverart_text", &err); 53 59 UIUtilE::Assign(this, m_screenshotText, "screenshot_text", &err); 54 60 UIUtilE::Assign(this, m_bannerText, "banner_text", &err); … … 79 85 VERBOSE(VB_IMPORTANT, "Failed to build a focuslist."); 80 86 81 87 connect(m_titleEdit, SIGNAL(valueChanged()), SLOT(SetTitle())); 88 connect(m_subtitleEdit, SIGNAL(valueChanged()), SLOT(SetSubtitle())); 82 89 connect(m_playerEdit, SIGNAL(valueChanged()), SLOT(SetPlayer())); 83 90 91 connect(m_seasonSpin, SIGNAL(LosingFocus()), SLOT(SetSeason())); 92 connect(m_episodeSpin, SIGNAL(LosingFocus()), SLOT(SetEpisode())); 93 84 94 connect(m_doneButton, SIGNAL(Clicked()), SLOT(SaveAndExit())); 85 95 connect(m_coverartButton, SIGNAL(Clicked()), SLOT(FindCoverArt())); 86 96 connect(m_bannerButton, SIGNAL(Clicked()), SLOT(FindBanner())); … … 154 164 void EditMetadataDialog::fillWidgets() 155 165 { 156 166 m_titleEdit->SetText(m_workingMetadata->GetTitle()); 167 m_subtitleEdit->SetText(m_workingMetadata->GetSubtitle()); 157 168 169 m_seasonSpin->SetRange(0,100,1); 170 m_seasonSpin->SetValue(m_workingMetadata->GetSeason()); 171 m_episodeSpin->SetRange(0,999,1); 172 m_episodeSpin->SetValue(m_workingMetadata->GetEpisode()); 173 158 174 MythUIButtonListItem *button = 159 175 new MythUIButtonListItem(m_categoryList, VIDEO_CATEGORY_UNKNOWN); 160 176 const VideoCategory::entry_list &vcl = … … 312 328 m_workingMetadata->SetTitle(m_titleEdit->GetText()); 313 329 } 314 330 331 void EditMetadataDialog::SetSubtitle() 332 { 333 m_workingMetadata->SetSubtitle(m_subtitleEdit->GetText()); 334 } 335 315 336 void EditMetadataDialog::SetCategory(MythUIButtonListItem *item) 316 337 { 317 338 m_workingMetadata->SetCategoryID(item->GetData().toInt()); 318 339 } 319 340 341 void EditMetadataDialog::SetSeason() 342 { 343 m_workingMetadata->SetSeason(m_seasonSpin->GetIntValue()); 344 } 345 346 void EditMetadataDialog::SetEpisode() 347 { 348 m_workingMetadata->SetEpisode(m_episodeSpin->GetIntValue()); 349 } 350 320 351 void EditMetadataDialog::SetPlayer() 321 352 { 322 353 m_workingMetadata->SetPlayCommand(m_playerEdit->GetText()); -
mythplugins/mythvideo/mythvideo/playercommand.cpp
75 75 { 76 76 private: 77 77 VideoPlayHandleMedia(const QString &handler, const QString &mrl, 78 const QString &plot, const QString &title, 79 const QString &director, int length, const QString &year) : 78 const QString &plot, const QString &title, const QString &subtitle, 79 const QString &director, int season, int episode, 80 int length, const QString &year) : 80 81 m_handler(handler), m_mrl(mrl), m_plot(plot), m_title(title), 81 m_director(director), m_length(length), m_year(year) 82 m_subtitle(subtitle), m_director(director), m_season(season), 83 m_episode(episode), m_length(length), m_year(year) 82 84 { 83 85 } 84 86 85 87 public: 86 88 static VideoPlayHandleMedia *Create(const QString &handler, 87 89 const QString &mrl, const QString &plot, const QString &title, 88 const QString &director, int length, const QString &year) 90 const QString &subtitle, const QString &director, 91 int season, int episode, 92 int length, const QString &year) 89 93 { 90 return new VideoPlayHandleMedia(handler, mrl, plot, title, 91 director, length, year);94 return new VideoPlayHandleMedia(handler, mrl, plot, title, subtitle, 95 director, season, episode, length, year); 92 96 } 93 97 94 98 bool Play() const 95 99 { 96 100 return gContext->GetMainWindow()->HandleMedia(m_handler, m_mrl, 97 m_plot, m_title, m_director, m_length, m_year); 101 m_plot, m_title, m_subtitle, m_director, m_season, 102 m_episode, m_length, m_year); 98 103 } 99 104 100 105 QString GetCommandDisplayName() const … … 112 117 QString m_mrl; 113 118 QString m_plot; 114 119 QString m_title; 120 QString m_subtitle; 115 121 QString m_director; 122 int m_season; 123 int m_episode; 116 124 int m_length; 117 125 QString m_year; 118 126 }; … … 200 208 if (play_command.length()) 201 209 { 202 210 AddPlayer(play_command, filename, item->GetPlot(), 203 item->GetTitle(), item->GetDirector(), 204 item->GetLength(), 211 item->GetTitle(), item->GetSubtitle(), 212 item->GetDirector(), item->GetSeason(), 213 item->GetEpisode(), item->GetLength(), 205 214 QString::number(item->GetYear())); 206 215 } 207 216 else … … 237 246 play_command = "Internal"; 238 247 239 248 QString plot; 240 QString title = Metadata::FilenameToTitle(filename); 249 QString title = Metadata::FilenameToMeta(filename, 1); 250 QString subtitle = Metadata::FilenameToMeta(filename, 4); 241 251 QString director; 252 int season = 0; 253 int episode = 0; 242 254 int length = 0; 243 255 QString year = QString::number(VIDEO_YEAR_DEFAULT); 244 256 … … 246 258 { 247 259 plot = extraData->GetPlot(); 248 260 title = extraData->GetTitle(); 261 subtitle = extraData->GetSubtitle(); 249 262 director = extraData->GetDirector(); 263 season = extraData->GetSeason(); 264 episode = extraData->GetEpisode(); 250 265 length = extraData->GetLength(); 251 266 year = QString::number(extraData->GetYear()); 252 267 } 253 268 254 AddPlayer(play_command, filename, plot, title, director, length, year); 269 AddPlayer(play_command, filename, plot, title, subtitle, director, 270 season, episode, length, year); 255 271 } 256 272 257 273 void ClearPlayerList() … … 282 298 283 299 private: 284 300 void AddPlayer(const QString &player, const QString &filename, 285 const QString &plot, const QString &title, const QString &director, 286 int length, const QString &year) 301 const QString &plot, const QString &title, const QString &subtitle, 302 const QString &director, int season, int episode, int length, 303 const QString &year) 287 304 { 288 305 m_player_procs.push_back(VideoPlayHandleMedia::Create(player, filename, 289 plot, title, director, length, year)); 306 plot, title, subtitle, director, season, episode, 307 length, year)); 290 308 m_player_procs.push_back(VideoPlayMythSystem::Create(player, filename)); 291 309 } 292 310 -
mythplugins/mythvideo/mythvideo/videoutils.h
33 33 34 34 QString GetDisplayUserRating(float userrating); 35 35 QString GetDisplayLength(int length); 36 QString GetDisplaySeasonEpisode(int seasEp, int digits); 36 37 QString GetDisplayBrowse(bool browse); 37 38 QString GetDisplayYear(int year); 38 39 QString GetDisplayRating(const QString &rating); -
mythtv/themes/Terra/video-ui.xml
565 565 </imagetype> 566 566 567 567 <textarea name="title" from="basetextarea"> 568 <area>48,78, 980,35</area>568 <area>48,78,590,35</area> 569 569 <font>baselarge</font> 570 570 </textarea> 571 571 572 <textarea name="subtitle" from="basetextarea"> 573 <area>600,78,590,35</area> 574 <align>right</align> 575 <font>baselarge</font> 576 </textarea> 577 572 578 <statetype name="userratingstate" from="baserating"> 573 579 <position>1193,72</position> 574 580 </statetype> … … 583 589 <area>48,284,290,30</area> 584 590 </textarea> 585 591 592 <textarea name="##x##" from="basetextarea"> 593 <area>540,284,200,30</area> 594 <align>center</align> 595 </textarea> 596 586 597 <textarea name="director" from="basetextarea"> 587 598 <area>430,284,800,30</area> 588 599 <align>right</align> … … 885 896 <!-- Labels --> 886 897 887 898 <textarea name="title_text" from="basetextarea"> 888 <area> 50,135,250,40</area>889 <value> Name:</value>899 <area>150,80,250,40</area> 900 <value>Title:</value> 890 901 <align>right,top</align> 891 902 </textarea> 892 903 904 <textarea name="subtitle_text" from="basetextarea"> 905 <area>150,138,250,40</area> 906 <value>Subtitle:</value> 907 <align>right,top</align> 908 </textarea> 909 910 <textarea name="season_text" from="basetextarea"> 911 <area>200,185,250,40</area> 912 <value>Season:</value> 913 <align>right,top</align> 914 </textarea> 915 916 <textarea name="episode_text" from="basetextarea"> 917 <area>520,185,150,40</area> 918 <value>Episode:</value> 919 <align>right,top</align> 920 </textarea> 921 893 922 <textarea name="category_text" from="title_text"> 894 <position>50,197</position> 923 <area>520,232,150,40</area> 924 <align>right</align> 895 925 <value>Category:</value> 896 926 </textarea> 897 927 898 928 <textarea name="level_text" from="title_text"> 899 <position>50,247</position> 929 <area>120,232,200,40</area> 930 <align>right</align> 900 931 <value>Parental Control:</value> 901 932 </textarea> 902 933 903 934 <textarea name="child_text" from="title_text"> 904 <position>50,292</position> 935 <area>120,277,200,40</area> 936 <align>right</align> 905 937 <value>File to Always Play Next:</value> 906 938 </textarea> 907 939 908 940 <textarea name="browse_text" from="title_text"> 909 <position>50,337</position> 941 <area>570,277,280,40</area> 942 <align>left</align> 910 943 <value>Include while Browsing:</value> 911 944 </textarea> 912 945 913 946 <textarea name="coverart_text_label" from="title_text"> 914 <position> 50,375</position>947 <position>200,328</position> 915 948 <value>Cover Art:</value> 916 949 </textarea> 917 950 951 <textarea name="screenshot_text_label" from="title_text"> 952 <position>200,357</position> 953 <value>Screenshot:</value> 954 </textarea> 955 956 <textarea name="banner_text_label" from="title_text"> 957 <position>200,386</position> 958 <value>Banner:</value> 959 </textarea> 960 961 <textarea name="fanart_text_label" from="title_text"> 962 <position>200,415</position> 963 <value>Fanart:</value> 964 </textarea> 965 918 966 <textarea name="trailer_text_label" from="title_text"> 919 <position> 50,405</position>967 <position>200,447</position> 920 968 <value>Trailer:</value> 921 969 </textarea> 922 970 923 971 <textarea name="player_text" from="title_text"> 924 <position> 50,445</position>972 <position>150,487</position> 925 973 <value>Unique Player Command:</value> 926 974 </textarea> 927 975 928 976 <!-- Widgets --> 929 977 930 978 <textedit name="title_edit" from="basetextedit"> 931 <position> 310,125</position>979 <position>410,70</position> 932 980 </textedit> 933 981 934 < buttonlist name="category_select" from="baseselector">935 <position> 310,190</position>936 </ buttonlist>982 <textedit name="subtitle_edit" from="basetextedit"> 983 <position>410,126</position> 984 </textedit> 937 985 986 <spinbox name="season" from="basespinbox"> 987 <position>460,181</position> 988 </spinbox> 989 990 <spinbox name="episode" from="basespinbox"> 991 <position>680,181</position> 992 </spinbox> 993 938 994 <buttonlist name="level_select" from="baseselector"> 939 <position>3 10,240</position>995 <position>330,225</position> 940 996 </buttonlist> 941 997 998 <buttonlist name="category_select" from="baseselector"> 999 <position>680,225</position> 1000 </buttonlist> 1001 942 1002 <buttonlist name="child_select" from="baseselector"> 943 <position>3 10,285</position>1003 <position>330,270</position> 944 1004 </buttonlist> 945 1005 946 1006 <checkbox name="browse_check" from="basecheckbox"> 947 <position> 310,335</position>1007 <position>835,275</position> 948 1008 </checkbox> 949 1009 950 1010 <button name="coverart_button"> 951 <area> 310,370,32,32</area>1011 <area>460,323,32,32</area> 952 1012 <statetype name="buttonstate"> 953 1013 <state name="active"> 954 1014 <imagetype name="background"> … … 970 1030 </button> 971 1031 972 1032 <textarea name="coverart_text" from="basetextarea"> 973 <area> 350,375,250,40</area>1033 <area>500,328,250,40</area> 974 1034 <value>/path/to/the/thing.jpg</value> 975 1035 </textarea> 976 1036 1037 <button name="screenshot_button"> 1038 <area>460,352,32,32</area> 1039 <statetype name="buttonstate"> 1040 <state name="active"> 1041 <imagetype name="background"> 1042 <filename>blankbutton_off.png</filename> 1043 </imagetype> 1044 </state> 1045 <state name="selected" from="active"> 1046 <imagetype name="background"> 1047 <filename>blankbutton_on.png</filename> 1048 </imagetype> 1049 </state> 1050 <state name="disabled" from="active" /> 1051 <state name="pushed" from="active"> 1052 <imagetype name="background"> 1053 <filename>blankbutton_pushed.png</filename> 1054 </imagetype> 1055 </state> 1056 </statetype> 1057 </button> 1058 1059 <textarea name="screenshot_text" from="basetextarea"> 1060 <area>500,357,250,40</area> 1061 <value>/path/to/the/thing.jpg</value> 1062 </textarea> 1063 1064 <button name="banner_button"> 1065 <area>460,381,32,32</area> 1066 <statetype name="buttonstate"> 1067 <state name="active"> 1068 <imagetype name="background"> 1069 <filename>blankbutton_off.png</filename> 1070 </imagetype> 1071 </state> 1072 <state name="selected" from="active"> 1073 <imagetype name="background"> 1074 <filename>blankbutton_on.png</filename> 1075 </imagetype> 1076 </state> 1077 <state name="disabled" from="active" /> 1078 <state name="pushed" from="active"> 1079 <imagetype name="background"> 1080 <filename>blankbutton_pushed.png</filename> 1081 </imagetype> 1082 </state> 1083 </statetype> 1084 </button> 1085 1086 <textarea name="banner_text" from="basetextarea"> 1087 <area>500,386,250,40</area> 1088 <value>/path/to/the/thing.jpg</value> 1089 </textarea> 1090 1091 <button name="fanart_button"> 1092 <area>460,412,32,32</area> 1093 <statetype name="buttonstate"> 1094 <state name="active"> 1095 <imagetype name="background"> 1096 <filename>blankbutton_off.png</filename> 1097 </imagetype> 1098 </state> 1099 <state name="selected" from="active"> 1100 <imagetype name="background"> 1101 <filename>blankbutton_on.png</filename> 1102 </imagetype> 1103 </state> 1104 <state name="disabled" from="active" /> 1105 <state name="pushed" from="active"> 1106 <imagetype name="background"> 1107 <filename>blankbutton_pushed.png</filename> 1108 </imagetype> 1109 </state> 1110 </statetype> 1111 </button> 1112 1113 <textarea name="fanart_text" from="basetextarea"> 1114 <area>500,415,250,40</area> 1115 <value>/path/to/the/thing.jpg</value> 1116 </textarea> 1117 977 1118 <button name="trailer_button"> 978 <area> 310,400,32,32</area>1119 <area>460,442,32,32</area> 979 1120 <statetype name="buttonstate"> 980 1121 <state name="active"> 981 1122 <imagetype name="background"> … … 997 1138 </button> 998 1139 999 1140 <textarea name="trailer_text" from="basetextarea"> 1000 <area> 350,405,250,40</area>1141 <area>500,447,250,40</area> 1001 1142 <value>/path/to/the/thing.jpg</value> 1002 1143 </textarea> 1003 1144 1145 1004 1146 <textedit name="player_edit" from="basetextedit"> 1005 <position> 310,435</position>1147 <position>410,477</position> 1006 1148 </textedit> 1007 1149 1008 1150 <button name="done_button" from="basebutton"> 1009 <position>310,505</position> 1151 <position>510,537</position> 1152 <value>Done</value> 1010 1153 </button> 1011 1154 1012 1155 </window> -
mythtv/libs/libmythui/mythmainwindow.cpp
1303 1303 1304 1304 bool MythMainWindow::HandleMedia(const QString &handler, const QString &mrl, 1305 1305 const QString &plot, const QString &title, 1306 const QString &director, int lenMins, 1306 const QString &subtitle, 1307 const QString &director, int season, 1308 int episode, int lenMins, 1307 1309 const QString &year) 1308 1310 { 1309 1311 QString lhandler(handler); … … 1313 1315 // Let's see if we have a plugin that matches the handler name... 1314 1316 if (d->mediaPluginMap.count(lhandler)) 1315 1317 { 1316 d->mediaPluginMap[lhandler].playFn(mrl, plot, title, 1317 director, lenMins, year); 1318 d->mediaPluginMap[lhandler].playFn(mrl, plot, title, subtitle, 1319 director, season, episode, lenMins, 1320 year); 1318 1321 return true; 1319 1322 } 1320 1323 -
mythtv/libs/libmythui/mythmainwindow.h
17 17 #define REG_JUMPEX(a, b, c, d, e) GetMythMainWindow()->RegisterJump(a, b, c, d, e) 18 18 #define REG_MEDIAPLAYER(a,b,c) GetMythMainWindow()->RegisterMediaPlugin(a, b, c) 19 19 20 typedef int (*MediaPlayCallback)(const QString &, const QString &, const QString &, const QString &, int, const QString &);20 typedef int (*MediaPlayCallback)(const QString &, const QString &, const QString &, const QString &, const QString &, int, int, int, const QString &); 21 21 22 22 class MythMainWindowPrivate; 23 23 … … 63 63 64 64 bool HandleMedia(const QString& handler, const QString& mrl, 65 65 const QString& plot="", const QString& title="", 66 const QString& director="", int lenMins=120, 66 const QString& subtitle="", const QString& director="", 67 int season=0, int episode=0, int lenMins=120, 67 68 const QString& year="1895"); 68 69 69 70 void JumpTo(const QString &destination, bool pop = true); -
mythtv/programs/mythfrontend/main.cpp
665 665 } 666 666 667 667 int internal_play_media(const QString &mrl, const QString &plot, 668 const QString &title, const QString &director, 668 const QString &title, const QString &subtitle, 669 const QString &director, int season, int episode, 669 670 int lenMins, const QString &year) 670 671 { 671 672 int res = -1; … … 704 705 pginfo->pathname = QString("dvd:%1").arg(mrl); 705 706 } 706 707 707 pginfo->description = plot;708 709 708 if (director.length()) 710 pginfo-> subtitle = QString( "%1: %2" )709 pginfo->description = QString( "%1: %2. " ) 711 710 .arg(QObject::tr("Directed By")).arg(director); 712 711 713 pginfo-> title = title;712 pginfo->description += plot; 714 713 714 if (subtitle.length()) 715 pginfo->subtitle = subtitle; 716 717 if ((season > 0) || (episode > 0)) 718 { 719 QString seas, ep; 720 seas = QString::number(season); 721 ep = QString::number(episode); 722 if (ep.size() < 2) 723 ep.prepend("0"); 724 QString SeasEpTitle = title; 725 SeasEpTitle += QString(" %1x%2").arg(seas).arg(ep); 726 pginfo->title = SeasEpTitle; 727 } 728 else 729 pginfo->title = title; 730 715 731 if (pginfo->pathname.startsWith("dvd:")) 716 732 { 717 733 bool allowdvdbookmark = gContext->GetNumSetting("EnableDVDBookmark", 0);