# DONE

## Next (v1.5.3)

- [ ] SCRAPER: fix graphql request header

## v1.5.2

### Features

- [x] support zoom levels
  - 50% - 300%
  - adjust in Settings or everywhere with CTRL + `+` / `-` or mousewheel `up` / `down`
  - zoom levels are stored and survive restarts

### Fixes

- [x] FIX: don't show an error if IMDB does not provide parental guide for a medium (#114)

## v1.5.1

### Features

- [x] Add "IMDB Votes" filter
- [x] Add "Scroll to last watched episode" item in the list menu if a series has been opened (and its episodes are shown in the list)
  - automatically scroll to last watched episode when a series is opened
- [x] Settings -> Clear Filter Cache button (in case of filter issues)
- [x] peform database house keeping after rescans

### Fixes

- [x] FIX: Settings Movies/Series Sourcepath checkboxes did not bind correctly
- [x] FIX: rescan snackbar disappeared automatically
- [x] FIX: Source path is clickable in media card, but needs to be translated to the path's name in order to work in the property dialog
- [x] FIX: path handling for poster images on Linux
- [x] FIX: remove "Open" functionality on series if shown as popup

## v1.5.0

- [x] new Linux builds: Snap, Flatpak, Apk, FreeBSD, Pacman
- [x] updated MacOS build: universal build (x64 + Apple Silicon)

- [x] updated Theme (more darker, higher contrast)
- [x] updated layouts, unified font sizes

### Features

- [x] Sidebar Navigation containing the filters can now be resized by the user
- [x] Sidebar filters: introduction of eye icon, which when clicked shows the dialog listing the movies and series that contain the value (e.g. year 2023, action genre, rated 3 stars by you)
- [x] Media property dialogs can now stack indefinitely on top of each other (e.g. actor on top of another actor on top of a director), filtering by the property is possible at any level
- [x] series in compact lists (e.g. in person dialog) now allow to show the series

- [x] Media item cards can now also be expanded if they are popped in from dialogs (e.g. series heatmap)

### Optimizations

- [x] loading filters heavily optimized for speed (when filter and media did not change, subsequential loading of the filters is very fast now)
- [x] Rescan specific media item: if it is a tv series, let the user decide if the episodes should be rescanned as well or just the series
- [x] Rescan Metadata from Action List: let user decide if they also want to rescan the episodes or just the series
- [x] Apply "is already viewed" style on an episode in the heatmap dialog after watching long enough

- [x] SCANNING: use actualDuplicate to detect moved media and re-use metadata

  - [x] also check with moved movie
  - [x] "rescan metadata" should ignore duplicates completely
  - [x] add "re-use already scraped IMDB metadata" option to rescan dialog (default: activated) or add it to Settings | Duplicates

- [x] Settings: series source paths are now sorted by their name

### Fixes

- [ ] fix #94 IMDB detection for TV Series preferred movies
- [ ] fix broken loading of other filters (Source Paths, Genres and Data Quality) with an active filter on age ratings
- [ ] fix during scan the last added file info stayed in the footer even when the addition was already finished and other files are scanned
- [ ] SCRAPER: poster URLs needed an updated logic

## v1.4.5

### Features

- [x] Added `Missing Credits` filter in `Data Quality` filter set

### Fixes

- [x] fix #90 Settings | Scan History graph shows 1970 date
- [x] fix #92 credits are missing the attribute (e.g. "Alex Borstein - Lois Griffin (voice)" in tt34208873)
- [x] Scraper: adapt the scraper for recently introduced creditsV2 datastructure

## v1.4.4

- [x] FEATURE: Settings - Scan History: show a graph of collection sizes (disk space) over time
- [x] SCRAPER: Technical Data (Runtime)

## v1.4.3

- SCRAPER: Full Credits updated

## v1.4.2

- [x] MediaItemCard: indicate if a medium has been watched

- [x] FEATURE: display the current version and detect new version during runtime

  - checks for new version hourly, if a new version is available, a notification is shown in the header

- [x] SCRAPER
  - update Trailer URL handling
  - fix tests for plot summaries
  - update tests for companies data
  - update imdb search for more robust results

## v1.4.1

- [x] SCRAPER: Release Info - primary title fix

## v1.4.0 Highlights

### TV Series

- In general: Media Hoarder now supports TV Series

  - configure the source paths (each directory within the source path should be a Series)
  - browse series (also filter, search and sort)
  - click "into" a series to browse episodes, also sort

- All Dialogs now support Series

  - expandable to see episodes
  - episodes and movies can be clicked to access (and play)

- Show IMDB Rating Heatmap by clicking the series rating
  - click each episode to see details (and play)

### Other

- Added HDR variants to the Video Quality section

  - Media Hoarder now detects the following HDR variants: "HDR10", "HDR10+", "DV", "HLG"
  - the HDR variants are shown in the media entries of the main list
  - when clicked, you can see details about a certain HDR variant
  - Filter section "Video Quality" also contains these entries

- enhanced rescan summary

  - see how many movies/series/episodes have been added/updated/removed
    - click on Details: see changes on individual movies, series down to the files involved
  - go to Settings and review past rescans (details on click)
  - calculate collection sizes (dashboard shows the sizes)

- UI: add "w2wTV" button for Series and Episodes which opens up <https://whattowatchon.tv> with the series pre-selected

- Search Data Dialog (and other dialogs): show role of person/company

- clicking a media item in one of the smaller lists, shows the item's card (and possibility to play)

- Allow user to define audio / subtitle languages

## next (v1.4.0-b8)

- [x] series: update imported_at for a series if episodes have been added
- [x] FIX: series in dialog always only showed the start year
- [x] UI: show media type (TV Series, Video, TV Movie) in IMDB Link Dialog
- [x] NOT A BUG: findIMDBtconstInNFO does not search in correct sub-dir: `searching in Z:\_TESTSPACE\Media-Hoarder\Series`
  - not a bug: it's unlikely for a series episode that it's individual imdb tconst is included in the .nfo as in 99% of the cases, the series' IMDB tconst is included in the .nfo
- [x] SCRAPER: Parental Guide
- [x] use eventBus.setProgressBar on individual item rescan (also bulk)
  - individual item: marquee (2)
  - bulk: percent (currentIndex / numItems)

## Misc (v1.4.0-b7)

- [x] FIX: giving user rating stars for the series in episode view
- [x] cancel loading filters on series -> episodes change
- [x] introduce HDR (detect with color spaces, e.g. <https://www.reddit.com/r/PleX/comments/7kwoy8/is_there_a_way_to_tell_if_a_file_is_hdr_from_the/>)

  - "HDR10", "HDR10+", "DV", "HLG"
  - in sources: `#VIDEOPROPERTIES`
  - [x] add them to "Video Quality" filter
  - [x] exclusively use tbl_Movies_MI_Qualities
  - [x] create migration (tbl_Movies.MI_Quality -> tbl_Movies_MI_Qualities)
    - [x] Name: `2024-06-02 migrate to tbl_Movies_MI_Qualities`
      - [x] add rows for each tbl_Movies row with MI_Quality entry
      - [x] add Category_Name 'video-resolution' and Category_Sort 1 for all entries ("SD", "HD", "UHD", "4K", ...)
      - ?remove MI_Quality column from tbl_Movies? -> !migration needs to check if MI_Quality column is present in tbl_Movies before!
  - [x] everywhere in code where MI_Quality is used, use tbl_Movies_MI_Qualities (rescan, fetchMedia etc.)
    - [x] adapt mediaPropertyDialog for video quality Object containing MI_Quality, Category_Name (was string before)
    - [x] adapt videoQualityClicked for Object containing MI_Quality, Category_Name
  - [x] adapt updateSeriesVideoQualitiesFromEpisodes
  - [x] edit media dialog: adapt to handle multiple MI_Qualities

- Bonus / Special Episodes

  - [x] season's card shows the number of bonus
  - [x] show bonus episodes in SeriesIMDBRatingDialog

- [x] Support Extras/Specials/Bonus
      General Concept:

  - Media Hoarder treats dedicated episodes which can be called Extras, Specials or Bonus in one category: "Bonus Episodes"
  - related ticket: #41 Series: Organization of Extras / Specials / Bonus, and Unnumbered Episodes
  - Extras/Specials/Bonus are indicated by B01 or S02B02 and will be treated as bonus
    - B01 will automatically go to Season 1
    - S00B01 will automatically go to Season 0 (the unknown Season)
    - [x] rename all Series "Extras" to "Bonus" (at least for the UI)

## v1.4.0-b6

## IMDB Scraper

- [x] SCRAPER: When scanning series, re-rank IMDB search results so that tv-series are higher than movies when detecting the IMDB entry
  - closes #61

# Older Releases (click to expand)

<details>
  <summary>v1.4.0-b5</summary>

## Features (v1.4.0-b5)

- [x] FEAT: do an update check on the beta channel if the build is a beta build

A beta build (like this one) will now do version checks against other beta builds and tell you if a newer beta build is available. The link for downloading is also pointing to the beta releases (and not the Media Hoarder website's download section).

![image](https://github.com/theMK2k/Media-Hoarder/assets/16878526/63dadfb6-a7cc-4357-b956-91ee852d0226)

## Misc (v1.4.0-b5)

- [x] DB Migrations
  - [x] new table: tbl_DB_Migrations
  - [x] implement migration runner

</details>

<details>
  <summary>v1.4.0-b4</summary>

## Features (v1.4.0-b4)

- [x] FEAT: add HDR variants to the Video Quality section

Media Hoarder now detects the following HDR variants: "HDR10", "HDR10+", "DV", "HLG".

The HDR variants are shown in the media entries of the main list:

![image](https://github.com/theMK2k/Media-Hoarder/assets/16878526/6f225bee-ee2e-4efd-ae21-631456ad8217)

When clicked, you can see details about a certain HDR variant:

![image](https://github.com/theMK2k/Media-Hoarder/assets/16878526/b5eb9f78-8269-4ef8-a622-a6a2ad27b7ab)

Filter section "Video Quality" also contains these entries:

![image](https://github.com/theMK2k/Media-Hoarder/assets/16878526/58258ddb-58bd-49b1-bc9a-1340cd746c03)

## Misc / Fixes (v1.4.0-b4)

The IMDB entry detection (Media Hoarder trying to find the correct IMDB entry for a movie / tv show based on its name and release year) can fail due to different circumstances. Until now, Media Hoarder did not show errors prominently enough.

- [x] SCRAPER: add testIMDBFindPageSearch to testset in UI

![image](https://github.com/theMK2k/Media-Hoarder/assets/16878526/922bc341-d4ff-4198-9788-36885fbee140)

- [x] SCRAPER: during the phase of IMDB entry detection, if something fails, the error will be stored in the scraper errors

![image](https://github.com/theMK2k/Media-Hoarder/assets/16878526/9b818ea3-db29-443e-8f1b-ced30ac45bc3)

</details>

<details>
  <summary>v1.4.0-b3</summary>

## Features (v1.4.0-b3)

- [x] FEAT: calculate collection sizes (movies, series, total) before and after a re-scan, show current collection sizes in the home screen (which also now has a link in the navigation bar on the left)

![image](https://github.com/theMK2k/Media-Hoarder/assets/16878526/d7fe9d5f-3344-4e6d-9b3a-1f3121b731e4)

- [x] FEAT: enhanced rescan summary

  - [x] related ticket: #45
  - [x] show how many movies/series/episodes have been added/updated/removed

![Media_Hoarder_v1 4 0-New_Scan_Summary](https://github.com/theMK2k/Media-Hoarder/assets/16878526/ce45a98d-b593-4d04-8b79-05e5d29cb7bb)

- [x] details dialog where the user can check individual files

![Media_Hoarder_v1 4 0-New_Scan_Details_Dialog](https://github.com/theMK2k/Media-Hoarder/assets/16878526/5277e7ea-0338-4a37-b921-cbed188f7c69)

- [x] new tab in Settings where past scan sessions are listed (detail dialog on click)

![Media_Hoarder_v1 4 0-Scan_History](https://github.com/theMK2k/Media-Hoarder/assets/16878526/e9efd0fa-b4fe-4ea1-890e-05478180d9c0)

- [x] UI: add "w2wTV" button for Series and Episodes which opens up <https://whattowatchon.tv> with the series pre-selected

## Misc / Fixes (v1.4.0-b3)

- [x] SCRAPER: stop imdb scraping when the tconst is obviously not working
- [x] reworked relative time and duration i18n
</details>

<details>
  <summary>v1.4.0-b2</summary>

### Features (v1.4.0-b2)

- [x] FEAT: Search Data Dialog: show role of person/company

![image](https://github.com/theMK2k/Media-Hoarder/assets/16878526/34d52613-4f72-4a03-a615-b6a287ca1f75)

![image](https://github.com/theMK2k/Media-Hoarder/assets/16878526/a753ddba-d6da-411b-a80e-6e369e3217a5)

### Misc / Fixes (v1.4.0-b2)

- [x] UX: only load filters that are actually shown
  - [x] reload filters when "edit filters" is done (only reload those filters that have changed visibility from false to true)
- [x] FIX: series/movies filters are not stored when switching to movies/series and back
  - [x] related bug: switching movies <> series may lead to 0 media items, even when pressing reload button
- [x] FIX: clicking on plot keyword in "find plot keyword dialog" does nothing
- [x] FIX: hide items in dialogs that have 0 media (e.g. plot keywords for movies that can only be found in series)
- [x] FIX: prevent filtering and highlighting of searchText in Episodes listing
- [x] DECISION: bring back filters for episodes?
  - NOT NOW! this introduces more problems than solutions
- [x] FIX: include description text in search space
- [x] FIX: fast switching during trailer show lags behind

</details>

<details>
  <summary>v1.4.0-b1</summary>

### Features (v1.4.0-b1)

- [x] FEAT: when clicking a media item in one of the smaller lists, show the item's card
  - [x] Media Property Dialog
  - [x] Trailer Show (LocalVideoPlayerDialog, VideoPlayerDialog)
  - [x] Chat GPT Dialog

![image](https://github.com/theMK2k/Media-Hoarder/assets/16878526/b23db3ce-e8b5-4607-94db-dc5888247e49)

### Misc / Fixes (v1.4.0-b1)

- [x] UX: MediaList: as soon as "sort by" was changed by the user, reset page to 1
</details>

<details>
  <summary>v1.3.37-a8</summary>

### Misc / Fixes (v1.3.37-a8)

- [x] FIX: sort by Season and Episode didn't work anymore
- [x] SCRAPER: Update Plotsummary IMDB Scraper Test
</details>

<details>
  <summary>v1.3.37-a7</summary>

### Features (v1.3.37-a7)

- [x] UX/SCRAPER: use imdb-graphql-urls.json (also try to fetch them from master in github, this way we can update the urls if imdb changes them - without creating a new release)

  - <https://raw.githubusercontent.com/theMK2k/Media-Hoarder/master/src/data/imdb-graphql-urls.json>

- [x] UX/SCRAPER: propagate actual errors of imdb scraping to the test result (i.e. errors in graphql querying instead of $IMDB_something is NULL)
</details>

<details>
  <summary>v1.3.37-a6</summary>

### Features (v1.3.37-a6)

#### Series: Media Property Dialog

- [x] FEAT: make series clickable and expand to episodes listing for the selected series, show affected number of episodes vs. total number of episodes
- [x] UX: remove the episodes section (in favor of episodes sections for all listed series)

#### Series: IMDB Rating Dialog

- [x] FEAT: IMDB Rating heatmap like <https://whattowatchon.tv>
  - [x] make medialist item card a shared component (now used in medialist as well as SeriesIMDBRatingDialog)main list "jumps" and THEN reloads with the filter applied (possibly a fix for another issue)
  - [x] prevent certain activities while in IMDB Rating Dialog mode

![image](https://github.com/theMK2k/Media-Hoarder/assets/16878526/998bf433-05d6-4f19-a573-83d62f78bc75)

![image](https://github.com/theMK2k/Media-Hoarder/assets/16878526/ed06025f-ce16-42f5-be2b-e14d5a2ae5af)

- [x] UI: fix z-index for other dialogs on top of the SeriesIMDBRatingDialog

- [x] UX: globally track MediaPropertyDialog's visibility in order to allow closing of SeriesIMDBRatingDialog on outside-click if MediaPropertyDialog is not open

- [x] UI: also provide clickable area for episodes we have but is missing an IMDB rating

![image](https://github.com/theMK2k/Media-Hoarder/assets/16878526/78163da9-eb5c-47a4-82d9-2eaa8eecf47d)

- [x] MediaList: provide Series_id_Movies_Owner explicitly to MediaPropertyDialog

#### Series: Edit Media Dialog

- [x] FEAT: Allow user to define audio / subtitle languages
  - [x] implement EditMediaItemDialog controls
  - [x] save on diff

![image](https://github.com/theMK2k/Media-Hoarder/assets/16878526/ae1fb019-1cb8-4c06-b8e6-913c671d38ce)

![image](https://github.com/theMK2k/Media-Hoarder/assets/16878526/c5a031ac-bd41-4cfe-a9fa-6e09b6197d7c)

- [x] DB: tbl_Movies_MI_Qualities: also use for editing the series entry
</details>

<details>
  <summary>v1.3.37-a5</summary>

### Misc / Fixes (v1.3.37-a5)

- [x] SCRAPER: imdb-graphql-urls: update seriesEpisodes (new persisted query)
- [x] FIX: series episodes matching: don't assume E01 if neither season nor episode are set
</details>

<details>
  <summary>v1.3.37-a4</summary>

### Misc / Fixes (v1.3.37-a4)

- [x] UX: MediaList: store currentPage for Movies, Series and Episodes (episodes in tbl_Movies.Series_currentPage)
- [x] UX: MediaList: optimize fetchSortValues before fetchFilters
- [x] SCRAPER/UX: findIMDBtconst for episodes:
  - [x] tt\* override
  - [x] by season and episode numbers

</details>

<details>
  <summary>v1.3.37-a3</summary>

### Misc / Fixes

- [x] UX: use tt\* in the filename to override the tconst of an episode
- [x] UX: unlink IMDB on series: also unlink all episodes, which

  - [x] don't have the tt\* as part of their file name
  - [x] haven't been user-set tt\* (do we even track this?)

</details>

<details>
  <summary>v1.3.37-a</summary>

### Misc / Fixes

- [x] CHORE: Windows: update bundled VLC to 3.0.20
- [x] CHORE: Windows: update bundled Mediainfo CLI to 23.11
- [x] CHORE: refactor store.fetchMedia to only accept a single object containing the options
- [x] CHORE: check sqlite version for json support - _The JSON functions and operators are built into SQLite by default, as of SQLite version 3.38.0 (2022-02-22)._
  - specs see [data/devdocs/series.md](data/devdocs/series.md), [docs/01-Media-Storage.md](01-Media-Storage.md)
- [x] DB: ensure that MI Tracks table is cleaned up when a movie gets removed
- [x] FIX: store.mergeExtraFileBased 713 TypeError: Cannot read property 'length' of undefined
- [x] FIX: delete series actually deleted the source path
- [x] FIX: in Series, where Video Quality filter resets from "ALL" to some being checked just by switching back and forth (series <> episodes)
- [x] TEST: create a test set with series name and year (see: <https://github.com/theMK2k/media-hoarder-testset-generator>)
  - [x] enumerate series names
  - [x] enumerate episodes for each series
  - [x] benchmark series name detection (success: 98% hits on 1799 english series names)
  - [x] also benchmark the english movies test set

## TV Series Support (MVP)

These items track the series feature in general.

- [x] Remove mediaItem Dialog:
  - [x] always show the affected location full path
  - [x] differentiate Movies, Series and Episodes
- [x] update "lastAccessAt" also for the series as well as any duplicate (and not only for the episode)
- [x] function: updateSeriesMetadataFromEpisodes
  - [x] Audio Formats
  - [x] Release Attributes
  - [x] Audio Languages
  - [x] Subtitle Languages
  - [x] Video Encoders
  - [x] Video Qualities (multiple!)
    - [x] tbl_Movies_MI_Qualities: also use for filtering!
- [x] Medialist: check if the image for episodes can be set to "fit height"
- [x] Filters - the numbers should represent either movies or series
- [x] Dialogs: most of them do not utilize mediaType
  - Generalize to MediaPropertyDialog:
    - [x] provide movies _and_ series lists (and episodes lists)? it's probably interesting to see these even if a person etc. has been opened from a series...
    - [x] act as a dialog for movies
    - [x] act as a dialog for series
    - [x] act as a dialog for episodes (of a certain series)
    - [x] debounce the init() function and call it on any property change, with 10ms debounce
- [x] find IMDB tconst and provide metadata for the series and episodes
- [x] provide series in a different route
  - [x] integrate old dialogs:
    - [x] AgeRatingDialog
    - [x] AudioFormatDialog
    - [x] CompanyDialog
    - [x] FilmingLocationDialog
    - [x] GenreDialog
    - [x] LanguageDialog -> audioLanguageDialog + subtitleLanguageDialog
    - [x] PlotKeywordDialog
    - [x] ReleaseAttributeDialog
    - [x] VideoEncoderDialog
    - [x] VideoQualityDialog
    - [x] PersonDialog
- [x] new symbol for "opening" a series and changing the screen to its eposiodes
- [x] Series / Episode detection in directory/filenames, examples:
  - [x] "S01E01" - the default
  - [x] "Ep01" - as seen with some anime stuff
  - [x] "E01" - episode without season - assume S01
  - [x] "1x5" - same as S01E05
  - [x] "S01E01E02" - multiple episodes
  - [x] "S01E01-E03" - multiple episodes
  - [x] "S01E01E02E03" - multiple episodes
  - [x] "S01E01-03" - multiple episodes
- [x] assign series episode imdb tconst when episode number is 0 (imdb provides null in this case)
- [x] add "Season and Episode" sort order (only for Episodes specificMediaType)
- [x] store filters and sort values by specificMediaType ("Movies", "Series", "Episodes")
- [x] update Series_Num_Episodes and Series_Num_Seasons after an episode has been removed

</details>

## v1.3.5

- [x] fix IMDB scraper (detecting genres and performing searches)

## v1.3.4

- [x] use imdb-graphql-urls.json (also try to fetch them from master in github, this way we can update the urls if imdb changes them - without creating a new release)
  - <https://raw.githubusercontent.com/theMK2k/Media-Hoarder/master/src/data/imdb-graphql-urls.json>
- [x] update IMDB sources:
  - [x] advancedTitleSearch

## v1.3.3

- [x] update IMDB sources
  - [x] testIMDBreleaseinfo
  - [x] testIMDBCompaniesData
  - [x] testIMDBplotKeywords
  - [x] testIMDBFilmingLocations
  - [x] testIMDBFindPageSearch

## v1.3.2

- [x] Link IMDB Dialog:
  - [x] with paginated search results (20 per page)
  - [x] Fix: IMDB Advanced Title Search
  - [x] Fix: IMDB Find Page Search
- [x] updated IMDB detection

## v1.3.1

- [x] excluded genre filters option (e.g. "not Horror")

## v1.3.0

- [x] new list action: "Start Trailer Show"
  - generate a list of distinct movies with available trailers from the current list
  - show trailer dialog beginning with the first
    - show [1/123]
    - provide "prev", "next", "add movie to list" buttons
  - [x] implement trailer show in non-local player dialog
  - [x] load next trailer in trailer show when previous ended
  - [x] "Close and Show this Movie"
- imdb scraper fixes
  - metacritic score (V2.1)
  - trailer urls (V3)
- [x] re-scrape IMDB Main Page if Trailer URL is 404
- [x] remove rounded corners in LocalVideoPlayerDialog
- [x] ensure both video player dialog types are closed before the next opens

## v1.2.3

- [x] take over release attributes and description / plotSummary when moving a file
  - [x] add shared.duplicatesHandling.updateDescription
  - [x] add shared.duplicatesHandling.updateReleaseAttributes

## v1.2.2

- [x] #rip-rating-demographics (see <https://www.imdb.com/title/tt4154796/ratings>)

  - [x] remove rating demographics (also: don't utilize chosen default demographic)
  - [x] remove tests (watchdog, in-ui)
  - [x] remove during scrape
  - [x] remove on-click dialog in MediaList
  - [x] test with scan

- [x] imdb scraper: v3 plotkeywords
- [x] imdb scraper: v3 locations

- [x] Settings: sort list of source paths by name

## v1.2.0

- [x] WIN: update VLC, mediainfo-cli
- [x] The integration of ChatGPT to query AI suggestions has been significantly improved. There is no longer a dependency on IMDB IDs.
- [x] Improved Trailer experience with embedded player
- [x] Media List: "rescan this list" (operations on the currently shown list w/ menu)
  - [x] onListActionsRescanMetaData - show dialog before rescan
  - [x] properly handle array for the rescan (total time etc.)
  - [x] after cancel: set isScanning to false

### Fix IMDB Scraper

#### / (mainPageData)

- [x] add $IMDB_startYear and $IMDB_endYear (we cannot provide them from /releaseinfo anymore)
- [x] test V1, V2 and V3 mainPageData
- [x] check calling functions!

#### /releaseinfo

- [x] implement V2 (`__NEXT_DATA__`)
- [x] test V1
- [x] we had to remove $IMDB_startYear and $IMDB_endYear, check calling functions!

#### technicalData

- [x] V2 (`__NEXT_DATA__`)

#### companiesData

- [x] implement V3 GQL-based
- [x] dump/usedump: if filename exceeds 160 characters, make a hash of it and use this at the end of truncated filename

#### personData

#### plotSummary

### Other

## v1.1.0

- [x] AI Recommendations
- [x] PersonDialog: add button for (re-)fetching data from web
- [x] UI: MediaList: minor positioning correction for action icons in media items

## v1.0.1

- [x] fix breaking IMDB captcha
- [x] Search Data Dialog: fix numMovies
- [x] Show IMDB and MetaCritic scores in compact movie lists (dialogs):
  - [x] Person Dialog
  - [x] Company Dialog
  - [x] Age Rating Dialog
  - [x] Audio Format Dialog
  - [x] Filming Location Dialog
  - [x] Genre Dialog
  - [x] Language Dialog
  - [x] Person Dialog
  - [x] Plot Keyword Dialog
  - [x] Release Attribute Dialog
  - [x] Video Encoding Dialog
  - [x] Video Quality Dialog

## v1.0.0

### Road to Release (Win/Linux/Mac)

- [x] optimize rescan
- [x] make markdown links in history entries clickable
- [x] fix: "file created at" not always with value
- [x] check-package.json.sh (should prevent build)
- [x] delete media from main list
- [x] filter imdb tconst in search, so that a complete imdb.com url leads to search results
- [x] fix: missing metadata on scan (IMDB_runtimeMinutes, IMDB_plotSummaryFull, MI_Duration\*)
- [x] fix: plot keyword casing ex. "New Year'S Eve"
- [x] fix: number of media in filters for persons, companies, keywords, filming locations
- [x] higher resolution for IMDB Rating filtering (0.1 steps); correct local decimal character
- [x] remove scanErrors when unlinking
- [x] in \*Dialog click on "filter by this ..." should only reload the one filter and then the movies
- [x] Fix: MediaInfo (video): use the highest res if multiple video streams are present (also in MovieManager)
- [x] more MediaInfo

  - In quick info area:

    - [x] Video Encoder (x264, x265, XviD ...)
    - [x] Audio Format/Codec
          Example:
    - current: 8K | 14-18+ | Action, Drama, Horror, Thriller | DE, EN | DE, EN, FR | BD
    - new: 8K | 14-18+ | Action, Drama, Horror, Thriller | DE, EN | DE, EN, FR | x264 | EAC3, PCM | BD
      - [x] video: tbl_Movies_MI_Tracks
        - Encoded_Library_Name_Trimmed (x264, x265, XviD)
        - ?Format (AVC, HEVC)?
      - [x] audio: tbl_Movies_MI_Tracks.Format

  - show in MediaList Quick Info Area (Video Codec/Format, Audio Codecs/Formats)
  - new Filters + Dialog:
    - [x] Video Codec
    - [x] Audio Formats

- [x] Fix: "applying MediaInfo" doesn't show countdown timer
- introduce Audio Metadata

  - [x] see below: use Movie Manager to mass-scan a movie folder and find out the different audio codecs
  - [x] new table tbl_Movies_MI_Tracks

    - [x] scan all media info data to find out which fields are populated by each track type
      - see: [data/devdocs/mediainfo/](data/devdocs/mediainfo/)
    - [x] investigate how to enforce numeric values

      - [x] does it suffice to set the fieldtype in the db? -> test with a SELECT query
            -> plan: mass import and analyze later
      - Integer fields:

        - AlternateGroup?
        - AudioCount
        - BitDepth
        - BitDepth_Detected
        - BitRate
        - BitRate_Maximum
        - BitRate_Minimum
        - Channels
        - FileSize
        - FooterSize
        - FrameCount
        - HeaderSize
        - Height
        - MenuCount
        - MenuID
        - MultiView_Count
        - OverallBitRate
        - OverallBitRate_Maximum
        - Sampled_Height
        - Sampled_Width
        - SamplesPerFrame
        - SamplingCount
        - SamplingRate
        - Source_FrameCount
        - Source_StreamSize
        - Stored_Height
        - Stored_Width
        - StreamOrder
        - StreamSize
        - TextCount
        - VideoCount
        - Width

      - NUMERIC fields:
        - Delay
        - Delay_Original
        - DisplayAspectRatio
        - DisplayAspectRatio_Original
        - Duration
        - Duration_LastFrame
        - FrameRate
        - FrameRate_Maximum
        - FrameRate_Minimum
        - FrameRate_Original
        - Interleave_Duration
        - Interleave_Preload
        - Interleave_VideoFrames
        - PixelAspectRatio
        - PixelAspectRatio_Original
        - Source_Duration
        - Source_StreamSize_Proportion
        - StreamSize_Proportion- [x] remove MediaInfoObject from tbl_Movies

- [x] defect: rescan with deselected IMDB options removes metadata (persons, companies, etc.)

  - react to userScanOptions!
  - dont merge everything directly in IMDBdata with Object.assign, instead build up:
    imdbData = {
    mainPageData: null,
    ratingDemographics: null,
    plotSummaryFull: null,
    plotKeywords: null,
    releaseinfo: null,
    technicalData: null,
    parentalguideData: null,
    creditsData: null,
    companiesData: null,
    filmingLocations: null,
    }
  - rescanMoviesMetaData_fetchIMDBMetaData_mainPageData
    - scrapeIMDBmainPageData()
    - imdbData.mainPageData:
      {
      $IMDB_releaseType: string;
      $IMDB_genres: string[];
      $IMDB_rating: number;
      $IMDB_numVotes: number;
      $IMDB_metacriticScore: number;
      $IMDB_posterSmall_URL: string;
      $IMDB_posterLarge_URL: string;
      $IMDB_plotSummary: string;
      $IMDB_Trailer_URL: any;
      }
  - rescanMoviesMetaData_fetchIMDBMetaData_ratingDemographics

    - scrapeIMDBRatingDemographics()
    - imdbData.ratingDemographics:

    ```js
        {
          $IMDB_rating_*: number;  (except $IMDB_rating_imdb_users)
          $IMDB_numVotes_*: number; (except $IMDB_numVotes_imdb_users)
        }
    ```

  - rescanMoviesMetaData_fetchIMDBMetaData_plotSummary

    - scrapeIMDBplotSummary()
    - imdbData.plotSummaryFull:

    ```js
    {
      $IMDB_plotSummaryFull: string;
    }
    ```

  - rescanMoviesMetaData_fetchIMDBMetaData_plotKeywords

    - WAS: plotkeywords (param in saveIMDBData)
    - NOW: imdbData.plotKeywords (only if userScanOption is set)

  - rescanMoviesMetaData_fetchIMDBMetaData_releaseinfo

    - scrapeIMDBreleaseinfo()
    - imdbData.releaseinfo:

    ```js
    {
      $IMDB_originalTitle: any;
      $IMDB_localTitle: string;
      $IMDB_primaryTitle: any;
      $IMDB_startYear: any;
      $IMDB_endYear: any;
    }
    ```

  - rescanMoviesMetaData_fetchIMDBMetaData_technicalData

    - scrapeIMDBtechnicalData()
    - imdbData.technicalData: {
      $IMDB_runtimeMinutes
      }

  - rescanMoviesMetaData_fetchIMDBMetaData_parentalguideData

    - scrapeIMDBParentalGuideData()
    - imdbData.parentalguideData: {
      $IMDB_MinAge
      $IMDB_MaxAge
      $IMDB_id_AgeRating_Chosen_Country
      $IMDB_Parental_Advisory_Nudity
      $IMDB_Parental_Advisory_Violence
      $IMDB_Parental_Advisory_Profanity
      $IMDB_Parental_Advisory_Alcohol
      $IMDB_Parental_Advisory_Frightening
      }

  - rescanMoviesMetaData_fetchIMDBMetaData_creditsData

    - scrapeIMDBFullCreditsData()
    - imdbData.creditsData: {
      topCredits: {
      $IMDB_Top_Directors: string;
      $IMDB_Top_Writers: string;
      $IMDB_Top_Producers: string;
      $IMDB_Top_Cast: string;
      };
      credits: {
      category: string;
      id: string;
      name: string;
      credit: any;
      }[];  
      }
    - WAS: credits (param to saveIMDBdata)
    - NOW: imdbData.creditsData.credits

  - rescanMoviesMetaData_fetchIMDBMetaData_companiesData

    - scrapeIMDBCompaniesData()
    - imdbData.companiesData: {
      topProductionCompanies: {
      $IMDB_Top_Production_Companies: string;
      };
      companies: any[];  
      }
    - WAS: companies (param to saveIMDBdata)
    - NOW: imdbData.companiesData.companies

  - rescanMoviesMetaData_fetchIMDBMetaData_filmingLocations
    - WAS: filmingLocations (param in saveIMDBData)
    - NOW: imdbData.filmingLocations

- [x] (already fixed) companies: duplicates in topcompanies; non-dupes in companies list?
- [x] on forced rescan also do MediaInfo
- [x] highlight hidden filtered languages
  - [x] Audio Languages: color the +7 if the language is behind it
  - [x] Subtitle Languages: color the +7 if the language is behind it
- [x] sidebar: for each filter (where applicable) provide switchable icon with tooltip for sort mode (alphabetically or by number of movies)
  - [x] merge filterGroups after load, so that new features in code are still present
  - [x] filterSourcePaths
  - [x] filterQualities
  - [x] filterAudioLanguages
  - [x] filterSubtitleLanguages
  - [x] filterReleaseAttributes
  - [x] filterLists
  - [x] filterGenres
  - [x] filterPersons
  - [x] filterCompanies
  - [x] filterYears
  - [x] filterIMDBPlotKeywords
  - [x] filterIMDBFilmingLocations
  - [x] NOT filterRatings
  - [x] NOT filterMetacriticScore
  - [x] NOT filterIMDBRating
  - [x] NOT filterAgeRatings
  - [x] NOT filterParentalAdvisory
  - [x] NOT filterDataQuality
- [x] Sidebar: colorize also the caret
- [x] Sidebar: colorize also the spinner
- [x] reload the filters first that have been modified (e.g. change in genres reloads genres first)
- [x] calculation of numMovies for AND-connected filters should be different than OR-connected filters of the same category
  - [x] filterGenres
  - [x] filterPersons
  - [x] filterCompanies
  - [x] filterIMDBPlotKeywords
  - [x] filterIMDBFilmingLocations
  - [x] filterReleaseAttributes
  - [x] filterDataQuality
- [x] colored active filters on the sidebar
- [x] MediaList: move `*Applied` and `*AppliedContains` to $shared, so that App can also use them
- [x] shared: introduce filter\*Active (true|false), reuse this info in MediaList.filtersList and App
- [x] highlight filtered people, companies etc. (same as search highlight)
  - [x] People
  - [x] Companies
  - [x] SourcePaths
  - [x] Video Quality
  - [x] Audio Languages
  - [x] Subtitle Languages
  - [x] Release Attributes
    - [x] defect: Lego Batman: The Movie - DC Super Heroes Unite fulfills "Director's Cut" filter
    - [x] defect: "Director's Cut" filter with "all selected must apply" only shows 1, expected: 86
  - [x] My Lists
  - [x] Genres
  - [x] Age Ratings
  - [x] Content/Parental Advisories
  - [x] Release Years
  - [x] Plot Keywords
  - [x] Filming Locations
  - [x] ALL Categories: if there is a mk-clickable expandable section title, color it if the list is non-empty
- [x] optimize movie credits handling (duplicate person in different roles per category, e.g. Aaron Sorkin in Few Good Men)
- [x] remove sqlite indexes that don't exist anymore
- [x] eliminate TODO/KILLME entries in code
- [x] store media info object as MI_Object in tbl_Movies
- [x] allow unlinking in relink dialog
  - tbl_Movies.isUnlinkedIMDB (make use of this field, where appropriate)
    - unlinked movies should not detect tconst automatically (also check handling of real duplicates!)
    - on explicit rescan (at the movie): don't use it
    - on fast/complete rescan of multiple movies: use it
- [x] first scanned item shows 1s of remaining time (better not show anything or guesstimate)
- [x] some log groups do not close before the next opens
- [x] write cli tests and optimize findIMDBtconst
  - [x] do a hybrid search to find imdb tconst (advanced title search, find etc.)
    - it turns out that the find API suffices
  - [x] check if scrapeIMDBSuggestion is still necessary
        -> suggestion is not necessary anymore
  - [x] optimize scrapeIMDBFind by utilizing categories:
    - [x] Titles (movies, series, episodes): &s=tt
    - [x] optionally filter "(TV Series)": this exludes TV Series and Episodes but not TV Mini Series (which is good!)
    - [x] filter losely by year
    - [x] filter strictly by year
    - [x] take the runtime (MediaInfo vs. IMDB) into account if multiple results come up
- [x] Filters: "Select All", "Clear Selection", "Search": use icons
- [x] Layout: delete button in sidebar filters
- [x] (My) List Dialog: preselection should be the last selected list
- [x] languages from tbl_Movies_Languages are not taken into account for the Media List
- [x] Fix: Scan Media: cancel in early stage leads to mass removal!
- [x] Bottom Bar: show marquee or steps progress
- [x] (electron) The remote module is deprecated. Use <https://github.com/electron/remote> instead.
- [x] update ETA in scan message every second
- [x] use logger.group/groupCollapsed, logger.groupEnd throughout the app
- [x] add IMDB ID to MediaList
- [x] Highlight search results (Name, Name2, IMDB_plotSummary, fullPath, IMDB_tconst)
- [x] "long click" checkbox filter isolation
- [x] Fix: Crash/White Screen on startup when malformed i18n file is present
- [x] "Add to list" takes considerable time to finally show the list entry in the movie's entry
- [x] App: filter item isolation (click a filter item where all other items are true: Select All items false but the clicked one)
- [x] Search Data Dialog: do in-client sort by numMovies
- [x] Search Data Dialog: use "\*" as placeholder
- [x] "load animate" only the filter that is currently loading
  - [x] fetch the filter that has been modified first (added items, removed items)
  - [x] kill previously started fetching of filters (else we clash)
- [x] reload filters after saving user edited entry
- [x] LinkIMDBDialog: use Find and merge with AdvancedTitleSearch
- [x] implement <https://github.com/mawie81/electron-window-state>
  - [x] debug node_modules/electron-window-state (it's unmaintained)
- [x] KILLME checker script
  - [x] prevent build
- [x] Medialist: fix layout if movie name overflows
- [x] check layouts of sidebar filters
- [x] Drag/Drop Rearrange:
  - [x] Settings - Regions
  - [x] Settings - Languages
  - [x] Settings - Release Attributes
  - [x] App - Sidebar Filter Menu (Genres, Years ...)
    - [x] when a filter is applied, set the filterGroup visible = true
    - [x] show "RESET" and "EDIT" buttons only on hover
- optimize text about removal of known missing file in ScanMedia Dialog (it is dependant on the setting of the source path)
- i18n
  - [x] IMDB Scraper Test Dialog
  - [x] IMDB Options in ScanMedia Dialog
  - [x] Scan Errors (all of the keys, and the value for verifyIMDBtconst)
- [x] introduce a scan error (more like scan warning) when:
  - actual runtime differs from imdb runtime
  - release year differs from imdb year
  - provide text button to explicitly clear the error message
- [x] placeholder icon for Person Dialog, also circular progress while scraping
- [x] placeholder icon for movies
- [x] rework video quality detection (1085p is not UHD)
- [x] provide VLC and MediaInfo CLI alongside the App (use ./bin/%platform%/mediainfo-cli/) - use the location as default location of mediainfo cli - currently only for Windows
- [x] IMDB Rating and Metacritic filters fixed
- [x] New Filter: Data Quality
  - missing IMDB Link
  - has Scan Errors
  - missing Secondary Title
  - missing Poster
  - missing Plot Summary
  - [x] fill the asterisk in MediaList
  - [x] i18n
- [x] writing credits are sometimes not fetched at all, see Arlington Road
- [x] on Cancelling (re-scan): dont display button but show "cancelling..."
- [x] imdb scraper: support "new" main page
- [x] fix in imdb scraper where genres were duplicated
- [x] fix in imdb scraper where metadata was missing (poster, plot summary)
- [x] sort by Name as secondary criteria when sorting by anything else as first (e.g. year -> name)
- [x] IMDB detection
- [x] -> improve by utilizing year (162 of 170 matched, 2553 of 2648 matched)
- [x] "Browse" VLC path -> depending on OS type provide default path / default extension
- [x] -> provide mediainfo-rar or similar for Linux/Mac - or better yet let the user provide a path?

  - [x] -> user must provide

- [x] preferred Regions
- [x] let user define preferred (local) Regions to identify the primary title
- [x] -> fetch Countries from `https://www.imdb.com/search/title/` and provide as list
- [x] -> Auto set region by user's localization setting?

## How long does it take to import 7,600 movies?

- start: 2021-10-09 15:30
- end: 2021-10-11 6:30
  => 39h / 7600
  => 18s / Movie

## Vuetify Upgrade to 2.5.8

### Layout Fixes

- [?] Dialog.vue

- [x] MediaList
- [x] Pagination.vue
- [x] Home.vue
- [x] VersionDialog.vue
- [x] Settings.vue
- [x] CheckIMDBScraperDialog.vue
- [x] AddLanguagesDialog.vue
- [x] AddRegionsDialog.vue
- [x] AddTitleTypeDialog.vue
- [x] AgeRatingDialog.vue
- [x] App.vue
- [x] CompanyDialog.vue
- [x] EditMediaItemDialog.vue
- [x] EditReleaseAttributeDialog.vue
- [x] FilmingLocationDialog.vue
- [x] GenreDialog.vue
- [x] LanguageDialog.vue
- [x] LinkIMDBDialog.vue
- [x] ListDialog.vue
- [.] LocalVideoPlayerDialog.vue (not in use)
- [x] PersonDialog.vue
- [x] PlotKeywordDialog.vue
- [x] RatingDemographicsDialog.vue
- [x] ReleaseAttributeDialog.vue
- [x] ScanOptionsDialog.vue
- [x] SearchDataDialog.vue
- [x] SourcePath.vue
- [x] TitleType.vue
- [x] VideoPlayerDialog.vue
- [x] VideoQualityDialog.vue
- [x] App.vue BOTTOM BAR

### Proper Portable Mode

- [x] use pre-build step to set portable mode explicitly
- [x] implement pre-build step in all build tasks
- [x] target: RELEASE directory with media-hoarder-VERSION-... files
- [x] create set-release-version.js which renames the media-hoarder-VERSION-... files to media-hoarder-1.2.3-... files

### Create Movie Editor

- Primary Title
- Secondary Title
- Year
- Description
- Genres
- Release Attributes
- on (re-)scan: don't overwrite user-defined data (see tbl_Movies.DefinedByUser field definitions)

### Implement Home Screen Cards

- bigger cards
- some info (number of movies)

### Use User's Home dir for storing data

isBuild: use APPDIR/data
!isBuild: use ~/.media-hoarder

- Linux: after .deb install, a normal user can't write to /opt/media-hoarder/...
- Windows: not so problematic, as the app is installed in a user writable location

-> use a ~/.media-hoarder directory
-> this is the default location, we should be able to overwrite that via media-hoarder.json { "portable": true }

-> don't store "/data" in:

- tbl_Movies IMDB_posterSmall_URL and IMDB_posterLarge_URL
- tbl_IMDB_Persons.Photo_URLgetStaticPath

helpers:

- getStaticPath: formerly known as getPath - returns absolute path to APPDIR/data
- getDataPath: returns ~/.media-hoarder in !portable mode, else APPDIR/data

### From electron builder

#### Linux

```text
  • application Linux category is set to default "Utility"  reason=linux.category is not set and cannot map from macOS docs=https://www.electron.build/configuration/linux
  • default Electron icon is used  reason=application icon is not set
  • application Linux category is set to default "Utility"  reason=linux.category is not set and cannot map from macOS docs=https://www.electron.build/configuration/linux
```

#### Windows

```text
  • default Electron icon is used  reason=application icon is not set
```

as per <https://nklayman.github.io/vue-cli-plugin-electron-builder/guide/recipes.html#icons>

### Automatically find mediainfo and vlc

- Linux "which"
- Windows "where"
  -> test in Linux (success)

### Relative movie directories (#relpath)

tbl_Movies:
Path -> RelativePath
Directory -> RelativeDirectory

store.listPath now with basePath

- a movie's directory and path should always be relative to the sourcePath definition
  -> use path.resolve etc. to work with them
  -> this way, a whole sourcePath can move to another location

check:

- [x] extras merging (by directory)
- anything else?

### support Movies in directories (also .nfo parsing)

- we currently expect the whole movie name and release attributes being included in the filename, this is not always the case
- [x] find a way to decide if a movie file belongs to a dir-release or is standalone
- [x] if handling .rar files, summarize all individual filesizes
- [x] use isDirectoryBased in findIMDBtconstIncluded (tt12345 in file- or directory name)
- [x] use isDirectoryBased in findIMDBtconstInNFO (by .nfo file content)
- [x] use isDirectoryBased in finding findIMDBtconstByFileOrDirname (by File/Dirname)
- [x] use isDirectoryBased in finding Release attributes (DUBBED, BDRip etc.)
- [x] handle extras in "Extras" directory
- [x] check AssignIMDB (individual rescan)
- [x] update /docs

#### A directory-based media file is

- a media file alongside an .nfo file (scene release)
  -> also don't expect any other media files in the directory
- a media file inside an "extra" or "extras" directory (this is our own definition!)
  -> use the full filename as Extra Name

-> set isDirectoryBased = 1
-> ignore the filename and use the directory's name instead
-> parse the .nfo for IMDB tconst

=> anything else: treat it as file-based media file (isDirectoryBased = 0)

#### ignored files are

- a media file inside a "sample" directory
- a media file inside a "proof" directory

### I18N Basic

- [x] moment.humanize should also be localized (see de.json!)
- [x] implement vue-i18n
- [x] Add UI-Language Selection in Settings
- [x] change static strings in components to $t('key')

```text
    src\App.vue
    src\components\Settings.vue
    src\components\Home.vue
    src\components\MediaList.vue

    src\components\shared\AddLanguagesDialog.vue
    src\components\shared\AddRegionsDialog.vue
    src\components\shared\AddTitleTypeDialog.vue
    src\components\shared\CheckIMDBScraperDialog.vue
    src\components\shared\CompanyDialog.vue
    src\components\shared\Dialog.vue
    src\components\shared\FilmingLocationDialog.vue
    src\components\shared\LinkIMDBDialog.vue
    src\components\shared\ListDialog.vue
    src\components\shared\LocalVideoPlayerDialog.vue
    src\components\shared\Pagination.vue
    src\components\shared\PersonDialog.vue
    src\components\shared\PlotKeywordDialog.vue
    src\components\shared\RatingDemographicsDialog.vue
    src\components\shared\ScanOptionsDialog.vue
    src\components\shared\SearchDataDialog.vue
    src\components\shared\SourcePath.vue
    src\components\shared\TitleType.vue
    src\components\shared\VersionDialog.vue
    src\components\shared\VideoPlayerDialog.vue
```

### IMDB Scraper Checks / Watchdog

- [x] create a watchdog CLI which tests imdb-scraper.js

  - [x] scrape different IMDB pages
  - [x] compare with expected result (json suffices)
  - [x] creates an error report
  - [x] sends an email on error
  - [x] start with "npm run imdb-scraper-watchdog"

- [x] put all IMDB scraping functions from store.js into imdb-scraper.js
- [x] Implement test-framework callable in app and also in imdb-scraper-watchdog
- [x] Implement IMDB Scraper Checks Dialog, usable from
  - [x] Settings (via Button)
  - [x] after Scan Options Dialog and before actual Scan

### Release Attributes

- [x] EXTENDED, Director's Cut, UNRATED etc.
- [x] -> implement in shared.releaseAttributes save as Settings.ReleaseAttributes
- [x] -> let them be sortable

OK? => let user re-edit the entry/attributes

- [x] Save/Load of filter
- [x] implement Dialog incl. filtering and removal of individual release attributes

### Harden fetch from web

- [x] How should we handle ECONNRESET? maybe requestretry?
- [x] How can we test this?

- [x] investigate offline error handling
  - [x] imdb scraper test Dialog
  - [x] imdb scraping during (re-)scan
  - [x] track errors during rescan
  - [x] mark item as scanErrors, containing the log of scan errors (NULL if everything is fine)
  - [x] show this at the item in MediaList with button for direct rescan of the item and info to also perform rescan
  - [x] on rescan (quick): also take items with hasScrapeErrors being truthy into account (not only isNew = true)
  - [x] check movie identification based on name (this should also fail during scan)
  - [x] -> add movie identification on item-based rescan if no tconst is available
  - [x] imdb search/find
  - [x] imdb scraping on persons, companies etc.

### Filter Reset Button

- [x] implement filter reset button in side bar menu

### More Dialogs

- [x] add AudioLanguageDialog
- [x] add SubtitleLanguageDialog
- [x] -> for clicking the individual language in the MediaList
- [x] -> allow "filter by this language"
- [x] -> what do we do with "+3" entries?
- [x] -> they should expand

### Icons for Navbar

- [x] would it be good to have (many) icons for the sections and filters in the navbar?
- [x] -> yes, all icons identified

### MediaInfo: alternatively use track.DURATION if track.Duration is not available

- [x] Blues Brothers
- [x] -> mediainfo-rar

### Open moviechat.org button

- [x] -> link <https://moviechat.org/tt0054215>

### Filming Locations

- [x] add as section in MediaLists
- [x] add filter

### Rating Demographics

- [x] scrape
- [x] allow the user to choose which demography to use as IMDB rating
- [x] show demographics matrix when clicking IMDB score for an item

### CompanyDialog, PersonDialog, Plot Keyword Dialog, Filming Locations Dialog

- [x] include statistical infos (how many movies)

### 720p, SD, HD Detection

- [x] fix resolution Detection, e.g. 4:3 HD is oftentimes detected as 720p

### Age Rating

- [x] use user-chosen regions (countries) as basis for the age rating shown in the main list

### Settings - Scraper / Scan Media Options

- [x] allow user to deselect things for the IMDB scraper (analog to store.scanOptions)

### View-Switchig multiple event handling bug

### History/New Version Popup

- [x] shown on startup
- [x] welcome message
- [x] latest introduced features
- [x] history (show more..)
- [x] info if this is the latest version (based on github releases page?)

Content:

```json
[
  {
    "version": "1.0",
    "description": "version-1.0.html"
  },
  {
    "version": "0.5",
    "description": "version-0.5.html"
  }
]
```

- [x] small backlog.json
- [x] load version-xx.html from file or from github if not available
- [x] render within VersionDialog

### Investigate an "AND" filter

- [x] how would SQL queries look?
- [x] save AND filter setting alongside the filters themselves

### Show Scan-Progress in Taskbar

- [x] see: <https://www.electronjs.org/docs/tutorial/progress-bar>

### MediaList

- [x] Bug? Age (range) isn't shown anymore

### Rescan dialog

- [x] show warning when a source path cannot be found but it is set to remove entries on re-scan

### Recalculation of Pagination Items on mouseover

- [x] when mouseover on items, pagination items get recalced
- [x] reason could be usage of this.$set (it was indeed)

### Show Indicator when filters apply

### Person Search

- [x] "David Lynch" should have multiple hits, unfortunately only one is shown

### Duplicates

- [x] an actual duplicate is the same file in another location (e.g. local copy vs. on server)
- [x] a meta duplicate has the same IMDB ID

- [x] Rescan: when a movie was moved (same filename+size just deleted at location X and added on location Y)

  - [x] -> copy over userdefined data (e.g. rating etc. also member of lists)
  - [x] => do we really want this? what are the scenarios?: a "twin" may already exist and should be updated whenever a change happens - in this case we have id_Movies from the "source file" and should all other movies with same filename and size

- [x] => see shared.duplicatesHandling to check which features allow duplicate handling

Features:

- [x] relinkIMDB
- [x] addToList
- [x] updateRating
- [x] updateTitle
- [x] updateSubTitle
- [x] updateLastAccess

- [x] Test actual duplicates

- [x] also implement rescan (actualDuplicates and metaDuplicates can be found there, too)

### IMDB title

- [x] provide languages management (also based on regions!)
- [x] -> we need them for the "preferred Languages" from MediaInfo
- [x] -> we need them for the Primary Title

- [x] -> create tbl_IMDB_Languages
- [x] -> create tbl_IMDB_Regions
- [x] -> Create tbl_IMDB\"Regions\"Languages (mapping)
- [x] -> "your chosen regions provide the following language options, please select the ones you prefer as Primary Title"

- [x] provide whitelist management of title types
- [x] -> check title types from MovieManager's mm.db

on Rescan:

- [x] tokenize and find out if the tokens are either special title types or just language types
- [x] -> if user has appropriate language type setting (i.e. the preferred language types accomply with the chosen regions) then filter the language types, i.e. Token = "($LANGUAGE_FULL title)"
- [x] -> if the user has preferred title types then filter by them, else discard the title completely

### Pagination

- [x] implement better pagination control (move left, move right, middle: current page / total pages -> dropdown)

### Plotkeywords

- [x] scrape plotkeywords
- [x] show
- [x] filter

### Full Plot Summary

- [x] scrape full plot summary from /plotsummary (find the correct one using the summary text from main page)
- [x] show full plot summary when item is selected

### Restructure Settings

- [x] Tabbed view (either sidebar or horizontal tabs)

General

- [x] Media Player Path
- [x] MediaInfo Path
- [x] Last Access retention (seconds)
- [x] Update on Twins by filename + filesize
- [x] Update on Twins by IMDB ID

Cinema

- [x] Source Paths

Series

- [x] Source Paths

### Media Scan

- [x] as soon as a tbl_Movies entry is written, also write Name

- [x] min/maxAge is false when 0 is in place

### Other

- [x] Analyze the call App.vue -> store.rescan(onlyNew); -> node functionality without IPC or whatever
- [x] sort by last_access faulty after introduction of 2nd sort criteria (name)
- [x] \*Dialog movie list: don't use mk-clickable on the whole list
- [x] use " »" indicator on MediaList for expandable sections of text (e.g. plot keywords, people etc.)
- [x] Show movie list in dialogs, e.g. PersonDialog
- [x] remove "SEE" from attributes, check other candidates
- [x] update 5-star rating to 5-star with half-steps rating, see also: <https://www.npmjs.com/package/vue-star-rating> <https://jsfiddle.net/craig_h_411/992o7cq5/>
  - [x] update "copy info"
  - [x] update "my ratings" filter
- [x] calculate and show ETA during rescan
- [x] cancel during rescan (also cancel MediaInfo activity)
- [x] include IMDB ID in search space (i.e. you can type/copy an IMDB ID in the search field and get results)
- [x] enhance scrapeIMDBParentalGuideData with PG-Codes (use tbl_AgeRatings)
- [x] FullScreen toggle
  - [x] via button + tooltip
  - [x] via F11 key
- [x] add button for Years filter "SET RANGE"
- [x] implement store.setSetting with SQLite's `ON CONFLICT` method
- [x] use user-defined language for localized numbers
- [x] provide scraping details in snackbar during rescan
- [x] use markdown for history
  - [x] update preparation notes
- [x] App: show search only when in medialist
- [x] App: show filters only when in medialist
- [x] App: ask before delete (mdi-delete items)
- [x] re-browse Source Path
- [x] calculate video resolution by multiplying width and height and use the megapixels
- [x] review <https://nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html>
  - [x] re-enable websecurity
- [x] Settings: allow writeable text fields for VLC and Mediainfo (or edit button)
- [x] Settings: IMDB Demographics are not translated
- [x] autodetect mediaplayer: MacOS: check if /Applications/VLC.app/Contents/MacOS/VLC exists, and use this
- [x] investigate binary signing for MacOS release
- [x] pin versions
- [x] translate eventBus.scanInfoShow
- [x] block any IMDB scan when one is already in progress
- [x] check if built release also opens up a port (it doesn't)
- [x] check AppImage usage (storing to ~/.media-hoarder should be possible)
- [x] remove Series in menus and Settings (it will be implemented later)
- [x] Settings: user-defined log level (stored in db)
- [x] Fine-tune some text colors
- [x] Dialogs: define v-dialog as scrollable where applicable
- [x] Settings: provide dialog before removal for
  - [x] Regions
  - [x] Languages
  - [x] Title Types
  - [x] Release Attributes
- [x] List Dialog layout
- [x] Optimize Dialogs: scrollable content, fixed header and footer
- [x] implement minimumWaitForSetAccess with a defaut value of 60 (seconds)
- [x] mediainfo-rar not needed anymore: Mediainfo is also able to scan inside .rar files
- [x] dont import "See full summary>>"
- [x] implement fetchFilter IMDB/Metacritic Score
- [x] implement Company filter by Company Name instead of ID
- [x] -> call companyDialog via eventBus when company is clicked in searchDialog
- [x] -> some numbers mismatch (filter and main list)
- [x] MediaList: when changing a page, autoscroll up?
- [x] Rescan: only 1 button on sidenav, show dialog to choose "only new" or "compete" rescan
- [x] Trailer Player with Video.js (extract video source from imdb trailer page)
- [x] -> MediaList showTrailerLocal
- [x] remember "sort by" setting (same as remembering the filters)
- [x] -> "sort by" is destroyed upon reload after adding/removing entry to a list
- [x] remember last page (same as remembering filters)
- [x] Remove movie from list -> Reload -> List is unchecked (why?)
- [x] filescan new fields:
- [x] size (display humanized e.g. 13.5 GB, 760 MB)
- [x] creation date
- [x] bottom bar should adjust to sidenav (we have its z-index at 100 now)
- [x] filter by Person or Company: this should deselect all Persons and only select the one Person chosen (same with companies)
- [x] MultiPart: interpret "1_2" as "(1/2)"
- [x] exit menuitem
- [x] fix Age Rating filter (undetermined yields no results -> see filterParentalAdvisory)
- [x] fix duplication check in filescan, e.g. `Audition ~ Ôdishon (De)(Sub De)(HD)[1999][Drama, Horror, Mystery][7.2 @ 65149][tt0235198].mkv`

### Languages Filter

- [x] MediaInfo Scan: add to tbl_Movies_Languages (Audio, Subtitle)
- [x] add Audio- and Subtitle Filters in App.vue

### Watchlist

- [x] add as filter
- [x] implement "add to watchlist button"
- [x] -> Implemented as arbitrary lists

### Play "Button" as masked image

- [x] see data/maskPlay.pdn/png
- [x] embedded as base64 with <https://www.base64-image.de/>

### Extras

- [x] add "isExtraOf" relation for tbl_Movies
- [x] -> don't count Extras (e.g. in filters)
- [x] -> don't show Extras in main list
- [x] -> show Extras in expanded item
- [x] -> implement extra detection in rescan (determine to which movie the extra must be assigned to, e.g. multiple releases of the same movie, maybe work with IMDB id but also with parts of the Name)

### Last Seen (last_access_at)

- [x] in movie details
- [x] as sortable
- [x] set after predefined time

### IMDB MetaData

- [x] Parental Guidance (Sex/Nudity, Gore etc. scores)

### Filters

- [x] Company (Search-filter)
- [x] Person (Search-filter)
- [x] Year
- [x] Quality
- [x] People (Search-filter)
- [x] Age
- [x] Own Rating
- [x] IMDB Rating
- [x] Metacritic
- [x] Metacritic Score

### MediaList - Sort

Sort by:

- [x] Name
- [x] Own Rating
- [x] IMDB Rating
- [x] Metacritic Score

### Settings

- [x] Source Path dialog
- [x] -> prefill Description with directory name?
- [x] "loader" on SourcePath removal (it may take some time)
- [x] sourcePath: check for removed files
- [x] minimumWaitForSetAccess (update Access datetime after ... seconds)

### Company

- [x] scrape from IMDB
- [x] find out a way to display the "top 5" companies involved

### MediaList - Movie (non-selected)

- [x] Metacritic Score

### MediaList - Selected Movie

- [x] show more information
- [x] add Content Advisory (Sex & Nudity, Gore etc.)

### Edit Movie

- [x] allow to re-assign new IMDB entry
  - [x] -> opens IMDB search (store/scrapeIMDBAdvancedTitleSearch)
  - [x] perform rescan after re-assign (only this movie)
  - [x] refactor rescanMoviesMetaData (we need to differentiate mediainfo metadata and imdb metadata, we don't need findIMDBtconst when id_Movies is provided)

### Dialog Enter and Escape

- [x] Enter should "OK" the dialog
- [x] Esc should "Cancel" the dialog

```text
Dialog.vue

  OK - Enter
  OK - Esc

- CompanyDialog.vue
  N/A - Enter
  OK - Esc

- ListDialog.vue
  OK - Enter
  OK - Esc

- LocalVideoPlayerDialog.vue
  N/A - Enter
  OK - Esc

- PersonDialog.vue
  N/A - Enter
  OK - Esc

- ScanOptionsDialog.vue
  OK - Enter
  OK - Esc

- SearchDataDialog.vue
  N/A - Enter
  OK - Esc

- LinkIMDBDialog.vue
  N/A - Enter
  OK - Esc

- VideoPlayerDialog.vue
  N/A - Enter
  OK - Esc
```

### Bugs

- [x] person dialog: fix photo url
- [x] (hot reload) search filter is active but not shown in search text box
- [x] MediaList: disable "IMDB relink" button when scan is in progress
- [x] IMDB Scraper: on a German IP, we still get the German title as Primary Title even though we Select All languages to English
  - [x] use "Accept-Language": "en" header on all calls to IMDB
- [x] Linux version doesn't fetch data / endless loop? (in our test VM)
  - [x] test in livecd (successful, fetch from web is working as expected)
        -> we assume there is an issue with the VM
- [x] Title determination (Regional, Primary, Secondary)
- [x] vue-i18n: Value of key 'LanguageNames.N'Ko' is not a string!
- [x] duplicate detection fails at special characters: e.g. "adams aebler"n
- [x] Settings -> Languages: languages aren't translated in the list
- [x] Settings -> Regions: regions aren't translated in the list
- [x] Settings -> Release Attributes: don't allow sorting
- [x] imdb scraper: make sure, all texts are treated with html2text, see "Robot &amp; Frank"
- [x] single-item rescan doesn't update IMDB data? -> "Robot & Frank"
      -> misconcenption: actually an already removed duplicate provided the false names
- [x] complete rescan of movie with extras leads to multiple duplicates and extras added to main list
- [x] filescan: extras naming (see: "Die Üblichen Verdächtigen", "Vertigo")
  - we now derive the Extra name from the filename and assign it to the primary name
- [x] filescan: skip IMDB metadata retrieval for Extras, i.e. filename contains " - extra"
- [x] Remove Source Path: Do you really want to remove the source path {Path} ({MediaTypeUpper}) including all associated media? (This does not delete any actual files)
- [x] delete entries with isRemoved = 1 after successful rescan
- [x] i18n: mixed up languages with i18n and moment
- re-assigning IMDB doesn't clean up some metadata
  - [x] tbl_Movies_Genres
  - [x] tbl_Movies_IMDB_Companies
  - [x] tbl_Movies_IMDB_Credits
  - [x] tbl_Movies_IMDB_Filming_Locations
  - [x] tbl_Movies_IMDB_Plot_Keywords
