#!/usr/bin/perl our $VERSION = "0.0.1"; use strict; use warnings; use lib '/root/vda/lib'; use lib '/etc/vdr-1.3.x/plugins/vdabrowse/lib'; use VDR; use VDAConfig; use EasyDB; use EasyDB::Table; my $cf = new VDAConfig("/root/vda/vda.conf"); my $db = new EasyDB(host => $cf->{SQLHOST}, database => $cf->{SQLBASE}, user => $cf->{SQLUSER}, password => $cf->{SQLPASS}); my $movies = new EasyDB::Table(database => $db, table => 'movies'); $movies->left_join('genres', 'genreid', 'name' => 'genrename'); $movies->left_join('groups', 'groupid', 'name' => 'groupname'); $movies->left_join('discs', 'discid', 'title' => 'disctitle'); $movies->left_join('meta', 'movieid'); my $genres = new EasyDB::Table(database => $db, table => 'genres'); my $groups = new EasyDB::Table(database => $db, table => 'groups'); my $vdr = new VDR::VDABrowse::Plugin; $vdr->run(); package VDR::VDABrowse::Details; use base qw[ VDR::MenuText ]; sub new { my $self = shift; my $this = $self->SUPER::new("Movie Details"); my $movieid = shift; $movies->clear(); $movies->movieid($movieid); $movies->select(); $movies->get_next_row(); $this->set_text($movies->summary); return $this; } package VDR::VDABrowse::Filters; use strict; use warnings; use base qw[ VDR::OsdMenu ]; use VDR::MenuEditStrItem; use VDR::MenuEditStraItem; sub new { my $self = shift; my $this = $self->SUPER::new("Media Filters"); my @genres = ( 'All genres' ); @VDR::VDABrowse::genremap = ( undef ); $genres->clear(); $genres->set_order('name'); $genres->select(); while ($genres->get_next_row()) { push @genres, $genres->name; push @VDR::VDABrowse::genremap, $genres->genreid; } my @groups = ( 'All groups' ); @VDR::VDABrowse::groupmap = ( undef ); $groups->clear(); $groups->set_order('name'); $groups->select(); while ($groups->get_next_row()) { push @groups, $groups->name; push @VDR::VDABrowse::groupmap, $groups->groupid; } $this->set_cols(20); $this->add(new VDR::MenuEditStraItem("Genre", \$VDR::VDABrowse::genre, @genres)); $this->add(new VDR::MenuEditStraItem("Group", \$VDR::VDABrowse::group, @groups)); $this->add(new VDR::MenuEditStrItem("Title", \$VDR::VDABrowse::title, 64)); $this->add(new VDR::MenuEditStrItem("Subtitle", \$VDR::VDABrowse::subtitle, 64)); return $this; } package VDR::VDABrowse::Browser; use base qw[ VDR::OsdMenu ]; use VDR qw[ :keys :states ]; use VDR::OsdItem; BEGIN { $VDR::VDABrowse::genre = 0; $VDR::VDABrowse::group = 0; $VDR::VDABrowse::title = ''; $VDR::VDABrowse::subtitle = ''; @VDR::VDABrowse::genremap = (); @VDR::VDABrowse::groupmap = (); } sub new { my $self = shift; my $this = $self->SUPER::new("Media Browser"); $this->{_filters} = 0; $this->set_cols(3, 20); $this->build(); return $this; } sub build { my $this = shift; $this->clear(); $movies->clear(); $movies->set_order('genrename', 'groupname'); if ($VDR::VDABrowse::genre > 0) { $movies->genreid($VDR::VDABrowse::genremap[$VDR::VDABrowse::genre]); } if ($VDR::VDABrowse::group > 0) { $movies->groupid($VDR::VDABrowse::groupmap[$VDR::VDABrowse::group]); } if (length($VDR::VDABrowse::title) > 0) { $movies->title($VDR::VDABrowse::title); } if (length($VDR::VDABrowse::subtitle) > 0) { $movies->subtitle($VDR::VDABrowse::subtitle); } $movies->select(); my $genre = -1; my $group = -1; while ($movies->get_next_row()) { if ($genre != $movies->genreid || $group != $movies->groupid) { my $text = "---\t" . $movies->genrename . ' ' . ('-' x 80) . "\t" . $movies->groupname; my $item = new VDR::OsdItem($text); $item->set_selectable(0); $this->add($item); $genre = $movies->genreid; $group = $movies->groupid; } my $text = "\t" . $movies->title; if (defined($movies->subtitle)) { $text .= "\t(" . $movies->subtitle . ")"; } $this->add(new VDR::OsdItem($text, $movies->movieid + os_User)); } $this->set_help(undef, undef, undef, 'Filters'); $this->display; } sub ProcessKey { my $this = shift; my $key = shift; my $state = shift; if ($this->{_filters} == 1) { if ($this->has_sub_menu == 0) { $this->{_filters} = 0; $this->build; } return $state; } print STDERR "Browser::ProcessKey: $key $state\n"; if ($state > os_User) { # One of our enumerated items was selected via Ok my $movieid = $state - os_User; $this->add_sub_menu(new VDR::VDABrowse::Details($movieid)); } elsif ($state == osContinue) { # the filter OSD may have been closed } elsif ($state == osUnknown) { # The master osd didn't know how to react if ($key == kBlue) { $this->add_sub_menu(new VDR::VDABrowse::Filters); $this->{_filters} = 1; } } return $state; } package VDR::VDABrowse::Plugin; use base qw[ VDR::Plugin ]; sub new { my $self = shift; my $this = $self->SUPER::new; $this->set_parameter("Version", $VERSION); $this->set_parameter("Description", "MySQL Media Browser"); $this->set_parameter("MainMenuEntry", "Media Browser"); return $this; } sub MainMenuAction { my $menu = new VDR::VDABrowse::Browser; return $menu; }