mirror of
https://github.com/xiaoyifang/goldendict-ng.git
synced 2024-12-03 15:34:06 +00:00
Play audio files from websites.
Here we also add Google as a web dictionary as an initial website example. Sounds there work just fine.
This commit is contained in:
parent
44a6842c16
commit
9eb20cf0b6
|
@ -13,6 +13,7 @@
|
||||||
#include <QKeyEvent>
|
#include <QKeyEvent>
|
||||||
#include "folding.hh"
|
#include "folding.hh"
|
||||||
#include "wstring_qt.hh"
|
#include "wstring_qt.hh"
|
||||||
|
#include "webmultimediadownload.hh"
|
||||||
|
|
||||||
#include <QBuffer>
|
#include <QBuffer>
|
||||||
|
|
||||||
|
@ -390,7 +391,10 @@ bool ArticleView::isExternalLink( QUrl const & url )
|
||||||
|
|
||||||
void ArticleView::tryMangleWebsiteClickedUrl( QUrl & url, Contexts & contexts )
|
void ArticleView::tryMangleWebsiteClickedUrl( QUrl & url, Contexts & contexts )
|
||||||
{
|
{
|
||||||
if( url.scheme() == "http" || url.scheme() == "https" )
|
// Don't try mangling audio urls, even if they are from the framed websites
|
||||||
|
|
||||||
|
if( ( url.scheme() == "http" || url.scheme() == "https" )
|
||||||
|
&& ! Dictionary::WebMultimediaDownload::isAudioUrl( url ) )
|
||||||
{
|
{
|
||||||
// Maybe a link inside a website was clicked?
|
// Maybe a link inside a website was clicked?
|
||||||
|
|
||||||
|
@ -598,7 +602,8 @@ void ArticleView::openLink( QUrl const & url, QUrl const & ref,
|
||||||
getGroup( ref ), scrollTo, contexts );
|
getGroup( ref ), scrollTo, contexts );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if ( url.scheme() == "bres" || url.scheme() == "gdau" )
|
if ( url.scheme() == "bres" || url.scheme() == "gdau" ||
|
||||||
|
Dictionary::WebMultimediaDownload::isAudioUrl( url ) )
|
||||||
{
|
{
|
||||||
// Download it
|
// Download it
|
||||||
|
|
||||||
|
@ -608,6 +613,17 @@ void ArticleView::openLink( QUrl const & url, QUrl const & ref,
|
||||||
|
|
||||||
resourceDownloadUrl = url;
|
resourceDownloadUrl = url;
|
||||||
|
|
||||||
|
if ( Dictionary::WebMultimediaDownload::isAudioUrl( url ) )
|
||||||
|
{
|
||||||
|
sptr< Dictionary::DataRequest > req =
|
||||||
|
new Dictionary::WebMultimediaDownload( url, articleNetMgr );
|
||||||
|
|
||||||
|
resourceDownloadRequests.push_back( req );
|
||||||
|
|
||||||
|
connect( req.get(), SIGNAL( finished() ),
|
||||||
|
this, SLOT( resourceDownloadFinished() ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
if ( url.scheme() == "gdau" && url.host() == "search" )
|
if ( url.scheme() == "gdau" && url.host() == "search" )
|
||||||
{
|
{
|
||||||
// Since searches should be limited to current group, we just do them
|
// Since searches should be limited to current group, we just do them
|
||||||
|
@ -975,7 +991,8 @@ void ArticleView::resourceDownloadFinished()
|
||||||
|
|
||||||
vector< char > const & data = (*i)->getFullData();
|
vector< char > const & data = (*i)->getFullData();
|
||||||
|
|
||||||
if ( resourceDownloadUrl.scheme() == "gdau" )
|
if ( resourceDownloadUrl.scheme() == "gdau" ||
|
||||||
|
Dictionary::WebMultimediaDownload::isAudioUrl( resourceDownloadUrl ) )
|
||||||
{
|
{
|
||||||
// Audio data
|
// Audio data
|
||||||
|
|
||||||
|
|
|
@ -146,6 +146,7 @@ WebSites makeDefaultWebSites()
|
||||||
{
|
{
|
||||||
WebSites ws;
|
WebSites ws;
|
||||||
|
|
||||||
|
ws.push_back( WebSite( "b88cb2898e634c6638df618528284c2d", "Google En-En (Collins)", "http://www.google.com/dictionary?aq=f&langpair=en|en&q=%GDWORD%&hl=en", false ) );
|
||||||
ws.push_back( WebSite( "f376365a0de651fd7505e7e5e683aa45", "Urban Dictionary", "http://www.urbandictionary.com/define.php?term=%GDWORD%", false ) );
|
ws.push_back( WebSite( "f376365a0de651fd7505e7e5e683aa45", "Urban Dictionary", "http://www.urbandictionary.com/define.php?term=%GDWORD%", false ) );
|
||||||
ws.push_back( WebSite( "324ca0306187df7511b26d3847f4b07c", "Multitran (En)", "http://multitran.ru/c/m.exe?CL=1&l1=1&s=%GD1251%", false ) );
|
ws.push_back( WebSite( "324ca0306187df7511b26d3847f4b07c", "Multitran (En)", "http://multitran.ru/c/m.exe?CL=1&l1=1&s=%GD1251%", false ) );
|
||||||
ws.push_back( WebSite( "924db471b105299c82892067c0f10787", "Lingvo (En-Ru)", "http://www.abbyyonline.ru/translate.aspx?LingvoAction=translate&Ln=1&words=%GDWORD%", false ) );
|
ws.push_back( WebSite( "924db471b105299c82892067c0f10787", "Lingvo (En-Ru)", "http://www.abbyyonline.ru/translate.aspx?LingvoAction=translate&Ln=1&words=%GDWORD%", false ) );
|
||||||
|
|
|
@ -140,7 +140,8 @@ HEADERS += folding.hh \
|
||||||
zipfile.hh \
|
zipfile.hh \
|
||||||
indexedzip.hh \
|
indexedzip.hh \
|
||||||
termination.hh \
|
termination.hh \
|
||||||
greektranslit.hh
|
greektranslit.hh \
|
||||||
|
webmultimediadownload.hh
|
||||||
FORMS += groups.ui \
|
FORMS += groups.ui \
|
||||||
dictgroupwidget.ui \
|
dictgroupwidget.ui \
|
||||||
mainwindow.ui \
|
mainwindow.ui \
|
||||||
|
@ -218,7 +219,8 @@ SOURCES += folding.cc \
|
||||||
zipfile.cc \
|
zipfile.cc \
|
||||||
indexedzip.cc \
|
indexedzip.cc \
|
||||||
termination.cc \
|
termination.cc \
|
||||||
greektranslit.cc
|
greektranslit.cc \
|
||||||
|
webmultimediadownload.cc
|
||||||
win32 {
|
win32 {
|
||||||
SOURCES += mouseover_win32/ThTypes.c
|
SOURCES += mouseover_win32/ThTypes.c
|
||||||
HEADERS += mouseover_win32/ThTypes.h
|
HEADERS += mouseover_win32/ThTypes.h
|
||||||
|
|
52
webmultimediadownload.cc
Normal file
52
webmultimediadownload.cc
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
#include "webmultimediadownload.hh"
|
||||||
|
#include "filetype.hh"
|
||||||
|
|
||||||
|
namespace Dictionary {
|
||||||
|
|
||||||
|
WebMultimediaDownload::WebMultimediaDownload( QUrl const & url,
|
||||||
|
QNetworkAccessManager & mgr )
|
||||||
|
{
|
||||||
|
connect( &mgr, SIGNAL(finished(QNetworkReply*)),
|
||||||
|
this, SLOT(replyFinished(QNetworkReply*)), Qt::QueuedConnection );
|
||||||
|
|
||||||
|
reply = mgr.get( QNetworkRequest( url ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
void WebMultimediaDownload::cancel()
|
||||||
|
{
|
||||||
|
reply.reset();
|
||||||
|
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
void WebMultimediaDownload::replyFinished( QNetworkReply * r )
|
||||||
|
{
|
||||||
|
if ( r != reply.get() )
|
||||||
|
return; // Not our reply
|
||||||
|
|
||||||
|
if ( reply->error() == QNetworkReply::NoError )
|
||||||
|
{
|
||||||
|
QByteArray all = reply->readAll();
|
||||||
|
|
||||||
|
Mutex::Lock _( dataMutex );
|
||||||
|
|
||||||
|
data.resize( all.size() );
|
||||||
|
|
||||||
|
memcpy( data.data(), all.data(), all.size() );
|
||||||
|
|
||||||
|
hasAnyData = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
setErrorString( reply->errorString() );
|
||||||
|
|
||||||
|
finish();
|
||||||
|
|
||||||
|
reply.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WebMultimediaDownload::isAudioUrl( QUrl const & url )
|
||||||
|
{
|
||||||
|
return url.scheme() == "http" && Filetype::isNameOfSound( url.path().toUtf8().data() );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
33
webmultimediadownload.hh
Normal file
33
webmultimediadownload.hh
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
#ifndef WEBMULTIMEDIADOWNLOAD_HH
|
||||||
|
#define WEBMULTIMEDIADOWNLOAD_HH
|
||||||
|
|
||||||
|
#include "dictionary.hh"
|
||||||
|
#include <QtNetwork>
|
||||||
|
|
||||||
|
namespace Dictionary {
|
||||||
|
|
||||||
|
/// Downloads data from the web, wrapped as a dictionary's DataRequest. This
|
||||||
|
/// is useful for multimedia files, like sounds and pronunciations.
|
||||||
|
class WebMultimediaDownload: public DataRequest
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
sptr< QNetworkReply > reply;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
WebMultimediaDownload( QUrl const &, QNetworkAccessManager & );
|
||||||
|
|
||||||
|
/// Checks if the given url is an http request for an audio file.
|
||||||
|
static bool isAudioUrl( QUrl const & );
|
||||||
|
|
||||||
|
virtual void cancel();
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
|
||||||
|
void replyFinished( QNetworkReply * );
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // WEBMULTIMEDIADOWNLOAD_HH
|
Loading…
Reference in a new issue