IMDb CLI version 1.0.1 till 2.3.0

2019-07-08

Hur mycket kan man göra med ett "enkelt" CLI för att hämta information om filmer och serier från IMDb? Ganska mycket visar det sig. Det här är vad som har hänt med IMDb verktyget från version 1.0.1 till 2.3.0.

Jag har tidigare skrivit lite om det node-baserade CLI verktyg jag skapade för att enkelt komma åt filmers och tv-seriers "IMDb ID:n". Nu har jag använt verson 1.0.1 av verktyget sen i septemper 2017 och kände att det var dags att göra CLI:t mer flexibelt, då jag av och till kände att det var viss funktionalitet som saknades.

Ny funktionalitet

Till och från kändes CLI:t inte tillräckligt flexibelt när jag använde det och många gånger hade jag velat ha ett bättre sammanhang när sökresultat presenterades i en tabell i terminalen. I 1.0.0 visades enbart titlar, årtal och IMDB ID:n. Jag kände även att det vore smidigt att enbart söka på antingen filmer eller serier och kunna sortera sökresultatet utifrån årtal eller titlar.

Bilden här nedan sammanfattar den nya funktionalitet har tillkommit under resans gång från 1.0.1 till 2.3.0.

IMDB-cli-help

  • -v --version - Skriver ut versionen av CLI:t.
  • -p --plot - Använder man denna flagga så används filmernas och seriernas handling i sökresultatet. Default så trunkeras handling till ett visst antal tecken.
  • -l --limit-plot [number] - Denna flagga låter användaren själv bestämma hur lång handlingen ska vara i sökresultatet innan det trunkeras.
  • -t --title - Denna flagga gör att man kan söka direkt när man anropar CLI:t. Tidigare så skrev man bara imdb och tyckte ENTER för att sedan mata in en titel att söka efter.
  • -m --movies - Sök endast efter filmer.
  • -s --series - Sök endast efter serier
  • -o --order-by [column] - Med denna flagga kan man sortera antingen i bokstavsordning för titlar eller i fallande ordning efter årtal.
  • -h --help - Visar hjälptext om hur CLI:t kan användas.

Utvecklingsmiljön

En hel del har hänt behind the scenes när det gäller 1.0.1 till 2.3.0 av IMDB CLI:t också - allt ifrån argument parsning till git hooks och testning.

Parsa argument

Möjligheten att parsa argument, det vill säga använda imdb --movies --title "star wars" för att direkt söka enbart efter Star Wars filmer, kommer ifrån det populära npm paketet commander.

Commander gör det väldigt enkelt att skriva node-baserade CLI verktyg. Se bara det förenklade exemplet nedan som visar hur -p --plot flaggan används för att skapa upp en IMDb klass där sökresultat ska inkludera handlingar.

example-cli.js
const program = require('commander');

program
  .option('-p, --plot', 'Show plot in search result')
  .parse(process.argv);

const instance = new IMDb({showPlot: !!program.plot})

Skrapning ersatt av REST API

I version 1.0.1 så användes npm paketet Cherrio för att skrapa själva IMDb webbplatsen efter sökresultat och IMDb ID:n. I version 2.0.0 ersattes denna skrapning med API:et från OMDb.

Om jag inte minns fel så var det API:et inte öppet när jag initalt skapade IMDb CLI:et - därav att jag byggde det som en scraper. Nu däremot är API:et öppet så länge man har en api nyckel och håller sig under 1.000 requests om dagen. Dessutom har man via OMDb API:et tillgång till IMDb ID:n, score!

Testning

IMDb CLI använder numera Jest för unit tester, vilket underlättar tryggheten i eventuell framtida refaktorering och hjälper till att säkerställa kvalitet av ny funktionalitet. Även om CLI:t inte har oerhört många rader kod är det alltid skönt att ha kodbasen (någorlunda) testad.

IMDB-jest-test

Omskrivning med TypeScript

Hela CLI:et är sedan 2.3.0 omskrivet med TypeScript. Detta betyder att CLI:et numera har en byggprocess där källkoden finns i en src/ mapp med TypeScript filer som sedan byggs till en dist/ mapp.

I och med att jest tester redan fanns innan omskrivningen till TypeScript genomfördes så blev refaktoreringen i och med befintliga tester en något mer trygg process.

Runt 60 fel hittades i koden initialt i övergången till TypeScript. De flesta felen berodde på att variabler, funktionsparametrar och så vidare inte var typade - men ett och annan potentiellt problem kunde rättas till och och med övergångne till TypeScript.

Nu när koden är skriven med TypeScript och även testas med Jest så kommer framtida refaktorering och funktionstillväxt bli enklare då regression bättre kan undvikas och problem i koden kan upptäckas snabbare.

Git hooks

Två stycken git hooks används för att försöka förhindra problem, förebygga buggar och se till att koden har korrekt formatering innan den committas. För att hantera git hooks så används npm paketet Husky.

  • pre-commit - Innan något committas så kollas det efter TypeScript errors och tslint används för att linta alla *.ts kod.
  • pre-push - För att det ens ska gå att pusha något till en remote branch så måste alla tester gå igenom först. Detta gör att det går lite långsammare om man committar och pushar ofta, men fungerar som en fail safe för att förhindra regression.

Kvar att göra?

Vad finns då kvar att göra, tro? I skrivande stund vet jag inte riktigt faktiskt. Kanske har jag en lista med nya features att gå igenom när jag använt IMDb CLI:t i två år till och släpper version 3.0.0 eller dylikt...

IMDB-cli-in-action

Mer innehåll

Daniel Vernberg 2023