Ticket #6346: MythVideo.SubSeasEp.33009.diff
File MythVideo.SubSeasEp.33009.diff, 80.7 KB (added by , 15 years ago) |
---|
-
mythplugins/mythvideo/theme/default/video-ui.xml
867 867 <!-- Labels --> 868 868 869 869 <textarea name="title_text" from="basetextarea"> 870 <area>50, 90,250,40</area>871 <value> Name:</value>870 <area>50,80,250,40</area> 871 <value>Title:</value> 872 872 <align>right,top</align> 873 873 </textarea> 874 874 875 <textarea name="subtitle_text" from="basetextarea"> 876 <area>50,138,250,40</area> 877 <value>Subtitle:</value> 878 <align>right,top</align> 879 </textarea> 880 881 <textarea name="season_text" from="basetextarea"> 882 <area>50,185,250,40</area> 883 <value>Season:</value> 884 <align>right,top</align> 885 </textarea> 886 887 <textarea name="episode_text" from="basetextarea"> 888 <area>370,185,150,40</area> 889 <value>Episode:</value> 890 <align>right,top</align> 891 </textarea> 892 875 893 <textarea name="category_text" from="title_text"> 876 <position>50,152</position> 894 <area>370,232,150,40</area> 895 <align>right</align> 877 896 <value>Category:</value> 878 897 </textarea> 879 898 880 899 <textarea name="level_text" from="title_text"> 881 <position>50,202</position> 900 <area>20,232,200,40</area> 901 <align>right</align> 882 902 <value>Parental Control:</value> 883 903 </textarea> 884 904 885 905 <textarea name="child_text" from="title_text"> 886 <position>50,247</position> 906 <area>20,277,200,40</area> 907 <align>right</align> 887 908 <value>File to Always Play Next:</value> 888 909 </textarea> 889 910 890 911 <textarea name="browse_text" from="title_text"> 891 <position>50,292</position> 912 <area>500,277,200,40</area> 913 <align>left</align> 892 914 <value>Include while Browsing:</value> 893 915 </textarea> 894 916 … … 925 947 <!-- Widgets --> 926 948 927 949 <textedit name="title_edit" from="basetextedit"> 928 <position>310, 80</position>950 <position>310,70</position> 929 951 </textedit> 930 952 931 < buttonlist name="category_select" from="baseselector">932 <position>310,1 45</position>933 </ buttonlist>953 <textedit name="subtitle_edit" from="basetextedit"> 954 <position>310,126</position> 955 </textedit> 934 956 957 <spinbox name="season" from="basespinbox"> 958 <position>310,181</position> 959 </spinbox> 960 961 <spinbox name="episode" from="basespinbox"> 962 <position>530,181</position> 963 </spinbox> 964 935 965 <buttonlist name="level_select" from="baseselector"> 936 <position> 310,195</position>966 <position>230,225</position> 937 967 </buttonlist> 938 968 969 <buttonlist name="category_select" from="baseselector"> 970 <position>530,225</position> 971 </buttonlist> 972 939 973 <buttonlist name="child_select" from="baseselector"> 940 <position> 310,240</position>974 <position>230,270</position> 941 975 </buttonlist> 942 976 943 977 <checkbox name="browse_check" from="basecheckbox"> 944 <position> 310,290</position>978 <position>680,275</position> 945 979 </checkbox> 946 980 947 981 <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 { … … 140 141 // OnVideoPosterSetDone() stop wait background 141 142 void StartVideoPosterSet(Metadata *metadata); 142 143 void StartVideoFanartSet(Metadata *metadata); 144 void StartVideoBannerSet(Metadata *metadata); 143 145 144 146 // StartVideoSearchByUID() start wait background 145 147 // OnVideoSearchByUIDDone() stop wait background … … 159 161 void OnFanartURL(QString uri, Metadata *metadata); 160 162 void OnFanartCopyFinished(FanartDownloadErrorState error, QString errorMsg, 161 163 Metadata *metadata); 164 void OnBannerURL(QString uri, Metadata *metadata); 165 void OnBannerCopyFinished(BannerDownloadErrorState error, QString errorMsg, 166 Metadata *metadata); 162 167 163 168 // called during StartVideoSearchByTitle 164 169 void OnVideoSearchByTitleDone(bool normal_exit, … … 170 175 // StartVideoPosterSet end 171 176 void OnVideoPosterSetDone(Metadata *metadata); 172 177 void OnVideoFanartSetDone(Metadata *metadata); 178 void OnVideoBannerSetDone(Metadata *metadata); 173 179 174 180 // StartVideoSearchByUID end 175 181 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 … … 808 846 title = eatBraces(title, "(", ")"); 809 847 title = eatBraces(title, "{", "}"); 810 848 811 return title.trimmed(); 849 QRegExp group("^(.*[^s0-9])" // title 850 "(?:[s])?(\\d{1,3})(?:\\s|-)?(?:[ex])" //Season 851 "(?:\\s|-)?(\\d{1,3})" // Episode 852 "(.*)$", // subtitle 853 Qt::CaseInsensitive); 854 int pos = group.indexIn(title); 855 if (pos > -1) 856 { 857 QString groupResult = group.cap(0); 858 QString title = group.cap(1); 859 QString season = group.cap(2); 860 QString episode = group.cap(3); 861 QString subtitle = group.cap(4); 862 if (position == 1 && !title.isEmpty()) 863 return title.trimmed(); 864 else if (position == 2) 865 return season.trimmed(); 866 else if (position == 3) 867 return episode.trimmed(); 868 else if (position == 4) 869 return subtitle.trimmed(); 870 } 871 else if (position == 1) 872 return title; 873 else if (position == 2 || position == 3) 874 return QString("0"); 875 876 return QString(""); 812 877 } 813 878 814 879 namespace … … 829 894 return ret; 830 895 } 831 896 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,897 Metadata::Metadata(const QString &filename, const QString &trailer, 898 const QString &coverfile, const QString &screenshot, 899 const QString &banner, const QString &fanart, 900 const QString &title, const QString &subtitle, int year, 836 901 const QString &inetref, const QString &director, 837 902 const QString &plot, float userrating, 838 903 const QString &rating, int length, 904 int season, int episode, 839 905 int id, ParentalLevel::Level showlevel, int categoryID, 840 906 int childID, bool browse, 841 907 const QString &playcommand, const QString &category, … … 845 911 const QString &host) 846 912 { 847 913 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);914 fanart, title, subtitle, year, inetref, director, plot, 915 userrating, rating, length, season, episode, id, 916 showlevel, categoryID, childID, browse, playcommand, 917 category, genres, countries, cast, host); 852 918 } 853 919 854 920 Metadata::~Metadata() … … 911 977 m_imp->SetTitle(title); 912 978 } 913 979 980 const QString &Metadata::GetSubtitle() const 981 { 982 return m_imp->getSubtitle(); 983 } 984 985 void Metadata::SetSubtitle(const QString &subtitle) 986 { 987 m_imp->SetSubtitle(subtitle); 988 } 989 914 990 int Metadata::GetYear() const 915 991 { 916 992 return m_imp->getYear(); … … 981 1057 m_imp->SetLength(length); 982 1058 } 983 1059 1060 int Metadata::GetSeason() const 1061 { 1062 return m_imp->GetSeason(); 1063 } 1064 1065 void Metadata::SetSeason(int season) 1066 { 1067 m_imp->SetSeason(season); 1068 } 1069 1070 int Metadata::GetEpisode() const 1071 { 1072 return m_imp->GetEpisode(); 1073 } 1074 1075 void Metadata::SetEpisode(int episode) 1076 { 1077 m_imp->SetEpisode(episode); 1078 } 1079 984 1080 unsigned int Metadata::GetID() const 985 1081 { 986 1082 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 238 288 HostLineEdit *VideoStartupDirectory() 239 289 { 240 290 HostLineEdit *gc = new HostLineEdit("VideoStartupDir"); … … 776 826 VConfigPage page7(pages, false); 777 827 page7->addChild(trlr); 778 828 829 // page 8 830 VerticalConfigurationGroup *tvman = 831 new VerticalConfigurationGroup(true, false); 832 tvman->setLabel(QObject::tr("Television in MythVideo")); 833 tvman->addChild(SearchTVListingsCommand()); 834 tvman->addChild(GetTVPostersCommand()); 835 tvman->addChild(GetTVFanartCommand()); 836 tvman->addChild(GetTVBannerCommand()); 837 tvman->addChild(GetTVDataCommand()); 838 839 VConfigPage page8(pages, false); 840 page8->addChild(tvman); 841 779 842 int page_num = 1; 780 843 for (ConfigPage::PageList::const_iterator p = pages.begin(); 781 844 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: … … 525 646 void Run(QString video_uid, Metadata *item) 526 647 { 527 648 m_item = item; 528 m_video_uid = video_uid; 649 m_video_uid = video_uid; 650 int m_season, m_episode; 651 m_season = m_item->GetSeason(); 652 m_episode = m_item->GetEpisode(); 529 653 530 const QString def_cmd = QDir::cleanPath(QString("%1/%2") 654 if (m_season > 0 || m_episode > 0) 655 { 656 const QString def_cmd = QDir::cleanPath(QString("%1/%2") 531 657 .arg(GetShareDir()) 658 .arg("mythvideo/scripts/ttvdb.py -mD")); 659 const QString cmd = gContext->GetSetting("mythvideo.TVDataCommandLine", 660 def_cmd); 661 QStringList args; 662 args << video_uid << QString::number(m_season) 663 << QString::number(m_episode); 664 StartRun(cmd, args, "Video Data Query"); 665 } 666 else 667 { 668 const QString def_cmd = QDir::cleanPath(QString("%1/%2") 669 .arg(GetShareDir()) 532 670 .arg("mythvideo/scripts/tmdb.pl -D")); 533 const QString cmd = gContext->GetSetting("MovieDataCommandLine",671 const QString cmd = gContext->GetSetting("MovieDataCommandLine", 534 672 def_cmd); 535 536 StartRun(cmd, QStringList(video_uid), "Video Data Query");673 StartRun(cmd, QStringList(video_uid), "Video Data Query"); 674 } 537 675 } 538 676 539 677 private: … … 570 708 void Run(QString video_uid, Metadata *item) 571 709 { 572 710 m_item = item; 711 int m_season, m_episode; 712 m_season = m_item->GetSeason(); 713 m_episode = m_item->GetEpisode(); 573 714 574 const QString default_cmd = 715 if (m_season > 0 || m_episode > 0) 716 { 717 const QString def_cmd = QDir::cleanPath(QString("%1/%2") 718 .arg(GetShareDir()) 719 .arg("mythvideo/scripts/ttvdb.py -mP")); 720 const QString cmd = gContext->GetSetting("mythvideo.TVPosterCommandLine", 721 def_cmd); 722 QStringList args; 723 args << video_uid << QString::number(m_season) 724 << QString::number(m_episode); 725 StartRun(cmd, args, "Poster Query"); 726 } 727 else 728 { 729 const QString default_cmd = 575 730 QDir::cleanPath(QString("%1/%2") 576 731 .arg(GetShareDir()) 577 732 .arg("mythvideo/scripts/tmdb.pl -P")); 578 const QString cmd = gContext->GetSetting("MoviePosterCommandLine",733 const QString cmd = gContext->GetSetting("MoviePosterCommandLine", 579 734 default_cmd); 580 StartRun(cmd, QStringList(video_uid), "Poster Query"); 735 736 StartRun(cmd, QStringList(video_uid), "Poster Query"); 737 } 581 738 } 582 739 583 740 private: … … 627 784 void Run(QString video_uid, Metadata *item) 628 785 { 629 786 m_item = item; 787 int m_season, m_episode; 788 m_season = m_item->GetSeason(); 789 m_episode = m_item->GetEpisode(); 630 790 631 const QString default_cmd = 791 if (m_season > 0 || m_episode > 0) 792 { 793 const QString def_cmd = QDir::cleanPath(QString("%1/%2") 794 .arg(GetShareDir()) 795 .arg("mythvideo/scripts/ttvdb.py -tF")); 796 const QString cmd = gContext->GetSetting("mythvideo.TVFanartCommandLine", 797 def_cmd); 798 QStringList args; 799 args << video_uid << QString::number(m_season) 800 << QString::number(m_episode); 801 StartRun(cmd, args, "Fanart Query"); 802 } 803 else 804 { 805 const QString default_cmd = 632 806 QDir::cleanPath(QString("%1/%2") 633 807 .arg(GetShareDir()) 634 808 .arg("mythvideo/scripts/tmdb.pl -B")); 635 const QString cmd = gContext->GetSetting("MovieFanartCommandLine",809 const QString cmd = gContext->GetSetting("MovieFanartCommandLine", 636 810 default_cmd); 637 StartRun(cmd, QStringList(video_uid), "Fanart Query"); 811 StartRun(cmd, QStringList(video_uid), "Fanart Query"); 812 } 638 813 } 639 814 640 815 private: … … 665 840 Metadata *m_item; 666 841 }; 667 842 843 /** \class VideoBannerSearch 844 * 845 * \brief Execute external video banner command. 846 * 847 */ 848 class VideoBannerSearch : public ExecuteExternalCommand 849 { 850 Q_OBJECT 668 851 852 signals: 853 void SigBannerURL(QString url, Metadata *item); 854 855 public: 856 VideoBannerSearch(QObject *oparent) : 857 ExecuteExternalCommand(oparent), m_item(0) {} 858 859 void Run(QString video_uid, Metadata *item) 860 { 861 m_item = item; 862 int m_season, m_episode; 863 m_season = m_item->GetSeason(); 864 m_episode = m_item->GetEpisode(); 865 866 const QString def_cmd = QDir::cleanPath(QString("%1/%2") 867 .arg(GetShareDir()) 868 .arg("mythvideo/scripts/ttvdb.py -tB")); 869 const QString cmd = gContext->GetSetting("mythvideo.TVBannerCommandLine", 870 def_cmd); 871 QStringList args; 872 args << video_uid << QString::number(m_season) 873 << QString::number(m_episode); 874 StartRun(cmd, args, "Banner Query"); 875 } 876 877 private: 878 ~VideoBannerSearch() {} 879 880 void OnExecDone(bool normal_exit, QStringList out, QStringList err) 881 { 882 (void) err; 883 QString url; 884 if (normal_exit && out.size()) 885 { 886 for (QStringList::const_iterator p = out.begin(); 887 p != out.end(); ++p) 888 { 889 if ((*p).length()) 890 { 891 url = *p; 892 break; 893 } 894 } 895 } 896 897 emit SigBannerURL(url, m_item); 898 deleteLater(); 899 } 900 901 private: 902 Metadata *m_item; 903 }; 904 669 905 class ParentalLevelNotifyContainer : public QObject 670 906 { 671 907 Q_OBJECT … … 790 1026 } 791 1027 }; 792 1028 793 bool GetLocalVideoPoster(const QString &video_uid, const QString &filename, 794 const QStringList &in_dirs, QString &poster) 1029 bool GetLocalVideoImage(const QString &video_uid, const QString &filename, 1030 const QStringList &in_dirs, QString &image, 1031 QString title, int season) 795 1032 { 796 1033 QStringList search_dirs(in_dirs); 797 1034 … … 821 1058 ext != image_exts.end(); ++ext) 822 1059 { 823 1060 QStringList sfn; 1061 if (season > 0) 1062 sfn += fntm.arg(*dir).arg(QString("%1 Season %2") 1063 .arg(title).arg(QString::number(season))) 1064 .arg(*ext); 824 1065 sfn += fntm.arg(*dir).arg(base_name).arg(*ext); 825 1066 sfn += fntm.arg(*dir).arg(video_uid).arg(*ext); 826 1067 … … 829 1070 { 830 1071 if (QFile::exists(*i)) 831 1072 { 832 poster= *i;1073 image = *i; 833 1074 return true; 834 1075 } 835 1076 } … … 1016 1257 1017 1258 tmp["filename"] = metadata->GetFilename(); 1018 1259 tmp["title"] = metadata->GetTitle(); 1260 tmp["subtitle"] = metadata->GetSubtitle(); 1019 1261 tmp["director"] = metadata->GetDirector(); 1020 1262 tmp["plot"] = metadata->GetPlot(); 1021 1263 tmp["genres"] = GetDisplayGenres(*metadata); … … 1025 1267 tmp["length"] = GetDisplayLength(metadata->GetLength()); 1026 1268 tmp["year"] = GetDisplayYear(metadata->GetYear()); 1027 1269 tmp["userrating"] = GetDisplayUserRating(metadata->GetUserRating()); 1270 tmp["season"] = GetDisplaySeasonEpisode(metadata->GetSeason(), 1); 1271 tmp["episode"] = GetDisplaySeasonEpisode(metadata->GetEpisode(), 1); 1028 1272 1273 if (metadata->GetSeason() > 0 || metadata->GetEpisode() > 0) 1274 { 1275 tmp["s##e##"] = QString("s%1e%2").arg(GetDisplaySeasonEpisode 1276 (metadata->GetSeason(), 2)) 1277 .arg(GetDisplaySeasonEpisode(metadata->GetEpisode(), 2)); 1278 tmp["##x##"] = QString("%1x%2").arg(GetDisplaySeasonEpisode 1279 (metadata->GetSeason(), 1)) 1280 .arg(GetDisplaySeasonEpisode(metadata->GetEpisode(), 2)); 1281 } 1282 else 1283 tmp["s##e##"] = tmp["##x##"] = ""; 1284 1029 1285 tmp["userratingstate"] = 1030 1286 QString::number((int)(metadata->GetUserRating())); 1031 1287 tmp["videolevel"] = ParentalLevelToState(metadata->GetShowLevel()); … … 1075 1331 h.handleText("player"); 1076 1332 h.handleText("filename"); 1077 1333 h.handleText("title"); 1334 h.handleText("subtitle"); 1078 1335 h.handleText("director"); 1079 1336 h.handleText("plot"); 1080 1337 h.handleText("genres"); … … 1082 1339 h.handleText("cast"); 1083 1340 h.handleText("rating"); 1084 1341 h.handleText("length"); 1342 h.handleText("season"); 1343 h.handleText("s##e##"); 1344 h.handleText("##x##"); 1345 h.handleText("episode"); 1085 1346 h.handleText("year"); 1086 1347 h.handleText("userrating"); 1087 1348 … … 1254 1515 1255 1516 m_artDir = gContext->GetSetting("VideoArtworkDir"); 1256 1517 m_fanDir = gContext->GetSetting("mythvideo.fanartDir"); 1518 m_banDir = gContext->GetSetting("mythvideo.bannerDir"); 1257 1519 } 1258 1520 1259 1521 ~VideoDialogPrivate() … … 1322 1584 } 1323 1585 } 1324 1586 1587 void AddBannerDownload(BannerDownloadProxy *download) 1588 { 1589 m_running_bdownloads.insert(download); 1590 } 1591 1592 void RemoveBannerDownload(BannerDownloadProxy *download) 1593 { 1594 if (download) 1595 { 1596 banner_download_list::iterator p = 1597 m_running_bdownloads.find(download); 1598 if (p != m_running_bdownloads.end()) 1599 m_running_bdownloads.erase(p); 1600 } 1601 } 1602 1325 1603 void StopAllRunningCoverDownloads() 1326 1604 { 1327 1605 cover_download_list tmp(m_running_downloads); … … 1336 1614 (*p)->Stop(); 1337 1615 } 1338 1616 1617 void StopAllRunningBannerDownloads() 1618 { 1619 banner_download_list tmp(m_running_bdownloads); 1620 for (banner_download_list::iterator p = tmp.begin(); p != tmp.end(); ++p) 1621 (*p)->Stop(); 1622 } 1339 1623 1340 1624 public: 1341 1625 typedef std::set<CoverDownloadProxy *> cover_download_list; 1342 1626 cover_download_list m_running_downloads; 1343 1627 typedef std::set<FanartDownloadProxy *> fanart_download_list; 1344 1628 fanart_download_list m_running_fdownloads; 1629 typedef std::set<BannerDownloadProxy *> banner_download_list; 1630 banner_download_list m_running_bdownloads; 1345 1631 ParentalLevelNotifyContainer m_parentalLevel; 1346 1632 bool m_switchingLayout; 1347 1633 … … 1364 1650 1365 1651 QString m_artDir; 1366 1652 QString m_fanDir; 1653 QString m_banDir; 1367 1654 VideoScanner *m_scanner; 1368 1655 1369 1656 QString m_lastTreeNodePath; … … 2179 2466 if (metadata) 2180 2467 { 2181 2468 QString trailerFile = metadata->GetTrailer(); 2182 if (QFile::exists(trailerFile)) 2469 if ((metadata->IsHostSet() && !trailerFile.startsWith("/") 2470 && !trailerFile.isEmpty()) || QFile::exists(trailerFile)) 2183 2471 { 2184 2472 m_menuPopup->AddButton(tr("Watch Trailer"), 2185 2473 SLOT(playTrailer())); … … 2479 2767 Metadata *metadata = GetMetadata(GetItemCurrent()); 2480 2768 if (!metadata) return; 2481 2769 2482 QStringList trailers = GetTrailersInDirectory(gContext-> 2770 QStringList trailers; 2771 2772 if (metadata->IsHostSet()) 2773 { 2774 } 2775 2776 // Fall back and try the local trailers dir. Feature? 2777 if (trailers.isEmpty()) 2778 { 2779 trailers = GetTrailersInDirectory(gContext-> 2483 2780 GetSetting("mythvideo.TrailersDir")); 2781 } 2484 2782 2485 2783 if (trailers.isEmpty()) 2486 2784 return; … … 2508 2806 Metadata *metadata = GetMetadata(GetItemCurrent()); 2509 2807 if (!metadata) return; 2510 2808 2511 VideoPlayerCommand::PlayerFor(metadata->GetTrailer()).Play(); 2809 QString filename; 2810 2811 if (metadata->IsHostSet()) 2812 filename = GenRemoteFileURL("Trailers", metadata->GetHost(), 2813 metadata->GetTrailer()); 2814 else 2815 filename = metadata->GetFilename(); 2816 2817 VideoPlayerCommand::PlayerFor(filename).Play(); 2512 2818 } 2513 2819 2514 2820 void VideoDialog::setParentalLevel(const ParentalLevel::Level &level) … … 2757 3063 metadata->Reset(); 2758 3064 2759 3065 QString cover_file; 2760 if (GetLocalVideoPoster(metadata->GetInetRef(), metadata->GetFilename(), 2761 QStringList(m_d->m_artDir), cover_file)) 3066 if (GetLocalVideoImage(metadata->GetInetRef(), metadata->GetFilename(), 3067 QStringList(m_d->m_artDir), cover_file, 3068 metadata->GetTitle(), metadata->GetSeason())) 2762 3069 { 2763 3070 metadata->SetCoverFile(cover_file); 2764 3071 } 2765 3072 3073 QString fanart_file; 3074 if (GetLocalVideoImage(metadata->GetInetRef(), metadata->GetFilename(), 3075 QStringList(m_d->m_fanDir), fanart_file, 3076 metadata->GetTitle(), metadata->GetSeason())) 3077 { 3078 metadata->SetFanart(fanart_file); 3079 } 3080 3081 QString banner_file; 3082 if (GetLocalVideoImage(metadata->GetInetRef(), metadata->GetFilename(), 3083 QStringList(m_d->m_banDir), banner_file, 3084 metadata->GetTitle(), metadata->GetSeason())) 3085 { 3086 metadata->SetBanner(banner_file); 3087 } 3088 2766 3089 metadata->UpdateDatabase(); 2767 3090 2768 3091 UpdateItem(item); … … 2777 3100 //createBusyDialog(QObject::tr("Fetching poster for %1 (%2)") 2778 3101 // .arg(metadata->InetRef()) 2779 3102 // .arg(metadata->Title())); 2780 QStringList search_dirs;2781 search_dirs += m_d->m_artDir;3103 QStringList cover_dirs; 3104 cover_dirs += m_d->m_artDir; 2782 3105 2783 3106 QString cover_file; 2784 3107 2785 if (GetLocalVideoPoster(metadata->GetInetRef(), metadata->GetFilename(), 2786 search_dirs, cover_file)) 3108 if (GetLocalVideoImage(metadata->GetInetRef(), metadata->GetFilename(), 3109 cover_dirs, cover_file, metadata->GetTitle(), 3110 metadata->GetSeason())) 2787 3111 { 2788 3112 metadata->SetCoverFile(cover_file); 2789 3113 OnVideoPosterSetDone(metadata); … … 2798 3122 vps->Run(metadata->GetInetRef(), metadata); 2799 3123 } 2800 3124 3125 QStringList fanart_dirs; 3126 fanart_dirs += m_d->m_fanDir; 3127 3128 QString fanart_file; 3129 3130 if (GetLocalVideoImage(metadata->GetInetRef(), metadata->GetFilename(), 3131 fanart_dirs, fanart_file, metadata->GetTitle(), 3132 metadata->GetSeason())) 3133 { 3134 metadata->SetFanart(fanart_file); 3135 OnVideoFanartSetDone(metadata); 3136 } 3137 2801 3138 if (metadata->GetFanart().isEmpty()) 2802 3139 { 2803 3140 // Obtain video fanart … … 2806 3143 SLOT(OnFanartURL(QString, Metadata *))); 2807 3144 vfs->Run(metadata->GetInetRef(), metadata); 2808 3145 } 3146 3147 QStringList banner_dirs; 3148 banner_dirs += m_d->m_banDir; 3149 3150 QString banner_file; 3151 3152 if (GetLocalVideoImage(metadata->GetInetRef(), metadata->GetFilename(), 3153 banner_dirs, banner_file, metadata->GetTitle(), 3154 metadata->GetSeason())) 3155 { 3156 metadata->SetBanner(banner_file); 3157 OnVideoBannerSetDone(metadata); 3158 } 3159 3160 if (metadata->GetBanner().isEmpty() && 3161 (metadata->GetSeason() > 0 || metadata->GetEpisode() > 0)) 3162 { 3163 // Obtain video banner (only for TV) 3164 VideoBannerSearch *vbs = new VideoBannerSearch(this); 3165 connect(vbs, SIGNAL(SigBannerURL(QString, Metadata *)), 3166 SLOT(OnBannerURL(QString, Metadata *))); 3167 vbs->Run(metadata->GetInetRef(), metadata); 3168 } 2809 3169 } 2810 3170 2811 3171 void VideoDialog::OnPosterURL(QString uri, Metadata *metadata) … … 2838 3198 QUrl url(uri); 2839 3199 2840 3200 QString ext = QFileInfo(url.path()).suffix(); 2841 QString dest_file = QString("%1/%2.%3").arg(fileprefix) 2842 .arg(metadata->GetInetRef()).arg(ext); 3201 QString dest_file; 3202 3203 if (metadata->GetSeason() > 0 || 3204 metadata->GetEpisode() > 0) 3205 { 3206 // Name TV downloads so that they already work with the PBB 3207 QString title = QString("%1 Season %2").arg(metadata->GetTitle()) 3208 .arg(metadata->GetSeason()); 3209 dest_file = QString("%1/%2.%3").arg(fileprefix) 3210 .arg(title).arg(ext); 3211 } 3212 else 3213 dest_file = QString("%1/%2.%3").arg(fileprefix) 3214 .arg(metadata->GetInetRef()).arg(ext); 3215 2843 3216 VERBOSE(VB_IMPORTANT, QString("Copying '%1' -> '%2'...") 2844 3217 .arg(url.toString()).arg(dest_file)); 2845 3218 … … 2932 3305 QUrl url(uri); 2933 3306 2934 3307 QString ext = QFileInfo(url.path()).suffix(); 2935 QString dest_file = QString("%1/%2.%3").arg(fileprefix) 2936 .arg(metadata->GetInetRef()).arg(ext); 3308 QString dest_file; 3309 3310 if (metadata->GetSeason() > 0 || 3311 metadata->GetEpisode() > 0) 3312 { 3313 // Name TV downloads so that they already work with the PBB 3314 QString title = QString("%1 Season %2").arg(metadata->GetTitle()) 3315 .arg(metadata->GetSeason()); 3316 dest_file = QString("%1/%2.%3").arg(fileprefix) 3317 .arg(title).arg(ext); 3318 } 3319 else 3320 dest_file = QString("%1/%2.%3").arg(fileprefix) 3321 .arg(metadata->GetInetRef()).arg(ext); 3322 2937 3323 VERBOSE(VB_IMPORTANT, QString("Copying '%1' -> '%2'...") 2938 3324 .arg(url.toString()).arg(dest_file)); 2939 3325 … … 2996 3382 UpdateItem(GetItemCurrent()); 2997 3383 } 2998 3384 3385 void VideoDialog::OnBannerURL(QString uri, Metadata *metadata) 3386 { 3387 if (metadata) 3388 { 3389 if (uri.length()) 3390 { 3391 QString fileprefix = m_d->m_banDir; 3392 3393 QDir dir; 3394 3395 // If the fanart setting hasn't been set default to 3396 // using ~/.mythtv/MythVideo/Banners 3397 if (fileprefix.length() == 0) 3398 { 3399 fileprefix = GetConfDir(); 3400 3401 dir.setPath(fileprefix); 3402 if (!dir.exists()) 3403 dir.mkdir(fileprefix); 3404 3405 fileprefix += "/MythVideo/Banners"; 3406 } 3407 3408 dir.setPath(fileprefix); 3409 if (!dir.exists()) 3410 dir.mkdir(fileprefix); 3411 3412 QUrl url(uri); 3413 3414 QString ext = QFileInfo(url.path()).suffix(); 3415 QString dest_file; 3416 3417 if (metadata->GetSeason() > 0 || 3418 metadata->GetEpisode() > 0) 3419 { 3420 // Name TV downloads so that they already work with the PBB 3421 QString title = QString("%1 Season %2").arg(metadata->GetTitle()) 3422 .arg(metadata->GetSeason()); 3423 dest_file = QString("%1/%2.%3").arg(fileprefix) 3424 .arg(title).arg(ext); 3425 } 3426 else 3427 dest_file = QString("%1/%2.%3").arg(fileprefix) 3428 .arg(metadata->GetInetRef()).arg(ext); 3429 3430 VERBOSE(VB_IMPORTANT, QString("Copying '%1' -> '%2'...") 3431 .arg(url.toString()).arg(dest_file)); 3432 3433 BannerDownloadProxy *d = 3434 BannerDownloadProxy::Create(url, dest_file, metadata); 3435 metadata->SetBanner(dest_file); 3436 3437 connect(d, SIGNAL(SigFinished(BannerDownloadErrorState, 3438 QString, Metadata *)), 3439 SLOT(OnBannerCopyFinished(BannerDownloadErrorState, 3440 QString, Metadata *))); 3441 3442 d->StartCopy(); 3443 m_d->AddBannerDownload(d); 3444 } 3445 else 3446 { 3447 metadata->SetBanner(""); 3448 OnVideoBannerSetDone(metadata); 3449 } 3450 } 3451 else 3452 OnVideoBannerSetDone(metadata); 3453 } 3454 3455 void VideoDialog::OnBannerCopyFinished(BannerDownloadErrorState error, 3456 QString errorMsg, Metadata *item) 3457 { 3458 QObject *src = sender(); 3459 if (src) 3460 m_d->RemoveBannerDownload(dynamic_cast<BannerDownloadProxy *> 3461 (src)); 3462 3463 if (error != besOK && item) 3464 item->SetBanner(""); 3465 3466 VERBOSE(VB_IMPORTANT, tr("Banner download finished: %1 %2") 3467 .arg(errorMsg).arg(error)); 3468 3469 if (error == besTimeout) 3470 { 3471 createOkDialog(tr("Banner exists for this item but could not be " 3472 "retrieved within the timeout period.\n")); 3473 } 3474 3475 OnVideoBannerSetDone(item); 3476 } 3477 3478 // This is the final call as part of a StartVideoBannerSet 3479 void VideoDialog::OnVideoBannerSetDone(Metadata *metadata) 3480 { 3481 // The metadata has a banner set 3482 if (m_busyPopup) 3483 { 3484 m_busyPopup->Close(); 3485 m_busyPopup = NULL; 3486 } 3487 3488 metadata->UpdateDatabase(); 3489 UpdateItem(GetItemCurrent()); 3490 } 3491 2999 3492 void VideoDialog::StartVideoSearchByUID(QString video_uid, Metadata *metadata) 3000 3493 { 3001 3494 // Starting the busy dialog here triggers a bizarre segfault … … 3028 3521 } 3029 3522 // set known values 3030 3523 metadata->SetTitle(data["Title"]); 3524 metadata->SetSubtitle(data["Subtitle"]); 3031 3525 metadata->SetYear(data["Year"].toInt()); 3032 3526 metadata->SetDirector(data["Director"]); 3033 3527 metadata->SetPlot(data["Plot"]); 3034 3528 metadata->SetUserRating(data["UserRating"].toFloat()); 3035 3529 metadata->SetRating(data["MovieRating"]); 3036 3530 metadata->SetLength(data["Runtime"].toInt()); 3531 metadata->SetSeason(data["Season"].toInt()); 3532 metadata->SetEpisode(data["Episode"].toInt()); 3037 3533 3038 3534 m_d->AutomaticParentalAdjustment(metadata); 3039 3535 -
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
237 237 play_command = "Internal"; 238 238 239 239 QString plot; 240 QString title = Metadata::FilenameTo Title(filename);240 QString title = Metadata::FilenameToMeta(filename, 1); 241 241 QString director; 242 242 int length = 0; 243 243 QString year = QString::number(VIDEO_YEAR_DEFAULT); -
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
506 506 <value>Video Browser</value> 507 507 </textarea> 508 508 509 <imagetype name="fanart"> 510 <area>0,0,1280,720</area> 511 <filename /> 512 </imagetype> 513 509 514 <imagetype name="browserbackground"> 510 515 <position>0,345</position> 511 516 <filename>video/browserlistbackground.png</filename> … … 565 570 </imagetype> 566 571 567 572 <textarea name="title" from="basetextarea"> 568 <area>48,78, 980,35</area>573 <area>48,78,590,35</area> 569 574 <font>baselarge</font> 570 575 </textarea> 571 576 577 <textarea name="subtitle" from="basetextarea"> 578 <area>600,78,590,35</area> 579 <align>right</align> 580 <font>baselarge</font> 581 </textarea> 582 572 583 <statetype name="userratingstate" from="baserating"> 573 584 <position>1193,72</position> 574 585 </statetype> … … 583 594 <area>48,284,290,30</area> 584 595 </textarea> 585 596 597 <textarea name="##x##" from="basetextarea"> 598 <area>540,284,200,30</area> 599 <align>center</align> 600 </textarea> 601 586 602 <textarea name="director" from="basetextarea"> 587 603 <area>430,284,800,30</area> 588 604 <align>right</align> … … 604 620 <font>baselarge</font> 605 621 </textarea> 606 622 623 <imagetype name="fanart"> 624 <area>0,0,1280,720</area> 625 <filename /> 626 </imagetype> 627 607 628 <buttonlist name="videos"> 608 629 <area>12,0,1260,785</area> 609 630 <layout>grid</layout> … … 730 751 <value>Videos - Tree</value> 731 752 </textarea> 732 753 754 <imagetype name="fanart"> 755 <area>0,0,1280,720</area> 756 <filename /> 757 </imagetype> 758 733 759 <textarea name="breadcrumbs" from="basetextarea"> 734 760 <area>50,20,700,40</area> 735 761 <font>basemedium</font>