Skip to content
UploadInterface.cpp 5.35 KiB
Newer Older
Kevin Whitaker's avatar
Kevin Whitaker committed
/*
 * Copyright (C) 2017  Kevin Whitaker <eyecreate@gmail.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 */

#include "UploadInterface.h"
#include "../db/UserAction.h"
#include <experimental/filesystem> //TODO:Change to non-gcc way when officially using c++17
namespace std {
    namespace filesystem =  experimental::filesystem;
}
Kevin Whitaker's avatar
Kevin Whitaker committed

UploadInterface::UploadInterface(WebInterface* app)
{
    this->app = app;
    mainLayout = new Wt::WVBoxLayout();
    fileDrop = new Wt::WFileUpload();
    logs = new Wt::WTextArea();
    clearLogs = new Wt::WPushButton("clear");
    
    logs->setReadOnly(true);
    reInitUploadBox();
    
    this->setLayout(mainLayout);
    mainLayout->addWidget(clearLogs);
    mainLayout->addWidget(logs);
UploadInterface::~UploadInterface()
{
    delete clearLogs;
    delete logs;
    delete fileDrop;
    delete mainLayout;
}

void UploadInterface::reInitUploadBox()
{
    if(fileDrop != nullptr) delete fileDrop;
    fileDrop = new Wt::WFileUpload();
    mainLayout->insertWidget(0,fileDrop);
    fileDrop->setProgressBar(new Wt::WProgressBar());
    fileDrop->setFilters("audio/mpeg audio/mp3");
    fileDrop->setMultiple(false);
    fileDrop->changed().connect(this, &UploadInterface::fileDropChanged);
    fileDrop->uploaded().connect(this, &UploadInterface::fileDropUploaded);
    fileDrop->fileTooLarge().connect(this, &UploadInterface::fileDropTooLarge);
}

void UploadInterface::fileDropChanged()
{
    if(fileDrop->canUpload()) fileDrop->upload();
}

void UploadInterface::fileDropTooLarge()
{
    logs->setText(logs->text()+fileDrop->clientFileName()+": File too large\n");
    reInitUploadBox();
}

void UploadInterface::fileDropUploaded()
{
    //Make sure filename doesn't exist already and then move to music folder.
    if(GroovePlayerMgr::getInstance()->fileExistsInLibrary(fileDrop->clientFileName().toUTF8()))
    {
        logs->setText(logs->text()+fileDrop->clientFileName()+" file not uploaded, conflicts with existing file.\n");
        reInitUploadBox();
        return;
    }
    std::filesystem::path libFile = GroovePlayerMgr::getInstance()->musicScanDir/fileDrop->clientFileName().toUTF8();
    std::filesystem::copy_file(std::filesystem::path(fileDrop->spoolFileName()),libFile);
    
    //Add to library and start new upload box
    Wt::Dbo::Session sqlSession;
    sqlSession.setConnectionPool(*GroovePlayerMgr::getInstance()->connectionPool);
    sqlSession.mapClass<User>("user");
    sqlSession.mapClass<AudioTrack>("tracks");
    sqlSession.mapClass<UserAction>("actions");
    GroovePlayerMgr::ScanResults result = GroovePlayerMgr::getInstance()->addFileToTrackDBIfTagged(&sqlSession,libFile.string());
    if(result != GroovePlayerMgr::ScanResults::ACCEPTED)
    {
        //Remove file
        remove(libFile.c_str());
    }
    switch(result)
    {
        case GroovePlayerMgr::ScanResults::WRONG_FILETYPE:
            logs->setText(logs->text()+fileDrop->clientFileName()+" file is not an accepted filetype.\n");
            reInitUploadBox();
            break;
        case GroovePlayerMgr::ScanResults::MISSING_TITLE_TAG:
            logs->setText(logs->text()+fileDrop->clientFileName()+" file is missing title tag.\n");
            reInitUploadBox();
            break;
        case GroovePlayerMgr::ScanResults::MISSING_MULTIPLE_TAGS:
            logs->setText(logs->text()+fileDrop->clientFileName()+" file is missing multiple tags.\n");
            reInitUploadBox();
            break;
        case GroovePlayerMgr::ScanResults::MISSING_GENRE_TAG:
            logs->setText(logs->text()+fileDrop->clientFileName()+" file is missing genre tag.\n");
            reInitUploadBox();
            break;
        case GroovePlayerMgr::ScanResults::MISSING_COVERART_TAG:
            logs->setText(logs->text()+fileDrop->clientFileName()+" file is missing cover art.\n");
            reInitUploadBox();
            break;
        case GroovePlayerMgr::ScanResults::MISSING_ARTIST_TAG:
            logs->setText(logs->text()+fileDrop->clientFileName()+" file is missing artist tag.\n");
            reInitUploadBox();
            break;
        case GroovePlayerMgr::ScanResults::MISSING_ALBUM_TAG:
            logs->setText(logs->text()+fileDrop->clientFileName()+" file is missing album tag..\n");
            reInitUploadBox();
            break;
        case GroovePlayerMgr::ScanResults::DUPLICATE_TRACK:
            logs->setText(logs->text()+fileDrop->clientFileName()+" file is a duplicate.\n");
            reInitUploadBox();
            break;
        case GroovePlayerMgr::ScanResults::ACCEPTED:
            logs->setText(logs->text()+fileDrop->clientFileName()+" file uploaded\n");
            reInitUploadBox();
            break;
    }
}

void UploadInterface::clearLogsClicked()
{
    logs->setText("");
}