diff --git a/ChangeLog b/ChangeLog index 76f103cc8..d1971422c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Version 0.4.2: + * Updated translations for various languages. + * Resuming playback restores correct volume settings. + * Reduced CPU usage during playback. + * Fixed not starting up due to case sensitivity issue on OS X. + * Fixed volume issue (too quiet) on Windows. + Version 0.4.1: * Fixed various crashes. * Fixed issues with auto-updating XSPF playlists. @@ -7,7 +14,6 @@ Version 0.4.1: * Fixed issues with changing proxy. * Fixed Twitter authentication issues. * Fixed Grooveshark support on Windows. - * Fixed volume issue (too quiet) on Windows. Version 0.4.0: * Added visual notification for database indexing job. @@ -20,9 +26,7 @@ Version 0.4.0: * Fixed bug where resolvers would enable themselves after auto-updating. * Fixed occasional crash when dropping tracks onto New Station item. * Added jump-to-current-track support for search results page. - * Fixed out of sync Show/Hide menu items on OS X when hidden with cmd-h. * Fixed non-resolving tracks when dragging from album view. - * Fixed /Volumes directory not showing up on OS X. * Fixed fetching album covers for albums with special characters. * Show errors and continue gracefully when resolved audio is not available. * Fixed various crashes on exit. @@ -36,7 +40,6 @@ Version 0.4.0: * Added SoundCloudWall.com charts. * Added ability to "lock on" to a user when listening along, to skip along. * Fixed bug where loved tracks would be refreshed much too often. - * Fixed startup crash on OS X. * Fixed some font size issues. * Sped up Tomahawk startup by moving chart loading into a separate thread. * Added support for parsing Grooveshark and Tinysong tracks and playlists. @@ -44,6 +47,9 @@ Version 0.4.0: * Added artist and album results to global searches. * Fixed style and contrast issues when using GTK styles. * Fixed paths to artwork when using MPRIS2 interface. + * Fixed out of sync Show/Hide menu items on OS X when hidden with cmd-h. + * Fixed /Volumes directory not showing up on OS X. + * Fixed startup crash on OS X. Version 0.3.3: * Automatically load Super Collection tracks when no official release diff --git a/README b/README index 339701959..7b47a9de1 100644 --- a/README +++ b/README @@ -13,7 +13,7 @@ Compiling Tomahawk Detailed building instructions for Ubuntu ----------------------------------------- - See: http://wiki.tomahawk-player.org/mediawiki/index.php/Building_Ubuntu_Binary_on_Maverick_(10.10) + See: http://wiki.tomahawk-player.org/mediawiki/index.php/Building_Ubuntu_Binary_on_Precise_(12.04) Detailed building instructions for OS X --------------------------------------- diff --git a/lang/tomahawk_bg.ts b/lang/tomahawk_bg.ts index 1830d5928..662e2c842 100644 --- a/lang/tomahawk_bg.ts +++ b/lang/tomahawk_bg.ts @@ -333,17 +333,17 @@ Remember: Only allow peers to connect if you trust who they are and if you have AudioEngine - + Tomahawk is stopped. Tomahawk е спрян - + Tomahawk is playing "%1" by %2%3. Tomahawk изпълнява "%1" от %2%3. - + on album %1 от албум %1 diff --git a/lang/tomahawk_de.ts b/lang/tomahawk_de.ts index e0e0817f4..310059e3b 100644 --- a/lang/tomahawk_de.ts +++ b/lang/tomahawk_de.ts @@ -333,17 +333,17 @@ Denk dran: Erlaube das nur, wenn du dem Anderen vertraust und du die Rechte zum AudioEngine - + Tomahawk is stopped. Tomahawk ist gestoppt. - + Tomahawk is playing "%1" by %2%3. Tomahawk spielt "%1" von %2%3. - + on album %1 auf dem Album %1 diff --git a/lang/tomahawk_en.ts b/lang/tomahawk_en.ts index 8581dd5ee..0370352c1 100644 --- a/lang/tomahawk_en.ts +++ b/lang/tomahawk_en.ts @@ -333,17 +333,17 @@ Remember: Only allow peers to connect if you trust who they are and if you have AudioEngine - + Tomahawk is stopped. Tomahawk is stopped. - + Tomahawk is playing "%1" by %2%3. Tomahawk is playing "%1" by %2%3. - + on album %1 on album %1 diff --git a/lang/tomahawk_es.ts b/lang/tomahawk_es.ts index b7826d6b4..430ce672b 100644 --- a/lang/tomahawk_es.ts +++ b/lang/tomahawk_es.ts @@ -331,17 +331,17 @@ Remember: Only allow peers to connect if you trust who they are and if you have AudioEngine - + Tomahawk is stopped. Tomahawk está parado. - + Tomahawk is playing "%1" by %2%3. Tomahawk está reproduciendo "%1" de %2%3. - + on album %1 diff --git a/lang/tomahawk_ja.ts b/lang/tomahawk_ja.ts index 3b466e14d..b0f0719b6 100644 --- a/lang/tomahawk_ja.ts +++ b/lang/tomahawk_ja.ts @@ -4,7 +4,7 @@ Connect to Peer? - + ピアに接続しますか? @@ -65,17 +65,17 @@ Remember: Only allow peers to connect if you trust who they are and if you have &Listen Along - + 共有聴取 Stop &Listening Along - + 共有聴取を中止 &Follow in real-time - + 実時間にフォロー @@ -97,7 +97,7 @@ Remember: Only allow peers to connect if you trust who they are and if you have &Rename Playlist - + プレイリスト名を変更 @@ -107,12 +107,12 @@ Remember: Only allow peers to connect if you trust who they are and if you have &Play - + 再生 &Stop - + 停止 @@ -176,7 +176,7 @@ Remember: Only allow peers to connect if you trust who they are and if you have Album - + アルバム @@ -229,12 +229,12 @@ Remember: Only allow peers to connect if you trust who they are and if you have Click to show SuperCollection Albums - + クリクしてスーパーコレクションアルバムを表示 Click to show Official Albums - + クリクして公式アルバムを表示 @@ -247,7 +247,7 @@ Remember: Only allow peers to connect if you trust who they are and if you have This collection is currently empty. - + このコレクションは現在空です。 @@ -295,27 +295,27 @@ Remember: Only allow peers to connect if you trust who they are and if you have love - + Love Time - + 時間 Time Left - + 残り時間 Shuffle - + シャッフル Repeat - + リピート @@ -331,17 +331,17 @@ Remember: Only allow peers to connect if you trust who they are and if you have AudioEngine - + Tomahawk is stopped. - + Tomahawkは中止しています。 - + Tomahawk is playing "%1" by %2%3. - + on album %1 @@ -352,7 +352,7 @@ Remember: Only allow peers to connect if you trust who they are and if you have New Playlist - + 新規プレイリスト @@ -360,7 +360,7 @@ Remember: Only allow peers to connect if you trust who they are and if you have New Station - + 新規ステーション @@ -375,12 +375,12 @@ Remember: Only allow peers to connect if you trust who they are and if you have Playlists - + プレイリスト Stations - + ステーション @@ -388,7 +388,7 @@ Remember: Only allow peers to connect if you trust who they are and if you have Clear - + クリアー @@ -401,7 +401,7 @@ Remember: Only allow peers to connect if you trust who they are and if you have Collection of %1 - + %1のコレクション @@ -409,7 +409,7 @@ Remember: Only allow peers to connect if you trust who they are and if you have This collection is empty. - + このコレクションは空です。 @@ -800,7 +800,7 @@ Remember: Only allow peers to connect if you trust who they are and if you have Proxy Settings - + プロクシ設定 @@ -810,12 +810,12 @@ Remember: Only allow peers to connect if you trust who they are and if you have Host - + ホスト Port - + ポート @@ -997,7 +997,7 @@ other: %n年前 Search - + 検索 @@ -1043,7 +1043,7 @@ other: %n年前 Information - + 情報 @@ -1182,7 +1182,7 @@ other: %n年前 SuperCollection - + スーパーコレクション @@ -1190,7 +1190,7 @@ other: %n年前 &Copy Link - + リンクをコピー @@ -1205,7 +1205,7 @@ other: %n年前 Save XSPF - + XSPFを保存する @@ -1223,12 +1223,12 @@ other: %n年前 Collection - + コレクション Playlist - + プレイリスト @@ -1238,7 +1238,7 @@ other: %n年前 Station - + ステーション @@ -1253,12 +1253,12 @@ other: %n年前 My Music - + マイミュージック SuperCollection - + スーパーコレクション @@ -1268,12 +1268,12 @@ other: %n年前 Dashboard - + ダッシュボード Recently Played - + 最近聴いたトラック @@ -1614,12 +1614,12 @@ You may wish to try re-authenticating. Direct Message - + ダイレクトメッセージ Send Message! - + メッセージを送信! @@ -1673,7 +1673,7 @@ You may wish to try re-authenticating. Your message has been posted! - + あなたのメッセージが投稿されました! @@ -1697,7 +1697,7 @@ You may wish to try re-authenticating. &Play - + 再生 @@ -1720,7 +1720,7 @@ You may wish to try re-authenticating. &Love - + &Love @@ -1730,27 +1730,27 @@ You may wish to try re-authenticating. Show &Album page - + アルバムページを表示 Show &Artist page - + アーティストページを表示 Un-&Love - + Loveじゃないトラック &Delete Items - + 項目を削除 &Delete Item - + 項目を削除 @@ -1927,57 +1927,57 @@ Try tweaking the filters for a new set of songs to play. 0 secs - + 0秒 3600 secs - + 3600秒 -100 dB - + -100dB 100 dB - + 100dB Major - + 長調 Minor - + 短調 C - + ハ調 C Sharp - + 嬰ハ調 D - + ニ調 E Flat - + 変ホ調 E - + ホ調 @@ -2336,12 +2336,12 @@ Try tweaking the filters for a new set of songs to play. New Playlist - + 新規プレイリスト Failed to save tracks - + トラックの保存に失敗しました。 @@ -2438,7 +2438,7 @@ Try tweaking the filters for a new set of songs to play. Scanning - + 走査中 @@ -2448,12 +2448,12 @@ Try tweaking the filters for a new set of songs to play. Fetching - + 取得中 Parsing - + 解析中 @@ -2497,12 +2497,12 @@ enter the displayed PIN number here: Hide Tomahawk Window - + Tomahawkのウインドウを隠す Show Tomahawk Window - + Tomahawkのウインドウを表示 @@ -2512,12 +2512,12 @@ enter the displayed PIN number here: Play - + 再生 Pause - + 一時停止 @@ -2525,12 +2525,12 @@ enter the displayed PIN number here: Tomahawk - + Tomahawk &Settings - + 設定 @@ -2540,22 +2540,22 @@ enter the displayed PIN number here: &Network - + ネットワーク &Window - + ウインドウ &Help - + ヘルプ &Quit - + 終了 @@ -2580,27 +2580,27 @@ enter the displayed PIN number here: Update Collection - + コレクションを更新 &Configure Tomahawk... - + Tomahawkを設定... Load &XSPF... - + XSPFを読み込み... Create &New Playlist... - + 新規プレイリストを作成... About &Tomahawk... - + Tomahawk について... @@ -2625,7 +2625,7 @@ enter the displayed PIN number here: Minimize - + 最小か @@ -2635,7 +2635,7 @@ enter the displayed PIN number here: Zoom - + ズーム @@ -2744,7 +2744,7 @@ enter the displayed PIN number here: Create New Station - + 新規ステーションを作成 @@ -2844,17 +2844,17 @@ enter the displayed PIN number here: Tracks - + トラック Artists - + アーティスト Filter - + フィルター diff --git a/lang/tomahawk_pl.ts b/lang/tomahawk_pl.ts index 152566d00..9baf00d7a 100644 --- a/lang/tomahawk_pl.ts +++ b/lang/tomahawk_pl.ts @@ -152,13 +152,13 @@ Remember: Only allow peers to connect if you trust who they are and if you have Click to show SuperCollection Tracks - + Kliknij, aby pokazać utwory Superkolekcji Click to show SuperCollection Albums - + Kliknij, aby pokazać albumy Superkolekcji @@ -229,7 +229,7 @@ Remember: Only allow peers to connect if you trust who they are and if you have Click to show SuperCollection Albums - + Kliknij, aby pokazać albumy Superkolekcji @@ -331,19 +331,19 @@ Remember: Only allow peers to connect if you trust who they are and if you have AudioEngine - + Tomahawk is stopped. Tomahawk jest zatrzymany. - + Tomahawk is playing "%1" by %2%3. Tomahawk odtwarza "%1" wykonawcy %2%3. - + on album %1 - + z albumu %1 @@ -488,7 +488,7 @@ Remember: Only allow peers to connect if you trust who they are and if you have Delete Account - + Usuń Konto @@ -530,7 +530,7 @@ Remember: Only allow peers to connect if you trust who they are and if you have Indexing database - + Indeksowanie bazy danych @@ -579,22 +579,22 @@ Remember: Only allow peers to connect if you trust who they are and if you have Scrobble tracks to Last.fm - + Skrobluj utwory do Last.fm Username: - + Użytkownik: Password: - + Hasło: Test Login - + Test logowania @@ -623,7 +623,7 @@ Remember: Only allow peers to connect if you trust who they are and if you have Playlist URL - + URL Listy odtwarzania @@ -1113,13 +1113,13 @@ Remember: Only allow peers to connect if you trust who they are and if you have Show - + Pokaż Hide - + Schowaj @@ -1170,17 +1170,17 @@ Remember: Only allow peers to connect if you trust who they are and if you have Recently Played - + Ostatnio Odtworzone Loved Tracks - + Ulubione Utwory SuperCollection - + Superkolekcja @@ -1246,17 +1246,17 @@ Remember: Only allow peers to connect if you trust who they are and if you have Search History - + Historia wyszukiwania My Music - + Moja Muzyka SuperCollection - + Superkolekcja @@ -1299,7 +1299,7 @@ Remember: Only allow peers to connect if you trust who they are and if you have Username: - + Użytkownik: @@ -1309,7 +1309,7 @@ Remember: Only allow peers to connect if you trust who they are and if you have Password: - + Hasło: @@ -1319,7 +1319,7 @@ Remember: Only allow peers to connect if you trust who they are and if you have High Quality Streaming - + Strumieniowanie w wysokiej jakości @@ -1374,12 +1374,12 @@ indywidualnego profilu gustu. Internet Services - + Usługi internetowe Install from file... - + Zainstaluj z pliku... @@ -1437,12 +1437,12 @@ indywidualnego profilu gustu. Add Account - + Dodaj Konto Remove Account - + Usuń Konto @@ -1452,17 +1452,17 @@ indywidualnego profilu gustu. Online - + Online Connecting... - + Łączenie... Offline - + Offline @@ -1475,7 +1475,7 @@ indywidualnego profilu gustu. Google Address - + Adres Google @@ -1485,7 +1485,7 @@ indywidualnego profilu gustu. username@gmail.com - + użytkownik@gmail.com @@ -1501,7 +1501,7 @@ indywidualnego profilu gustu. Add Friend - + Dodaj Znajomego @@ -1559,7 +1559,7 @@ indywidualnego profilu gustu. Tweet! - + Tweet! diff --git a/lang/tomahawk_pt_BR.ts b/lang/tomahawk_pt_BR.ts index 567e2fdb7..22a940384 100644 --- a/lang/tomahawk_pt_BR.ts +++ b/lang/tomahawk_pt_BR.ts @@ -331,17 +331,17 @@ Remember: Only allow peers to connect if you trust who they are and if you have AudioEngine - + Tomahawk is stopped. Tomahawk está inativo. - + Tomahawk is playing "%1" by %2%3. Tomahawk está reproduzindo "%1" por %2%3. - + on album %1 diff --git a/lang/tomahawk_ru.ts b/lang/tomahawk_ru.ts new file mode 100644 index 000000000..67a27a561 --- /dev/null +++ b/lang/tomahawk_ru.ts @@ -0,0 +1,3524 @@ + + + ACLRegistry + + + Connect to Peer? + + + + + Another Tomahawk instance that claims to be owned by %1 is attempting to connect to you. Select whether to allow or deny this connection. + +Remember: Only allow peers to connect if you trust who they are and if you have the legal right for them to stream music from you. + + + + + Deny + Запретить + + + + Allow + Разрешить + + + + AccountFactoryWrapper + + + Dialog + + + + + Description goes here + + + + + Add Account + Добавить аккаунт + + + + AccountFactoryWrapperDelegate + + + Online + В сети + + + + Connecting... + Соединяюсь... + + + + Offline + Не в сети + + + + ActionCollection + + + &Listen Along + &Слушать Его + + + + Stop &Listening Along + &Прекратить его слушать + + + + &Follow in real-time + &Следить в реальном времени + + + + + &Listen Privately + &Слушать Cамому + + + + + &Listen Publicly + &Слушать со всеми + + + + &Load Playlist + &Загрузить Плейлист + + + + &Rename Playlist + &Переименовать Плейлист + + + + &Copy Playlist Link + &Скопировать Cсылку Плейлиста + + + + &Play + &Играть + + + + &Stop + &Стоп + + + + &Previous Track + &Предыдущий + + + + &Next Track + &Следующий + + + + &Quit + &Выйти + + + + AlbumInfoWidget + + + Form + Форма + + + + Other Albums by Artist + Другие альбомы артиста + + + + + Click to show Official Tracks + Показать Официальные Песни + + + + + Click to show SuperCollection Tracks + Показать общую коллекцию песен + + + + + Click to show SuperCollection Albums + Показать общую коллекцию альбомов + + + + Click to show Official Albums + Показать официальные альбомы + + + + Other Albums by %1 + Другие альбомы %1 + + + + AlbumModel + + + Album + Альбом + + + + + All albums from %1 + Все альбомы %1 + + + + All albums + Все альбомы + + + + AlbumView + + + After you have scanned your music collection you will find your latest album additions right here. + После сканирования вашей музыкальной коллекции вы найдете свой альбомы тут. + + + + This collection doesn't have any recent albums. + Эта коллекция не имеет последних альбомов. + + + + ArtistInfoWidget + + + Form + Форма + + + + Top Hits + Хиты + + + + Related Artists + Похожие исполнители + + + + Albums + Альбомы + + + + + Click to show SuperCollection Albums + Показать общую коллекцию альбомов + + + + Click to show Official Albums + Показать официальные альбомы + + + + ArtistView + + + After you have scanned your music collection you will find your tracks right here. + После сканирования вашей музыкальной коллекции вы найдете свои песни тут. + + + + This collection is currently empty. + Коллекция пуста. + + + + Sorry, your filter '%1' did not match any results. + К сожалению, '%1' фильтр не найдено ни одного результата. + + + + AudioControls + + + Prev + Предыдущая + + + + Play + Играть + + + + Pause + Пауза + + + + Next + Следующая + + + + Artist + Исполнитель + + + + Album + Альбом + + + + Owner + Владелец + + + + love + Любимая + + + + Time + Прошло + + + + Time Left + Осталось + + + + Shuffle + Случаная + + + + Repeat + Повторять + + + + Low + Тише + + + + High + Громче + + + + AudioEngine + + + Tomahawk is stopped. + Tomahawk остановлен. + + + + Tomahawk is playing "%1" by %2%3. + Tomahawk играет "%1" by %2%3. + + + + on album %1 + на альбом %1 + + + + CategoryAddItem + + + + New Playlist + Новый плейлист + + + + + + + New Station + Новая станция + + + + + + %1 Station + %1 Станция + + + + CategoryItem + + + Playlists + Плейлисты + + + + Stations + Станции + + + + ClearButton + + + Clear + Очистить + + + + CollectionFlatModel + + + My Collection + Моя Коллекция + + + + Collection of %1 + Коллекция %1 + + + + CollectionView + + + This collection is empty. + Коллекция пуста. + + + + ContextWidget + + + InfoBar + Панель информации + + + + + Show Footnotes + Показать Информацию об Исполнителе + + + + Hide Footnotes + Спрятать Информацию об Исполнителе + + + + CrashReporter + + + Tomahawk Crash Reporter + Отчет о ошибках + + + + <p><b>Sorry!</b>&nbsp;Tomahawk crashed. Information about the crash is now being sent to Tomahawk HQ so that we can fix the bug.</p> + <p><b>Упс!</b>&nbsp;Произошла ошибка. Информация о ошибке сейчас отправляется разработчикам, чтобы они могли её исправить. Извиняемся :)</p> + + + + Abort + Отменить + + + + You can disable sending crash reports in the configuration dialog. + Вы можете отключить отправку отчетов об ошибках в диалоге настройки. + + + + Uploaded %L1 of %L2 KB. + Загружено %L1 из %L2 KB. + + + + + Close + Закрыть + + + + Sent! <b>Many thanks</b>. + Отправлен! <b>Большое спасибо!!!</b>. + + + + Failed to send crash info. + Невозможно отправить отчет о ошибке. + + + + DatabaseCommand_AllAlbums + + + Unknown + Неизвестный + + + + DelegateConfigWrapper + + + Delete Account + Удалить аккаунт + + + + DiagnosticsDialog + + + Tomahawk Diagnostics + Диагностика + + + + Update + Обновить + + + + Copy to Clipboard + Сохранить в буфер обмена + + + + DropJob + + + No tracks found for given %1 + + + + + GlobalSearchWidget + + + Form + Форма + + + + IndexingJobItem + + + Indexing database + Индексирую базу данных + + + + InfoBar + + + InfoBar + Информация + + + + Automatically update + Обновлять автоматически + + + + Filter... + Фильтр... + + + + JobStatusView + + + Searching For + Искать + + + + Pending + В ожидании + + + + Idle + Бездействие + + + + LastFmConfig + + + Form + Форма + + + + Scrobble tracks to Last.fm + Скроблинг треков Last.fm + + + + Username: + Имя пользователя: + + + + Password: + Пароль: + + + + Test Login + Проверить + + + + LastfmContext + + + Last.fm + Last.fm + + + + LatchedStatusItem + + + %1 is listening along to you! + %1 прослушивает вместе с вами! + + + + LoadXSPF + + + Load XSPF + Загрузить XSPF + + + + Playlist URL + Плейлист URL + + + + Enter URL... + Введите ссылку на плейлист (URI)... + + + + ... + ... + + + + Automatically update + Обновлять автоматически + + + + LoadXSPFDialog + + + Load XSPF File + Загрузить файл XSPF + + + + XSPF Files (*.xspf) + Файлы XSPF (*.xspf) + + + + LocalCollection + + + Bookmarks + Закладки + + + + Saved tracks + Сохраненные песни + + + + NewPlaylistWidget + + + Enter a title for the new playlist: + Введите название нового плейлиста: + + + + Tomahawk offers a variety of ways to help you create playlists and find music you enjoy! + Tomahawk предлагает целый ряд способов, которые помогут вам создавать списки воспроизведения и найти музыку, вам понравится! + + + + Just enter a genre or tag name and Tomahawk will suggest a few songs to get you started with your new playlist: + Просто введите жанра или имя тега и Tomahawk предложит несколько песен, чтобы создать новой плейлист: + + + + &Create Playlist + &Создать плейлист + + + + Create a new playlist + Создать Новый Плейлист + + + + PlaylistItemDelegate + + + played %1 by you + Проиграно %1 мной + + + + played %1 by %2 + Песня %1 проиграна %2 + + + + PlaylistLargeItemDelegate + + + played %1 by you + Воспроизводилось %1 вами + + + + played %1 by %2 + Воспроизводилось %1 %2 + + + + added %1 + Добавлено %1 + + + + PlaylistModel + + + A playlist by %1, created %2 + Плейлист %1 создан %2 + + + + you + Вы + + + + All tracks by %1 on album %2 + Все песни %1 альбома %2 + + + + All tracks by %1 + Все песни %1 + + + + PlaylistTypeSelectorDlg + + + New Playlist + Новый плейлист + + + + Just a regular old playlist... Give it a name, drag in some tracks, and go! + Только регулярный старый плейлист ... Дайте ему имя, перетащитьте какие-нибудь пески, и можно слушать! + + + + Don't know exactly what you want? Give Tomahawk a few pointers and let it build a playlist for you! + Не знаю точно, что вы хотите? Дайте Tomahawk несколько указателей, и пусть он построить плейлист для Вас! + + + + Name: + Имя: + + + + New Playlist... + Название нового плейлиста... + + + + Create Manual Playlist + Создать вручную + + + + Create Automatic Playlist + Создать автоматический плейлист + + + + PlaylistView + + + This playlist is currently empty. Add some tracks to it and enjoy the music! + Этот плейлист пустой. Добавьте какие-нибудь треки и наслаждайтесь музыкой! + + + + ProxyDialog + + + Proxy Settings + Настройки прокси + + + + Hostname of proxy server + Имя хоста прокси сервера + + + + Host + Хост + + + + Port + Порт + + + + Proxy login + Введите логин + + + + User + Логин + + + + Password + Пароль + + + + Proxy password + Введите пароль + + + + Type + Тип прокси + + + + No Proxy Hosts: +(Overrides system proxy) + + + + + localhost *.example.com (space separated) + + + + + Use proxy for DNS lookups? + Использовать прокси для поиска DNS? + + + + QObject + + + %n year(s) ago + %n год назад%n года назад%n лет назад + + + + %n year(s) + %n год%n года%n лет + + + + %n month(s) ago + %n месяц назад%n месяца назад%n месяцей назад + + + + %n month(s) + %n месяц%n месяца%n месяцей + + + + %n week(s) ago + %n неделю назад%n недели назад%n недель назад + + + + %n week(s) + %n неделю%n недели%n недель + + + + %n day(s) ago + %n день назад%n дня назад%n дней назад + + + + %n day(s) + %n день%n дня%n дней + + + + %n hour(s) ago + %n час назад%n часа назад%n часов назад + + + + %n hour(s) + %n час%n часа%n часов + + + + %1 minutes ago + %1 минут(ы) назад + + + + %1 minutes + %1 минут(ы) + + + + just now + только что + + + + Friend Finders + + + + + Music Finders + + + + + Status Updaters + + + + + QuaZipFilePrivate + + + ZIP/UNZIP API error %1 + + + + + QueueView + + + InfoBar + Информационный Бар + + + + + Show Queue + Показать Очередь + + + + Hide Queue + Скрыть Очередь + + + + RelatedArtistsContext + + + Related Artists + Похожие исполнители + + + + ResolverConfigDelegate + + + Not found: %1 + Не найдено: %1 + + + + Failed to load: %1 + Ошибка при загрузке: %1 + + + + SearchLineEdit + + + Search + Поиск + + + + SearchWidget + + + Search: %1 + Поиск: %1 + + + + Results for '%1' + Результаты для '%1' + + + + SettingsDialog + + + Collection + Коллекция + + + + Advanced + Дополнительны + + + + All + + + + + Services + Сервисы + + + + Install resolver from file + + + + + Information + Инофрмация + + + + Changing this setting requires a restart of Tomahawk! + Изменение этого параметра требует перезапуска Tomahawk! + + + + SocialPlaylistWidget + + + Popular New Albums From Your Friends + Популярные альбомы ваших друзей + + + + Most Played Playlists + Часто проигрываемые плейлисты + + + + Most Played Tracks You Don't Have + Популярные проигрываемые песни которых у вас нет + + + + SourceDelegate + + + Track + Трек + + + + Album + Альбом + + + + Artist + Исполнитель + + + + Local + Локальная + + + + Top 10 + Топ 10 + + + + Offline + Не в сети + + + + All available tracks + Доступные песни + + + + Online + В сети + + + + + Show + Показать + + + + + Hide + Спрятать + + + + SourceInfoWidget + + + Recent Albums + Последние альбомы + + + + Latest Additions + Последние добавленые + + + + Recently Played Tracks + Последние проигрыные песни + + + + New Additions + Последние добавленые + + + + My recent activity + Моя последняя активность + + + + Recent activity from %1 + Последняя активно %1 + + + + SourceItem + + + Collection + Коллекция + + + + Latest Additions + Последние добавленные + + + + Recently Played + Последние воспроизводимые + + + + Loved Tracks + Любимые песни + + + + SuperCollection + Общая коллекция + + + + SourceTreeView + + + &Copy Link + &Скопировать Cсылку + + + + &Delete %1 + &Удалить %1 + + + + &Export Playlist + &Экспорт Плейлиста + + + + Save XSPF + Сохранить XSPF + + + + Playlists (*.xspf) + Плейлисты (*.xspf) + + + + SourcesModel + + + Group + Группа + + + + Collection + Коллекция + + + + Playlist + Плейлист + + + + Automatic Playlist + Автоматический плейлист + + + + Station + Станция + + + + Browse + Просмотреть + + + + Search History + История поиска + + + + My Music + Моя музыка + + + + SuperCollection + Общая коллекция + + + + Top Loved Tracks + Топ любимых песен + + + + Dashboard + Панель + + + + Recently Played + Последние воспроизводимые + + + + Charts + Чарты + + + + Friends + Друзья + + + + SpotifyConfig + + + Form + Форма + + + + Configure your Spotify credentials + + + + + Username: + Имя пользователя: + + + + placeholderUsername + + + + + Password: + Пароль: + + + + placeholderPw + + + + + High Quality Streaming + + + + + This product uses SPOTIFY(R) CORE but is not endorsed, certified or otherwise approved in any way by Spotify. Spotify is the registered trade mark of the Spotify Group. + + + + + StackedSettingsDialog + + + Tomahawk Settings + Настройки + + + + Local Music Information + Информация о локальной коллекции + + + + Path to scan for music files: + Путь по которому сканировать музыку: + + + + The Echo Nest supports keeping track of your catalog metadata + and using it to craft personalized radios. Enabling this option + will allow you (and all your friends) to create automatic playlists + and stations based on your personal taste profile. + + + + + Upload collection list to The Echo Nest to enable user radio + Заргузить список на The Echo Nest, чтобы включить пользовательское радио + + + + Watch for changes + Следить за изменением коллекции + + + + Time between scans, in seconds: + Время между сканированием, в секундах: + + + + Internet Services + + + + + Install from file... + + + + + Filter by capability: + + + + + Advanced Network Settings + Дополнительные настройки сети + + + + If you're having difficulty connecting to peers, try setting this to your external IP address/host name and a port number (default 50210). Make sure to forward that port to this machine! + Если у вас возникли трудности при подключении к друзьям, попробуйте установить ваш внешний IP адрес / имя хоста и номер порта (по умолчанию 50210). Убедитесь в том, что порт сободен на этой машине! + + + + Static Host Name: + Статическое имя хоста: + + + + Static Port: + Статический порт: + + + + Always use static host name/port? (Overrides UPnP discovery/port forwarding) + Всегда используйте статическое имя хоста / порта? (Переопределяет UPnP открытие / перенаправления портов) + + + + Proxy Settings... + Настройки прокси... + + + + Send reports after Tomahawk crashed + Отправить отчет после падения Tomahawk + + + + Allow web browsers to interact with Tomahawk + + + + + Use UPnP to establish port forward + Использовать UPnP для установки портов + + + + Tomahawk::Accounts::AccountDelegate + + + Add Account + Добавить аккаунт + + + + Remove Account + Удалить аккаунт + + + + %1 downloads + + + + + Online + В сети + + + + Connecting... + Соединяюсь... + + + + Offline + Не в сети + + + + Tomahawk::Accounts::GoogleWrapper + + + Configure this Google Account + + + + + Google Address + + + + + Enter your Google login to connect with your friends using Tomahawk! + Введите ваш логин Google, чтобы связаться с друзьями, используя Tomahawk + + + + username@gmail.com + username@gmail.com + + + + Tomahawk::Accounts::GoogleWrapperFactory + + + Connect to Google Talk to find your friends + + + + + Tomahawk::Accounts::GoogleWrapperSip + + + Add Friend + Добавить друга + + + + Enter Google Address: + + + + + Tomahawk::Accounts::LastFmAccountFactory + + + Scrobble your tracks to last.fm, and find freely downloadable tracks to play + + + + + Tomahawk::Accounts::LastFmConfig + + + + Failed + + + + + Success + + + + + Could not contact server + + + + + Tomahawk::Accounts::SpotifyAccountFactory + + + Play music from and sync your playlists with Spotify Premium + + + + + Tomahawk::Accounts::TwitterAccountFactory + + + Connect to your Twitter followers. + + + + + Tomahawk::Accounts::TwitterConfigWidget + + + + + Tweet! + Tweet! + + + + + Status: No saved credentials + + + + + + + Authenticate + + + + + + Status: Credentials saved for %1 + + + + + + De-authenticate + + + + + + + + + + + Tweetin' Error + + + + + The credentials could not be verified. +You may wish to try re-authenticating. + + + + + Status: Error validating credentials + + + + + Global Tweet + + + + + Direct Message + + + + + Send Message! + + + + + @Mention + + + + + Send Mention! + + + + + You must enter a user name for this type of tweet. + + + + + Your saved credentials could not be loaded. +You may wish to try re-authenticating. + + + + + Your saved credentials could not be verified. +You may wish to try re-authenticating. + + + + + + There was an error posting your status -- sorry! + + + + + + Tweeted! + + + + + Your tweet has been posted! + Ваш твит был отправлен! + + + + There was an error posting your direct message -- sorry! + + + + + Your message has been posted! + Ваше сообщение было отправлено! + + + + Tomahawk::Accounts::XmppAccountFactory + + + Log on to your Jabber/XMPP account to connect to your friends + + + + + Tomahawk::Accounts::ZeroconfFactory + + + Automatically connect to Tomahawks on the local network + Автоматическое подключение к Tomahawks в локальной сети + + + + Tomahawk::ContextMenu + + + &Play + &Играть + + + + + + Add to &Queue + Добавить В &Очередь + + + + &Continue playback after this track + + + + + &Stop playback after this track + + + + + + &Love + &Любимая + + + + &Copy Track Link + &Скопировать Ссылку Песни + + + + Show &Album page + &Показать Станицу Альбомов + + + + Show &Artist page + &Показать Станицу Исполнителя(ей) + + + + Un-&Love + &Не Любимая + + + + &Delete Items + &Удалить Песни + + + + &Delete Item + &Удалить Песню + + + + Tomahawk::CustomPlaylistView + + + Top Loved Tracks + Топ любимых песен + + + + Your loved tracks + Ваши любимые песни + + + + %1's loved tracks + %1's любимая песня + + + + The most loved tracks from all your friends + Самые любимые песни от всех ваших друзей + + + + All of your loved tracks + Все любимые песни + + + + All of %1's loved tracks + Все от %1 любимые песни + + + + Tomahawk::DropJobNotifier + + + Fetching %1 from database + Выборка %1 из базы данных + + + + Parsing %1 %2 + Анализирую %1 %2 + + + + Tomahawk::DynamicControlList + + + Click to collapse + Нажмите, чтобы свернуть + + + + Tomahawk::DynamicModel + + + + Could not find a playable track. + +Please change the filters or try again. + Не удалось найти какие-либо песни. + +Пожалуйста, измените фильтры и попробуйте еще раз. + + + + Failed to generate preview with the desired filters + Не удалось создать предварительный просмотр с желаемым фильтры + + + + Tomahawk::DynamicSetupWidget + + + Type: + Тип: + + + + Generate + Создать + + + + Tomahawk::DynamicView + + + Add some filters above to seed this station! + Добавить некоторые фильтры, чтобы увидеть эту станцию​​! + + + + Press Generate to get started! + Нажмите кнопку Создать, чтобы начать! + + + + Add some filters above, and press Generate to get started! + Добавьте несколько фильтров выше, а затем нажмите Создать, чтобы начать! + + + + Tomahawk::DynamicWidget + + + Station ran out of tracks! + +Try tweaking the filters for a new set of songs to play. + + + + + Tomahawk::EchonestControl + + + + + + + + is + + + + + from user + от пользователя + + + + + No users with Echo Nest Catalogs enabled. Try enabling option in Collection settings + + + + + similar to + похожие на + + + + + + + + + + Less + Ьеньше + + + + + + + + + + More + + + + + 0 BPM + 0 BPM + + + + 500 BPM + 500 BPM + + + + 0 secs + 0 сек + + + + 3600 secs + 3600 сек + + + + -100 dB + -100 dB + + + + 100 dB + 100 dB + + + + Major + Основной + + + + Minor + + + + + C + + + + + C Sharp + + + + + D + + + + + E Flat + + + + + E + + + + + F + + + + + F Sharp + + + + + G + + + + + A Flat + + + + + A + + + + + B Flat + + + + + B + + + + + Ascending + + + + + Descending + + + + + Tempo + + + + + Duration + + + + + Loudness + + + + + Artist Familiarity + + + + + Artist Hotttnesss + + + + + Song Hotttnesss + + + + + Latitude + + + + + Longitude + + + + + Mode + + + + + Key + + + + + Energy + + + + + Danceability + + + + + only by ~%1 + + + + + similar to ~%1 + похожие на ~%1 + + + + with genre ~%1 + + + + + + from no one + ни от кого не + + + + My Collection + Моя коллекция + + + + from %1 radio + от %1 радио + + + + with %1 %2 + с %1 %2 + + + + about %1 BPM + + + + + about %n minute(s) long + + + + + about %1 dB + около %1 dB + + + + at around %1%2 %3 + + + + + in %1 + в %1 + + + + in a %1 key + + + + + sorted in %1 %2 order + + + + + with a %1 mood + + + + + in a %1 style + + + + + Tomahawk::EchonestSteerer + + + Steer this station: + Управляй этой станции: + + + + Much less + Гораздо меньше + + + + Less + Менее + + + + A bit less + Чуть меньше + + + + Keep at current + Имейтся в текущих + + + + A bit more + Немного более + + + + More + Более + + + + Much more + Гораздо больше + + + + Tempo + Ритм + + + + Loudness + + + + + Danceability + + + + + Energy + Мощность + + + + Song Hotttnesss + + + + + Artist Hotttnesss + + + + + Artist Familiarity + + + + + By Description + По описанию + + + + Enter a description + Введите описание + + + + Apply steering command + + + + + Reset all steering commands + + + + + Tomahawk::GroovesharkParser + + + Error fetching Grooveshark information from the network! + + + + + Tomahawk::InfoSystem::ChartsPlugin + + + Top Overall + + + + + Artists + Исполнители + + + + Albums + Альбомы + + + + Tracks + Песни + + + + Tomahawk::InfoSystem::LastFmPlugin + + + Top Tracks + Топ песен + + + + Loved Tracks + Любимые песни + + + + Hyped Tracks + + + + + Top Artists + Любимые исполнители + + + + Hyped Artists + + + + + Tomahawk::ItunesParser + + + Error fetching iTunes information from the network! + + + + + Tomahawk::JSPFLoader + + + New Playlist + Новый плейлист + + + + Failed to save tracks + Не удалось сохранить треки + + + + Some tracks in the playlist do not contain an artist and a title. They will be ignored. + Некоторые треки в плейлисте не содержат исполнителя и название. Они будут проигнорированы. + + + + XSPF Error + Ошибка XSPF + + + + This is not a valid XSPF playlist. + Это не является допустимым XSPF плейлистом. + + + + Tomahawk::LatchManager + + + &Catch Up + &Подхватить + + + + + &Listen Along + &Слушать Его + + + + Tomahawk::Query + + + and + + + + + You + Ты + + + + you + ты + + + + and + и + + + + %n other(s) + + + + + %1 people + + + + + loved this track + любимый + + + + Tomahawk::RdioParser + + + Error fetching Rdio information from the network! + + + + + Tomahawk::ShortenedLinkParser + + + Network error parsing shortened link! + + + + + Tomahawk::Source + + + + Scanning (%L1 tracks) + Сканирование (%L1 песни) + + + + Scanning + Сканирую + + + + Checking + Проверяю + + + + Fetching + Выбираю + + + + Parsing + Анализирую + + + + Saving (%1%) + Сохраняю (%1%) + + + + Tomahawk::SpotifyParser + + + Error fetching Spotify information from the network! + + + + + TomahawkApp + + + My Collection + Моя коллекция + + + + TomahawkOAuthTwitter + + + Twitter PIN + Твиттер PIN + + + + After authenticating on Twitter's web site, +enter the displayed PIN number here: + После авторизации в твиттере введите номер PIN сюда: + + + + TomahawkTrayIcon + + + + Hide Tomahawk Window + Спрятать окно Tomahawk + + + + Show Tomahawk Window + Показать окно Tomahawk + + + + Currently not playing. + Не воспроизводится. + + + + Play + Играть + + + + Pause + Пауза + + + + TomahawkWindow + + + Tomahawk + Tomahawk + + + + &Settings + Настройки + + + + &Controls + Управления + + + + &Network + Сеть + + + + &Window + Окно + + + + &Help + Помощь + + + + &Quit + Выйти + + + + Ctrl+Q + Ctrl+Q + + + + Go &Online + Стать онлайн + + + + Add &Friend... + Добавить друга + + + + U&pdate Collection + Обновить коллекцию + + + + Update Collection + Обновить коллекцию + + + + &Configure Tomahawk... + Настроить Tomahawk... + + + + Load &XSPF... + Загрузить XSPF + + + + Create &New Playlist... + Создать Новый Плейлист + + + + About &Tomahawk... + О Tomahawk + + + + Create New &Automatic Playlist + Создать новый автоматический плейлист + + + + Create New &Station + Создать Новую Станцию + + + + Show Offline Sources + Показать офлайн содержимое + + + + Hide Offline Sources + Скрыть офлайн содержимое + + + + Minimize + Скрыть + + + + Ctrl+M + Ctrl+M + + + + Zoom + Увеличить + + + + Meta+Ctrl+Z + Meta+Ctrl+Z + + + + Diagnostics... + Диагностика + + + + Fully &Rescan Collection + Заново &проверить коллекцию + + + + Fully Rescan Collection + Заново проверить коллекцию + + + + + Play + Играть + + + + Space + Пауза + + + + Previous + Предыдущая + + + + Next + Следующая + + + + Global Search... + Глобальный поиск + + + + + Check For Updates... + Проверить обновления... + + + + + + Connect To Peer + Связаться с Peer + + + + Enter peer address: + Введите адрес узла: + + + + Enter peer port: + Введите адрес порта: + + + + Enter peer key: + Введите адрес ключа: + + + + XSPF Error + Ошибка XSPF + + + + This is not a valid XSPF playlist. + Это не является допустимым XSPF плейлистом. + + + + Failed to save tracks + Не удалось сохранить песни + + + + Some tracks in the playlist do not contain an artist and a title. They will be ignored. + Некоторые треки в плейлисте не содержат исполнителя и название. Они будут проигнорированы. + + + + Sorry, there is a problem accessing your audio device or the desired track, current track will be skipped. Make sure you have a suitable Phonon backend and required plugins installed. + + + + + Sorry, there is a problem accessing your audio device or the desired track, current track will be skipped. + + + + + Create New Station + Создать новую станцию + + + + Name: + Имя: + + + + New Station + Новая станция + + + + New Playlist + Новый плейлист + + + + Pause + Пауза + + + + Go &offline + Отключиться + + + + Go &online + Подлючиться + + + + Authentication Error + Ошибка авторизации + + + + %1 by %2 + track, artist name + + + + + %1 - %2 + current track, some window title + + + + + <h2><b>Tomahawk %1<br/>(%2)</h2> + <h2><b>Tomahawk %1<br/>(%2)</h2> + + + + <h2><b>Tomahawk %1</h2> + <h2><b>Tomahawk %1</h2> + + + + Copyright 2010 - 2012<br/>Christian Muehlhaeuser &lt;muesli@tomahawk-player.org&gt;<br/><br/>Thanks to: Leo Franchi, Jeff Mitchell, Dominik Schmidt, Jason Herskowitz, Alejandro Wainzinger, Hugo Lindstr&ouml;m, Michael Zanetti, Harald Sitter and Steve Robertson + Copyright 2010 - 2012<br/>Christian Muehlhaeuser &lt;muesli@tomahawk-player.org&gt;<br/><br/>Thanks to: Leo Franchi, Jeff Mitchell, Dominik Schmidt, Jason Herskowitz, Alejandro Wainzinger, Hugo Lindstr&ouml;m, Michael Zanetti, Harald Sitter and Steve Robertson + + + + About Tomahawk + О Tomahawk + + + + TopBar + + + Form + Форма + + + + 0 Sources + Источники + + + + 0 Tracks + 0 Песни + + + + 0 Artists + 0 Исполнители + + + + 0 Shown + + + + + Tracks + Песни + + + + Artists + Исполнители + + + + Filter + Фильтр + + + + Artist View + Просмотр альбомов + + + + Flat View + + + + + Sources + Источники + + + + Shown + Показанный + + + + TopTracksContext + + + Top Hits + Хиты + + + + TrackModel + + + Artist + Исполнитель + + + + Title + Название + + + + Album + Альбом + + + + Track + Песня + + + + Duration + Длительность + + + + Bitrate + Битрей + + + + Age + Возраст + + + + Year + Год + + + + Size + Размер + + + + Origin + Расположение + + + + Score + Проиграно + + + + Composer + Композитор + + + + TrackView + + + Sorry, your filter '%1' did not match any results. + Ваш поиск '%1' недал результатов. + + + + TransferStatusItem + + + from + из + + + + to + к + + + + TreeItemDelegate + + + Unknown + Неизвестный + + + + TreeModel + + + Name + Имя + + + + Duration + Длительность + + + + Bitrate + Битрей + + + + Age + Возраст + + + + Year + Год + + + + Size + Размер + + + + Origin + Расположение + + + + Composer + Композитор + + + + All Artists + Все исполнители + + + + + My Collection + Моя коллекция + + + + + Collection of %1 + Коллекция из %1 + + + + TwitterConfigWidget + + + Configure this Twitter account + Настройка Твиттер аккаунта + + + + The Twitter plugin allows you to discover and play music from your Twitter friends running Tomahawk and post messages to your account. + Твиттер плагин позволяет вам находить и воспроизводить музыку друзей через Твиттер и посылать сообщения. + + + + Status: No saved credentials + Статус: Нет сохраненных учетных данных + + + + Authenticate with Twitter + Авторизироваться + + + + Twitter Connections + Твиттер соединение + + + + +If you only want to post tweets, you're done. + +If you want to connect Tomahawk to your friends using Twitter, select the type of tweet and press the button below to send a sync message. You must both be following each other as Direct Messages are used. Then be (very) patient -- it can take several minutes! + +You can re-send a sync message at any time simply by sending another tweet using the button. + Если вы хотите посылать твиты, это все. + +Если вы хотите подключиться через Tomahawk к вашим друзьями через Twitter, выбрать тип чириканье и нажмите на кнопку ниже, чтобы отправить сообщение синхронизации. Вы оба должны быть следующими друг за другом, как прямого сообщения используются. Тогда не (очень) пациента - это может занять несколько минут! + +Вы можете повторно отправить сообщение синхронизации в любое время, просто отправив другой твиты с помощью кнопки. + + + + Select the kind of tweet you would like, then press the button to post it: + Выберите вид твита, затем нажмите кнопку, чтобы отправить его: + + + + Global Tweet + Глобальный Твит + + + + @Mention + @ Упоминание + + + + Direct Message + Прямое сообщение + + + + e.g. @tomahawk + например @tomahawk + + + + Send Message + Отправть сообщение + + + + ViewManager + + + SuperCollection + Общая коллекция + + + + Combined libraries of all your online friends + Комбинированные библиотек всех ваших друзей онлайн + + + + All available albums + Доступные альбомы + + + + WelcomeWidget + + + Recent Additions + Последние Добавленные Песни + + + + Newest Stations & Playlists + Последние Станции и Плейлисты + + + + Recently Played Tracks + Последние Воспроизводимые Песни + + + + No recently created playlists in your network. + Нет списков, созданных в последнее время в вашей сети. + + + + Welcome to Tomahawk + Добро пожаловать в Tomahawk + + + + WhatsHotWidget + + + Charts + Чарты + + + + WikipediaContext + + + Wikipedia + Википедия + + + + XMPPBot + + + +Terms for %1: + + +Условия для %1: + + + + No terms found, sorry. + Извините не найдено терминов. + + + + +Hotttness for %1: %2 + + + + + + +Familiarity for %1: %2 + + +Знакомство для %1: %2 + + + + + +Lyrics for "%1" by %2: + +%3 + + +Текст для "%1" by %2: + +%3 + + + + XSPFLoader + + + Failed to parse contents of XSPF playlist + + + + + Some playlist entries were found without artist and track name, they will be omitted + + + + + Failed to fetch the desired playlist from the network, or the desired file does not exist + + + + + New Playlist + Новый Плейлист + + + + XmlConsole + + + Xml stream console + + + + + + Filter + Фильтр + + + + Save log + Сохранить логи + + + + Disabled + Отменить + + + + By JID + По JID + + + + By namespace uri + По имен URI + + + + By all attributes + По всем признакам + + + + Visible stanzas + Видимые строфы + + + + Information query + Информация запроса + + + + Message + Сообщение + + + + Presence + Наличие + + + + Custom + Разный + + + + Close + Закрыть + + + + Save XMPP log to file + Сохранить XMPP лог в файл + + + + OpenDocument Format (*.odf);;HTML file (*.html);;Plain text (*.txt) + OpenDocument Format (*.odf);;HTML файл (*.html);;Обычный текст (*.txt) + + + + XmppConfigWidget + + + Xmpp Configuration + + + + + Configure this Xmpp account + + + + + Enter your Xmpp login to connect with your friends using Tomahawk! + Введите ваш логин Xmpp, чтобы связаться с друзьями, используя Tomahawk + + + + Login Information + Информация о входе + + + + Xmpp ID: + + + + + e.g. user@example.com + + + + + Password: + Пароль: + + + + An account with this name already exists! + + + + + Advanced Xmpp Settings + + + + + Server: + Сервер: + + + + Port: + Порт: + + + + Lots of servers don't support this (e.g. GTalk, jabber.org) + Многие серверы не поддерживают это (например, GTalk, jabber.org) + + + + Publish currently playing track + + + + + Enforce secure connection + Обеспечение безопасного соединения + + + + XmppSipPlugin + + + User Interaction + Взаимодействие с пользователем + + + + Host is unknown + Неизвестный хост + + + + Item not found + Песня не найдена + + + + Authorization Error + + + + + Remote Stream Error + + + + + Remote Connection failed + + + + + Internal Server Error + + + + + System shutdown + + + + + Conflict + + + + + Unknown + + + + + No Compression Support + + + + + No Encryption Support + + + + + No Authorization Support + + + + + No Supported Feature + + + + + Add Friend + + + + + Enter Xmpp ID: + + + + + Add Friend... + + + + + XML Console... + + + + + I'm sorry -- I'm just an automatic presence used by Tomahawk Player (http://gettomahawk.com). If you are getting this message, the person you are trying to reach is probably not signed on, so please try again later! + + + + + Authorize User + + + + + Do you want to grant <b>%1</b> access to your Collection? + + + + + ZeroconfConfig + + + Form + Форма + + + + Local Network configuration + Локальная конфигурация сети + + + + This plugin will automatically find other users running Tomahawk on your local network + Этот плагин автоматически найдет других пользователей, работающих с Tomahawk в вашей локальной сети + + + + Connect automatically when Tomahawk starts + Подключаться автоматически, при старте Tomahawk + + + \ No newline at end of file diff --git a/lang/tomahawk_sv.ts b/lang/tomahawk_sv.ts index 9d4b9ac2b..3814689d4 100644 --- a/lang/tomahawk_sv.ts +++ b/lang/tomahawk_sv.ts @@ -333,17 +333,17 @@ Kom ihåg: Tillåt endast anslutning från klienter du litar på, och som har la AudioEngine - + Tomahawk is stopped. Tomahawk är stoppad. - + Tomahawk is playing "%1" by %2%3. Tomahawk spelar upp "%1" av %2%3. - + on album %1 på album %1 diff --git a/src/accounts/lastfm/lastfmplugin.cpp b/src/accounts/lastfm/lastfmplugin.cpp index 833c1ec71..7e824fa53 100644 --- a/src/accounts/lastfm/lastfmplugin.cpp +++ b/src/accounts/lastfm/lastfmplugin.cpp @@ -127,14 +127,12 @@ LastFmPlugin::getInfo( Tomahawk::InfoSystem::InfoRequestData requestData ) void -LastFmPlugin::pushInfo( QString caller, Tomahawk::InfoSystem::InfoType type, Tomahawk::InfoSystem::PushInfoPair pushInfoPair, Tomahawk::InfoSystem::PushInfoFlags pushFlags ) +LastFmPlugin::pushInfo( Tomahawk::InfoSystem::InfoPushData pushData ) { - Q_UNUSED( caller ) - Q_UNUSED( pushFlags ) - switch ( type ) + switch ( pushData.type ) { case InfoSubmitNowPlaying: - nowPlaying( pushInfoPair.second ); + nowPlaying( pushData.infoPair.second ); break; case InfoSubmitScrobble: @@ -143,7 +141,7 @@ LastFmPlugin::pushInfo( QString caller, Tomahawk::InfoSystem::InfoType type, Tom case InfoLove: case InfoUnLove: - sendLoveSong( type, pushInfoPair.second ); + sendLoveSong( pushData.type, pushData.infoPair.second ); break; default: diff --git a/src/accounts/lastfm/lastfmplugin.h b/src/accounts/lastfm/lastfmplugin.h index 6d84b2b3c..c3c86bb96 100644 --- a/src/accounts/lastfm/lastfmplugin.h +++ b/src/accounts/lastfm/lastfmplugin.h @@ -62,7 +62,7 @@ protected slots: virtual void getInfo( Tomahawk::InfoSystem::InfoRequestData requestData ); virtual void notInCacheSlot( Tomahawk::InfoSystem::InfoStringHash criteria, Tomahawk::InfoSystem::InfoRequestData requestData ); - virtual void pushInfo( QString caller, Tomahawk::InfoSystem::InfoType type, Tomahawk::InfoSystem::PushInfoPair pushInfoPair, Tomahawk::InfoSystem::PushInfoFlags pushFlags ); + virtual void pushInfo( Tomahawk::InfoSystem::InfoPushData pushData ); private: void fetchCoverArt( Tomahawk::InfoSystem::InfoRequestData requestData ); diff --git a/src/accounts/xmpp/XmppInfoPlugin.cpp b/src/accounts/xmpp/XmppInfoPlugin.cpp index 1b7a7c8cc..cebd181e1 100644 --- a/src/accounts/xmpp/XmppInfoPlugin.cpp +++ b/src/accounts/xmpp/XmppInfoPlugin.cpp @@ -64,11 +64,8 @@ Tomahawk::InfoSystem::XmppInfoPlugin::~XmppInfoPlugin() void -Tomahawk::InfoSystem::XmppInfoPlugin::pushInfo( QString caller, Tomahawk::InfoSystem::InfoType type, Tomahawk::InfoSystem::PushInfoPair pushInfoPair, Tomahawk::InfoSystem::PushInfoFlags pushFlags ) +Tomahawk::InfoSystem::XmppInfoPlugin::pushInfo( Tomahawk::InfoSystem::InfoPushData pushData ) { - Q_UNUSED( caller ) - Q_UNUSED( pushFlags ) - tDebug() << Q_FUNC_INFO << m_sipPlugin->m_client->jid().full(); if( m_sipPlugin->m_account->configuration().value("publishtracks").toBool() == false ) @@ -77,12 +74,12 @@ Tomahawk::InfoSystem::XmppInfoPlugin::pushInfo( QString caller, Tomahawk::InfoSy return; } - switch ( type ) + switch ( pushData.type ) { case InfoNowPlaying: case InfoNowResumed: m_pauseTimer.stop(); - audioStarted( pushInfoPair ); + audioStarted( pushData.infoPair ); break; case InfoNowPaused: m_pauseTimer.start( PAUSE_TIMEOUT * 1000 ); diff --git a/src/accounts/xmpp/XmppInfoPlugin.h b/src/accounts/xmpp/XmppInfoPlugin.h index 96f515381..223167524 100644 --- a/src/accounts/xmpp/XmppInfoPlugin.h +++ b/src/accounts/xmpp/XmppInfoPlugin.h @@ -47,7 +47,7 @@ namespace Tomahawk { void notInCacheSlot( const Tomahawk::InfoSystem::InfoStringHash criteria, Tomahawk::InfoSystem::InfoRequestData requestData ); protected slots: - void pushInfo( QString caller, Tomahawk::InfoSystem::InfoType type, Tomahawk::InfoSystem::PushInfoPair pushInfoPair, Tomahawk::InfoSystem::PushInfoFlags pushFlags ); + void pushInfo( Tomahawk::InfoSystem::InfoPushData pushData ); void getInfo( Tomahawk::InfoSystem::InfoRequestData requestData ); private slots: diff --git a/src/audiocontrols.cpp b/src/audiocontrols.cpp index 64190e9bc..b53c5dd33 100644 --- a/src/audiocontrols.cpp +++ b/src/audiocontrols.cpp @@ -93,14 +93,12 @@ AudioControls::AudioControls( QWidget* parent ) ui->metaDataArea->setStyleSheet( "QWidget#metaDataArea {\nborder-width: 4px;\nborder-image: url(" RESPATH "images/now-playing-panel.png) 4 4 4 4 stretch stretch; }" ); ui->seekSlider->setEnabled( true ); + ui->seekSlider->setTimeLine( &m_sliderTimeLine ); ui->volumeSlider->setRange( 0, 100 ); ui->volumeSlider->setValue( AudioEngine::instance()->volume() ); m_phononTickCheckTimer.setSingleShot( true ); - m_sliderTimeLine.setCurveShape( QTimeLine::LinearCurve ); - ui->seekSlider->setTimeLine( &m_sliderTimeLine ); - connect( &m_phononTickCheckTimer, SIGNAL( timeout() ), SLOT( phononTickCheckTimeout() ) ); connect( &m_sliderTimeLine, SIGNAL( frameChanged( int ) ), ui->seekSlider, SLOT( setValue( int ) ) ); @@ -200,17 +198,22 @@ AudioControls::onPlaybackStarted( const Tomahawk::result_ptr& result ) ui->seekSlider->setRange( 0, duration ); ui->seekSlider->setValue( 0 ); + ui->seekSlider->setEnabled( AudioEngine::instance()->canSeek() ); m_phononTickCheckTimer.stop(); m_sliderTimeLine.stop(); m_sliderTimeLine.setDuration( duration ); m_sliderTimeLine.setFrameRange( 0, duration ); + m_sliderTimeLine.setCurveShape( QTimeLine::LinearCurve ); m_sliderTimeLine.setCurrentTime( 0 ); m_seekMsecs = -1; - + ui->seekSlider->setVisible( true ); + int updateRate = (double)1000 / ( (double)ui->seekSlider->contentsRect().width() / (double)( duration / 1000 ) ); + m_sliderTimeLine.setUpdateInterval( qBound( 40, updateRate, 500 ) ); + m_noTimeChange = false; m_lastSliderCheck = 0; } @@ -380,10 +383,11 @@ AudioControls::onPlaybackTimer( qint64 msElapsed ) if ( sender() != &m_phononTickCheckTimer ) m_phononTickCheckTimer.start( 1000 ); - + + int currentTime = m_sliderTimeLine.currentTime(); if ( m_noTimeChange ) { - if ( m_sliderTimeLine.currentTime() != msElapsed ) + if ( currentTime != msElapsed ) { m_sliderTimeLine.setPaused( true ); m_noTimeChange = false; @@ -392,12 +396,12 @@ AudioControls::onPlaybackTimer( qint64 msElapsed ) m_sliderTimeLine.resume(); } } - else if ( m_sliderTimeLine.currentTime() >= msElapsed || m_seekMsecs != -1 ) + else if ( currentTime >= msElapsed || m_seekMsecs != -1 ) { m_sliderTimeLine.setPaused( true ); m_noTimeChange = false; - if ( m_sliderTimeLine.currentTime() == msElapsed ) + if ( currentTime == msElapsed ) m_noTimeChange = true; m_sliderTimeLine.setCurrentTime( msElapsed ); @@ -407,12 +411,10 @@ AudioControls::onPlaybackTimer( qint64 msElapsed ) } else if ( m_sliderTimeLine.duration() > msElapsed && m_sliderTimeLine.state() == QTimeLine::NotRunning && AudioEngine::instance()->state() == AudioEngine::Playing ) { - ui->seekSlider->setEnabled( AudioEngine::instance()->canSeek() ); m_sliderTimeLine.start(); } else if ( m_sliderTimeLine.state() == QTimeLine::Paused && AudioEngine::instance()->state() != AudioEngine::Paused ) { - ui->seekSlider->setEnabled( AudioEngine::instance()->canSeek() ); m_sliderTimeLine.resume(); } diff --git a/src/libtomahawk/audio/audioengine.cpp b/src/libtomahawk/audio/audioengine.cpp index 31129bc0e..cfa7ceb66 100644 --- a/src/libtomahawk/audio/audioengine.cpp +++ b/src/libtomahawk/audio/audioengine.cpp @@ -132,7 +132,9 @@ AudioEngine::play() if ( isPaused() ) { + setVolume( m_volume ); m_mediaObject->play(); + setVolume( m_volume ); emit resumed(); if ( TomahawkSettings::instance()->privateListeningMode() != TomahawkSettings::FullyPrivate ) @@ -145,11 +147,12 @@ AudioEngine::play() trackInfo["albumpos"] = QString::number( m_currentTrack->albumpos() ); trackInfo["duration"] = QString::number( m_currentTrack->duration() ); - - Tomahawk::InfoSystem::InfoSystem::instance()->pushInfo( + Tomahawk::InfoSystem::InfoPushData pushData ( s_aeInfoIdentifier, Tomahawk::InfoSystem::InfoNowResumed, QVariant::fromValue< Tomahawk::InfoSystem::InfoStringHash >( trackInfo ), Tomahawk::InfoSystem::PushNoFlag ); + + Tomahawk::InfoSystem::InfoSystem::instance()->pushInfo( pushData ); } } else @@ -162,10 +165,11 @@ AudioEngine::pause() { tDebug( LOGEXTRA ) << Q_FUNC_INFO; + m_volume = volume(); m_mediaObject->pause(); emit paused(); - Tomahawk::InfoSystem::InfoSystem::instance()->pushInfo( s_aeInfoIdentifier, Tomahawk::InfoSystem::InfoNowPaused, QVariant(), Tomahawk::InfoSystem::PushNoFlag ); + Tomahawk::InfoSystem::InfoSystem::instance()->pushInfo( Tomahawk::InfoSystem::InfoPushData( s_aeInfoIdentifier, Tomahawk::InfoSystem::InfoNowPaused, QVariant(), Tomahawk::InfoSystem::PushNoFlag ) ); } @@ -331,10 +335,12 @@ AudioEngine::sendWaitingNotificationSlot() const QVariantMap retryInfo; retryInfo["message"] = QString( "The current track could not be resolved. Tomahawk will pick back up with the next resolvable track from this source." ); - Tomahawk::InfoSystem::InfoSystem::instance()->pushInfo( + Tomahawk::InfoSystem::InfoPushData pushData ( s_aeInfoIdentifier, Tomahawk::InfoSystem::InfoNotifyUser, QVariant::fromValue< QVariantMap >( retryInfo ), Tomahawk::InfoSystem::PushNoFlag ); + + Tomahawk::InfoSystem::InfoSystem::instance()->pushInfo( pushData ); } @@ -380,10 +386,12 @@ AudioEngine::onNowPlayingInfoReady() #endif } - Tomahawk::InfoSystem::InfoSystem::instance()->pushInfo( + Tomahawk::InfoSystem::InfoPushData pushData ( s_aeInfoIdentifier, Tomahawk::InfoSystem::InfoNotifyUser, QVariant::fromValue< QVariantMap >( playInfo ), Tomahawk::InfoSystem::PushNoFlag ); + + Tomahawk::InfoSystem::InfoSystem::instance()->pushInfo( pushData ); } @@ -475,11 +483,13 @@ AudioEngine::loadTrack( const Tomahawk::result_ptr& result ) trackInfo["duration"] = QString::number( m_currentTrack->duration() ); trackInfo["albumpos"] = QString::number( m_currentTrack->albumpos() ); - Tomahawk::InfoSystem::InfoSystem::instance()->pushInfo( + Tomahawk::InfoSystem::InfoPushData pushData ( s_aeInfoIdentifier, Tomahawk::InfoSystem::InfoNowPlaying, QVariant::fromValue< Tomahawk::InfoSystem::InfoStringHash >( trackInfo ), Tomahawk::InfoSystem::PushShortUrlFlag ); + + Tomahawk::InfoSystem::InfoSystem::instance()->pushInfo( pushData ); } } } diff --git a/src/libtomahawk/audio/audioengine.h b/src/libtomahawk/audio/audioengine.h index 4928fd6c4..345572401 100644 --- a/src/libtomahawk/audio/audioengine.h +++ b/src/libtomahawk/audio/audioengine.h @@ -160,6 +160,7 @@ private: mutable QStringList m_supportedMimeTypes; AudioState m_state; + unsigned int m_volume; static AudioEngine* s_instance; }; diff --git a/src/libtomahawk/globalactionmanager.cpp b/src/libtomahawk/globalactionmanager.cpp index 03053f7ee..d0bdc0d72 100644 --- a/src/libtomahawk/globalactionmanager.cpp +++ b/src/libtomahawk/globalactionmanager.cpp @@ -123,12 +123,12 @@ GlobalActionManager::openLink( const QString& title, const QString& artist, cons void -GlobalActionManager::shortenLink( const QUrl& url, const QVariantMap &callbackMap ) +GlobalActionManager::shortenLink( const QUrl& url, const QVariant &callbackObj ) { if ( QThread::currentThread() != thread() ) { qDebug() << "Reinvoking in correct thread:" << Q_FUNC_INFO; - QMetaObject::invokeMethod( this, "shortenLink", Qt::QueuedConnection, Q_ARG( QUrl, url ), Q_ARG( QVariantMap, callbackMap ) ); + QMetaObject::invokeMethod( this, "shortenLink", Qt::QueuedConnection, Q_ARG( QUrl, url ), Q_ARG( QVariant, callbackObj ) ); return; } @@ -136,8 +136,8 @@ GlobalActionManager::shortenLink( const QUrl& url, const QVariantMap &callbackMa request.setUrl( url ); QNetworkReply *reply = TomahawkUtils::nam()->get( request ); - if ( !callbackMap.empty() ) - reply->setProperty( "callbackMap", callbackMap ); + if ( !callbackObj.isValid() ) + reply->setProperty( "callbackobj", callbackObj ); connect( reply, SIGNAL( finished() ), SLOT( shortenLinkRequestFinished() ) ); connect( reply, SIGNAL( error( QNetworkReply::NetworkError ) ), SLOT( shortenLinkRequestError( QNetworkReply::NetworkError ) ) ); } @@ -900,9 +900,9 @@ GlobalActionManager::shortenLinkRequestFinished() return; } - QVariantMap callbackMap; - if ( reply->property( "callbackMap" ).canConvert< QVariantMap >() && !reply->property( "callbackMap" ).toMap().isEmpty() ) - callbackMap = reply->property( "callbackMap" ).toMap(); + QVariant callbackObj; + if ( reply->property( "callbackobj" ).canConvert< QVariant >() && reply->property( "callbackobj" ).isValid() ) + callbackObj = reply->property( "callbackobj" ); // Check for the redirect attribute, as this should be the shortened link QVariant urlVariant = reply->attribute( QNetworkRequest::RedirectionTargetAttribute ); @@ -932,9 +932,9 @@ GlobalActionManager::shortenLinkRequestFinished() else { if ( !error ) - emit shortLinkReady( longUrl, shortUrl, callbackMap ); + emit shortLinkReady( longUrl, shortUrl, callbackObj ); else - emit shortLinkReady( longUrl, longUrl, callbackMap ); + emit shortLinkReady( longUrl, longUrl, callbackObj ); } reply->deleteLater(); diff --git a/src/libtomahawk/globalactionmanager.h b/src/libtomahawk/globalactionmanager.h index da8ad246f..5b0a72017 100644 --- a/src/libtomahawk/globalactionmanager.h +++ b/src/libtomahawk/globalactionmanager.h @@ -56,7 +56,7 @@ public: void savePlaylistToFile( const Tomahawk::playlist_ptr& playlist, const QString& filename ); public slots: - void shortenLink( const QUrl& url, const QVariantMap &callbackMap = QVariantMap() ); + void shortenLink( const QUrl& url, const QVariant &callbackObj = QVariant() ); bool parseTomahawkLink( const QString& link ); void waitingForResolved( bool ); @@ -67,7 +67,7 @@ public slots: void handlePlayTrack( const Tomahawk::query_ptr& qry ); signals: - void shortLinkReady( QUrl longUrl, QUrl shortUrl, QVariantMap callbackMap ) const; + void shortLinkReady( QUrl longUrl, QUrl shortUrl, QVariant callbackObj ) const; private slots: void shortenLinkRequestFinished(); diff --git a/src/libtomahawk/infosystem/infoplugins/generic/RoviPlugin.h b/src/libtomahawk/infosystem/infoplugins/generic/RoviPlugin.h index e6ac23186..55ebc31cf 100644 --- a/src/libtomahawk/infosystem/infoplugins/generic/RoviPlugin.h +++ b/src/libtomahawk/infosystem/infoplugins/generic/RoviPlugin.h @@ -42,12 +42,9 @@ public: protected: virtual void notInCacheSlot( Tomahawk::InfoSystem::InfoStringHash criteria, Tomahawk::InfoSystem::InfoRequestData requestData ); - virtual void pushInfo( QString caller, Tomahawk::InfoSystem::InfoType type, Tomahawk::InfoSystem::PushInfoPair pushInfoPair, Tomahawk::InfoSystem::PushInfoFlags pushFlags ) + virtual void pushInfo( Tomahawk::InfoSystem::InfoPushData pushData ) { - Q_UNUSED( caller ) - Q_UNUSED( type) - Q_UNUSED( pushInfoPair ) - Q_UNUSED( pushFlags ) + Q_UNUSED( pushData ); } virtual void getInfo( Tomahawk::InfoSystem::InfoRequestData requestData ); diff --git a/src/libtomahawk/infosystem/infoplugins/generic/chartsplugin.h b/src/libtomahawk/infosystem/infoplugins/generic/chartsplugin.h index 57c4f7b78..0bebb4629 100644 --- a/src/libtomahawk/infosystem/infoplugins/generic/chartsplugin.h +++ b/src/libtomahawk/infosystem/infoplugins/generic/chartsplugin.h @@ -60,12 +60,9 @@ protected slots: virtual void getInfo( Tomahawk::InfoSystem::InfoRequestData requestData ); virtual void notInCacheSlot( Tomahawk::InfoSystem::InfoStringHash criteria, Tomahawk::InfoSystem::InfoRequestData requestData ); - virtual void pushInfo( QString caller, Tomahawk::InfoSystem::InfoType type, Tomahawk::InfoSystem::PushInfoPair pushInfoPair, Tomahawk::InfoSystem::PushInfoFlags pushFlags ) + virtual void pushInfo( Tomahawk::InfoSystem::InfoPushData pushData ) { - Q_UNUSED( caller ) - Q_UNUSED( type) - Q_UNUSED( pushInfoPair ) - Q_UNUSED( pushFlags ) + Q_UNUSED( pushData ); } private: diff --git a/src/libtomahawk/infosystem/infoplugins/generic/echonestplugin.h b/src/libtomahawk/infosystem/infoplugins/generic/echonestplugin.h index 92251de36..6778c12dc 100644 --- a/src/libtomahawk/infosystem/infoplugins/generic/echonestplugin.h +++ b/src/libtomahawk/infosystem/infoplugins/generic/echonestplugin.h @@ -49,12 +49,9 @@ public: protected slots: virtual void getInfo( Tomahawk::InfoSystem::InfoRequestData requestData ); - virtual void pushInfo( QString caller, Tomahawk::InfoSystem::InfoType type, Tomahawk::InfoSystem::PushInfoPair pushInfoPair, Tomahawk::InfoSystem::PushInfoFlags pushFlags ) + virtual void pushInfo( Tomahawk::InfoSystem::InfoPushData pushData ) { - Q_UNUSED( caller ) - Q_UNUSED( type) - Q_UNUSED( pushInfoPair ) - Q_UNUSED( pushFlags ) + Q_UNUSED( pushData ); } virtual void notInCacheSlot( Tomahawk::InfoSystem::InfoStringHash criteria, Tomahawk::InfoSystem::InfoRequestData requestData ) diff --git a/src/libtomahawk/infosystem/infoplugins/generic/hypemPlugin.h b/src/libtomahawk/infosystem/infoplugins/generic/hypemPlugin.h index 9ad833a01..1aefb6c37 100644 --- a/src/libtomahawk/infosystem/infoplugins/generic/hypemPlugin.h +++ b/src/libtomahawk/infosystem/infoplugins/generic/hypemPlugin.h @@ -58,12 +58,9 @@ public slots: protected slots: virtual void getInfo( Tomahawk::InfoSystem::InfoRequestData requestData ); virtual void notInCacheSlot( Tomahawk::InfoSystem::InfoStringHash criteria, Tomahawk::InfoSystem::InfoRequestData requestData ); - virtual void pushInfo( QString caller, Tomahawk::InfoSystem::InfoType type, Tomahawk::InfoSystem::PushInfoPair pushInfoPair, Tomahawk::InfoSystem::PushInfoFlags pushFlags ) + virtual void pushInfo( Tomahawk::InfoSystem::InfoPushData pushData ) { - Q_UNUSED( caller ) - Q_UNUSED( type) - Q_UNUSED( pushInfoPair ) - Q_UNUSED( pushFlags ) + Q_UNUSED( pushData ); } diff --git a/src/libtomahawk/infosystem/infoplugins/generic/musicbrainzPlugin.h b/src/libtomahawk/infosystem/infoplugins/generic/musicbrainzPlugin.h index c3e485553..a72cf29e7 100644 --- a/src/libtomahawk/infosystem/infoplugins/generic/musicbrainzPlugin.h +++ b/src/libtomahawk/infosystem/infoplugins/generic/musicbrainzPlugin.h @@ -43,12 +43,9 @@ protected slots: virtual void getInfo( Tomahawk::InfoSystem::InfoRequestData requestData ); virtual void notInCacheSlot( InfoStringHash criteria, InfoRequestData requestData ); - virtual void pushInfo( QString caller, Tomahawk::InfoSystem::InfoType type, Tomahawk::InfoSystem::PushInfoPair pushInfoPair, Tomahawk::InfoSystem::PushInfoFlags pushFlags ) + virtual void pushInfo( Tomahawk::InfoSystem::InfoPushData pushData ) { - Q_UNUSED( caller ) - Q_UNUSED( type) - Q_UNUSED( pushInfoPair ) - Q_UNUSED( pushFlags ) + Q_UNUSED( pushData ); } diff --git a/src/libtomahawk/infosystem/infoplugins/generic/musixmatchplugin.h b/src/libtomahawk/infosystem/infoplugins/generic/musixmatchplugin.h index 407fd6ee7..baac17970 100644 --- a/src/libtomahawk/infosystem/infoplugins/generic/musixmatchplugin.h +++ b/src/libtomahawk/infosystem/infoplugins/generic/musixmatchplugin.h @@ -46,12 +46,9 @@ public slots: protected slots: virtual void getInfo( Tomahawk::InfoSystem::InfoRequestData requestData ); - virtual void pushInfo( QString caller, Tomahawk::InfoSystem::InfoType type, Tomahawk::InfoSystem::PushInfoPair pushInfoPair, Tomahawk::InfoSystem::PushInfoFlags pushFlags ) + virtual void pushInfo( Tomahawk::InfoSystem::InfoPushData pushData ) { - Q_UNUSED( caller ) - Q_UNUSED( type) - Q_UNUSED( pushInfoPair ) - Q_UNUSED( pushFlags ) + Q_UNUSED( pushData ); } virtual void notInCacheSlot( Tomahawk::InfoSystem::InfoStringHash criteria, Tomahawk::InfoSystem::InfoRequestData requestData ) diff --git a/src/libtomahawk/infosystem/infoplugins/generic/spotifyPlugin.h b/src/libtomahawk/infosystem/infoplugins/generic/spotifyPlugin.h index 644bbf383..c3c944462 100644 --- a/src/libtomahawk/infosystem/infoplugins/generic/spotifyPlugin.h +++ b/src/libtomahawk/infosystem/infoplugins/generic/spotifyPlugin.h @@ -58,12 +58,9 @@ public slots: protected slots: virtual void getInfo( Tomahawk::InfoSystem::InfoRequestData requestData ); virtual void notInCacheSlot( Tomahawk::InfoSystem::InfoStringHash criteria, Tomahawk::InfoSystem::InfoRequestData requestData ); - virtual void pushInfo( QString caller, Tomahawk::InfoSystem::InfoType type, Tomahawk::InfoSystem::PushInfoPair pushInfoPair, Tomahawk::InfoSystem::PushInfoFlags pushFlags ) + virtual void pushInfo( Tomahawk::InfoSystem::InfoPushData pushData ) { - Q_UNUSED( caller ) - Q_UNUSED( type) - Q_UNUSED( pushInfoPair ) - Q_UNUSED( pushFlags ) + Q_UNUSED( pushData ); } private: diff --git a/src/libtomahawk/infosystem/infoplugins/mac/adiumplugin.cpp b/src/libtomahawk/infosystem/infoplugins/mac/adiumplugin.cpp index 7502e8525..ca3180619 100644 --- a/src/libtomahawk/infosystem/infoplugins/mac/adiumplugin.cpp +++ b/src/libtomahawk/infosystem/infoplugins/mac/adiumplugin.cpp @@ -101,23 +101,23 @@ AdiumPlugin::settingsChanged() void -AdiumPlugin::pushInfo( QString caller, Tomahawk::InfoSystem::InfoType type, Tomahawk::InfoSystem::PushInfoPair pushInfoPair, Tomahawk::InfoSystem::PushInfoFlags pushFlags ) +AdiumPlugin::pushInfo( Tomahawk::InfoSystem::InfoPushData pushData ) { qDebug() << Q_FUNC_INFO; if( !m_active ) return; - switch ( type ) + switch ( pushData.type ) { case InfoNowPlaying: - audioStarted( pushInfoPair ); + audioStarted( pushData.infoPair ); break; case InfoNowPaused: audioPaused(); return; case InfoNowResumed: - audioResumed( pushInfoPair ); + audioResumed( pushData.infoPair ); break; case InfoNowStopped: audioStopped(); diff --git a/src/libtomahawk/infosystem/infoplugins/mac/adiumplugin.h b/src/libtomahawk/infosystem/infoplugins/mac/adiumplugin.h index 1238d4d11..b606cf950 100644 --- a/src/libtomahawk/infosystem/infoplugins/mac/adiumplugin.h +++ b/src/libtomahawk/infosystem/infoplugins/mac/adiumplugin.h @@ -47,7 +47,7 @@ protected slots: Q_UNUSED( requestData ); } - void pushInfo( QString caller, Tomahawk::InfoSystem::InfoType type, Tomahawk::InfoSystem::PushInfoPair pushInfoPair, Tomahawk::InfoSystem::PushInfoFlags pushFlags ); + virtual void pushInfo( Tomahawk::InfoSystem::InfoPushData pushData ); public slots: virtual void notInCacheSlot( const Tomahawk::InfoSystem::InfoStringHash criteria, Tomahawk::InfoSystem::InfoRequestData requestData ) diff --git a/src/libtomahawk/infosystem/infoplugins/unix/fdonotifyplugin.cpp b/src/libtomahawk/infosystem/infoplugins/unix/fdonotifyplugin.cpp index fb82fc4a2..b62ffc6e7 100644 --- a/src/libtomahawk/infosystem/infoplugins/unix/fdonotifyplugin.cpp +++ b/src/libtomahawk/infosystem/infoplugins/unix/fdonotifyplugin.cpp @@ -63,18 +63,16 @@ FdoNotifyPlugin::~FdoNotifyPlugin() } void -FdoNotifyPlugin::pushInfo( QString caller, Tomahawk::InfoSystem::InfoType type, Tomahawk::InfoSystem::PushInfoPair pushInfoPair, Tomahawk::InfoSystem::PushInfoFlags pushFlags ) +FdoNotifyPlugin::pushInfo( Tomahawk::InfoSystem::InfoPushData pushData ) { - Q_UNUSED( caller ); - Q_UNUSED( pushFlags ); qDebug() << Q_FUNC_INFO; - QVariant pushData = pushInfoPair.second; - if ( type != Tomahawk::InfoSystem::InfoNotifyUser || !pushData.canConvert< QVariantMap >() ) + QVariant inputData = pushData.infoPair.second; + if ( pushData.type != Tomahawk::InfoSystem::InfoNotifyUser || !inputData.canConvert< QVariantMap >() ) { qDebug() << Q_FUNC_INFO << " not the right type or could not convert the hash"; return; } - QVariantMap hash = pushData.value< QVariantMap >(); + QVariantMap hash = inputData.value< QVariantMap >(); if ( !hash.contains( "message" ) ) { qDebug() << Q_FUNC_INFO << " hash did not contain a message"; diff --git a/src/libtomahawk/infosystem/infoplugins/unix/fdonotifyplugin.h b/src/libtomahawk/infosystem/infoplugins/unix/fdonotifyplugin.h index 6b513f766..de24f8dda 100644 --- a/src/libtomahawk/infosystem/infoplugins/unix/fdonotifyplugin.h +++ b/src/libtomahawk/infosystem/infoplugins/unix/fdonotifyplugin.h @@ -42,7 +42,7 @@ protected slots: Q_UNUSED( requestData ); } - virtual void pushInfo( QString caller, Tomahawk::InfoSystem::InfoType type, Tomahawk::InfoSystem::PushInfoPair pushInfoPair, Tomahawk::InfoSystem::PushInfoFlags pushFlags ); + virtual void pushInfo( Tomahawk::InfoSystem::InfoPushData pushData ); virtual void notInCacheSlot( Tomahawk::InfoSystem::InfoStringHash criteria, Tomahawk::InfoSystem::InfoRequestData requestData ) { diff --git a/src/libtomahawk/infosystem/infoplugins/unix/mprisplugin.cpp b/src/libtomahawk/infosystem/infoplugins/unix/mprisplugin.cpp index cb9ef87e6..9db9f72f7 100644 --- a/src/libtomahawk/infosystem/infoplugins/unix/mprisplugin.cpp +++ b/src/libtomahawk/infosystem/infoplugins/unix/mprisplugin.cpp @@ -469,17 +469,15 @@ MprisPlugin::getInfo( Tomahawk::InfoSystem::InfoRequestData requestData ) void -MprisPlugin::pushInfo( QString caller, Tomahawk::InfoSystem::InfoType type, Tomahawk::InfoSystem::PushInfoPair pushInfoPair, Tomahawk::InfoSystem::PushInfoFlags pushFlags ) +MprisPlugin::pushInfo( Tomahawk::InfoSystem::InfoPushData pushData ) { - Q_UNUSED( caller ); - Q_UNUSED( pushFlags ); bool isPlayingInfo = false; - switch ( type ) + switch ( pushData.type ) { case InfoNowPlaying: isPlayingInfo = true; - audioStarted( pushInfoPair.second ); + audioStarted( pushData.infoPair.second ); break; case InfoNowPaused: isPlayingInfo = true; @@ -487,7 +485,7 @@ MprisPlugin::pushInfo( QString caller, Tomahawk::InfoSystem::InfoType type, Toma break; case InfoNowResumed: isPlayingInfo = true; - audioResumed( pushInfoPair.second ); + audioResumed( pushData.infoPair.second ); break; case InfoNowStopped: isPlayingInfo = true; diff --git a/src/libtomahawk/infosystem/infoplugins/unix/mprisplugin.h b/src/libtomahawk/infosystem/infoplugins/unix/mprisplugin.h index f8db49d87..33155cfc1 100644 --- a/src/libtomahawk/infosystem/infoplugins/unix/mprisplugin.h +++ b/src/libtomahawk/infosystem/infoplugins/unix/mprisplugin.h @@ -141,7 +141,7 @@ public slots: protected slots: void getInfo( Tomahawk::InfoSystem::InfoRequestData requestData ); - void pushInfo( QString caller, Tomahawk::InfoSystem::InfoType type, Tomahawk::InfoSystem::PushInfoPair pushInfoPair, Tomahawk::InfoSystem::PushInfoFlags pushFlags ); + void pushInfo( Tomahawk::InfoSystem::InfoPushData pushData ); private slots: void stateChanged( AudioState newState, AudioState oldState ); diff --git a/src/libtomahawk/infosystem/infosystem.cpp b/src/libtomahawk/infosystem/infosystem.cpp index 94c62fd6f..c1f6c020b 100644 --- a/src/libtomahawk/infosystem/infosystem.cpp +++ b/src/libtomahawk/infosystem/infosystem.cpp @@ -172,17 +172,18 @@ InfoSystem::getInfo( const QString &caller, const QVariantMap &customData, const bool -InfoSystem::pushInfo( const QString &caller, const InfoType type, const QVariant& input, const PushInfoFlags pushFlags ) +InfoSystem::pushInfo( InfoPushData pushData ) { - tDebug() << Q_FUNC_INFO << "type is " << type; + tDebug() << Q_FUNC_INFO << "type is " << pushData.type; if ( !m_inited || !m_infoSystemWorkerThreadController->worker() ) { init(); return false; } - PushInfoPair currPair( QVariantMap(), input ); - QMetaObject::invokeMethod( m_infoSystemWorkerThreadController->worker(), "pushInfo", Qt::QueuedConnection, Q_ARG( QString, caller ), Q_ARG( Tomahawk::InfoSystem::InfoType, type ), Q_ARG( Tomahawk::InfoSystem::PushInfoPair, currPair ), Q_ARG( Tomahawk::InfoSystem::PushInfoFlags, pushFlags ) ); + PushInfoPair pushInfoPair( QVariantMap(), pushData.input ); + pushData.infoPair = pushInfoPair; + QMetaObject::invokeMethod( m_infoSystemWorkerThreadController->worker(), "pushInfo", Qt::QueuedConnection, Q_ARG( Tomahawk::InfoSystem::InfoPushData, pushData ) ); return true; } @@ -199,8 +200,9 @@ InfoSystem::pushInfo( const QString &caller, const InfoTypeMap &input, const Pus Q_FOREACH( InfoType type, input.keys() ) { - PushInfoPair currPair( QVariantMap(), input[ type ] ); - QMetaObject::invokeMethod( m_infoSystemWorkerThreadController->worker(), "pushInfo", Qt::QueuedConnection, Q_ARG( QString, caller ), Q_ARG( Tomahawk::InfoSystem::InfoType, type ), Q_ARG( Tomahawk::InfoSystem::PushInfoPair, currPair ), Q_ARG( Tomahawk::InfoSystem::PushInfoFlags, pushFlags ) ); + InfoPushData pushData( caller, type, input[ type ], pushFlags ); + pushData.infoPair = PushInfoPair( QVariantMap(), pushData.input ); + QMetaObject::invokeMethod( m_infoSystemWorkerThreadController->worker(), "pushInfo", Qt::QueuedConnection, Q_ARG( Tomahawk::InfoSystem::InfoPushData, pushData ) ); } return true; diff --git a/src/libtomahawk/infosystem/infosystem.h b/src/libtomahawk/infosystem/infosystem.h index 1f6cbf418..dacbae5a7 100644 --- a/src/libtomahawk/infosystem/infosystem.h +++ b/src/libtomahawk/infosystem/infosystem.h @@ -131,6 +131,13 @@ enum InfoType { // as items are saved in cache, mark them here to not change the InfoLastInfo = 101 //WARNING: *ALWAYS* keep this last! }; + +typedef QMap< InfoType, QVariant > InfoTypeMap; +typedef QMap< InfoType, uint > InfoTimeoutMap; +typedef QHash< QString, QString > InfoStringHash; +typedef QPair< QVariantMap, QVariant > PushInfoPair; + + struct InfoRequestData { quint64 requestId; quint64 internalId; //do not assign to this; it may get overwritten by the InfoSystem @@ -164,10 +171,32 @@ struct InfoRequestData { {} }; -typedef QMap< InfoType, QVariant > InfoTypeMap; -typedef QMap< InfoType, uint > InfoTimeoutMap; -typedef QHash< QString, QString > InfoStringHash; -typedef QPair< QVariantMap, QVariant > PushInfoPair; + +struct InfoPushData { + QString caller; + InfoType type; + QVariant input; + PushInfoFlags pushFlags; + PushInfoPair infoPair; + + InfoPushData() + : caller( QString() ) + , type( Tomahawk::InfoSystem::InfoNoInfo ) + , input( QVariant() ) + , pushFlags( Tomahawk::InfoSystem::PushNoFlag ) + , infoPair( Tomahawk::InfoSystem::PushInfoPair( QVariantMap(), QVariant() ) ) + {} + + InfoPushData( const QString &callr, const Tomahawk::InfoSystem::InfoType typ, const QVariant &inputvar, const Tomahawk::InfoSystem::PushInfoFlags pflags ) + : caller( callr ) + , type( typ ) + , input( inputvar ) + , pushFlags( pflags ) + , infoPair( Tomahawk::InfoSystem::PushInfoPair( QVariantMap(), QVariant() ) ) + {} + +}; + class DLLEXPORT InfoPlugin : public QObject { @@ -189,7 +218,7 @@ signals: protected slots: virtual void getInfo( Tomahawk::InfoSystem::InfoRequestData requestData ) = 0; - virtual void pushInfo( QString caller, Tomahawk::InfoSystem::InfoType type, Tomahawk::InfoSystem::PushInfoPair pushInfoPair, Tomahawk::InfoSystem::PushInfoFlags pushFlags ) = 0; + virtual void pushInfo( Tomahawk::InfoSystem::InfoPushData pushData ) = 0; virtual void notInCacheSlot( Tomahawk::InfoSystem::InfoStringHash criteria, Tomahawk::InfoSystem::InfoRequestData requestData ) = 0; protected: @@ -201,6 +230,7 @@ private: friend class InfoSystem; }; + typedef QWeakPointer< InfoPlugin > InfoPluginPtr; class InfoSystemCacheThread : public QThread @@ -218,6 +248,7 @@ private: QWeakPointer< InfoSystemCache > m_cache; }; + class InfoSystemWorkerThread : public QThread { Q_OBJECT @@ -233,6 +264,7 @@ private: QWeakPointer< InfoSystemWorker > m_worker; }; + class DLLEXPORT InfoSystem : public QObject { Q_OBJECT @@ -246,7 +278,7 @@ public: bool getInfo( const InfoRequestData &requestData ); //WARNING: if changing timeoutMillis above, also change in below function in .cpp file bool getInfo( const QString &caller, const QVariantMap &customData, const InfoTypeMap &inputMap, const InfoTimeoutMap &timeoutMap = InfoTimeoutMap(), bool allSources = false ); - bool pushInfo( const QString &caller, const InfoType type, const QVariant &input, const PushInfoFlags pushFlags ); + bool pushInfo( InfoPushData pushData ); bool pushInfo( const QString &caller, const InfoTypeMap &input, const PushInfoFlags pushFlags ); public slots: @@ -297,6 +329,7 @@ inline uint qHash( Tomahawk::InfoSystem::InfoStringHash hash ) } Q_DECLARE_METATYPE( Tomahawk::InfoSystem::InfoRequestData ); +Q_DECLARE_METATYPE( Tomahawk::InfoSystem::InfoPushData ); Q_DECLARE_METATYPE( Tomahawk::InfoSystem::InfoStringHash ); Q_DECLARE_METATYPE( Tomahawk::InfoSystem::PushInfoPair ); Q_DECLARE_METATYPE( Tomahawk::InfoSystem::PushInfoFlags ); diff --git a/src/libtomahawk/infosystem/infosystemworker.cpp b/src/libtomahawk/infosystem/infosystemworker.cpp index 03386dbc3..be7fb4f2b 100644 --- a/src/libtomahawk/infosystem/infosystemworker.cpp +++ b/src/libtomahawk/infosystem/infosystemworker.cpp @@ -220,43 +220,43 @@ InfoSystemWorker::getInfo( Tomahawk::InfoSystem::InfoRequestData requestData ) void -InfoSystemWorker::pushInfo( QString caller, Tomahawk::InfoSystem::InfoType type, Tomahawk::InfoSystem::PushInfoPair input, Tomahawk::InfoSystem::PushInfoFlags pushFlags ) +InfoSystemWorker::pushInfo( Tomahawk::InfoSystem::InfoPushData pushData ) { - tDebug() << Q_FUNC_INFO << "type is " << type; + tDebug() << Q_FUNC_INFO << "type is " << pushData.type; - if ( pushFlags != PushNoFlag ) + if ( pushData.pushFlags != PushNoFlag ) { - if ( pushFlags & PushShortUrlFlag ) + if ( pushData.pushFlags & PushShortUrlFlag ) { - pushFlags = Tomahawk::InfoSystem::PushInfoFlags( pushFlags & ~PushShortUrlFlag ); - QMetaObject::invokeMethod( this, "getShortUrl", Qt::QueuedConnection, Q_ARG( QString, caller ), Q_ARG( Tomahawk::InfoSystem::InfoType, type ), Q_ARG( Tomahawk::InfoSystem::PushInfoPair, input ), Q_ARG( Tomahawk::InfoSystem::PushInfoFlags, pushFlags ) ); + pushData.pushFlags = Tomahawk::InfoSystem::PushInfoFlags( pushData.pushFlags & ~PushShortUrlFlag ); + QMetaObject::invokeMethod( this, "getShortUrl", Qt::QueuedConnection, Q_ARG( Tomahawk::InfoSystem::InfoPushData, pushData ) ); return; } } - Q_FOREACH( InfoPluginPtr ptr, m_infoPushMap[ type ] ) + Q_FOREACH( InfoPluginPtr ptr, m_infoPushMap[ pushData.type ] ) { if( ptr ) - QMetaObject::invokeMethod( ptr.data(), "pushInfo", Qt::QueuedConnection, Q_ARG( QString, caller ), Q_ARG( Tomahawk::InfoSystem::InfoType, type ), Q_ARG( Tomahawk::InfoSystem::PushInfoPair, input ), Q_ARG( Tomahawk::InfoSystem::PushInfoFlags, pushFlags ) ); + QMetaObject::invokeMethod( ptr.data(), "pushInfo", Qt::QueuedConnection, Q_ARG( Tomahawk::InfoSystem::InfoPushData, pushData ) ); } } void -InfoSystemWorker::getShortUrl( QString caller, Tomahawk::InfoSystem::InfoType type, Tomahawk::InfoSystem::PushInfoPair input, Tomahawk::InfoSystem::PushInfoFlags pushFlags ) +InfoSystemWorker::getShortUrl( Tomahawk::InfoSystem::InfoPushData pushData ) { - tDebug() << Q_FUNC_INFO << "type is " << type; - if ( !input.second.canConvert< Tomahawk::InfoSystem::InfoStringHash >() ) + tDebug() << Q_FUNC_INFO << "type is " << pushData.type; + if ( !pushData.infoPair.second.canConvert< Tomahawk::InfoSystem::InfoStringHash >() ) { - QMetaObject::invokeMethod( this, "pushInfo", Qt::QueuedConnection, Q_ARG( QString, caller ), Q_ARG( Tomahawk::InfoSystem::InfoType, type ), Q_ARG( Tomahawk::InfoSystem::PushInfoPair, input ), Q_ARG( Tomahawk::InfoSystem::PushInfoFlags, pushFlags ) ); + QMetaObject::invokeMethod( this, "pushInfo", Qt::QueuedConnection, Q_ARG( Tomahawk::InfoSystem::InfoPushData, pushData ) ); return; } - Tomahawk::InfoSystem::InfoStringHash hash = input.second.value< Tomahawk::InfoSystem::InfoStringHash >(); + Tomahawk::InfoSystem::InfoStringHash hash = pushData.infoPair.second.value< Tomahawk::InfoSystem::InfoStringHash >(); if ( hash.isEmpty() || !hash.contains( "title" ) || !hash.contains( "artist" ) ) { - QMetaObject::invokeMethod( this, "pushInfo", Qt::QueuedConnection, Q_ARG( QString, caller ), Q_ARG( Tomahawk::InfoSystem::InfoType, type ), Q_ARG( Tomahawk::InfoSystem::PushInfoPair, input ), Q_ARG( Tomahawk::InfoSystem::PushInfoFlags, pushFlags ) ); + QMetaObject::invokeMethod( this, "pushInfo", Qt::QueuedConnection, Q_ARG( Tomahawk::InfoSystem::InfoPushData, pushData ) ); return; } @@ -268,46 +268,38 @@ InfoSystemWorker::getShortUrl( QString caller, Tomahawk::InfoSystem::InfoType ty QUrl longUrl = GlobalActionManager::instance()->openLink( title, artist, album ); - QVariantMap callbackMap; - callbackMap[ "caller" ] = caller; - callbackMap[ "type" ] = QVariant::fromValue< Tomahawk::InfoSystem::InfoType >( type ); - callbackMap[ "pushinfopair" ] = QVariant::fromValue< Tomahawk::InfoSystem::PushInfoPair >( input ); - callbackMap[ "pushflags" ] = QVariant::fromValue< Tomahawk::InfoSystem::PushInfoFlags >( pushFlags ); - GlobalActionManager::instance()->shortenLink( longUrl, callbackMap ); - connect( GlobalActionManager::instance(), SIGNAL( shortLinkReady( QUrl, QUrl, QVariantMap ) ), this, SLOT( shortLinkReady( QUrl, QUrl, QVariantMap ) ), Qt::UniqueConnection ); + GlobalActionManager::instance()->shortenLink( longUrl, QVariant::fromValue< Tomahawk::InfoSystem::InfoPushData >( pushData ) ); + connect( GlobalActionManager::instance(), SIGNAL( shortLinkReady( QUrl, QUrl, QVariant ) ), this, SLOT( shortLinkReady( QUrl, QUrl, QVariant ) ), Qt::UniqueConnection ); m_shortLinksWaiting++; } void -InfoSystemWorker::shortLinkReady( QUrl longUrl, QUrl shortUrl, QVariantMap callbackMap ) +InfoSystemWorker::shortLinkReady( QUrl longUrl, QUrl shortUrl, QVariant callbackObj ) { tDebug() << Q_FUNC_INFO << "long url = " << longUrl << ", shortUrl = " << shortUrl; m_shortLinksWaiting--; if ( !m_shortLinksWaiting ) - disconnect( GlobalActionManager::instance(), SIGNAL( shortLinkReady( QUrl, QUrl, QVariantMap ) ) ); + disconnect( GlobalActionManager::instance(), SIGNAL( shortLinkReady( QUrl, QUrl, QVariant ) ) ); - if ( callbackMap.isEmpty() || !callbackMap.contains( "caller" ) || !callbackMap.contains( "type" ) || !callbackMap.contains( "pushinfopair" ) || !callbackMap.contains( "pushflags" ) ) + if ( !callbackObj.isValid() ) { - tDebug() << Q_FUNC_INFO << "callback map was empty, cannot continue"; + tDebug() << Q_FUNC_INFO << "callback object was not valid, cannot continue"; return; } - QString caller = callbackMap[ "caller" ].toString(); - Tomahawk::InfoSystem::InfoType type = callbackMap[ "type" ].value< Tomahawk::InfoSystem::InfoType >(); - Tomahawk::InfoSystem::PushInfoPair pushInfoPair = callbackMap[ "pushinfopair" ].value< Tomahawk::InfoSystem::PushInfoPair >(); - Tomahawk::InfoSystem::PushInfoFlags pushFlags = callbackMap[ "pushflags" ].value< Tomahawk::InfoSystem::PushInfoFlags >(); + Tomahawk::InfoSystem::InfoPushData pushData = callbackObj.value< Tomahawk::InfoSystem::InfoPushData >(); if ( !shortUrl.isEmpty() && longUrl != shortUrl ) { - QVariantMap flagProps = pushInfoPair.first; + QVariantMap flagProps = pushData.infoPair.first; flagProps[ "shorturl" ] = shortUrl; - pushInfoPair.first = flagProps; + pushData.infoPair.first = flagProps; } - tDebug() << Q_FUNC_INFO << "pushInfoPair first is: " << pushInfoPair.first.keys(); + tDebug() << Q_FUNC_INFO << "pushInfoPair first is: " << pushData.infoPair.first.keys(); - QMetaObject::invokeMethod( this, "pushInfo", Qt::QueuedConnection, Q_ARG( QString, caller ), Q_ARG( Tomahawk::InfoSystem::InfoType, type ), Q_ARG( Tomahawk::InfoSystem::PushInfoPair, pushInfoPair ), Q_ARG( Tomahawk::InfoSystem::PushInfoFlags, pushFlags ) ); + QMetaObject::invokeMethod( this, "pushInfo", Qt::QueuedConnection, Q_ARG( Tomahawk::InfoSystem::InfoPushData, pushData ) ); } diff --git a/src/libtomahawk/infosystem/infosystemworker.h b/src/libtomahawk/infosystem/infosystemworker.h index fbd22dd70..6a51299b5 100644 --- a/src/libtomahawk/infosystem/infosystemworker.h +++ b/src/libtomahawk/infosystem/infosystemworker.h @@ -60,14 +60,14 @@ public slots: void init( Tomahawk::InfoSystem::InfoSystemCache* cache ); void getInfo( Tomahawk::InfoSystem::InfoRequestData requestData ); - void pushInfo( QString caller, Tomahawk::InfoSystem::InfoType type, Tomahawk::InfoSystem::PushInfoPair input, Tomahawk::InfoSystem::PushInfoFlags pushFlags ); + void pushInfo( Tomahawk::InfoSystem::InfoPushData pushData ); void infoSlot( Tomahawk::InfoSystem::InfoRequestData requestData, QVariant output ); void addInfoPlugin( Tomahawk::InfoSystem::InfoPlugin* plugin ); - void getShortUrl( QString caller, Tomahawk::InfoSystem::InfoType type, Tomahawk::InfoSystem::PushInfoPair input, Tomahawk::InfoSystem::PushInfoFlags pushFlags ); - void shortLinkReady( QUrl longUrl, QUrl shortUrl, QVariantMap callbackMap ); + void getShortUrl( Tomahawk::InfoSystem::InfoPushData data ); + void shortLinkReady( QUrl longUrl, QUrl shortUrl, QVariant callbackObj ); private slots: void checkTimeoutsTimerFired(); diff --git a/src/libtomahawk/query.cpp b/src/libtomahawk/query.cpp index ea7ae1dc4..0702cad40 100644 --- a/src/libtomahawk/query.cpp +++ b/src/libtomahawk/query.cpp @@ -587,10 +587,12 @@ Query::setLoved( bool loved ) trackInfo["artist"] = artist(); trackInfo["album"] = album(); - Tomahawk::InfoSystem::InfoSystem::instance()->pushInfo( - id(), Tomahawk::InfoSystem::InfoLove, - QVariant::fromValue< Tomahawk::InfoSystem::InfoStringHash >( trackInfo ), - Tomahawk::InfoSystem::PushNoFlag ); + Tomahawk::InfoSystem::InfoPushData pushData ( id(), + Tomahawk::InfoSystem::InfoLove, + QVariant::fromValue< Tomahawk::InfoSystem::InfoStringHash >( trackInfo ), + Tomahawk::InfoSystem::PushNoFlag ); + + Tomahawk::InfoSystem::InfoSystem::instance()->pushInfo( pushData ); DatabaseCommand_SocialAction* cmd = new DatabaseCommand_SocialAction( q, QString( "Love" ), loved ? QString( "true" ) : QString( "false" ) ); Database::instance()->enqueue( QSharedPointer(cmd) ); diff --git a/src/libtomahawk/utils/PixmapDelegateFader.cpp b/src/libtomahawk/utils/PixmapDelegateFader.cpp index d11c4fb50..9001949e3 100644 --- a/src/libtomahawk/utils/PixmapDelegateFader.cpp +++ b/src/libtomahawk/utils/PixmapDelegateFader.cpp @@ -1,7 +1,8 @@ /* === This file is part of Tomahawk Player - === * * Copyright 2010-2012, Leo Franchi - * + * Copyright 2012, Jeff Mitchell + * * Tomahawk 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 3 of the License, or @@ -20,16 +21,33 @@ #include "tomahawkutilsgui.h" #include +#include #include +#include using namespace Tomahawk; #define COVER_FADEIN 1000 +QWeakPointer< TomahawkUtils::SharedTimeLine > PixmapDelegateFader::s_stlInstance = QWeakPointer< TomahawkUtils::SharedTimeLine >(); + +QWeakPointer< TomahawkUtils::SharedTimeLine > +PixmapDelegateFader::stlInstance() +{ + if ( s_stlInstance.isNull() ) + s_stlInstance = QWeakPointer< TomahawkUtils::SharedTimeLine> ( new TomahawkUtils::SharedTimeLine() ); + + return s_stlInstance; +} + + PixmapDelegateFader::PixmapDelegateFader( const artist_ptr& artist, const QSize& size, TomahawkUtils::ImageMode mode, bool forceLoad ) : m_artist( artist ) , m_size( size ) , m_mode( mode ) + , m_startFrame( 0 ) + , m_connectedToStl( false ) + , m_fadePct( 100 ) { if ( !m_artist.isNull() ) { @@ -44,6 +62,9 @@ PixmapDelegateFader::PixmapDelegateFader( const album_ptr& album, const QSize& s : m_album( album ) , m_size( size ) , m_mode( mode ) + , m_startFrame( 0 ) + , m_connectedToStl( false ) + , m_fadePct( 100 ) { if ( !m_album.isNull() ) { @@ -59,6 +80,9 @@ PixmapDelegateFader::PixmapDelegateFader( const query_ptr& track, const QSize& s : m_track( track ) , m_size( size ) , m_mode( mode ) + , m_startFrame( 0 ) + , m_connectedToStl( false ) + , m_fadePct( 100 ) { if ( !m_track.isNull() ) { @@ -82,13 +106,8 @@ PixmapDelegateFader::init() m_current = QPixmap( m_size ); m_current.fill( Qt::transparent ); - m_crossfadeTimeline.setDuration( COVER_FADEIN ); - m_crossfadeTimeline.setUpdateInterval( 20 ); - m_crossfadeTimeline.setFrameRange( 0, 1000 ); - m_crossfadeTimeline.setDirection( QTimeLine::Forward ); - connect( &m_crossfadeTimeline, SIGNAL( frameChanged( int ) ), this, SLOT( onAnimationStep( int ) ) ); - connect( &m_crossfadeTimeline, SIGNAL( finished() ), this, SLOT( onAnimationFinished() ) ); - + stlInstance().data()->setUpdateInterval( 20 ); + if ( m_currentReference.isNull() ) { // No cover loaded yet, use default and don't fade in @@ -102,7 +121,11 @@ PixmapDelegateFader::init() return; } - m_crossfadeTimeline.start(); + stlInstance().data()->setUpdateInterval( 20 ); + m_startFrame = stlInstance().data()->currentFrame(); + m_connectedToStl = true; + m_fadePct = 0; + connect( stlInstance().data(), SIGNAL( frameChanged( int ) ), this, SLOT( onAnimationStep( int ) ) ); } @@ -141,7 +164,17 @@ PixmapDelegateFader::setPixmap( const QPixmap& pixmap ) if ( pixmap.isNull() ) return; - if ( m_crossfadeTimeline.state() == QTimeLine::Running ) + QByteArray ba; + QBuffer buffer( &ba ); + buffer.open( QIODevice::WriteOnly ); + pixmap.save( &buffer, "PNG" ); + QString newImageMd5 = TomahawkUtils::md5( buffer.data() ); + if ( m_oldImageMd5 == newImageMd5 ) + return; + + m_oldImageMd5 = newImageMd5; + + if ( m_connectedToStl ) { m_pixmapQueue.enqueue( pixmap ); return; @@ -150,15 +183,25 @@ PixmapDelegateFader::setPixmap( const QPixmap& pixmap ) m_oldReference = m_currentReference; m_currentReference = pixmap; - m_crossfadeTimeline.start(); + m_startFrame = stlInstance().data()->currentFrame(); + m_connectedToStl = true; + m_fadePct = 0; + connect( stlInstance().data(), SIGNAL( frameChanged( int ) ), this, SLOT( onAnimationStep( int ) ) ); } void PixmapDelegateFader::onAnimationStep( int step ) { - const qreal opacity = ((qreal)step / 1000.); - const qreal oldOpacity = ( 1000. - step ) / 1000. ; + m_fadePct = (float)( step - m_startFrame ) / 10.0; + if ( m_fadePct > 100.0 ) + m_fadePct = 100.0; + + if ( m_fadePct == 100.0 ) + QTimer::singleShot( 0, this, SLOT( onAnimationFinished() ) ); + + const qreal opacity = m_fadePct / 100.0; + const qreal oldOpacity = ( 100.0 - m_fadePct ) / 100.0; m_current.fill( Qt::transparent ); // Update our pixmap with the new opacity @@ -227,12 +270,12 @@ void PixmapDelegateFader::onAnimationFinished() { m_oldReference = QPixmap(); - onAnimationStep( 1000 ); + onAnimationStep( INT_MAX ); + + disconnect( stlInstance().data(), SIGNAL( frameChanged( int ) ), this, SLOT( onAnimationStep( int ) ) ); if ( !m_pixmapQueue.isEmpty() ) - { setPixmap( m_pixmapQueue.dequeue() ); - } } diff --git a/src/libtomahawk/utils/PixmapDelegateFader.h b/src/libtomahawk/utils/PixmapDelegateFader.h index 2bc3c51b5..b477d24fa 100644 --- a/src/libtomahawk/utils/PixmapDelegateFader.h +++ b/src/libtomahawk/utils/PixmapDelegateFader.h @@ -1,6 +1,7 @@ /* === This file is part of Tomahawk Player - === * * Copyright 2011-2012, Leo Franchi + * Copyright 2012, Jeff Mitchell * * Tomahawk is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,6 +27,7 @@ #include #include #include +#include namespace Tomahawk { @@ -39,6 +41,9 @@ namespace Tomahawk class PixmapDelegateFader : public QObject { Q_OBJECT + + static QWeakPointer< TomahawkUtils::SharedTimeLine > stlInstance(); + public: PixmapDelegateFader( const artist_ptr& artist, const QSize& size, TomahawkUtils::ImageMode mode = TomahawkUtils::Original, bool forceLoad = true ); PixmapDelegateFader( const album_ptr& album, const QSize& size, TomahawkUtils::ImageMode mode = TomahawkUtils::Original, bool forceLoad = true ); @@ -68,10 +73,16 @@ private: query_ptr m_track; QSize m_size; TomahawkUtils::ImageMode m_mode; - + int m_startFrame; + bool m_connectedToStl; + float m_fadePct; + QString m_oldImageMd5; + QQueue m_pixmapQueue; - QTimeLine m_crossfadeTimeline; + QPixmap m_currentReference, m_oldReference, m_current; + + static QWeakPointer< TomahawkUtils::SharedTimeLine > s_stlInstance; }; } diff --git a/src/libtomahawk/utils/tomahawkutils.cpp b/src/libtomahawk/utils/tomahawkutils.cpp index 0ab5611ad..dbbac206d 100644 --- a/src/libtomahawk/utils/tomahawkutils.cpp +++ b/src/libtomahawk/utils/tomahawkutils.cpp @@ -609,7 +609,8 @@ removeDirectory( const QString& dir ) } -quint64 infosystemRequestId() +quint64 +infosystemRequestId() { QMutexLocker locker( &s_infosystemRequestIdMutex ); quint64 result = s_infosystemRequestId; @@ -633,4 +634,42 @@ crash() *a = 1; } + +SharedTimeLine::SharedTimeLine() + : QObject( 0 ) + , m_refcount( 0 ) +{ + m_timeline.setCurveShape( QTimeLine::LinearCurve ); + m_timeline.setFrameRange( 0, INT_MAX ); + m_timeline.setDuration( INT_MAX ); + m_timeline.setUpdateInterval( 40 ); + connect( &m_timeline, SIGNAL( frameChanged( int ) ), SIGNAL( frameChanged( int ) ) ); +} + +void +SharedTimeLine::connectNotify( const char* signal ) +{ + if ( signal == QMetaObject::normalizedSignature( SIGNAL( frameChanged( int ) ) ) ) { + m_refcount++; + if ( m_timeline.state() != QTimeLine::Running ) + m_timeline.start(); + } +} + + +void +SharedTimeLine::disconnectNotify( const char* signal ) +{ + if ( signal == QMetaObject::normalizedSignature( SIGNAL( frameChanged( int ) ) ) ) + { + m_refcount--; + if ( m_timeline.state() == QTimeLine::Running && m_refcount == 0 ) + { + m_timeline.stop(); + deleteLater(); + } + } +} + + } // ns diff --git a/src/libtomahawk/utils/tomahawkutils.h b/src/libtomahawk/utils/tomahawkutils.h index a1ce5f887..3b127a710 100644 --- a/src/libtomahawk/utils/tomahawkutils.h +++ b/src/libtomahawk/utils/tomahawkutils.h @@ -26,9 +26,9 @@ #include #include #include +#include #include - #define RESPATH ":/data/" @@ -61,6 +61,34 @@ namespace TomahawkUtils ScaledCover }; + + class DLLEXPORT SharedTimeLine : public QObject + { + Q_OBJECT + + public: + SharedTimeLine(); + + virtual ~SharedTimeLine() {} + + int currentFrame() { return m_timeline.currentFrame(); } + + void setUpdateInterval( int msec ) { if ( msec != m_timeline.updateInterval() ) m_timeline.setUpdateInterval( msec ); } + + signals: + void frameChanged( int ); + + protected slots: + virtual void connectNotify( const char *signal ); + + virtual void disconnectNotify( const char *signal ); + + private: + int m_refcount; + QTimeLine m_timeline; + }; + + class DLLEXPORT NetworkProxyFactory : public QNetworkProxyFactory { public: @@ -85,6 +113,7 @@ namespace TomahawkUtils QStringList m_noProxyHosts; QNetworkProxy m_proxy; }; + DLLEXPORT QString appFriendlyVersion(); @@ -107,7 +136,7 @@ namespace TomahawkUtils DLLEXPORT QString md5( const QByteArray& data ); DLLEXPORT bool removeDirectory( const QString& dir ); - + /** * This helper is designed to help "update" an existing playlist with a newer revision of itself. * To avoid re-loading the whole playlist and re-resolving tracks that are the same in the old playlist, diff --git a/src/libtomahawk/widgets/FadingPixmap.cpp b/src/libtomahawk/widgets/FadingPixmap.cpp index 29b7304c4..c21db431e 100644 --- a/src/libtomahawk/widgets/FadingPixmap.cpp +++ b/src/libtomahawk/widgets/FadingPixmap.cpp @@ -1,6 +1,7 @@ /* === This file is part of Tomahawk Player - === * * Copyright 2011 - 2012, Christian Muehlhaeuser + * Copyright 2012, Jeff Mitchell * * Tomahawk is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,22 +19,33 @@ #include "FadingPixmap.h" +#include "utils/logger.h" + +#include +#include #include #define ANIMATION_TIME 1000 +QWeakPointer< TomahawkUtils::SharedTimeLine > FadingPixmap::s_stlInstance = QWeakPointer< TomahawkUtils::SharedTimeLine >(); + +QWeakPointer< TomahawkUtils::SharedTimeLine > +FadingPixmap::stlInstance() +{ + if ( s_stlInstance.isNull() ) + s_stlInstance = QWeakPointer< TomahawkUtils::SharedTimeLine> ( new TomahawkUtils::SharedTimeLine() ); + + return s_stlInstance; +} + + FadingPixmap::FadingPixmap( QWidget* parent ) : QLabel( parent ) + , m_oldPixmap( QPixmap() ) , m_fadePct( 100 ) + , m_startFrame( 0 ) { // setCursor( Qt::PointingHandCursor ); - - m_timeLine = new QTimeLine( ANIMATION_TIME, this ); - m_timeLine->setUpdateInterval( 20 ); - m_timeLine->setEasingCurve( QEasingCurve::Linear ); - - connect( m_timeLine, SIGNAL( frameChanged( int ) ), SLOT( onAnimationStep( int ) ) ); - connect( m_timeLine, SIGNAL( finished() ), SLOT( onAnimationFinished() ) ); } @@ -45,8 +57,14 @@ FadingPixmap::~FadingPixmap() void FadingPixmap::onAnimationStep( int frame ) { - m_fadePct = (float)frame / 10.0; + m_fadePct = (float)( frame - m_startFrame ) / 10.0; + if ( m_fadePct > 100.0 ) + m_fadePct = 100.0; + repaint(); + + if ( m_fadePct == 100.0 ) + QTimer::singleShot( 0, this, SLOT( onAnimationFinished() ) ); } @@ -55,18 +73,28 @@ FadingPixmap::onAnimationFinished() { m_oldPixmap = QPixmap(); repaint(); + + disconnect( stlInstance().data(), SIGNAL( frameChanged( int ) ), this, SLOT( onAnimationStep( int ) ) ); if ( m_pixmapQueue.count() ) - { setPixmap( m_pixmapQueue.takeFirst() ); - } } void FadingPixmap::setPixmap( const QPixmap& pixmap, bool clearQueue ) { - if ( m_timeLine->state() == QTimeLine::Running ) + QByteArray ba; + QBuffer buffer( &ba ); + buffer.open( QIODevice::WriteOnly ); + pixmap.save( &buffer, "PNG" ); + QString newImageMd5 = TomahawkUtils::md5( buffer.data() ); + if ( m_oldImageMd5 == newImageMd5 ) + return; + + m_oldImageMd5 = newImageMd5; + + if ( !m_oldPixmap.isNull() ) { if ( clearQueue ) m_pixmapQueue.clear(); @@ -78,9 +106,10 @@ FadingPixmap::setPixmap( const QPixmap& pixmap, bool clearQueue ) m_oldPixmap = m_pixmap; m_pixmap = pixmap; - m_timeLine->setFrameRange( 0, 1000 ); - m_timeLine->setDirection( QTimeLine::Forward ); - m_timeLine->start(); + stlInstance().data()->setUpdateInterval( 20 ); + m_startFrame = stlInstance().data()->currentFrame(); + m_fadePct = 0; + connect( stlInstance().data(), SIGNAL( frameChanged( int ) ), this, SLOT( onAnimationStep( int ) ) ); } diff --git a/src/libtomahawk/widgets/FadingPixmap.h b/src/libtomahawk/widgets/FadingPixmap.h index e6bd7720f..902eb4bab 100644 --- a/src/libtomahawk/widgets/FadingPixmap.h +++ b/src/libtomahawk/widgets/FadingPixmap.h @@ -1,6 +1,7 @@ /* === This file is part of Tomahawk Player - === * * Copyright 2011 - 2012, Christian Muehlhaeuser + * Copyright 2012, Jeff Mitchell * * Tomahawk is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,9 +20,12 @@ #ifndef FADINGPIXMAP_H #define FADINGPIXMAP_H +#include "utils/tomahawkutils.h" + #include #include #include +#include #include "dllmacro.h" @@ -33,12 +37,15 @@ class DLLEXPORT FadingPixmap : public QLabel { Q_OBJECT + static QWeakPointer< TomahawkUtils::SharedTimeLine > stlInstance(); + public: FadingPixmap( QWidget* parent = 0 ); virtual ~FadingPixmap(); public slots: virtual void setPixmap( const QPixmap& pixmap, bool clearQueue = true ); + void onAnimationStep( int frame ); signals: void clicked(); @@ -48,17 +55,21 @@ protected: void mouseReleaseEvent( QMouseEvent* event ); private slots: - void onAnimationStep( int frame ); void onAnimationFinished(); private: QPixmap m_pixmap; QPixmap m_oldPixmap; + + QString m_oldImageMd5; QList m_pixmapQueue; - QTimeLine* m_timeLine; int m_fadePct; + + int m_startFrame; + + static QWeakPointer< TomahawkUtils::SharedTimeLine > s_stlInstance; }; #endif diff --git a/src/libtomahawk/widgets/SeekSlider.cpp b/src/libtomahawk/widgets/SeekSlider.cpp index 71c42929c..8d21e8a81 100644 --- a/src/libtomahawk/widgets/SeekSlider.cpp +++ b/src/libtomahawk/widgets/SeekSlider.cpp @@ -72,19 +72,15 @@ SeekSlider::mousePressEvent( QMouseEvent* event ) void SeekSlider::setValue( int value ) { - int newVal = value; - if ( value > maximum() ) - newVal = maximum(); - if ( value < minimum() ) - newVal = minimum(); +// int newVal = qBound( minimum(), value, maximum() ); if ( !m_timeLine || sender() != m_timeLine ) { - QSlider::setValue( newVal ); + QSlider::setValue( value ); return; } blockSignals( true ); - QSlider::setValue( newVal ); + QSlider::setValue( value ); blockSignals( false ); } diff --git a/src/scrobbler.cpp b/src/scrobbler.cpp index 61e3d640b..666e4eb93 100644 --- a/src/scrobbler.cpp +++ b/src/scrobbler.cpp @@ -86,11 +86,13 @@ Scrobbler::trackStarted( const Tomahawk::result_ptr& track ) trackInfo["album"] = track->album()->name(); trackInfo["duration"] = QString::number( track->duration() ); - Tomahawk::InfoSystem::InfoSystem::instance()->pushInfo( + Tomahawk::InfoSystem::InfoPushData pushData ( s_scInfoIdentifier, Tomahawk::InfoSystem::InfoSubmitNowPlaying, QVariant::fromValue< Tomahawk::InfoSystem::InfoStringHash >( trackInfo ), Tomahawk::InfoSystem::PushNoFlag ); + Tomahawk::InfoSystem::InfoSystem::instance()->pushInfo( pushData ); + // liblastfm forces 0-length tracks to scrobble after 4 minutes, stupid. if ( track->duration() == 0 ) m_scrobblePoint = ScrobblePoint( 30 ); @@ -139,9 +141,11 @@ Scrobbler::scrobble() { Q_ASSERT( QThread::currentThread() == thread() ); - Tomahawk::InfoSystem::InfoSystem::instance()->pushInfo( + Tomahawk::InfoSystem::InfoPushData pushData ( s_scInfoIdentifier, Tomahawk::InfoSystem::InfoSubmitScrobble, QVariant(), Tomahawk::InfoSystem::PushNoFlag ); + + Tomahawk::InfoSystem::InfoSystem::instance()->pushInfo( pushData ); } diff --git a/src/tomahawkapp.cpp b/src/tomahawkapp.cpp index a91ba3ca0..bb186bf4b 100644 --- a/src/tomahawkapp.cpp +++ b/src/tomahawkapp.cpp @@ -450,6 +450,7 @@ TomahawkApp::registerMetaTypes() qRegisterMetaType< Tomahawk::InfoSystem::PushInfoFlags >( "Tomahawk::InfoSystem::PushInfoFlags" ); qRegisterMetaType< Tomahawk::InfoSystem::PushInfoPair >( "Tomahawk::InfoSystem::PushInfoPair" ); qRegisterMetaType< Tomahawk::InfoSystem::InfoRequestData >( "Tomahawk::InfoSystem::InfoRequestData" ); + qRegisterMetaType< Tomahawk::InfoSystem::InfoPushData >( "Tomahawk::InfoSystem::InfoPushData" ); qRegisterMetaType< Tomahawk::InfoSystem::InfoSystemCache* >( "Tomahawk::InfoSystem::InfoSystemCache*" ); qRegisterMetaType< Tomahawk::InfoSystem::InfoPlugin* >( "Tomahawk::InfoSystem::InfoPlugin*" ); qRegisterMetaType< QList< Tomahawk::InfoSystem::InfoStringHash > >("QList< Tomahawk::InfoSystem::InfoStringHash > ");