-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlyricbox.cpp
125 lines (103 loc) · 3.33 KB
/
lyricbox.cpp
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
#include "lyricbox.h"
#include <QVBoxLayout>
#include <QString>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QAction>
#include <QClipboard>
#include <QApplication>
lyricBox::lyricBox(QWidget *parent) :
QWidget(parent),
_lyricsTextBox(new QTextEdit("Lyrics will show here as available.")),
_retrievedFromSiteLabel(new QLabel),
_networkManager(new QNetworkAccessManager),
_artist(""),
_title("")
{
connect(_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(lyricsRetrieved(QNetworkReply*)));
_lyricsTextBox->setAcceptDrops(false);
_lyricsTextBox->setReadOnly(true);
QAction * copyText = new QAction(tr("Copy Lyrics"), this);
QAction * copySelected = new QAction(tr("Copy Selected"), this);
connect(copyText, SIGNAL(triggered()), this, SLOT(copyLyricsToClipboard()));
connect(copySelected, SIGNAL(triggered()), this, SLOT(copySelectedToClipboard()));
_lyricsTextBox->addAction(copyText);
_lyricsTextBox->addAction(copySelected);
_lyricsTextBox->setContextMenuPolicy(Qt::ActionsContextMenu);
QVBoxLayout * centralLayout = new QVBoxLayout;
centralLayout->addWidget(_lyricsTextBox);
centralLayout->addWidget(_retrievedFromSiteLabel);
this->setLayout(centralLayout);
}
void lyricBox::setFont(const QFont & font)
{
_lyricsTextBox->setFont(font);
_retrievedFromSiteLabel->setFont(font);
}
void lyricBox::retrieveLyrics(QString artist, QString title)
{
_artist = artist;
_title = title;
formatLyricsUrlStringMetro(artist);
formatLyricsUrlStringMetro(title);
QString urlString = "http://www.metrolyrics.com/" + title + "-lyrics-" + artist + ".html";
_networkManager->get(QNetworkRequest(QUrl(urlString.toLower())));
}
const QString lyricBox::removePrecedingThe(const QString &str)
{
QString retStr = "";
if(str.left(3).toLower() == "the")
retStr = str.right(str.size()-4);
return retStr;
}
void lyricBox::formatLyricsUrlStringMetro(QString & str)
{
for(auto i : str)
{
switch(i.toLatin1())
{
case '-':
case ',':
case '\'':
case '!':
case '(':
case ')':
case '/':
case '.':
case '?':
str.remove(i);
break;
}
}
str.replace(" ", "-");
str.replace('&',"and");
}
void lyricBox::lyricsRetrieved(QNetworkReply * response)
{
QString beginTag = "<div id=\"lyrics-body-text\">";
QString endTag = "</div>";
QString page = QString(response->readAll());
const int beginOfLyrics = page.indexOf(beginTag);
const int endOfLyrics = page.indexOf(endTag,beginOfLyrics+1);
QString lyrics = page.midRef(beginOfLyrics,endOfLyrics-beginOfLyrics).toString();
if(page.indexOf(beginTag) == -1)
{
_lyricsTextBox->setText("No Lyrics Available.");
_retrievedFromSiteLabel->setText("");
}
else
{
_lyricsTextBox->setText(lyrics);
_retrievedFromSiteLabel->setText("Lyrics retrieved from: Metrolyrics");
emit lyricsChanged(_artist, _title, _lyricsTextBox->toPlainText());
}
}
void lyricBox::copyLyricsToClipboard()
{
QClipboard * clipboard = QApplication::clipboard();
clipboard->setText(_lyricsTextBox->toPlainText());
}
void lyricBox::copySelectedToClipboard()
{
_lyricsTextBox->copy();
}