Skip to content

Releases: jemus42/tRakt

tRakt 0.18.0

25 May 00:22
7085e8b

Choose a tag to compare

This release features just a bunch of housekeeping, basically.

  • The guest_stars argument of shows_people() / seasons_people() /
    episodes_people() is now deprecated (via lifecycle::deprecate_warn()).
    The trakt.tv API stopped returning a separate guest_stars array — guest
    cast is now included in cast. The argument is a no-op pending removal
    in a future release.
  • Fix vectorisation bug in movies_related() / shows_related(): when called
    with multiple IDs, the internal recursion forwarded the extended argument
    positionally as limit, producing malformed ?limit=min URLs and empty
    responses for non-first IDs (subsequently erroring in column-flattening).
  • seasons_ratings() adapts to the new multi-source rating response shape.
    The API now returns separate sub-objects per source
    (trakt, tmdb, imdb, metascore, rotten_tomatoes).
    The trakt source is promoted to the top level (preserving the existing
    rating / votes / distribution columns), and external scores are
    surfaced as <source>_<field> columns (tmdb_rating, imdb_link,
    metascore_rating, rotten_tomatoes_state, etc.). Missing values are
    returned as NA.
  • unpack_user() now renames the user's own trakt id to user_trakt to
    avoid colliding with the media or list trakt id when an unpacked user
    is bind_cols()'d alongside other identifiers. Previously this produced
    auto-repaired column names such as trakt...17. Affects all functions
    that embed user data: *_lists(), user_lists(), user_list(),
    user_comments(), user_summary(), comments, media_watching(), and
    list-popular endpoints.
  • user_list() no longer errors on single-list responses where the embedded
    user profile contains NULL fields (e.g. age, vip_cover_image); these
    are now coerced to NA before tibble conversion.
  • shows_people() / seasons_people() / episodes_people() no longer
    return a separate guest_stars table when called with guest_stars = TRUE,
    because the trakt API stopped returning that array. Guest cast is now
    mixed into cast. The guest_stars argument is currently a no-op pending
    a deprecation decision.
  • Adapt to trakt.tv API response changes:
    • Show results now include plex_guid and plex_slug ID columns, subgenres as a list column, and new fields tagline and original_title.
    • Nested images and colors objects are dropped from show data as they don't fit tabular output.
    • search_query() and search_id() now return properly structured show data for both extended = "min" and extended = "full".
  • Token refresh failures (e.g. expired or revoked refresh tokens) now fall back to device authentication instead of erroring.
  • Catch up with inconsistent API endpoints:
  • Start using {vcr} for recording API responses.
  • Bump {testthat} dependency to >=3.0.0, which had been necessary since adopting 3e.
  • Modernize interal {purrr} usage
    • Swap purrr-style anonymous functions ~ .x with base-R \(x) x-style ones
    • Substitute map_df() with map() + list_rbind()
  • Overhaul the extended parameter across all API functions:
    • "min" no longer sends ?extended=min to the API (which was never a valid API value). Instead, the query parameter is omitted entirely, matching the API's documented behavior.
    • New values "images", "metadata", and combinations like c("full", "images") or "full,images" are now supported.
    • When extended includes "images", image data is preserved as a list-column instead of being dropped.
    • All functions now use validate_extended() internally instead of match.arg(), providing clearer error messages for invalid values.

tRakt 0.17.0

16 Mar 16:27
cc894e9

Choose a tag to compare

This is been well over a year of "hobby project staleness says what?", but alas, it is done(ish).

Switch from {httr} to {httr2}

This should have been a small under the hood change, but it also enabled major changes in the way I'm handling API secrets, allowing me to include my encrypted client secret with the package directly.
This should make it more convenient for users to make authenticated requests without having to register their own app on trakt.tv.

The main user-facing highlight however should probably be more stable API interactions including

  • Automatic retries in case of errors (up to 3, currently not configurable)
  • Caching of API results to getOption("tRakt_cache_dir"), which is pruned
    • after 1 week by default (option tRakt_cache_max_age)
    • after exceeding a total of 100MB (option tRakt_cache_max_size)

Minor changes

  • Remove magrittr import and use |> internally, hence bumping the R dependency to >= 4.1.
  • Clean up unused package imports.
  • tRakt_sitrep() is now available to check general settings and API credentials.
  • Switch to {testthat} 3e.

tRakt 0.16.0

28 Aug 17:36
5fd9856

Choose a tag to compare

  • Add GitHub actions via usethis::use_github_actions()
  • Use the tidy CI setup via usethis::use_tidy_ci(), this bumps the R dependency to >= 3.2.

Authenticated requests

By default, all requests to the API are now made using authentication if a trakt_client_secret is set. See ?trakt_credentials() for details on how to set your credentials.
If no secret is available, unauthenticated requests are made as in previous versions. In this case, you still need either the built-in or your own trakt_client_id.

OAuth2 support comes with the need to handle secrets, i.e. .httr-oauth files. This can be a pain with headless/automated setups, which is why I am trying to keep "no auth needed" as the default, as most (implemented) endpoints don't strictly require authentication.

See vignette("Implemented-API-methods", package = "tRakt") for an overview of implemented methods with an indicator on whether authentication is required (it usually isn't).

New functions

  • episodes_summary() [shows/:id/seasons/:season/episodes/:episode]: What seasons_season() and seasons_summary() do, but for a single episode. Only really implemented for completeness' sake. Wraps this method.
  • user_profile() [user/:id]: Get a user's profile.
  • user_lists() [users/:id/lists]: Get all user lists.
  • user_list() [users/:id/lists/:list_id]: Get a single list.
  • user_list_items() [users/:id/lists/:list_id/items/:type]: Get the items in said lists.

The Renamingering

Rename all the things to snake_case and drop the trakt. prefix.
This results in (most) functions mapping directly to API endpoints in the form section_method,
e.g. the API endpoint movies/collected is handled by function movies_collected().

Search

  • trakt.search -> search_query()
  • trakt.search.byid -> search_id()

Dynamic Lists

  • trakt.popular
    • -> movies_popular()
    • -> shows_popular()
  • trakt.trending
    • -> movies_trending()
    • -> shows_trending()
  • trakt.anticipated
    • -> movies_anticipated()
    • -> shows_anticipated()
  • trakt.played
    • -> movies_played()
    • -> shows_played()
  • trakt.watched
    • -> movies_watched()
    • -> shows_watched()
  • trakt.collected()
    • -> movies_collected()
    • -> shows_collected()
  • trakt.updates()
    • -> movies_updates()
    • -> shows_updates()

Movies

  • trakt.movies.summary -> movies_summary()
  • trakt.movies.boxoffice -> movies_boxoffice()
  • trakt.movies.releases -> movies_releases()
  • trakt.movies.people -> movies_people()

Shows

  • trakt.shows.summary -> shows_summary()
  • trakt.shows.people -> shows_people()

Seasons

  • trakt.seasons.summary -> seasons_summary()
  • trakt.seasons.season -> seasons_season() (It's silly, I know, but oh well)

Ratings

  • trakt.movies.ratings -> movies_ratings()
  • trakt.shows.ratings -> shows_ratings()
  • trakt.seasons.ratings -> seasons_ratings()
  • trakt.episodes.ratings -> episodes_ratings()

Related

  • trakt.movies.related -> movies_related()
  • trakt.shows.related -> shows_related()

Stats

  • trakt.movies.stats -> movies_stats()
  • trakt.shows.stats -> shows_stats()
  • trakt.seasons.stats -> seasons_stats()
  • trakt.episodes.stats -> episodes_stats()

People

  • trakt.people.summary -> people_summary()
  • trakt.people.movies -> people_movies()
  • trakt.people.shows -> people_shows()

User functions

  • trakt.user.network
    • -> user_followers()
    • -> user_following()
    • -> user_friends()
  • trakt.user.collection -> user_collection()
  • trakt.user.history -> user_history()
  • trakt.user.ratings -> user_ratings()
  • trakt.user.stats -> user_stats()
  • trakt.user.watched -> user_watched()
  • trakt.user.watchlist -> user_watchlist()

tRakt 0.15.0

04 Oct 16:23
3e63f5b

Choose a tag to compare

This is a big one, but not 1.0.0 big one I guess.
This is a consolidation release with lots of internal improvements, but for the 1.0.0 I decided to overhaul the structure of the package again, so before I completely break any kind of backwards compatiblity, I thought I'd get this one out.

Consolidation for the people

  • Major refactor of the docs. Sadly, the user will only notice a little more consistency.

  • Consolidate related functions into the same Rd page

  • Centrally document common parameters and reuse them where needed

  • Also consolidate many similar functions by factoring out the relevant bits into more flexible helper functions. In some cases those are exported as well.

  • In the process, some functions where partially renamed (.show. -> .shows., .movie. -> .movies.) for consistency.

  • Rename get_trakt_credentials -> trakt_credentials

  • Many functions now return much flatter output, notably *people* functions. They return a list with cast and crew objects, which in turn are both flat tibbles.

Features

  • Improved search function (trakt.search).
    • If the result has a year that is NA but a search score == 1000, that's probably bad and dropped.
  • Added more of the automated list methods, like most anticipated, most played and most watched items.
  • Added trakt.user.history for user/:id/history methods

Is this thing still on?

22 Feb 21:24
81636e0

Choose a tag to compare

tRakt 0.14.0

Many functions were refactored, which in some cases changes the output.
Not only do most functions return a tibble now, but some additionally computed variables have been removed as well.

Starting to clean things up with some major housekeeping

  • usethis::use_* all the things, basically.
  • Add a pkgdown site and a README.Rmd
  • Use codecov
  • Apply styler::style_pkg()
  • Update documentation to use markdown
  • Redo vignette
  • Tests. So many tests.

Less plyr, more purrr

  • Completely removed plyr dependency in favor of purrr

Less camelCase for the Greater Good

12 Mar 02:52

Choose a tag to compare

  • Rename trakt.getEpisodeData -> trakt.get_all_episodes
    • Expand handling of season_nums argument to make it easier to get all episodes of a show.
    • Vectorize to enable multiple target input
  • Rename trakt.getFullShowData -> trakt.get_full_showdata

Vectorization, Generalization, Bugfixization

08 Mar 05:03

Choose a tag to compare

v0.12.0

API changes, functional fixes

  • Add dropunaired param to trakt.seasons.summary (defaults to TRUE).
    • Requires extended to be more than min since the required aired_episodes field
      is only present with higher levels of detail.
  • Add extended param to trakt.user.f*
  • Fix trakt.user.f* now return NULL when the user is private instead of failing.

Internal changes

  • User internal, generalized functions to reduce duplicate code for the following:
    • trakt.*.popular
    • trakt.*.related
    • trakt.*.trending
    • trakt.*.summary
    • trakt.*.ratings
Vectorization improvements
  • Add multiple target input support (vectorization) for:
    • trakt.user.f* functions: Results will be rbinded together and a source_user column is appended.
    • trakt.seasons.season: Soon to make trakt.getEpisodeData obsolete.
    • trakt.*.summary: Forces force_data_frame to TRUE to enable rbinding.
    • trakt.*.related: Appends source column containing respective input id.
    • trakt.*.ratings: Returns result as a list with each entry containing data for each
      show or movie to accommodate the distribution variable (data.frame)
    • trakt.people.summary: Appends person column with target id.
    • trakt.*.watching: Returns data.frame with source column containing each target.

v0.11.3

06 Mar 22:52

Choose a tag to compare

API changes, functional fixes

  • Add build_trakt_url to ease trakt API URL assembly and reduce duplicate code.
  • Add force_data_frame option to trakt.*.summary: Forces unnesting.
  • Rename trakt.show.stats to trakt.stats, will work with both movies and shows
    as soon as the API endpoint actually works.

Minor changes

  • Expand @family tags in docs a little

Some New Stuff, Some Fixed Stuff

05 Mar 19:11

Choose a tag to compare

v0.11.2

API changes, functional fixes

  • Add trakt.movie.watching and trakt.show.watching: Get trakt.tv users watching.
  • Add trakt.movie.releases: Gets release dates & certifications per movie.
  • Fix trakt.search.byid: Used to only work on shows, now actually works on movies.
  • Fix convert_datetime (internal): improve reliability.

Minor changes

  • Fix documentation error in *.movie.* functions.
  • Added tests for new functions

Moving Stuff Around and Calling it Progress

03 Mar 20:44

Choose a tag to compare

  • Internal restructuring (moving functionally similar functions together)
    • TODO: Create generic functions for both movie and show functions to reduce duplicate code
  • Add extended param to trakt.user.watchlist
  • Improve consistency between trakt.user.watched and trakt.user.collection
    • Rename slug to id.slug
    • Ensure proper datetime conversion
  • Fix error in trakt.user.watchlist when type = shows was ignored by accident