Skip to content

Cannot seem to access seasons in TV shows #16

Description

@delovelady

I have the following simple code:

    $librarySections = $client->getLibrarySections();
    foreach ($librarySections['Directory'] as $directoryNumber => $directoryAttributes) {
        if ($directoryAttributes['type'] == 'show') {
            $key = $directoryAttributes['key'] ;
            $collection = $client->getLibrarySectionContents($key, true) ;
            foreach ($collection as $TVShow) {
                $title = $TVShow->title ;
                $children = $TVShow->getChildren() ;
                printf("%2d %s\n", $title, count($children)) ;
                $unusedVar = true ;
            }
        }
    }

This dies with error "Error: Call to undefined method jc21\TV\Show::getChildren()"

I also tried to access $TVShow->seasons and $TVShow->Seasons and so on... to no avail.

Ultimately, I want to list the number of seasons for each show and the number of episodes for each season. But it seems that seasons are not accessible through the show???

Activity

  1. delovelady commented on Oct 8, 2024

    @delovelady
    Author
    #!/usr/bin/env php
    <?php
    
    
    //######################################################################################
    // https://github.com/jc21/plex-api/blob/master/docs/Documentation.md
    //######################################################################################
    
    
    require_once('lovefunctions.php') ;
    //require_once('jc21/plex-api/src/jc21/PlexApi.php') ;
    require_once('vendor/autoload.php') ; // Found in /www/cgi-bin/GoogleRelated/
    
    $ini = $lov->parseIniFile('plexFavorite.ini') ;
    
    define('FAVORITES_TITLE', $ini['Favorites title']) ;
    define('GENERAL_TITLE', $ini['General title']) ;
    define('PLEX_DATABASE_SERVER', $ini['Database server']) ;
    define('PLEX_HOST', $ini['Plex host']) ;
    define('KNOWN_MOVIE_EXTENSIONS', implode('|', $ini['Known movie extensions'])) ;
    
    $lov->setLogName(LoveFunctions::MONTHLY_LOG_WITH_HEADER) ;
    use jc21\PlexApi ;
    use jc21\Util\Filter ;
    
    $debug = (array_key_exists('Debug', $ini) ? $ini['Debug'] : faLSE) ;
    $errors = false ;
    
    $pdo = $lov->pdoConnect(PLEX_DATABASE_SERVER) ;
    $getCredsStmt = $lov->pdoPrepare($pdo, <<<EOS
                SELECT cred.*
                FROM   plexCredentials cred
                WHERE  cred.hostname = :hostname
                   AND effective <= CURRENT_TIMESTAMP
                ORDER BY effective DESC
                LIMIT 1
                EOS
                        ) ;
    $sqlVars = [ 'hostname' => PLEX_HOST ] ;
    $getCredsStmt->execute( $sqlVars ) ;
    $nbrRows = $getCredsStmt->rowCount() ;
    if ($nbrRows == 0) {
        printf("Could not obtain PLEX credentials from database.\nSQL: %s", $lov->mergeSqlAndAssociativeData($getCredsStmt, $sqlVars)) ;
        exit(1) ;
    } elseif ($nbrRows > 1) {
        printf("%d rows returned requesting PLEX credentials from database.\nSQL: %s", $nbrRows, $lov->mergeSqlAndAssociativeData($getCredsStmt, $sqlVars)) ;
        exit(1) ;
    }
    
    $creds = $getCredsStmt->fetch(PDO::FETCH_ASSOC) ;
    $client = new PlexApi($creds['hostname']);
    $client->setAuth($creds['userId'], $creds['password'] ) ;
    if (isset($creds['token']))
        $client->setToken($creds['token']) ;
    for ($i=1; $i<9; $i++) { // Try up to 9 times because there are times that $client->getLibrarySections() has failed
        $librarySections = $client->getLibrarySections();
        if (is_array($librarySections) && is_array($librarySections['Directory']) && count($librarySections['Directory'])>0) {
            break ;
        }
        if ( ! ($token = $client->getToken()))
            printf("Login was not successful.\n") ;
        elseif ($debug)
            printf("No library sections found. (%d)\n", $i) ;
    }
    if ( ! ($token = $client->getToken())) {
        printf("%s\n", "Unable to log in. ($client->getToken failed.)") ;
        die() ;
    } elseif ($token != $creds['token']) {
        // code to insert new plexCredentials row omitted here
    }
    if ( (! $librarySections) || count($librarySections['Directory']) < 1) {
        printf("No library sections found.\n") ;
        exit(1) ;
    }
    
    if ($debug) {
        printf("%d library sections found.\n", count($librarySections['Directory'])) ;
        $lov->dumpArray($librarySections, 'result', '', LoveFunctions::OUTPUT_TYPE_CONSOLE) ;
    }
    
    // Here, we'll get all the "sections" (which are the key# for each Library) from the system
    $allShows = [] ;
    $maxTitleWidth = 0 ;
    $maxRunTime = 0 ;
    foreach ($librarySections['Directory'] as $directoryNumber => $directoryAttributes) {
        if ($directoryAttributes['type'] == 'show') {
            $key = $directoryAttributes['key'] ;
            $collection = $client->getLibrarySectionContents($key, true) ;
            foreach ($collection as $TVShow) {
                $title = $TVShow->title ;
                $allShows[$title] = [  'title' => $title, 'seasonCount' => 0, 'episodeCount' => 0, 'runTime' => 0 ] ;
                if (strlen($title) > $maxTitleWidth)
                    $maxTitleWidth = strlen($title) ;
                $showVars = get_class_vars(get_class($TVShow)) ;
                $showMethods = get_class_methods(get_class($TVShow)) ;
                $seasons = $TVShow->getSeasons() ;
                $episodeCount = 0 ;
                foreach ($seasons AS $season) {
                    $allShows[$title]['seasonCount']++ ;
                    $allShows[$title][$season->index] = [ 'title' => $season->title, 'episodeCount' => 0, 'runTime' => 0 ] ;
                    $seasonVars = get_class_vars(get_class($TVShow)) ;
                    $seasonMethods = get_class_methods(get_class($TVShow)) ;
                    $episodes = $season->getChildren() ;
                    $episodesVars = get_class_vars(get_class($episodes)) ;
                    $episodesMethods = get_class_methods(get_class($episodes)) ;
                    $episodeCount += $episodes->count() ;
                    $episodeIter = $episodes->getIterator() ;
                    foreach ($episodeIter as $episode) {
                        $episodeVars = get_class_vars(get_class($episode)) ;
                        $episodeMethods = get_class_methods(get_class($episode)) ;
                        $allShows[$title]['episodeCount']++ ;
                        $allShows[$title]['runTime'] += $episode->duration->minutes() ;
                        $allShows[$title][$season->index]['episodeCount']++ ;
                        $allShows[$title][$season->index]['runTime'] += $episode->duration->minutes() ;
                        $allShows[$title][$season->index]['episodes'][$episode->index] = ['title' => $episode->title, 'runTime' => $episode->duration->minutes() ] ;
                        // For example, $episode->media->path points to the video file
                        //              $episode->title is the episode title
                        $dummy = 0 ;
                    } // Episodes
                } // Seasons
                if ($allShows[$title]['runTime'] > $maxRunTime)
                    $maxRunTime = $allShows[$title]['runTime'] ;
            }
        }
    }
    
    $runTimeWidth = max(7, strlen(formatRunTime($maxRunTime))) ;
    uksort($allShows, 'compareTitles') ;
    printf("%-*s Seasons Episodes RunTime\n", $maxTitleWidth, "--Title--") ;    
    foreach ($allShows as $show => $details) {
        printf("%-*s %7d %8d %*s\n", $maxTitleWidth, $details['title'], $details['seasonCount'], $details['episodeCount'], $runTimeWidth, formatRunTime($details['runTime'])) ;
    }
    
    
    function compareTitles(string $a, string $b) {
        if (preg_match('%^(a|an|the)\s+(.*)$%i', $a, $matches))
            $a = $matches[2] . ', ' . $matches[1] ;
        if (preg_match('%^(a|an|the)\s+(.*)$%i', $b, $matches))
            $b = $matches[2] . ', ' . $matches[1] ;
        return strcasecmp($a, $b) ;
    }
    
    
    function formatRunTime(float $runTimeMinutes) : string {
        if ($runTimeMinutes >= 60)
            return (intval($runTimeMinutes/60) . ':' . twoDigits($runTimeMinutes % 60)) ;
        else
            return ':' . twodigits($runTimeMinutes) ;
    }
    
    
    function twodigits(int $value) : string {
        return (($value < 10 ? '9' : '') . $value) ;
    }
    
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions