Skip to content

Commit

Permalink
Merge branch 'beta' into production
Browse files Browse the repository at this point in the history
* beta:
  Update POT files using the production database
  Update translations from Transifex
  Update POT files using the production database
  Replace "special entity" with "special purpose entity"
  Update translations from Transifex
  MBS-11130: Clarify it's not possible to subscribe to VA / [no label] (#1754)
  MBS-11841: Convert Set Track Lengths edit to React (#2234)
  MBS-11819: Show to admins whether account has oAuth uses (#2250)
  MBS-8820: Show explanation if artist relationships tab shows no rels (#1977)
  MBS-8098: Allow release-group-level-rels in release lookup (#2213)
  MBS-6140: Allow (recording|work)-level-rels for release browse (#2173)
  MBS-11940: Properly error for invalid XML sent to /ws/2/tag (#2258)
  MBS-11843: Add report for "Events with annotations" (#2193)
  Make user/tag pages 403 if tag is meant to be private
  Add test for RemoveEmpty url
  Make the timeline icon clearer & easier to click
  MBS-11794: Link to edit searches on statistics/edits page
  MBS-11799: Display "credited as" field in sidebar external links (#2180)
  Ensure tooltip content has standard formatting
  MBS-11717: Also show edits pending in ArtistCreditUsageLink
  MBS-11944: Fix label on button for place merges (#2254)
  MBS-11907: Block vyd.co link aggregator (#2249)
  In-code doc: Comment URL rel. UUIDs with name
  Bump Flow to 0.159.0
  MBS-11932: Also exclude work licenses from LinksWithMultipleEntities
  Set hostname of MB data export
  MBS-9454: Autoremove unused urls with daily.sh
  • Loading branch information
reosarevok committed Sep 20, 2021
2 parents f75e5ab + 401bb42 commit a78fc2d
Show file tree
Hide file tree
Showing 86 changed files with 4,257 additions and 3,000 deletions.
3 changes: 3 additions & 0 deletions admin/cron/daily.sh
Expand Up @@ -50,6 +50,9 @@ echo `date`" : Removing unused release groups"
echo `date`" : Removing unused series"
./admin/cleanup/RemoveEmpty series

echo `date`" : Removing unused urls"
./admin/cleanup/RemoveEmpty url

echo `date`" : Removing unused works"
./admin/cleanup/RemoveEmpty work

Expand Down
3 changes: 3 additions & 0 deletions entities.json
Expand Up @@ -719,6 +719,9 @@
"model": "URL",
"plural": "urls",
"plural_url": "urls",
"removal": {
"automatic": {}
},
"url": "url"
},
"work": {
Expand Down
61 changes: 34 additions & 27 deletions lib/MusicBrainz/Script/RemoveEmpty.pm
Expand Up @@ -116,33 +116,40 @@ sub run {

}
else {
Sql::run_in_transaction(sub {
my $edit = $self->c->model('Edit')->create(
edit_type => $edit_class{$entity},
to_delete => $e,
editor => $modbot,
privileges => $BOT_FLAG | $AUTO_EDITOR_FLAG
);

$self->c->model('EditNote')->add_note(
$edit->id,
{
editor_id => $EDITOR_MODBOT,
text => localized_note(
N_l('This entity was automatically removed because it was empty: ' .
'it had no relationships associated with it, nor (if ' .
'relevant for the type of entity in question) any recordings, ' .
'releases nor release groups. ' .
'If you consider this was a valid, non-duplicate entry ' .
'that does belong in MusicBrainz, feel free to add it again, ' .
'but please ensure enough data is added to it this time ' .
'to avoid another automatic removal.')
)
}
);

++$removed
}, $self->c->sql);
if ($entity eq 'url') {
Sql::run_in_transaction(sub {
$self->c->model('URL')->delete($e->id);
++$removed
}, $self->c->sql);
} else {
Sql::run_in_transaction(sub {
my $edit = $self->c->model('Edit')->create(
edit_type => $edit_class{$entity},
to_delete => $e,
editor => $modbot,
privileges => $BOT_FLAG | $AUTO_EDITOR_FLAG
);

$self->c->model('EditNote')->add_note(
$edit->id,
{
editor_id => $EDITOR_MODBOT,
text => localized_note(
N_l('This entity was automatically removed because it was empty: ' .
'it had no relationships associated with it, nor (if ' .
'relevant for the type of entity in question) any recordings, ' .
'releases nor release groups. ' .
'If you consider this was a valid, non-duplicate entry ' .
'that does belong in MusicBrainz, feel free to add it again, ' .
'but please ensure enough data is added to it this time ' .
'to avoid another automatic removal.')
)
}
);

++$removed
}, $self->c->sql);
}
}
}

Expand Down
22 changes: 14 additions & 8 deletions lib/MusicBrainz/Server/Controller/User.pm
Expand Up @@ -441,6 +441,10 @@ sub profile : Chained('load') PathPart('') HiddenOnSlaves
$c->stash->{subscriber_count} = $subscr_model->get_subscribed_editor_count($user->id);
$c->stash->{votes} = $c->model('Vote')->editor_statistics($user);

my ($tokens, $token_count) = $c->model('EditorOAuthToken')->find_granted_by_editor($user->id);

my ($applications, $application_count) = $c->model('Application')->find_by_owner($user->id);

$c->model('Gender')->load($user);
$c->model('EditorLanguage')->load_for_editor($user);

Expand All @@ -459,14 +463,16 @@ sub profile : Chained('load') PathPart('') HiddenOnSlaves
}

my %props = (
editStats => $edit_stats,
ipHashes => \@ip_hashes,
subscribed => $c->stash->{subscribed},
subscriberCount => $c->stash->{subscriber_count},
user => $c->unsanitized_editor_json($user),
votes => $c->stash->{votes},
addedEntities => $added_entities,
secondaryStats => $secondary_stats,
applicationCount => $application_count,
editStats => $edit_stats,
ipHashes => \@ip_hashes,
subscribed => $c->stash->{subscribed},
subscriberCount => $c->stash->{subscriber_count},
tokenCount => $token_count,
user => $c->unsanitized_editor_json($user),
votes => $c->stash->{votes},
addedEntities => $added_entities,
secondaryStats => $secondary_stats,
);

$c->stash(
Expand Down
11 changes: 9 additions & 2 deletions lib/MusicBrainz/Server/Controller/WS/2/Release.pm
Expand Up @@ -28,7 +28,9 @@ my $ws_defs = Data::OptList::mkopt([
collection) ],
inc => [ qw(aliases artist-credits labels recordings discids
tags user-tags genres user-genres ratings user-ratings
release-groups media _relations annotation) ],
release-groups media recording-level-rels
release-group-level-rels work-level-rels
_relations annotation) ],
optional => [ qw(fmt limit offset) ],
},
release => {
Expand All @@ -37,7 +39,8 @@ my $ws_defs = Data::OptList::mkopt([
inc => [ qw(artists labels recordings release-groups aliases
tags user-tags genres user-genres ratings user-ratings collections user-collections
artist-credits discids media recording-level-rels
work-level-rels _relations annotation) ],
release-group-level-rels work-level-rels
_relations annotation) ],
optional => [ qw(fmt) ],
},
release => {
Expand Down Expand Up @@ -117,6 +120,10 @@ sub release_toplevel {
my @release_groups = map { $_->release_group } @releases;
$c->model('ReleaseGroup')->load_meta(@release_groups);

if ($inc->release_group_level_rels) {
push @rels_entities, @release_groups;
}

$self->linked_release_groups($c, $stash, \@release_groups);
}

Expand Down
9 changes: 8 additions & 1 deletion lib/MusicBrainz/Server/Controller/WS/2/Tag.pm
Expand Up @@ -66,9 +66,16 @@ sub tag_submit : Private
$self->_validate_post($c);

my $xp = MusicBrainz::Server::WebService::XML::XPath->new( xml => $c->request->body );
my @nodelist;
eval {
@nodelist = $xp->find('/mb:metadata/*/*')->get_nodelist;
};
if ($@) {
$self->_error($c, 'Invalid XML.');
}

my $submit = {};
for my $node ($xp->find('/mb:metadata/*/*')->get_nodelist)
for my $node (@nodelist)
{
my $type = $node->getLocalName;
$type =~ s/-/_/;
Expand Down
4 changes: 2 additions & 2 deletions lib/MusicBrainz/Server/Data/URL.pm
Expand Up @@ -250,7 +250,7 @@ sub _merge_impl
$self->c->model('Edit')->merge_entities('url', $new_id, @old_ids);
$self->c->model('Relationship')->merge_entities('url', $new_id, \@old_ids);

$self->_delete(@old_ids);
$self->delete(@old_ids);

return 1;
}
Expand Down Expand Up @@ -283,7 +283,7 @@ sub update
}
}

sub _delete {
sub delete {
my ($self, @ids) = @_;
$self->sql->do('DELETE FROM url WHERE id = any(?)', \@ids);
}
Expand Down
10 changes: 7 additions & 3 deletions lib/MusicBrainz/Server/Edit/Historic/SetTrackLengthsFromCDTOC.pm
Expand Up @@ -3,6 +3,7 @@ use strict;
use warnings;

use MusicBrainz::Server::Constants qw( $EDIT_HISTORIC_SET_TRACK_LENGTHS_FROM_CDTOC );
use MusicBrainz::Server::Entity::Util::JSON qw( to_json_array to_json_object );
use MusicBrainz::Server::Translation qw( N_l );
use MusicBrainz::Server::Track;
use MusicBrainz::Server::Edit::Historic::Base;
Expand All @@ -14,7 +15,7 @@ sub edit_name { N_l('Set track lengths') }
sub edit_kind { 'other' }
sub historic_type { 53 }
sub edit_type { $EDIT_HISTORIC_SET_TRACK_LENGTHS_FROM_CDTOC }
sub edit_template { 'set_track_lengths' }
sub edit_template_react { 'SetTrackLengths' }

sub _build_related_entities
{
Expand All @@ -39,8 +40,11 @@ sub build_display_data
my ($self, $loaded) = @_;

return {
mediums => [ map { Medium->new( release => $loaded->{Release}{$_} // Release->new() ) } @{ $self->data->{release_ids} } ],
cdtoc => $loaded->{CDTOC}{ $self->data->{cdtoc} },
releases => to_json_array([
map { $loaded->{Release}{$_} // Release->new( id => $_ ) }
@{ $self->data->{release_ids} }
]),
cdtoc => to_json_object( $loaded->{CDTOC}{ $self->data->{cdtoc} } ),
length => {
map {
$_ => [ map { MusicBrainz::Server::Track::UnformatTrackLength($_) }
Expand Down
22 changes: 14 additions & 8 deletions lib/MusicBrainz/Server/Edit/Medium/SetTrackLengths.pm
Expand Up @@ -7,6 +7,7 @@ use MooseX::Types::Structured qw( Dict );
use MusicBrainz::Server::Constants qw( $EDIT_SET_TRACK_LENGTHS );
use MusicBrainz::Server::Data::Utils qw( localized_note );
use MusicBrainz::Server::Edit::Types qw( Nullable );
use MusicBrainz::Server::Entity::Util::JSON qw( to_json_array to_json_object );
use MusicBrainz::Server::Translation qw( N_l );

use aliased 'MusicBrainz::Server::Entity::CDTOC';
Expand All @@ -22,6 +23,7 @@ with 'MusicBrainz::Server::Edit::Role::AlwaysAutoEdit';
sub edit_name { N_l('Set track lengths') }
sub edit_type { $EDIT_SET_TRACK_LENGTHS }
sub edit_kind { 'other' }
sub edit_template_react { 'SetTrackLengths' }

has '+data' => (
isa => Dict[
Expand Down Expand Up @@ -64,23 +66,27 @@ sub foreign_keys {
sub build_display_data {
my ($self, $loaded) = @_;

my @mediums;
my $medium;
my @releases;
my $medium_id = $self->data->{medium_id};

if ($medium_id && $loaded->{Medium}{$medium_id}) {
@mediums = ($loaded->{Medium}{$medium_id});
$medium = $loaded->{Medium}{$medium_id};
# Edits that have a medium_id can't affect multiple releases.
} else {
@mediums = map {
Medium->new( release => $loaded->{Release}{ $_->{id} } //
Release->new( name => $_->{name} ) )
@releases = map {
$loaded->{Release}{ $_->{id} } //
Release->new( id => $_->{id}, name => $_->{name} )
} @{ $self->data->{affected_releases} };
}

return {
cdtoc => $loaded->{CDTOC}{ $self->data->{cdtoc}{id} }
|| CDTOC->new_from_toc( $self->data->{cdtoc}{toc} ),
mediums => \@mediums,
cdtoc => to_json_object(
$loaded->{CDTOC}{ $self->data->{cdtoc}{id} }
|| CDTOC->new_from_toc( $self->data->{cdtoc}{toc} )
),
$medium ? (medium => to_json_object($medium)) : (),
releases => to_json_array(\@releases),
length => {
map { $_ => $self->data->{length}{$_} } qw( old new )
}
Expand Down
5 changes: 4 additions & 1 deletion lib/MusicBrainz/Server/Report/LinksWithMultipleEntities.pm
Expand Up @@ -26,7 +26,10 @@ sub query {
WHERE url.url NOT LIKE 'https://www.wikidata.org%' -- has its own report
AND url.url NOT LIKE 'https://www.discogs.com%' -- has its own report set
AND l.link_type_gid != '4f2e710d-166c-480c-a293-2e2c8d658d87' -- release ASINs have their own report
AND l.link_type_gid NOT IN ('004bd0c3-8a45-4309-ba52-fa99f3aa3d50', 'f25e301d-b87b-4561-86a0-5d2df6d26c0a') -- licenses are meant for reuse
AND l.link_type_gid NOT IN ( -- licenses are meant for reuse
'004bd0c3-8a45-4309-ba52-fa99f3aa3d50', -- release license
'f25e301d-b87b-4561-86a0-5d2df6d26c0a', -- recording license
'770ea9f4-cba0-4194-b77f-fe2740055e34') -- work license
GROUP BY url_id
HAVING count(*) > 1
EOSQL
Expand Down
1 change: 1 addition & 0 deletions lib/MusicBrainz/Server/ReportFactory.pm
Expand Up @@ -6,6 +6,7 @@ use MusicBrainz::Server::PagedReport;
@all = qw(
ASINsWithMultipleReleases
AnnotationsArtists
AnnotationsEvents
AnnotationsLabels
AnnotationsPlaces
AnnotationsRecordings
Expand Down
2 changes: 1 addition & 1 deletion lib/MusicBrainz/Server/WebService/WebServiceInc.pm
Expand Up @@ -13,7 +13,7 @@ has $_ => (
aliases discids isrcs media puids various_artists artist_credits
artists labels recordings releases release_groups works
tags genres ratings user_tags user_genres user_ratings collections user_collections
recording_level_rels work_level_rels rels annotation release_events
recording_level_rels release_group_level_rels work_level_rels rels annotation release_events
), map { $_ . '_rels' } @RELATABLE_ENTITIES);

has has_rels => (
Expand Down
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -78,7 +78,7 @@
"eslint-plugin-react": "7.20.6",
"eslint-plugin-react-hooks": "4.1.2",
"file-url": "2.0.2",
"flow-bin": "0.158.0",
"flow-bin": "0.159.0",
"gettext-parser": "3.1.0",
"http-proxy": "1.18.1",
"json5": "2.1.3",
Expand Down
10 changes: 5 additions & 5 deletions po/instrument_descriptions.nl.po
Expand Up @@ -7,8 +7,8 @@
msgid ""
msgstr ""
"Project-Id-Version: MusicBrainz\n"
"PO-Revision-Date: 2021-08-19 01:03+0000\n"
"Last-Translator: Michael Wiencek <email address hidden>\n"
"PO-Revision-Date: 2021-09-12 09:32+0000\n"
"Last-Translator: Maurits Meulenbelt <email address hidden>\n"
"Language-Team: Dutch (http://www.transifex.com/musicbrainz/musicbrainz/language/nl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
Expand Down Expand Up @@ -58,7 +58,7 @@ msgid ""
"see <a href=\"/instrument/9869ff82-9ba5-41a7-b2b2-e19f4e4a1083\">Seni "
"rebab</a>.<br /> For the medieval European pear-shaped fiddle see <a "
"href=\"/instrument/3f7302e4-f10f-4905-8d71-ef61141da383\">rebec</a>."
msgstr "De naam ‘rebab’ wordt gebruikt voor met name drie families snaarinstrumenten (gestreken en getokkeld):<br /> <ul><li>Grote, bootvormige instrumenten met een korte hals van het sarinda-type, zoals de kabuli-rebab</li> <li>Kleine spijkerluiten van het huqin-type, zoals de Indonesische rebab</li> <li>Verschillende formaten instrumenten met een peervormige klankkast en verschillende halslengtes, zoals de Kretenzische lier</li></ul><br /><br />Dankzij de soortgelijke namen worden ze in bronnen vaak door elkaar gehaald. Ook worden ze vaak verward met soortgelijke instrumenten zoals de <a href=\"/instrument/0d766870-3021-47ce-bd51-78d2d2484e1b\">ghidjak</a> (een spijkerluit) en <a href=\"/instrument/d50ba107-4930-4e0b-8b3f-ffbea4a1ade1\">queychak</a> (met bootvormige klankkast).<br />Het is nu niet bekend of de drie ondersoorten aan elkaar verwand zijn.<br /><br />Zie <a href=\"/instrument/3dbbb5ff-103b-4260-8cf6-679a73a7c552\">Indonesische rebab</a> voor de spijkerluit die in gamelan-ensembles wordt gebruikt.<br />Zie <a href=\"/instrument/7e42e637-c7b4-422c-ad56-f7fafbd961bb\">roebab</a> voor het bootvormige Afghaanse instrument kabuli rebab.<br />Zie <a href=\"/instrument/9869ff82-9ba5-41a7-b2b2-e19f4e4a1083\">seni rebab</a> voor de middeleeuwse Indiase getokkelde luit.<br />Zie <a href=\"/instrument/3f7302e4-f10f-4905-8d71-ef61141da383\">rebec</a> voor de middeleeuwse Europese peervormige vedel."
msgstr "De naam ‘rebab’ wordt gebruikt voor met name drie families snaarinstrumenten (gestreken en getokkeld):<br /> <ul><li>Grote, bootvormige instrumenten met een korte hals van het sarinda-type, zoals de kabuli-rebab</li> <li>Kleine spijkerluiten van het huqin-type, zoals de Indonesische rebab</li> <li>Verschillende formaten instrumenten met een peervormige klankkast en verschillende halslengtes, zoals de Kretenzische lier</li></ul><br /><br />Dankzij de soortgelijke namen worden ze in bronnen vaak door elkaar gehaald. Ook worden ze vaak verward met soortgelijke instrumenten zoals de <a href=\"/instrument/0d766870-3021-47ce-bd51-78d2d2484e1b\">ghidjak</a> (een spijkerluit) en <a href=\"/instrument/d50ba107-4930-4e0b-8b3f-ffbea4a1ade1\">queychak</a> (met bootvormige klankkast).<br />Het is nu niet bekend of de drie ondersoorten aan elkaar verwand zijn.<br /><br />Zie <a href=\"/instrument/3dbbb5ff-103b-4260-8cf6-679a73a7c552\">Indonesische rebab</a> voor de spijkerluit die in gamelan-ensembles wordt gebruikt.<br />Zie <a href=\"/instrument/7e42e637-c7b4-422c-ad56-f7fafbd961bb\">roebab</a> voor het bootvormige Afghaanse instrument kaboeli rebab.<br />Zie <a href=\"/instrument/9869ff82-9ba5-41a7-b2b2-e19f4e4a1083\">seni rebab</a> voor de middeleeuwse Indiase getokkelde luit.<br />Zie <a href=\"/instrument/3f7302e4-f10f-4905-8d71-ef61141da383\">rebec</a> voor de middeleeuwse Europese peervormige vedel."

#. name:chitra veena
#: DB:instrument/description:744
Expand Down Expand Up @@ -1376,7 +1376,7 @@ msgid ""
"Improved further by Jaffar Khan, it had a wooden soundboard, the fingerboard"
" covered with iron and all strings are steel or bronze.<br /> Less common "
"today, it was used for Dhrupad style music."
msgstr ""
msgstr "De sursingar is een Indiaas snaarinstrument met een houten kast en een kalebas die in verbinding staat met de holle houten hals. De toets en de snaren zijn van staal of brons.<br />Het instrument werd veel gebruikt voor dhroepad-muziek, maar is tegenwoordig zeldzamer."

#. name:morsing
#: DB:instrument/description:533
Expand Down Expand Up @@ -1615,7 +1615,7 @@ msgid ""
"soundbox and wooden fingerboard with mostly gut strings, it was developed "
"during medieval times by Tansen, who improved it and gave it metal "
"sympathetic strings."
msgstr ""
msgstr "De seni rebab is is een doorontwikkeling van de kaboeli rebab, met een klankkast die is bedekt met huid, een houten toets en voornamelijk darmsnaren. In de middeleeuwen werd het instrument verbeterd door Tansen, die onder andere metalen resonantiesnaren toevoegde."

#. name:jegogan
#: DB:instrument/description:979
Expand Down

0 comments on commit a78fc2d

Please sign in to comment.