Ticket #6346: MythVideo.SubSeasEp.31609-2.diff

File MythVideo.SubSeasEp.31609-2.diff, 42.4 KB (added by robert.mcnamara@…, 12 years ago)

Automate Season/Episode?

  • mythplugins/mythvideo/theme/default/video-ui.xml

     
    867867        <!-- Labels  -->
    868868
    869869        <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>
    872872            <align>right,top</align>
    873873        </textarea>
    874874
     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
    875893        <textarea name="category_text" from="title_text">
    876             <position>50,152</position>
     894            <area>370,232,150,40</area>
     895            <align>right</align>
    877896            <value>Category:</value>
    878897        </textarea>
    879898
    880899        <textarea name="level_text" from="title_text">
    881             <position>50,202</position>
     900            <area>20,232,200,40</area>
     901            <align>right</align>
    882902            <value>Parental Control:</value>
    883903        </textarea>
    884904
    885905        <textarea name="child_text" from="title_text">
    886             <position>50,247</position>
     906            <area>20,277,200,40</area>
     907            <align>right</align>
    887908            <value>File to Always Play Next:</value>
    888909        </textarea>
    889910
    890911        <textarea name="browse_text" from="title_text">
    891             <position>50,292</position>
     912            <area>500,277,200,40</area>
     913            <align>left</align>
    892914            <value>Include while Browsing:</value>
    893915        </textarea>
    894916
     
    925947        <!-- Widgets -->
    926948
    927949        <textedit name="title_edit" from="basetextedit">
    928             <position>310,80</position>
     950            <position>310,70</position>
    929951        </textedit>
    930952
    931         <buttonlist name="category_select" from="baseselector">
    932             <position>310,145</position>
    933         </buttonlist>
     953        <textedit name="subtitle_edit" from="basetextedit">
     954            <position>310,126</position>
     955        </textedit>
    934956
     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
    935965        <buttonlist name="level_select" from="baseselector">
    936             <position>310,195</position>
     966            <position>230,225</position>
    937967        </buttonlist>
    938968
     969        <buttonlist name="category_select" from="baseselector">
     970            <position>530,225</position>
     971        </buttonlist>
     972
    939973        <buttonlist name="child_select" from="baseselector">
    940             <position>310,240</position>
     974            <position>230,270</position>
    941975        </buttonlist>
    942976
    943977        <checkbox name="browse_check" from="basecheckbox">
    944             <position>310,290</position>
     978            <position>680,275</position>
    945979        </checkbox>
    946980
    947981        <button name="coverart_button" from="basesearchbutton">
  • mythplugins/mythvideo/theme/default-wide/video-ui.xml

     
    843843    <window name="edit_metadata">
    844844
    845845        <textarea name="title" from="basetextarea">
    846             <area>10,50,1260,50</area>
     846            <area>10,30,760,50</area>
    847847            <value>Edit Video Information</value>
    848848            <align>hcenter,vcenter</align>
    849849            <font>baselarge</font>
     
    852852        <!-- Labels  -->
    853853
    854854        <textarea name="title_text" from="basetextarea">
    855             <area>250,110,250,40</area>
    856             <value>Name:</value>
     855            <area>50,80,250,40</area>
     856            <value>Title:</value>
    857857            <align>right,top</align>
    858858        </textarea>
    859859
     860        <textarea name="subtitle_text" from="basetextarea">
     861            <area>50,138,250,40</area>
     862            <value>Subtitle:</value>
     863            <align>right,top</align>
     864        </textarea>
     865
     866        <textarea name="season_text" from="basetextarea">
     867            <area>50,185,250,40</area>
     868            <value>Season:</value>
     869            <align>right,top</align>
     870        </textarea>
     871
     872        <textarea name="episode_text" from="basetextarea">
     873            <area>370,185,150,40</area>
     874            <value>Episode:</value>
     875            <align>right,top</align>
     876        </textarea>
     877
    860878        <textarea name="category_text" from="title_text">
    861             <position>250,172</position>
     879            <area>420,232,150,40</area>
     880            <align>right</align>
    862881            <value>Category:</value>
    863882        </textarea>
    864883
    865884        <textarea name="level_text" from="title_text">
    866             <position>250,222</position>
     885            <area>20,232,200,40</area>
     886            <align>right</align>
    867887            <value>Parental Control:</value>
    868888        </textarea>
    869889
    870890        <textarea name="child_text" from="title_text">
    871             <position>250,267</position>
     891            <area>20,277,200,40</area>
     892            <align>right</align>
    872893            <value>File to Always Play Next:</value>
    873894        </textarea>
    874895
    875896        <textarea name="browse_text" from="title_text">
    876             <position>250,312</position>
     897            <area>470,277,280,40</area>
     898            <align>left</align>
    877899            <value>Include while Browsing:</value>
    878900        </textarea>
    879901
    880902        <textarea name="coverart_text_label" from="title_text">
    881             <position>250,348</position>
     903            <position>50,328</position>
    882904            <value>Cover Art:</value>
    883905        </textarea>
    884906
    885907        <textarea name="screenshot_text_label" from="title_text">
    886             <position>250,377</position>
     908            <position>50,357</position>
    887909            <value>Screenshot:</value>
    888910        </textarea>
    889911
    890912        <textarea name="banner_text_label" from="title_text">
    891             <position>250,406</position>
     913            <position>50,386</position>
    892914            <value>Banner:</value>
    893915        </textarea>
    894916
    895917        <textarea name="fanart_text_label" from="title_text">
    896             <position>250,435</position>
     918            <position>50,415</position>
    897919            <value>Fanart:</value>
    898920        </textarea>
    899921
    900922        <textarea name="trailer_text_label" from="title_text">
    901             <position>250,464</position>
     923            <position>50,447</position>
    902924            <value>Trailer:</value>
    903925        </textarea>
    904926
    905927        <textarea name="player_text" from="title_text">
    906             <position>250,510</position>
     928            <position>50,487</position>
    907929            <value>Unique Player Command:</value>
    908930        </textarea>
    909931
    910932        <!-- Widgets -->
    911933
    912934        <textedit name="title_edit" from="basetextedit">
    913             <position>510,100</position>
     935            <position>310,70</position>
    914936        </textedit>
    915937
    916         <buttonlist name="category_select" from="baseselector">
    917             <position>510,165</position>
    918         </buttonlist>
     938        <textedit name="subtitle_edit" from="basetextedit">
     939            <position>310,126</position>
     940        </textedit>
    919941
     942        <spinbox name="season" from="basespinbox">
     943            <position>310,181</position>
     944        </spinbox>
     945
     946        <spinbox name="episode" from="basespinbox">
     947            <position>530,181</position>
     948        </spinbox>
     949
    920950        <buttonlist name="level_select" from="baseselector">
    921             <position>510,215</position>
     951            <position>230,225</position>
    922952        </buttonlist>
    923953
     954        <buttonlist name="category_select" from="baseselector">
     955            <position>580,225</position>
     956        </buttonlist>
     957
    924958        <buttonlist name="child_select" from="baseselector">
    925             <position>510,260</position>
     959            <position>230,270</position>
    926960        </buttonlist>
    927961
    928962        <checkbox name="browse_check" from="basecheckbox">
    929             <position>510,310</position>
     963            <position>735,275</position>
    930964        </checkbox>
    931965
    932         <button name="coverart_button" from="basesearchbutton">
    933             <position>510,343</position>
     966        <button name="coverart_button">
     967            <area>310,323,32,32</area>
     968            <statetype name="buttonstate">
     969                <state name="active">
     970                    <imagetype name="background">
     971                        <filename>blankbutton_off.png</filename>
     972                    </imagetype>
     973                </state>
     974                <state name="selected" from="active">
     975                    <imagetype name="background">
     976                        <filename>blankbutton_on.png</filename>
     977                    </imagetype>
     978                </state>
     979                <state name="disabled" from="active" />
     980                <state name="pushed" from="active">
     981                    <imagetype name="background">
     982                        <filename>blankbutton_pushed.png</filename>
     983                    </imagetype>
     984                </state>
     985            </statetype>
    934986        </button>
    935987
    936988        <textarea name="coverart_text" from="basetextarea">
    937             <area>550,348,250,40</area>
     989            <area>350,328,250,40</area>
    938990            <value>/path/to/the/thing.jpg</value>
    939991        </textarea>
    940992
    941         <button name="screenshot_button" from="basesearchbutton">
    942             <position>510,372</position>
     993        <button name="screenshot_button">
     994            <area>310,352,32,32</area>
     995            <statetype name="buttonstate">
     996                <state name="active">
     997                    <imagetype name="background">
     998                        <filename>blankbutton_off.png</filename>
     999                    </imagetype>
     1000                </state>
     1001                <state name="selected" from="active">
     1002                    <imagetype name="background">
     1003                        <filename>blankbutton_on.png</filename>
     1004                    </imagetype>
     1005                </state>
     1006                <state name="disabled" from="active" />
     1007                <state name="pushed" from="active">
     1008                    <imagetype name="background">
     1009                        <filename>blankbutton_pushed.png</filename>
     1010                    </imagetype>
     1011                </state>
     1012            </statetype>
    9431013        </button>
    9441014
    9451015        <textarea name="screenshot_text" from="basetextarea">
    946             <area>550,377,250,40</area>
     1016            <area>350,357,250,40</area>
    9471017            <value>/path/to/the/thing.jpg</value>
    9481018        </textarea>
    9491019
    950         <button name="banner_button" from="basesearchbutton">
    951             <position>510,401</position>
     1020        <button name="banner_button">
     1021            <area>310,381,32,32</area>
     1022            <statetype name="buttonstate">
     1023                <state name="active">
     1024                    <imagetype name="background">
     1025                        <filename>blankbutton_off.png</filename>
     1026                    </imagetype>
     1027                </state>
     1028                <state name="selected" from="active">
     1029                    <imagetype name="background">
     1030                        <filename>blankbutton_on.png</filename>
     1031                    </imagetype>
     1032                </state>
     1033                <state name="disabled" from="active" />
     1034                <state name="pushed" from="active">
     1035                    <imagetype name="background">
     1036                        <filename>blankbutton_pushed.png</filename>
     1037                    </imagetype>
     1038                </state>
     1039            </statetype>
    9521040        </button>
    9531041
    9541042        <textarea name="banner_text" from="basetextarea">
    955             <area>550,406,250,40</area>
     1043            <area>350,386,250,40</area>
    9561044            <value>/path/to/the/thing.jpg</value>
    9571045        </textarea>
    9581046
    959         <button name="fanart_button" from="basesearchbutton">
    960             <position>510,430</position>
     1047        <button name="fanart_button">
     1048            <area>310,412,32,32</area>
     1049            <statetype name="buttonstate">
     1050                <state name="active">
     1051                    <imagetype name="background">
     1052                        <filename>blankbutton_off.png</filename>
     1053                    </imagetype>
     1054                </state>
     1055                <state name="selected" from="active">
     1056                    <imagetype name="background">
     1057                        <filename>blankbutton_on.png</filename>
     1058                    </imagetype>
     1059                </state>
     1060                <state name="disabled" from="active" />
     1061                <state name="pushed" from="active">
     1062                    <imagetype name="background">
     1063                        <filename>blankbutton_pushed.png</filename>
     1064                    </imagetype>
     1065                </state>
     1066            </statetype>
    9611067        </button>
    9621068
    9631069        <textarea name="fanart_text" from="basetextarea">
    964             <area>550,435,250,40</area>
     1070            <area>350,415,250,40</area>
    9651071            <value>/path/to/the/thing.jpg</value>
    9661072        </textarea>
    9671073
    968         <button name="trailer_button" from="basesearchbutton">
    969             <position>510,460</position>
     1074        <button name="trailer_button">
     1075            <area>310,442,32,32</area>
     1076            <statetype name="buttonstate">
     1077                <state name="active">
     1078                    <imagetype name="background">
     1079                        <filename>blankbutton_off.png</filename>
     1080                    </imagetype>
     1081                </state>
     1082                <state name="selected" from="active">
     1083                    <imagetype name="background">
     1084                        <filename>blankbutton_on.png</filename>
     1085                    </imagetype>
     1086                </state>
     1087                <state name="disabled" from="active" />
     1088                <state name="pushed" from="active">
     1089                    <imagetype name="background">
     1090                        <filename>blankbutton_pushed.png</filename>
     1091                    </imagetype>
     1092                </state>
     1093            </statetype>
    9701094        </button>
    9711095
    9721096        <textarea name="trailer_text" from="basetextarea">
    973             <area>550,465,250,40</area>
     1097            <area>350,447,250,40</area>
    9741098            <value>/path/to/the/thing.jpg</value>
    9751099        </textarea>
    9761100
     1101
    9771102        <textedit name="player_edit" from="basetextedit">
    978             <position>510,495</position>
     1103            <position>310,477</position>
    9791104        </textedit>
    9801105
    9811106        <button name="done_button" from="basebutton">
    982             <position>510,565</position>
     1107            <position>310,537</position>
    9831108            <value>Done</value>
    9841109        </button>
    9851110
  • mythplugins/mythvideo/mythvideo/metadatalistmanager.cpp

     
    112112    MSqlQuery query(MSqlQuery::InitCon());
    113113    query.setForwardOnly(true);
    114114    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");
    119120
    120121    query.prepare(BaseMetadataQuery);
    121122
  • mythplugins/mythvideo/mythvideo/metadata.cpp

     
    8989  public:
    9090    MetadataImp(const QString &filename, const QString &trailer, const QString &coverfile,
    9191             const QString &screenshot, const QString &banner, const QString &fanart,
    92              const QString &title, int year,
     92             const QString &title, const QString &subtitle, int year,
    9393             const QString &inetref, const QString &director,
    9494             const QString &plot, float userrating,
    9595             const QString &rating, int length,
     96             unsigned int season, unsigned int episode,
    9697             int id, ParentalLevel::Level showlevel, int categoryID,
    9798             int childID, bool browse,
    9899             const QString &playcommand, const QString &category,
     
    100101             const country_list &countries,
    101102             const cast_list &cast,
    102103             const QString &host = "") :
    103         m_title(title),
     104        m_title(title), m_subtitle(subtitle),
    104105        m_inetref(inetref), m_director(director), m_plot(plot),
    105106        m_rating(rating), m_playcommand(playcommand), m_category(category),
    106107        m_genres(genres), m_countries(countries), m_cast(cast),
    107108        m_filename(filename), m_trailer(trailer), m_coverfile(coverfile),
    108109        m_screenshot(screenshot), m_banner(banner), m_fanart(fanart),
    109110        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),
    111113        m_browse(browse), m_id(id), m_userrating(userrating)
    112114    {
    113115        VideoCategory::GetCategory().get(m_categoryID, m_category);
     
    128130        if (this != &rhs)
    129131        {
    130132            m_title = rhs.m_title;
     133            m_subtitle = rhs.m_subtitle;
    131134            m_inetref = rhs.m_inetref;
    132135            m_director = rhs.m_director;
    133136            m_plot = rhs.m_plot;
     
    148151            m_childID = rhs.m_childID;
    149152            m_year = rhs.m_year;
    150153            m_length = rhs.m_length;
     154            m_season = rhs.m_season;
     155            m_episode = rhs.m_episode;
    151156            m_showlevel = rhs.m_showlevel;
    152157            m_browse = rhs.m_browse;
    153158            m_id = rhs.m_id;
     
    180185        m_title = title;
    181186    }
    182187
     188    const QString &getSubtitle() const { return m_subtitle; }
     189    void SetSubtitle(const QString &subtitle) { m_subtitle = subtitle; }
     190
    183191    const QString &GetInetRef() const { return m_inetref; }
    184192    void SetInetRef(const QString &inetRef) { m_inetref = inetRef; }
    185193
     
    249257    int GetLength() const { return m_length; }
    250258    void SetLength(int length) { m_length = length; }
    251259
     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
    252266    ParentalLevel::Level GetShowLevel() const { return m_showlevel; }
    253267    void SetShowLevel(ParentalLevel::Level showLevel)
    254268    {
     
    289303
    290304  private:
    291305    QString m_title;
     306    QString m_subtitle;
    292307    QString m_inetref;
    293308    QString m_director;
    294309    QString m_plot;
     
    310325    int m_childID;
    311326    int m_year;
    312327    int m_length;
     328    int m_season;
     329    int m_episode;
    313330    ParentalLevel::Level m_showlevel;
    314331    bool m_browse;
    315332    unsigned int m_id;  // videometadata.intid
     
    384401    MetadataImp tmp(m_filename, VIDEO_TRAILER_DEFAULT, VIDEO_COVERFILE_DEFAULT,
    385402                    VIDEO_SCREENSHOT_DEFAULT, VIDEO_BANNER_DEFAULT,
    386403                    VIDEO_FANART_DEFAULT, Metadata::FilenameToTitle(m_filename),
    387                     VIDEO_YEAR_DEFAULT, VIDEO_INETREF_DEFAULT,
     404                    VIDEO_SUBTITLE_DEFAULT, VIDEO_YEAR_DEFAULT, VIDEO_INETREF_DEFAULT,
    388405                    VIDEO_DIRECTOR_DEFAULT, VIDEO_PLOT_DEFAULT, 0.0,
    389                     VIDEO_RATING_DEFAULT, 0, m_id,
     406                    VIDEO_RATING_DEFAULT, 0,
     407                    Metadata::FilenameToSeasonEpisode(m_filename, 1),
     408                    Metadata::FilenameToSeasonEpisode(m_filename, 2), m_id,
    390409                    ParentalLevel::plLowest, 0, -1, true, "", "",
    391410                    Metadata::genre_list(), Metadata::country_list(),
    392411                    Metadata::cast_list(), m_host);
     
    484503    m_screenshot = query.value(17).toString();
    485504    m_banner = query.value(18).toString();
    486505    m_fanart = query.value(19).toString();
    487     m_host = query.value(20).toString();
     506    m_subtitle = query.value(20).toString();
     507    m_season = query.value(21).toInt();
     508    m_episode = query.value(22).toInt();
     509    m_host = query.value(23).toString();
    488510
    489511    VideoCategory::GetCategory().get(m_categoryID, m_category);
    490512
     
    502524{
    503525    if (m_title.isEmpty())
    504526        m_title = Metadata::FilenameToTitle(m_filename);
     527    if (m_subtitle.isEmpty())
     528        m_subtitle = VIDEO_SUBTITLE_DEFAULT;
    505529    if (m_director.isEmpty())
    506530        m_director = VIDEO_DIRECTOR_UNKNOWN;
    507531    if (m_plot.isEmpty())
    508532        m_plot = VIDEO_PLOT_DEFAULT;
    509533    if (m_rating.isEmpty())
    510534        m_rating = VIDEO_RATING_DEFAULT;
     535    if (m_season == 0)
     536        m_season = Metadata::FilenameToSeasonEpisode(m_filename, 1);
     537    if (m_episode == 0)
     538        m_episode = Metadata::FilenameToSeasonEpisode(m_filename, 2);
    511539    if (m_coverfile.isEmpty())
    512540        m_coverfile = VIDEO_COVERFILE_DEFAULT;
    513541    if (m_screenshot.isEmpty())
     
    533561    {
    534562        m_browse = gContext->GetNumSetting("VideoNewBrowsable", 1);
    535563
    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)");
     564        query.prepare("INSERT INTO videometadata (title,subtitle,director,plot,"
     565                      "rating,year,userrating,length,season,episode,filename,"
     566                      "showlevel,coverfile,inetref,browse,trailer,screenshot,banner,"
     567                      "fanart,host) VALUES (:TITLE, :SUBTITLE, :DIRECTOR, :PLOT, "
     568                      ":RATING, :YEAR, :USERRATING, :LENGTH, :SEASON, :EPISODE, "
     569                      ":FILENAME, :SHOWLEVEL, :COVERFILE, :INETREF, :BROWSE, "
     570                      ":TRAILER, :SCREENSHOT, :BANNER, :FANART, :HOST)");
    543571    }
    544572    else
    545573    {
    546         query.prepare("UPDATE videometadata SET title = :TITLE, "
     574        query.prepare("UPDATE videometadata SET title = :TITLE, subtitle = :SUBTITLE, "
    547575                      "director = :DIRECTOR, plot = :PLOT, rating= :RATING, "
    548576                      "year = :YEAR, userrating = :USERRATING, "
    549                       "length = :LENGTH, filename = :FILENAME, trailer = :TRAILER, "
     577                      "length = :LENGTH, season = :SEASON, episode = :EPISODE, "
     578                      "filename = :FILENAME, trailer = :TRAILER, "
    550579                      "showlevel = :SHOWLEVEL, coverfile = :COVERFILE, "
    551580                      "screenshot = :SCREENSHOT, banner = :BANNER, fanart = :FANART, "
    552581                      "inetref = :INETREF, browse = :BROWSE, host = :HOST, "
     
    560589    }
    561590
    562591    query.bindValue(":TITLE", m_title);
     592    query.bindValue(":SUBTITLE", m_subtitle);
    563593    query.bindValue(":DIRECTOR", m_director);
    564594    query.bindValue(":PLOT", m_plot);
    565595    query.bindValue(":RATING", m_rating);
    566596    query.bindValue(":YEAR", m_year);
    567597    query.bindValue(":USERRATING", m_userrating);
    568598    query.bindValue(":LENGTH", m_length);
     599    query.bindValue(":SEASON", m_season);
     600    query.bindValue(":EPISODE", m_episode);
    569601    query.bindValue(":FILENAME", m_filename);
    570602    query.bindValue(":TRAILER", m_trailer);
    571603    query.bindValue(":SHOWLEVEL", m_showlevel);
     
    811843    return title.trimmed();
    812844}
    813845
     846unsigned int Metadata::FilenameToSeasonEpisode(const QString &file_name,
     847                                    int position)
     848{
     849    // position 1 returns season, 2 returns episode
     850
     851    QString title = file_name.right(file_name.length() -
     852                                    file_name.lastIndexOf('/') - 1);
     853    QRegExp group("(\\d{1,3})(?:\\s|-|_|\\.)?(?:[ex])" //Season
     854                  "(?:\\s|-|_|\\.)?(\\d{1,3})", // Episode
     855                  Qt::CaseInsensitive);
     856    int pos = group.indexIn(title);
     857    if (pos > -1)
     858    {
     859        QString groupResult = group.cap(0);
     860        QString season = group.cap(1);
     861        QString episode = group.cap(2);
     862        if (position == 1)
     863            return season.toInt();
     864        else if (position == 2)
     865            return episode.toInt();
     866    }
     867    return 0;
     868}
     869
    814870namespace
    815871{
    816872    const QRegExp &getTitleTrim(bool ignore_case)
     
    829885    return ret;
    830886}
    831887
    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,
     888Metadata::Metadata(const QString &filename, const QString &trailer, 
     889             const QString &coverfile, const QString &screenshot, 
     890             const QString &banner, const QString &fanart, 
     891             const QString &title, const QString &subtitle, int year,
    836892             const QString &inetref, const QString &director,
    837893             const QString &plot, float userrating,
    838894             const QString &rating, int length,
     895             int season, int episode,
    839896             int id, ParentalLevel::Level showlevel, int categoryID,
    840897             int childID, bool browse,
    841898             const QString &playcommand, const QString &category,
     
    845902             const QString &host)
    846903{
    847904    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);
     905                            fanart, title, subtitle, year, inetref, director, plot,
     906                            userrating, rating, length, season, episode, id,
     907                            showlevel, categoryID, childID, browse, playcommand,
     908                            category, genres, countries, cast, host);
    852909}
    853910
    854911Metadata::~Metadata()
     
    911968    m_imp->SetTitle(title);
    912969}
    913970
     971const QString &Metadata::GetSubtitle() const
     972{
     973    return m_imp->getSubtitle();
     974}
     975 
     976void Metadata::SetSubtitle(const QString &subtitle)
     977{
     978    m_imp->SetSubtitle(subtitle);
     979}
     980
    914981int Metadata::GetYear() const
    915982{
    916983    return m_imp->getYear();
     
    9811048    m_imp->SetLength(length);
    9821049}
    9831050
     1051int Metadata::GetSeason() const
     1052{
     1053    return m_imp->GetSeason();
     1054}
     1055
     1056void Metadata::SetSeason(int season)
     1057{
     1058    m_imp->SetSeason(season);
     1059}
     1060
     1061int Metadata::GetEpisode() const
     1062{
     1063    return m_imp->GetEpisode();
     1064}
     1065
     1066void Metadata::SetEpisode(int episode)
     1067{
     1068    m_imp->SetEpisode(episode);
     1069}
     1070
    9841071unsigned int Metadata::GetID() const
    9851072{
    9861073    return m_imp->GetID();
  • mythplugins/mythvideo/mythvideo/videofilter.h

     
    5454        kOrderByUserRatingDescending = 2,
    5555        kOrderByLength = 3,
    5656        kOrderByFilename = 4,
    57         kOrderByID = 5
     57        kOrderByID = 5,
     58        kOrderBySeasonEp = 6
    5859    };
    5960
    6061    int GetCategory() const { return category; }
  • mythplugins/mythvideo/mythvideo/dbcheck.cpp

     
    3838    const QString lastMythDVDDBVersion = "1002";
    3939    const QString lastMythVideoVersion = "1010";
    4040
    41     const QString currentDatabaseVersion = "1023";
     41    const QString currentDatabaseVersion = "1024";
    4242
    4343    const QString OldMythVideoVersionName = "VideoDBSchemaVer";
    4444    const QString OldMythDVDVersionName = "DVDDBSchemaVer";
     
    834834            performActualUpdate(updates, "1023", dbver, MythVideoVersionName);
    835835        }
    836836
     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        }
    837848
    838849    }
    839850}
  • mythplugins/mythvideo/mythvideo/videoutils.cpp

     
    139139    return QString("%1 minutes").arg(length);
    140140}
    141141
     142QString GetDisplaySeason(int season, int digits)
     143{
     144    QString seasNum = QString::number(season);
     145
     146    if (digits == 2 && seasNum.size() < 2)
     147        seasNum.prepend("0");
     148       
     149    return seasNum;
     150}
     151
     152QString GetDisplayEpisode(int episode, int digits)
     153{
     154    QString epNum = QString::number(episode);
     155
     156    if (digits == 2 && epNum.size() < 2)
     157        epNum.prepend("0");
     158
     159    return epNum;
     160}
     161
    142162QString GetDisplayBrowse(bool browse)
    143163{
    144164    return browse ? QObject::tr("Yes") : QObject::tr("No");
  • mythplugins/mythvideo/mythvideo/editmetadata.h

     
    1010class MythUIText;
    1111class MythUITextEdit;
    1212class MythUIButton;
     13class MythUISpinBox;
    1314class MythUICheckBox;
    1415
    1516class EditMetadataDialog : public MythScreenType
     
    3435  public slots:
    3536    void SaveAndExit();
    3637    void SetTitle();
     38    void SetSubtitle();
    3739    void SetCategory(MythUIButtonListItem*);
    3840    void SetPlayer();
     41    void SetSeason();
     42    void SetEpisode();
    3943    void SetLevel(MythUIButtonListItem*);
    4044    void SetChild(MythUIButtonListItem*);
    4145    void ToggleBrowse();
     
    6064    //
    6165
    6266    MythUITextEdit      *m_titleEdit;
     67    MythUITextEdit      *m_subtitleEdit;
    6368    MythUITextEdit      *m_playerEdit;
     69    MythUISpinBox       *m_seasonSpin;
     70    MythUISpinBox       *m_episodeSpin;
    6471    MythUIButtonList      *m_categoryList;
    6572    MythUIButtonList      *m_levelList;
    6673    MythUIButtonList      *m_childList;
  • mythplugins/mythvideo/mythvideo/videodlg.cpp

     
    10161016
    10171017            tmp["filename"] = metadata->GetFilename();
    10181018            tmp["title"] = metadata->GetTitle();
     1019            tmp["subtitle"] = metadata->GetSubtitle();
    10191020            tmp["director"] = metadata->GetDirector();
    10201021            tmp["plot"] = metadata->GetPlot();
    10211022            tmp["genres"] = GetDisplayGenres(*metadata);
     
    10251026            tmp["length"] = GetDisplayLength(metadata->GetLength());
    10261027            tmp["year"] = GetDisplayYear(metadata->GetYear());
    10271028            tmp["userrating"] = GetDisplayUserRating(metadata->GetUserRating());
     1029            tmp["season"] = GetDisplaySeason(metadata->GetSeason(), 1);
     1030            tmp["episode"] = GetDisplayEpisode(metadata->GetEpisode(), 1);
    10281031
     1032            if (metadata->GetSeason() >= 0 && metadata->GetEpisode() > 0)
     1033            {
     1034                tmp["s##e##"] = QString("s%1e%2").arg(GetDisplaySeason(metadata->GetSeason(), 2))
     1035                                    .arg(GetDisplayEpisode(metadata->GetEpisode(), 2));
     1036                tmp["##x##"] = QString("%1x%2").arg(GetDisplaySeason(metadata->GetSeason(), 1))           
     1037                                    .arg(GetDisplayEpisode(metadata->GetEpisode(), 2));
     1038            }
     1039            else
     1040                tmp["s##e##"] = tmp["##x##"] = "";
     1041
    10291042            tmp["userratingstate"] =
    10301043                    QString::number((int)(metadata->GetUserRating()));
    10311044            tmp["videolevel"] = ParentalLevelToState(metadata->GetShowLevel());
     
    10751088        h.handleText("player");
    10761089        h.handleText("filename");
    10771090        h.handleText("title");
     1091        h.handleText("subtitle");
    10781092        h.handleText("director");
    10791093        h.handleText("plot");
    10801094        h.handleText("genres");
     
    10821096        h.handleText("cast");
    10831097        h.handleText("rating");
    10841098        h.handleText("length");
     1099        h.handleText("season");
     1100        h.handleText("s##e##");
     1101        h.handleText("##x##");
     1102        h.handleText("episode");
    10851103        h.handleText("year");
    10861104        h.handleText("userrating");
    10871105
     
    30233041        }
    30243042        // set known values
    30253043        metadata->SetTitle(data["Title"]);
     3044        metadata->SetSubtitle(data["Subtitle"]);
    30263045        metadata->SetYear(data["Year"].toInt());
    30273046        metadata->SetDirector(data["Director"]);
    30283047        metadata->SetPlot(data["Plot"]);
    30293048        metadata->SetUserRating(data["UserRating"].toFloat());
    30303049        metadata->SetRating(data["MovieRating"]);
    30313050        metadata->SetLength(data["Runtime"].toInt());
     3051        metadata->SetSeason(data["Season"].toInt());
     3052        metadata->SetEpisode(data["Episode"].toInt());
    30323053
    30333054        m_d->AutomaticParentalAdjustment(metadata);
    30343055
  • mythplugins/mythvideo/mythvideo/videoscan.cpp

     
    268268                                 VIDEO_BANNER_DEFAULT,
    269269                                 VIDEO_FANART_DEFAULT,
    270270                                 Metadata::FilenameToTitle(p->first),
     271                                 VIDEO_SUBTITLE_DEFAULT,
    271272                                 VIDEO_YEAR_DEFAULT,
    272273                                 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::FilenameToSeasonEpisode(p->first, 1),
     276                                 Metadata::FilenameToSeasonEpisode(p->first, 2),
     277                                 0, ParentalLevel::plLowest);
    275278
    276279                VERBOSE(VB_GENERAL, QString("Adding : %1 : %2")
    277280                        .arg(newFile.GetHost()).arg(newFile.GetFilename()));
  • mythplugins/mythvideo/mythvideo/videofilter.cpp

     
    353353            ret = lhs_key < rhs_key;
    354354            break;
    355355        }
     356        case kOrderBySeasonEp:
     357        {
     358            if (lhs.GetSeason() == rhs.GetSeason())
     359                ret = lhs.GetEpisode() < rhs.GetEpisode();
     360            else
     361                ret = lhs.GetSeason() < rhs.GetSeason();
     362            break;
     363        }
    356364        case kOrderByYearDescending:
    357365        {
    358366            ret = lhs.GetYear() > rhs.GetYear();
     
    649657    // Order by
    650658    new MythUIButtonListItem(m_orderbyList, QObject::tr("Title"),
    651659                           VideoFilterSettings::kOrderByTitle);
     660    new MythUIButtonListItem(m_orderbyList, QObject::tr("Season/Episode"),
     661                           VideoFilterSettings::kOrderBySeasonEp);
    652662    new MythUIButtonListItem(m_orderbyList, QObject::tr("Year"),
    653663                           VideoFilterSettings::kOrderByYearDescending);
    654664    new MythUIButtonListItem(m_orderbyList, QObject::tr("User Rating"),
  • mythplugins/mythvideo/mythvideo/metadata.h

     
    1313
    1414enum { VIDEO_YEAR_DEFAULT = 1895 };
    1515
     16const QString VIDEO_SUBTITLE_DEFAULT = "";
     17
    1618struct SortData;
    1719
    1820class Metadata
     
    4547  public:
    4648    static SortKey GenerateDefaultSortKey(const Metadata &m, bool ignore_case);
    4749    static QString FilenameToTitle(const QString &file_name);
     50    static unsigned int FilenameToSeasonEpisode(const QString &file_name,
     51                            int position);
    4852    static QString TrimTitle(const QString &title, bool ignore_case);
    4953
    5054  public:
     
    5559             const QString &banner = QString(),
    5660             const QString &fanart = QString(),
    5761             const QString &title = QString(),
     62             const QString &subtitle = QString(),
    5863             int year = VIDEO_YEAR_DEFAULT,
    5964             const QString &inetref = QString(),
    6065             const QString &director = QString(),
     
    6267             float userrating = 0.0,
    6368             const QString &rating = QString(),
    6469             int length = 0,
     70             int season = 0,
     71             int episode = 0,
    6572             int id = 0,
    6673             ParentalLevel::Level showlevel = ParentalLevel::plLowest,
    6774             int categoryID = 0,
     
    8996    const QString &GetTitle() const;
    9097    void SetTitle(const QString& title);
    9198
     99    const QString &GetSubtitle() const;
     100    void SetSubtitle(const QString &subtitle);
     101
    92102    int GetYear() const;
    93103    void SetYear(int year);
    94104
     
    110120    int GetLength() const;
    111121    void SetLength(int length);
    112122
     123    int GetSeason() const;
     124    void SetSeason(int season);
     125
     126    int GetEpisode() const;
     127    void SetEpisode(int episode);
     128
    113129    unsigned int GetID() const;
    114130    void SetID(int id);
    115131
  • mythplugins/mythvideo/mythvideo/editmetadata.cpp

     
    1212#include <mythtv/libmythui/mythuitextedit.h>
    1313#include <mythtv/libmythui/mythuibutton.h>
    1414#include <mythtv/libmythui/mythuicheckbox.h>
     15#include <mythtv/libmythui/mythuispinbox.h>
    1516
    1617#include "globals.h"
    1718#include "dbaccess.h"
     
    2223EditMetadataDialog::EditMetadataDialog(MythScreenStack *lparent,
    2324        QString lname, Metadata *source_metadata,
    2425        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),
    2830    m_screenshotButton(0), m_screenshotText(0),
    2931    m_bannerButton(0), m_bannerText(0),
    3032    m_fanartButton(0), m_fanartText(0),
     
    4749
    4850    bool err = false;
    4951    UIUtilE::Assign(this, m_titleEdit, "title_edit", &err);
     52    UIUtilE::Assign(this, m_subtitleEdit, "subtitle_edit", &err);
    5053    UIUtilE::Assign(this, m_playerEdit, "player_edit", &err);
    5154
     55    UIUtilE::Assign(this, m_seasonSpin, "season", &err);
     56    UIUtilE::Assign(this, m_episodeSpin, "episode", &err);
     57
    5258    UIUtilE::Assign(this, m_coverartText, "coverart_text", &err);
    5359    UIUtilE::Assign(this, m_screenshotText, "screenshot_text", &err);
    5460    UIUtilE::Assign(this, m_bannerText, "banner_text", &err);
     
    7985        VERBOSE(VB_IMPORTANT, "Failed to build a focuslist.");
    8086
    8187    connect(m_titleEdit, SIGNAL(valueChanged()), SLOT(SetTitle()));
     88    connect(m_subtitleEdit, SIGNAL(valueChanged()), SLOT(SetSubtitle()));
    8289    connect(m_playerEdit, SIGNAL(valueChanged()), SLOT(SetPlayer()));
    8390
     91    connect(m_seasonSpin, SIGNAL(valueChanged()), SLOT(SetSeason()));
     92    connect(m_episodeSpin, SIGNAL(valueChanged()), SLOT(SetEpisode()));
     93
    8494    connect(m_doneButton, SIGNAL(Clicked()), SLOT(SaveAndExit()));
    8595    connect(m_coverartButton, SIGNAL(Clicked()), SLOT(FindCoverArt()));
    8696    connect(m_bannerButton, SIGNAL(Clicked()), SLOT(FindBanner()));
     
    154164void EditMetadataDialog::fillWidgets()
    155165{
    156166    m_titleEdit->SetText(m_workingMetadata->GetTitle());
     167    m_subtitleEdit->SetText(m_workingMetadata->GetSubtitle());
    157168
     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
    158174    MythUIButtonListItem *button =
    159175        new MythUIButtonListItem(m_categoryList, VIDEO_CATEGORY_UNKNOWN);
    160176    const VideoCategory::entry_list &vcl =
     
    312328    m_workingMetadata->SetTitle(m_titleEdit->GetText());
    313329}
    314330
     331void EditMetadataDialog::SetSubtitle()
     332{
     333    m_workingMetadata->SetSubtitle(m_subtitleEdit->GetText());
     334}
     335
    315336void EditMetadataDialog::SetCategory(MythUIButtonListItem *item)
    316337{
    317338    m_workingMetadata->SetCategoryID(item->GetData().toInt());
    318339}
    319340
     341void EditMetadataDialog::SetSeason()
     342{
     343    m_workingMetadata->SetSeason(m_seasonSpin->GetIntValue());
     344}
     345
     346void EditMetadataDialog::SetEpisode()
     347{
     348    m_workingMetadata->SetEpisode(m_episodeSpin->GetIntValue());
     349}
     350
    320351void EditMetadataDialog::SetPlayer()
    321352{
    322353    m_workingMetadata->SetPlayCommand(m_playerEdit->GetText());
  • mythplugins/mythvideo/mythvideo/videoutils.h

     
    3333
    3434QString GetDisplayUserRating(float userrating);
    3535QString GetDisplayLength(int length);
     36QString GetDisplaySeason(int season, int digits);
     37QString GetDisplayEpisode(int episode, int digits);
    3638QString GetDisplayBrowse(bool browse);
    3739QString GetDisplayYear(int year);
    3840QString GetDisplayRating(const QString &rating);