Ticket #6346: MythVideo.SeasSubEp.4.13.09-2.diff
File MythVideo.SeasSubEp.4.13.09-2.diff, 100.3 KB (added by , 16 years ago) |
---|
-
mythtv/themes/Terra/video-ui.xml
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> … … 885 911 <!-- Labels --> 886 912 887 913 <textarea name="title_text" from="basetextarea"> 888 <area> 50,135,250,40</area>889 <value> Name:</value>914 <area>150,80,250,40</area> 915 <value>Title:</value> 890 916 <align>right,top</align> 891 917 </textarea> 892 918 919 <textarea name="subtitle_text" from="basetextarea"> 920 <area>150,138,250,40</area> 921 <value>Subtitle:</value> 922 <align>right,top</align> 923 </textarea> 924 925 <textarea name="season_text" from="basetextarea"> 926 <area>200,185,250,40</area> 927 <value>Season:</value> 928 <align>right,top</align> 929 </textarea> 930 931 <textarea name="episode_text" from="basetextarea"> 932 <area>520,185,150,40</area> 933 <value>Episode:</value> 934 <align>right,top</align> 935 </textarea> 936 893 937 <textarea name="category_text" from="title_text"> 894 <position>50,197</position> 938 <area>520,232,150,40</area> 939 <align>right</align> 895 940 <value>Category:</value> 896 941 </textarea> 897 942 898 943 <textarea name="level_text" from="title_text"> 899 <position>50,247</position> 944 <area>120,232,200,40</area> 945 <align>right</align> 900 946 <value>Parental Control:</value> 901 947 </textarea> 902 948 903 949 <textarea name="child_text" from="title_text"> 904 <position>50,292</position> 950 <area>120,277,200,40</area> 951 <align>right</align> 905 952 <value>File to Always Play Next:</value> 906 953 </textarea> 907 954 908 955 <textarea name="browse_text" from="title_text"> 909 <position>50,337</position> 956 <area>570,277,280,40</area> 957 <align>left</align> 910 958 <value>Include while Browsing:</value> 911 959 </textarea> 912 960 913 961 <textarea name="coverart_text_label" from="title_text"> 914 <position> 50,375</position>962 <position>200,328</position> 915 963 <value>Cover Art:</value> 916 964 </textarea> 917 965 966 <textarea name="screenshot_text_label" from="title_text"> 967 <position>200,357</position> 968 <value>Screenshot:</value> 969 </textarea> 970 971 <textarea name="banner_text_label" from="title_text"> 972 <position>200,386</position> 973 <value>Banner:</value> 974 </textarea> 975 976 <textarea name="fanart_text_label" from="title_text"> 977 <position>200,415</position> 978 <value>Fanart:</value> 979 </textarea> 980 918 981 <textarea name="trailer_text_label" from="title_text"> 919 <position> 50,405</position>982 <position>200,447</position> 920 983 <value>Trailer:</value> 921 984 </textarea> 922 985 923 986 <textarea name="player_text" from="title_text"> 924 <position> 50,445</position>987 <position>150,487</position> 925 988 <value>Unique Player Command:</value> 926 989 </textarea> 927 990 928 991 <!-- Widgets --> 929 992 930 993 <textedit name="title_edit" from="basetextedit"> 931 <position> 310,125</position>994 <position>410,70</position> 932 995 </textedit> 933 996 934 < buttonlist name="category_select" from="baseselector">935 <position> 310,190</position>936 </ buttonlist>997 <textedit name="subtitle_edit" from="basetextedit"> 998 <position>410,126</position> 999 </textedit> 937 1000 1001 <spinbox name="season" from="basespinbox"> 1002 <position>460,181</position> 1003 </spinbox> 1004 1005 <spinbox name="episode" from="basespinbox"> 1006 <position>680,181</position> 1007 </spinbox> 1008 938 1009 <buttonlist name="level_select" from="baseselector"> 939 <position>3 10,240</position>1010 <position>330,225</position> 940 1011 </buttonlist> 941 1012 1013 <buttonlist name="category_select" from="baseselector"> 1014 <position>680,225</position> 1015 </buttonlist> 1016 942 1017 <buttonlist name="child_select" from="baseselector"> 943 <position>3 10,285</position>1018 <position>330,270</position> 944 1019 </buttonlist> 945 1020 946 1021 <checkbox name="browse_check" from="basecheckbox"> 947 <position> 310,335</position>1022 <position>835,275</position> 948 1023 </checkbox> 949 1024 950 1025 <button name="coverart_button"> 951 <area> 310,370,32,32</area>1026 <area>460,323,32,32</area> 952 1027 <statetype name="buttonstate"> 953 1028 <state name="active"> 954 1029 <imagetype name="background"> … … 970 1045 </button> 971 1046 972 1047 <textarea name="coverart_text" from="basetextarea"> 973 <area> 350,375,250,40</area>1048 <area>500,328,250,40</area> 974 1049 <value>/path/to/the/thing.jpg</value> 975 1050 </textarea> 976 1051 1052 <button name="screenshot_button"> 1053 <area>460,352,32,32</area> 1054 <statetype name="buttonstate"> 1055 <state name="active"> 1056 <imagetype name="background"> 1057 <filename>blankbutton_off.png</filename> 1058 </imagetype> 1059 </state> 1060 <state name="selected" from="active"> 1061 <imagetype name="background"> 1062 <filename>blankbutton_on.png</filename> 1063 </imagetype> 1064 </state> 1065 <state name="disabled" from="active" /> 1066 <state name="pushed" from="active"> 1067 <imagetype name="background"> 1068 <filename>blankbutton_pushed.png</filename> 1069 </imagetype> 1070 </state> 1071 </statetype> 1072 </button> 1073 1074 <textarea name="screenshot_text" from="basetextarea"> 1075 <area>500,357,250,40</area> 1076 <value>/path/to/the/thing.jpg</value> 1077 </textarea> 1078 1079 <button name="banner_button"> 1080 <area>460,381,32,32</area> 1081 <statetype name="buttonstate"> 1082 <state name="active"> 1083 <imagetype name="background"> 1084 <filename>blankbutton_off.png</filename> 1085 </imagetype> 1086 </state> 1087 <state name="selected" from="active"> 1088 <imagetype name="background"> 1089 <filename>blankbutton_on.png</filename> 1090 </imagetype> 1091 </state> 1092 <state name="disabled" from="active" /> 1093 <state name="pushed" from="active"> 1094 <imagetype name="background"> 1095 <filename>blankbutton_pushed.png</filename> 1096 </imagetype> 1097 </state> 1098 </statetype> 1099 </button> 1100 1101 <textarea name="banner_text" from="basetextarea"> 1102 <area>500,386,250,40</area> 1103 <value>/path/to/the/thing.jpg</value> 1104 </textarea> 1105 1106 <button name="fanart_button"> 1107 <area>460,412,32,32</area> 1108 <statetype name="buttonstate"> 1109 <state name="active"> 1110 <imagetype name="background"> 1111 <filename>blankbutton_off.png</filename> 1112 </imagetype> 1113 </state> 1114 <state name="selected" from="active"> 1115 <imagetype name="background"> 1116 <filename>blankbutton_on.png</filename> 1117 </imagetype> 1118 </state> 1119 <state name="disabled" from="active" /> 1120 <state name="pushed" from="active"> 1121 <imagetype name="background"> 1122 <filename>blankbutton_pushed.png</filename> 1123 </imagetype> 1124 </state> 1125 </statetype> 1126 </button> 1127 1128 <textarea name="fanart_text" from="basetextarea"> 1129 <area>500,415,250,40</area> 1130 <value>/path/to/the/thing.jpg</value> 1131 </textarea> 1132 977 1133 <button name="trailer_button"> 978 <area> 310,400,32,32</area>1134 <area>460,442,32,32</area> 979 1135 <statetype name="buttonstate"> 980 1136 <state name="active"> 981 1137 <imagetype name="background"> … … 997 1153 </button> 998 1154 999 1155 <textarea name="trailer_text" from="basetextarea"> 1000 <area> 350,405,250,40</area>1156 <area>500,447,250,40</area> 1001 1157 <value>/path/to/the/thing.jpg</value> 1002 1158 </textarea> 1003 1159 1160 1004 1161 <textedit name="player_edit" from="basetextedit"> 1005 <position> 310,435</position>1162 <position>410,477</position> 1006 1163 </textedit> 1007 1164 1008 1165 <button name="done_button" from="basebutton"> 1009 <position>310,505</position> 1166 <position>510,537</position> 1167 <value>Done</value> 1010 1168 </button> 1011 1169 1012 1170 </window> -
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 861 VConfigPage page7(pages, false); 777 862 page7->addChild(trlr); 778 863 864 // page 8 865 VerticalConfigurationGroup *tvman = 866 new VerticalConfigurationGroup(true, false); 867 tvman->setLabel(QObject::tr("Television in MythVideo")); 868 tvman->addChild(SearchTVListingsCommand()); 869 tvman->addChild(GetTVPostersCommand()); 870 tvman->addChild(GetTVFanartCommand()); 871 tvman->addChild(GetTVBannerCommand()); 872 tvman->addChild(GetTVDataCommand()); 873 tvman->addChild(GetTVTitleSubCommand()); 874 875 VConfigPage page8(pages, false); 876 page8->addChild(tvman); 877 779 878 int page_num = 1; 780 879 for (ConfigPage::PageList::const_iterator p = pages.begin(); 781 880 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 141 return QString("%1 minutes").arg(length); 140 142 } 141 143 144 QString GetDisplaySeasonEpisode(int seasEp, int digits) 145 { 146 QString seasEpNum = QString::number(seasEp); 147 148 if (digits == 2 && seasEpNum.size() < 2) 149 seasEpNum.prepend("0"); 150 151 return seasEpNum; 152 } 153 142 154 QString GetDisplayBrowse(bool browse) 143 155 { 144 156 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; … … 2273 2608 2274 2609 m_menuPopup->SetReturnEvent(this, "manage"); 2275 2610 2611 2276 2612 m_menuPopup->AddButton(tr("Edit Metadata"), SLOT(EditMetadata())); 2277 2613 m_menuPopup->AddButton(tr("Download Metadata"), SLOT(VideoSearch())); 2614 m_menuPopup->AddButton(tr("Download Images Only"), 2615 SLOT(ImageOnlyDownload())); 2616 m_menuPopup->AddButton(tr("Search TV by Title/Subtitle"), 2617 SLOT(TitleSubtitleSearch())); 2278 2618 m_menuPopup->AddButton(tr("Manually Enter Video #"), 2279 2619 SLOT(ManualVideoUID())); 2280 2620 m_menuPopup->AddButton(tr("Manually Enter Video Title"), … … 2581 2921 metadata); 2582 2922 } 2583 2923 2924 void VideoDialog::TitleSubtitleSearch() 2925 { 2926 Metadata *metadata = GetMetadata(GetItemCurrent()); 2927 2928 if (metadata) 2929 StartVideoSearchByTitleSubtitle(metadata->GetTitle(), 2930 metadata->GetSubtitle(), metadata); 2931 } 2932 2933 void VideoDialog::ImageOnlyDownload() 2934 { 2935 Metadata *metadata = GetMetadata(GetItemCurrent()); 2936 QString title = metadata->GetTitle(); 2937 2938 if (metadata->GetInetRef() != VIDEO_INETREF_DEFAULT) 2939 StartVideoPosterSet(metadata); 2940 else 2941 { 2942 createBusyDialog(title); 2943 2944 VideoTitleSearch *vts = new VideoTitleSearch(this); 2945 connect(vts, SIGNAL(SigSearchResults(bool, const SearchListResults &, 2946 Metadata *)), 2947 SLOT(OnVideoImageOnlyDone(bool, const SearchListResults &, 2948 Metadata *))); 2949 vts->Run(title, metadata); 2950 } 2951 } 2952 2584 2953 void VideoDialog::ToggleBrowseable() 2585 2954 { 2586 2955 Metadata *metadata = GetMetadata(GetItemCurrent()); … … 2624 2993 } 2625 2994 } 2626 2995 2996 void VideoDialog::OnVideoImgSearchListSelection(QString video_uid) 2997 { 2998 Metadata *metadata = GetMetadata(GetItemCurrent()); 2999 if (metadata && !video_uid.isEmpty()) 3000 { 3001 metadata->SetInetRef(video_uid); 3002 metadata->UpdateDatabase(); 3003 UpdateItem(GetItemCurrent()); 3004 StartVideoPosterSet(metadata); 3005 } 3006 } 3007 2627 3008 void VideoDialog::OnParentalChange(int amount) 2628 3009 { 2629 3010 Metadata *metadata = GetMetadata(GetItemCurrent()); … … 2757 3138 metadata->Reset(); 2758 3139 2759 3140 QString cover_file; 2760 if (GetLocalVideoPoster(metadata->GetInetRef(), metadata->GetFilename(), 2761 QStringList(m_d->m_artDir), cover_file)) 3141 if (GetLocalVideoImage(metadata->GetInetRef(), metadata->GetFilename(), 3142 QStringList(m_d->m_artDir), cover_file, 3143 metadata->GetTitle(), metadata->GetSeason())) 2762 3144 { 2763 3145 metadata->SetCoverFile(cover_file); 2764 3146 } 2765 3147 3148 QString fanart_file; 3149 if (GetLocalVideoImage(metadata->GetInetRef(), metadata->GetFilename(), 3150 QStringList(m_d->m_fanDir), fanart_file, 3151 metadata->GetTitle(), metadata->GetSeason())) 3152 { 3153 metadata->SetFanart(fanart_file); 3154 } 3155 3156 QString banner_file; 3157 if (GetLocalVideoImage(metadata->GetInetRef(), metadata->GetFilename(), 3158 QStringList(m_d->m_banDir), banner_file, 3159 metadata->GetTitle(), metadata->GetSeason())) 3160 { 3161 metadata->SetBanner(banner_file); 3162 } 3163 2766 3164 metadata->UpdateDatabase(); 2767 3165 2768 3166 UpdateItem(item); … … 2777 3175 //createBusyDialog(QObject::tr("Fetching poster for %1 (%2)") 2778 3176 // .arg(metadata->InetRef()) 2779 3177 // .arg(metadata->Title())); 2780 QStringList search_dirs;2781 search_dirs += m_d->m_artDir;3178 QStringList cover_dirs; 3179 cover_dirs += m_d->m_artDir; 2782 3180 2783 3181 QString cover_file; 2784 3182 2785 if (GetLocalVideoPoster(metadata->GetInetRef(), metadata->GetFilename(), 2786 search_dirs, cover_file)) 3183 if (GetLocalVideoImage(metadata->GetInetRef(), metadata->GetFilename(), 3184 cover_dirs, cover_file, metadata->GetTitle(), 3185 metadata->GetSeason())) 2787 3186 { 2788 3187 metadata->SetCoverFile(cover_file); 2789 3188 OnVideoPosterSetDone(metadata); … … 2798 3197 vps->Run(metadata->GetInetRef(), metadata); 2799 3198 } 2800 3199 3200 QStringList fanart_dirs; 3201 fanart_dirs += m_d->m_fanDir; 3202 3203 QString fanart_file; 3204 3205 if (GetLocalVideoImage(metadata->GetInetRef(), metadata->GetFilename(), 3206 fanart_dirs, fanart_file, metadata->GetTitle(), 3207 metadata->GetSeason())) 3208 { 3209 metadata->SetFanart(fanart_file); 3210 OnVideoFanartSetDone(metadata); 3211 } 3212 2801 3213 if (metadata->GetFanart().isEmpty()) 2802 3214 { 2803 3215 // Obtain video fanart … … 2806 3218 SLOT(OnFanartURL(QString, Metadata *))); 2807 3219 vfs->Run(metadata->GetInetRef(), metadata); 2808 3220 } 3221 3222 QStringList banner_dirs; 3223 banner_dirs += m_d->m_banDir; 3224 3225 QString banner_file; 3226 3227 if (GetLocalVideoImage(metadata->GetInetRef(), metadata->GetFilename(), 3228 banner_dirs, banner_file, metadata->GetTitle(), 3229 metadata->GetSeason())) 3230 { 3231 metadata->SetBanner(banner_file); 3232 OnVideoBannerSetDone(metadata); 3233 } 3234 3235 if (metadata->GetBanner().isEmpty() && 3236 (metadata->GetSeason() > 0 || metadata->GetEpisode() > 0)) 3237 { 3238 // Obtain video banner (only for TV) 3239 VideoBannerSearch *vbs = new VideoBannerSearch(this); 3240 connect(vbs, SIGNAL(SigBannerURL(QString, Metadata *)), 3241 SLOT(OnBannerURL(QString, Metadata *))); 3242 vbs->Run(metadata->GetInetRef(), metadata); 3243 } 2809 3244 } 2810 3245 2811 3246 void VideoDialog::OnPosterURL(QString uri, Metadata *metadata) … … 2838 3273 QUrl url(uri); 2839 3274 2840 3275 QString ext = QFileInfo(url.path()).suffix(); 2841 QString dest_file = QString("%1/%2.%3").arg(fileprefix) 2842 .arg(metadata->GetInetRef()).arg(ext); 3276 QString dest_file; 3277 3278 if (metadata->GetSeason() > 0 || 3279 metadata->GetEpisode() > 0) 3280 { 3281 // Name TV downloads so that they already work with the PBB 3282 QString title = QString("%1 Season %2").arg(metadata->GetTitle()) 3283 .arg(metadata->GetSeason()); 3284 dest_file = QString("%1/%2.%3").arg(fileprefix) 3285 .arg(title).arg(ext); 3286 } 3287 else 3288 dest_file = QString("%1/%2.%3").arg(fileprefix) 3289 .arg(metadata->GetInetRef()).arg(ext); 3290 2843 3291 VERBOSE(VB_IMPORTANT, QString("Copying '%1' -> '%2'...") 2844 3292 .arg(url.toString()).arg(dest_file)); 2845 3293 … … 2932 3380 QUrl url(uri); 2933 3381 2934 3382 QString ext = QFileInfo(url.path()).suffix(); 2935 QString dest_file = QString("%1/%2.%3").arg(fileprefix) 2936 .arg(metadata->GetInetRef()).arg(ext); 3383 QString dest_file; 3384 3385 if (metadata->GetSeason() > 0 || 3386 metadata->GetEpisode() > 0) 3387 { 3388 // Name TV downloads so that they already work with the PBB 3389 QString title = QString("%1 Season %2").arg(metadata->GetTitle()) 3390 .arg(metadata->GetSeason()); 3391 dest_file = QString("%1/%2.%3").arg(fileprefix) 3392 .arg(title).arg(ext); 3393 } 3394 else 3395 dest_file = QString("%1/%2.%3").arg(fileprefix) 3396 .arg(metadata->GetInetRef()).arg(ext); 3397 2937 3398 VERBOSE(VB_IMPORTANT, QString("Copying '%1' -> '%2'...") 2938 3399 .arg(url.toString()).arg(dest_file)); 2939 3400 … … 2996 3457 UpdateItem(GetItemCurrent()); 2997 3458 } 2998 3459 3460 void VideoDialog::OnBannerURL(QString uri, Metadata *metadata) 3461 { 3462 if (metadata) 3463 { 3464 if (uri.length()) 3465 { 3466 QString fileprefix = m_d->m_banDir; 3467 3468 QDir dir; 3469 3470 // If the fanart setting hasn't been set default to 3471 // using ~/.mythtv/MythVideo/Banners 3472 if (fileprefix.length() == 0) 3473 { 3474 fileprefix = GetConfDir(); 3475 3476 dir.setPath(fileprefix); 3477 if (!dir.exists()) 3478 dir.mkdir(fileprefix); 3479 3480 fileprefix += "/MythVideo/Banners"; 3481 } 3482 3483 dir.setPath(fileprefix); 3484 if (!dir.exists()) 3485 dir.mkdir(fileprefix); 3486 3487 QUrl url(uri); 3488 3489 QString ext = QFileInfo(url.path()).suffix(); 3490 QString dest_file; 3491 3492 if (metadata->GetSeason() > 0 || 3493 metadata->GetEpisode() > 0) 3494 { 3495 // Name TV downloads so that they already work with the PBB 3496 QString title = QString("%1 Season %2").arg(metadata->GetTitle()) 3497 .arg(metadata->GetSeason()); 3498 dest_file = QString("%1/%2.%3").arg(fileprefix) 3499 .arg(title).arg(ext); 3500 } 3501 else 3502 dest_file = QString("%1/%2.%3").arg(fileprefix) 3503 .arg(metadata->GetInetRef()).arg(ext); 3504 3505 VERBOSE(VB_IMPORTANT, QString("Copying '%1' -> '%2'...") 3506 .arg(url.toString()).arg(dest_file)); 3507 3508 BannerDownloadProxy *d = 3509 BannerDownloadProxy::Create(url, dest_file, metadata); 3510 metadata->SetBanner(dest_file); 3511 3512 connect(d, SIGNAL(SigFinished(BannerDownloadErrorState, 3513 QString, Metadata *)), 3514 SLOT(OnBannerCopyFinished(BannerDownloadErrorState, 3515 QString, Metadata *))); 3516 3517 d->StartCopy(); 3518 m_d->AddBannerDownload(d); 3519 } 3520 else 3521 { 3522 metadata->SetBanner(""); 3523 OnVideoBannerSetDone(metadata); 3524 } 3525 } 3526 else 3527 OnVideoBannerSetDone(metadata); 3528 } 3529 3530 void VideoDialog::OnBannerCopyFinished(BannerDownloadErrorState error, 3531 QString errorMsg, Metadata *item) 3532 { 3533 QObject *src = sender(); 3534 if (src) 3535 m_d->RemoveBannerDownload(dynamic_cast<BannerDownloadProxy *> 3536 (src)); 3537 3538 if (error != besOK && item) 3539 item->SetBanner(""); 3540 3541 VERBOSE(VB_IMPORTANT, tr("Banner download finished: %1 %2") 3542 .arg(errorMsg).arg(error)); 3543 3544 if (error == besTimeout) 3545 { 3546 createOkDialog(tr("Banner exists for this item but could not be " 3547 "retrieved within the timeout period.\n")); 3548 } 3549 3550 OnVideoBannerSetDone(item); 3551 } 3552 3553 // This is the final call as part of a StartVideoBannerSet 3554 void VideoDialog::OnVideoBannerSetDone(Metadata *metadata) 3555 { 3556 // The metadata has a banner set 3557 if (m_busyPopup) 3558 { 3559 m_busyPopup->Close(); 3560 m_busyPopup = NULL; 3561 } 3562 3563 metadata->UpdateDatabase(); 3564 UpdateItem(GetItemCurrent()); 3565 } 3566 2999 3567 void VideoDialog::StartVideoSearchByUID(QString video_uid, Metadata *metadata) 3000 3568 { 3001 3569 // Starting the busy dialog here triggers a bizarre segfault … … 3026 3594 { 3027 3595 data[(*p).section(':', 0, 0)] = (*p).section(':', 1); 3028 3596 } 3029 // set known values 3597 // Set known values, but always set Title. 3598 // Allows for partial fill. Reset Metadata for full fill. 3599 3030 3600 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());3037 3601 3602 if (metadata->GetSubtitle() == "") 3603 metadata->SetSubtitle(data["Subtitle"]); 3604 if (metadata->GetYear() == 1895) 3605 metadata->SetYear(data["Year"].toInt()); 3606 if (metadata->GetDirector() == VIDEO_DIRECTOR_UNKNOWN) 3607 metadata->SetDirector(data["Director"]); 3608 if (metadata->GetPlot() == VIDEO_PLOT_DEFAULT) 3609 metadata->SetPlot(data["Plot"]); 3610 if (metadata->GetUserRating() == 0) 3611 metadata->SetUserRating(data["UserRating"].toFloat()); 3612 if (metadata->GetRating() == VIDEO_RATING_DEFAULT) 3613 metadata->SetRating(data["MovieRating"]); 3614 if (metadata->GetLength() == 0) 3615 metadata->SetLength(data["Runtime"].toInt()); 3616 if (metadata->GetSeason() == 0) 3617 metadata->SetSeason(data["Season"].toInt()); 3618 if (metadata->GetEpisode() == 0) 3619 metadata->SetEpisode(data["Episode"].toInt()); 3620 3038 3621 m_d->AutomaticParentalAdjustment(metadata); 3039 3622 3040 3623 // Cast … … 3166 3749 } 3167 3750 } 3168 3751 3752 void VideoDialog::OnVideoImageOnlyDone(bool normal_exit, 3753 const SearchListResults &results, Metadata *metadata) 3754 { 3755 if (m_busyPopup) 3756 { 3757 m_busyPopup->Close(); 3758 m_busyPopup = NULL; 3759 } 3760 3761 (void) normal_exit; 3762 VERBOSE(VB_IMPORTANT, 3763 QString("GetVideoList returned %1 possible matches") 3764 .arg(results.size())); 3765 3766 if (results.size() == 1) 3767 { 3768 // Only one search result, fetch data. 3769 if (results.begin().value().isEmpty()) 3770 return; 3771 else 3772 { 3773 metadata->SetInetRef(results.begin().key()); 3774 metadata->UpdateDatabase(); 3775 UpdateItem(GetItemCurrent()); 3776 StartVideoPosterSet(metadata); 3777 } 3778 } 3779 else if (results.size() < 1) 3780 { 3781 createOkDialog(tr("No matches were found.")); 3782 } 3783 else 3784 { 3785 SearchResultsDialog *resultsdialog = 3786 new SearchResultsDialog(m_popupStack, results); 3787 3788 if (resultsdialog->Create()) 3789 m_popupStack->AddScreen(resultsdialog); 3790 3791 connect(resultsdialog, SIGNAL(haveResult(QString)), 3792 SLOT(OnVideoImgSearchListSelection(QString)), 3793 Qt::QueuedConnection); 3794 } 3795 } 3796 3797 void VideoDialog::StartVideoSearchByTitleSubtitle(QString title, 3798 QString subtitle, Metadata *metadata) 3799 { 3800 createBusyDialog(title); 3801 3802 VideoTitleSubtitleSearch *vtss = new VideoTitleSubtitleSearch(this); 3803 3804 connect(vtss, SIGNAL(SigSearchResults(bool, QStringList, 3805 Metadata *)), 3806 SLOT(OnVideoSearchByTitleSubtitleDone(bool, QStringList, 3807 Metadata *))); 3808 vtss->Run(title, subtitle, metadata); 3809 } 3810 3811 void VideoDialog::OnVideoSearchByTitleSubtitleDone(bool normal_exit, 3812 QStringList result, Metadata *metadata) 3813 { 3814 if (m_busyPopup) 3815 { 3816 m_busyPopup->Close(); 3817 m_busyPopup = NULL; 3818 } 3819 3820 (void) normal_exit; 3821 3822 QString SeasEp = result.takeAt(0); 3823 3824 if (!SeasEp.isEmpty()) 3825 { 3826 3827 // Stuff to parse Season and Episode here 3828 QString season, episode = NULL; 3829 3830 QRegExp group("(?:[s])?(\\d{1,3})(?:\\s|-)?(?:[ex])" //Season 3831 "(?:\\s|-)?(\\d{1,3})", // Episode 3832 Qt::CaseInsensitive); 3833 3834 int pos = group.indexIn(SeasEp); 3835 if (pos > -1) 3836 { 3837 QString groupResult = group.cap(0); 3838 season = group.cap(1); 3839 episode = group.cap(2); 3840 } 3841 3842 VERBOSE(VB_IMPORTANT, 3843 QString("Season and Episode found! It was: %1") 3844 .arg(SeasEp)); 3845 3846 if (!season.isNull() && !episode.isNull()) 3847 { 3848 metadata->SetSeason(season.toInt()); 3849 metadata->SetEpisode(episode.toInt()); 3850 StartVideoSearchByTitle(VIDEO_INETREF_DEFAULT, 3851 metadata->GetTitle(), metadata); 3852 } 3853 } 3854 else 3855 createOkDialog(tr("No matches were found.")); 3856 } 3857 3169 3858 void VideoDialog::doVideoScan() 3170 3859 { 3171 3860 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
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);