summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog1
-rw-r--r--data/lang.txt13
-rw-r--r--data/style.css30
-rw-r--r--lib/VNDB/DB/Producers.pm26
-rw-r--r--lib/VNDB/DB/Releases.pm6
-rw-r--r--lib/VNDB/Handler/Producers.pm80
6 files changed, 96 insertions, 60 deletions
diff --git a/ChangeLog b/ChangeLog
index 0fc877d5..30e66bc0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,7 @@
- URL change: /u/logout => /u$id/logout
- Added human confirmation question to the register page
- Added "official" flag to vn<->vn relations
+ - Display releases grouped by VNs on producer pages
- Optimized SQL queries:
- dbScreenshotRandom()
- dbVNGet() with random ordering
diff --git a/data/lang.txt b/data/lang.txt
index 01c47f28..8ddd96d6 100644
--- a/data/lang.txt
+++ b/data/lang.txt
@@ -2575,12 +2575,12 @@ cs : Wikipedie
hu :
nl :
-:_prodpage_vnrel
-en : Visual Novel Relations
-ru : Связи новелл
-cs : Vztahy k vizuálním novelám
-hu : Visual Novel Összefüggések
-nl : Gerelateerde Visual Novels
+:_prodpage_rel
+en : Releases
+ru*:
+cs*:
+hu*:
+nl : Uitgaven
:_prodpage_norel
en : We have currently no visual novels by this producer.
@@ -2589,6 +2589,7 @@ cs : Nemáme žádné vizuální novely od tohoto producenta.
hu : Jelenleg nincsen visual novel bejegyzésünk ettől a készítőtől.
nl : Momenteel geen visual novels van deze producent bij ons bekend
+# (next two are unused at the moment)
:_prodpage_dev
en : developer
ru : разработчик
diff --git a/data/style.css b/data/style.css
index 5e522c01..075ce00c 100644
--- a/data/style.css
+++ b/data/style.css
@@ -826,19 +826,31 @@ div.scr_uploader { visibility: hidden; overflow: hidden; width: 1px; height: 1px
/***** Producer page/list *******/
-.producerpage ul {
- margin: 0 50px;
+.prodrel table {
+ width: 100%;
}
-.producerpage li {
- padding-top: 3px;
- list-style-type: none;
+.prodrel tr.vn td {
+ background: url($_boxbg$) repeat;
+ font-weight: bold;
}
-.producerpage li i {
- display: block;
- font-style: normal;
- float: left;
+.prodrel td.tc1 {
+ padding-left: 30px;
width: 80px;
}
+.prodrel td.tc2 {
+ text-align: center;
+ width: 50px;
+}
+.prodrel td.tc3 {
+ text-align: right;
+ padding: 0;
+ width: 120px;
+}
+.prodrel td.tc5 {
+ text-align: right;
+ width: 25px;
+ padding: 0;
+}
.producerbrowse ul {
float: left;
diff --git a/lib/VNDB/DB/Producers.pm b/lib/VNDB/DB/Producers.pm
index 5ec387cf..ad6f22b2 100644
--- a/lib/VNDB/DB/Producers.pm
+++ b/lib/VNDB/DB/Producers.pm
@@ -9,7 +9,7 @@ our @EXPORT = qw|dbProducerGet dbProducerRevisionInsert|;
# options: results, page, id, search, char, rev
-# what: extended changes vn relations relgraph
+# what: extended changes relations relgraph
sub dbProducerGet {
my $self = shift;
my %o = (
@@ -56,30 +56,6 @@ sub dbProducerGet {
$select, join(' ', @join), \%where,
);
- if(@$r && $o{what} =~ /vn/) {
- my %r = map {
- $r->[$_]{vn} = [];
- ($r->[$_]{id}, $_)
- } 0..$#$r;
-
- push @{$r->[$r{$_->{pid}}]{vn}}, $_ for (@{$self->dbAll(q|
- SELECT MAX(vp.pid) AS pid, v.id, MAX(vr.title) AS title, MAX(vr.original) AS original, MIN(rr.released) AS date,
- MAX(CASE WHEN vp.developer = true THEN 1 ELSE 0 END) AS developer, MAX(CASE WHEN vp.publisher = true THEN 1 ELSE 0 END) AS publisher
- FROM releases_producers vp
- JOIN releases_rev rr ON rr.id = vp.rid
- JOIN releases r ON r.latest = rr.id
- JOIN releases_vn rv ON rv.rid = rr.id
- JOIN vn v ON v.id = rv.vid
- JOIN vn_rev vr ON vr.id = v.latest
- WHERE vp.pid IN(!l)
- AND v.hidden = FALSE
- AND r.hidden = FALSE
- GROUP BY v.id
- ORDER BY date|,
- [ keys %r ]
- )});
- }
-
if(@$r && $o{what} =~ /relations/) {
my %r = map {
$r->[$_]{relations} = [];
diff --git a/lib/VNDB/DB/Releases.pm b/lib/VNDB/DB/Releases.pm
index cb8ad006..466a7ab4 100644
--- a/lib/VNDB/DB/Releases.pm
+++ b/lib/VNDB/DB/Releases.pm
@@ -10,7 +10,7 @@ use VNDB::Func 'gtintype';
our @EXPORT = qw|dbReleaseGet dbReleaseRevisionInsert|;
-# Options: id vid rev unreleased page results what date media sort reverse
+# Options: id vid pid rev unreleased page results what date media sort reverse
# platforms languages type minage search resolutions freeware doujin
# What: extended changes vn producers platforms media
# Sort: title released minage
@@ -25,6 +25,7 @@ sub dbReleaseGet {
$o{id} ? ( 'r.id = ?' => $o{id} ) : (),
$o{rev} ? ( 'c.rev = ?' => $o{rev} ) : (),
$o{vid} ? ( 'rv.vid = ?' => $o{vid} ) : (),
+ $o{pid} ? ( 'rp.pid = ?' => $o{pid} ) : (),
$o{patch} ? ( 'rr.patch = ?' => $o{patch} == 1 ? 1 : 0) : (),
$o{freeware} ? ( 'rr.freeware = ?' => $o{freeware} == 1 ? 1 : 0) : (),
$o{doujin} ? ( 'rr.doujin = ?' => $o{doujin} == 1 ? 1 : 0) : (),
@@ -61,8 +62,9 @@ sub dbReleaseGet {
}
my @join = (
- $o{rev} ? 'JOIN releases r ON r.id = rr.rid' : 'JOIN releases r ON rr.id = r.latest',
+ $o{rev} ? 'JOIN releases r ON r.id = rr.rid' : 'JOIN releases r ON rr.id = r.latest AND rr.rid = r.id',
$o{vid} ? 'JOIN releases_vn rv ON rv.rid = rr.id' : (),
+ $o{pid} ? 'JOIN releases_producers rp ON rp.rid = rr.id' : (),
$o{what} =~ /changes/ || $o{rev} ? (
'JOIN changes c ON c.id = rr.id',
'JOIN users u ON u.id = c.requester'
diff --git a/lib/VNDB/Handler/Producers.pm b/lib/VNDB/Handler/Producers.pm
index e6ccdffb..12485629 100644
--- a/lib/VNDB/Handler/Producers.pm
+++ b/lib/VNDB/Handler/Producers.pm
@@ -45,7 +45,7 @@ sub page {
my $p = $self->dbProducerGet(
id => $pid,
- what => 'vn extended relations'.($rev ? ' changes' : ''),
+ what => 'extended relations'.($rev ? ' changes' : ''),
$rev ? ( rev => $rev ) : ()
)->[0];
return 404 if !$p->{id};
@@ -76,7 +76,7 @@ sub page {
);
}
- div class => 'mainbox producerpage';
+ div class => 'mainbox';
$self->htmlItemMessage('p', $p);
h1 $p->{name};
h2 class => 'alttitle', $p->{original} if $p->{original};
@@ -117,28 +117,72 @@ sub page {
lit bb2html $p->{desc};
end;
}
-
end;
- div class => 'mainbox producerpage';
- h1 mt '_prodpage_vnrel';
- if(!@{$p->{vn}}) {
+
+ _releases($self, $p);
+
+ $self->htmlFooter;
+}
+
+sub _releases {
+ my($self, $p) = @_;
+
+ # prodpage_(dev|pub)
+ my $r = $self->dbReleaseGet(pid => $p->{id}, results => 999, what => 'vn platforms');
+ div class => 'mainbox prodrel';
+ h1 mt '_prodpage_rel';
+ if(!@$r) {
p mt '_prodpage_norel';
- } else {
- ul;
- for (@{$p->{vn}}) {
- li;
- i;
- lit $self->{l10n}->datestr($_->{date});
+ end;
+ return;
+ }
+
+ my %vn; # key = vid, value = [ $r1, $r2, $r3, .. ]
+ my @vn; # $vn objects in order of first release
+ for my $rel (@$r) {
+ for my $v (@{$rel->{vn}}) {
+ push @vn, $v if !$vn{$v->{vid}};
+ push @{$vn{$v->{vid}}}, $rel;
+ }
+ }
+
+ table;
+ for my $v (@vn) {
+ Tr class => 'vn';
+ td colspan => 5;
+ a href => "/v$v->{vid}", title => $v->{original}, $v->{title};
+ end;
+ end;
+ for my $rel (@{$vn{$v->{vid}}}) {
+ Tr;
+ td class => 'tc1'; lit $self->{l10n}->datestr($rel->{released}); end;
+ td class => 'tc2', !defined($rel->{minage}) ? '' : minage $rel->{minage};
+ td class => 'tc3';
+ for (sort @{$rel->{platforms}}) {
+ next if $_ eq 'oth';
+ cssicon $_, mt "_plat_$_";
+ }
+ cssicon "lang $_", mt "_lang_$_" for (@{$rel->{languages}});
+ cssicon "rt$rel->{type}", mt "_rtype_$rel->{type}";
+ end;
+ td class => 'tc4';
+ a href => "/r$rel->{id}", title => $rel->{original}||$rel->{title}, $rel->{title};
+ b class => 'grayedout', ' '.mt '_vnpage_rel_patch' if $rel->{patch};
+ end;
+ td class => 'tc5';
+ if($rel->{website}) {
+ a href => $rel->{website}, rel => 'nofollow';
+ cssicon 'ext', mt '_vnpage_rel_extlink';
+ end;
+ } else {
+ txt ' ';
+ }
end;
- a href => "/v$_->{id}", title => $_->{original}, $_->{title};
- b class => 'grayedout', ' ('.join(', ',
- $_->{developer} ? mt '_prodpage_dev' : (), $_->{publisher} ? mt '_prodpage_pub' : ()).')';
end;
}
- end;
- }
+ }
+ end;
end;
- $self->htmlFooter;
}