Skip to content

Commit f2659b9

Browse files
committed
Merge branch 'production' into schema-change-2021-q2
* production: Allow overriding REPLICATION_TYPE in admin/InitDb.pl Update POT files using the production database Update translations from Transifex Increase CAA bucket creation timeout to 30s Update POT files using the production database Update translations from Transifex MBS-11598: Do not generate image link if we don't have a suffix (metabrainz#2069) MBS-11590: Standardize display of empty fields in cover art edits (metabrainz#2076) MBS-11587: Block smart links: hypel.ink (metabrainz#2077) MBS-11612: Restore link to genre/delete to genre sidebar MBS-11620: Sort results of admin's search_by_email tool newest first MBS-11619: Ignore periods and +tags in e-mail admin searches MBS-11604: Add genre name to genre index title (metabrainz#2071) MBS-11611: Do not keep/add trailing slash in OC ReMix URLs (metabrainz#2072) MBS-10899: Report for releases with catnos that look like ISRCs (metabrainz#2067) Ensure CAA item ownership during upload process Check for valid mime_type in /ws/js/cover-art-upload Check for login in /ws/js/cover-art-upload Update POT files using the production database Put l() string on one line to avoid \n on .pot Update translations from Transifex MBS-9259: Add help section for the track parser (metabrainz#2046) Removing no longer needed '' defaults MBS-11550: Move PostParameters to static/scripts for translation (metabrainz#2032) MBS-11571: Warn about e-mail as a username (metabrainz#2049) MBS-11573: Load collections for ratings sidebars (metabrainz#2052) MBS-1588: Better errors for invalid CD TOC (metabrainz#2056) MBS-9251: Display ended places differently on the map (metabrainz#2051) MBBE-31: Remove now unneeded old RA checks (metabrainz#2028) MBS-11546: Allow Resident Advisor /exchange URLs for releases (metabrainz#2025) MBS-11603: Finetune DNB validation (metabrainz#2070) Update POT files using the production database Update translations from Transifex Use addColonText for Tracklist header MBS-11583: Use sanitized context in hydrated component (metabrainz#2066) Ensure privileges are encoded as a number MBS-11569: Limit entity types when creating collection from sidebar (metabrainz#2048) Update POT files using the production database Update translations from Transifex MBS-9631: Add 1200px to available image sizes (metabrainz#2054) Remove unused $c variable MBS-11582: Add a sortname method for instrument guess case (metabrainz#2065) Fix Catalyst warning: don't try undef linktype id to access $loaded (metabrainz#2062) MBS-11527: Block smart links: music.indiefy.net (metabrainz#2016) MBS-11533: Block smart links: snd.click (metabrainz#2023) Add keys to EditReleaseEvents to stop warning (metabrainz#2063) Fix Catalyst warning: don't try using undef to access hash (metabrainz#2059) Fix Catalyst warning: ensure parent format id is not undef (metabrainz#2060) MBS-11564: Don't block Niconi Commons links with Nicovideo cleanup (metabrainz#2044) MBS-11500: Do not pass GID of removed release to avoid linking (metabrainz#2035) Fix catalyst warning: don't try to trim/sanitize undef "strings" MBS-11563: Invalidate entity_link_type_counts on relationship inserts (metabrainz#2047) Fix Catalyst warning: don't pass undef review text to markdown (metabrainz#2061) Fix Catalyst warning: id is missing in edit previews (metabrainz#2057) MBS-10534: Handle DNB links (metabrainz#2030) MBS-11581: Skip darkened releases on Artwork->load_for_release_groups MBS-11581: Don't load darkened cover art for Set Cover Art form MBS-11552: Add validation for Classical Archives links MBS-11542: Allow and cleanup new Classical Archives links MBS-11524: Disallow https://*.bandcamp.com/ URLs at release and recording level (metabrainz#2050) MBS-11566: Ensure consistent ordering of appearances sections Pass public editor privs when converting editor to JSON Update the link to edit search help MBS-9376: Indicate that edit searches can be bookmarked + link docs MBS-11559: Specify tracklist is empty in Remove medium edits Bump Flow to 0.148.0 Update POT files using the production database Update translations from Transifex Revert "MBS-11367: Disable browser autocomplete for tags when non-empty" Increase the default relationship page limit sizes (metabrainz#2031) Update POT files using the production database Update translations from Transifex MBS-11531 (II): Pass $c to load_filtered call (metabrainz#2027) Optimize help message and fix CI MBS-9833: Add relationship style guide link Update POT files using the production database Update translations from Transifex MBS-11320 / MBS-11321: Don't add new medium if empty medium existed (metabrainz#1857) MBS-11531: Pass $c to _load in load_filtered MBS-9851: Allow finding edits w/ edit notes by not original editor MBS-11525: Link to downvoted per-entity list when seeing downvotes Restore original class names for collapse/expand-medium MBS-11530: Avoid common/MB/release code running on these MBS-11476: Don't show own open edits in /edit/open MBS-11373: Overwrite empty dates in relationship merges MBS-11386: Load area containment for indexed search MBS-11473: Don't try to filter open edits for user if logged out MBS-11442: Adding tags on add-cover-art page disables submit (metabrainz#1983) MBS-8807: Provide collection data to subscribers sub-pages MBS-11538: Collections data missing in some sidebars MBS-11222: Add a report for releases with media without a tracklist MBS-11367: Disable browser autocomplete for tags when non-empty MBS-11467: Use sort name to order lists of artists for tags MBS-9543: Avoid false negative for string '0' MBS-9349: Add Pinterest links to the sidebar MBS-11510: Stop overwriting titles in disableBecauseDiscIDs Update POT files using the production database Update translations from Transifex MBS-11513: Use React.useContext in reports MBS-11516: Use React.useContext in [Entity]List MBS-11514: Use React.useContext in [Entity]Sidebar MBS-11514: Use React.useContext in SidebarTags MBS-11514: Use React.useContext in SubscriptionLinks MBS-11517: Use React.useContext in MergeHelper MBS-11515: Use React.useContext in Footer MBS-11515: Use React.useContext in TopMenu/BottomMenu MBS-11515: Use React.useContext in Head MBS-11514: Use React.useContext in CollectionLinks MBS-11514: Use React.useContext in AnnotationLinks MBS-11514: Use React.useContext in EditLinks Output work recordings sitemaps Simplify the user tag pages UI Add link back to UserTag from UserTagEntity More specific headers / texts depending on entity type MBS-10690: Convert user/tags.tt to React MBS-1870 / MBS-8477 / MBS-10341: User tag page improvements Use formatCount directly instead of through exp.l MBS-11455: Hide view links on stats when logged out MBS-11429: Don't error on existing but now blocked links MBS-11432: Allow also linking places and works to Operabase MBS-11454: Don't consider hasTooEarlyFormat a blocking error MBS-11485: Allow irc(s):// links on expand2react MBS-11503: Block smart links: trac.co MBS-11508: Move Qobuz favicon to external-favicons MBS-11506 - Redirect 'data' link on home page Use EntityLink for link_type links instead of hand-building MBS-9310: Link to relationship type in Add Relationship Type edits MBS-10726 (II): Also do disc -> medium in backend MBS-1178: Relationships table paging Move DIRECTION_ constants to Constants.pm Don't sort arbitrary link types by child_order Improve wording for DisambiguationSameName Make reports use ReportLayout (XII: Releases III) Make reports use ReportLayout (XI: Releases II) Make reports use ReportLayout (X: Releases I) Make reports use ReportLayout (IX: RGs) Make reports use ReportLayout (VIII: Labels / Editors / Events / Places) Make reports use ReportLayout (VII: Recordings) Make reports use ReportLayout (VI: Instruments/ISRCs/ISWCs) Make reports use ReportLayout (V: Discogs links) Make reports use ReportLayout (IV: Artists) Make reports use ReportLayout (III: Duplicate rels) Make reports use ReportLayout (II: Deprecated rels) Make reports use ReportLayout (I: Annotation) Add reusable ReportLayout component MBS-10726: Use "medium", not "disc", as a generic term in RE buttons Bump Flow to 0.147.0 MBS-11217: Only show instrument reports to relationship editors Refactor ReportsIndex to reuse component for each entry MBS-11452: Fix public_subscriptions check in serialize_user MBS-11462: Hide private subscriptions/tags/ratings tabs from admins
2 parents 312400d + 8e8d177 commit f2659b9

File tree

444 files changed

+29933
-27253
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

444 files changed

+29933
-27253
lines changed

admin/InitDb.pl

+4-1
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,8 @@ sub Usage
473473
(Should only be used, when an import without the option
474474
fails with an "ERROR: invalid UTF-8 byte sequence detected"!
475475
see also `MBImport.pl --help')
476+
--reptype=TYPE Override the REPLICATION_TYPE set in DBDefs. This only
477+
exists for testing purposes.
476478
477479
Less commonly used options:
478480
@@ -508,7 +510,8 @@ sub Usage
508510
"fix-broken-utf8" => \$fFixUTF8,
509511
"install-extension=s" => \$fInstallExtension,
510512
"extension-schema=s" => \$fExtensionSchema,
511-
"tmp-dir=s" => \$tmp_dir
513+
"tmp-dir=s" => \$tmp_dir,
514+
"reptype=s" => \$REPTYPE,
512515
) or exit 2;
513516

514517
my $DB = Databases->get($databaseName);

contrib/ssssss.psgi

+71-7
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ use Plack::Request;
4141
use Plack::Response;
4242
use Log::Dispatch;
4343

44+
use lib "$FindBin::Bin/../lib";
45+
use DBDefs;
46+
4447
my $log = Log::Dispatch->new(outputs => [[ 'Screen', min_level => 'info' ]] );
4548
my $imgext = 'gif|jpg|pdf|png';
4649
my $ssssss_storage = $ENV{SSSSSS_STORAGE}
@@ -72,6 +75,16 @@ sub create_bucket
7275
return $bucketdir;
7376
}
7477

78+
sub bucket_exists
79+
{
80+
my $bucket = shift;
81+
my $bucketdir = catfile($ssssss_storage, $bucket);
82+
if (-d $bucketdir) {
83+
return 1;
84+
}
85+
return 0;
86+
}
87+
7588
sub handle_options
7689
{
7790
my $response = shift->new_response(200);
@@ -80,17 +93,53 @@ sub handle_options
8093
return $response;
8194
}
8295

96+
sub check_authorization_header
97+
{
98+
my ($request) = @_;
99+
my $auth = $request->header('authorization');
100+
101+
my ($user, $pass) = $auth =~ /^LOW ([^:]+):(.+)$/;
102+
if (
103+
!defined $user ||
104+
!defined $pass ||
105+
$user ne DBDefs->COVER_ART_ARCHIVE_ACCESS_KEY ||
106+
$pass ne DBDefs->COVER_ART_ARCHIVE_SECRET_KEY
107+
) {
108+
my $response = $request->new_response(403);
109+
$response->content_type('text/xml');
110+
$response->body(q{<?xml version='1.0' encoding='UTF-8'?>
111+
<Error><Code>AccessDenied</Code></Error>});
112+
return $response;
113+
}
114+
}
115+
83116
sub handle_put
84117
{
85118
my ($request) = @_;
86119

87-
my $bucketdir = create_bucket($request->path_info);
88-
my $dest = catfile($bucketdir, $request->param('file'));
89-
$log->info("PUT, storing upload at $dest\n");
120+
my $response = check_authorization_header($request);
121+
if ($response) {
122+
return $response;
123+
}
90124

91-
open(my $fh, ">", $dest);
92-
print $fh $request->content;
93-
close($fh);
125+
my $file = $request->param('file');
126+
if ($file) {
127+
my $bucketdir = create_bucket($request->path_info);
128+
my $dest = catfile($bucketdir, $file);
129+
$log->info("PUT, storing upload at $dest\n");
130+
131+
open(my $fh, ">", $dest);
132+
print $fh $request->content;
133+
close($fh);
134+
} elsif (bucket_exists($request->path_info)) {
135+
$response = $request->new_response(409);
136+
$response->content_type('text/xml');
137+
$response->body(q{<?xml version='1.0' encoding='UTF-8'?>
138+
<Error><Code>BucketAlreadyExists</Code></Error>});
139+
return $response;
140+
} else {
141+
create_bucket($request->path_info);
142+
}
94143

95144
return $request->new_response(204);
96145
}
@@ -149,7 +198,22 @@ my %mime_types = (
149198
sub handle_get {
150199
my ($request) = @_;
151200

152-
my $filename = catfile($ssssss_storage, $request->path_info);
201+
my $path_info = $request->path_info;
202+
203+
# Simulate the only bits from
204+
# https://archive.org/services/docs/api/metadata.html that we need.
205+
#
206+
# This doesn't exactly belong in an "S3 simulator" service, but
207+
# it's simpler to have it here than to create a whole 'nother file
208+
# that has to run on a different port.
209+
if ($path_info =~ m{^/metadata/}) {
210+
my $response = $request->new_response(200);
211+
$response->content_type('application/json; charset=UTF-8');
212+
$response->body(q({"is_dark":false,"metadata":{"uploader":"[email protected]"}}));
213+
return $response;
214+
}
215+
216+
my $filename = catfile($ssssss_storage, $path_info);
153217

154218
if (-f $filename) {
155219
my ($ext) = $filename =~ m/\.($imgext)$/;

entities.json

+5-1
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,11 @@
392392
"id": 18
393393
},
394394
"last_updated_column": true,
395-
"model": "LinkType"
395+
"mbid": {
396+
"relatable": false
397+
},
398+
"model": "LinkType",
399+
"url": "relationship"
396400
},
397401
"medium": {"model": "Medium"},
398402
"medium_cdtoc": {"model": "MediumCDTOC"},

lib/DBDefs/Default.pm

+1
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,7 @@ sub COVER_ART_ARCHIVE_SECRET_KEY { };
359359
sub COVER_ART_ARCHIVE_UPLOAD_PREFIXER { shift; sprintf("//%s.s3.us.archive.org/", shift) };
360360
sub COVER_ART_ARCHIVE_DOWNLOAD_PREFIX { "//coverartarchive.org" };
361361
sub COVER_ART_ARCHIVE_IA_DOWNLOAD_PREFIX { '//archive.org/download' };
362+
sub COVER_ART_ARCHIVE_IA_METADATA_PREFIX { 'https://archive.org/metadata' };
362363

363364
# Mapbox access token must be set to display area/place maps.
364365
sub MAPBOX_MAP_ID { 'mapbox/streets-v11' }

lib/MusicBrainz/Server/Constants.pm

+13-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ sub _get
2525
}
2626

2727
our %EXPORT_TAGS = (
28+
direction => _get(qr/^DIRECTION_/),
2829
edit_type => _get(qr/^EDIT_/),
2930
expire_action => _get(qr/^EXPIRE_/),
3031
quality => _get(qr/^QUALITY_/),
@@ -36,7 +37,7 @@ our %EXPORT_TAGS = (
3637
vote => _get(qr/^VOTE_/),
3738
edit_status => _get(qr/^STATUS_/),
3839
access_scope => _get(qr/^ACCESS_SCOPE_/),
39-
privileges => _get(qr/_FLAG$/),
40+
privileges => _get(qr/_FLAGS?$/),
4041
language_frequency => _get(qr/^LANGUAGE_FREQUENCY/),
4142
script_frequency => _get(qr/^SCRIPT_FREQUENCY/),
4243
election_status => [
@@ -104,6 +105,9 @@ Readonly our $VARTIST_ID => 1;
104105
Readonly our $NOLABEL_GID => '157afde4-4bf5-4039-8ad2-5a15acc85176';
105106
Readonly our $NOLABEL_ID => 3267;
106107

108+
Readonly our $DIRECTION_FORWARD => 1;
109+
Readonly our $DIRECTION_BACKWARD => 2;
110+
107111
Readonly our $EXPIRE_ACCEPT => 1;
108112
Readonly our $EXPIRE_REJECT => 2;
109113

@@ -341,6 +345,14 @@ Readonly our $LOCATION_EDITOR_FLAG => 256;
341345
Readonly our $BANNER_EDITOR_FLAG => 512;
342346
Readonly our $EDITING_DISABLED_FLAG => 1024;
343347
Readonly our $ADDING_NOTES_DISABLED_FLAG => 2048;
348+
# If you update this, also update root/utility/sanitizedEditor.js
349+
Readonly our $PUBLIC_PRIVILEGE_FLAGS => $AUTO_EDITOR_FLAG &
350+
$BOT_FLAG &
351+
$RELATIONSHIP_EDITOR_FLAG &
352+
$WIKI_TRANSCLUSION_FLAG &
353+
$ACCOUNT_ADMIN_FLAG &
354+
$LOCATION_EDITOR_FLAG &
355+
$BANNER_EDITOR_FLAG;
344356

345357
Readonly our $ELECTION_VOTE_NO => -1;
346358
Readonly our $ELECTION_VOTE_ABSTAIN => 0;

lib/MusicBrainz/Server/Controller/Area.pm

+38-10
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ with 'MusicBrainz::Server::Controller::Role::Load' => {
99
cardinal => ['edit'],
1010
subset => {
1111
show => [qw( area artist label place series instrument release_group url )],
12+
},
13+
paged_subset => {
1214
recordings => ['recording'],
1315
releases => ['release'],
1416
works => ['work'],
@@ -214,17 +216,27 @@ sub releases : Chained('load')
214216
{
215217
my ($self, $c) = @_;
216218

217-
my $releases = $self->_load_paged($c, sub {
218-
$c->model('Release')->find_by_country($c->stash->{area}->id, shift, shift);
219+
my $stash = $c->stash;
220+
my $paged_link_type_group = $stash->{paged_link_type_group};
221+
my $releases;
222+
223+
unless ($paged_link_type_group) {
224+
$releases = $self->_load_paged($c, sub {
225+
$c->model('Release')->find_by_country($stash->{area}->id, shift, shift);
219226
});
227+
$c->model('ArtistCredit')->load(@$releases);
228+
$c->model('Release')->load_related_info(@$releases);
229+
}
220230

221-
$c->model('ArtistCredit')->load(@$releases);
222-
$c->model('Release')->load_related_info(@$releases);
231+
my $pager = defined $stash->{pager}
232+
? serialize_pager($stash->{pager})
233+
: undef;
223234

224235
my %props = (
225-
area => $c->stash->{area}->TO_JSON,
226-
releases => to_json_array($releases),
227-
pager => serialize_pager($c->stash->{pager}),
236+
area => $stash->{area}->TO_JSON,
237+
releases => to_json_array($releases),
238+
pagedLinkTypeGroup => to_json_object($paged_link_type_group),
239+
pager => $pager,
228240
);
229241

230242
$c->stash(
@@ -312,9 +324,17 @@ Shows recordings related to this area.
312324
sub recordings : Chained('load') {
313325
my ($self, $c) = @_;
314326

327+
my $stash = $c->stash;
328+
my $pager = defined $stash->{pager}
329+
? serialize_pager($stash->{pager})
330+
: undef;
315331
$c->stash(
316332
component_path => 'area/AreaRecordings',
317-
component_props => { area => $c->stash->{area}->TO_JSON },
333+
component_props => {
334+
area => $stash->{area}->TO_JSON,
335+
pagedLinkTypeGroup => to_json_object($stash->{paged_link_type_group}),
336+
pager => $pager,
337+
},
318338
current_view => 'Node',
319339
);
320340
}
@@ -328,14 +348,22 @@ Shows works related to this area.
328348
sub works : Chained('load') {
329349
my ($self, $c) = @_;
330350

351+
my $stash = $c->stash;
352+
my $pager = defined $stash->{pager}
353+
? serialize_pager($stash->{pager})
354+
: undef;
331355
$c->stash(
332356
component_path => 'area/AreaWorks',
333-
component_props => { area => $c->stash->{area}->TO_JSON },
357+
component_props => {
358+
area => $stash->{area}->TO_JSON,
359+
pagedLinkTypeGroup => to_json_object($stash->{paged_link_type_group}),
360+
pager => $pager,
361+
},
334362
current_view => 'Node',
335363
);
336364
}
337365

338-
after [qw( show collections details tags aliases artists labels releases recordings places users works )] => sub {
366+
after [qw( show collections details tags aliases artists events labels releases recordings places users works )] => sub {
339367
my ($self, $c) = @_;
340368
$self->_stash_collections($c);
341369
};

lib/MusicBrainz/Server/Controller/Artist.pm

+22-7
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,16 @@ BEGIN { extends 'MusicBrainz::Server::Controller'; }
99
with 'MusicBrainz::Server::Controller::Role::Load' => {
1010
model => 'Artist',
1111
relationships => {
12-
all => ['relationships'],
1312
cardinal => ['edit'],
14-
subset => { split => ['artist'], show => ['artist', 'url'] },
15-
default => ['url']
13+
subset => {
14+
split => ['artist'],
15+
show => ['artist', 'url'],
16+
relationships => [qw( area artist event instrument label place series url )],
17+
},
18+
default => ['url'],
19+
paged_subset => {
20+
relationships => [qw( recording release release_group work )],
21+
},
1622
},
1723
};
1824
with 'MusicBrainz::Server::Controller::Role::LoadWithRowID';
@@ -50,6 +56,7 @@ use MusicBrainz::Server::Data::Utils qw(
5056
is_special_artist
5157
);
5258
use MusicBrainz::Server::Constants qw(
59+
:direction
5360
$DARTIST_ID
5461
$EDITOR_MODBOT
5562
$EDIT_ARTIST_MERGE
@@ -261,7 +268,7 @@ sub show : PathPart('') Chained('load')
261268
my $legal_name_artist_aliases;
262269
my $legal_name_aliases;
263270
my ($legal_name) = map { $_->target }
264-
grep { $_->direction == $MusicBrainz::Server::Entity::Relationship::DIRECTION_BACKWARD }
271+
grep { $_->direction == $DIRECTION_BACKWARD }
265272
grep { $_->link->type->gid eq 'dd9886f2-1dfe-4270-97db-283f6839a666' } @{ $artist->relationships };
266273
if (defined $legal_name) {
267274
$c->model('Relationship')->load_subset(['artist'], $legal_name);
@@ -293,7 +300,7 @@ sub show : PathPart('') Chained('load')
293300
grep { $_->id != $artist->id }
294301
uniq
295302
map { $_->target }
296-
grep { $_->direction == $MusicBrainz::Server::Entity::Relationship::DIRECTION_FORWARD }
303+
grep { $_->direction == $DIRECTION_FORWARD }
297304
grep { $_->link->type->gid eq 'dd9886f2-1dfe-4270-97db-283f6839a666' }
298305
@{ ($legal_name // $artist)->relationships };
299306
push(@identities, @other_identities);
@@ -330,9 +337,17 @@ sub show : PathPart('') Chained('load')
330337
sub relationships : Chained('load') PathPart('relationships') {
331338
my ($self, $c) = @_;
332339

340+
my $stash = $c->stash;
341+
my $pager = defined $stash->{pager}
342+
? serialize_pager($stash->{pager})
343+
: undef;
333344
$c->stash(
334345
component_path => 'artist/ArtistRelationships',
335-
component_props => { artist => $c->stash->{artist}->TO_JSON },
346+
component_props => {
347+
artist => $stash->{artist}->TO_JSON,
348+
pagedLinkTypeGroup => to_json_object($stash->{paged_link_type_group}),
349+
pager => $pager,
350+
},
336351
current_view => 'Node',
337352
);
338353
}
@@ -526,7 +541,7 @@ sub releases : Chained('load')
526541
);
527542
}
528543

529-
after [qw( show collections details tags aliases releases recordings works events relationships )] => sub {
544+
after [qw( show collections details tags ratings aliases subscribers releases recordings works events relationships )] => sub {
530545
my ($self, $c) = @_;
531546
$self->_stash_collections($c);
532547
};

lib/MusicBrainz/Server/Controller/CDTOC.pm

+3-2
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,8 @@ sub attach : Local DenyWhenReadonly Edit
158158
my $cdtoc = MusicBrainz::Server::Entity::CDTOC->new_from_toc($toc)
159159
or $self->error(
160160
$c, status => HTTP_BAD_REQUEST,
161-
message => l('The provided CD TOC is not valid')
161+
message => l(
162+
'The provided CD TOC is not valid. This is probably an issue with the software you used to generate it. Try again and please report the error to your software maker if it persists, including the technical information below.')
162163
);
163164

164165
$c->stash( cdtoc => $cdtoc );
@@ -351,7 +352,7 @@ sub move : Local Edit
351352
my $medium_cdtoc = $c->model('MediumCDTOC')->get_by_id($medium_cdtoc_id)
352353
or $self->error(
353354
$c, status => HTTP_BAD_REQUEST,
354-
message => l('The provided CD TOC is not valid')
355+
message => l('The provided CD TOC ID doesn’t exist.')
355356
);
356357

357358
$c->model('CDTOC')->load($medium_cdtoc);

0 commit comments

Comments
 (0)