...
 
Commits (54)
Overview of changes in 3.32.0
=============================
Translations updated:
Finnish
Catalan
French
Overview of changes in 3.31.92
==============================
Bugs fixed:
Fix initial state graphics in dark mode (#258)
Thanks to our contributors this release:
Tjipke van der Heide
Veerasamy Sevagen
Translations updated:
Turkish
Finnish
Icelandic
Dutch
Lithuanian
Basque
Brazilian Portuguese
Korean
Italian
Russian
Serbian
Friulian
German
Vietnamese
Latvian
Overview of changes in 3.31.91
==============================
* Show an empty view when Tracker is unavailable
Bugs fixed:
Play correct song while paused (#256)
Show a warning when Tracker is not available (#165)
Cannot cancel 'All' sources in search via button (#92)
Crashes when trying to play any song (#244)
Crash while tracks are being loaded (#252)
Thanks to our contributors this release:
Jean Felder
Marinus Schraal
Sagar Lakhani
Translations updated:
Czech
Polish
Spanish
Romanian
Hungarian
Swedish
Indonesian
Slovenian
Galician
Kazakh
Danish
Chinese (Taiwan)
Overview of changes in 3.31.90
==============================
......
data/icons/initial-state.png

40.7 KB | W: | H:

data/icons/initial-state.png

264 KB | W: | H:

data/icons/initial-state.png
data/icons/initial-state.png
data/icons/initial-state.png
data/icons/initial-state.png
  • 2-up
  • Swipe
  • Onion skin
......@@ -72,6 +72,7 @@ Piotr Drąg
Prashant Tyagi
Rashi Sah
Robert Greener
Sagar Lakhani
Sai Suman Prayaga
Sambhav Kothari
Seif Lotfy
......@@ -81,7 +82,9 @@ Subhadip Jana
Suyash Garg
Tapasweni Pathak
Taylor Garcia
Tjipke van der Heide
Vadim Rutkovsky
Veerasamy Sevagen
Yash Singh
</property>
<property name="artists">Allan Day
......@@ -90,11 +93,13 @@ William Jon McCann
</property>
<property name="translator_credits">Adolfo Jayme Barrientos
Alain Lojewski
Alan Mortensen
Alexandre Franke
Anders Jonsson
Andika Triwidada
Anish Sheela
Arash Mousavi
Asier Sarasua Garmendia
Ask Hjorth Larsen
Aurimas Černius
Balázs Meskó
......@@ -150,6 +155,7 @@ Seong-ho Cho
Stas Solovey
Sveinn í Felli
Tiago Santos
Tim Sabsch
Tom Tryfonidis
Trần Ngọc Quân
Vinzenz Vietzke
......
gnome-music (3.32.0-1) experimental; urgency=medium
* New upstream release
-- Jeremy Bicha <jbicha@debian.org> Sat, 16 Mar 2019 18:16:05 -0400
gnome-music (3.31.90-1) experimental; urgency=medium
* New upstream development release
......
version=4
https://download.gnome.org/sources/@PACKAGE@/([\d\.]+)/ \
https://download.gnome.org/sources/@PACKAGE@/([\d\.]+[02468])/ \
@PACKAGE@@ANY_VERSION@\.tar\.xz
......@@ -29,10 +29,6 @@ from itertools import chain
from time import time
import logging
import gi
gi.require_version('Tracker', '2.0')
from gi.repository import Tracker
logger = logging.getLogger(__name__)
tabbing = 0
......@@ -75,28 +71,3 @@ def log(fn):
return retval
return wrapped
class TrackerWrapper:
class __TrackerWrapper:
def __init__(self):
try:
self.tracker = Tracker.SparqlConnection.get(None)
except Exception as e:
from sys import exit
logger.error(
"Cannot connect to tracker, error {}\nExiting".format(
str(e)))
exit(1)
def __str__(self):
return repr(self)
_instance = None
def __init__(self):
if not TrackerWrapper._instance:
TrackerWrapper._instance = TrackerWrapper.__TrackerWrapper()
def __getattr__(self, name):
return getattr(self._instance, name)
......@@ -29,7 +29,8 @@ import gi
gi.require_version('Grl', '0.3')
from gi.repository import GLib, GObject
from gnomemusic.query import Query
from gnomemusic import log, TrackerWrapper
from gnomemusic import log
from gnomemusic.trackerwrapper import TrackerWrapper
import logging
import os
os.environ['GRL_PLUGIN_RANKS'] = ("grl-local-metadata:5,"
......@@ -81,6 +82,7 @@ class Grilo(GObject.GObject):
sources = GObject.Property()
cover_sources = GObject.Property(type=bool, default=False)
tracker_available = GObject.Property(type=bool, default=False)
def __repr__(self):
return '<Grilo>'
......@@ -123,7 +125,12 @@ class Grilo(GObject.GObject):
self.registry = Grl.Registry.get_default()
self.sparqltracker = TrackerWrapper().tracker
self._tracker_wrapper = TrackerWrapper()
self.tracker_sparql = self._tracker_wrapper.props.tracker
self._tracker_wrapper.bind_property(
"tracker-available", self, "tracker-available",
GObject.BindingFlags.BIDIRECTIONAL |
GObject.BindingFlags.SYNC_CREATE)
self._find_sources()
......@@ -498,6 +505,7 @@ class Grilo(GObject.GObject):
cursor = conn.query_finish(res)
except GLib.Error as err:
logger.warning("Error: {}, {}".format(err.__class__, err))
self.props.tracker_available = False
callback(False)
return
......@@ -505,8 +513,12 @@ class Grilo(GObject.GObject):
# TODO: currently just checks tracker, should work with any
# queryable supported Grilo source.
self.sparqltracker.query_async(Query.all_songs_count(), None,
songs_query_cb, None)
if not self.props.tracker_available:
callback(False)
return
self.tracker_sparql.query_async(
Query.all_songs_count(), None, songs_query_cb, None)
grilo = Grilo()
......@@ -242,7 +242,7 @@ class GstPlayer(GObject.GObject):
:return: url
:rtype: string
"""
return self._player.props.uri
return self._player.props.current_uri
@url.setter
def url(self, url_):
......
......@@ -59,8 +59,9 @@ class RepeatMode(IntEnum):
class ValidationStatus(IntEnum):
"""Enum for song validation"""
PENDING = 0
FAILED = 1
SUCCEEDED = 2
IN_PROGRESS = 1
FAILED = 2
SUCCEEDED = 3
class PlayerField(IntEnum):
......@@ -127,7 +128,6 @@ class PlayerPlaylist(GObject.GObject):
"""
path = model.get_path(model_iter)
self._current_index = int(path.to_string())
self._validation_indexes = defaultdict(list)
# Playlist is the same. Check that the requested song is valid.
# If not, try to get the next valid one
......@@ -140,6 +140,7 @@ class PlayerPlaylist(GObject.GObject):
self._validate_next_song()
return False
self._validation_indexes = defaultdict(list)
self._type = playlist_type
self._id = playlist_id
......@@ -283,8 +284,9 @@ class PlayerPlaylist(GObject.GObject):
@log
def _validate_song(self, index):
item = self._songs[index]
# Song has already been processed, nothing to do.
if item[PlayerField.VALIDATION] != ValidationStatus.PENDING:
# Song is being processed or has already been processed.
# Nothing to do.
if item[PlayerField.VALIDATION] > ValidationStatus.PENDING:
return
song = item[PlayerField.SONG]
......@@ -297,6 +299,7 @@ class PlayerPlaylist(GObject.GObject):
"Skipping validation of {} as not a local file".format(url))
return
item[PlayerField.VALIDATION] = ValidationStatus.IN_PROGRESS
self._validation_indexes[url].append(index)
self._discoverer.discover_uri_async(url)
......@@ -630,9 +633,7 @@ class Player(GObject.GObject):
self._gst_player.props.state = Playback.LOADING
self._time_stamp = int(time.time())
url_ = song.get_url()
if url_ != self._gst_player.props.url:
self._gst_player.props.url = url_
self._gst_player.props.url = song.get_url()
self.emit('song-changed', self._playlist.get_current_index())
......@@ -663,7 +664,8 @@ class Player(GObject.GObject):
and not self._playlist.set_song(song_offset)):
return False
if self.props.state != Playback.PAUSED:
url = self._playlist.props.current_song.get_url()
if url != self._gst_player.props.url:
self._load(self._playlist.props.current_song)
self._gst_player.props.state = Playback.PLAYING
......
......@@ -29,7 +29,6 @@
import gi
gi.require_version('Grl', '0.3')
from gi.repository import Grl, GLib, GObject
from gnomemusic import TrackerWrapper
from gnomemusic.grilo import grilo
from gnomemusic.query import Query
from gettext import gettext as _
......@@ -131,7 +130,7 @@ class Playlists(GObject.GObject):
}
instance = None
tracker = None
_tracker = None
def __repr__(self):
return '<Playlists>'
......@@ -148,7 +147,6 @@ class Playlists(GObject.GObject):
def __init__(self):
super().__init__()
self.tracker = TrackerWrapper().tracker
self._static_playlists = StaticPlaylists()
grilo.connect('ready', self._on_grilo_ready)
......@@ -186,9 +184,10 @@ class Playlists(GObject.GObject):
# Search for the playlist ID
cursor.next_async(None, playlist_id_fetched_cb, playlist)
self._tracker = grilo.tracker_sparql
# Start fetching all the static playlists
for playlist in self._static_playlists.get_all():
self.tracker.query_async(
self._tracker.query_async(
Query.get_playlist_with_tag(playlist.TAG_TEXT), None,
callback, playlist)
......@@ -234,7 +233,7 @@ class Playlists(GObject.GObject):
query = Query.get_playlist_with_urn(playlist_urn)
# Start fetching the playlist
self.tracker.query_async(
self._tracker.query_async(
query, None, playlist_queried_cb, playlist)
def tag_created_cb(obj, res, playlist):
......@@ -242,14 +241,14 @@ class Playlists(GObject.GObject):
creation_query = Query.create_playlist_with_tag(title, tag_text)
# Start creating the playlist itself
self.tracker.update_blank_async(
self._tracker.update_blank_async(
creation_query, GLib.PRIORITY_LOW, None, playlist_created_cb,
playlist)
# Start the playlist creation by creating the tag
self.tracker.update_blank_async(Query.create_tag(tag_text),
GLib.PRIORITY_LOW, None,
tag_created_cb, playlist)
self._tracker.update_blank_async(
Query.create_tag(tag_text), GLib.PRIORITY_LOW, None,
tag_created_cb, playlist)
@log
def update_static_playlist(self, playlist):
......@@ -262,15 +261,16 @@ class Playlists(GObject.GObject):
def clear_playlist(self, playlist):
"""Starts cleaning the playlist"""
query = Query.clear_playlist_with_id(playlist.ID)
self.tracker.update_async(query, GLib.PRIORITY_LOW, None,
self._static_playlist_cleared_cb, playlist)
self._tracker.update_async(
query, GLib.PRIORITY_LOW, None, self._static_playlist_cleared_cb,
playlist)
@log
def _static_playlist_cleared_cb(self, connection, res, playlist):
"""After clearing the playlist, start querying the playlist's songs"""
# Get a list of matching songs
self.tracker.query_async(playlist.QUERY, None,
self._static_playlist_query_cb, playlist)
self._tracker.query_async(
playlist.QUERY, None, self._static_playlist_query_cb, playlist)
@log
def _static_playlist_query_cb(self, connection, res, playlist):
......@@ -298,7 +298,7 @@ class Playlists(GObject.GObject):
cursor.next_async(None, callback, final_query)
else:
self.tracker.update_blank_async(
self._tracker.update_blank_async(
final_query, GLib.PRIORITY_LOW, None,
self._static_playlist_update_finished, playlist)
......@@ -344,15 +344,13 @@ class Playlists(GObject.GObject):
def update_callback(conn, res, data):
playlist_urn = conn.update_blank_finish(res)[0][0]['playlist']
self.tracker.query_async(
Query.get_playlist_with_urn(playlist_urn),
None, query_callback, None
)
self._tracker.query_async(
Query.get_playlist_with_urn(playlist_urn), None,
query_callback, None)
self.tracker.update_blank_async(
Query.create_playlist(title), GLib.PRIORITY_LOW,
None, update_callback, None
)
self._tracker.update_blank_async(
Query.create_playlist(title), GLib.PRIORITY_LOW, None,
update_callback, None)
@log
def rename(self, item, new_name):
......@@ -369,7 +367,7 @@ class Playlists(GObject.GObject):
conn.update_finish(res)
self.emit('playlist-renamed', item)
self.tracker.update_async(
self._tracker.update_async(
Query.rename_playlist(item.get_id(), new_name), GLib.PRIORITY_LOW,
None, update_callback, None)
......@@ -379,10 +377,9 @@ class Playlists(GObject.GObject):
conn.update_finish(res)
self.emit('playlist-deleted', item)
self.tracker.update_async(
self._tracker.update_async(
Query.delete_playlist(item.get_id()), GLib.PRIORITY_LOW,
None, update_callback, None
)
None, update_callback, None)
@log
def add_to_playlist(self, playlist, items):
......@@ -396,25 +393,22 @@ class Playlists(GObject.GObject):
return
entry_id = cursor.get_integer(0)
grilo.get_playlist_song_with_id(
playlist.get_id(), entry_id, get_callback
)
playlist_id, entry_id, get_callback)
def update_callback(conn, res, data):
entry_urn = conn.update_blank_finish(res)[0][0]['entry']
self.tracker.query_async(
Query.get_playlist_song_with_urn(entry_urn),
None, query_callback, None
)
self._tracker.query_async(
Query.get_playlist_song_with_urn(entry_urn), None,
query_callback, None)
playlist_id = playlist.get_id()
for item in items:
uri = item.get_url()
if not uri:
continue
self.tracker.update_blank_async(
Query.add_song_to_playlist(playlist.get_id(), uri),
GLib.PRIORITY_LOW,
None, update_callback, None
)
self._tracker.update_blank_async(
Query.add_song_to_playlist(playlist_id, uri),
GLib.PRIORITY_LOW, None, update_callback, None)
@log
def remove_from_playlist(self, playlist, items):
......@@ -422,14 +416,12 @@ class Playlists(GObject.GObject):
conn.update_finish(res)
self.emit('song-removed-from-playlist', playlist, data)
playlist_id = playlist.get_id()
for item in items:
self.tracker.update_async(
Query.remove_song_from_playlist(
playlist.get_id(), item.get_id()
),
GLib.PRIORITY_LOW,
None, update_callback, item
)
item_id = item.get_id()
self._tracker.update_async(
Query.remove_song_from_playlist(playlist_id, item_id),
GLib.PRIORITY_LOW, None, update_callback, item)
@log
def reorder_playlist(self, playlist, items, new_positions):
......@@ -442,10 +434,11 @@ class Playlists(GObject.GObject):
def update_callback(conn, res, data):
conn.update_finish(res)
playlist_id = playlist.get_id()
for item, new_position in zip(items, new_positions):
self.tracker.update_async(
Query.change_song_position(
playlist.get_id(), item.get_id(), new_position),
item_id = item.get_id()
self._tracker.update_async(
Query.change_song_position(playlist_id, item_id, new_position),
GLib.PRIORITY_LOW, None, update_callback, item)
@log
......
......@@ -25,6 +25,9 @@
# code, but you are not obligated to do so. If you do not wish to do so,
# delete this exception statement from your version.
import gi
gi.require_version('Tracker', '2.0')
from gi.repository import GLib, Tracker
from gnomemusic import log
import os
......
# Copyright 2019 The GNOME Music developers
# GNOME Music is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# GNOME Music is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with GNOME Music; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
# The GNOME Music authors hereby grant permission for non-GPL compatible
# GStreamer plugins to be used and distributed together with GStreamer
# and GNOME Music. This permission is above and beyond the permissions
# granted by the GPL license by which GNOME Music is covered. If you
# modify this code, you may extend this exception to your version of the
# code, but you are not obligated to do so. If you do not wish to do so,
# delete this exception statement from your version.
import logging
from gi.repository import GObject, Tracker
logger = logging.getLogger(__name__)
class TrackerWrapper(GObject.GObject):
"""Create a connection to an instance of Tracker"""
def __init__(self):
super().__init__()
try:
self._tracker = Tracker.SparqlConnection.get(None)
self._tracker_available = True
except Exception as e:
self._tracker = None
self._tracker_available = False
logger.error(
"Cannot connect to tracker, error {}\n".format(str(e)))
@GObject.Property(type=object, flags=GObject.ParamFlags.READABLE)
def tracker(self):
return self._tracker
@GObject.Property(type=bool, default=False)
def tracker_available(self):
"""Get Tracker availability.
Tracker is available if is SparqlConnection has been opened and
if a query can be
:returns: tracker availability
:rtype: bool
"""
return self._tracker_available
@tracker_available.setter
def tracker_available(self, value):
"""Set Tracker availability.
If a SparqlConnection has not been opened, Tracker availability
cannot be set to True.
:param bool value: new value
"""
if self._tracker is None:
self._tracker_available = False
else:
self._tracker_available = value
......@@ -48,6 +48,7 @@ class EmptyView(Gtk.Stack):
INITIAL = 0
EMPTY = 1
SEARCH = 2
NO_TRACKER = 3
__gtype_name__ = "EmptyView"
......@@ -72,7 +73,7 @@ class EmptyView(Gtk.Stack):
self._state = EmptyView.State.INITIAL
@GObject.Property(type=int, default=0, minimum=0, maximum=2)
@GObject.Property(type=int, default=0, minimum=0, maximum=3)
def state(self):
"""Get the state of the empty view
......@@ -94,6 +95,8 @@ class EmptyView(Gtk.Stack):
self._set_empty_state()
elif self._state == EmptyView.State.SEARCH:
self._set_search_state()
elif self._state == EmptyView.State.NO_TRACKER:
self._set_no_tracker_state()
self.show_all()
@log
......@@ -118,3 +121,24 @@ class EmptyView(Gtk.Stack):
self._main_label.props.label = _("No music found")
self._icon.props.margin_bottom = 18
self._information_label.props.label = _("Try a different search")
@log
def _set_no_tracker_state(self):
self._main_label.props.margin_bottom = 12
self._main_label.props.label = _(
"GNOME Music could not connect to Tracker")
self._icon.props.margin_bottom = 18
self._information_label.props.label = _(
"Your music files cannot be indexed without Tracker running")
self._icon.props.icon_name = "dialog-error-symbolic"
@log
def select_all(self):
"""Cannot select songs from EmptyView."""
pass
@log
def unselect_all(self):
"""Cannot select songs from EmptyView."""
pass
......@@ -44,6 +44,8 @@ class BaseModelColumns(IntEnum):
class BaseManager(GObject.GObject):
default_value = GObject.Property(type=int, default=1)
def __repr__(self):
return '<BaseManager>'
......@@ -69,10 +71,13 @@ class BaseManager(GObject.GObject):
['search_composer', _("Composer"), ''],
['search_track', _("Track Title"), ''],
]
for value in self.values:
iter_ = model.append()
model[iter_][0, 1, 2] = value
self.selected_id = self.values[1][BaseModelColumns.ID]
value = self.values[self.props.default_value]
self.selected_id = value[BaseModelColumns.ID]
@GObject.Property
def active(self):
......@@ -88,17 +93,15 @@ class BaseManager(GObject.GObject):
if selected_value != []:
selected_value = selected_value[0]
selected_index = self.values.index(selected_value)
self.selected_id = selected_value[BaseModelColumns.ID]
# If selected values has first entry then it is a default
# value. No need to set the tag there.
value_id = selected_value[BaseModelColumns.ID]
if (value_id != 'search_all'
and value_id != 'grl-tracker-source'):
# If selected value is the default one, hide the tag.
if selected_index == self.props.default_value:
self.entry.remove_tag(self._tag)
else:
self._tag.set_label(selected_value[BaseModelColumns.NAME])
self.entry.add_tag(self._tag)
else:
self.entry.remove_tag(self._tag)
class SourceManager(BaseManager):
......@@ -113,6 +116,7 @@ class SourceManager(BaseManager):
self.values.append(['', '', self._label])
self.values.append(['all', _("All"), ""])
self.values.append(['grl-tracker-source', _("Local"), ''])
self.props.default_value = 2
grilo.connect('new-source-added', self._add_new_source)
......@@ -281,6 +285,8 @@ class DropDown(Gtk.Revealer):
def initialize_filters(self, searchbar):
self._source_manager = SourceManager(
'source', _("Sources"), searchbar._search_entry)
self._source_manager.connect(
"notify::active", self._on_source_manager_value_changed)
self._source_filter.props.manager = self._source_manager
self._source_filter.connect(
......@@ -302,11 +308,12 @@ class DropDown(Gtk.Revealer):
def _on_selection_changed(self, klass, manager, id_):
manager.active = id_
if manager == self._source_manager:
is_tracker = self._is_tracker(id_)
self._search_filter.props.sensitive = is_tracker
self.search_manager.props.active = (
'search_all' if not is_tracker else '')
@log
def _on_source_manager_value_changed(self, klass, value):
is_tracker = self._is_tracker(klass.props.active)
self._search_filter.props.sensitive = is_tracker
self.search_manager.props.active = (
'search_all' if not is_tracker else '')
@log
def _is_tracker(self, grilo_id):
......@@ -348,7 +355,8 @@ class Searchbar(Gtk.SearchBar):
@Gtk.Template.Callback()
@log
def _tag_button_clicked(self, entry, tag_):
tag_.manager.active = tag_.manager.values[1][BaseModelColumns.ID]
default_value = tag_.manager.values[tag_.manager.props.default_value]
tag_.manager.props.active = default_value[BaseModelColumns.ID]
self._search_entry_changed(None)
@Gtk.Template.Callback()
......
......@@ -186,7 +186,7 @@ class SmoothScale(Gtk.Scale):
width = self.get_allocated_width()
padding = self.get_style_context().get_padding(
Gtk.StateFlags.NORMAL)
width -= padding.left + padding.right
width = max(width - (padding.left + padding.right), 1)
timeout_period = min(1000 * duration // width, 1000)
......
......@@ -201,7 +201,9 @@ class Window(Gtk.ApplicationWindow):
def _switch_to_empty_view(self):
did_initial_state = self._settings.get_boolean('did-initial-state')
if did_initial_state:
if not grilo.props.tracker_available:
self.views[View.EMPTY].props.state = EmptyView.State.NO_TRACKER
elif did_initial_state:
self.views[View.EMPTY].props.state = EmptyView.State.EMPTY
else:
self.views[View.EMPTY].props.state = EmptyView.State.INITIAL
......@@ -456,8 +458,8 @@ class Window(Gtk.ApplicationWindow):
and child != self.curr_view._artist_albums_widget):
self._stack.set_visible_child(self.views[View.ALBUM])
if self.props.selection_mode:
self.props.selection_mode = False
if self.props.selection_mode:
self.props.selection_mode = False
@log
def _switch_back_from_childview(self, klass=None):
......
......@@ -10,6 +10,7 @@ hr
hu
it
ko
nl
pl
pt_BR
ro
......
This diff is collapsed.
project('gnome-music',
version: '3.31.90',
version: '3.32.0',
meson_version: '>= 0.46.0'
)
......
......@@ -9,4 +9,4 @@ source_root = os.environ.get('MESON_SOURCE_ROOT')
print('Install schemas in build dir...')
subprocess.call(['glib-compile-schemas', source_root + '/data/'])
subprocess.call(['mkdir', '-p', build_root + '/data/glib-2.0/schemas'])
subprocess.call(['mv', source_root + '/data/gschemas.compiled', build_root + '/data/glib-2.0/schemas'])
\ No newline at end of file
subprocess.call(['mv', source_root + '/data/gschemas.compiled', build_root + '/data/glib-2.0/schemas'])
......@@ -63,8 +63,8 @@
"cleanup": [ "/bin", "/etc", "/libexec" ],
"config-opts": [ "-Ddocs=false",
"-Dfunctional_tests=false",
"-Dnetwork_manager=no",
"-Dstemmer=no",
"-Dnetwork_manager=disabled",
"-Dstemmer=disabled",
"-Dunicode_support=icu",
"-Dbash_completion=no" ],
"sources": [
......
......@@ -11,8 +11,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-music master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
"POT-Creation-Date: 2018-10-03 10:18+0000\n"
"PO-Revision-Date: 2018-06-25 03:53-0500\n"
"POT-Creation-Date: 2019-02-23 06:50+0000\n"
"PO-Revision-Date: 2019-03-10 09:36+0100\n"
"Last-Translator: Adolfo Jayme Barrientos <fitojb@ubuntu.com>\n"
"Language-Team: Catalan <tradgnome@softcatala.org>\n"
"Language: ca\n"
......@@ -20,7 +20,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Poedit 2.0.8\n"
"X-Generator: Poedit 2.1.1\n"
#: data/org.gnome.Music.appdata.xml.in.in:6
msgid "GNOME Music"
......@@ -36,16 +36,16 @@ msgid ""
"An easy way to play your music. Automatically discover music on your "
"computer, the local network and internet services."
msgstr ""
"Una manera senzilla de reproduir música. Descobriu automàticament "
"música al vostre ordinador, la xarxa local o a serveis d'Internet."
"Una manera senzilla de reproduir música. Descobriu automàticament música al "
"vostre ordinador, la xarxa local o a serveis d'Internet."
#: data/org.gnome.Music.appdata.xml.in.in:12
msgid ""
"Find tracks in your local collection, get music from DLNA servers or try "
"something new with the Jamendo and Magnatune services."
msgstr ""
"Trobeu cançons en la vostra col·lecció, obteniu música des de "
"servidors DLNA o proveu quelcom nou amb els serveis Jamendo i Magnatune."
"Trobeu cançons en la vostra col·lecció, obteniu música des de servidors DLNA "
"o proveu quelcom nou amb els serveis Jamendo i Magnatune."
#: data/org.gnome.Music.desktop.in.in:3 gnomemusic/application.py:55
#: gnomemusic/window.py:72
......@@ -207,7 +207,7 @@ msgstr "Publicat"
msgid "Running Length"
msgstr "Durada"
#: data/ui/AlbumWidget.ui:173 gnomemusic/widgets/searchbar.py:70
#: data/ui/AlbumWidget.ui:173 gnomemusic/widgets/searchbar.py:71
msgid "Composer"
msgstr "Compositor"
......@@ -349,7 +349,7 @@ msgstr "Aleatori/Repetició desactivada"
msgid "Previous"
msgstr "Anterior"
#: data/ui/PlayerToolbar.ui:88 gnomemusic/widgets/playertoolbar.py:144
#: data/ui/PlayerToolbar.ui:88 gnomemusic/widgets/playertoolbar.py:139
msgid "Play"
msgstr "Reprodueix"
......@@ -430,56 +430,56 @@ msgstr "Feu clic als elements per seleccionar-los"
msgid "_Add to Playlist"
msgstr "_Afegeix a la llista de reproducció"
#: gnomemusic/gstplayer.py:405
#: gnomemusic/gstplayer.py:410
msgid "Unable to play the file"
msgstr "No s'ha pogut reproduir el fitxer"
#: gnomemusic/gstplayer.py:411
#: gnomemusic/gstplayer.py:416
msgid "_Find in {}"
msgstr "_Cerca a {}"
#. TRANSLATORS: separator for two codecs
#: gnomemusic/gstplayer.py:422
#: gnomemusic/gstplayer.py:427
msgid " and "
msgstr " i "
#. TRANSLATORS: separator for a list of codecs
#: gnomemusic/gstplayer.py:425
#: gnomemusic/gstplayer.py:430
msgid ", "
msgstr ", "
#: gnomemusic/gstplayer.py:427
#: gnomemusic/gstplayer.py:432
msgid "{} is required to play the file, but is not installed."
msgid_plural "{} are required to play the file, but are not installed."
msgstr[0] "Cal {} per reproduir el fitxer però no està instal·lat."
msgstr[1] "Calen {} per reproduir el fitxer però no estan instal·lats."
#: gnomemusic/inhibitsuspend.py:68
#: gnomemusic/inhibitsuspend.py:67
msgid "Playing music"
msgstr "Reproducció de música"
#. TRANSLATORS: this is a playlist name
#: gnomemusic/playlists.py:60
#: gnomemusic/playlists.py:59
msgid "Most Played"
msgstr "Més reproduïdes"
#. TRANSLATORS: this is a playlist name
#: gnomemusic/playlists.py:65
#: gnomemusic/playlists.py:64
msgid "Never Played"
msgstr "Mai s'han reproduït"
#. TRANSLATORS: this is a playlist name
#: gnomemusic/playlists.py:70
#: gnomemusic/playlists.py:69
msgid "Recently Played"
msgstr "Reproduccions recents"
#. TRANSLATORS: this is a playlist name
#: gnomemusic/playlists.py:75
#: gnomemusic/playlists.py:74
msgid "Recently Added"
msgstr "Afegits recentment"
#. TRANSLATORS: this is a playlist name
#: gnomemusic/playlists.py:80
#: gnomemusic/playlists.py:79
msgid "Favorite Songs"
msgstr "Cançons preferides"
......@@ -491,53 +491,62 @@ msgstr "Artista desconegut"
msgid "Untitled"
msgstr "Sense títol"
#: gnomemusic/views/albumsview.py:44 gnomemusic/views/searchview.py:584
#: gnomemusic/views/albumsview.py:44 gnomemusic/views/searchview.py:577
msgid "Albums"
msgstr "Àlbums"
#: gnomemusic/views/artistsview.py:61 gnomemusic/views/searchview.py:586
#: gnomemusic/views/artistsview.py:61 gnomemusic/views/searchview.py:579
msgid "Artists"
msgstr "Artistes"
#: gnomemusic/views/emptyview.py:66
#: gnomemusic/views/emptyview.py:67
msgid "Music folder"
msgstr "Carpeta de la música"
#. TRANSLATORS: This is a label to display a link to open user's music
#. folder. {} will be replaced with the translated text 'Music folder'
#: gnomemusic/views/emptyview.py:70
#: gnomemusic/views/emptyview.py:71
msgid "The contents of your {} will appear here."
msgstr "Els continguts de la {} apareixeran aquí."
#: gnomemusic/views/emptyview.py:102
#: gnomemusic/views/emptyview.py:105
msgid "Hey DJ"
msgstr "Ep, DJ"
#: gnomemusic/views/emptyview.py:112 gnomemusic/views/emptyview.py:118
#: gnomemusic/views/emptyview.py:115 gnomemusic/views/emptyview.py:121
msgid "No music found"
msgstr "No s'ha trobat música"
#: gnomemusic/views/emptyview.py:120
#: gnomemusic/views/emptyview.py:123
msgid "Try a different search"
msgstr "Proveu una cerca diferent"
#: gnomemusic/views/playlistview.py:67 gnomemusic/views/searchview.py:590
#: gnomemusic/views/emptyview.py:129
msgid "GNOME Music could not connect to Tracker"
msgstr "El Música del GNOME no s'ha pogut connectar al Tracker"
#: gnomemusic/views/emptyview.py:132
msgid "Your music files cannot be indexed without Tracker running"
msgstr ""
"Els fitxers de música no es poden indexar si el Tracker no s'està executant"
#: gnomemusic/views/playlistview.py:67 gnomemusic/views/searchview.py:583
msgid "Playlists"
msgstr "Llistes de reproducció"
#: gnomemusic/views/playlistview.py:643
#: gnomemusic/views/playlistview.py:640
msgid "Playlist {} removed"
msgstr "S'ha suprimit la llista de reproducció {}"
#: gnomemusic/views/playlistview.py:649
#: gnomemusic/views/playlistview.py:646
msgid "{} removed from {}"
msgstr "{} suprimit de {}"
#: gnomemusic/views/searchview.py:588 gnomemusic/views/songsview.py:55
#: gnomemusic/views/searchview.py:581 gnomemusic/views/songsview.py:55
msgid "Songs"
msgstr "Cançons"
#: gnomemusic/widgets/albumwidget.py:166
#: gnomemusic/widgets/albumwidget.py:168
msgid "{} minute"
msgid_plural "{} minutes"
msgstr[0] "{} minut"
......@@ -561,7 +570,7 @@ msgstr "S'està carregant"
msgid "_Undo"
msgstr "_Desfés"
#: gnomemusic/widgets/playertoolbar.py:141
#: gnomemusic/widgets/playertoolbar.py:136
msgid "Pause"
msgstr "Fes una pausa"
......@@ -571,31 +580,31 @@ msgid_plural "{} Songs"
msgstr[0] "{} cançó"
msgstr[1] "{} cançons"
#: gnomemusic/widgets/searchbar.py:67 gnomemusic/widgets/searchbar.py:115
#: gnomemusic/widgets/searchbar.py:68 gnomemusic/widgets/searchbar.py:117
msgid "All"
msgstr "Totes"
#: gnomemusic/widgets/searchbar.py:68
#: gnomemusic/widgets/searchbar.py:69
msgid "Artist"
msgstr "Artista"
#: gnomemusic/widgets/searchbar.py:69
#: gnomemusic/widgets/searchbar.py:70
msgid "Album"
msgstr "Àlbum"
#: gnomemusic/widgets/searchbar.py:71
#: gnomemusic/widgets/searchbar.py:72
msgid "Track Title"
msgstr "Títol de la peça"
#: gnomemusic/widgets/searchbar.py:116
#: gnomemusic/widgets/searchbar.py:118
msgid "Local"
msgstr "Local"
#: gnomemusic/widgets/searchbar.py:284
#: gnomemusic/widgets/searchbar.py:287
msgid "Sources"
msgstr "Fonts"
#: gnomemusic/widgets/searchbar.py:293
#: gnomemusic/widgets/searchbar.py:298
msgid "Match"
msgstr "Coincidència"
......
......@@ -4,14 +4,14 @@
#
# Adam Matoušek <adamatousek@gmail.com>, 2013.
# Vojtěch Cajtler <vcajtler@seznam.cz>, 2015
# Marek Černocký <marek@manet.cz>, 2013, 2014, 2015, 2016, 2017, 2018.
# Marek Černocký <marek@manet.cz>, 2013, 2014, 2015, 2016, 2017, 2018, 2019.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-music master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
"POT-Creation-Date: 2018-10-03 10:18+0000\n"
"PO-Revision-Date: 2018-10-11 12:43+0200\n"
"POT-Creation-Date: 2019-02-13 09:09+0000\n"
"PO-Revision-Date: 2019-02-13 10:42+0100\n"
"Last-Translator: Marek Černocký <marek@manet.cz>\n"
"Language-Team: čeština <gnome-cs-list@gnome.org>\n"
"Language: cs\n"
......@@ -204,7 +204,7 @@ msgstr "Vydáno"
msgid "Running Length"
msgstr "Délka"
#: data/ui/AlbumWidget.ui:173 gnomemusic/widgets/searchbar.py:70
#: data/ui/AlbumWidget.ui:173 gnomemusic/widgets/searchbar.py:69
msgid "Composer"
msgstr "Skladatel"
......@@ -346,7 +346,7 @@ msgstr "Náhodně/opakování vypnuto"
msgid "Previous"
msgstr "Předchozí"
#: data/ui/PlayerToolbar.ui:88 gnomemusic/widgets/playertoolbar.py:144
#: data/ui/PlayerToolbar.ui:88 gnomemusic/widgets/playertoolbar.py:139
msgid "Play"
msgstr "Přehrát"
......@@ -427,25 +427,25 @@ msgstr "Klikáním vyberte položky"
msgid "_Add to Playlist"
msgstr "Přid_at do seznamu k přehrání"
#: gnomemusic/gstplayer.py:405
#: gnomemusic/gstplayer.py:410
msgid "Unable to play the file"
msgstr "Soubor nelze přehrát"
#: gnomemusic/gstplayer.py:411
#: gnomemusic/gstplayer.py:416
msgid "_Find in {}"
msgstr "_Hledat v instalátoru {}"
#. TRANSLATORS: separator for two codecs
#: gnomemusic/gstplayer.py:422
#: gnomemusic/gstplayer.py:427
msgid " and "
msgstr " a "
#. TRANSLATORS: separator for a list of codecs
#: gnomemusic/gstplayer.py:425
#: gnomemusic/gstplayer.py:430
msgid ", "
msgstr ", "
#: gnomemusic/gstplayer.py:427
#: gnomemusic/gstplayer.py:432
msgid "{} is required to play the file, but is not installed."
msgid_plural "{} are required to play the file, but are not installed."
msgstr[0] "K přehrání souboru je zapotřebí kodek {}, ale není nainstalován."
......@@ -454,32 +454,32 @@ msgstr[1] ""
msgstr[2] ""
"K přehrání souboru jsou zapotřebí kodeky {}, ale nejsou nainstalovány."
#: gnomemusic/inhibitsuspend.py:68
#: gnomemusic/inhibitsuspend.py:67
msgid "Playing music"
msgstr "Přehrává se hudba"
#. TRANSLATORS: this is a playlist name
#: gnomemusic/playlists.py:60
#: gnomemusic/playlists.py:59
msgid "Most Played"
msgstr "Nejčastěji přehráváno"
#. TRANSLATORS: this is a playlist name
#: gnomemusic/playlists.py:65
#: gnomemusic/playlists.py:64
msgid "Never Played"
msgstr "Nikdy nepřehráno"
#. TRANSLATORS: this is a playlist name
#: gnomemusic/playlists.py:70
#: gnomemusic/playlists.py:69
msgid "Recently Played"
msgstr "Nedávno přehráno"
#. TRANSLATORS: this is a playlist name
#: gnomemusic/playlists.py:75
#: gnomemusic/playlists.py:74
msgid "Recently Added"
msgstr "Nedávno přidáno"
#. TRANSLATORS: this is a playlist name
#: gnomemusic/playlists.py:80
#: gnomemusic/playlists.py:79
msgid "Favorite Songs"
msgstr "Oblíbené skladby"
......@@ -491,53 +491,61 @@ msgstr "Neznámý umělec"
msgid "Untitled"
msgstr "Bez názvu"
#: gnomemusic/views/albumsview.py:44 gnomemusic/views/searchview.py:584
#: gnomemusic/views/albumsview.py:44 gnomemusic/views/searchview.py:577
msgid "Albums"
msgstr "Alba"
#: gnomemusic/views/artistsview.py:61 gnomemusic/views/searchview.py:586
#: gnomemusic/views/artistsview.py:61 gnomemusic/views/searchview.py:579
msgid "Artists"
msgstr "Umělci"
#: gnomemusic/views/emptyview.py:66
#: gnomemusic/views/emptyview.py:67
msgid "Music folder"
msgstr "Složka s hudbou"
#. TRANSLATORS: This is a label to display a link to open user's music
#. folder. {} will be replaced with the translated text 'Music folder'
#: gnomemusic/views/emptyview.py:70
#: gnomemusic/views/emptyview.py:71
msgid "The contents of your {} will appear here."
msgstr "Zde se objeví, co obsahuje vaše {}."
#: gnomemusic/views/emptyview.py:102
#: gnomemusic/views/emptyview.py:105
msgid "Hey DJ"
msgstr "Hej, DJ"
#: gnomemusic/views/emptyview.py:112 gnomemusic/views/emptyview.py:118
#: gnomemusic/views/emptyview.py:115 gnomemusic/views/emptyview.py:121
msgid "No music found"
msgstr "Nenalezena žádná hudba"
#: gnomemusic/views/emptyview.py:120
#: gnomemusic/views/emptyview.py:123
msgid "Try a different search"
msgstr "Zkuste hledat nějak jinak"
#: gnomemusic/views/playlistview.py:67 gnomemusic/views/searchview.py:590
#: gnomemusic/views/emptyview.py:129
msgid "GNOME Music could not connect to Tracker"
msgstr "Hudbě GNOME se nezdařilo spojit s programem Tracker"
#: gnomemusic/views/emptyview.py:132
msgid "Your music files cannot be indexed without Tracker running"
msgstr "Pokud ten neběží, není možné indexovat hudební soubory"
#: gnomemusic/views/playlistview.py:67 gnomemusic/views/searchview.py:583
msgid "Playlists"
msgstr "Seznamy k přehrání"
#: gnomemusic/views/playlistview.py:643
#: gnomemusic/views/playlistview.py:640
msgid "Playlist {} removed"
msgstr "Seznam k přehrání {} byl odstraněn"
#: gnomemusic/views/playlistview.py:649
#: gnomemusic/views/playlistview.py:646
msgid "{} removed from {}"
msgstr "Skladba {} byla odebrána ze seznamu {}"
#: gnomemusic/views/searchview.py:588 gnomemusic/views/songsview.py:55
#: gnomemusic/views/searchview.py:581 gnomemusic/views/songsview.py:55
msgid "Songs"
msgstr "Skladby"
#: gnomemusic/widgets/albumwidget.py:166
#: gnomemusic/widgets/albumwidget.py:168
msgid "{} minute"
msgid_plural "{} minutes"
msgstr[0] "{} minuta"
......@@ -563,7 +571,7 @@ msgstr "Načítá se"
msgid "_Undo"
msgstr "_Zpět"
#: gnomemusic/widgets/playertoolbar.py:141
#: gnomemusic/widgets/playertoolbar.py:136
msgid "Pause"
msgstr "Pozastavit"
......@@ -574,30 +582,30 @@ msgstr[0] "{} skladba"
msgstr[1] "{} skladby"
msgstr[2] "{} skladeb"
#: gnomemusic/widgets/searchbar.py:67 gnomemusic/widgets/searchbar.py:115
#: gnomemusic/widgets/searchbar.py:66 gnomemusic/widgets/searchbar.py:114
msgid "All"
msgstr "Vše"
#: gnomemusic/widgets/searchbar.py:68
#: gnomemusic/widgets/searchbar.py:67
msgid "Artist"
msgstr "Umělce"
#: gnomemusic/widgets/searchbar.py:69
#: gnomemusic/widgets/searchbar.py:68
msgid "Album"
msgstr "Album"
#: gnomemusic/widgets/searchbar.py:71
#: gnomemusic/widgets/searchbar.py:70
msgid "Track Title"
msgstr "Název stopy"
#: gnomemusic/widgets/searchbar.py:116
#: gnomemusic/widgets/searchbar.py:115
msgid "Local"
msgstr "Místní"
#: gnomemusic/widgets/searchbar.py:284
#: gnomemusic/widgets/searchbar.py:283
msgid "Sources"
msgstr "Zdroje"
#: gnomemusic/widgets/searchbar.py:293
#: gnomemusic/widgets/searchbar.py:292
msgid "Match"
msgstr "Porovnávat"
This diff is collapsed.
This diff is collapsed.
......@@ -3,14 +3,14 @@
# This file is distributed under the same license as the gnome-music package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
# Daniel Mustieles <daniel.mustieles@gmail.com>, 2012-2018, 2018.
# Daniel Mustieles <daniel.mustieles@gmail.com>, 2012-2019.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-music master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-music/issues\n"
"POT-Creation-Date: 2018-10-31 16:25+0000\n"
"PO-Revision-Date: 2018-12-04 15:50+0100\n"
"POT-Creation-Date: 2019-02-13 09:09+0000\n"
"PO-Revision-Date: 2019-02-13 11:54+0100\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: es <gnome-es-list@gnome.org>\n"
"Language: es\n"
......@@ -18,7 +18,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Gtranslator 2.91.7\n"
"X-Generator: Gtranslator 3.31.90\n"
#: data/org.gnome.Music.appdata.xml.in.in:6
msgid "GNOME Music"
......@@ -203,7 +203,7 @@ msgstr "Publicado"
msgid "Running Length"
msgstr "Duración"
#: data/ui/AlbumWidget.ui:173 gnomemusic/widgets/searchbar.py:70
#: data/ui/AlbumWidget.ui:173 gnomemusic/widgets/searchbar.py:69
msgid "Composer"
msgstr "Compositor"
......@@ -216,7 +216,6 @@ msgid "_Help"
msgstr "_Ayuda"
#: data/ui/AppMenu.ui:49
#| msgid "_About"
msgid "_About Music"
msgstr "_Acerca de Música"
......@@ -355,7 +354,6 @@ msgid "Next"
msgstr "Siguiente"
#: data/ui/PlaylistContextMenu.ui:5
#| msgid "Play"
msgctxt "context menu item"
msgid "Play"
msgstr "Reproducir"
......@@ -458,27 +456,27 @@ msgid "Playing music"
msgstr "Reproducir música"
#. TRANSLATORS: this is a playlist name
#: gnomemusic/playlists.py:60
#: gnomemusic/playlists.py:59
msgid "Most Played"
msgstr "Más reproducidas"
#. TRANSLATORS: this is a playlist name
#: gnomemusic/playlists.py:65
#: gnomemusic/playlists.py:64
msgid "Never Played"
msgstr "No reproducidas nunca"
#. TRANSLATORS: this is a playlist name
#: gnomemusic/playlists.py:70
#: gnomemusic/playlists.py:69
msgid "Recently Played"
msgstr "Reproducidas recientemente"
#. TRANSLATORS: this is a playlist name
#: gnomemusic/playlists.py:75
#: gnomemusic/playlists.py:74
msgid "Recently Added"
msgstr "Añadidas recientemente"
#. TRANSLATORS: this is a playlist name
#: gnomemusic/playlists.py:80
#: gnomemusic/playlists.py:79
msgid "Favorite Songs"
msgstr "Canciones favoritas"
......@@ -490,49 +488,58 @@ msgstr "Artista desconocido"
msgid "Untitled"
msgstr "Sin título"
#: gnomemusic/views/albumsview.py:44 gnomemusic/views/searchview.py:584
#: gnomemusic/views/albumsview.py:44 gnomemusic/views/searchview.py:577
msgid "Albums"
msgstr "Álbumes"
#: gnomemusic/views/artistsview.py:61 gnomemusic/views/searchview.py:586
#: gnomemusic/views/artistsview.py:61 gnomemusic/views/searchview.py:579
msgid "Artists"
msgstr "Artistas"
#: gnomemusic/views/emptyview.py:66
#: gnomemusic/views/emptyview.py:67
msgid "Music folder"
msgstr "Carpeta de música"
#. TRANSLATORS: This is a label to display a link to open user's music
#. folder. {} will be replaced with the translated text 'Music folder'
#: gnomemusic/views/emptyview.py:70
#: gnomemusic/views/emptyview.py:71
msgid "The contents of your {} will appear here."
msgstr "El contenido de su {} aparecerá aquí."
#: gnomemusic/views/emptyview.py:102
#: gnomemusic/views/emptyview.py:105
msgid "Hey DJ"
msgstr "Hola Dj"
#: gnomemusic/views/emptyview.py:112 gnomemusic/views/emptyview.py:118
#: gnomemusic/views/emptyview.py:115 gnomemusic/views/emptyview.py:121
msgid "No music found"
msgstr "No se ha encontrado música"
#: gnomemusic/views/emptyview.py:120
#: gnomemusic/views/emptyview.py:123
msgid "Try a different search"
msgstr "Pruebe a hacer una búsqueda diferente"
#: gnomemusic/views/playlistview.py:67 gnomemusic/views/searchview.py:590
#: gnomemusic/views/emptyview.py:129
msgid "GNOME Music could not connect to Tracker"