Ticket #6158: PBBMVExport.3.diff

File PBBMVExport.3.diff, 16.1 KB (added by robert.mcnamara@…, 12 years ago)

This version of the patch works w/ #6159 to move screenshots to new "screenshot" field

  • mythtv/programs/mythfrontend/playbackbox.cpp

     
    2020#include "mythdirs.h"
    2121#include "mythcontext.h"
    2222#include "mythdbcon.h"
     23#include "mythdb.h"
    2324#include "mythverbose.h"
    2425#include "programinfo.h"
    2526#include "scheduledrecording.h"
     
    15541555    stop(pginfo);
    15551556}
    15561557
     1558void PlaybackBox::exportMVSelected()
     1559{
     1560    ProgramInfo *pginfo = CurrentItem();
     1561               
     1562    if (!pginfo)
     1563        return; 
     1564                   
     1565    mvexport(pginfo);
     1566}
     1567
    15571568void PlaybackBox::deleteSelected(MythUIButtonListItem *item)
    15581569{
    15591570    if (!item)
     
    18131824    RemoteStopRecording(rec);
    18141825}
    18151826
     1827void PlaybackBox::mvexport(ProgramInfo *rec)
     1828{
     1829    // User Rating Adjustment
     1830    QString exportRating = QString::number((int)((rec->stars * 10.0) + 0.5));
     1831
     1832    // Stuff necessary to perform the copy command
     1833
     1834    QString copyFrom = rec->GetPlaybackURL(false, true);
     1835    QString extension;
     1836
     1837    QRegExp rx(".*\\.(\\w+)$");
     1838    int pos = rx.indexIn(copyFrom);
     1839    if (pos > -1)
     1840    {
     1841        extension = rx.cap(1);
     1842    }
     1843    else
     1844    {
     1845        extension = "";
     1846    }
     1847
     1848    QString baseMVDir = gContext->GetSetting("VideoStartupDir");
     1849    QString MVDirFormat = gContext->GetSetting("TVExportDirFormat",
     1850                              "Television/%TITLE%/");
     1851    if (!MVDirFormat.isEmpty())
     1852    {
     1853         MVDirFormat.replace(QRegExp("%FILE%"), rec->GetRecordBasename(true));
     1854         MVDirFormat.replace(QRegExp("%TITLE%"), rec->title);
     1855         MVDirFormat.replace(QRegExp("%SUBTITLE%"), rec->subtitle);
     1856         MVDirFormat.replace(QRegExp("%DESCRIPTION%"), rec->description);
     1857         MVDirFormat.replace(QRegExp("%HOSTNAME%"), rec->hostname);
     1858         MVDirFormat.replace(QRegExp("%CATEGORY%"), rec->category);
     1859         MVDirFormat.replace(QRegExp("%RECGROUP%"), rec->recgroup);
     1860         MVDirFormat.replace(QRegExp("%PLAYGROUP%"), rec->playgroup);
     1861         MVDirFormat.replace(QRegExp("%CHANID%"), rec->chanid);
     1862         MVDirFormat.replace(QRegExp("%STARTTIME%"),
     1863                         rec->recstartts.toString("yyyyMMddhhmmss"));
     1864         MVDirFormat.replace(QRegExp("%ENDTIME%"),
     1865                         rec->recendts.toString("yyyyMMddhhmmss"));
     1866         MVDirFormat.replace(QRegExp("%STARTTIMEISO%"),
     1867                         rec->recstartts.toString(Qt::ISODate));
     1868         MVDirFormat.replace(QRegExp("%ENDTIMEISO%"),
     1869                         rec->recendts.toString(Qt::ISODate));
     1870         MVDirFormat.replace(QRegExp("%PROGSTART%"),
     1871                         rec->startts.toString("yyyyMMddhhmmss"));
     1872         MVDirFormat.replace(QRegExp("%PROGEND%"),
     1873                         rec->endts.toString("yyyyMMddhhmmss"));
     1874         MVDirFormat.replace(QRegExp("%PROGSTARTISO%"),
     1875                         rec->startts.toString(Qt::ISODate));
     1876         MVDirFormat.replace(QRegExp("%PROGENDISO%"),
     1877                         rec->endts.toString(Qt::ISODate));
     1878
     1879    }
     1880
     1881    QString MVFileFormat = gContext->GetSetting("TVExportFileFormat",
     1882                              "%TITLE% - %SUBTITLE%");
     1883    if (!MVFileFormat.isEmpty())
     1884    {
     1885         MVFileFormat.replace(QRegExp("%FILE%"), rec->GetRecordBasename(true));
     1886         MVFileFormat.replace(QRegExp("%TITLE%"), rec->title);
     1887         MVFileFormat.replace(QRegExp("%SUBTITLE%"), rec->subtitle);
     1888         MVFileFormat.replace(QRegExp("%DESCRIPTION%"), rec->description);
     1889         MVFileFormat.replace(QRegExp("%HOSTNAME%"), rec->hostname);
     1890         MVFileFormat.replace(QRegExp("%CATEGORY%"), rec->category);
     1891         MVFileFormat.replace(QRegExp("%RECGROUP%"), rec->recgroup);
     1892         MVFileFormat.replace(QRegExp("%PLAYGROUP%"), rec->playgroup);
     1893         MVFileFormat.replace(QRegExp("%CHANID%"), rec->chanid);
     1894         MVFileFormat.replace(QRegExp("%STARTTIME%"),
     1895                         rec->recstartts.toString("yyyyMMddhhmmss"));
     1896         MVFileFormat.replace(QRegExp("%ENDTIME%"),
     1897                         rec->recendts.toString("yyyyMMddhhmmss"));
     1898         MVFileFormat.replace(QRegExp("%STARTTIMEISO%"),
     1899                         rec->recstartts.toString(Qt::ISODate));
     1900         MVFileFormat.replace(QRegExp("%ENDTIMEISO%"),
     1901                         rec->recendts.toString(Qt::ISODate));
     1902         MVFileFormat.replace(QRegExp("%PROGSTART%"),
     1903                         rec->startts.toString("yyyyMMddhhmmss"));
     1904         MVFileFormat.replace(QRegExp("%PROGEND%"),
     1905                         rec->endts.toString("yyyyMMddhhmmss"));
     1906         MVFileFormat.replace(QRegExp("%PROGSTARTISO%"),
     1907                         rec->startts.toString(Qt::ISODate));
     1908         MVFileFormat.replace(QRegExp("%PROGENDISO%"),
     1909                         rec->endts.toString(Qt::ISODate));
     1910
     1911    }
     1912
     1913    QString copyToDir = QString("%1/%2/").arg(baseMVDir).arg(MVDirFormat);
     1914    QString copyToFile = QString("%1/%2.%3").arg(copyToDir)
     1915                             .arg(MVFileFormat).arg(extension);
     1916
     1917    // File and Directory Definitions
     1918
     1919    QFile fromFile(copyFrom);
     1920    QDir toDir(copyToDir);
     1921    QFile toFile(copyToFile);
     1922
     1923    if (!toDir.exists())
     1924    {
     1925        // Attempt to create path to export point.
     1926        toDir.mkpath(copyToDir);
     1927        toDir.mkdir(copyToDir);
     1928        if (!toDir.exists())
     1929        {
     1930            VERBOSE(VB_IMPORTANT, QString("Unable to create directory %1! "
     1931                                          "Please ensure the preceding path "
     1932                                          "exists and is writeable.").arg(copyToDir));   
     1933            return;
     1934        }
     1935    }
     1936
     1937    VERBOSE(VB_IMPORTANT, QString("Exporting to MythVideo:\n "
     1938                                   "Title: %1\n "
     1939                                   "Subtitle: %2\n "
     1940                                   "Description: %3\n "
     1941                                   "User Rating: %4\n "
     1942                                   "Year: %5\n "
     1943                                   "Length: %6 Minutes\n "
     1944                                   "Copying From File: %7\n "
     1945                                   "Copying to File: %8 ").arg(rec->title).arg(rec->subtitle).arg(rec->description).arg(exportRating).arg(rec->originalAirDate.toString("yyyy")).arg(rec->lenMins).arg(copyFrom).arg(copyToFile));
     1946
     1947    long long int bytesCopied = copy(toFile,fromFile);
     1948
     1949    if (bytesCopied != -1)
     1950    {
     1951        // Add File into videometadata
     1952
     1953        MSqlQuery query(MSqlQuery::InitCon());
     1954
     1955        query.prepare("INSERT INTO videometadata (title,plot,year,category,"
     1956                          "userrating,length,filename,showlevel,inetref, "
     1957                          "browse) VALUES (:TITLE, :PLOT, :YEAR, :CATEGORY, "
     1958                          ":USERRATING, :LENGTH, :FILENAME, :SHOWLEVEL, "
     1959                          ":INETREF, :BROWSE)");
     1960
     1961        query.bindValue(":TITLE", MVFileFormat);
     1962        query.bindValue(":PLOT", rec->description);
     1963        query.bindValue(":YEAR", rec->originalAirDate.toString("yyyy"));
     1964        query.bindValue(":CATEGORY", rec->category);
     1965        query.bindValue(":USERRATING", exportRating);
     1966        query.bindValue(":LENGTH", rec->lenMins);
     1967        query.bindValue(":FILENAME", copyToFile);
     1968        query.bindValue(":SHOWLEVEL", 1);
     1969        query.bindValue(":INETREF", 0);
     1970        query.bindValue(":BROWSE", 1);
     1971
     1972        if (!query.exec() || !query.isActive())
     1973        {
     1974            MythDB::DBError("video metadata update", query);
     1975            return;
     1976        }
     1977
     1978        // Move recordedmarkup for file into videometadata
     1979
     1980        MSqlQuery markup(MSqlQuery::InitCon());
     1981
     1982        markup.prepare("INSERT INTO filemarkup (filename,mark,offset,type) "
     1983                      "SELECT :FILENAME, mark, data, type from "
     1984                      "recordedmarkup where chanid=:CHANID and starttime=:STARTTIME");
     1985
     1986        markup.bindValue(":FILENAME", copyToFile);
     1987        markup.bindValue(":CHANID", rec->chanid);
     1988        markup.bindValue(":STARTTIME", rec->recstartts);
     1989
     1990        if (!markup.exec() || !markup.isActive())
     1991        {
     1992            MythDB::DBError("video metadata update", markup);
     1993            return;
     1994        }
     1995
     1996        // Copy and set preview image as coverfile
     1997
     1998        QString imagefile = NULL;
     1999        imagefile = getPreviewImage(rec);
     2000        QString MVScreenshotDir = gContext->GetSetting("VideoScreenshotDir");
     2001        QString MVimagefile = QString("%1/%2.png").arg(MVScreenshotDir).arg(MVFileFormat);
     2002
     2003        VERBOSE(VB_IMPORTANT, QString("Copying %1 to %2").arg(imagefile).arg(MVimagefile));
     2004
     2005        QFile fromPoster(imagefile);
     2006        QFile toPoster(MVimagefile);
     2007
     2008        long long int posterBytesCopied = copy(toPoster,fromPoster);
     2009
     2010        if (posterBytesCopied != -1)
     2011        {
     2012            MSqlQuery poster(MSqlQuery::InitCon());
     2013
     2014            poster.prepare("UPDATE videometadata set screenshot=:COVERFILE "
     2015                              "where filename=:FILENAME");
     2016
     2017            poster.bindValue(":COVERFILE", MVimagefile);
     2018            poster.bindValue(":FILENAME", copyToFile);
     2019
     2020            if (!poster.exec() || !poster.isActive())
     2021            {
     2022                MythDB::DBError("video metadata update", poster);
     2023                 return;
     2024            }
     2025        }
     2026        else
     2027        {
     2028            VERBOSE(VB_IMPORTANT, QString("Copy succeeded, but image copy failed.").arg(posterBytesCopied));
     2029            return;
     2030        }
     2031        VERBOSE(VB_IMPORTANT, QString("Copy succeeded, %1 bytes copied.").arg(bytesCopied));
     2032    }
     2033    else
     2034    {
     2035        VERBOSE(VB_IMPORTANT, QString("Copy unsuccessful, check all permissions."));
     2036    }
     2037}
     2038
    18162039bool PlaybackBox::doRemove(ProgramInfo *rec, bool forgetHistory,
    18172040                           bool forceMetadataDelete)
    18182041{
     
    18672090        showActionPopup(pginfo);
    18682091}
    18692092
     2093void PlaybackBox::showExportPopup(ProgramInfo *program)
     2094{
     2095    if (m_popupMenu)
     2096        return;
     2097
     2098    QString label = tr("Are you sure you want to export:");
     2099
     2100    m_expItem = CurrentItem();
     2101    popupString(m_expItem, label);
     2102
     2103    m_popupMenu = new MythDialogBox(label, m_popupStack, "pbbmainmenupopup");
     2104
     2105    connect(m_popupMenu, SIGNAL(Exiting()), SLOT(popupClosed()));
     2106
     2107    if (m_popupMenu->Create())
     2108        m_popupStack->AddScreen(m_popupMenu);
     2109    else
     2110    {
     2111        delete m_popupMenu;
     2112        m_popupMenu = NULL;
     2113    }
     2114
     2115    m_popupMenu->SetReturnEvent(this, "slotmenu");
     2116
     2117    m_freeSpaceNeedsUpdate = true;
     2118    QString tmpmessage;
     2119    const char *tmpslot = NULL;
     2120
     2121    if (program->IsSameProgram(*program))
     2122        {
     2123        tmpmessage = tr("Yes, Export to MythVideo");
     2124        tmpslot = SLOT(doMVExport());
     2125        m_popupMenu->AddButton(tmpmessage, tmpslot);
     2126
     2127        tmpmessage = tr("No, I don't want to Export");
     2128        tmpslot = SLOT(noExport());
     2129        m_popupMenu->AddButton(tmpmessage, tmpslot);
     2130        }
     2131}
     2132
     2133
    18702134void PlaybackBox::showDeletePopup(ProgramInfo *program, deletePopupType types)
    18712135{
    18722136    if (m_popupMenu)
     
    25122776                           true);
    25132777    m_popupMenu->AddButton(tr("Job Options"), SLOT(showJobPopup()), true);
    25142778
     2779    QString MVlocation = FindPluginName("mythvideo");
     2780    if (QFile(MVlocation).exists())
     2781        m_popupMenu->AddButton(tr("Export to MythVideo"), SLOT(askMVExport()));
     2782
    25152783    if (!(m_player && m_player->IsSameProgram(0, pginfo)))
    25162784    {
    25172785        if (pginfo->recgroup == "Deleted")
     
    26082876    stop(pginfo);
    26092877}
    26102878
     2879void PlaybackBox::doMVExport(void)
     2880{
     2881    ProgramInfo *pginfo = CurrentItem();
     2882    mvexport(pginfo);
     2883}
     2884
    26112885void PlaybackBox::showProgramDetails()
    26122886{
    26132887   ProgramInfo *pginfo = CurrentItem();
     
    27463020    }
    27473021}
    27483022
     3023void PlaybackBox::askMVExport(ProgramInfo *pginfo)
     3024{
     3025    if (!pginfo)
     3026        pginfo = CurrentItem();
     3027    showExportPopup(pginfo);
     3028}
     3029
    27493030void PlaybackBox::askDelete(ProgramInfo *pginfo)
    27503031{
    27513032    if (!pginfo)
  • mythtv/programs/mythfrontend/playbackbox.h

     
    137137    void upcoming();
    138138    void details();
    139139    void stopSelected();
     140    void exportMVSelected();
    140141    void showMenu();
    141142    void showActionsSelected();
    142143    void showRecGroupChanger();
     
    170171
    171172    void askStop();
    172173    void doStop();
     174    void askMVExport(ProgramInfo *pginfo = NULL);
     175    void doMVExport();
    173176
    174177    void doEditScheduled();
    175178    void doAllowRerecord();
     
    260263
    261264    bool play(ProgramInfo *rec, bool inPlaylist = false);
    262265    void stop(ProgramInfo *);
     266    void mvexport(ProgramInfo *);
    263267    void remove(ProgramInfo *);
    264268    void showActions(ProgramInfo *);
    265269    ProgramInfo *CurrentItem(void);
     
    279283
    280284    bool doRemove(ProgramInfo *, bool forgetHistory, bool forceMetadataDelete);
    281285    void showDeletePopup(ProgramInfo *, deletePopupType);
     286    void showExportPopup(ProgramInfo *);
    282287    void showActionPopup(ProgramInfo *program);
    283288    void showFileNotFoundActionPopup(ProgramInfo *program);
    284289    void popupString(ProgramInfo *program, QString &message);
     
    376381    // Other state
    377382    /// Program currently selected for deletion
    378383    ProgramInfo *m_delItem;
     384    /// Program currently selected for export
     385    ProgramInfo *m_expItem;
    379386    /// Program currently selected during an update
    380387    ProgramInfo *m_currentItem;
    381388    /// Group currently selected
  • mythplugins/mythvideo/mythvideo/globalsettings.cpp

     
    236236    return gc;
    237237}
    238238
     239HostLineEdit *TVExportDirectoryFormat()
     240{
     241    HostLineEdit *gc = new HostLineEdit("TVExportDirFormat");
     242    gc->setLabel(QObject::tr("TV Export Directory Format"));
     243    gc->setValue(DEFAULT_TVEXPORTDIRFORMAT);
     244    gc->setHelpText(QObject::tr("Directory format for recording export "
     245                    "to MythVideo, using user job style variables. Directory "
     246                    "is off of base MythVideo directory. Example: "
     247                    "Television/%CATEGORY%/%TITLE%"));
     248    return gc;
     249}
     250
     251HostLineEdit *TVExportFileFormat()
     252{
     253    HostLineEdit *gc = new HostLineEdit("TVExportFileFormat");
     254    gc->setLabel(QObject::tr("TV Export File Format"));
     255    gc->setValue(DEFAULT_TVEXPORTFILEFORMAT);
     256    gc->setHelpText(QObject::tr("File format for recording export "
     257                    "to MythVideo, using user job style variables. Example: "
     258                    "%TITLE% - %SUBTITLE% (%STARTTIMEISO%)"));
     259    return gc;
     260}
     261
    239262HostLineEdit *VideoArtworkDirectory()
    240263{
    241264    HostLineEdit *gc = new HostLineEdit("VideoArtworkDir");
     
    683717    page1->addChild(VideoStartupDirectory());
    684718    page1->addChild(VideoArtworkDirectory());
    685719    page1->addChild(VideoDefaultView());
     720    page1->addChild(TVExportDirectoryFormat());
     721    page1->addChild(TVExportFileFormat());
    686722
    687723    VConfigPage page2(pages, false);
    688724    page2->addChild(VideoListUnknownFiletypes());
  • mythplugins/mythvideo/mythvideo/globals.cpp

     
    2526const QString JUMP_VIDEO_TREE = "Video Listings";
    2627const QString JUMP_VIDEO_GALLERY = "Video Gallery";
    2728const QString JUMP_VIDEO_DEFAULT = "MythVideo";
     29const QString DEFAULT_TVEXPORTDIRFORMAT = "Television/%TITLE%";
     30const QString DEFAULT_TVEXPORTFILEFORMAT = "%TITLE% - %SUBTITLE%";
    2831
    2932#ifdef Q_WS_MACX
    3033const QString DEFAULT_VIDEOSTARTUP_DIR = QDir::homePath() + "/Movies";
  • mythplugins/mythvideo/mythvideo/globals.h

     
    2526extern const QString JUMP_VIDEO_DEFAULT;
    2627
    2728extern const QString DEFAULT_VIDEOSTARTUP_DIR;
     29extern const QString DEFAULT_TVEXPORTDIRFORMAT;
     30extern const QString DEFAULT_TVEXPORTFILEFORMAT;
    2831
    2932#endif // GLOBALS_H_