code:
<!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program is free software: you can redistribute it and/or modify
  ~ it under the terms of the GNU General Public License as published by
  ~ the Free Software Foundation, either version 3 of the License, or
  ~ (at your option) any later version.
  ~
  ~ This program is distributed in the hope that it will be useful,
  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  ~ GNU General Public License for more details.
  ~
  ~ You should have received a copy of the GNU General Public License
  ~ along with this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<resources>
    <string name="app_name">ESBDirect</string>
    <string name="app_name_offline">ESBDirect Time Travel</string>
    <string name="title_activity_settings">Settings</string>

    <string name="credentials_invalid">Credentials invalid</string>
    <string name="credentials_correct">Credentials confirmed</string>

    <string name="credentials_popup_title">Authentication failure</string>
    <string name="credentials_popup_open_preferences">Open preferences</string>

    <string name="timetable_uri_acquired">Loading timetable</string>
    <string name="timetable_last_changed">Last updated %s</string>
    <string name="timetable_published">Published %s</string>

    <string name="network_generic_error">Network error</string>
    <string name="network_invalid_response">Invalid response</string>

    <string name="error_parsing">Could not parse data to table</string>
    <string name="error_parsing_partial">Some data could not be parsed</string>

    <string name="network_versioncheck_failed">Could not check for updates.</string>

    <string name="network_authenticating">Authenticating</string>

    <string name="uri_versioncheck" translatable="false">https://notabug.org/fynngodau/DSBDirect/raw/master/updateCheck</string> <!-- This is indeed a professional way to check for updates. -->
    <string name="uri_news" translatable="false">https://notabug.org/fynngodau/DSBDirect/raw/master/news</string> <!-- This is indeed a professional way to check for news. -->
    <string name="uri_releasepage" translatable="false">https://notabug.org/fynngodau/DSBDirect/releases</string>
    <string name="uri_repository" translatable="false">https://notabug.org/fynngodau/DSBDirect</string>
    <string name="uri_issue_tracker" translatable="false">https://notabug.org/fynngodau/DSBDirect/issues</string>
    <string name="uri_fdroid" translatable="false">https://f-droid.org/de/packages/%s</string>
    <string name="uri_market" translatable="false">market://details?id=%s</string>
    <string name="uri_requestparser" translatable="false">https://dsb.bixilon.de/api/requestParse.php</string>

    <string name="query_body_base_json" translatable="false">{\"AppVersion\":\"2.5.9\",\"BundleId\":\"de.heinekingmedia.dsbmobile\"}</string>
    <string name="query_body_outer_json" translatable="false">{\"req\":{\"Data\":\"%s\",\"DataType\":1}}</string>

    <string name="email_uri" translatable="false">mailto:fynngodau@mailbox.org?subject=ESBDirect&body=%s</string>
    <string name="email_body">(Be kind!)</string>

    <string name="input_hint_pass">Pass</string>
    <string name="input_hint_id">ID</string>

    <string name="button_submit">Submit</string>

    <string name="action_reload">Reload</string>
    <string name="action_temp_filters_enable">Enable Filters</string>
    <string name="action_temp_filters_disable">Disable Filters</string>
    <string name="action_reauth">Reauthenticate</string>
    <string name="action_filter">Filter</string>
    <string name="action_update">Check for updates</string>
    <string name="action_choose_parser">Select parser</string>
    <string name="action_view_history">View history</string>

    <string name="confirm">Confirm</string>
    <string name="cancel">Cancel</string>
    <string name="import_">Import</string>
    <string name="dismiss">Dismiss</string>
    <string name="download">Download</string>
    <string name="action_filter_popup_title">Filter</string>
    <string name="number">Number</string>
    <string name="letter">Letter</string>
    <string name="name">Name</string>
    <string name="filter_by_class">Filter by class</string>
    <string name="filter_by_teacher">Filter by teacher</string>
    <string name="settings_view_filter_exclude_general">Always display general announcements (recommended)</string>
    <string name="action_filter_popup_message">Please input what class or course or teacher to filter for. Entries that match multiple categories will be <b>highlighted</b>. Case-sensitive.</string>
    <string name="action_parse">Parse to table</string>
    <string name="update_popup_title">Update found: Version %s</string>
    <string name="update_download_title">ESBDirect %s</string>
    <string name="up_to_date">You are on the latest version of ESBDirect.</string>
    <string name="initializing">Initializing</string>
    <string name="parser_automatic">Automatic</string>
    <string name="ok">OK</string>
    <string name="empty">Nothing to display</string>
    <string name="you_are_offline">You are offline</string>

    <string name="one_file">one file</string>
    <string name="files">files</string>

    <string name="transfer_now">Transfer now</string>
    <string name="dont_request">Don\'t request</string>
    <string name="open">Open</string>

    <string name="action_settings">Preferences</string>

    <string name="settings_view">View</string>
    <string name="settings_view_parse">Parse</string>
    <string name="settings_view_parse_not_html">Image tables can\'t be parsed</string>
    <string name="settings_view_parser">Parser</string>
    <string name="settings_view_filter">Enable filters</string>
    <string name="settings_view_set_filter">Set filters</string>
    <string name="settings_view_parse_summary">Read out plans into a processable table using a parser</string>
    <string name="settings_view_filter_summary">Only display relevant entries</string>

    <string name="settings_login">Login</string>
    <string name="settings_login_id">ID</string>
    <string name="settings_login_pass">Pass</string>

    <string name="settings_time_travel">Time travel</string>
    <string name="settings_time_travel_caching">Store duration</string>
    <string name="settings_time_travel_caching_summary">Keep files for %s</string>
    <string name="settings_time_travel_clear_cache">Delete all files now</string>
    <string name="settings_time_travel_description">Time travel allows you to view past plan versions stored on your device.</string>

    <string name="clear_cache_popup_title">Delete files</string>
    <string name="clear_cache_popup_message">Would you like to delete %1$s, occupying %2$s?</string>

    <string name="settings_updates">Updates</string>
    <string name="settings_updates_check">Automatically check for updates</string>
    <string name="settings_updates_check_now">Check for updates now</string>
    <string name="settings_about">About</string>
    <string name="settings_about_description">Developed by Fynn Godau</string>
    <string name="settings_about_description_summary">You are on version %s</string>
    <string name="settings_about_email">Write the developer an email message</string>
    <string name="settings_about_email_summary">He appreciates thank-you messages because they let him know someone uses the software he developed</string>
    <string name="settings_about_request_parser">Request a parser to be developed</string>
    <string name="settings_about_issues">File an issue</string>
    <string name="settings_about_repository">Check out the repository</string>
    <string name="settings_about_repository_summary">This software is licensed under GNU GPL v3, meaning that you got additional freedoms</string>
    <string name="settings_about_issues_summary">Utilise the issue tracker to request features and report bugs</string>

    <string name="request_parser_popup_title">Request parser</string>
    <string name="request_parser_popup_message">
        To develop a parser, it is necessary for the developer to have access to your plan.
        \n\nTherefore, the URL of the most recent substitution plan file will be sent to a server operated by Moritz Zwerger (bixilon.de).
        \n\nPlease understand that the developer might not have time for your plan in the near future, especially if it differs much from already supported plans.
        \n\nNo personal information is stored during the transfer. The upload process is not reversible automatically, please get in touch if you sent sensitive information on accident.
        \n\nIf your plan consists of images, it can\'t be parsed. Ask your school to provide a website file to Elektronisches Schwarzes Brett instead.
    </string>
    <string name="settings_polling">Notifications</string>
    <string name="settings_polling_enabled">Enable notifications</string>
    <string name="settings_polling_interval">Check interval</string>
    <string name="settings_polling_interval_summary">Check for new plan notifications every %s</string>
    <string name="settings_view_polling_api_too_low">Requires Android 5.0+</string>

    <string name="notification_channel_plan_updates">Plan updates</string>
    <string name="notification_channel_plan_updates_description">Notify about plan updates</string>

    <string name="notification_plan_html_updates_title">Today</string>
    <string name="notification_plan_html_updates_empty">No entries for today</string>
    <string name="notification_plan_updates_title">New plan available</string>

    <string name="notification_plan_updates_text_pluralize_entries_one">There is one entry</string>
    <string name="notification_plan_updates_text_pluralize_entries_many">There are {0} entries</string>
    <string name="settings_polling_description">Receive today\'s entries in a notification as soon as they become available. This feature may cause battery drain. No checks are performed during weekends and during night-time to conserve energy.</string>
    <string name="settings_view_filter_hide_past">Hide past entries</string>
    <string name="settings_polling_display_empty">Display empty notifications</string>
    <string name="settings_polling_display_empty_summary">Also notify if no entries match filters</string>
    <string name="settings_polling_download">Download new tables automatically</string>
    <string name="settings_polling_download_summary">Download new content as soon as it is found</string>
    <string name="settings_polling_download_recommended">Required for displaying table content in notifications</string>
    <string name="settings_view_layout">Layout</string>
    <string name="error_displaying">File could not be displayed</string>
    <string name="settings_view_merge">Merge</string>
    <string name="settings_view_merge_summary">Merge multiple pages into one table</string>

    <string name="login_login">Log in</string>
    <string name="login_title">Log in to Elektronisches Schwarzes Brett</string>
    <string name="credentials_popup_message">Your credentials appear to be invalid. If they are not, this might be a problem for which a fix already exists.</string>
    <string name="network_generic_error_credentials">A problem occurred during an attempt to verify your credentials.</string>
    <string name="network_generic_error_request">A problem occurred during an attempt to send your request. Please ensure that the internet is reachable.</string>
    <string name="notifications_popup_title">Enable notifications?</string>
    <string name="notifications_popup_message">Would you like to be notified whenever your plan updates?</string>
    <string name="yes">Yes</string>
    <string name="no">No</string>
    <string name="share_title">Share this entry</string>
    <string name="settings_filter">Filter</string>
    <string name="settings_view_style">Background</string>
    <string name="settings_parser">Parser</string>
    <string name="settings_view_invert_images">Invert images</string>
    <string name="settings_view_invert_images_summary">Flip image colors to switch black and white</string>
    <string name="settings_view_invert_images_no_images">There are no images in your plan</string>
    <string name="today">Today</string>
    <string name="tomorrow">Tomorrow</string>
    <string name="yesterday">Yesterday</string>
    <string name="settings_about_libraries">About libraries</string>
    <string name="about_libraries_header">The following libraries are in use to make this application work.</string>
    <string name="license">License</string>
    <string name="license_explanation">%1$s is distributing %2$s under the %3$s license as seen below.</string>
    <string name="about_libraries_open_browser">Open in browser</string>
    <string name="contact_app_developer">Contact app developer</string>
    <string name="credits">HeinekingMedia parser developed by Jasper Michalke
    \nEltern-Portal import feature developed by Moritz Zwerger</string>
    <string name="settings_view_styling">Style and Colors</string>
    <string name="settings_styling_color_primary">Primary color</string>
    <string name="action_pick_color_popup_message">Select a color using the picker below.</string>
    <string name="action_pick_color_popup">Pick color</string>
    <string name="settings_styling_color_accent">Accent color</string>
    <string name="settings_styling_color_primary_dark">Primary color dark</string>
    <string name="settings_style_description">You may adjust the application\'s colors to your liking. Unfortunately, the default blue and pink will still be visible at some occasions where it is hard or impossible to change them.</string>
    <string name="filter_by_courses">Filter by courses (separate with spaces; courses must appear in the info field)</string>
    <string name="courses">Courses</string>
    <string name="news_fix">Look for a fix</string>
    <string name="news_network_error_generic">Could not look for a fix due to a network error.</string>
    <string name="news_network_invalid_response">Looking for a fix failed, maybe try again later?</string>
    <string name="action_check_news">Download news</string>
    <string name="network_login_denied">Login denied – either your credentials are incorrect or the server isn\'t feeling like it</string>
    <string name="settings_view_parse_not_exclusively_html">Merging is not possible because your plan contains at least one image</string>
    <string name="action_switch_login">Switch login</string>
    <string name="action_add_login">Add login</string>
    <string name="settings_login_manage">Manage credentials</string>
    <string name="settings_login_alias_popup">Set display name for %s</string>
    <string name="settings_login_alias_popup_message">When you set a display name, it will be displayed instead of the id in the login switcher. If left empty, it will be populated with the school\'s name if possible.</string>
    <string name="settings_login_description">You can switch between multiple logins using the menu on the main screen.</string>
    <string name="settings_login_remove">Remove login</string>
    <string name="request_parser_uploading_message">Requesting…</string>
    <string name="request_parser_uploading_failed_message">The server said there was a problem retrieving your file.</string>
    <string name="request_parser_uploading_successful_message">The server has successfully received your file.</string>
    <string name="request_parser_uploading_successful_title">Request successful</string>
    <string name="request_parser_uploading_failed_title">Request failed</string>

    <string name="settings_shortcodes">Shortcodes</string>
    <string name="settings_shortcodes_enable">Enable shortcodes</string>
    <string name="settings_shortcodes_enable_summary">Replaced shortcodes by the teacher\'s full name</string>
    <string name="settings_shortcodes_elternportal">Import from eltern-portal.org</string>
    <string name="settings_shortcodes_elternportal_summary">If your school uses the "Eltern-Portal" platform, shortcodes can be downloaded from it</string>

    <string name="settings_shortcodes_elternportal_popup_title">Import shortcodes</string>
    <string name="settings_shortcodes_elternportal_popup_message">In order to import your shortcodes, please enter your credentials for the "Eltern-Portal" operated by art soft and more GmbH. Credentials are not stored. Existing shortcodes will be overwritten.</string>

    <string name="settings_shortcodes_elternportal_popup_text_url">Portal URL</string>
    <string name="settings_shortcodes_elternportal_popup_hint_url">URL</string>
    <string name="settings_shortcodes_elternportal_popup_text_email">Email address</string>
    <string name="settings_shortcodes_elternportal_popup_hint_email">Email</string>
    <string name="settings_shortcodes_elternportal_popup_text_password">Password</string>
    <string name="settings_shortcodes_elternportal_popup_hint_password">Pass</string>

    <string name="settings_shortcodes_elternportal_popup_success_title">Import successful</string>
    <string name="settings_shortcodes_elternportal_popup_fail_title">Import failed</string>
    <string name="settings_shortcodes_elternportal_popup_success_message">The shortcodes were imported successfully.</string>
    <string name="settings_shortcodes_elternportal_popup_fail_network">A problem occurred during an attempt to contact the Eltern-Portal. Please ensure that the internet is reachable.</string>
    <string name="settings_shortcodes_elternportal_popop_fail_url">Invalid URL</string>
    <string name="settings_shortcodes_elternportal_popop_fail_url_message">The URL you entered was unfortunately invalid.</string>
    <string name="settings_shortcodes_elternportal_popop_fail_credentials_invalid">The credentials you entered were unfortunately not correct.</string>
    <string name="settings_shortcodes_edit_popup">Edit shortcode</string>
    <string name="settings_shortcodes_edit_popup_remove">Remove shortcode</string>
    <string name="settings_shortcodes_add">Add shortcode</string>
    <string name="settings_shortcodes_edit_popup_failure">Shortcode could not be stored</string>
    <string name="settings_shortcodes_edit_popup_failure_needs_from">Both fields need to be filled.</string>
    <string name="settings_shortcodes_edit_popup_failure_illegal_character">Neither field may contain the \'→\' character.</string>
    <string name="settings_shortcodes_manage">Manage shortcodes</string>
    <string name="settings_shortcodes_add_popup">Add shortcode</string>
    <string name="settings_shortcodes_description">Shortcodes are replaced with their corresponding teacher\'s full name.</string>
    <string name="edit">Edit</string>

    <string-array name="settings_view_parser_options">
        <item>Automatic</item>
        <item>Untis</item>
        <item>HeinekingMedia (Goethe)</item>
        <item>WhiteYellow</item>
    </string-array>
    <string-array name="settings_view_parser_values">
        <item>automatic</item>
        <item>untis</item>
        <item>goethe</item>
        <item>whiteyellow</item>
    </string-array>

    <string-array name="settings_view_layout_options">
        <item>List</item>
        <item>Cards – Student</item>
        <item>Cards – Teacher</item>
    </string-array>
    <string-array name="settings_view_layout_values">
        <item>list</item>
        <item>cards</item>
        <item>cards reversed</item>
    </string-array>

    <string-array name="settings_view_style_options">
        <item>Light</item>
        <item>Dark</item>
        <item>Black</item>
    </string-array>
    <string-array name="settings_view_style_values">
        <item>light</item>
        <item>dark</item>
        <item>black</item>
    </string-array>

    <string-array name="settings_polling_interval_options">
        <item>5 minutes</item>
        <item>10 minutes</item>
        <item>20 minutes</item>
        <item>30 minutes</item>
    </string-array>
    <string-array name="settings_polling_interval_values">
        <item>5</item>
        <item>10</item>
        <item>20</item>
        <item>30</item>
    </string-array>

    <string-array name="settings_time_travel_caching_options">
        <item>three days</item>
        <item>one week (default)</item>
        <item>two weeks</item>
        <item>one month</item>
        <item>three months</item>
        <item>an eternity (only delete manually)</item>
    </string-array>
    <string-array name="settings_time_travel_caching_values">
        <!-- in milliseconds -->
        <item>259200000</item>
        <item>604800000</item>
        <item>1209600000</item>
        <item>2678400000</item>
        <item>8035200000</item>
        <item>Asexuals exist!</item>
    </string-array>

    <string-array name="settings_updates_check_options">
        <item>Never</item>
        <item>Occasionally (recommended)</item>
        <item>Every launch</item>
    </string-array>
    <string-array name="settings_updates_check_values">
        <item>never</item>
        <item>sometimes</item>
        <item>always</item>
    </string-array>
    <string name="notice_board">Notice board</string>
    <string name="action_notices">Show notices</string>
    <string name="notice_board_content_not_displayable">Content not displayable</string>
    <string name="notice_board_content_not_displayable_openable">Content not displayable, click to open externally</string>
    <string name="migration_dsbdirect_rename">This app has been renamed</string>
    <string name="migration_dsbdirect_rename_message">Due to the existence of trademark law, this piece of software has been renamed to ESBDirect. The \"ESB\" stands for \"Elektronisches Schwarzes Brett\".
\n\nShould you happen to come up with a better name, please don\'t hesitate to write an email.</string>
    <string name="email_the_dev">Email the dev</string>

</resources>


code:
<!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program is free software: you can redistribute it and/or modify
  ~ it under the terms of the GNU General Public License as published by
  ~ the Free Software Foundation, either version 3 of the License, or
  ~ (at your option) any later version.
  ~
  ~ This program is distributed in the hope that it will be useful,
  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  ~ GNU General Public License for more details.
  ~
  ~ You should have received a copy of the GNU General Public License
  ~ along with this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<resources>

    <!-- Base application theme. -->
    <style name="Light" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="TextOverBackground">@color/textOverWhite</item>
    </style>

    <style name="Dark" parent="Theme.AppCompat.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="TextOverBackground">@color/textOverPrimary</item>
    </style>

    <style name="Black" parent="Dark">
        <item name="android:windowBackground">@android:color/black</item>
    </style>

    <style name="Startup" parent="Light">
        <item name="android:windowBackground">@color/colorPrimary</item>
    </style>

    <style name="LoginTheme" parent="Light">
        <!-- Design before Lollipop… -->
        <item name="android:textColor">@color/textOverWhite</item>
        <item name="android:textColorPrimary">@color/textOverWhite</item>
        <item name="android:editTextColor">@color/textOverWhite</item>
        <item name="TextOverBackground">@color/textOverWhite</item>
    </style>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    <style name="AppTheme.NoActionBar" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>

    <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

    <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />

</resources>

repo_name: tomjschwanke/DSBDirect

license: mit


code:
<!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program is free software: you can redistribute it and/or modify
  ~ it under the terms of the GNU General Public License as published by
  ~ the Free Software Foundation, either version 3 of the License, or
  ~ (at your option) any later version.
  ~
  ~ This program is distributed in the hope that it will be useful,
  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  ~ GNU General Public License for more details.
  ~
  ~ You should have received a copy of the GNU General Public License
  ~ along with this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <godau.fynn.dsbdirect.PreferenceCategory
        android:title="@string/settings_parser">

        <CheckBoxPreference
            android:title="@string/settings_view_parse"
            android:summary="@string/settings_view_parse_summary"
            android:defaultValue="true"
            android:key="parse"
            />
        <ListPreference
            android:title="@string/settings_view_parser"
            android:id="@+id/settings_view_parser"
            android:entries="@array/settings_view_parser_options"
            android:entryValues="@array/settings_view_parser_values"
            android:defaultValue="automatic"
            android:summary="%s"
            android:dependency="parse"
            android:key="parser"
            /> <!-- Thanks, https://stackoverflow.com/a/24772748 -->
        <CheckBoxPreference
            android:title="@string/settings_view_merge"
            android:summary="@string/settings_view_merge_summary"
            android:defaultValue="true"
            android:dependency="parse"
            android:key="merge"
            />

    </godau.fynn.dsbdirect.PreferenceCategory>

    <godau.fynn.dsbdirect.PreferenceCategory
        android:title="@string/settings_view">

        <ListPreference
            android:title="@string/settings_view_layout"
            android:summary="%s"
            android:entries="@array/settings_view_layout_options"
            android:entryValues="@array/settings_view_layout_values"
            android:defaultValue="cards"
            android:dependency="parse"
            android:key="layout"
            />
        <Preference
            android:title="@string/settings_view_styling"
            android:key="styling"
            />

    </godau.fynn.dsbdirect.PreferenceCategory>

    <godau.fynn.dsbdirect.PreferenceCategory
        android:title="@string/settings_filter">

        <CheckBoxPreference
            android:title="@string/settings_view_filter"
            android:id="@+id/settings_view_filter"
            android:summary="@string/settings_view_filter_summary"
            android:dependency="parse"
            android:key="filter"
            />
        <Preference
            android:title="@string/settings_view_set_filter"
            android:id="@+id/settings_view_set_filter"
            android:dependency="filter"
            android:key="set_filter"
            />
        <CheckBoxPreference
            android:title="@string/settings_view_filter_exclude_general"
            android:defaultValue="true"
            android:dependency="filter"
            android:key="displayGeneral"
            />
        <CheckBoxPreference
            android:title="@string/settings_view_filter_hide_past"
            android:defaultValue="true"
            android:dependency="filter"
            android:key="filterPast"
            />

    </godau.fynn.dsbdirect.PreferenceCategory>

    <godau.fynn.dsbdirect.PreferenceCategory
        android:title="@string/settings_shortcodes">

        <CheckBoxPreference
            android:title="@string/settings_shortcodes_enable"
            android:id="@+id/settings_shortcodes_enable"
            android:summary="@string/settings_shortcodes_enable_summary"
            android:dependency="parse"
            android:key="shortcodes_enabled"
            />
        <Preference
            android:title="@string/settings_shortcodes_manage"
            android:dependency="shortcodes_enabled"
            android:key="shortcode_manage"
            />

    </godau.fynn.dsbdirect.PreferenceCategory>

    <godau.fynn.dsbdirect.PreferenceCategory
        android:title="@string/settings_polling">

        <Preference
            android:selectable="false"
            android:persistent="false"
            android:summary="@string/settings_polling_description"
            android:key="polling_description"
            />
        <CheckBoxPreference
            android:title="@string/settings_polling_enabled"
            android:defaultValue="false"
            android:key="poll"
            />
        <ListPreference
            android:title="@string/settings_polling_interval"
            android:summary="@string/settings_polling_interval_summary"
            android:entries="@array/settings_polling_interval_options"
            android:entryValues="@array/settings_polling_interval_values"
            android:defaultValue="5"
            android:dependency="poll"
            android:key="pollingInterval"
            />
        <CheckBoxPreference
            android:title="@string/settings_polling_download"
            android:summary="@string/settings_polling_download_summary"
            android:defaultValue="true"
            android:dependency="poll"
            android:key="autoDownload"
            />
        <CheckBoxPreference
            android:title="@string/settings_polling_display_empty"
            android:summary="@string/settings_polling_display_empty_summary"
            android:defaultValue="false"
            android:dependency="autoDownload"
            android:key="displayEmpty"
            />

    </godau.fynn.dsbdirect.PreferenceCategory>

    <godau.fynn.dsbdirect.PreferenceCategory
        android:title="@string/settings_login">

        <Preference
            android:title="@string/settings_login_manage"
            android:key="login_manage"
            />

    </godau.fynn.dsbdirect.PreferenceCategory>

    <godau.fynn.dsbdirect.PreferenceCategory
        android:title="@string/settings_time_travel">

        <Preference
            android:selectable="false"
            android:persistent="false"
            android:summary="@string/settings_time_travel_description"
            android:key="time_travel_description"
            /> <!-- Thanks, https://stackoverflow.com/a/26659953 -->
        <ListPreference
            android:title="@string/settings_time_travel_caching"
            android:entries="@array/settings_time_travel_caching_options"
            android:entryValues="@array/settings_time_travel_caching_values"
            android:defaultValue="604800000"
            android:summary="@string/settings_time_travel_caching_summary"
            android:key="cache_duration"
            />
        <Preference
            android:title="@string/settings_time_travel_clear_cache"
            android:persistent="false"
            android:key="clear_cache_now"
            />

    </godau.fynn.dsbdirect.PreferenceCategory>

    <godau.fynn.dsbdirect.PreferenceCategory
        android:title="@string/settings_updates">

        <ListPreference
            android:title="@string/settings_updates_check"
            android:entries="@array/settings_updates_check_options"
            android:entryValues="@array/settings_updates_check_values"
            android:defaultValue="@string/update_check_frequency_default"
            android:summary="%s"
            android:key="update_check_frequency"
            />
        <Preference
            android:title="@string/settings_updates_check_now"
            android:persistent="false"
            android:key="updates_check_now"
            />

    </godau.fynn.dsbdirect.PreferenceCategory>

    <godau.fynn.dsbdirect.PreferenceCategory
        android:title="@string/settings_about"
        android:summary="summary">
        <Preference
            android:title="@string/settings_about_description"
            android:selectable="false"
            android:persistent="false"
            android:icon="@mipmap/ic_launcher"
            android:key="settings_about_description"
            />
        <Preference
            android:title="@string/settings_about_email"
            android:persistent="false"
            android:summary="@string/settings_about_email_summary"
            android:key="settings_about_email"
            />
        <Preference
            android:title="@string/settings_about_request_parser"
            android:persistent="false"
            android:key="settings_about_request_parser"
            />
        <Preference
            android:title="@string/settings_about_repository"
            android:persistent="false"
            android:summary="@string/settings_about_repository_summary"
            android:key="settings_about_repository"
            />
        <Preference
            android:title="@string/settings_about_issues"
            android:persistent="false"
            android:summary="@string/settings_about_issues_summary"
            android:key="settings_about_issue"
            />
        <Preference
            android:title="@string/settings_about_libraries"
            android:key="settings_about_libraries"
            />
    </godau.fynn.dsbdirect.PreferenceCategory>

</PreferenceScreen>


code:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <Preference
        android:selectable="false"
        android:persistent="false"
        android:key="settings_none_description"
        />
</PreferenceScreen>


code:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <Preference
        android:selectable="false"
        android:persistent="false"
        android:summary="@string/settings_shortcodes_description"
        android:key="settings_shortcodes_description"
        />

    <godau.fynn.dsbdirect.PreferenceCategory
        android:title="@string/import_">

        <Preference
            android:title="@string/settings_shortcodes_elternportal"
            android:summary="@string/settings_shortcodes_elternportal_summary"
            android:key="settings_shortcodes_elternportal"
            />

    </godau.fynn.dsbdirect.PreferenceCategory>

    <godau.fynn.dsbdirect.PreferenceCategory
        android:title="@string/edit"
        android:key="shortcodes"/>

</PreferenceScreen>


code:
<!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program is free software: you can redistribute it and/or modify
  ~ it under the terms of the GNU General Public License as published by
  ~ the Free Software Foundation, either version 3 of the License, or
  ~ (at your option) any later version.
  ~
  ~ This program is distributed in the hope that it will be useful,
  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  ~ GNU General Public License for more details.
  ~
  ~ You should have received a copy of the GNU General Public License
  ~ along with this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <Preference
        android:selectable="false"
        android:persistent="false"
        android:summary="@string/settings_style_description"
        android:key="styling_description"
        />
    <ListPreference
        android:title="@string/settings_view_style"
        android:summary="%s"
        android:entries="@array/settings_view_style_options"
        android:entryValues="@array/settings_view_style_values"
        android:defaultValue="light"
        android:key="style"
        />
    <Preference
        android:title="@string/settings_styling_color_primary"
        android:key="colorPrimary"
        />
    <Preference
        android:title="@string/settings_styling_color_primary_dark"
        android:key="colorPrimaryDark"
        />
    <Preference
        android:title="@string/settings_styling_color_accent"
        android:key="colorAccent"
        />
    <CheckBoxPreference
        android:title="@string/settings_view_invert_images"
        android:summary="@string/settings_view_invert_images_summary"
        android:defaultValue="false"
        android:key="invertImages"
        />

</PreferenceScreen>


code:
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program is free software: you can redistribute it and/or modify
  ~ it under the terms of the GNU General Public License as published by
  ~ the Free Software Foundation, either version 3 of the License, or
  ~ (at your option) any later version.
  ~
  ~ This program is distributed in the hope that it will be useful,
  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  ~ GNU General Public License for more details.
  ~
  ~ You should have received a copy of the GNU General Public License
  ~ along with this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<resources>
    <string name="update_check_frequency_default" translatable="false">sometimes</string>
    <string name="update_method" translatable="false">self</string>
</resources>


code:
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program is free software: you can redistribute it and/or modify
  ~ it under the terms of the GNU General Public License as published by
  ~ the Free Software Foundation, either version 3 of the License, or
  ~ (at your option) any later version.
  ~
  ~ This program is distributed in the hope that it will be useful,
  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  ~ GNU General Public License for more details.
  ~
  ~ You should have received a copy of the GNU General Public License
  ~ along with this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<resources>
    <string name="update_check_frequency_default" translatable="false">sometimes</string>
    <string name="update_method" translatable="false">market</string>
</resources>


code:
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ DSBDirect
  ~ Copyright (C) 2019 Fynn Godau
  ~
  ~ This program is free software: you can redistribute it and/or modify
  ~ it under the terms of the GNU General Public License as published by
  ~ the Free Software Foundation, either version 3 of the License, or
  ~ (at your option) any later version.
  ~
  ~ This program is distributed in the hope that it will be useful,
  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  ~ GNU General Public License for more details.
  ~
  ~ You should have received a copy of the GNU General Public License
  ~ along with this program.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ This software is not affiliated with heinekingmedia GmbH, the
  ~ developer of the DSB platform.
  -->

<resources>
    <bool name="authenticate_quit_on_cancel">true</bool>
    <bool name="school_name_as_window_title_default">false</bool>
    <bool name="news_check_button">false</bool>
</resources>


code:
/*
 * DSBDirect
 * Copyright (C) 2019 Fynn Godau
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 *
 * This software is not affiliated with heinekingmedia GmbH, the
 * developer of the DSB platform.
 */

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ext.kotlin_version = '1.3.61'

    repositories {
        jcenter()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.6.0-beta03'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" }
}

allprojects {
    repositories {
        jcenter()
        google()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}


code: Hotfix: Version 1.6 hat auf älteren Android-Versionen nicht funktioniert.


code:
*It's about time.*

* Caching: Dateien werden für eine auswählbare Dauer gespeichert (#7)
* Zeitreise: Schaue ältere Versionen des Plans an (#7)
* Einstellungsbildschirm, damit das Overflow-Menü nicht so voll ist (#10)
* Verschiebung aller Einstellungen ins Einstellungsmenü, weil es sonst keines wäre
* Weniger lag, während Dateien ausgelesen werden
* Filter-An/Aus-Schalter im Einstellungsmenü
* Einstellung zur Häufigkeit der Suche nach Aktualisierungen
* Versionsnummernanzeige im Einstellungsmenü
* Neuer Knopf zum Löschen aller gespeicherten Dateien
* Neuer Knopf zum E-Mail-Nachricht schreiben
* Noch ein neuer Knopf zum E-Mail-Nachricht schreiben, falls man gerne einen eigenen Parser hätte
* Neuer Knopf zur Repository
* Noch ein neuer Knopf zur Repository, aber er heißt Issue tracker
* Röntgen-Gymnasium Würzburg wird auch automatisch geparst, nachdem Genehmigung zum Implementieren der ID erteilt wurde
* Im Browser Öffnen wurde entfernt, weil keiner den Plan im Browser ansehen will, wenn man doch DSBDirect hat


code:
* Benachrichtigungen über neue Einträge (#4)
* Für Benachrichtigungen relevante Einstellungen
* Metadaten für F-Droid, wofür auch neue Screenshots und eine Feature graphic entstanden sind (#12)
* Klassenfilter behoben, wenn kein Buchstabe eingegeben war
* Verhalten des horizontalen Scrollers verbessert
* Wechsel zwischen Dateien verbessert
* Teilweise Fehler mit Letzte Änderung-Nachricht behoben (#13)
* Versteckte Einstellungen hinzugefügt (nicht im Einstellungsmenü verfügbar)


code:
* Benachrichtigungen auch für Tabellen, die nicht ausgelesen werden können
* Erhöhung der Version einer Bibliothek, was die Stabilität erhöhen soll

Hoffen wir mal, dass das Ganze gut funktioniert…


code:
Bisher das größte Update.

* Anmeldedialog beim ersten Start (#11)
* Mehrere Seiten in eine vereinen (#14)
* Neues, frisches Karten-Layout
* Neuer Untis-Tabellenleser mit Unterstützung für viel mehr Untis-Systeme
* Automatische Erkennung von Untis-Systemen
* Tabellenleser jetzt auch für ältere Android-Versionen
* Unterstützung für Durchgestrichenes
* Dunkles und schwarzes Design
* Gedrückt halten, um Eintrag zu teilen
* Bilder ranzoomen
* Nützlichere Beschreibung auf Seitenauswahl
* Unterstützung für das invertieren von Bildern
* Blaufarbiger splash screen
* Automatisch zu korrektem Zeichensatz wechseln
* Google Play-Variante


code:
Verschiedene Verbesserungen.

* Neuer Plan verfügbar-Benachrichtigungen automatisch abbrechen
* HTML-Handling in Benachrichtigungen
* Doppelte Pläne nur einmal anzeigen (#16)
* Durchstrich auf älteren Geräten


code:
* Die Suche nach Benachrichtigungen geht jetzt möglicherweise auch nach einem
  Neustart weiter
* Keine br-Tags in Benachrichtigungen
* Menschliche Datumsangaben für "gestern", "heute" und "morgen"
* Tippfehler behoben!


code: * Über Bibliotheken-Bildschirm


code:
Klingt jetzt natürlich nach einem sehr uninspirierten Changelog… aber die Startzeit wurde um etwa 600 Millisekunden verkürzt. Außerdem wurden über 700 Zeilen, die mit dem Herunterladen des Planes zusammenhängen, geändert, weswegen ich gerne das Gefühl habe, dass das jetzt ebenfalls schneller geht.

---

Deutliche Geschwindigkeitsverbesserungen.
* WebView wird nur noch geladen, wenn es notwendig ist
* WebView wird während des Downloads geladen, wenn es notwendig ist
* Netzwerkcode überarbeitet, sodass er sich zumindest schneller anfühlt


code: Dank Mitwirkung von Jasper Michalke gibt es jetzt einen Parser für HeinekingMedia-Vertretungspläne, vorerst nur fürs Goethe-Gymnasium Hamburg gedacht. Außerdem lädt jetzt nicht mehr alles neu, wenn man das Gerät dreht. Magie!


code: Nach der Installation dieses Updates kannst du deine App in hübsche Farben einfärben (in gewissem Umfang). Außerdem wurde ein nerviger Encoding-Fehler behoben und "inline headers" in Untis-Plänen funktionieren jetzt.


code:
Es ist nun möglich, nach Kursen zu filtern.

---

* Filter verbessert
* Kursfilter hinzugefügt
* Generelle Ankündigungen standardmäßig anzeigen


code: Klassenfilter funktionieren jetzt wieder für alle


code:
Die Firma, die hinter DSB steht, hat DSBDirect kaputt gemacht. Jetzt ist es wieder repariert.

---

Nicht mehr der `iphone.dsbcontrol.de`-Endpunkt wird verwendet, da dieser deaktiviert wurde, sondern der bei `https://app.dsbcontrol.de/JsonHandler.ashx/GetData`, der aber ganz anders funktioniert


code: Die Firma, die hinter DSB steht, hat DSBDirect schon wieder kaputt gemacht. Jetzt ist es mal wieder repariert. #38


code: Die App ist wieder kaputt gegangen. Die App ist wieder repariert.


code: Hier ist ein weiterer Release, der DSBDirect wieder zum laufen bringt. Hoffen wir, dass er für eine Weile ausreicht!


code:
Hier haben sind ein paar Verbesserungen angesammelt, die eine Aktualisierung wert sein dürften. Es ist jetzt endlich möglich, Zugangsdaten für mehrere Pläne gleichzeitig zu speichern und über das Menü hin- und herzuwechseln. Außerdem gibt es endlich ein Nutzerinterface für die Kürzelfunktion, dank Moritz Zwerger kann man auch welche aus der Platform "Eltern-Portal" importieren. Es gibt des weiteren einen neuen Tabellenleser, betitelt "WhiteYellow", und Einträge, die mit mehreren Filterkategorien übereinstimmen, werden hervorgehoben.

---

* Mehrere Logins (#26)
* Um die Entwicklung eines Tabellenlesers bitten, ohne die Zugangsdaten zu übermitteln (#56)
* Kürzel (#27)
* Kürzel vom "Eltern-Portal" importieren (#57)
* Einträge, die mit mehreren Filtern übereinstimmen, werden hervorgehoben (#49)
* WhiteYellow-Tabellenleser für Pläne einer Stundenplansoftware unbekannten Namens


code:
Dank Mitwirkung von Moritz Zwerger könnnen Filter jetzt mittels dem "Auge"-Icon temporär deaktiviert werden, und unter Mitwirkung von Jasper Michalke entstand eine Aushänge-Ansicht, die Inhalte aus den Bereichen "News" und "Aushänge" anzeigt, sofern welche vorhanden sind.

Aufgrund der Existenz des Markenrechts wurde diese Software in "ESBDirect" umbenannt.

---

* Umbenennung in ESBDirect (#72)
* Filter temporär deaktivieren (#22 #60)
* Aushänge-Anzeige für Schulen, die welche bereitstellen (#55)
* Kursfilter behoben, falls der Kurs in der Klasse auftaucht (#65)
* Nur Kürzel ersetzen, die ganze Wörter sind (#66 #67 mit Dank an @tomjschwanke)
* Verbesserungen im Untis-Parser, um Kompatibilität zu erhöhen (mit Dank an alle, die bisher Dateien hochgeladen haben sowie @hexchen)
* Unterstützung für mehrere Seiten im HeinekingMedia parser (#62)
* HeinekingMedia-Dateien automatisch erkennen (#62)
* Generelle Ankündigungen mit dem WhiteYellow-Parser auslesen sowie Anzeige der Lehrkraft-Spalte behoben
* Kürzel alphabetisch sortiert anzeigen
* Kurse und Logins nicht in chaotischer Reihenfolge anzeigen
* Speicherformat für Kürzel von StringSet in neuzeilengetrennte String migrieren
* Rönten-Migration entfernt


code:
Dieses Update enthält mehrere Verbesserungen:

* Dieser und zukünftige Changelogs sind jetzt Deutsch.
* Radikale Verbesserungen am Filter für Klassen mit nur einer Ziffer.
* Neu Laden verbessert.
* Automatische Suche nach Updates eingefügt.
* Manuelle Suche nach Updates eingeführt.
* Die apk-Datei ist jetzt zusätzlich mit SHA1 signiert, um ältere Geräte zu unterstützen.


code:
* Die F-Droid-Version sucht nicht mehr automatisch nach Updates.
* Absturz, wenn man "Im Browser öffnen" wählte, obwohl die URL noch nicht geladen worden war, behoben (#1)


code:
* Schneller Laden™ implementiert (#2)
* Statusnachrichten vereinfacht, damit man nicht so viel an das Innenleben der Software denken muss
* Flüssigere Darstellung der Zuletzt Aktualisiert-Infoleiste
* Zeigt nicht mehr spontan an, dass Version aktuell ist (sucht aber weiterhin spontan nach Updates – die [F-Droid-Version](https://f-droid.org/es/packages/godau.fynn.dsbdirect/) hingegen nicht)


code:
* Unterstützung für Inhalte, die nicht HTML sind (Bilder)
* Unterstützung für mehrere Bilder oder Seiten
* Parsen wird deaktiviert, wenn neue Zugangsdaten eingegeben werden
* Kleine Korrektur beim Darstellen des AvH-DSBs als Webseite


code:
*Erster Auftritt, Sechster Aufzug.*

* Unterstützung für mehrere Parser (#9)
* Unterstützung für Auswahl aus den verschiedenen Parsern
* Parser für das Röntgen-Gymnasium Würzburg – damit ist die Zahl der verfügbaren Parser verdoppelt (von 1 auf 2)
* Filteroption "Generelle Ankündigungen immer Anzeigen" (teilweise #5)
* Verbesserte Updatebenachrichtigungen und Downloads
* Datums-/Wochentagesanzeige in der Sprache des Geräts
* Anzeige eines beruhigenden Textes, wenn keine Einträge vorhanden sind
* Deaktivierung von JavaScript in der Webseitendarstellung


code:
Diese Software kann auf ein gewisses Vertretungsplansystem (genannt ESB) zugreifen, welches im deutschsprachigen Raum weit verbreitet ist.

Sie wurde unabhängig von heinekingmedia entwickelt und implementiert die gleiche Funktionalität wie deren App.

* Zeigt Einträge in einer schönen, nativen Liste an, die gefiltert werden kann
* Alternativ zeigt sie die Webseite oder Bilder roh an
* Lokal gespeicherte alte Versionen des Planes können betrachtet werden
* Benachrichtigungen, die nur deine Einträge enthalten
* Kürzel durch vollständige Namen der Lehrkräfte ersetzen
* "News" und "Aushänge"-Bereich betrachten
* Lädt relativ schnell


code: Zugang zu Vertretungsplänen


code:
* Implement notifications through polling (#4)
* Add settings relevant to notifications
* Add metadata for F-Droid, taking new screenshots and creating a nice feature graphic in the process (#12)
* Fix issue where class filter would not work when no letter was set
* Improve horizontal scroller behaviour
* Fix display issues when switching between files
* Partially fix a bug with last updated message (#13)
* Add hidden super secret settings (not accessable through UI)


code:
* Notifications for tables that can't be parsed
* Upgrade a library's version to improve stability

Let's hope this is stable…


code:
The biggest update to date.

* Login prompt on first launch (#11)
* Merge multiple pages into one (#14)
* New, fresh cards layout
* New Untis parser, supporting many more Untis systems than before
* Automatic detection of Untis systems
* Parsing support on older Android versions
* Strikethrough support
* Dark and black theme
* Long press to share entry
* Zoom in on images
* Display more useful labels on page selector
* Invert image colors support
* Blue-colored splash screen
* Localized update notifications
* Automatically switch to correct encoding
* Google Play flavor


code:
Various improvements.

* Automatically cancel New plan available notification
* HTML handling in notifications
* Only display duplicate plans once (#16)
* Strikethrough on older devices


code:
* Notifications might now continue to be checked for after a reboot
* No more br tags in notifications
* Humanized date for "tomorrow", "today" and "yesterday"


code: * About libraries screen


code:
This will sound like a very uninspired changlog… but startup time is estimated to be improved by roughly 600 milliseconds. Furthermore, over 700 lines that have to do with networking have been changed, so I like to believe that network activity is faster now.

---

Considerable speed improvements.
* WebView is only loaded if necessary
* WebView is loaded during download if necessary
* Network code changed to at least feel faster


code: Thanks to Jasper Michalke's contributions, there is now a parser for HeinekingMedia Vertretungsplan, firstly only intended to use for with Goethe-Gymnasium Hamburg. Furthermore, rotating the device will no longer cause everything to reload. It's magic!


code: After installing this update, you will be able to color your installation with pretty colors (to some extent). Also adds support for "inline headers" in Untis plans and fixes an annoying encoding issue.


code:
It is now possible to filter by courses.

---

* Filters improved
* Course filters added
* Always show general announcements enabled by default


code: Class filters will now work again for everyone


code:
The company behind DSB broke DSBDirect. Now it's repaired again.

---

The `iphone.dsbcontrol.de` endpoint is no longer in use as it has been disabled, instead the one at `https://app.dsbcontrol.de/JsonHandler.ashx/GetData`is used, but it works totally different


code: The company behind DSB broke DSBDirect again. Now it's repaired again for a change. #38


code: The app broke again. It is repaired again.


code: This is another release that gets DSBDirect to work again. Let's hope it'll suffice for a while!


code:
Here are a few accumulated improvements which should be worth an update. It's finally possible to store credentials for multiple substitution plans and to switch back and forth using the menu. Additionally, there is now a user interface for the shortcode feature, and thanks to Moritz Zwerger, one can also import shortcodes from the "Eltern-Portal" platform. Furthermore, there is a new parser called "WhiteYellow", and entries which match multiple filter categories are highlighted.

Finally, I learned that "substitute plan" is not good English.

---

* Multiple logins (#26)
* Request parser without transferring credentials (#56)
* Shortcodes (#27)
* Import shortcodes from "Eltern-Portal" (#57)
* Highlight entries matching multiple filters (#49)
* WhiteYellow parser for substitution plans of a timetable software with an unknown name


code:
Thanks to Moritz Zwerger's contribution, filters can now be disabled temporarily by touching the "eye" icon, and with collaboration of Jasper Michalke, there is now a Notice board view that displays items from the "Aushänge" and "News" sections for schools that make use of this feature.

Due to the existance of trademark law, this piece of software is being renamed to "ESBDirect". If you come up with a better and cooler name, please inform us about it.

---

* Rename to ESBDirect (#72)
* Temporarily disable filters (#22 #60)
* Notice board view for schools which are posting news items (#55)
* Fix course filter if course is in class (#65)
* Only replace shortcodes that are whole words (#66 #67 thanks to @tomjschwanke)
* Untis parser improvements to increase compatibility (thanks to everyone who uploaded files so far as well as @hexchen)
* Support multiple pages in HeinekingMedia parser (#62)
* Dynamically detect HeinekingMedia files (#62)
* Support general announcements and fix display of teacher column for WhiteYellow parser
* Display shortcodes sorted by alphabet (#60)
* Don't display courses and logins in chaotic order
* Migrate shortcode storage format from string set to newline-separated strings
* Remove Rönten migration


code:
This software can access a certain substitution plan distribution system (aliased ESB) which is widely spread in the German-speaking area.

It has been developed independently from heinekingmedia and implements the same functionality as their app.

* Displays entries in a nice, native list which you can filter
* Alternatively displays the raw website or image
* View older versions of your plan, stored locally
* Notifications containing only your entries
* Replace shortcodes with teacher's full names
* View the "News" and "Aushänge" sections
* Loads relatively quickly


code: Access substitution plans


code:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   width="128"
   height="128"
   viewBox="0 0 33.866666 33.866668"
   version="1.1"
   id="svg8"
   inkscape:version="0.92.2 2405546, 2018-03-11"
   sodipodi:docname="icon.svg">
  <defs
     id="defs2" />
  <sodipodi:namedview
     id="base"
     pagecolor="#776500"
     bordercolor="#666666"
     borderopacity="1.0"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:zoom="5.6"
     inkscape:cx="66.521682"
     inkscape:cy="34.050827"
     inkscape:document-units="mm"
     inkscape:current-layer="layer1"
     showgrid="false"
     units="px"
     inkscape:snap-page="true"
     inkscape:snap-text-baseline="true"
     inkscape:snap-center="true"
     inkscape:snap-object-midpoints="true"
     inkscape:snap-midpoints="true"
     inkscape:snap-smooth-nodes="true"
     inkscape:snap-intersection-paths="true"
     inkscape:snap-nodes="true"
     inkscape:object-paths="true"
     inkscape:snap-global="false"
     inkscape:window-width="1920"
     inkscape:window-height="1031"
     inkscape:window-x="0"
     inkscape:window-y="35"
     inkscape:window-maximized="1"
     showguides="false" />
  <metadata
     id="metadata5">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title></dc:title>
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <g
     inkscape:label="Layer 1"
     inkscape:groupmode="layer"
     id="layer1"
     transform="translate(0,-263.13332)">
    <rect
       style="opacity:1;fill:#00000d;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.5999999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:normal"
       id="rect840"
       width="33.866665"
       height="33.866665"
       x="0"
       y="263.13333"
       ry="10.002145" />
    <path
       style="fill:#ffffff;stroke:none;stroke-width:0.30385548px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
       d="m 27.705928,285.38187 c -0.946464,-2.26043 -19.9186875,5.08403 -19.9186875,5.08403 0,0 20.4148525,-3.89905 19.9186875,-5.08403 z"
       id="path824"
       inkscape:connector-curvature="0"
       sodipodi:nodetypes="scs" />
    <path
       style="fill:#ffffff;stroke:none;stroke-width:0.30385548px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
       d="m 27.499835,283.69888 c -0.814429,-2.53378 -19.0713283,5.28808 -19.0713283,5.28808 0,0 19.3154983,-4.52844 19.0713283,-5.28808 z"
       id="path826"
       inkscape:connector-curvature="0"
       sodipodi:nodetypes="scs" />
    <path
       style="fill:#ffffff;stroke:none;stroke-width:0.30385548px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
       d="m 26.920905,281.92823 c -0.678966,-2.05968 -17.60102,4.98716 -17.60102,4.98716 0,0 17.912492,-4.04228 17.60102,-4.98716 z"
       id="path828"
       inkscape:connector-curvature="0"
       sodipodi:nodetypes="scs" />
    <path
       style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.30385548px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
       d="m 6.431731,291.13293 c 17.159637,-2.79905 21.522194,-4.99983 21.730314,-5.45472 0.208122,-0.45491 -0.729707,-4.54576 -1.000955,-4.96433 -0.271252,-0.41858 -21.0466031,5.61315 -21.3935785,5.28937 -0.3469803,-0.32379 -0.9654019,-0.48928 0.1901294,-0.96378 1.1555255,-0.4745 20.9543331,-5.43725 21.5666281,-5.0568 0.612294,0.38043 2.098227,5.659 1.02076,6.67726 -1.077465,1.01827 -22.5375384,5.79008 -22.4083634,4.81214 0.04953,-0.37498 0.2950654,-0.33914 0.2950654,-0.33914 z"
       id="path832"
       inkscape:connector-curvature="0"
       sodipodi:nodetypes="ccscccssc" />
    <path
       style="fill:#fffffb;fill-opacity:1;stroke:none;stroke-width:0.30385548px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
       d="M 4.8650057,284.59156 C 16.1067,271.04781 15.876493,266.2135 15.876493,266.2135 l 3.222875,14.73313 c -0.684421,0.60828 -14.2343623,3.64493 -14.2343623,3.64493 z"
       id="path834"
       inkscape:connector-curvature="0"
       sodipodi:nodetypes="cccc" />
    <path
       style="fill:#fffffb;fill-opacity:1;stroke:none;stroke-width:0.30385548px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
       d="m 19.866023,280.76669 -3.337977,-15.04007 c 0,0 4.973681,-0.1925 8.249024,4.3739 1.884314,2.62705 2.455524,9.47679 2.455524,9.47679 0,0 -4.419558,1.2522 -7.366571,1.18938 z"
       id="path836"
       inkscape:connector-curvature="0"
       sodipodi:nodetypes="ccscc" />
  </g>
</svg>


statusMessage: [01/26] The app is currently not known not to be working.

statusMessageDE: [26.01.] Im Moment ist nicht bekannt, dass die App nicht funktioniert.

Device: Kartoffel

path: news


whatsNew:
Finally, a new release! It's version 3.0 and it is now called "ESBDirect".

Thanks to Moritz Zwerger's contribution, filters can now be disabled temporarily by touching the "eye" icon, and with collaboration of Jasper Michalke, there is now a Notice board view that displays items from the "Aushänge" and "News" sections for schools that make use of this feature.

whatsNewDE:
Endlich eine neue Version! Es ist Version 3.0 und sie heißt jetzt "ESBDirect".

Dank Mitwirkung von Moritz Zwerger könnnen Filter jetzt mittels des "Auge"-Icon temporär deaktiviert werden, und unter Mitwirkung von Jasper Michalke entstand eine Aushänge-Ansicht, die Inhalte aus den Bereichen "News" und "Aushänge" anzeigt, sofern welche vorhanden sind.

path: updateCheck


code:
---
name: Broken site support
about: Report broken or misfunctioning site
title: ''
---

<!--

######################################################################
  WARNING!
  IGNORING THE FOLLOWING TEMPLATE WILL RESULT IN ISSUE CLOSED AS INCOMPLETE
######################################################################

-->

## Checklist

<!--
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of youtube-dl:
- First of, make sure you are using the latest version of youtube-dl. Run `youtube-dl --version` and ensure your version is 2020.09.20. If it's not, see https://yt-dl.org/update on how to update. Issues with outdated version will be REJECTED.
- Make sure that all provided video/audio/playlist URLs (if any) are alive and playable in a browser.
- Make sure that all URLs and arguments with special characters are properly quoted or escaped as explained in http://yt-dl.org/escape.
- Search the bugtracker for similar issues: http://yt-dl.org/search-issues. DO NOT post duplicates.
- Finally, put x into all relevant boxes (like this [x])
-->

- [ ] I'm reporting a broken site support
- [ ] I've verified that I'm running youtube-dl version **2020.09.20**
- [ ] I've checked that all provided URLs are alive and playable in a browser
- [ ] I've checked that all URLs and arguments with special characters are properly quoted or escaped
- [ ] I've searched the bugtracker for similar issues including closed ones

## Verbose log

<!--
Provide the complete verbose output of youtube-dl that clearly demonstrates the problem.
Add the `-v` flag to your command line you run youtube-dl with (`youtube-dl -v <your command line>`), copy the WHOLE output and insert it below. It should look similar to this:
 [debug] System config: []
 [debug] User config: []
 [debug] Command-line args: [u'-v', u'http://www.youtube.com/watch?v=BaW_jenozKcj']
 [debug] Encodings: locale cp1251, fs mbcs, out cp866, pref cp1251
 [debug] youtube-dl version 2020.09.20
 [debug] Python version 2.7.11 - Windows-2003Server-5.2.3790-SP2
 [debug] exe versions: ffmpeg N-75573-g1d0487f, ffprobe N-75573-g1d0487f, rtmpdump 2.4
 [debug] Proxy map: {}
 <more lines>
-->

```
PASTE VERBOSE LOG HERE
```

## Description

<!--
Provide an explanation of your issue in an arbitrary form. Provide any additional information, suggested solution and as much context and examples as possible.
If work on your issue requires account credentials please provide them or explain how one can obtain them.
-->

WRITE DESCRIPTION HERE

repo_name: rrosajp/youtube


code:
---
name: Site support request
about: Request support for a new site
title: ''
labels: 'site-support-request'
---

<!--

######################################################################
  WARNING!
  IGNORING THE FOLLOWING TEMPLATE WILL RESULT IN ISSUE CLOSED AS INCOMPLETE
######################################################################

-->

## Checklist

<!--
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of youtube-dl:
- First of, make sure you are using the latest version of youtube-dl. Run `youtube-dl --version` and ensure your version is 2020.09.20. If it's not, see https://yt-dl.org/update on how to update. Issues with outdated version will be REJECTED.
- Make sure that all provided video/audio/playlist URLs (if any) are alive and playable in a browser.
- Make sure that site you are requesting is not dedicated to copyright infringement, see https://yt-dl.org/copyright-infringement. youtube-dl does not support such sites. In order for site support request to be accepted all provided example URLs should not violate any copyrights.
- Search the bugtracker for similar site support requests: http://yt-dl.org/search-issues. DO NOT post duplicates.
- Finally, put x into all relevant boxes (like this [x])
-->

- [ ] I'm reporting a new site support request
- [ ] I've verified that I'm running youtube-dl version **2020.09.20**
- [ ] I've checked that all provided URLs are alive and playable in a browser
- [ ] I've checked that none of provided URLs violate any copyrights
- [ ] I've searched the bugtracker for similar site support requests including closed ones

## Example URLs

<!--
Provide all kinds of example URLs support for which should be included. Replace following example URLs by yours.
-->

- Single video: https://www.youtube.com/watch?v=BaW_jenozKc
- Single video: https://youtu.be/BaW_jenozKc
- Playlist: https://www.youtube.com/playlist?list=PL4lCao7KL_QFVb7Iudeipvc2BCavECqzc

## Description

<!--
Provide any additional information.
If work on your issue requires account credentials please provide them or explain how one can obtain them.
-->

WRITE DESCRIPTION HERE


code:
---
name: Site feature request
about: Request a new functionality for a site
title: ''
---

<!--

######################################################################
  WARNING!
  IGNORING THE FOLLOWING TEMPLATE WILL RESULT IN ISSUE CLOSED AS INCOMPLETE
######################################################################

-->

## Checklist

<!--
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of youtube-dl:
- First of, make sure you are using the latest version of youtube-dl. Run `youtube-dl --version` and ensure your version is 2020.09.20. If it's not, see https://yt-dl.org/update on how to update. Issues with outdated version will be REJECTED.
- Search the bugtracker for similar site feature requests: http://yt-dl.org/search-issues. DO NOT post duplicates.
- Finally, put x into all relevant boxes (like this [x])
-->

- [ ] I'm reporting a site feature request
- [ ] I've verified that I'm running youtube-dl version **2020.09.20**
- [ ] I've searched the bugtracker for similar site feature requests including closed ones

## Description

<!--
Provide an explanation of your site feature request in an arbitrary form. Please make sure the description is worded well enough to be understood, see https://github.com/ytdl-org/youtube-dl#is-the-description-of-the-issue-itself-sufficient. Provide any additional information, suggested solution and as much context and examples as possible.
-->

WRITE DESCRIPTION HERE


code:
---
name: Bug report
about: Report a bug unrelated to any particular site or extractor
title: ''
---

<!--

######################################################################
  WARNING!
  IGNORING THE FOLLOWING TEMPLATE WILL RESULT IN ISSUE CLOSED AS INCOMPLETE
######################################################################

-->

## Checklist

<!--
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of youtube-dl:
- First of, make sure you are using the latest version of youtube-dl. Run `youtube-dl --version` and ensure your version is 2020.09.20. If it's not, see https://yt-dl.org/update on how to update. Issues with outdated version will be REJECTED.
- Make sure that all provided video/audio/playlist URLs (if any) are alive and playable in a browser.
- Make sure that all URLs and arguments with special characters are properly quoted or escaped as explained in http://yt-dl.org/escape.
- Search the bugtracker for similar issues: http://yt-dl.org/search-issues. DO NOT post duplicates.
- Read bugs section in FAQ: http://yt-dl.org/reporting
- Finally, put x into all relevant boxes (like this [x])
-->

- [ ] I'm reporting a broken site support issue
- [ ] I've verified that I'm running youtube-dl version **2020.09.20**
- [ ] I've checked that all provided URLs are alive and playable in a browser
- [ ] I've checked that all URLs and arguments with special characters are properly quoted or escaped
- [ ] I've searched the bugtracker for similar bug reports including closed ones
- [ ] I've read bugs section in FAQ

## Verbose log

<!--
Provide the complete verbose output of youtube-dl that clearly demonstrates the problem.
Add the `-v` flag to your command line you run youtube-dl with (`youtube-dl -v <your command line>`), copy the WHOLE output and insert it below. It should look similar to this:
 [debug] System config: []
 [debug] User config: []
 [debug] Command-line args: [u'-v', u'http://www.youtube.com/watch?v=BaW_jenozKcj']
 [debug] Encodings: locale cp1251, fs mbcs, out cp866, pref cp1251
 [debug] youtube-dl version 2020.09.20
 [debug] Python version 2.7.11 - Windows-2003Server-5.2.3790-SP2
 [debug] exe versions: ffmpeg N-75573-g1d0487f, ffprobe N-75573-g1d0487f, rtmpdump 2.4
 [debug] Proxy map: {}
 <more lines>
-->

```
PASTE VERBOSE LOG HERE
```

## Description

<!--
Provide an explanation of your issue in an arbitrary form. Please make sure the description is worded well enough to be understood, see https://github.com/ytdl-org/youtube-dl#is-the-description-of-the-issue-itself-sufficient. Provide any additional information, suggested solution and as much context and examples as possible.
If work on your issue requires account credentials please provide them or explain how one can obtain them.
-->

WRITE DESCRIPTION HERE


code:
---
name: Feature request
about: Request a new functionality unrelated to any particular site or extractor
title: ''
labels: 'request'
---

<!--

######################################################################
  WARNING!
  IGNORING THE FOLLOWING TEMPLATE WILL RESULT IN ISSUE CLOSED AS INCOMPLETE
######################################################################

-->

## Checklist

<!--
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of youtube-dl:
- First of, make sure you are using the latest version of youtube-dl. Run `youtube-dl --version` and ensure your version is 2020.09.20. If it's not, see https://yt-dl.org/update on how to update. Issues with outdated version will be REJECTED.
- Search the bugtracker for similar feature requests: http://yt-dl.org/search-issues. DO NOT post duplicates.
- Finally, put x into all relevant boxes (like this [x])
-->

- [ ] I'm reporting a feature request
- [ ] I've verified that I'm running youtube-dl version **2020.09.20**
- [ ] I've searched the bugtracker for similar feature requests including closed ones

## Description

<!--
Provide an explanation of your issue in an arbitrary form. Please make sure the description is worded well enough to be understood, see https://github.com/ytdl-org/youtube-dl#is-the-description-of-the-issue-itself-sufficient. Provide any additional information, suggested solution and as much context and examples as possible.
-->

WRITE DESCRIPTION HERE


code:
---
name: Ask question
about: Ask youtube-dl related question
title: ''
labels: 'question'
---

<!--

######################################################################
  WARNING!
  IGNORING THE FOLLOWING TEMPLATE WILL RESULT IN ISSUE CLOSED AS INCOMPLETE
######################################################################

-->

## Checklist

<!--
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of youtube-dl:
- Look through the README (http://yt-dl.org/readme) and FAQ (http://yt-dl.org/faq) for similar questions
- Search the bugtracker for similar questions: http://yt-dl.org/search-issues
- Finally, put x into all relevant boxes (like this [x])
-->

- [ ] I'm asking a question
- [ ] I've looked through the README and FAQ for similar questions
- [ ] I've searched the bugtracker for similar questions including closed ones

## Question

<!--
Ask your question in an arbitrary form. Please make sure it's worded well enough to be understood, see https://github.com/ytdl-org/youtube-dl#is-the-description-of-the-issue-itself-sufficient.
-->

WRITE QUESTION HERE


code:
---
name: Broken site support
about: Report broken or misfunctioning site
title: ''
---

<!--

######################################################################
  WARNING!
  IGNORING THE FOLLOWING TEMPLATE WILL RESULT IN ISSUE CLOSED AS INCOMPLETE
######################################################################

-->

## Checklist

<!--
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of youtube-dl:
- First of, make sure you are using the latest version of youtube-dl. Run `youtube-dl --version` and ensure your version is %(version)s. If it's not, see https://yt-dl.org/update on how to update. Issues with outdated version will be REJECTED.
- Make sure that all provided video/audio/playlist URLs (if any) are alive and playable in a browser.
- Make sure that all URLs and arguments with special characters are properly quoted or escaped as explained in http://yt-dl.org/escape.
- Search the bugtracker for similar issues: http://yt-dl.org/search-issues. DO NOT post duplicates.
- Finally, put x into all relevant boxes (like this [x])
-->

- [ ] I'm reporting a broken site support
- [ ] I've verified that I'm running youtube-dl version **%(version)s**
- [ ] I've checked that all provided URLs are alive and playable in a browser
- [ ] I've checked that all URLs and arguments with special characters are properly quoted or escaped
- [ ] I've searched the bugtracker for similar issues including closed ones

## Verbose log

<!--
Provide the complete verbose output of youtube-dl that clearly demonstrates the problem.
Add the `-v` flag to your command line you run youtube-dl with (`youtube-dl -v <your command line>`), copy the WHOLE output and insert it below. It should look similar to this:
 [debug] System config: []
 [debug] User config: []
 [debug] Command-line args: [u'-v', u'http://www.youtube.com/watch?v=BaW_jenozKcj']
 [debug] Encodings: locale cp1251, fs mbcs, out cp866, pref cp1251
 [debug] youtube-dl version %(version)s
 [debug] Python version 2.7.11 - Windows-2003Server-5.2.3790-SP2
 [debug] exe versions: ffmpeg N-75573-g1d0487f, ffprobe N-75573-g1d0487f, rtmpdump 2.4
 [debug] Proxy map: {}
 <more lines>
-->

```
PASTE VERBOSE LOG HERE
```

## Description

<!--
Provide an explanation of your issue in an arbitrary form. Provide any additional information, suggested solution and as much context and examples as possible.
If work on your issue requires account credentials please provide them or explain how one can obtain them.
-->

WRITE DESCRIPTION HERE


code:
---
name: Site support request
about: Request support for a new site
title: ''
labels: 'site-support-request'
---

<!--

######################################################################
  WARNING!
  IGNORING THE FOLLOWING TEMPLATE WILL RESULT IN ISSUE CLOSED AS INCOMPLETE
######################################################################

-->

## Checklist

<!--
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of youtube-dl:
- First of, make sure you are using the latest version of youtube-dl. Run `youtube-dl --version` and ensure your version is %(version)s. If it's not, see https://yt-dl.org/update on how to update. Issues with outdated version will be REJECTED.
- Make sure that all provided video/audio/playlist URLs (if any) are alive and playable in a browser.
- Make sure that site you are requesting is not dedicated to copyright infringement, see https://yt-dl.org/copyright-infringement. youtube-dl does not support such sites. In order for site support request to be accepted all provided example URLs should not violate any copyrights.
- Search the bugtracker for similar site support requests: http://yt-dl.org/search-issues. DO NOT post duplicates.
- Finally, put x into all relevant boxes (like this [x])
-->

- [ ] I'm reporting a new site support request
- [ ] I've verified that I'm running youtube-dl version **%(version)s**
- [ ] I've checked that all provided URLs are alive and playable in a browser
- [ ] I've checked that none of provided URLs violate any copyrights
- [ ] I've searched the bugtracker for similar site support requests including closed ones

## Example URLs

<!--
Provide all kinds of example URLs support for which should be included. Replace following example URLs by yours.
-->

- Single video: https://www.youtube.com/watch?v=BaW_jenozKc
- Single video: https://youtu.be/BaW_jenozKc
- Playlist: https://www.youtube.com/playlist?list=PL4lCao7KL_QFVb7Iudeipvc2BCavECqzc

## Description

<!--
Provide any additional information.
If work on your issue requires account credentials please provide them or explain how one can obtain them.
-->

WRITE DESCRIPTION HERE


code:
---
name: Site feature request
about: Request a new functionality for a site
title: ''
---

<!--

######################################################################
  WARNING!
  IGNORING THE FOLLOWING TEMPLATE WILL RESULT IN ISSUE CLOSED AS INCOMPLETE
######################################################################

-->

## Checklist

<!--
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of youtube-dl:
- First of, make sure you are using the latest version of youtube-dl. Run `youtube-dl --version` and ensure your version is %(version)s. If it's not, see https://yt-dl.org/update on how to update. Issues with outdated version will be REJECTED.
- Search the bugtracker for similar site feature requests: http://yt-dl.org/search-issues. DO NOT post duplicates.
- Finally, put x into all relevant boxes (like this [x])
-->

- [ ] I'm reporting a site feature request
- [ ] I've verified that I'm running youtube-dl version **%(version)s**
- [ ] I've searched the bugtracker for similar site feature requests including closed ones

## Description

<!--
Provide an explanation of your site feature request in an arbitrary form. Please make sure the description is worded well enough to be understood, see https://github.com/ytdl-org/youtube-dl#is-the-description-of-the-issue-itself-sufficient. Provide any additional information, suggested solution and as much context and examples as possible.
-->

WRITE DESCRIPTION HERE


code:
---
name: Bug report
about: Report a bug unrelated to any particular site or extractor
title: ''
---

<!--

######################################################################
  WARNING!
  IGNORING THE FOLLOWING TEMPLATE WILL RESULT IN ISSUE CLOSED AS INCOMPLETE
######################################################################

-->

## Checklist

<!--
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of youtube-dl:
- First of, make sure you are using the latest version of youtube-dl. Run `youtube-dl --version` and ensure your version is %(version)s. If it's not, see https://yt-dl.org/update on how to update. Issues with outdated version will be REJECTED.
- Make sure that all provided video/audio/playlist URLs (if any) are alive and playable in a browser.
- Make sure that all URLs and arguments with special characters are properly quoted or escaped as explained in http://yt-dl.org/escape.
- Search the bugtracker for similar issues: http://yt-dl.org/search-issues. DO NOT post duplicates.
- Read bugs section in FAQ: http://yt-dl.org/reporting
- Finally, put x into all relevant boxes (like this [x])
-->

- [ ] I'm reporting a broken site support issue
- [ ] I've verified that I'm running youtube-dl version **%(version)s**
- [ ] I've checked that all provided URLs are alive and playable in a browser
- [ ] I've checked that all URLs and arguments with special characters are properly quoted or escaped
- [ ] I've searched the bugtracker for similar bug reports including closed ones
- [ ] I've read bugs section in FAQ

## Verbose log

<!--
Provide the complete verbose output of youtube-dl that clearly demonstrates the problem.
Add the `-v` flag to your command line you run youtube-dl with (`youtube-dl -v <your command line>`), copy the WHOLE output and insert it below. It should look similar to this:
 [debug] System config: []
 [debug] User config: []
 [debug] Command-line args: [u'-v', u'http://www.youtube.com/watch?v=BaW_jenozKcj']
 [debug] Encodings: locale cp1251, fs mbcs, out cp866, pref cp1251
 [debug] youtube-dl version %(version)s
 [debug] Python version 2.7.11 - Windows-2003Server-5.2.3790-SP2
 [debug] exe versions: ffmpeg N-75573-g1d0487f, ffprobe N-75573-g1d0487f, rtmpdump 2.4
 [debug] Proxy map: {}
 <more lines>
-->

```
PASTE VERBOSE LOG HERE
```

## Description

<!--
Provide an explanation of your issue in an arbitrary form. Please make sure the description is worded well enough to be understood, see https://github.com/ytdl-org/youtube-dl#is-the-description-of-the-issue-itself-sufficient. Provide any additional information, suggested solution and as much context and examples as possible.
If work on your issue requires account credentials please provide them or explain how one can obtain them.
-->

WRITE DESCRIPTION HERE


code:
---
name: Feature request
about: Request a new functionality unrelated to any particular site or extractor
title: ''
labels: 'request'
---

<!--

######################################################################
  WARNING!
  IGNORING THE FOLLOWING TEMPLATE WILL RESULT IN ISSUE CLOSED AS INCOMPLETE
######################################################################

-->

## Checklist

<!--
Carefully read and work through this check list in order to prevent the most common mistakes and misuse of youtube-dl:
- First of, make sure you are using the latest version of youtube-dl. Run `youtube-dl --version` and ensure your version is %(version)s. If it's not, see https://yt-dl.org/update on how to update. Issues with outdated version will be REJECTED.
- Search the bugtracker for similar feature requests: http://yt-dl.org/search-issues. DO NOT post duplicates.
- Finally, put x into all relevant boxes (like this [x])
-->

- [ ] I'm reporting a feature request
- [ ] I've verified that I'm running youtube-dl version **%(version)s**
- [ ] I've searched the bugtracker for similar feature requests including closed ones

## Description

<!--
Provide an explanation of your issue in an arbitrary form. Please make sure the description is worded well enough to be understood, see https://github.com/ytdl-org/youtube-dl#is-the-description-of-the-issue-itself-sufficient. Provide any additional information, suggested solution and as much context and examples as possible.
-->

WRITE DESCRIPTION HERE


code:
## Please follow the guide below

- You will be asked some questions, please read them **carefully** and answer honestly
- Put an `x` into all the boxes [ ] relevant to your *pull request* (like that [x])
- Use *Preview* tab to see how your *pull request* will actually look like

---

### Before submitting a *pull request* make sure you have:
- [ ] At least skimmed through [adding new extractor tutorial](https://github.com/ytdl-org/youtube-dl#adding-support-for-a-new-site) and [youtube-dl coding conventions](https://github.com/ytdl-org/youtube-dl#youtube-dl-coding-conventions) sections
- [ ] [Searched](https://github.com/ytdl-org/youtube-dl/search?q=is%3Apr&type=Issues) the bugtracker for similar pull requests
- [ ] Checked the code with [flake8](https://pypi.python.org/pypi/flake8)

### In order to be accepted and merged into youtube-dl each piece of code must be in public domain or released under [Unlicense](http://unlicense.org/). Check one of the following options:
- [ ] I am the original author of this code and I am willing to release it under [Unlicense](http://unlicense.org/)
- [ ] I am not the original author of this code but it is in public domain or released under [Unlicense](http://unlicense.org/) (provide reliable evidence)

### What is the purpose of your *pull request*?
- [ ] Bug fix
- [ ] Improvement
- [ ] New extractor
- [ ] New feature

---

### Description of your *pull request* and other information

Explanation of your *pull request* in arbitrary form goes here. Please make sure the description explains the purpose and effect of your *pull request* and is worded well enough to be understood. Provide as much context and examples as possible.


code:
*.pyc
*.pyo
*.class
*~
*.DS_Store
wine-py2exe/
py2exe.log
*.kate-swp
build/
dist/
MANIFEST
README.txt
youtube-dl.1
youtube-dl.bash-completion
youtube-dl.fish
youtube_dl/extractor/lazy_extractors.py
youtube-dl
youtube-dl.exe
youtube-dl.tar.gz
.coverage
cover/
updates_key.pem
*.egg-info
*.srt
*.ttml
*.sbv
*.vtt
*.flv
*.mp4
*.m4a
*.m4v
*.mp3
*.3gp
*.wav
*.ape
*.mkv
*.swf
*.part
*.ytdl
*.swp
test/local_parameters.json
.tox
youtube-dl.zsh

# IntelliJ related files
.idea
*.iml

tmp/
venv/

# VS Code related files
.vscode

path: .gitignore


code:
language: python
python:
  - "2.6"
  - "2.7"
  - "3.2"
  - "3.3"
  - "3.4"
  - "3.5"
  - "3.6"
  - "pypy"
  - "pypy3"
dist: trusty
env:
  - YTDL_TEST_SET=core
  - YTDL_TEST_SET=download
jobs:
  include:
    - python: 3.7
      dist: xenial
      env: YTDL_TEST_SET=core
    - python: 3.7
      dist: xenial
      env: YTDL_TEST_SET=download
    - python: 3.8
      dist: xenial
      env: YTDL_TEST_SET=core
    - python: 3.8
      dist: xenial
      env: YTDL_TEST_SET=download
    - python: 3.8-dev
      dist: xenial
      env: YTDL_TEST_SET=core
    - python: 3.8-dev
      dist: xenial
      env: YTDL_TEST_SET=download
    - env: JYTHON=true; YTDL_TEST_SET=core
    - env: JYTHON=true; YTDL_TEST_SET=download
    - name: flake8
      python: 3.8
      dist: xenial
      install: pip install flake8
      script: flake8 .
  fast_finish: true
  allow_failures:
    - env: YTDL_TEST_SET=download
    - env: JYTHON=true; YTDL_TEST_SET=core
    - env: JYTHON=true; YTDL_TEST_SET=download
before_install:
  - if [ "$JYTHON" == "true" ]; then ./devscripts/install_jython.sh; export PATH="$HOME/jython/bin:$PATH"; fi
script: ./devscripts/run_tests.sh


code:
Ricardo Garcia Gonzalez
Danny Colligan
Benjamin Johnson
Vasyl' Vavrychuk
Witold Baryluk
Paweł Paprota
Gergely Imreh
Rogério Brito
Philipp Hagemeister
Sören Schulze
Kevin Ngo
Ori Avtalion
shizeeg
Filippo Valsorda
Christian Albrecht
Dave Vasilevsky
Jaime Marquínez Ferrándiz
Jeff Crouse
Osama Khalid
Michael Walter
M. Yasoob Ullah Khalid
Julien Fraichard
Johny Mo Swag
Axel Noack
Albert Kim
Pierre Rudloff
Huarong Huo
Ismael Mejía
Steffan Donal
Andras Elso
Jelle van der Waa
Marcin Cieślak
Anton Larionov
Takuya Tsuchida
Sergey M.
Michael Orlitzky
Chris Gahan
Saimadhav Heblikar
Mike Col
Oleg Prutz
pulpe
Andreas Schmitz
Michael Kaiser
Niklas Laxström
David Triendl
Anthony Weems
David Wagner
Juan C. Olivares
Mattias Harrysson
phaer
Sainyam Kapoor
Nicolas Évrard
Jason Normore
Hoje Lee
Adam Thalhammer
Georg Jähnig
Ralf Haring
Koki Takahashi
Ariset Llerena
Adam Malcontenti-Wilson
Tobias Bell
Naglis Jonaitis
Charles Chen
Hassaan Ali
Dobrosław Żybort
David Fabijan
Sebastian Haas
Alexander Kirk
Erik Johnson
Keith Beckman
Ole Ernst
Aaron McDaniel (mcd1992)
Magnus Kolstad
Hari Padmanaban
Carlos Ramos
5moufl
lenaten
Dennis Scheiba
Damon Timm
winwon
Xavier Beynon
Gabriel Schubiner
xantares
Jan Matějka
Mauroy Sébastien
William Sewell
Dao Hoang Son
Oskar Jauch
Matthew Rayfield
t0mm0
Tithen-Firion
Zack Fernandes
cryptonaut
Adrian Kretz
Mathias Rav
Petr Kutalek
Will Glynn
Max Reimann
Cédric Luthi
Thijs Vermeir
Joel Leclerc
Christopher Krooss
Ondřej Caletka
Dinesh S
Johan K. Jensen
Yen Chi Hsuan
Enam Mijbah Noor
David Luhmer
Shaya Goldberg
Paul Hartmann
Frans de Jonge
Robin de Rooij
Ryan Schmidt
Leslie P. Polzer
Duncan Keall
Alexander Mamay
Devin J. Pohly
Eduardo Ferro Aldama
Jeff Buchbinder
Amish Bhadeshia
Joram Schrijver
Will W.
Mohammad Teimori Pabandi
Roman Le Négrate
Matthias Küch
Julian Richen
Ping O.
Mister Hat
Peter Ding
jackyzy823
George Brighton
Remita Amine
Aurélio A. Heckert
Bernhard Minks
sceext
Zach Bruggeman
Tjark Saul
slangangular
Behrouz Abbasi
ngld
nyuszika7h
Shaun Walbridge
Lee Jenkins
Anssi Hannula
Lukáš Lalinský
Qijiang Fan
Rémy Léone
Marco Ferragina
reiv
Muratcan Simsek
Evan Lu
flatgreen
Brian Foley
Vignesh Venkat
Tom Gijselinck
Founder Fang
Andrew Alexeyew
Saso Bezlaj
Erwin de Haan
Jens Wille
Robin Houtevelts
Patrick Griffis
Aidan Rowe
mutantmonkey
Ben Congdon
Kacper Michajłow
José Joaquín Atria
Viťas Strádal
Kagami Hiiragi
Philip Huppert
blahgeek
Kevin Deldycke
inondle
Tomáš Čech
Déstin Reed
Roman Tsiupa
Artur Krysiak
Jakub Adam Wieczorek
Aleksandar Topuzović
Nehal Patel
Rob van Bekkum
Petr Zvoníček
Pratyush Singh
Aleksander Nitecki
Sebastian Blunt
Matěj Cepl
Xie Yanbo
Philip Xu
John Hawkinson
Rich Leeper
Zhong Jianxin
Thor77
Mattias Wadman
Arjan Verwer
Costy Petrisor
Logan B
Alex Seiler
Vijay Singh
Paul Hartmann
Stephen Chen
Fabian Stahl
Bagira
Odd Stråbø
Philip Herzog
Thomas Christlieb
Marek Rusinowski
Tobias Gruetzmacher
Olivier Bilodeau
Lars Vierbergen
Juanjo Benages
Xiao Di Guan
Thomas Winant
Daniel Twardowski
Jeremie Jarosh
Gerard Rovira
Marvin Ewald
Frédéric Bournival
Timendum
gritstub
Adam Voss
Mike Fährmann
Jan Kundrát
Giuseppe Fabiano
Örn Guðjónsson
Parmjit Virk
Genki Sky
Ľuboš Katrinec
Corey Nicholson
Ashutosh Chaudhary
John Dong
Tatsuyuki Ishi
Daniel Weber
Kay Bouché
Yang Hongbo
Lei Wang
Petr Novák
Leonardo Taccari
Martin Weinelt
Surya Oktafendri
TingPing
Alexandre Macabies
Bastian de Groot
Niklas Haas
András Veres-Szentkirályi
Enes Solak
Nathan Rossi
Thomas van der Berg
Luca Cherubin

path: AUTHORS