# Movie List

An app which keeps track of the movies and TV series you have watched or would like to watch.

If you want to use this app to track movies and series, you can certainly do so, but bear in mind that this is a personal project - I'm writing this app for myself, at my own pace, and according to my own needs.

![](https://1911888384-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ7hAx4IWBVNicwUwE4%2F-MQ7hu6DfGufV2MzQR-4%2Fv0.2-screen-movie.png?alt=media\&token=21dd55bb-f8f0-4160-97f8-0bd8b1fcf1d6)


# Getting Started

## How to Get the App

The Movie List app works only on Windows 10 May 2020 Update or later. Currently the only way to get this app is to download it from the *releases* section on GitHub and extract it manually. The latest version is 0.2.

## Files and Tabs

The app works with files of the *.mlist* extension. An *.mlist* file represents a list of movies, series, and franchises, and some auxiliary settings. If you want Windows to bind the file extension to this app, you'll have to do it manually for now. All files are opened in separate tabs.

This is a single-instance app. You can't open multiple windows in this app. If you open it when it's already opened, it will simply show you the existing window. If you open a file when the app is already running, it will open the file in a new tab.

## The Home Page

![](https://1911888384-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ7hAx4IWBVNicwUwE4%2F-MQ7hu6AcvS_FPj0xE4P%2Fv0.2-screen-home-page.png?alt=media\&token=38186275-a34d-4678-9dcf-f32792efef8d)

The app's home page contains several features for working with files.

Firstly, you can create a list file. When you click on the *Create a list* button, a *Save file* dialog is opened. Enter the file name and select the location, click save, and an empty list file will be created and opened in a new tab. This is also available through the *File > New menu* item, or by pressing `Ctrl+N`.

Secondly, you can open an existing list file. There are several ways to do that. You can click the *Open a list* button and select the file in the *Open file* dialog. Or you can use the *File > Open* menu item, or press `Ctrl+O`. Also, you can drop a file into any area inside the app window to open a new file. Lastly, you can open the file through the File Explorer if you had Windows bind the file extension to this app.

Thirdly, you can view and open any files that you've recently opened. Simply double-click on any *Recently opened files* entry to open it. You can also go to the *File > Open Recent... > (file name)* menu item to open a recent file. To remove a file from the recently opened files list, click on the check-box on the left side of the entry, and click the *Remove from list* button.

## Other Menu Items

You can learn about feature-specific menu items in the following articles.

The following menu items don't belong to specific features:

* *File > Exit* (or press `Alt+F4`) to exit the app (obviously);
* *Help > About* (or press `F1`) to view some basic info about the app.


# List Files

Here's what the app looks like when you create a new file:

![](https://1911888384-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ7hAx4IWBVNicwUwE4%2F-MQ7hu6FgPT8IZCQeOnw%2Fv0.2-screen-new-file.png?alt=media\&token=e5c011a7-ce5d-42f0-98fd-307457d2de2b)

The file tabs are composed of three main sections: the list itself, stats, and settings. You can switch between them using the left-side bar.

When you open a file, you can close it via the *close* button in the tab's header, through the *File > Close* menu item, or by pressing `Ctrl+W`.

## The List Section

Here's what the list section looks like when it contains entries:

![](https://1911888384-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ7hAx4IWBVNicwUwE4%2F-MQ7hu6Bdq9U0hZkvENA%2Fv0.2-screen-list.png?alt=media\&token=65c3254f-be74-49eb-9a98-593480afce54)

### List Structure

The list items can be of three types:

* Movies
* Series
* Franchises

By default, the items are sorted alphabetically by title and then by year if their title is the same, but it's configurable.

Franchises are used to group related items together and without them some items would be scattered across the list when it would make more sense to have them appear together.

The list has four columns:

* Sequence number to show the item's number in a franchise
* The title in your native language
* The original title
* Year or years

The majority of popular contemporary movies are in English, so if your native language is English, then the title will often be the same as the original title.

All item types can have multiple titles and original titles since different translations exist or the item is marketed differently in different markets. Only the first title and original title is shown in the list. Every item can have up to 10 titles and up to 10 original titles, although even that is too much in my opinion.

### Kinds

Every item can be of a certain kind. Kinds are used to color-code items in the list. Every kind has six colors for various item types and states:

* Movie which has already been watched
* Movie which hasn't been watched yet
* Movie which hasn't been released yet
* Series which has already been watched or is being watched
* Series which hasn't been watched yet
* Series which hasn't been released yet

There are no separate colors for franchises - they get the color of their first entry.

By default, every file contains three kinds (although it can be configured):

* Live-action: movies are black, series are blue
* Animation: movies are green, series are light-blue
* Documentary: both movies and series are purple

The default kinds have all non-watched items as red and all non-released items as dark red.

### Tags

Every item can have one or more tags. They can be used for searching or filtering, although you can choose not to use them at all. Unlike kinds, tags don't influence the item's color in the list. In fact, they don't impact the app's behavior in any way - they are just auxiliary pieces of information. Tags are applicable to movies and series. You can't add tags to franchises. You can also restrict a tag to be applicable only to movies or only to series.

Every tag has a name, category, description, and color. The name/category combination must be unique. Names should generally be short enough for the tag not to take up too much space and should be all-lowercase. e.g. *comedy*. The categories are used to semantically group tags. They should start with a capital letter, e.g. *Genre*. Descriptions are used to provide more info about tags, but are not required. Colors are used to more easily discern tags.

In addition, tags can imply other tags. For example, if you specify that the tag *black comedy* implies *comedy*, it means that every movie or series which has the *black comedy* tag will also implicitly have the *comedy* tag as well.

### Adding Items to the List

You can add new items to the list by clicking the buttons in the right-side panel, which will open a form for editing the item. If you want to edit an existing item, click on it, and the form for this item will be opened. You can't create franchises directly because they are not supposed to be standalone list items. Rather, you create them through previously created items.

You can learn more about editing list items in the next article.

## The Stats Section

Statistics are not implemented yet, so the respective left-side bar item is disabled.

## The Settings Section

Here's what the settings for a file look like:

![](https://1911888384-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ7hAx4IWBVNicwUwE4%2F-MQ7hu6K9pmJ6blu-oAY%2Fv0.2-screen-settings.png?alt=media\&token=a8de6487-050b-47ee-aaab-20e4f14aaeef)

You can open the file settings by clicking the left-side bar item, through the *File > Settings* menu item, or by pressing `Ctrl+P`.

The settings consist of the three main sections: main settings, kind settings, and tag settings.

### Main File Settings

You can edit the following file attributes in the settings:

* List name
* Title language
* Default season title
* Default season original title
* Default first sorting order
* Default first sorting direction
* Default second sorting order
* Default second sorting direction

You can name your list however you like and it doesn't have to be the same as the name of the file. The list name appears in the tab header and in the recent files list on the home page.

Title language is used to correctly sort titles. While original titles can be in any language, titles will usually be in your native language, and sorting rules may be different for different languages.

Default season title and original title are used to generate titles for newly created seasons for series. The *#* symbol will be replaced with the actual season number. For example, if the default season title is *Season #* and you create two seasons, their default names will be *Season 1* and *Season 2* respectively. Same for season original titles. You can learn more about the season form in the article on series.

Default sorting is the sorting which is applied when you open the file. More info on sorting can be found in the article about searching, filtering, and sorting.

### Kind Settings

Here you can edit existing kinds, delete them, or add new ones.

A single kind setting consists of a name and six colors for the aforementioned item types. You can edit colors by clicking on them and by editing the color in the modal window.

![](https://1911888384-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ7hAx4IWBVNicwUwE4%2F-MQ7hu6LXtaxHW7cGrgz%2Fv0.2-screen-settings-color.png?alt=media\&token=d8e99aad-9c5d-4796-a08c-24b9e8455577)

You can select a color in the color picker or enter its HEX color value. Mind that the HEX value field uses ARGB instead of RGB. You can add `FF` in the beginning to convert an RGB value into an ARGB value.

You can have as many kinds as you like (but more than zero). You can't delete kinds that have items of that kind in the list. If you want to delete a kind, you should manually edit its every item to have a different kind.

### Tag Settings

Here you can edit existing tags, delete them, or add new ones.

When you add a new tag, or click on an existing one, a tag editing form is opened in the modal window where you can edit all the aforementioned attributes. The same rules apply to tag colors as to kind colors.

![](https://1911888384-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ7hAx4IWBVNicwUwE4%2F-MQ7hu6MQPc-Bm91_wS_%2Fv0.2-screen-settings-tag.png?alt=media\&token=434bb80a-62ad-44f1-ae9e-ee251baab7e7)

You can have as many tags as you like, or none at all, if you don't want to use them. Unlike kinds, you can delete tags which belong to existing items. If you do, then all items will lose this tag.


# Forms

You can add, edit, and delete list items through forms which appear on the right side of the main section. There are six types of forms:

* Movie
* Series
* Season (part of the series form)
* Special episode (part of the series form)
* Miniseries
* Franchise

All list items can contain posters. None of them are stored in the list file however. Only their URLs are stored - the posters themselves are fetched from the internet when the form is opened and cached locally for 5 minutes.

## Saving the Forms

Forms can be in two basic states: changed and unchaged. If the form is changed, you can cancel all changes and return the form to how it was when you opened it. If the form is changed and valid, you can save it to write the changes to the file. If you close an unsaved form, all changes are discarded. You can't perform certain actions when the form contains changes, e.g. you can't delete it, or create a franchise.

You can also save a form through the *File > Save* menu item, or by pressing `Ctrl+S`.

If you look at the big picture, you'll see that this app lets you write only tiny changes to the file at a time, unlike many other file-based apps. For example, you can't spend half an hour inputting data into the app and save all those changes at once (and you really shouldn't do that in other apps as well), because you can save only one form at a time.

The *Save As* functionality works differently than in other apps. Normally you can make some changes to a file, save it as another file (and maybe another file type) and the original will be unchagned - you can even revert all changes so that the original file remains the same. In this app, however, *Save As* works only when all changes are already saved in the original file. This is because the app doesn't let you change a lot without saving, so there is no reason to use *Save As* to save a copy of the file and have the original unchanged. You shouldn't change the file extension when saving as either. This app works only with the *.mlist* file extension.

You can save a file as another file through the *File > Save As...* menu item, or by pressing `Ctrl+Shift+S`.

## Integration with IMDb and Rotten Tomatoes

This version of the app has minimal integration with IMDb and RT. You can enter links to the item on those sites and that's it for now. A future version will show the IMDb score and RT scores inline so you don't have to open the sites to view them.


# The Movie Form

The movie form is the simplest and most straightforward of the forms. Here's how it looks:

![](https://1911888384-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ7hAx4IWBVNicwUwE4%2F-MQ7hu6EvUUTwm1GUnA5%2Fv0.2-screen-movie-form.png?alt=media\&token=d679711f-d301-4a88-9660-e8d349d40b09)

The form consists of the following sections:

* Header which contains the first title, the *close* button, and a few other buttons if the movie is a part of a franchise (which are discussed in the article on franchises)
* Poster and links, if present
* The form fields
* Buttons for various actions

## Form Fields

The movie form contains the following fields:

* Check-box which indicates whether you watched the movie
* Check-box which indicates whether the movie is released
* Titles (at least one required)
* Original titles (at least one required)
* Year (required)
* Kind (required)
* IMDb link
* Rotten Tomatoes link
* Poster URL
* Tags

The *released* check-box is enabled only if the movie's year is the same as the current year. If the movie's year is before the current year, it's obvious that the movie is already released. Conversely, if the movie's year is after the current year, it's obvious that the movie is not released yet.

If you check the *watched* check-box, and the *released* check-box is unchecked, it becomes checked as well. It doesn't make sense that you can watch an unreleased movie (yes, there are exceptions, but those are rare). If you uncheck the *released* check-box, the *watched* check-box becomes unchecked as well.

You can add titles with the *Add title* and *Add original title* buttons. If there are multiple titles, you can delete them by pressing the *delete* button on the right side of the title field. You can't change the order of the titles. If you decide that the second title should become the first and the first - second, you should change them manually.

The minimum value for the year is 1850 and maximum value is 2100. The reason that the movie form includes only a year, and not a full release date is because the movie can have multiple release dates: premieres can be on different dates in different markets, and movies can be shown at festivals ahead of their release.

You can select any kind from the list of kinds which you specify in the file's settings.

Links and the poster URL are not required, and indeed not every movie is guaranteed to have an entry in IMDb or RT (although I have yet to find a movie which doesn't have an entry in IMDb).

You can add any tag from the list of tags which you specify in the file's settings. Once added, you can remove any tag by clicking its *delete* button. Only those tags that are applicable to movies can be added.

## Actions

The movie form has several action buttons:

* Delete the movie
* Create a franchise
* Other franchise actions which are discussed in the article on franchises

You can execute these actions only when the form doesn't contain changes.


# The Series Form

This is a big one. It takes much more effort to add a series than it is to add a movie. Here's how a series form looks:

![](https://1911888384-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ7hAx4IWBVNicwUwE4%2F-MQ7hu6JhV5db7Wu16th%2Fv0.2-screen-series-form.png?alt=media\&token=a9afebcc-32d7-41e0-adb7-7e2ff4f2e26b)

The series form consists of the following parts:

* Header which contains the first title, the *close* button, and a few other buttons if the series is a part of a franchise (which are discussed in the article on franchises)
* Poster (or logo) and links, if present
* Main form fields
* The list of components: seasons and special episodes
* Additional fields
* Buttons for various actions

## Form Fields

The series form contains the following fields:

* Titles (at least one required)
* Original titles (at least one required)
* Watch status (required)
* Release status (required)
* Kind (required)
* IMDb link
* Rotten Tomatoes link
* Poster URL
* Tags

All the same rules apply to titles as with the movie form.

Since watching the series is more of a continuous process (unless you binge it), its watch status is more than just *watched* or *not watched*. Here are the possible watch statuses:

* Not watched, if you haven't started watching the series yet
* Watching, if you are currenly watching the series or waiting for new episodes
* Watched, if you have watched the series in its entirety
* Stopped watching, if you decided that the series is not worth your time anymore

Like watch status, there's more to the release status than simply 'released' or 'not released'. Here are the possible release statuses:

* Not started
* Running
* Finished, if the series finished naturally
* Cancelled, if the series was axed by the studio
* Don't know/don't care, if you stopped watching the series and you don't want to track it in the app anymore

You can select any kind from the list of kinds which you specify in the file's settings.

Links and the poster URL are not required, and indeed not every series is guaranteed to have an entry in IMDb or RT (although, like with movies, I have yet to find a series which doesn't have an entry in IMDb). Instead of a poster, you can put a URL of a series' logo, which I do for most series.

You can add any tag from the list of tags which you specify in the file's settings. Once added, you can remove any tag by clicking its *delete* button. Only those tags that are applicable to series can be added.

## Series Components

Series must contain one or more components. A series component is either a season or a special episode which in the context of this app means an episode which was aired or released separately from others, even if the studio doesn't designate it as 'special' (e.g. White Christmas is a standalone episode of Black Mirror). You can add componentes through the *Add season* or *Add special episode* buttons. When you press one of them, a respective form is opened. You can't save a series unless it contains at least one component.

You can move series components up and down by right-clicking on a component and selecting the *Move up* or *Move down* context actions.

## Other Actions

The series form has several other action buttons:

* Delete the series
* Convert to miniseries
* Create a franchise
* Other franchise actions which are discussed in the article on franchises

You can convert a series to a miniseries. A miniseries is a one-season series without special episodes which is designed to be limited in nature. Miniseries have separate, simplified forms. You can convert a series to a miniseries only if it contains one season or none at all, and no special episodes.

You can execute these actions only when the form doesn't contain changes.

## The Season Form

When you add a new season or click on an existing one in the series form, a season form is opened. Here's how it looks:

![](https://1911888384-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ7hAx4IWBVNicwUwE4%2F-MQ7hu6I92Y_WzyGhmNK%2Fv0.2-screen-season-form.png?alt=media\&token=37d72c5c-912a-4f02-97f9-bab93c768a66)

Unlike the movie and series forms, the season form is not independent - it's considered to be part of the series form. You can't save a season directly; to save a season, go back to the series form and save the whole series. You can cancel any changes in the season form directly. If you cancel changes in the series form, all changes in all seasons will be cancelled as well (new seasons will be deleted, and deleted seasons will be returned).

The season form consists of the following parts:

* Header which contains the first title, the *close* button, and navigation buttons
* Poster, if present
* Main form fields
* The list of release periods
* Buttons for various actions

### Season Form Fields

The season form contains the following fields (all fields are required):

* Titles
* Original titles
* Watch status
* Release status
* Original channel

When you create a new season, its titles are generated using the default season titles from the file's settings.

As with series, there are several watch statuses:

* Not watched, if you haven't started watching the season
* Watching, if you are currently watching it, or waiting for new episodes
* Watched, if you have finished watching the full season
* Hiatus, if the season is on a hiatus, or you decided to take a break from watching it
* Stopped watching, if you lost interest in the series, haven't finished the season, and don't plan to finish it

Likewise, there are several release statuses:

* Not started, if the season hasn't started airing or hasn't been released yet
* Running, if new episodes are currently airing or are being released
* Finished, if all episodes of the season have been released
* Hiatus, if the season is on a hiatus and new episodes won't come for some time
* Don't know/don't care, if you stopped watching the series and you don't want to track it in the app anymore

The original channel is just for descriptive purposes. When you create a new season, by default it has the same channel as the previous series component. There may be situations when a series has multiple original channels (e.g. Killing Eve is a co-production between BBC America and AMC). If that's the case, choose one of those. The form is complicated as-is, and adding the possibility of multiple channels will only make it more complicated.

Seasons don't have separate IMDb pages.

### Season Release Periods

Unlike movies, where releases are tracked up to a year, series components are tracked up to a month. Seasons could have a start and end date directly, but it's not that simple. A single season may be released in parts during different periods (like the last season of Breaking Bad or the last season of The Sopranos). It wouldn't really represent the truth if you said that those seasons lasted for a year - they didn't. They lasted for a few weeks, had a hiatus and then for a few weeks next year. That's why seasons may contain multiple release periods. Every period has its own set of fields inside the season form. Obviously, every season requires at least one period, and there is no upper bound for the number of periods.

The period subform consists of the following fields (all fields except links are required):

* Start month
* Start year
* End month
* End year
* Number of episodes
* Check-box which indicates whether it was a single-day release (like for Netflix series)
* Rotten Tomatoes link
* Poster URL

The year of the release can be between 1950 and 2100. The periods must be valid - the end date cannot be before the start date and the periods cannot be interleaved.

The number of episodes for a single period can be between 1 and 50.

If it's a single-day release, you don't select the end month/year, becuase they are obviously equal to the start month/year.

Rotten Tomatoes tracks scores for individual seasons, but it may have multiple pages per season (the only series I've seen have multiple pages per season is The Sopranos). Thus the main part of the season form doesn't contain the RT link. Instead, the period subform has it, and that's why the link to RT is at the top of the period subform, and not directly below the poster, like in other forms.

If a season is released over multiple periods, it may be marketed differently during those periods and hence have different posters for different parts. If the season has multiple posters, you can switch between them with the little arrow buttons below the poster.

You can add a period by clicking the *Add period* button at the bottom of the season form. If you want to remove a period, click the *delete* button in the lower right corner of the period subform. You can't delete a period if there's only one present.

### Other Season Actions

The season form has a couple other action buttons at the bottom of the form:

* Delete the season
* Go to series

It also has action buttons in the form header:

* Go to series
* Go to the next series component (if the season is not the last component)
* Go to the previous series component (if the season is not the first component)

You can delete the season only when the form doesn't contain changes.

## The Special Episode Form

When you add a new special episode or click on an existing one in the series form, a special episode form is opened. Here's how it looks:

![](https://1911888384-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ7hAx4IWBVNicwUwE4%2F-MQ7hu5i8dJs50FatnaR%2Fv0.2-screen-episode-form.png?alt=media\&token=417931b2-cd35-4c55-bac7-ffb442640019)

This form is similar to the movie form and is much simpler than the season form. Like the season form, the special episode form is not independent - it's considered to be part fo the series form. You can't save an episode directly; to save an episode, go back to the series form and save the whole series. You can cancel any changes in the episode form directly. If you cancel changes in the series form, all changes in all episodes will be cancelled as well (new episodes will be deleted, and deleted episodes will be returned).

The special episode form consists of the following parts:

* Header which contains the first title, the *close* button, and navigation buttons
* Poster and RT link, if present
* Form fields
* Buttons for various actions

### Special Episode Form Fields

The special episode form contains the following fields:

* Check-box which indicates whether you watched the episode
* Check-box which indicates whether the episode is released
* Titles (at least one required)
* Original titles (at least one required)
* Release month (required)
* Release year (required)
* Rotten Tomatoes link
* Poster URL

As with movies, watch and release statuses are simple check-boxes. The *released* check-box is enabled only if the release month/year is the same as the current month/year, because otherwise the release status is obvious. If you check the *watched* check-box, the *released* check-box becomes checked as well. If you uncheck the *released* check-box, the *watched* check-box becomes unchecked as well.

As with seasons, the year of the episode's release can be between 1950 and 2100.

### Special Episode Actions

The actions are the same as seasons' actions described in the *Other Season Actions* section.


# The Miniseries Form

The miniseries form describes series which are limited in nature. In the context of this app, a miniseries has only one season, which in turn has only one release period, and no special episodes. Here's how a miniseries form looks:

![](https://1911888384-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ7hAx4IWBVNicwUwE4%2F-MQ7hu6CPS7g8pTomjd9%2Fv0.2-screen-miniseries-form.png?alt=media\&token=b1c6a8f0-b907-4602-9e89-dcc35d4c8af7)

As you can see, the miniseries forms are much simpler than the full series forms as they don't contain other separate forms. You can't create a miniseries form directly - you create it by creating a full series form and converting it to miniseries.

The miniseries form consists of the following parts:

* Header which contains the first title, the *close* button, and a few other buttons if the miniseries is a part of a franchise (which are discussed in the article on franchises)
* Poster and links, if present
* Main form fields
* The period subform
* Additional fields
* Buttons for various actions

## Main Form Fields

The miniseries form contains the following main fields:

* Titles (at least one required)
* Original titles (at least one required)
* Watch status (required)
* Release status (required)
* Kind (required)

These fields are basically the same as in the full series form.

## The Period Subform

The miniseries form contains a single period subform which looks and behaves exactly like period subforms in season forms. Look at the series form article to learn more about period subforms.

## Additional Form Fields

The miniseries form contains the following additional fields below the period subform:

* IMDb link
* Rotten Tomatoes link
* Poster URL
* Tags

It may be a little confusing to see that the RT link field for the miniseries is lower than the RT link field for its single season (RT has a separate page for miniseries' seasons). This is because the season RT link is contained in the period subform and it comes before the RT link of the miniseries. The RT link for the miniseries is located directly below the poster, and the RT link for the season is contained at the top of the period subform. Maybe I'll change it in a future version, but for now I will leave it as-is.

The rules for tags are the same as in the full series form.

## Other Actions

The miniseries form has several other action buttons:

* Delete the miniseries
* Convert to full series
* Create a franchise
* Other franchise actions which are discussed in the article on franchises

You can convert a miniseries back to full series any time you like. The resulting form will contain a separate form for the series' sole season.

You can execute these actions only when the form doesn't contain changes.


# The Franchise Form

Lots of movies and series have multiple parts, so it's logical to have these movies/series be grouped together in the list. This is just what franchises are for: grouping related movies, series or even other franchises.

Franchises can be created and edited via the franchise forms, but those can't be created directly. Rather, you first create a movie or a series, and after saving it, you can create a franchise where this movie/series is the first part, using the *Create franchise* button at the bottom of the form. Here's how a franchise form looks:

![](https://1911888384-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ7hAx4IWBVNicwUwE4%2F-MQ7hu69wtPNn_DdXqXt%2Fv0.2-screen-franchise-form.png?alt=media\&token=77dc113f-f018-4291-ac6b-0903e166a5e6)

The franchise form is a little different from other forms in that it's focus is on actions rather than fields and data. It consists of the following parts:

* Header which contains the first title, the *close* button, and a few other buttons if the franchise is a part of another franchise
* Poster (or logo), if present
* Form fields
* The franchise entry list
* Buttons for various actions

## Form Fields

The franchise form contains the following main fields:

* Check-box which indicates whether the franchise has its own titles
* Check-box which indicates whether the franchise should be shown as an item in the list
* Check-box which indicates whether the franchise entries are loosely connected
* Check-box which indicates whether the display numbers should be merged with those of the previous franchise
* Titles (if the franchise has titles)
* Original titles (if the franchise has titles)
* Poster URL

The franchise form is the only form where titles are not required. If the franchise doesn't have its own titles, then the titles of its first entry are considered as the titles of the franchise. If the franchise has its own titles, you can specify whether to show it as an item in the list. This is not always necessary since the franchise can have a title which is very similar to the first entry's title.

The entries of the franchise can be loosely connected. This has purely demostrational value - the entry numbers will be shown in parentheses. For example, the Dollars Trilogy can be considered to be loosely connected, because its movies can be thought of as independent.

Franchises rarely have their own posters, but may have separate logos, and so the franchise form includes the poster URL as well.

## Franchise Entries

When you create a new franchise through a movie of series, it already contains one entry. You can add other entries using one of the three *add* buttons - *Add movie*, *Add series* or *Add franchise*.

When you add a new entry, its respective form is opened. There's nothing different about creating a new franchise entry from creating a standalone item. When you save it, it is added to the franchise entry list. If you cancel, you are taken back to the franchise form.

If you right-click on a franchise entry, a context menu will apper which has the following actions:

* Move up (if the entry is not the first one)
* Move down (if the entry is not the last one)
* Hide/show display number
* Detach

You can move the entries around, and they don't have to be in chronological order (although it's usually logical that they be in chronological order).

You can hide the display numbers of individual entries if they are considered 'unofficial'. For example, the 1969 Casino Royale movie is an unofficial James Bond movie, but you can add it to the James Bond franchise and hide its display number so it doesn't offset the display numbers of the following movies.

You can also detach franchise entries so that they become standalone items.

In addition, you can add an existing item using the drop-down at the bottom of the form. Select an item and it will be added as the last entry of the franchise. You can only add standalone items. If you want to add an item which belongs to a different franchise, you have to detach it first.

## Franchise Hierarchies

In addition to movies and series, a franchise can also contain other franchises. This is never necessary though. You can always group movies and series properly with only one level of franchises. But if you want to represent the data in your list in a more structured manner, you can introduce multiple levels of franchises. For example, both Harry Potter and Fantastic Beasts belong to a franchise called Wizarding World.

If you have multiple levels of franchises, you can choose to merge their entries' display numbers. This functionality is limited to two levels only though.

Merging display numbers can be better explained with an example. Suppose you created a franchise called Star Wars which contains three other franchises: The Original Trilogy, The Prequel Trilogy and The Sequel Trilogy, each of which contains three movies, for a total of nine movies (anthology films and series notwithstanding). If you open any of the child franchises, you'll see that every movie is numbered 1, 2, and 3. This may not be desirable, because all of these movies are part of one big Star Wars franchise, and so it would be better to say that e.g. Revenge of the Sith is the sixth movie overall, and not just the third movie of the Prequel Trilogy. You can do that by merging the display numbers. If you check the *merge display numbers* check-box in the child franchises (the trilogies), then the Prequel Trilogy will continue numbering its movies after the Original Trilogy (so, 4, 5, and 6) and the Sequel Trilogy will continue numbering its movies after the Prequel Trilogy (so, 7, 8, and 9).

## Franchise Navigation Actions

If a movie, series, or a franchise are parts of a franchise, their forms will contain additional actions, most of which are located in the form header.

Firstly, you can go to the franchise, using the *up arrow* button in the form's header, or using the *Go to franchise* button at the bottom of the form which substitues the *Create franchise button* since the latter is not needed anymore.

Secondly, you can move to the next or previous franchise entry using the arrow buttons in the form's header, just like you can move between the series componentes if you open one of those forms.

These actions are available only when the form doesn't contain changes.

## Other Actions

The franchise form has a couple other action buttons:

* Delete the franchise
* Create a franchise

You can delete the franchise only when the form doesn't contain changes. When you delete the franchise, none of its entries are deleted. Instead, they are all detached. You have to delete all entries manually.

Mind that the *Add franchise* and *Create franchise* buttons have similar names, but very different functionality. *Add franchise* adds a new entry to the current franchise. *Create franchise* is the same as in other forms - it creates a new franchise which has the current franchise as its first entry.


# Searching, Filtering, Sorting

## Searching

You can search for certain items in the list. To do that, specify the filters, and press *Find next* or *Find previous*. The found items are colored light purple, and the currently selected found item is colored a slightly darker shade of purple. Here's how it looks:

![](https://1911888384-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ7hAx4IWBVNicwUwE4%2F-MQ7hu6HadZXua192rqE%2Fv0.2-screen-search.png?alt=media\&token=2158a75f-4c96-466e-8e78-6ae2b87f72a6)

When the search is activated, the list of all found items will appear in the search panel, and you can click on them to jump to those items. To stop searching, click on the *Stop searching* button. Afterwards, if you click on the *Find next* or *Find previous* button again, the search will start from the top or bottom respectively. If you want to stop searching and clear the filters, then click on the *Clear search* button.

You can't search franchises - only movies or series.

Here's the list of all possible search filters:

* *Title* - searches by title (if an item has multiple titles, they are all considered):
  * *Title is* - searches for items whose title contains the specified input
  * *Title starts with* - searches for items whose title starts with the specified input
  * *Title ends with* - searches for items whose title ends with the specified input
* *Year* - searches by year:
  * *Year is* - searches for items of the specified year
  * *Year less than* - searches for items before the specified year
  * *Year greater than* - searches for items after the specified year
  * *Year between* - searches for items between the specified years (inclusive)
* *Kind is* - searches for items of the specified kind
* *Tags* - searches by tags:
  * *Tags include* - searches for items which have all of the specified tags
  * *Tags exclude* - searches for items which have none of the specified tags
  * *Tags have category* - searches for items which have any tags of the specified category
* *Standalone* - searches for items which don't belong to a franchise
* *Movies only* - searches only for movies
* *Watched (movies only)* - searches for movies which are watched
* *Released (movies only)* - searches for movies which are released
* *Series only* - searches only for series
* *Watch status is (series only)* - searches for series which have the specified watch status
* *Release status is (series only)* - searches for series which have the specified release status
* *Channel (series only)* - searches for series which have the specified channel:
  * *Channel is* - searches for series whose channel name equals the specified input
  * *Channel starts with* - searches for series whose channel name starts with the specified input
  * *Channel ends with* - searches for series whose channel name ends with the specified input
* *Number of seasons (series only)* - searches for series by the number of seasons:
  * *Number of seasons is* - searches for series which have the specified number of seasons
  * *Number of seasons less than* - searches for series which have less seasons than the specified number
  * *Number of seasons greater than* - searches for series which have more seasons than the specified number
  * *Number of seasons between* - searches for series whose number of seasons is between the specified numbers (inclusive)
* *Number of episodes (series only)* - searches for series by the number of episodes:
  * *Number of episodes is* - searches for series which have the specified number of episodes
  * *Number of episodes less than* - searches for series which have less episodes than the specified number
  * *Number of episodes greater than* - searches for series which have more episodes than the specified number
  * *Number of episodes between* - searches for series whose number of episodes is between the specified numbers (inclusive)
* *Miniseries (series only)* - searches for miniseries

You can negate the filters by checking the *negate* check-box. Remember that it can mean a different thing than what you think. For example, if you negate the *Watched (movies only)* filter, it will search for series as well, because it will search for all items which don't satisfy the *Watched (movies only)* filter, and that includes series. When a filter is negated, a red strip is added on the left side.

The search filters can be composed in several ways. If you click on the right-side three-dot menu, the following options will appear:

* Make composite (and)
* Make composite (or)
* Remove filter

If you make the filter composite, then three buttons will appear:

* Add filter (the *plus* button)
* Change the filter composition (the *cog* button)
* Simplify (the *arrows* button)

If a composite filter contains only one filter, you can make it a simple filter again by pressing the *simplify* button. You can add filters to the composite filter by pressing the *add filter* button.

The nature of the composite filter depends on the composition type of which there are two: *and* and *or*. If the composition is *and* then all filters must be positive for the composite filter to be positive. If the composition is *or* then at least one filter must be positive for the composite filter to be positive. The *and* composition is shown with a green strip on the left side, and the *or* composition is shown with a blue strip on the left side. You can change the filter's composition by clicking the *change composition* button.

Here's an example: in order to search for non-watched movies, you should compose two filters: the negated *Watched (movies only)* and *Movies only*, and set the composition to *and* because both filters must be positive.

If you want to remove a filter, then you can click on the *remove filter* in the three-dot menu.

You can create complex hierarchies of filters with multiple layers and different composition types.

## Filtering

Filtering is very similar to searching. As you saw previously, when searching for items you already use various kinds of filters. Filtering the list uses the same principles, but has one big difference - it doesn't highlight the found items. Instead, it shows only the found items. All other items are removed from the list completely. Here's how it looks:

![](https://1911888384-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ7hAx4IWBVNicwUwE4%2F-MQ7hu5j1EXimQRkJJg6%2Fv0.2-screen-filter.png?alt=media\&token=5fc5f07e-6320-4164-a8ed-8dbb5f8b82bc)

You can't filter franchises - only movies or series. A franchise appears in the filtered list only if one or more of its entries appear in the filtered list.

When you have specified the filters, you can click on the *Apply filter* button to apply them. Afterwards, you can click on the *Clear filter* button to return back to the full list.

You can combine searching and filtering, for example by filtering by some general conditions, and then searching with more specific conditions in the filtered list.

## Sorting

You can specify how the list is sorted. There are a couple options, but they are limited. Here's how the sorting panel looks:

![](https://1911888384-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ7hAx4IWBVNicwUwE4%2F-MQ7hu6NGRVV16bABgqC%2Fv0.2-screen-sort.png?alt=media\&token=6d497cdc-e8fe-4782-bdd9-9be5fb21f2a0)

Here are the possible sorting orders:

* By title
* By original title
* By title (simple)
* By original title (simple)
* By year

Sorting by title takes franchises into account, while simple sorting by title doesn't. You can specify the sorting direction as well - ascending or descending.

There are two levels of sorting. The second level is used when the first level is the same (like having the same title). You can't add more levels since two levels is enough.

By default the first level of sorting is by title, and the second level is by year. The defaults can be changed in the file's settings, and the default settings for new files can be changed in the preferences.

Sorting by title is available only as the first level, because it's complex and it doesn't make sense to make it second-level. Thus only the three last options are available for the second-level sorting.


# Preferences

The final feature covered in these docs is the app-wide preferences. You can open them through the *Edit > Preferences* menu item, or by pressing `Ctrl+Shift+P`, and close them by clicking the *close* button in the tab header, through the *File > Close* menu item, or by pressing `Ctrl+W`. Here's how preferences look:

![](https://1911888384-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ7hAx4IWBVNicwUwE4%2F-MQ7hu6GXizCVJCPP2X7%2Fv0.2-screen-preferences.png?alt=media\&token=5d5f7fbf-2be3-48e5-be5b-7d4c3014f0a5)

Preferences consist of three sections:

* Default settings
* Other preferences
* Advanced preferences

Preferences are stored in your user's app data folder, under the *MovieList* directory. If you decide to uninstall the app, you can delete this directory as well, if you don't wish to keep these preferences.

## Default Settings

Default settings are the settings that new files will get when they are created. They are almost identical to the settings you can find if you open a file's settings. The only difference is that you can't set a default list name.

## Other Preferences

Currently the only setting in this section is a check-box which indicates whether to show recent files in the home page, or not. If you uncheck it, the app will clear the recent files list, and won't track which files were opened.

## Advanced Preferences

You probably shouldn't touch these. Currently they only control the app's logging level and log location. You can read more in the article on technical stuff if you so wish. Unlike other preferences, if you change these settings, they will take effect after restarting the app.


# Version History

This article provides info on what's new in every version of the Movie List app.

## Version 0.2

This version adds searching, filtering, and sorting capabilities to the app. Also, tags can now be added to movies and series to make searching/filtering easier. This release is still very incomplete and far from being stable.

![](https://1911888384-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ7hAx4IWBVNicwUwE4%2F-MQ7hu6DfGufV2MzQR-4%2Fv0.2-screen-movie.png?alt=media\&token=21dd55bb-f8f0-4160-97f8-0bd8b1fcf1d6)

The following breaking changes were added to the list files:

* The `Tags`, `MovieTags`, and `SeriesTags` tables were added.
* The `IsAnthology` column was removed from series - if you want this info, implement it yourself through tags.
* The following keys were added to the `Settings` table: `list.sort.order.1`, `list.sort.order.2`, `list.sort.direction.1`, and `list.sort.direction.2`.
* The following keys were changed in the `Settings` table: `season.title.default` -> `list.season.title.default`, `season.title.default-original` -> `list.season.title.default-original`.

## Version 0.1

This is the first usable version of the app, albeit very incomplete. It provides the most basic functionality:

* Creating/opening list files
* Adding/editing/removing movies, series, and franchises
* Editing file settings, including kinds
* Editing app preferences

![](https://1911888384-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ7hAx4IWBVNicwUwE4%2F-MQ7hPMUHQp9poSotA9X%2Fv0.1-screen-movie.png?alt=media\&token=729cd312-9bbc-49c9-b998-6c1032d73035)

## Ancient History

In the beginning, the app looked and felt very differently. There could be only a sinlge list file, and the path to it was specified in the preferences. There were no tabs. And the UI was in Ukrainian, instead of English.

Afterwards the app was completely rewritten, but this version can be found under the `old` tag on GitHub.

![](https://1911888384-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ7wUcGzjiV3YONunzK%2F-MQ7zfxSAcV--qDJ5kQJ%2Fold-screen-1.png?alt=media\&token=b15efd0f-2fdd-48b3-8813-cdd945adb178)

![](https://1911888384-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ7wUcGzjiV3YONunzK%2F-MQ7zfxL0tRnpNXExowv%2Fold-screen-2.png?alt=media\&token=5a7f3cc3-939e-4227-8be7-3b4cfe3a5497)


# Technical Stuff

The Movie List app is written with [C#](https://github.com/dotnet/csharplang) and [.NET 5](https://github.com/dotnet/runtime). Following is the list of technologies used in this app and some other technical aspects.

## UI

This app is a desktop app. I've contemplated writing a web app, but decided against it, partly because it's easier, and because it makes more sense to store lists in files on users' machines instead of some sort of centralized database.

The UI is written using [WPF](https://github.com/dotnet/wpf), and styled with [Material Design](https://material.io/design) using [Material Design in XAML](http://materialdesigninxaml.net/) and [Material Design Extensions](https://spiegelp.github.io/MaterialDesignExtensions).

I will switch to [Avalonia](https://avaloniaui.net) in the future, because while WPF is powerful, Avalonia is the hot stuff, is more active, and cross-platform. Also, it will support Fluent Design, which I think is more natural for Windows compared to Material Design. I will probably make the app run on Linux as well, but making it run on macOS is highly unlikely, unless someone would like to help me.

At the beginning of the app's developement, I didn't use any libraries for styling at all, thinking I will write styles myself. That proved to be a horrible idea, and I started using [HandyControl](https://github.com/HandyOrg/HandyControl) and then switched to my own fork of the library (which I've since deleted completely, so some very old commits cannot even be built anymore). I have since decided to completely rewrite the app, and to use Material Design for UI. You can find this old version under the [old git tag](https://github.com/TolikPylypchuk/MovieList/releases/tag/old).

## Core Logic

I'm using [ReactiveUI](https://www.reactiveui.net) as the MVVM framework for the core logic, and I must say that it's a real pleasure to use this framework. Also, [Splat](https://github.com/reactiveui/splat) is used for service location.

In the beginning I rolled my own MVVM stuff, but it quickly became bloated and extremely unwieldy in code, and the performance became horrible. So I've scrapped everyhing, and started from scratch using ReactiveUI (and changed the UI library along the way).

## Data Access

This app uses [SQLite](https://www.sqlite.org/index.html) for data access. The .mlist files are [actually SQLite databases](https://www.sqlite.org/appfileformat.html) which you can open in e.g. [DB Browser for SQLite](https://sqlitebrowser.org) and browse like any other relational database, although looking through data is quite inconvenient there.

The file make-up is quite straightforward. Just look at table definitions in DB Browser for SQLite or another app to see their structure and relations.

The only table which should be elaborated on is the `Settings` table. It contains key-value pairs for some general file settings which don't fit into other places. Currently each file contains nine such key-value pairs:

* List name (`list.name`)
* List version (`list.version`)
* The default season title (`list.season.title.default`)
* The default season original title (`list.season.title.default-original`)
* The language used for sorting titles (`list.culture`)
* The default first sorting order (`list.sort.order.1`)
* The default second sorting order (`list.sort.order.2`)
* The default first sorting direction (`list.sort.direction.1`)
* The default second sorting direction (`list.sort.direction.2`)

The app ignores any other rows in this table and will not be able to read the file if any one of the aforementioned rows are missing.

The list version is currently always set to 1 and will be incremented every time a new version of the app introduces breaking changes to the file format. Note that the 0.x versions are pre-release versions and they will definitely introduce breaking changes to files, but won't increment its version. The file version will be incremented after the app reaches version 1.0. I haven't yet figured out what the strategy for dealing with multiple file versions will be. All breaking changes will be documented, but if you're using this app before version 1.0, you have to figure out how to migrate files on your own.

## Preferences

Preferences are stored in the user's app data folder, under the *MovieList* directory. Also, the cache of downloaded posters is stored in the user's local app data folder (also under the *MovieList* directory). If you want to uninstall this app completely, you should delete these folders manually.

This app uses [Akavache](https://github.com/reactiveui/Akavache) as the engine for storing settings and cache.

## Logging

This app uses a plain-text log file to log the stuff it's doing and errors it encounters along the way. [Serilog](https://serilog.net) is used as the logging library. The location of the log file, as well as the minimum log level can be set in preferences, in the advanced section. The default location of the log file is in the user's app data folder. Here's the list of supported log levels (from lowest to highest):

* *Verbose*: log everything (this level is not used directly and setting it is the same as setting *Debug* as the minimum level)
* *Debug*: log the details of the app's internal workflow
* *Info*: log general information
* *Warning*: log warnings about unwanted but manageable events
* *Error*: log errors that the app cannot fix itself
* *Fatal*: log unforeseen and unknown errors which make the app crash

The default log level is *Warning* and you should rarely set it to a lower setting.

Currently, the file is never trimmed or rolled over, so if you choose a low log level, and use this app a lot, the size of the log file may become quite big. If it does, don't hesitate to delete it - the app certainly won't miss it - it won't even notice that the file is gone. A future version will set a max size of the log file so that this doesn't happen.

## Docs

[GitBook](https://www.gitbook.com) is used for docs since it's quite versatile and can host docs for multiple app versions.

Previously these articles were built using [Jekyll](https://jekyllrb.com) and [GitHub Pages](https://pages.github.com), and used the [Minimal Mistakes theme](https://mmistakes.github.io/minimal-mistakes). The first version of the docs used the [Just the Docs theme](https://pmarsceill.github.io/just-the-docs) but it doesn't support multiple versions of the docs.

## Building from Source

If you want to build your own version of this app, you simply need .NET 5. That's it, there are no special prerequisites.

Run the `Publish-App` script to create a zipped app which you can then extract to anywhere.


# About Movie List

A long time ago I started keeping a list of movies and TV series I've watched and would like to watch. Keeping track of all these movies and series in a Word document because cumbersome since now there are more than a thousand items (I watch a lot of movies). Thus I've decided to create an app so that the list can be more structured and so that I can analyze the data somehow. Also, this is a fun side project.

## Project Status

I've been working on this app since February 2019 and it's not nearly done. I've released versions 0.1 and 0.2, because now the app is at least usable, although it still lacks lots of features. Versions 0.x should be considered pre-release and as such probably shouldn't be used in general since there will be breaking changes.

I'm actively working on the app, although sometimes I take breaks to work on other projects, so expect more versions soon.


# Movie List

An app which keeps track of the movies and TV series you have watched or would like to watch.

If you want to use this app to track movies and series, you can certainly do so, but bear in mind that this is a personal project - I'm writing this app for myself, at my own pace, and according to my own needs.

![](https://516957188-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ7hAx4IWBVNicwUwE4%2F-MQ7hPMUHQp9poSotA9X%2Fv0.1-screen-movie.png?alt=media\&token=729cd312-9bbc-49c9-b998-6c1032d73035)


# Getting Started

## How to Get the App

The Movie List app works only on Windows (and only tested on Windows 10). Currently the only way to get this app is to download it from the 'releases' section on GitHub and extract it manually. The latest version is 0.2.

## Files and Tabs

The app works with files of the *.mlist* extension. An *.mlist* file represents a list of movies, series, and franchises, and some auxiliary settings. If you want Windows to bind the file extension to this app, you'll have to do it manually for now. All files are opened in separate tabs.

This is a single-instance app. You can't open multiple windows in this app. If you open it when it's already opened, it will simply show you the existing window. If you open a file when the app is already running, it will open the file in a new tab.

## The Home Page

![](https://516957188-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ6uhUEUT6b-eNkcK6m%2F-MQ6wtx3zKz7LyvlO_Ct%2Fv0.1-screen-home-page.png?alt=media\&token=90eb2860-bc9e-42c4-ad36-c912b34b0d71)

The app's home page contains several features for working with files.

Firstly, you can create a list file. When you click on the *Create a list* button, a *Save file* dialog is opened. Enter the file name and select the location, click save, and an empty list file will be created and opened in a new tab. This is also available through the *File > New* menu item, or by pressing `Ctrl+N`.

Secondly, you can open an existing list file. There are several ways to do that. You can click the *Open a list* button and select the file in the *Open file* dialog. Or you can use the *File > Open* menu item, or press `Ctrl+O`. Also, you can drop a file into any area inside the app window to open a new file. Lastly, you can open the file through the File Explorer if you had Windows bind the file extension to this app.

Thirdly, you can view and open any files that you've recently opened. Simply double-click on any *Recently opened files* entry to open it. You can also go to the *File > Open Recent... > {file name}* menu item to open a recent file. To remove a file from the recently opened files list, click on the check-box on the left side of the entry, and click the *Remove from list* button.

## Other Menu Items

You can learn about feature-specific menu items in the following articles.

The following menu items don't belong to specific features:

* *File > Exit* (or press `Alt+F4`) to exit the app (obviously)
* *Help > About* (or press `F1`) to view some basic info about the app


# List Files

Here's what the app looks like when you create a new file:

![](https://516957188-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ6uhUEUT6b-eNkcK6m%2F-MQ6wtwunoofpNVnm2rl%2Fv0.1-screen-new-file.png?alt=media\&token=e9f493d8-c337-4670-ab8a-70e3fc1c9ed5)

The file tabs are composed of three main sections: the list itself, stats, and settings. You can switch between them using the left-side bar.

When you open a file, you can close it via the *close* button in the tab's header, through the *File > Close* menu item, or by pressing `Ctrl+W`.

## The List Section

Here's what the list section looks like when it contains entries:

![](https://516957188-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ6uhUEUT6b-eNkcK6m%2F-MQ6wtx4HC8fVX8YFptl%2Fv0.1-screen-list.png?alt=media\&token=0232e4d8-012d-4c7b-90fc-cc95c5a87c33)

### List Structure

The list items can be of three types:

* Movies
* Series
* Franchises

The items are sorted alphabetically by title and then by year if their title is the same. Future versions will include alternative sorting options.

Franchises are used to group related items together and without them some items would be scattered across the list when it would make more sense to have them appear together.

The list has four columns:

* Sequence number to show the item's number in a franchise
* The title (in your native language)
* The original title
* Year or years

The majority of popular contemporary movies are in English, so if your native language is English, then the title will often be the same as the original title.

All item types can have multiple titles and original titles since different translations exist or the item is marketed differently in different markets. Only the first title and original title is shown in the list. Every item can have up to 10 titles and up to 10 original titles, although even that is too much in my opinion.

### Kinds

Every item can be of a certain kind. Kinds are used to color-code items in the list. Every kind has six colors for various item types and states:

* Movie which has already been watched
* Movie which hasn't been watched yet
* Movie which hasn't been released yet
* Series which has already been watched or is being watched
* Series which hasn't been watched yet
* Series which hasn't been released yet

There are no separate colors for franchises - they get the color of their first entry.

By default, every file contains three kinds (although it can be configured):

* Live-action: movies are black, series are blue
* Animation: movies are green, series are light-blue
* Documentary: both movies and series are purple

The default kinds have all non-watched items as red and all non-released items as dark red.

### Adding Items to the List

You can add new items to the list by clicking the buttons in the right-side panel, which will open a form for editing the item. If you want to edit an existing item, click on it, and the form for this item will be opened. You can't create franchises directly because they are not supposed to be separate list items. Rather, you create them through previously created items.

You can learn more about editing list items in the next article.

## The Stats Section

Statistics are not implemented yet, so the respective left-side bar item is disabled.

## The Settings Section

Here's what the settings for a file look like:

![](https://516957188-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ6uhUEUT6b-eNkcK6m%2F-MQ6wtx-o3lxKsJCz4kN%2Fv0.1-screen-settings.png?alt=media\&token=3b0bda5f-b3bd-4ba9-a0b1-a6335b84ead5)

You can open the file settings by clicking the left-side bar item, through the *File > Settings* menu item, or by pressing `Ctrl+P`.

The settings consist of the two main sections: main settings and kind settings.

### Main File Settings

You can edit the following file attributes in the settings:

* List name
* Title language
* Default season title
* Default season original title

You can name your list however you like and it doesn't have to be the same as the name of the file. The list name appears in the tab header and in the recent files list on the home page.

Title language is used to correctly sort titles. While original titles can be in any language, titles will usually be in your native language, and sorting rules may be different for different languages.

Default season title and original title are used to generate titles for newly created seasons for series. The `#` symbol will be replaced with the actual season number. For example, if the default season title is *Season #* and you create two seasons, their default names will be *Season 1* and *Season 2* respectively. Same for season original titles. You can learn more about the season form in the article on series.

### Kind Settings

Here you can edit existing kinds, delete them, or add new ones.

A single kind setting consists of a name and six colors for the aforementioned item types. You can edit colors by clicking on them and by editing the color in the modal window.

![](https://516957188-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ6uhUEUT6b-eNkcK6m%2F-MQ6wtx0-UFIFcXiFRwc%2Fv0.1-screen-settings-color.png?alt=media\&token=e4000a53-c00c-4533-b66a-fccd4cd7b8bf)

You can select a color in the color picker or enter its HEX color value. Mind that the HEX value field uses ARGB instead of RGB. You can add `FF` in the beginning to convert an RGB value into an ARGB value.

You can have as many kinds as you like (but more than zero). You can't delete kinds that have items of that kind in the list. If you want to delete a kind, you should manually edit its every item to have a different kind.


# Forms

You can add, edit, and delete list items through forms which appear on the right side of the main section. There are six types of forms:

* Movie
* Series
* Season (part of the series form)
* Special episode (part of the series form)
* Miniseries
* Franchise

All list items can contain posters. None of them are stored in the list file however. Only their URLs are stored - the posters themselves are fetched from the internet when the form is opened and cached locally for 5 minutes.

## Saving the Forms

Forms can be in two basic states: changed and unchaged. If the form is changed, you can cancel all changes and return the form to how it was when you opened it. If the form is changed and valid, you can save it to write the changes to the file. If you close an unsaved form, all changes are discarded. You can't perform certain actions when the form contains changes, e.g. you can't delete it, or create a franchise.

You can also save a file through the *File > Save* menu item, or by pressing `Ctrl+S`.

If you look at the big picture, you'll see that this app lets you write only tiny changes to the file at a time, unlike many other file-based apps. For example, you can't spend half an hour inputting data into the app and save all those changes at once (and you really shouldn't do that in other apps as well), because you can save only one form at a time.

The *Save As* functionality works differently than in other apps. Normally you can make some changes to a file, save it as another file (and maybe another file type) and the original will be unchagned - you can even revert all changes so that the original file remains the same. In this app, however, *Save As* works only when all changes are already saved in the original file. This is because the app doesn't let you change a lot without saving, so there is no reason to use *Save As* to save a copy of the file and have the original unchanged. You shouldn't change the file extension when saving as either. This app works only with the *.mlist* file extension.

You can also save a file as another file through the *File > Save As...* menu item, or by pressing `Ctrl+Shift+S`.

## Integration with IMDb and Rotten Tomatoes

This version of the app has minimal integration with IMDb and RT. You can enter links to the item on those sites and that's it for now. A future version will show the IMDb score and RT scores inline so you don't have to open the sites to view them.


# The Movie Form

The movie form is the simplest and most straightforward of the forms. Here's how it looks:

![](https://516957188-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ6uhUEUT6b-eNkcK6m%2F-MQ6wtwtiuzaAG9_z1kN%2Fv0.1-screen-movie-form.png?alt=media\&token=12176522-4570-450e-b142-1b08a3a4baaa)

The form consists of the following sections:

* Header which contains the first title, the *close* button, and a few other buttons if the movie is a part of a franchise (which are discussed in the article on franchises)
* Poster and links, if present
* The form fields
* Buttons for various actions

## Form Fields

The movie form contains the following fields:

* Check-box which indicates whether you watched the movie
* Check-box which indicates whether the movie is released
* Titles (at least one required)
* Original titles (at least one required)
* Year (required)
* Kind (required)
* IMDb link
* Rotten Tomatoes link
* Poster URL

The *released* check-box is enabled only if the movie's year is the same as the current year. If the movie's year is before the current year, it's obvious that the movie is already released. Conversely, if the movie's year is after the current year, it's obvious that the movie was not released yet.

If you check the *watched* check-box, and the *released* check-box is unchecked, it becomes checked as well. It doesn't make sense that you can watch an unreleased movie (yes, there are exceptions, but those are rare). If you uncheck the *released* check-box, the *watched* check-box becomes unchecked as well.

You can add titles with the *Add title* and *Add original title* buttons. If there are multiple titles, you can delete them by pressing the *delete* button on the right side of the title field. You can't change the order of the titles. If you decide that the second title should become the first and the first - second, you should change them manually.

The minimum value for the year is 1850 and maximum value is 2100. The reason that the movie form includes only a year, and not a full release date is because the movie can have multiple release dates: premieres can be on different dates in different markets, and movies can be shown at festivals ahead of their release.

You can select any kind from the list of kinds which you specify in the file's settings.

Links and the poster URL are not required, and indeed not every movie is guaranteed to have an entry in IMDb or RT (although I have yet to find a movie which doesn't have an entry in IMDb).

## Actions

The movie form has several action buttons:

* Delete the movie
* Create a franchise
* Other franchise actions which are discussed in the article on franchises

You can execute these actions only when the form doesn't contain changes.


# The Series Form

This is a big one. It takes much more effort to add a series than it is to add a movie. Here's how a series form looks:

![](https://516957188-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ6uhUEUT6b-eNkcK6m%2F-MQ6wtwz9N7Jv5qx6hlz%2Fv0.1-screen-series-form.png?alt=media\&token=75996944-5679-4a07-a79f-d9f19f8bc8b6)

The series form consists of the following parts:

* Header which contains the first title, the *close* button, and a few other buttons if the series is a part of a franchise (which are discussed in the article on franchises)
* Poster (or logo) and links, if present
* Main form fields
* The list of components: seasons and special episodes
* Additional fields
* Buttons for various actions

## Form Fields

The series form contains the following fields:

* Titles (at least one required)
* Original titles (at least one required)
* Watch status (required)
* Release status (required)
* Check-box which indicates whether the series is an anthology
* Kind (required)
* IMDb link
* Rotten Tomatoes link
* Poster URL

All the same rules apply to titles as with the movie form.

Since watching the series is more of a continuous process (unless you binge it), its watch status is more than just *watched* or *not watched*. Here are the possible watch statuses:

* Not watched, if you haven't started watching the series yet
* Watching, if you are currenly watching the series or waiting for new episodes
* Watched, if you have watched the series in its entirety
* Stopped watching, if you decided that the series is not worth your time anymore

Like watch status, there's more to the release status than simply *released* or *not released*. Here are the possible release statuses:

* Not started
* Running
* Finished, if the series finished naturally
* Cancelled, if the series was axed by the studio
* Don't know/don't care, if you stopped watching the series and you don't want to track it in the app anymore

You can specify that a series is an anthology series if its seasons or even individual episodes have separate storylines (e.g. Fargo or Black Mirror).

You can select any kind from the list of kinds which you specify in the file's settings.

Links and the poster URL are not required, and indeed not every series is guaranteed to have an entry in IMDb or RT (although, like with movies, I have yet to find a series which doesn't have an entry in IMDb). Instead of a poster, you can put a URL of a series' logo, which I do for most series.

## Series Components

Series can (and should) contain one or more components. A series component is either a season or a special episode which in the context of this app means an episode which was aired or released separately from others, even if the studio doesn't designate it as 'special' (e.g. White Christmas is a standalone episode of Black Mirror). You can add componentes through the *'Add season* or *Add special episode* buttons. When you press one of them, a respective form is opened. You can't save a series unless it contains at least one component.

You can move series components up and down by right-clicking on a component and selecting the *Move up* or *Move down* context actions.

## Other Actions

The series form has several other action buttons:

* Delete the series
* Convert to miniseries
* Create a franchise
* Other franchise actions which are discussed in the article on franchises

You can convert a series to a miniseries. A miniseries is a one-season series without special episodes which is designed to be limited in nature. Miniseries have separate, simplified forms. You can convert a series to a miniseries only if it contains one season or none at all, and no special episodes.

You can execute these actions only when the form doesn't contain changes.

## The Season Form

When you add a new season or click on an existing one in the series form, a season form is opened. Here's how it looks:

![](https://516957188-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ6uhUEUT6b-eNkcK6m%2F-MQ6wtwwvUD-FN4KL5hd%2Fv0.1-screen-season-form.png?alt=media\&token=5111f167-4214-48eb-a69b-04fd4e033e05)

Unlike the movie and series forms, the season form is not independent - it's considered to be part of the series form. You can't save a season directly; to save a season, go back to the series form and save the whole series. You can cancel any changes in the season form directly. If you cancel changes in the series form, all changes in all seasons will be cancelled as well (and new seasons will be deleted).

The season form consists of the following parts:

* Header which contains the first title, the *close* button, and navigation buttons
* Poster, if present
* Main form fields
* The list of release periods
* Buttons for various actions

### Season Form Fields

The season form contains the following fields (all fields are required):

* Titles
* Original titles
* Watch status
* Release status
* Original channel

When you create a new season, its titles are generated using the default season titles from the file's settings.

As with series, there are several watch statuses:

* Not watched, if you haven't started watching the season
* Watching, if you are currently watching it, or waiting for new episodes
* Watched, if you have finished watching the full season
* Hiatus, if the season is on a hiatus, or you decided to take a break from watching it
* Stopped watching, if you lost interest in the series, haven't finished the season, and don't plan to finish it

Likewise, there are several release statuses:

* Not started, if the season hasn't started airing or hasn't been released yet
* Running, if new episodes are currently airing or are being released
* Finished, if all episodes of the season have been released
* Hiatus, if the season is on a hiatus and new episodes won't come for some time
* Don't know/don't care, if you stopped watching the series and you don't want to track it in the app anymore

The original channel is just for descriptive purposes. When you create a new season, by default it has the same channel as the previous series component. There may be situations when a series has multiple original channels (e.g. Killing Eve is a co-production between BBC America and AMC). If that's the case, choose one of those. The form is complicated as-is, and adding the possibility of multiple channels will only make it more complicated.

Seasons don't have separate IMDb pages.

### Season Release Periods

Unlike movies, where releases are tracked up to a year, series components are tracked up to a month. Seasons could have a start and end date directly, but it's not that simple. A single season may be released in parts during different periods (like the last season of Breaking Bad or the last season of The Sopranos). It wouldn't really represent the truth if you said that those seasons lasted for a year - they didn't. They lasted for a few weeks, had a hiatus and then for a few weeks next year. That's why seasons may contain multiple release periods. Every period has its own set of fields inside the season form. Obviously, every season requires at least one period, and there is no upper bound for the number of periods.

The period subform consists of the following fields (all fields except links are required):

* Start month
* Start year
* End month
* End year
* Number of episodes
* Check-box which indicates whether it was a single-day release (like for Netflix series)
* Rotten Tomatoes link
* Poster URL

The year of the release can be between 1950 and 2100. The periods must be valid - the end date cannot be before the start date and the periods cannot be interleaved.

The number of episodes for a single period can be between 1 and 50.

If it's a single-day release, you don't select the end month/year, becuase they are obviously equal to the start month/year.

Rotten Tomatoes tracks scores for individual seasons, but it may have multiple pages per season (the only series I've seen have multiple pages per season is The Sopranos). Thus the main part of the season form doesn't contain the RT link. Instead, the period subform has it, and that's why the link to RT is at the top of the period subform, and not directly below the poster, like in other forms.

If a season is released over multiple periods, it may be marketed differently during those periods and hence have different posters for different parts. If the season has multiple posters, you can switch between them with the little arrow buttons below the poster.

You can add a period by clicking the *Add period* button at the bottom of the season form. If you want to remove a period, click the *delete* button in the lower right corner of the period subform. You can't delete a period if there's only one present.

### Other Season Actions

The season form has a couple other action buttons at the bottom of the form:

* Delete the season
* Go to series

It also has action buttons in the form header:

* Go to series
* Go to the next series component (if the season is not the last component)
* Go to the previous series component (if the season is not the first component)

You can delete the season only when the form doesn't contain changes.

## The Special Episode Form

When you add a new special episode or click on an existing one in the series form, a special episode form is opened. Here's how it looks:

![](https://516957188-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ6uhUEUT6b-eNkcK6m%2F-MQ6wtx1V3jmisa7Uctg%2Fv0.1-screen-episode-form.png?alt=media\&token=051ca8ec-8b96-4a43-8f61-68ddfce5b941)

This form is similar to the movie form and is much simpler than the season form. Like the season form, the special episode form is not independent - it's considered to be part fo the series form. You can't save an episode directly; to save an episode, go back to the series form and save the whole series. You can cancel any changes in the episode form directly. If you cancel changes in the series form, all changes in all episodes will be cancelled as well (and new episodes will be deleted).

The special episode form consists of the following parts:

* Header which contains the first title, the *close* button, and navigation buttons
* Poster and RT link, if present
* Form fields
* Buttons for various actions

### Special Episode Form Fields

The special episode form contains the following fields:

* Check-box which indicates whether you watched the episode
* Check-box which indicates whether the episode is released
* Titles (at least one required)
* Original titles (at least one required)
* Release month (required)
* Release year (required)
* Rotten Tomatoes link
* Poster URL

As with movies, watch and release statuses are simple check-boxes. The *released* check-box is enabled only if the release month/year is the same as the current month/year, because otherwise the release status is obvious. If you check the *watched* check-box, the *released* check-box becomes checked as well. If you uncheck the *released* check-box, the *watched* check-box becomes unchecked as well.

As with seasons, the year of the episode's release can be between 1950 and 2100.

### Special Episode Actions

The actions are the same as seasons' actions described in the 'Other Season Actions' section.


# The Miniseries Form

The miniseries form describes series which are limited in nature. In the context of this app, a miniseries has only one season, which in turn has only one release period, and no special episodes. Here's how a miniseries form looks:

![](https://516957188-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ6uhUEUT6b-eNkcK6m%2F-MQ6wtx5XSvOuxtAeC9q%2Fv0.1-screen-miniseries-form.png?alt=media\&token=f596c8fc-f60c-4f8e-ae89-2ce5ab979346)

As you can see, the miniseries forms are much simpler than the full series forms as they don't contain other separate forms. You can't create a miniseries form directly - you create it by creating a full series form and converting it to miniseries.

The miniseries form consists of the following parts:

* Header which contains the first title, the *close* button, and a few other buttons if the miniseries is a part of a franchise (which are discussed in the article on franchises)
* Poster and links, if present
* Main form fields
* The period subform
* Additional fields
* Buttons for various actions

## Main Form Fields

The miniseries form contains the following main fields:

* Titles (at least one required)
* Original titles (at least one required)
* Watch status (required)
* Release status (required)
* Check-box which indicates whether the miniseries is an anthology
* Kind (required)

These fields are basically the same as in the full series form.

## The Period Subform

The miniseries form contains a single period subform which looks and behaves exactly like period subforms in season forms. Look at the series form article to learn more about period subforms.

## Additional Form Fields

The miniseries form contains the following additional fields below the period subform:

* IMDb link
* Rotten Tomatoes link
* Poster URL

It may be a little confusing to see that the RT link field for the miniseries is lower than the RT link field for its single season (RT has a separate page for miniseries' seasons). This is because the season RT link is contained in the period subform and it comes before the RT link of the miniseries. The RT link for the miniseries is located directly below the poster, and the RT link for the season is contained at the top of the period subform. Maybe I'll change it in a future version, but for now I will leave it as-is.

## Other Actions

The miniseries form has several other action buttons:

* Delete the miniseries
* Convert to full series
* Create a franchise
* Other franchise actions which are discussed in the article on franchises

You can convert a miniseries back to full series any time you like. The resulting form will contain a separate form for the series' sole season.

You can execute these actions only when the form doesn't contain changes.


# The Franchise Form

Lots of movies and series have multiple parts, so it's logical to have these movies/series be grouped together in the list. This is just what franchises are for: grouping related movies, series or even other franchises.

Franchises can be created and edited via the franchise forms, but those can't be created directly. Rather, you first create a movie or a series, and after saving it, you can create a franchise where this movie/series is the first part, using the *Create franchise* button at the bottom of the form. Here's how a franchise form looks:

![](https://516957188-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ6uhUEUT6b-eNkcK6m%2F-MQ6wtx2JqRr_7C6epm1%2Fv0.1-screen-franchise-form.png?alt=media\&token=bcbadb06-4844-4173-9385-4c4c2bba5157)

The franchise form is a little different from other forms in that it's focus is on actions rather than fields and data. It consists of the following parts:

* Header which contains the first title, the *close* button, and a few other buttons if the franchise is a part of another franchise
* Poster (or logo), if present
* Form fields
* The franchise entry list
* Buttons for various actions

## Form Fields

The franchise form contains the following main fields:

* Check-box which indicates whether the franchise has its own titles
* Check-box which indicates whether the franchise should be shown as an item in the list
* Check-box which indicates whether the franchise entries are loosely connected
* Check-box which indicates whether the display numbers should be merged with those of the previous franchise
* Titles (if the franchise has titles)
* Original titles (if the franchise has titles)
* Poster URL

The franchise form is the only form where titles are not required. If the franchise doesn't have its own titles, then the titles of its first entry are considered as the titles of the franchise. If the franchise has its own titles, you can specify whether to show it as an item in the list. This is not always necessary since the franchise can have a title which is very similar to the first entry's title.

The entries of the franchise can be loosely connected. This has purely demostrational value - the entry numbers will be shown in parentheses. For example, the Dollars Trilogy can be considered to be loosely connected, because its movies can be thought of as independent.

Franchises rarely have their own posters, but may have separate logos, and so the franchise form includes the poster URL as well.

## Franchise Entries

When you create a new franchise through a movie of series, it already contains one entry. You can add other entries using one of the three *add* buttons - *Add movie*, *Add series* or *Add franchise*.

When you add a new entry, its respective form is opened. There's nothing different about creating a new franchise entry from creating a standalone item. When you save it, it is added to the franchise entry list. If you cancel, you are taken back to the franchise form.

If you right-click on a franchise entry, a context menu will apper which has the following actions:

* Move up (if the entry is not the first one)
* Move down (if the entry is not the last one)
* Hide/show display number
* Detach

You can move the entries around, and they don't have to be in chronological order (although it's usually logical that they be in chronological order).

You can hide the display numbers of individual entries if they are considered 'unofficial'. For example, the 1969 Casino Royale movie is an unofficial James Bond movie, but you can add it to the James Bond franchise and hide its display number so it doesn't offset the display numbers of the following movies.

You can also detach franchise entries so that they become standalone items.

In addition, you can add an existing item using the drop-down at the bottom of the form. Select an item and it will be added as the last entry of the franchise. You can only add standalone items. If you want to add an item which belongs to a different franchise, you have to detach it first.

## Franchise Hierarchies

In addition to movies and series, a franchise can also contain other franchises. This is never necessary though. You can always group movies and series properly with only one level of franchises. But if you want to represent the data in your list in a more structured manner, you can introduce multiple levels of franchises. For example, both Harry Potter and Fantastic Beasts belong to a franchise called Wizarding World.

If you have multiple levels of franchises, you can choose to merge their entries' display numbers. This functionality is limited to two levels only though.

Merging display numbers can be better explained with an example. Suppose you created a franchise called Star Wars which contains three other franchises: The Original Trilogy, The Prequel Trilogy and The Sequel Trilogy, each of which contains three movies, for a total of nine movies (anthology films and series notwithstanding). If you open any of the child franchises, you'll see that every movie is numbered 1, 2, and 3. This may not be desirable, because all of these movies are part of one big Star Wars franchise, and so it would be better to say that e.g. Revenge of the Sith is the sixth movie overall, and not just the third movie of the Prequel Trilogy. You can do that by merging the display numbers. If you check the *merge display numbers* check-box in the child franchises (the trilogies), then the Prequel Trilogy will continue numbering its movies after the Original Trilogy (so, 4, 5, and 6) and the Sequel Trilogy will continue numbering its movies after the Prequel Trilogy (so, 7, 8, and 9).

## Franchise Navigation Actions

If a movie, series, or a franchise are parts of a franchise, their forms will contain additional actions, most of which are located in the form header.

Firstly, you can go to the franchise, using the *up arrow* button in the form's header, or using the *Go to franchise* button at the bottom of the form which substitues the *Create franchise* button since the latter is not needed anymore.

Secondly, you can move to the next or previous franchise entry using the arrow buttons in the form's header, just like you can move between the series componentes if you open one of those forms.

These actions are available only when the form doesn't contain changes.

## Other Actions

The franchise form has a couple other action buttons:

* Delete the franchise
* Create a franchise

You can delete the franchise only when the form doesn't contain changes. When you delete the franchise, none of its entries are deleted. Instead, they are all detached. You have to delete all entries manually.

Mind that the *Add franchise* and *Create franchise* buttons have similar names, but very different functionality. *Add franchise* adds a new entry to the current franchise. *Create franchise* is the same as in other forms - it creates a new franchise which has the current franchise as its first entry.


# Preferences

The final feature covered in these docs is the app-wide preferences. You can open them through the *Edit > Preferences* menu item, or by pressing `Ctrl+Shift+P`, and close them by clicking the *close* button in the tab header, through the *File > Close* menu item, or by pressing `Ctrl+W`. Here's how preferences look:

![](https://516957188-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MQ6ppadORo2y7Ni8N_x%2F-MQ6uhUEUT6b-eNkcK6m%2F-MQ6wtwvfZkFLGKx_rRv%2Fv0.1-screen-preferences.png?alt=media\&token=50e04549-7c3b-4c1b-b8d2-ab62a7fb0708)

Preferences consist of three sections:

* Default settings
* Other preferences
* Advanced preferences

Preferences are stored in your user's app data folder, under the *MovieList* directory. If you decide to uninstall the app, you can delete this directory as well, if you don't wish to keep these preferences.

## Default Settings

Default settings are the settings that new files will get when they are created. They are almost identical to the settings you can find if you open a file's settings. The only difference is that you can't set a default list name.

## Other Preferences

Currently the only setting in this section is a check-box which indicates whether to show recent files in the home page, or not. If you uncheck it, the app will clear the recent files list, and won't track which files were opened.

## Advanced Preferences

You probably shouldn't touch these. Currently they only control the app's logging level and log location. You can read more in the article on technical stuff if you so wish. Unlike other preferences, if you change these settings, they will take effect after restarting the app.


# Technical Stuff

The Movie List app is written with [C#](https://github.com/dotnet/csharplang) and [.NET Core 3.1](https://github.com/dotnet/core). Following is the list of technologies used in this app and some other technical aspects.

## UI

This app is a desktop app. I've contemplated writing a web app, but decided against it, partly because it's easier, and because it makes more sense to store lists in files on users' machines instead of some sort of centralized database.

The UI is written using [WPF](https://github.com/dotnet/wpf), and styled with [Material Design](https://material.io/design) using [Material Design in XAML](http://materialdesigninxaml.net/) and [Material Design Extensions](https://spiegelp.github.io/MaterialDesignExtensions).

I'm currently thinking about switching to [Avalonia](https://avaloniaui.net) or [WinUI 3](https://github.com/microsoft/microsoft-ui-xaml) in the future, because while WPF is powerful, these frameworks are the hot stuff and are more active. Also, they will support Fluent Design, which I think is more natural for Windows compared to Material Design. If I migrate to Avalonia, I may even make this app cross-platform, even though it's highly unlikely.

At the beginning of the app's developement, I didn't use any libraries for styling at all, thinking I will write styles myself. That proved to be a horrible idea, and I started using [HandyControl](https://github.com/HandyOrg/HandyControl) and then switched to my own fork of the library (which I've since deleted completely, so some very old commits cannot even be built anymore). I have since decided to completely rewrite the app, and to use Material Design for UI. You can find this old version under the [old git tag](https://github.com/TolikPylypchuk/MovieList/releases/tag/old).

## Core Logic

I'm using [ReactiveUI](https://www.reactiveui.net) as the MVVM framework for the core logic, and I must say that it's a real pleasure to use this framework. Also, [Splat](https://github.com/reactiveui/splat) is used for service location.

In the beginning I rolled my own MVVM stuff, but it quickly became bloated and extremely unwieldy in code, and the performance became horrible. So I've scrapped everyhing, and started from scratch using ReactiveUI (and changed the UI library along the way).

## Data Access

This app uses [SQLite](https://www.sqlite.org/index.html) for data access. The *.mlist* files are [actually SQLite databases](https://www.sqlite.org/appfileformat.html) which you can open in e.g. [DB Browser for SQLite](https://sqlitebrowser.org) and browse like any other relational database, although looking through data is quite inconvenient there.

The file make-up is quite straightforward. Just look at table definitions in DB Browser for SQLite or another app to see their structure and relations.

The only table which should be elaborated on is the 'Settings' table. It contains key-value pairs for some general file settings which don't fit into other places. Currently each file contains five such key-value pairs:

* List name (`list.name`)
* List version (`list.version`)
* The default season title (`season.title.default`)
* The default season original title (`season.title.default-original`)
* The language used for sorting titles (`list.culture`)

The app ignores any other rows in this table and will not be able to read the file if any one of the aforementioned rows are missing.

The list version is currently always set to 1 and will be incremented every time a new version of the app introduces breaking changes to the file format. Note that the 0.x versions are pre-release versions and they will definitely introduce breaking changes to files, but won't increment its version. The file version will be incremented after the app reaches version 1.0. I haven't yet figured out what the strategy for dealing with multiple file versions will be. All breaking changes will be documented, but if you're using this app before version 1.0, you have to figure out how to migrate files on your own.

## Preferences

Preferences are stored in the user's app data folder, under the *MovieList* directory. Also, the cache of downloaded posters is stored in the user's local app data folder (also under the *MovieList* directory). If you want to uninstall this app completely, you should delete these folders manually.

This app uses [Akavache](https://github.com/reactiveui/Akavache) as the engine for storing settings and cache.

## Logging

This app uses a plain-text log file to log the stuff it's doing and errors it encounters along the way. [Serilog](https://serilog.net) is used as the logging library. The location of the log file, as well as the minimum log level can be set in preferences, in the advanced section. The default location of the log file is in the user's app data folder. Here's the list of supported log levels (from lowest to highest):

* *Verbose*: log everything (this level is not used directly and setting it is the same as setting *Debug* as the minimum level)
* *Debug*: log the details of the app's internal workflow
* *Info*: log general information
* *Warning*: log warnings about unwanted but manageable events
* *Error*: log errors that the app cannot fix itself
* *Fatal*: log unforeseen and unknown errors which make the app crash

The default log level is *Warning* and you should rarely set it to a lower setting.

Currently, the file is never trimmed or rolled over, so if you choose a low log level, and use this app a lot, the size of the log file may become quite big. If it does, don't hesitate to delete it - the app certainly won't miss it - it won't even notice that the file is gone. A future version will set a max size of the log file so that this doesn't happen.

## Docs

[GitBook](https://www.gitbook.com) is used for docs since it's quite versatile and can host docs for multiple app versions.

Previously these articles were built using [Jekyll](https://jekyllrb.com) and [GitHub Pages](https://pages.github.com), and used the [Minimal Mistakes theme](https://mmistakes.github.io/minimal-mistakes). The first version of the docs used the [Just the Docs theme](https://pmarsceill.github.io/just-the-docs) but it doesn't support multiple versions of the docs.

## Building from Source

If you want to build your own version of this app, you simply need .NET Core 3.1. That's it, there are no special prerequisites.

Run the `Publish-App` script to create a zipped app which you can then extract to anywhere.


# About Movie List

A long time ago I started keeping a list of movies and TV series I've watched and would like to watch. Keeping track of all these movies and series in a Word document because cumbersome since now there are more than a thousand items (I watch a lot of movies). Thus I've decided to create an app so that the list can be more structured and so that I can analyze the data somehow. Also, this is a fun side project.

## Project Status

I've been working on this app since February 2019 and it's not nearly done. I've released version 0.1, because now the app is at least usable, although it lacks lots of features yet. Versions 0.x should be considered pre-release and as such probably shouldn't be used in general since there will be breaking changes.

I'm actively working on the app, although sometimes I take breaks to work on other projects, so expect more versions soon.


# Cineaste

An app which keeps track of the movies and TV series you have watched or would like to watch.

If you want to use this app to track movies and series, you can certainly do so, but bear in mind that this is a personal project - I'm writing this app for myself, at my own pace, and according to my own needs.

![](https://1911536468-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6ppadORo2y7Ni8N_x-887967055%2Fuploads%2Fgit-blob-91c75100ce42e05ce23e2a8e6997fd0f669ab23a%2Fv0.3-screen-movie.png?alt=media)


# Getting Started

## How to Get the App

Cineaste should work on Windows, macOS, and Linux, but was tested only on Windows 10. Currently the only way to get this app on Windows is to download it from the *releases* section on GitHub and extract it manually. For other platforms you'll have to build it yourself. The latest version is 0.3.

## Files and Tabs

The app works with files of the *.cnl* extension. A *.cnl* file represents a list of movies, series, and franchises, and some auxiliary settings. If you want Windows to bind the file extension to this app, you'll have to do it manually for now. All files are opened in separate tabs.

This is a single-instance app. You can't open multiple windows in this app. If you open it when it's already opened, it will simply show you the existing window. If you open a file when the app is already running, it will open the file in a new tab.

## The Home Page

![](https://1911536468-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6ppadORo2y7Ni8N_x-887967055%2Fuploads%2Fgit-blob-b7c9fa5185529647e8fa54537c8c73b7a347b1de%2Fv0.3-screen-home-page.png?alt=media)

The app's home page contains several features for working with files.

Firstly, you can create a list file. When you click on the *Create a list* button, a *Save file* dialog is opened. Enter the file name and select the location, click save, and an empty list file will be created and opened in a new tab. This is also available through the *File > New menu* item, or by pressing `Ctrl+N`.

Secondly, you can open an existing list file. There are several ways to do that. You can click the *Open a list* button and select the file in the *Open file* dialog. Or you can use the *File > Open* menu item, or press `Ctrl+O`. Also, you can drop a file into any area inside the app window to open a new file. Lastly, you can open the file through the File Explorer if you had Windows bind the file extension to this app.

Thirdly, you can view and open any files that you've recently opened. Simply double-click on any *Recently opened files* entry to open it. You can also go to the *File > Open Recent... > (file name)* menu item to open a recent file. To remove a file from the recently opened files list, click on the check-box on the left side of the entry, and click the *Remove from list* button.

## Other Menu Items

You can learn about feature-specific menu items in the following articles.

The following menu items don't belong to specific features:

* *File > Exit* (or press `Alt+F4`) to exit the app (obviously);
* *Help > About* (or press `F1`) to view some basic info about the app.


# List Files

Here's what the app looks like when you create a new file:

![](https://1911536468-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6ppadORo2y7Ni8N_x-887967055%2Fuploads%2Fgit-blob-85a0b2cf21632b87af1f9b8c46cee8a42eaafc61%2Fv0.3-screen-new-file.png?alt=media)

The file tabs are composed of three main sections: the list itself, stats, and settings. You can switch between them using the left-side bar.

When you open a file, you can close it via the *close* button in the tab's header, through the *File > Close* menu item, or by pressing `Ctrl+W`.

## The List Section

Here's what the list section looks like when it contains entries:

![](https://1911536468-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6ppadORo2y7Ni8N_x-887967055%2Fuploads%2Fgit-blob-a411470132d899d2cd9a2588aa3bc455509d6352%2Fv0.3-screen-list.png?alt=media)

### List Structure

The list items can be of three types:

* Movies
* Series
* Franchises

By default, the items are sorted alphabetically by title and then by year if their title is the same, but it's configurable.

Franchises are used to group related items together and without them some items would be scattered across the list when it would make more sense to have them appear together.

The list has four columns:

* Sequence number to show the item's number in a franchise
* The title in your native language
* The original title
* Year or years

The majority of popular contemporary movies are in English, so if your native language is English, then the title will often be the same as the original title.

All item types can have multiple titles and original titles since different translations exist or the item is marketed differently in different markets. Only the first title and original title is shown in the list. Every item can have up to 10 titles and up to 10 original titles.

### Kinds

Every item can be of a certain kind. Kinds are used to color-code items in the list. Every kind has six colors for various item types and states:

* Movie which has already been watched;
* Movie which hasn't been watched yet;
* Movie which hasn't been released yet;
* Series which has already been watched or is being watched;
* Series which hasn't been watched yet;
* Series which hasn't been released yet.

There are no separate colors for franchises - they get the color of their first entry.

By default, every file contains three kinds (although it can be configured):

* Live-Action: movies are black, series are blue;
* Animation: movies are green, series are light-blue;
* Documentary: both movies and series are purple.

The default kinds have all non-watched items as red and all non-released items as dark red.

### Tags

Every item can have one or more tags. They can be used for searching or filtering, although you can choose not to use them at all. Unlike kinds, tags don't influence the item's color in the list. In fact, they don't impact the app's behavior in any way - they are just auxiliary pieces of information. Tags are applicable to movies and series. You can't add tags to franchises. You can also restrict a tag to be applicable only to movies or only to series.

Every tag has a name, category, description, and color. The name/category combination must be unique. Names should generally be short enough for the tag not to take up too much space and should be all-lowercase. e.g. *comedy*. The categories are used to semantically group tags. They should start with a capital letter, e.g. *Genre*. Descriptions are used to provide more info about tags, but are not required. Colors are used to more easily discern tags.

In addition, tags can imply other tags. For example, if you specify that the tag *black comedy* implies *comedy*, it means that every movie or series which has the *black comedy* tag will also implicitly have the *comedy* tag as well.

### Adding Items to the List

You can add new items to the list by clicking the buttons in the right-side panel, which will open a form for editing the item. If you want to edit an existing item, click on it, and the form for this item will be opened. You can't create franchises directly because they are not supposed to be standalone list items. Rather, you create them through previously created items.

You can learn more about editing list items in the next article.

## The Stats Section

Statistics are not implemented yet, so the respective navigation bar item is disabled.

## The Settings Section

Here's what the settings for a file look like:

![](https://1911536468-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6ppadORo2y7Ni8N_x-887967055%2Fuploads%2Fgit-blob-4fdc4b62b5f9bbbfc4593ffd6965bb318c0cfc5d%2Fv0.3-screen-settings.png?alt=media)

You can open the file settings by clicking the left-side bar item, through the *File > Settings* menu item, or by pressing `Ctrl+P`.

The settings consist of the three main sections: main settings, kind settings, and tag settings.

### Main File Settings

You can edit the following file attributes in the settings:

* List name;
* Title language;
* Default season title;
* Default season original title;
* Default first sorting order;
* Default first sorting direction;
* Default second sorting order;
* Default second sorting direction.

You can name your list however you like and it doesn't have to be the same as the name of the file. The list name appears in the tab header and in the recent files list on the home page.

Title language is used to correctly sort titles. While original titles can be in any language, titles will usually be in your native language, and sorting rules may be different for different languages.

Default season title and original title are used to generate titles for newly created seasons for series. The *#* symbol will be replaced with the actual season number. For example, if the default season title is *Season #* and you create two seasons, their default names will be *Season 1* and *Season 2* respectively. Same for season original titles. You can learn more about the season form in the article on series.

Default sorting is the sorting which is applied when you open the file. More info on sorting can be found in the article about searching, filtering, and sorting.

### Kind Settings

Here you can edit existing kinds, delete them, or add new ones.

A single kind setting consists of a name and six colors for the aforementioned item types. You can edit colors by clicking on them and by editing the color in the popup.

![](https://1911536468-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6ppadORo2y7Ni8N_x-887967055%2Fuploads%2Fgit-blob-0c81b8003de20b4ff8dfc48d2be88eb6592fa663%2Fv0.3-screen-settings-color.png?alt=media)

You can select a color in the color picker which supports three modes - palette, wheel, and manual settings.

You can have as many kinds as you like (but more than zero). You can't delete kinds that have items of that kind in the list. If you want to delete a kind, you should manually edit its every item to have a different kind.

### Tag Settings

Here you can edit existing tags, delete them, or add new ones.

![](https://1911536468-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6ppadORo2y7Ni8N_x-887967055%2Fuploads%2Fgit-blob-782378e88bc96d82c0518213c0c1cd5dd5ac2703%2Fv0.3-screen-settings-tag.png?alt=media)

When you add a new tag, or click on an existing one, a tag editing form is opened in the modal window where you can edit all the aforementioned attributes. The same rules apply to tag colors as to kind colors.

You can have as many tags as you like, or none at all, if you don't want to use them. Unlike kinds, you can delete tags which belong to existing items. If you do, then all items will lose this tag.


# Forms

You can add, edit, and delete list items through forms which appear on the right side of the main section. There are six types of forms:

* Movie
* Series
* Season (part of the series form)
* Special episode (part of the series form)
* Miniseries
* Franchise

All list items can contain posters. None of them are stored in the list file however. Only their URLs are stored - the posters themselves are fetched from the internet when the form is opened and cached locally for 5 minutes.

## Saving the Forms

Forms can be in two basic states: changed and unchaged. If the form is changed, you can cancel all changes and return the form to how it was when you opened it. If the form is changed and valid, you can save it to write the changes to the file. If you close an unsaved form, all changes are discarded. You can't perform certain actions when the form contains changes, e.g. you can't delete it, or create a franchise.

You can also save a form through the *File > Save* menu item, or by pressing `Ctrl+S`.

If you look at the big picture, you'll see that this app lets you write only tiny changes to the file at a time, unlike many other file-based apps. For example, you can't spend half an hour inputting data into the app and save all those changes at once (and you really shouldn't do that in other apps as well), because you can save only one form at a time.

The *Save As* functionality works differently than in other apps. Normally you can make some changes to a file, save it as another file (and maybe another file type) and the original will be unchagned - you can even revert all changes so that the original file remains the same. In this app, however, *Save As* works only when all changes are already saved in the original file. This is because the app doesn't let you change a lot without saving, so there is no reason to use *Save As* to save a copy of the file and have the original unchanged. You shouldn't change the file extension when saving as either. This app works only with the *.cnl* file extension.

You can save a file as another file through the *File > Save As...* menu item, or by pressing `Ctrl+Shift+S`.

## Integration with IMDb and Rotten Tomatoes

This version of the app has minimal integration with IMDb and RT. You can enter links to the item on those sites and that's it for now. A future version will show the IMDb score and RT scores inline so you don't have to open the sites to view them.


# The Movie Form

The movie form is the simplest and most straightforward of the forms. Here's how it looks:

![](https://1911536468-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6ppadORo2y7Ni8N_x-887967055%2Fuploads%2Fgit-blob-c2e25fb08f9a4f95edebeba561d1d921b0c83e4b%2Fv0.3-screen-movie-form.png?alt=media)

The form consists of the following sections:

* Header which contains the first title, the *close* button, and a few other buttons if the movie is a part of a franchise (which are discussed in the article on franchises)
* Poster and links, if present
* The form fields
* Buttons for various actions

## Form Fields

The movie form contains the following fields:

* Check-box which indicates whether you watched the movie
* Check-box which indicates whether the movie is released
* Titles (at least one required)
* Original titles (at least one required)
* Year (required)
* Kind (required)
* IMDb link
* Rotten Tomatoes link
* Poster URL
* Tags

The *released* check-box is enabled only if the movie's year is the same as the current year. If the movie's year is before the current year, it's obvious that the movie is already released. Conversely, if the movie's year is after the current year, it's obvious that the movie is not released yet.

If you check the *watched* check-box, and the *released* check-box is unchecked, it becomes checked as well. It doesn't make sense that you can watch an unreleased movie (yes, there are exceptions, but those are rare). If you uncheck the *released* check-box, the *watched* check-box becomes unchecked as well.

You can add titles with the *Add title* and *Add original title* buttons. If there are multiple titles, you can delete them by pressing the *delete* button on the right side of the title field. You can't change the order of the titles. If you decide that the second title should become the first and vice versa, you should change them manually.

The minimum value for the year is 1850 and maximum value is 2100. If you input the year manually instead of using arrow buttons, you should press `Enter` to apply the change. You can press the `Up`/`Down` keys to change the year by 1, and `Page Up`/`Page Down` keys to change the year by 10. The reason that the movie form includes only a year, and not a full release date is because the movie can have multiple release dates: premieres can be on different dates in different markets, and movies can be shown at festivals ahead of their release.

You can select any kind from the list of kinds which you specify in the file's settings.

Links and the poster URL are not required, and indeed not every movie is guaranteed to have an entry in IMDb or RT (although I have yet to find a movie which doesn't have an entry in IMDb).

You can add any tag from the list of tags which you specify in the file's settings. Once added, you can remove any tag by clicking its *delete* button. Only those tags that are applicable to movies can be added.

## Actions

The movie form has several action buttons:

* Delete the movie;
* Create a franchise;
* Other franchise actions which are discussed in the article on franchises.

You can execute these actions only when the form doesn't contain changes.


# The Series Form

This is a big one. It takes much more effort to add a series than it is to add a movie. Here's how a series form looks:

![](https://1911536468-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6ppadORo2y7Ni8N_x-887967055%2Fuploads%2Fgit-blob-7074e285c753f7d16362b196bc97bfee745003f2%2Fv0.3-screen-series-form.png?alt=media)

The series form consists of the following parts:

* Header which contains the first title, the *close* button, and a few other buttons if the series is a part of a franchise (which are discussed in the article on franchises)
* Poster (or logo) and links, if present
* Main form fields
* The list of components: seasons and special episodes
* Additional fields
* Buttons for various actions

## Form Fields

The series form contains the following fields:

* Titles (at least one required)
* Original titles (at least one required)
* Watch status (required)
* Release status (required)
* Kind (required)
* IMDb link
* Rotten Tomatoes link
* Poster URL
* Tags

All the same rules apply to titles as with the movie form.

Since watching the series is more of a continuous process (unless you binge it), its watch status is more than just *watched* or *not watched*. Here are the possible watch statuses:

* Not watched, if you haven't started watching the series yet;
* Watching, if you are currenly watching the series or waiting for new episodes;
* Watched, if you have watched the series in its entirety;
* Stopped watching, if you decided that the series is not worth your time anymore.

Like watch status, there's more to the release status than simply 'released' or 'not released'. Here are the possible release statuses:

* Not started;
* Running;
* Finished, if the series finished naturally;
* Cancelled, if the series was axed by the studio;
* Don't know/don't care, if you stopped watching the series and you don't want to track it in the app anymore.

You can select any kind from the list of kinds which you specify in the file's settings.

Links and the poster URL are not required, and indeed not every series is guaranteed to have an entry in IMDb or RT (although, like with movies, I have yet to find a series which doesn't have an entry in IMDb). Instead of a poster, you can put a URL of a series' logo, which I do for most series.

You can add any tag from the list of tags which you specify in the file's settings. Once added, you can remove any tag by clicking its *delete* button. Only those tags that are applicable to series can be added.

## Series Components

Series must contain one or more components. A series component is either a season or a special episode which in the context of this app means an episode which was aired or released separately from others, even if the studio doesn't designate it as 'special' (e.g. White Christmas is a standalone episode of Black Mirror). You can add componentes through the *Add season* or *Add special episode* buttons. When you press one of them, a respective form is opened. You can't save a series unless it contains at least one component.

You can move series components up and down by right-clicking on a component and selecting the *Move up* or *Move down* context actions.

## Other Actions

The series form has several other action buttons:

* Delete the series;
* Convert to miniseries;
* Create a franchise;
* Other franchise actions which are discussed in the article on franchises.

You can convert a series to a miniseries. A miniseries is a one-season series without special episodes which is designed to be limited in nature. Miniseries have separate, simplified forms. You can convert a series to a miniseries only if it contains one season or none at all, and no special episodes.

You can execute these actions only when the form doesn't contain changes.

## The Season Form

When you add a new season or click on an existing one in the series form, a season form is opened. Here's how it looks:

![](https://1911536468-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6ppadORo2y7Ni8N_x-887967055%2Fuploads%2Fgit-blob-a832a5f69c134234944738b585ea622735d73203%2Fv0.3-screen-season-form.png?alt=media)

Unlike the movie and series forms, the season form is not independent - it's considered to be part of the series form. You can't save a season directly; to save a season, go back to the series form and save the whole series. You can cancel any changes in the season form directly. If you cancel changes in the series form, all changes in all seasons will be cancelled as well (new seasons will be removed, and deleted seasons will be returned).

The season form consists of the following parts:

* Header which contains the first title, the *close* button, and navigation buttons;
* Poster, if present;
* Main form fields;
* The list of release periods;
* Buttons for various actions.

### Season Form Fields

The season form contains the following fields (all fields are required):

* Titles;
* Original titles;
* Watch status;
* Release status;
* Original channel.

When you create a new season, its titles are generated using the default season titles from the file's settings.

As with series, there are several watch statuses:

* Not watched, if you haven't started watching the season;
* Watching, if you are currently watching it, or waiting for new episodes;
* Watched, if you have finished watching the full season;
* Hiatus, if the season is on a hiatus, or you decided to take a break from watching it;
* Stopped watching, if you haven't finished the season, and don't plan to finish it.

Likewise, there are several release statuses:

* Not started, if the season hasn't started airing or hasn't been released yet;
* Running, if new episodes are currently airing or are being released;
* Finished, if all episodes of the season have been released;
* Hiatus, if the season is on a hiatus and new episodes won't come for some time.
* Don't know/don't care, if you stopped watching the series and you don't want to track it in the app anymore.

The original channel is just for descriptive purposes. When you create a new season, by default it has the same channel as the previous series component. There may be situations when a series has multiple original channels (e.g. Killing Eve is a co-production between BBC America and AMC). If that's the case, choose one of those. The form is complicated as-is, and adding the possibility of multiple channels will only make it more complicated.

Seasons don't have separate IMDb pages.

### Season Release Periods

Unlike movies, where releases are tracked up to a year, series components are tracked up to a month. Seasons could have a start and end date directly, but it's not that simple. A single season may be released in parts during different periods (like the last season of Breaking Bad or the last season of The Sopranos). It wouldn't really represent the truth if you said that those seasons lasted for a year - they didn't. They lasted for a few weeks, had a hiatus and then for a few weeks next year. That's why seasons may contain multiple release periods. Every period has its own set of fields inside the season form. Obviously, every season requires at least one period, and there is no upper bound for the number of periods.

The period subform consists of the following fields (all fields except links are required):

* Period start;
* Period end;
* Number of episodes;
* Check-box which indicates whether it was a single-day release (like for Netflix series);
* Rotten Tomatoes link;
* Poster URL.

The year of the release can be between 1950 and 2100. The periods must be valid - the end date cannot be before the start date and periods cannot be interleaved.

The number of episodes for a single period can be between 1 and 50.

If it's a single-day release, you don't select the end month/year, becuase they are obviously equal to the start month/year.

Rotten Tomatoes tracks scores for individual seasons, but it may have multiple pages per season (the only series I've seen have multiple pages per season is The Sopranos). Thus the main part of the season form doesn't contain the RT link. Instead, the period subform has it, and that's why the link to RT is at the top of the period subform, and not directly below the poster, like in other forms.

If a season is released over multiple periods, it may be marketed differently during those periods and hence have different posters for different parts. If the season has multiple posters, you can switch between them with the little arrow buttons below the poster.

You can add a period by clicking the *Add period* button at the bottom of the season form. If you want to remove a period, click the *delete* button in the lower right corner of the period subform. You can't delete a period if there's only one present.

### Other Season Actions

The season form has a couple other action buttons at the bottom of the form:

* Delete the season;
* Go to series.

It also has action buttons in the form header:

* Go to series;
* Go to the next series component (if the season is not the last component);
* Go to the previous series component (if the season is not the first component).

You can delete the season only when the form doesn't contain changes and go to series only when it's valid.

## The Special Episode Form

When you add a new special episode or click on an existing one in the series form, a special episode form is opened. Here's how it looks:

![](https://1911536468-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6ppadORo2y7Ni8N_x-887967055%2Fuploads%2Fgit-blob-c78eb55d83068ab944df82e417793fa8c12a29dc%2Fv0.3-screen-episode-form.png?alt=media)

This form is similar to the movie form and is much simpler than the season form. Like the season form, the special episode form is not independent - it's considered to be part fo the series form. You can't save an episode directly; to save an episode, go back to the series form and save the whole series. You can cancel any changes in the episode form directly. If you cancel changes in the series form, all changes in all episodes will be cancelled as well (new episodes will be removed, and deleted episodes will be returned).

The special episode form consists of the following parts:

* Header which contains the first title, the *close* button, and navigation buttons;
* Poster and RT link, if present;
* Form fields;
* Buttons for various actions.

### Special Episode Form Fields

The special episode form contains the following fields:

* Check-box which indicates whether you watched the episode;
* Check-box which indicates whether the episode is released;
* Titles (at least one required);
* Original titles (at least one required);
* Release month and year (required);
* Rotten Tomatoes link;
* Poster URL.

As with movies, watch and release statuses are simple check-boxes. The *released* check-box is enabled only if the release month/year is the same as the current month/year, because otherwise the release status is obvious. If you check the *watched* check-box, the *released* check-box becomes checked as well. If you uncheck the *released* check-box, the *watched* check-box becomes unchecked as well.

As with seasons, the year of the episode's release can be between 1950 and 2100.

### Special Episode Actions

The actions are the same as seasons' actions described in the *Other Season Actions* section.


# The Miniseries Form

The miniseries form describes series which are limited in nature. In the context of this app, a miniseries has only one season, which in turn has only one release period, and no special episodes. Here's how a miniseries form looks:

![](https://1911536468-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6ppadORo2y7Ni8N_x-887967055%2Fuploads%2Fgit-blob-47c200a08867e080c9cc8ac02c7fdd9afe228136%2Fv0.3-screen-miniseries-form.png?alt=media)

As you can see, the miniseries forms are much simpler than the full series forms as they don't contain other separate forms. You can't create a miniseries form directly - you create it by creating a full series form and converting it to miniseries.

The miniseries form consists of the following parts:

* Header which contains the first title, the *close* button, and a few other buttons if the miniseries is a part of a franchise (which are discussed in the article on franchises);
* Poster and links, if present;
* Main form fields;
* The period subform;
* Additional fields;
* Buttons for various actions.

## Main Form Fields

The miniseries form contains the following main fields:

* Titles (at least one required);
* Original titles (at least one required);
* Watch status (required);
* Release status (required);
* Kind (required).

These fields are basically the same as in the full series form.

## The Period Subform

The miniseries form contains a single period subform which looks and behaves exactly like period subforms in season forms. Look at the series form article to learn more about period subforms.

## Additional Form Fields

The miniseries form contains the following additional fields below the period subform:

* IMDb link;
* Rotten Tomatoes link;
* Poster URL;
* Tags.

It may be a little confusing to see that the RT link field for the miniseries is lower than the RT link field for its single season (RT has a separate page for miniseries' seasons). This is because the season RT link is contained in the period subform and it comes before the RT link of the miniseries. The RT link for the miniseries is located directly below the poster, and the RT link for the season is contained at the top of the period subform.

The rules for tags are the same as in the full series form.

## Other Actions

The miniseries form has several other action buttons:

* Delete the miniseries;
* Convert to full series;
* Create a franchise;
* Other franchise actions which are discussed in the article on franchises.

You can convert a miniseries back to full series any time you like. The resulting form will contain a separate form for the series' sole season.

You can execute these actions only when the form doesn't contain changes.


# The Franchise Form

Lots of movies and series have multiple parts, so it's logical to have these movies/series be grouped together in the list. This is just what franchises are for: grouping related movies, series or even other franchises.

Franchises can be created and edited via the franchise forms, but those can't be created directly. Rather, you first create a movie or a series, and after saving it, you can create a franchise where this movie/series is the first part, using the *Create franchise* button at the bottom of the form. Here's how a franchise form looks:

![](https://1911536468-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6ppadORo2y7Ni8N_x-887967055%2Fuploads%2Fgit-blob-d9ef983cb17398125d67d8831f0b71578c832daf%2Fv0.3-screen-franchise-form.png?alt=media)

The franchise form is a little different from other forms in that it's focus is on actions rather than fields and data. It consists of the following parts:

* Header which contains the first title, the *close* button, and a few other buttons if the franchise is a part of another franchise;
* Poster (or logo), if present;
* Form fields;
* The franchise entry list;
* Buttons for various actions.

## Form Fields

The franchise form contains the following main fields:

* Check-box which indicates whether the franchise has its own titles;
* Check-box which indicates whether the franchise should be shown as an item in the list;
* Check-box which indicates whether the franchise entries are loosely connected;
* Check-box which indicates whether the display numbers should be merged with those of the previous franchise;
* Titles (if the franchise has titles);
* Original titles (if the franchise has titles);
* Poster URL.

The franchise form is the only form where titles are not required. If the franchise doesn't have its own titles, then the titles of its first entry are considered as the titles of the franchise. If the franchise has its own titles, you can specify whether to show it as an item in the list. This is not always necessary since the franchise can have a title which is very similar to the first entry's title.

The entries of the franchise can be loosely connected. This has purely demostrational value - the entry numbers will be shown in parentheses. For example, the Dollars Trilogy can be considered to be loosely connected, because its movies can be thought of as independent.

Franchises rarely have their own posters, but may have separate logos, and so the franchise form includes the poster URL as well.

## Franchise Entries

When you create a new franchise through a movie of series, it already contains one entry. You can add other entries using one of the three *add* buttons - *Add movie*, *Add series* or *Add franchise*.

When you add a new entry, its respective form is opened. There's nothing different about creating a new franchise entry from creating a standalone item. When you save it, it is added to the franchise entry list. If you cancel, you are taken back to the franchise form.

If you right-click on a franchise entry, a context menu will apper which has the following actions:

* Move up (if the entry is not the first one);
* Move down (if the entry is not the last one);
* Hide/show display number;
* Detach.

You can move the entries around, and they don't have to be in chronological order (although it's usually logical that they be in chronological order).

You can hide the display numbers of individual entries if they are considered 'unofficial'. For example, the 1969 Casino Royale movie is an unofficial James Bond movie, but you can add it to the James Bond franchise and hide its display number so it doesn't offset the display numbers of the following movies.

You can also detach franchise entries so that they become standalone items.

In addition, you can add an existing item using the drop-down at the bottom of the form. Select an item and it will be added as the last entry of the franchise. You can only add standalone items. If you want to add an item which belongs to a different franchise, you have to detach it first.

## Franchise Hierarchies

In addition to movies and series, a franchise can also contain other franchises. This is never necessary though. You can always group movies and series properly with only one level of franchises. But if you want to represent the data in your list in a more structured manner, you can introduce multiple levels of franchises. For example, both Harry Potter and Fantastic Beasts belong to a franchise called Wizarding World.

If you have multiple levels of franchises, you can choose to merge their entries' display numbers. This functionality is limited to two levels only though.

Merging display numbers can be better explained with an example. Suppose you created a franchise called Star Wars which contains three other franchises: The Original Trilogy, The Prequel Trilogy and The Sequel Trilogy, each of which contains three movies, for a total of nine movies (anthology films and series notwithstanding). If you open any of the child franchises, you'll see that every movie is numbered 1, 2, and 3. This may not be desirable, because all of these movies are part of one big Star Wars franchise, and so it would be better to say that e.g. Revenge of the Sith is the sixth movie overall, and not just the third movie of the Prequel Trilogy. You can do that by merging the display numbers. If you check the *merge display numbers* check-box in the child franchises (the trilogies), then the Prequel Trilogy will continue numbering its movies after the Original Trilogy (so, 4, 5, and 6) and the Sequel Trilogy will continue numbering its movies after the Prequel Trilogy (so, 7, 8, and 9).

## Franchise Navigation Actions

If a movie, series, or a franchise are parts of a franchise, their forms will contain additional actions, most of which are located in the form header.

Firstly, you can go to the franchise, using the *up arrow* button in the form's header, or using the *Go to franchise* button at the bottom of the form which substitues the *Create franchise button* since the latter is not needed anymore.

Secondly, you can move to the next or previous franchise entry using the arrow buttons in the form's header, just like you can move between the series componentes if you open one of those forms.

These actions are available only when the form doesn't contain changes.

## Other Actions

The franchise form has a couple other action buttons:

* Delete the franchise;
* Create a franchise.

You can delete the franchise only when the form doesn't contain changes. When you delete the franchise, none of its entries are deleted. Instead, they are all detached. You have to delete all entries manually.

Mind that the *Add franchise* and *Create franchise* buttons have similar names, but very different functionality. *Add franchise* adds a new entry to the current franchise. *Create franchise* is the same as in other forms - it creates a new franchise which has the current franchise as its first entry.


# Searching, Filtering, Sorting

## Searching

You can search for certain items in the list. To do that, specify the filters, and press *Find next* or *Find previous*. The found items are colored light blue, and the currently selected found item is colored a slightly darker shade of blue. Here's how it looks:

![](https://1911536468-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6ppadORo2y7Ni8N_x-887967055%2Fuploads%2Fgit-blob-9625b63c321ac1ee57a8491679f79d0e4d2fde36%2Fv0.3-screen-search.png?alt=media)

When the search is activated, the list of all found items will appear in the search panel, and you can click on them to jump to those items. To stop searching, click on the *Stop searching* button. Afterwards, if you click on the *Find next* or *Find previous* button again, the search will start from the top or bottom respectively. If you want to stop searching and clear the filters, then click on the *Clear search* button.

You can't search franchises - only movies or series.

Here's the list of all possible search filters:

* *Title* - searches by title (if an item has multiple titles, they are all considered):
  * *Title is* - searches for items whose title contains the specified input;
  * *Title starts with* - searches for items whose title starts with the specified input;
  * *Title ends with* - searches for items whose title ends with the specified input;
* *Year* - searches by year:
  * *Year is* - searches for items of the specified year;
  * *Year less than* - searches for items before the specified year;
  * *Year greater than* - searches for items after the specified year;
  * *Year between* - searches for items between the specified years (inclusive);
* *Kind is* - searches for items of the specified kind;
* *Tags* - searches by tags:
  * *Tags include* - searches for items which have all of the specified tags;
  * *Tags exclude* - searches for items which have none of the specified tags;
  * *Tags have category* - searches for items which have any tags of the specified category;
* *Standalone* - searches for items which don't belong to a franchise;
* *Movies only* - searches only for movies;
* *Watched (movies only)* - searches for movies which are watched;
* *Released (movies only)* - searches for movies which are released;
* *Series only* - searches only for series;
* *Watch status is (series only)* - searches for series which have the specified watch status;
* *Release status is (series only)* - searches for series which have the specified release status;
* *Channel (series only)* - searches for series which have the specified channel:
  * *Channel is* - searches for series whose channel name equals the specified input;
  * *Channel starts with* - searches for series whose channel name starts with the specified input;
  * *Channel ends with* - searches for series whose channel name ends with the specified input;
* *Number of seasons (series only)* - searches for series by the number of seasons:
  * *Number of seasons is* - searches for series which have the specified number of seasons;
  * *Number of seasons less than* - searches for series which have less seasons than the specified number;
  * *Number of seasons greater than* - searches for series which have more seasons than the specified number;
  * *Number of seasons between* - searches for series whose number of seasons is between the specified numbers (inclusive);
* *Number of episodes (series only)* - searches for series by the number of episodes:
  * *Number of episodes is* - searches for series which have the specified number of episodes;
  * *Number of episodes less than* - searches for series which have less episodes than the specified number;
  * *Number of episodes greater than* - searches for series which have more episodes than the specified number;
  * *Number of episodes between* - searches for series whose number of episodes is between the specified numbers (inclusive);
* *Miniseries (series only)* - searches for miniseries.

You can negate the filters by checking the *negate* check-box. Remember that it can mean a different thing than what you think. For example, if you negate the *Watched (movies only)* filter, it will search for series as well, because it will search for all items which don't satisfy the *Watched (movies only)* filter, and that includes series. When a filter is negated, a red strip is added on the left side.

The search filters can be composed in several ways. If you click on the right-side three-dot menu, the following options will appear:

* Make composite (and);
* Make composite (or);
* Remove filter.

If you make the filter composite, then three buttons will appear:

* Add filter (the *plus* button);
* Change the filter composition (the *arrows swap* button);
* Simplify (the *arrows minimize* button).

If a composite filter contains only one filter, you can make it a simple filter again by pressing the *simplify* button. You can add filters to the composite filter by pressing the *add filter* button.

The nature of the composite filter depends on the composition type of which there are two: *and* and *or*. If the composition is *and* then all filters must be positive for the composite filter to be positive. If the composition is *or* then at least one filter must be positive for the composite filter to be positive. The *and* composition is shown with a green strip on the left side, and the *or* composition is shown with a blue strip on the left side. You can change the filter's composition by clicking the *change composition* button.

Here's an example: in order to search for non-watched movies, you should compose two filters: the negated *Watched (movies only)* and *Movies only*, and set the composition to *and* because both filters must be positive.

If you want to remove a filter, then you can click on the *remove filter* in the three-dot menu.

You can create complex hierarchies of filters with multiple layers and different composition types.

## Filtering

Filtering is very similar to searching. As you saw previously, when searching for items you already use various kinds of filters. Filtering the list uses the same principles, but has one big difference - it doesn't highlight the found items. Instead, it shows only the found items. All other items are removed from the list completely. Here's how it looks:

![](https://1911536468-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6ppadORo2y7Ni8N_x-887967055%2Fuploads%2Fgit-blob-5f5472e13bfbe0606f3d1c0a280d7ef3b652a764%2Fv0.3-screen-filter.png?alt=media)

You can't filter franchises - only movies or series. A franchise appears in the filtered list only if one or more of its entries appear in the filtered list.

When you have specified the filters, you can click on the *Apply filter* button to apply them. Afterwards, you can click on the *Clear filter* button to return back to the full list.

You can combine searching and filtering, for example by filtering by some general conditions, and then searching with more specific conditions in the filtered list.

## Sorting

You can specify how the list is sorted. There are a couple options, but they are limited. Here's how the sorting panel looks:

![](https://1911536468-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6ppadORo2y7Ni8N_x-887967055%2Fuploads%2Fgit-blob-3801d284982b8ca9fec410fa3e6dfcd342c59685%2Fv0.3-screen-sort.png?alt=media)

Here are the possible sorting orders:

* By title;
* By original title;
* By title (simple);
* By original title (simple);
* By year.

Sorting by title takes franchises into account, while simple sorting by title doesn't. You can specify the sorting direction as well - ascending or descending.

There are two levels of sorting. The second level is used when the first level is the same (like having the same title). You can't add more levels since two levels are enough.

By default the first level of sorting is by title, and the second level is by year. The defaults can be changed in the file's settings, and the default settings for new files can be changed in the preferences.

Sorting by title is available only as the first level, because it's complex and it doesn't make sense to make it second-level. Thus only the three last options are available for the second-level sorting.


# Preferences

The final feature covered in these docs is the app-wide preferences. You can open them through the *Edit > Preferences* menu item, or by pressing `Ctrl+Shift+P`, and close them by clicking the *close* button in the tab header, through the *File > Close* menu item, or by pressing `Ctrl+W`.

Preferences consist of two sections:

* Default settings;
* Other preferences.

Preferences are stored in your user's app data folder, under the *Cineaste* directory. If you decide to uninstall the app, you can delete this directory as well, if you don't wish to keep these preferences.

## Default Settings

Default settings are the settings that new files will get when they are created. They are almost identical to the settings you can find if you open a file's settings. The only difference is that you can't set a default list name. Here's how they look:

![](https://1911536468-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6ppadORo2y7Ni8N_x-887967055%2Fuploads%2Fgit-blob-1c268bd0beebf32b1b15d26172e5ffc7eb00903b%2Fv0.3-screen-preferences-1.png?alt=media)

## Other Preferences

This section contains only a few things:

* The app's theme;
* A check-box which indicates whether to show recent files in the home page;
* Logging preferences.

Here's how they look:

![](https://1911536468-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6ppadORo2y7Ni8N_x-887967055%2Fuploads%2Fgit-blob-1e9496bc4f3c35736486191365293d639224f955%2Fv0.3-screen-preferences-2.png?alt=media)

You can set the app's theme to be light or dark. You can't set it to automatically be the same as the rest of your system though.

If you uncheck the check-box to show recent files, the app will clear the recent files list, and won't track which files were opened.

You probably shouldn't touch the logging preferences. They control the app's logging level and log location. You can read more in the article on technical stuff if you so wish. Unlike other preferences, if you change these settings, they will take effect after restarting the app.

## Dark Theme

All previous screenshots in the docs used the light theme. Here's how the dark theme looks:

![](https://1911536468-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6ppadORo2y7Ni8N_x-887967055%2Fuploads%2Fgit-blob-155853b22a3dbc7a0249f2c573181fd27beaee67%2Fv0.3-screen-dark.png?alt=media)

You may have noticed that the list item colors are completely different here. You can't set separate colors of the light and dark theme - the app does it itself. It inverts the lightness of the kind colors, meaning that black becomes white, dark red becomes light red, light green becomes dark green and so on.


# Version History

This article provides info on what's new in every version of the Cineaste app.

## Version 0.3

This version adds no new features. The app itself was renamed to Cineaste. The UI was completely rewritten to use Avalonia instead of WPF, so now the app can be cross-platform (it was built and tested only on Windows 10 though). Also, it now uses Fluent UI instead of Material UI, and a dark theme was added.

![](https://1911536468-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6ppadORo2y7Ni8N_x-887967055%2Fuploads%2Fgit-blob-91c75100ce42e05ce23e2a8e6997fd0f669ab23a%2Fv0.3-screen-movie.png?alt=media)

There are no breaking changes to the list files, except that now their extension should be *.cnl* instead of *.mlist*. The preferences file contains breaking changes though, since the current theme (light or dark) was added to the preferences.

## Version 0.2

This version adds searching, filtering, and sorting capabilities to the app. Also, tags can now be added to movies and series to make searching/filtering easier. This release is still very incomplete and far from being stable.

![](https://1911536468-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6ppadORo2y7Ni8N_x-887967055%2Fuploads%2Fgit-blob-b0991eb188013270c5eec482e371c569421dd7c4%2Fv0.2-screen-movie.png?alt=media)

The following breaking changes were added to the list files:

* The `Tags`, `MovieTags`, and `SeriesTags` tables were added;
* The `IsAnthology` column was removed from series - if you want this info, implement it yourself through tags;
* The following keys were added to the `Settings` table: `list.sort.order.1`, `list.sort.order.2`, `list.sort.direction.1`, and `list.sort.direction.2`;
* The following keys were changed in the `Settings` table: `season.title.default` -> `list.season.title.default`, `season.title.default-original` -> `list.season.title.default-original`.

## Version 0.1

This is the first usable version of the app, albeit very incomplete. It provides the most basic functionality:

* Creating/opening list files;
* Adding/editing/removing movies, series, and franchises;
* Editing file settings, including kinds;
* Editing app preferences.

![](https://1911536468-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6ppadORo2y7Ni8N_x-887967055%2Fuploads%2Fgit-blob-c27ad62f9635c11160a039c43608b8d1d7f5d1c1%2Fv0.1-screen-movie.png?alt=media)

## Ancient History

In the beginning, the app looked and felt very differently. There could be only a sinlge list file, and the path to it was specified in the preferences. There were no tabs. And the UI was in Ukrainian, instead of English.

Afterwards the app was completely rewritten, but this version can be found under the `old` tag on GitHub.

![](https://1911536468-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6ppadORo2y7Ni8N_x-887967055%2Fuploads%2Fgit-blob-84bbde7ce2fdcceb69cb1d017e64d69fa415d5d8%2Fold-screen-1.png?alt=media)

![](https://1911536468-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6ppadORo2y7Ni8N_x-887967055%2Fuploads%2Fgit-blob-4421cd81adb752fd53ad441d7f47f3df0245ad06%2Fold-screen-2.png?alt=media)


# Technical Stuff

Cineaste is written with [C#](https://github.com/dotnet/csharplang) and [.NET 5](https://github.com/dotnet/runtime). Following is the list of technologies used in this app and some other technical aspects.

## UI

This app is a desktop app. I've contemplated writing a web app, but decided against it, partly because it's easier, and because it makes more sense to store lists in files on users' machines instead of some sort of centralized database.

The UI is written using [Avalonia](https://avaloniaui.net), and styled with [Fluent Design](https://www.microsoft.com/design/fluent) using [FluentAvalonia](https://github.com/amwx/FluentAvalonia). This means that the app can be cross-platform, but it was built and tested only on Windows 10.

At the beginning of the app's developement, I didn't use any libraries for styling at all, thinking I will write styles myself. That proved to be a horrible idea, and I started using [HandyControl](https://github.com/HandyOrg/HandyControl) and then switched to my own fork of the library (which I've since deleted completely, so some very old commits cannot even be built anymore). I have since decided to completely rewrite the app, and to use Material Design for UI before switching to Fluent Design. You can find this old version under the [old git tag](https://github.com/TolikPylypchuk/MovieList/releases/tag/old).

## Core Logic

I'm using [ReactiveUI](https://www.reactiveui.net) as the MVVM framework for the core logic, and I must say that it's a real pleasure to use this framework. Also, [Splat](https://github.com/reactiveui/splat) is used for service location.

In the beginning I rolled my own MVVM stuff, but it quickly became bloated and extremely unwieldy in code, and the performance became horrible. So I've scrapped everyhing, and started from scratch using ReactiveUI (and changed the UI library along the way).

## Data Access

This app uses [SQLite](https://www.sqlite.org/index.html) for data access. The *.cnl* files are [actually SQLite databases](https://www.sqlite.org/appfileformat.html) which you can open in e.g. [DB Browser for SQLite](https://sqlitebrowser.org) and browse like any other relational database, although looking through data is quite inconvenient there.

The file make-up is quite straightforward. Just look at table definitions in DB Browser for SQLite or another app to see their structure and relations.

The only table which should be elaborated on is the `Settings` table. It contains key-value pairs for some general file settings which don't fit into other places. Currently each file contains nine such key-value pairs:

* List name (`list.name`);
* List version (`list.version`);
* The default season title (`list.season.title.default`);
* The default season original title (`list.season.title.default-original`);
* The language used for sorting titles (`list.culture`);
* The default first sorting order (`list.sort.order.1`);
* The default second sorting order (`list.sort.order.2`);
* The default first sorting direction (`list.sort.direction.1`);
* The default second sorting direction (`list.sort.direction.2`).

The app ignores any other rows in this table and will not be able to read the file if any one of the aforementioned rows are missing.

The list version is currently always set to 1 and will be incremented every time a new version of the app introduces breaking changes to the file format. Note that the 0.x versions are pre-release versions and they will definitely introduce breaking changes to files, but won't increment its version. The file version will be incremented after the app reaches version 1.0. I haven't yet figured out what the strategy for dealing with multiple file versions will be. All breaking changes will be documented, but if you're using this app before version 1.0, you have to figure out how to migrate files on your own.

## Preferences

Preferences are stored in the user's app data folder, under the *Cineaste* directory. Also, the cache of downloaded posters is stored in the user's local app data folder (also under the *Cineaste* directory). If you want to uninstall this app completely, you should delete these folders manually.

This app uses [Akavache](https://github.com/reactiveui/Akavache) as the engine for storing settings and cache.

## Logging

This app uses a plain-text log file to log the stuff it's doing and errors it encounters along the way. [Serilog](https://serilog.net) is used as the logging library. The location of the log file, as well as the minimum log level can be set in preferences, in the advanced section. The default location of the log file is in the user's app data folder. Here's the list of supported log levels (from lowest to highest):

* *Verbose*: log everything (this level is not used directly and setting it is the same as setting *Debug* as the minimum level);
* *Debug*: log the details of the app's internal workflow;
* *Info*: log general information;
* *Warning*: log warnings about unwanted but manageable events;
* *Error*: log errors that the app cannot fix itself;
* *Fatal*: log unforeseen and unknown errors which make the app crash.

The default log level is *Warning* and you should rarely set it to a lower setting.

Currently, the maximum log file size is 10 MB. If it gets bigger, it will be rolled over. The last 2 rolled files are kept, while older ones are deleted.

## Docs

[GitBook](https://www.gitbook.com) is used for docs since it's quite versatile and can host docs for multiple app versions.

Previously these articles were built using [Jekyll](https://jekyllrb.com) and [GitHub Pages](https://pages.github.com), and used the [Minimal Mistakes theme](https://mmistakes.github.io/minimal-mistakes). The first version of the docs used the [Just the Docs theme](https://pmarsceill.github.io/just-the-docs) but it doesn't support multiple versions of the docs.

## Building from Source

If you want to build your own version of this app, you simply need .NET 5. You can look at the `global.json` file to see the exact version of .NET that this app needs. That's it, there are no other prerequisites.

To build the app for Windows run the `Publish-App` script to create a zipped app which you can then extract to anywhere. There are not scripts available for other platforms, but you can look at how `Publish-App` works and do something similar.


# About Cineaste

A long time ago I started keeping a list of movies and TV series I've watched and would like to watch. Keeping track of all these movies and series in a Word document because cumbersome since now there are more than a thousand items (I watch a lot of movies). Thus I've decided to create an app so that the list can be more structured and so that I can analyze the data somehow. Also, this is a fun side project.

## Project Status

I've been working on this app since February 2019 and it's not nearly done. I've released versions 0.1 through 0.3, because now the app is at least usable, although it still lacks lots of features. Versions 0.x should be considered pre-release and as such probably shouldn't be used in general since there will be breaking changes.

I'm actively working on the app, although sometimes I take breaks to work on other projects, so expect more versions soon.


