~saruneko/umedia/master

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include "songs.h"

#include <QtCore>
#include <taglib/id3v2header.h>
#include <taglib/id3v2tag.h>
#include <taglib/tag.h>
#include <taglib/fileref.h>
#include <taglib/mpegfile.h>
#include <attachedpictureframe.h>

Songs::Songs(QObject* root, QObject *parent) :
    QObject(parent)
  , root(root)
{
    this->create_temp_folder();

    // Load Generic covers
    QDir currentDir = QDir(QDir::currentPath());
    this->coverMap["0"] = currentDir.filePath("qml/UMedia/img/cover/mass_effect.jpg");
    this->coverMap["1"] = currentDir.filePath("qml/UMedia/img/cover/einstein.jpg");
    this->coverMap["2"] = currentDir.filePath("qml/UMedia/img/cover/evolution.jpg");
}

QString Songs::get_cover_path_for_song(const QString &artist, const QString &album)
{
    QString cover_code = QString(QCryptographicHash::hash((artist + album).toAscii(), QCryptographicHash::Md5));
    if(this->coverMap.contains(cover_code)){
        return this->coverMap[cover_code];
    }else{
        QTime time = QTime::currentTime();
        qsrand((uint)time.msec());

        QString index = QString::number((rand() % 3));
        return this->coverMap[index];
    }
}

bool Songs::valid_song_file(const QString &file){
    QFileInfo info(file);
    if(info.isFile() && info.isReadable()){
        return true;
    }
    return false;
}

void Songs::load_songs(const QString &file)
{
    QDir musicDir(file);
    QStringList files_list = musicDir.entryList(QStringList("*.mp3"), QDir::Files, QDir::Name);

    int i;
    for(i = 0; i < files_list.size(); i++){
        QString path_song = musicDir.filePath(files_list[i]);
        this->append_song(path_song);
    }
}

void Songs::load_songs(const QStringList &files)
{
    int i;
    for(i = 0; i < files.size(); i++){
        this->append_song(files[i]);
    }
}

void Songs::append_song(const QString& file)
{
    QFileInfo info(file);
    if(info.isFile() && info.isReadable()){
        QDir dir(file);
        TagLib::FileRef f(file.toUtf8());
        QString artist(f.tag()->artist().toCString());
        QString title(f.tag()->title().toCString());
        QString album(f.tag()->album().toCString());
        if(title == ""){
            title = info.baseName();
        }
        if(artist == ""){
            artist = dir.dirName();
        }
        if(album == ""){
            artist = dir.dirName();
        }
        this->save_image_for_file(artist, album, file.toUtf8());
        QMetaObject::invokeMethod(root, "add_song", Q_ARG(QVariant, title), Q_ARG(QVariant, artist),
                                  Q_ARG(QVariant, album), Q_ARG(QVariant, file));
    }
}

bool Songs::save_image_for_file(const QString& artist, const QString& album, const char *file)
{
    QString cover_code = QString(QCryptographicHash::hash((artist + album).toAscii(), QCryptographicHash::Md5));
    if(!this->coverMap.contains(cover_code)){
        TagLib::MPEG::File f(file);

        if(!f.isValid() || !f.ID3v2Tag())
            return false;

        TagLib::ID3v2::FrameList l = f.ID3v2Tag()->frameList("APIC");

        if(l.size() < 1){
            return false;
        }

        TagLib::ID3v2::AttachedPictureFrame *af =
            static_cast<TagLib::ID3v2::AttachedPictureFrame *>(l.front());

        QFile fi(this->coverDir->filePath(cover_code));
        fi.open(QIODevice::WriteOnly);
        fi.write((const char *) af->picture().data(), af->picture().size());
        fi.flush();
        fi.close();

        this->coverMap[cover_code] = fi.fileName();
    }

    return true;
}

void Songs::create_temp_folder()
{
    QString tempPath = QDir::tempPath();
    this->coverDir = new QDir(QDir(tempPath).filePath("umedia/covers"));
    if(!this->coverDir->exists()){
        this->coverDir->mkpath(this->coverDir->absolutePath());
    }
}