chore(release): 1.0.0 [skip ci]
# 1.0.0 (2022-10-20) ### Bug Fixes * **a11y:** replace active tab color to contrast with background on podcast and episode pages ([f3785e14](f3785e14)) * **activity-pub:** cache issues when navigating to activity stream urls ([7bcbfb32](7bcbfb32)) * **activity-pub:** get database records using new model instances ([92536ddb](92536ddb)) * **activitypub:** add conditions for possibly missing actor properties + add user-agent to requests ([8fbf948f](8fbf948f)) * **activitypub:** add target actor id to like / announce activities to send directly to note's actor ([962dd305](962dd305)) * **activitypub:** add target_actor_id for create activity to broadcast post reply ([0128a21e](0128a21e)) * **activitypub:** allow cors on get requests for routes exposing acitivitypub objects ([2f248099](2f248099)) * **activitypub:** set created_by to null for reblog if no user + update episode oembed data ([209dfbd1](209dfbd1)) * add admin-audio-player to vite config to have admin player show up ([93cb9b24](93cb9b24)) * add application/octet-stream mimetype to mp3 and m4a extensions to prevent ext_in error ([339bef87](339bef87)), closes [#145](#145) * add category_label component to include parent category in about podcast page ([74e7d68a](74e7d68a)) * add explicit int conversion when formatting episode duration ([12530961](12530961)) * add head request to analytics_hit route ([f0a2f0be](f0a2f0be)) * add href to castopod website on login page ([cc542573](cc542573)) * add missing explicit badge for podcasts and episodes ([cdf9f9d5](cdf9f9d5)) * add open graph size for podcast images to replace the inadequate large format ([33aae1f7](33aae1f7)) * add public/media folder to castopod bundle ([8053d352](8053d352)), closes [#52](#52) * add translation key for audio-clipper trim labels ([db191ac3](db191ac3)) * add underline and semibold font weight for prose links to have them stand out ([d4d86712](d4d86712)) * add where condition to get episode count without deleted episodes ([7661734e](7661734e)), closes [#67](#67) * **admin:** save block and lock switches ([b66c0afc](b66c0afc)) * **analytics:** redirect to mp3 file even when referer was not set ([9fc388d1](9fc388d1)) * **analytics:** remove charts empty values + remove useless language cache ([16787941](16787941)) * **analytics:** set duration field to precise decimal as episode's audio file duration ([d7726854](d7726854)) * **analytics:** set initial value for duration and bandwidth ([ee505395](ee505395)) * **analytics:** update migrations to set decimal precision for latitude and longitude ([714d6b5d](714d6b5d)) * **analytics:** update service management so that it works with new OPAWG slug values ([7fe9d425](7fe9d425)) * **audio-clipper:** add mouse position offset when stretching clip to prevent content from jumping ([602654b9](602654b9)) * **audio-clipper:** show audio playing progress + put waveform behind audio clipper ([01a09dc4](01a09dc4)) * **avatar:** use default avatar when no avatar url has been set ([9d23c7e7](9d23c7e7)), closes [#111](#111) * **bundle:** include modules and themes when copying files with rsync ([cd5bb883](cd5bb883)) * **bundle:** update vite input files path + add `set -e` in bash scripts to fail if command fails ([0ee53c71](0ee53c71)) * **cache:** add locale for podcast and episode pages + clear some persisting cache in models ([9cec8a81](9cec8a81)), closes [#42](#42) [#61](#61) * **cache:** delete posts and comments pages cache when updating platform links ([f7c3e5bf](f7c3e5bf)), closes [#169](#169) * **cache:** return a non cached view when connected ([e2e73581](e2e73581)) * **cache:** suffix cache names with authenticated for credits, map and pages ([418a70b2](418a70b2)) * cast actor_id to pass as int to set_interact_as_actor() function ([56a8e5d7](56a8e5d7)) * **category:** remove uncategorized option to enforce users in choosing a category ([8c64f25a](8c64f25a)) * change image size requirement hints ([ea20206e](ea20206e)) * change message upon cancellation of episode publication ([9859c743](9859c743)) * check for database connection and podcasts table existence before redirecting to install ([eb74e81c](eb74e81c)) * check that additional files are valid when creating episode ([eac5bc87](eac5bc87)) * check that note has a preview_card_id before displaying it ([acb8b3a4](acb8b3a4)), closes [#114](#114) * clear cache when deleting podcast banner ([99bb40b8](99bb40b8)) * comment all cache clean after page update to prevent analytics cache deletion ([e6197a49](e6197a49)) * **comments:** add comment view partials for public pages ([fcecbe1c](fcecbe1c)) * correct chart data ([4d3e9c8c](4d3e9c8c)) * correct percona compatibility issue ([e53f8192](e53f8192)) * correct php-fpm issues ([1ef55d73](1ef55d73)) * correct referrer bug ([ed69b2f5](ed69b2f5)) * correction for servers with low int precision ([31b7828e](31b7828e)) * **cors:** add preflight option routes for episode, podcast and status objects ([a281abfd](a281abfd)) * declare typed properties in PHPDoc for php<7.4 ([14dd44d0](14dd44d0)), closes [#23](#23) * define podcast_id and platform_slug as foreign keys in podcasts_plaforms table ([6e9451a1](6e9451a1)) * define podcastNamespaceLink value ([0d744d21](0d744d21)) * **email:** set the correct url in the activation and forgot emails ([10fc6f17](10fc6f17)), closes [#204](#204) * **embeddable-player:** enable any ancestor when X-Frame-Options is set on server ([44a4962e](44a4962e)) * **embed:** open embedded player's links in new tab ([4aa73d71](4aa73d71)) * **episode-form:** show warning to set `memory_limit`, `upload_max_filesize` & `post_max_size` ([3b3c218b](3b3c218b)), closes [#5](#5) [#86](#86) * **episode-unpublish:** set consistent posts_counts' increments/decrements for actors and episodes ([8acdafd2](8acdafd2)), closes [#233](#233) * **episodeCount:** add missing brackets to French language file ([c1b41126](c1b41126)) * **episode:** replace guid's empty string value to null ([441052af](441052af)) * **episodes-page:** handle defaultQuery being null when no podcast episodes ([15183b7e](15183b7e)), closes [#100](#100) * **episodes-table:** set descriptions to be not null ([6774ec10](6774ec10)) * **episodes:** add publication status + set publication date to null when none has been set ([d882981b](d882981b)), closes [#70](#70) * escape characters for `min` in format_duration_symbol ([3b6722a4](3b6722a4)) * escape generated feed tag values and remove new lines from public pages meta description ([6238a438](6238a438)), closes [#57](#57) [#46](#46) * expire default query cache upon scheduled episode publication ([b72e7c86](b72e7c86)), closes [#81](#81) * explicitly cast seconds to int in iso8601_duration helper function ([779653f7](779653f7)) * **fediverse:** set default castopod avatar url when actor avatar is not present ([460f52f7](460f52f7)) * **fediverse:** set model instances as non shared to prevent overlapping ([91128fad](91128fad)) * fix layout bugs in admin and update translation files ([a8341718](a8341718)), closes [#40](#40) * **follow:** add missing helpers to Actor controller ([ee53a732](ee53a732)) * **get_browser_language:** return defaultLocale if browser doesn't send user preferred language ([9cc29962](9cc29962)) * handle HEAD requests on podcast_feed route ([74b2640f](74b2640f)), closes [#79](#79) * **home:** remove hardcoded prefix in getAllPodcasts query ([92d5cc50](92d5cc50)) * **housekeeping:** replace the use of GLOB_BRACE with looping over file extensions ([42d92d0c](42d92d0c)), closes [#154](#154) * **housekeeping:** set default sizes value + ignore illegal IFD size error to proceed with script ([f21ca576](f21ca576)) * **housekeeping:** use EpisodeModel's builder to reset comments count ([65e9c0b0](65e9c0b0)) * **htaccess:** add ? after index.php in RewriteRule ([d9d139ee](d9d139ee)), closes [#152](#152) * **http-signature:** update SIGNATURE_PATTERN allowing signature keys to be sent in any order ([b7f285e4](b7f285e4)) * **images:** set default mimetype if none is specified when getting size info ([6e4acc64](6e4acc64)) * **import-with-escaped-characters:** remove \CodeIgniter\HTTP\URI in download_file, closes [#103](#103) ([35b5be09](35b5be09)) * **import:** add extension when downloading file without + truncate slug if too long ([c5f18bb6](c5f18bb6)) * **import:** add validation for handle field to prevent Router.invalidParameterType error ([5bf7200f](5bf7200f)), closes [#119](#119) * **import:** cast description's SimpleXMLElement to string ([02d17be4](02d17be4)) * **import:** remove query string from files url ([109c4aa1](109c4aa1)) * **import:** save media files during podcast import + set missing media fields ([a9989d84](a9989d84)) * **import:** set default episode type if not set ([d7250ab0](d7250ab0)) * **import:** set episode and season numbers to null when not present in item tag ([3211398c](3211398c)) * **import:** use <image><url> tag when no <itunes:image> is present ([20e607af](20e607af)) * include missing variables on public ui's episode page and remote_actions ([193b373b](193b373b)) * **input-component:** unset required attribute to prevent rendering it when false ([db9ac138](db9ac138)) * **install:** add password validation when creating super admin ([5a2ca0cc](5a2ca0cc)) * **install:** redirect manually to install wizard on first visit ([2ceaaca4](2ceaaca4)) * **install:** redirect to host_url install route on instanceConfig validation error ([99250b18](99250b18)) * **install:** redirect to input baseUrl after instance config ([2426af7d](2426af7d)), closes [#53](#53) * **install:** set message block on forms to show error messages ([3a0a20d5](3a0a20d5)), closes [#157](#157) * **interact-as:** set actor_id instead of podcast id upon login event ([5dfade7c](5dfade7c)), closes [#104](#104) * **json-ld:** add missing properties to PodcastSeries object ([e97266c5](e97266c5)) * keep subtitle line breaks when parsing srt file to json ([cfb3da65](cfb3da65)) * **layouts:** replace holy-grail layout with tailwind config + widen public podcast layout ([be5a2878](be5a2878)) * **map:** update episode markers query to discard unpublished episodes ([b3caac45](b3caac45)) * **markdown-editor:** remove unnecessary buttons for podcast and episode editors + add extensions ([9c4f60e0](9c4f60e0)) * **md-editor:** build new markdown editor with lit + github/markdown-toolbar-element ([9ec1cb93](9ec1cb93)), closes [#93](#93) [#94](#94) [#120](#120) * **migrations:** ignore invalid utf8 chars for media files metadata + update transcript parser ([45e8f99e](45e8f99e)) * minor corrections ([13be3868](13be3868)) * move analytics to helper ([d3119173](d3119173)) * move html escaping on credits page ([fbffdbde](fbffdbde)) * **multiselect:** add missing class names in choices options for purge to work properly ([719538d0](719538d0)) * **notifications:** add trigger after activities update + update insert trigger ([e5d16e87](e5d16e87)) * **notifications:** notify actors after activities insert / update using model callback methods ([e08555a4](e08555a4)) * **open-graph:** replace non existant episode description to podcast description in podcast page ([b02584ee](b02584ee)) * overwrite common lang function to escape returned string ([4c490c15](4c490c15)), closes [#196](#196) [#198](#198) * overwrite getActorById to return app's Actor entity ([f2bc2f7e](f2bc2f7e)) * **package.json:** update destination of postcss generation scripts ([21413f8a](21413f8a)) * **pages:** add locale to page cache ([8f999ce2](8f999ce2)) * **partner:** set correct image URL ([61554be1](61554be1)) * pass timezone to relative time component to show the localized time in the UI ([b9db9364](b9db9364)) * **persons:** prevent overflow of persons list by adding horizontal scroll ([9e8995dc](9e8995dc)) * **persons:** set person picture as optional for better ux ([7fdea63d](7fdea63d)), closes [#125](#125) * **platforms:** display platform link only when visible is toggled on ([6e503c8d](6e503c8d)), closes [#39](#39) * **player-styling:** revert vite to 2.8 to reference the player css ([e07d3afe](e07d3afe)) * **podcast-activity:** check if transcript and chapters are set before including them in audio ([5855a250](5855a250)) * **podcast-import:** move guid attribute declaration for Episode entity to include slug data ([5d02ae39](5d02ae39)) * **podcast:** use markdown description value for editor + set prose class to about description ([f304d97b](f304d97b)), closes [#156](#156) * prefill description footer input when creating a new episode ([9ea5ca31](9ea5ca31)) * **premium-podcasts:** display unlock button in embed when premium episode ([ca109ba3](ca109ba3)) * **premium-podcasts:** remove cache in unlock form + redirect to podcast if podcast is not premium ([242352c4](242352c4)) * **premium-podcasts:** return different cached page when podcast is unlocked ([b1303c52](b1303c52)) * **pwa:** add scope to webmanifests to allow installing an app per podcast ([74c683eb](74c683eb)) * **pwa:** set app display as standalone in the webmanifests ([7aa37d24](7aa37d24)) * re-order graph values ([35f633b4](35f633b4)) * redirect to non cached views when authenticated in public views ([482b47ba](482b47ba)) * **release:** add missing version number to castopod-host package ([8f3e9d90](8f3e9d90)) * remove cache from remote follow form to display error messages ([90e44437](90e44437)) * remove defer from js script declaration as it is a module ([18ae557e](18ae557e)) * remove fixed size from podcast sidebar + rearrange account info + space out import radio inputs ([776eec6f](776eec6f)) * remove heavy image cover data from audio file metadata ([f74403bd](f74403bd)) * remove required for other_categories field and add podcast_id to latest podcasts query ([5417be00](5417be00)) * remove required property to persons picture ([c546be38](c546be38)), closes [#125](#125) * remove value escaping for form inputs and textareas ([bc6dea2f](bc6dea2f)) * rename field status to task_status to get scheduled activities ([4ff82a5f](4ff82a5f)) * rename issue_templates labels ([9f003058](9f003058)) * rename MyAccount controller file ([e109df30](e109df30)), closes [#60](#60) * rename podcast name to podcast handle to clarify field usage ([9dd4c774](9dd4c774)), closes [#126](#126) * reorder fields as composite primary keys for analytics tables ([9660aa97](9660aa97)) * replace deletedField with published_at for episodes ([14d7d078](14d7d078)) * replace getWebEnclosureUrl with getEnclosureWebUrl ([8122ceaf](8122ceaf)) * replace hardcoded style links with vite service + set default value for remote transcript url ([3f2e0560](3f2e0560)), closes [#149](#149) [#150](#150) * replace website key for webpages in breadcrumb translate file ([50e32ff7](50e32ff7)) * restore default podcast icon on public website ([342778ba](342778ba)) * revert to beta.1's codeigniter4 version ([e8314112](e8314112)) * rewrite regenerate image function to use saveSizes method from Image entity ([38899124](38899124)) * **router:** check if Accept header is set before getting value ([10a2ae02](10a2ae02)), closes [#228](#228) * **router:** trim URI slash to match same routes for URIs with and without trailing slash ([9e9375f9](9e9375f9)) * **rss-import:** add Castopod user-agent, handle redirects for downloaded files, add Content namespace ([214243b3](214243b3)) * **rss:** cast number type values to string in rss_helper ([7180ae9e](7180ae9e)), closes [#148](#148) * **rss:** do not escape podcast and episode titles in the xml ([0dd3b7e0](0dd3b7e0)), closes [#138](#138) [#71](#71) * **rss:** remove escaping for publisher and owner name ([6fc63478](6fc63478)) * **rss:** round episode durations and soundbites ([c9fb987f](c9fb987f)), closes [#214](#214) * **rss:** set ❬itunes:author❭ tag to owner_name if publisher not specified ([2271c144](2271c144)), closes [#96](#96) * **rss:** use originalPath instead of originalMediaPath in Image library ([b4012b7d](b4012b7d)) * save transcript and chapters files to podcasts folder ([63f49c71](63f49c71)) * **search-episodes:** add fallback sql query using LIKE for search query with less than 4 characters ([e66bf443](e66bf443)), closes [#236](#236) * **security:** add csrf filter + prevent xss attacks by escaping user input ([cd2e1e1d](cd2e1e1d)) * set cache expiration to next note publish to show note on publication date ([0a66de3e](0a66de3e)) * set episode description footer to null when empty value ([3a7d97d6](3a7d97d6)) * set episode duration translation to hardcoded english ([c39efc94](c39efc94)), closes [#64](#64) * set episode guid upon episode creation ([ad8b153f](ad8b153f)), closes [#48](#48) * set episode numbers during import + remove all custom form_helpers + minor ui issues ([99a3b8d3](99a3b8d3)) * set interact_as_actor for user upon password reset ([ad8f5f5a](ad8f5f5a)), closes [#178](#178) * set localized slug_field key as string in french language ([17fb29b2](17fb29b2)) * set location to null when getting empty string ([71b1b5f7](71b1b5f7)) * set storage limit as disk_total_space instead of free space ([7512e2ed](7512e2ed)) * **settings:** add .jpg extension to site-icon file input to display all jpeg images ([f611a16c](f611a16c)) * **socialinteract:** move social interact uri into uri attribute + update social data upon import ([12b22008](12b22008)) * sort episodes by published_at with unpublished episodes at the begining ([1686f840](1686f840)), closes [#249](#249) * sort episodic podcasts by season ([d7b6794f](d7b6794f)) * **themes:** update themes stylesheet route and remove css extension ([e4e7e000](e4e7e000)) * **types:** update fake seeders types + fix bugs ([76a4bf34](76a4bf34)) * **ui:** remove empty tooltip when hovering on sponsor button ([40aa6612](40aa6612)) * unpublish episode before deleting it + add validation step before deletion ([f75bd764](f75bd764)), closes [#112](#112) [#55](#55) * update .htaccess for shared hosting config ([23798263](23798263)) * update broken contributor dropdown fields ([e5b75150](e5b75150)) * update condition in AnalyticsTrait ([fbc0967c](fbc0967c)) * update condition in home controller to redirect to install page ([33f1b91d](33f1b91d)) * update conditions when checking for empty max_episodes and season_number ([fbad0b59](fbad0b59)) * update form_textarea to prevent escaping value ([78548b5c](78548b5c)) * update iso-369 language table seeder ([0c90db44](0c90db44)) * update ivoox podcasting icon ([f2b69a47](f2b69a47)) * update MarkdownEditor component + restyle Button and other components ([b05d177f](b05d177f)) * update purgecss content path for php helper files ([eb70bb4f](eb70bb4f)), closes [#59](#59) * update translations for settings' tasks to include what they should be used for ([06b1a8b2](06b1a8b2)) * use slash instead of backslash to call layout ([a80adb22](a80adb22)) * use UTC_TIMESTAMP() to get current utc date instead of NOW() in sql queries ([4e22a0d5](4e22a0d5)) * **users:** remove required roles input when editing user + prevent owner's roles from being edited ([1c8af755](1c8af755)), closes [#239](#239) * **ux:** allow for empty message upon episode publication and warn user on submit ([33d01b8d](33d01b8d)), closes [#129](#129) * **ux:** have podcast dashboard card link to podcast dashboard if only one podcast in instance ([7dabee58](7dabee58)) * **ux:** redirect user to install page on database error in home page ([9017e30b](9017e30b)) * validate slug length when submitting episode form + clean permalink edit prefix ([b07ac093](b07ac093)) * **video-clips:** check if created video exists before recreating it and failing ([dff12087](dff12087)) * **video-clips:** clear video clip cache after process has finished ([3ae62325](3ae62325)) * **video-clips:** create unique temporary files for resources to be deleted after generation ([7f7c878c](7f7c878c)) * **video-clips:** set audio codec to aac, fixing audio issue on twitter ([3c22c68e](3c22c68e)) * **video-clips:** set longer podcast and episode lengths for squared format ([c0301134](c0301134)) * **video-clips:** tweak portrait parameters to have subtitles display without overflowing ([2385b1a2](2385b1a2)) * **video-clips:** update condition to check if ffmpeg is installed ([b57f0b6e](b57f0b6e)), closes [#163](#163) * **xml-editor:** escape xml editor's content + restyle form sections to prevent overflowing ([588590bd](588590bd)) * **xml-editor:** prettify xml even without root node ([ca55c248](ca55c248)) ### Features * **activitypub:** add Podcast actor and PodcastEpisode object with comments ([9e1e5d2e](9e1e5d2e)) * add about page in admin with instance info + database update button ([d0836f3e](d0836f3e)) * add alternate rss feed link tag to podcast page head ([a973c097](a973c097)), closes [#35](#35) * add analytics and unknown useragents ([ec92e65a](ec92e65a)) * add audio-clipper toolbar + add video-clip-previewer ([02557539](02557539)) * add audio-clipper webcomponent (wip) ([21d4251b](21d4251b)) * add autofocus to input field "Email or username" on login page ([19caed4b](19caed4b)) * add basic stats on podcast about page ([16705584](16705584)) * add breadcrumb in admin area ([7fb1de2c](7fb1de2c)), closes [#17](#17) * add cache to ActivityPub sql queries + cache activity and note pages ([2d297f45](2d297f45)) * add CDN url ([972bcbf6](972bcbf6)), closes [#37](#37) * add codemirror to display xml editor for custom rss field ([f15f2624](f15f2624)) * add cumulative listening time charts ([588b4d28](588b4d28)) * add default icons to Alert component ([0d980012](0d980012)) * add DropdownMenu component + remove global audio player in admin ([abb7fbac](abb7fbac)) * add episode_numbering() component helper to display episode and season numbers ([3f4a6bd0](3f4a6bd0)) * add french translation ([196920d6](196920d6)) * add heading component + update ecs rules to fix views ([23bdc6f8](23bdc6f8)) * add housekeeping task to run after migrations ([89dee41d](89dee41d)) * add install wizard form to bootstrap database and create the first superadmin user ([cba871c5](cba871c5)), closes [#2](#2) * add instructions on production error page to ease Castopod debugging process ([9eab54e0](9eab54e0)), closes [#224](#224) * add ISO 3166 country codes ([97cd94b4](97cd94b4)) * add js audio player on podcast, admin and embeddable player pages + fix admon episodes ux ([0e14eb4d](0e14eb4d)), closes [#131](#131) * add label to sponsor button on podcast page ([c29c018c](c29c018c)), closes [#162](#162) * add legalNoticeURL to app config for setting an external url to legal notice ([711843a0](711843a0)) * add lock podcast according to the Podcastindex podcast-namespace to prevent unauthozized import ([72b30127](72b30127)) * add map analytics, add episodes analytics, clean analytics page layout, translate countries ([07eae83a](07eae83a)) * add media entity and link documents, images and audio files to it ([6ecf2866](6ecf2866)) * add notifications inbox for actors ([999999e3](999999e3)), closes [#215](#215) * add Noto Sans Mono font to use for durations + button to access new video clip form in list ([7609bb60](7609bb60)) * add npm for js dependencies + move src/ files to root folder ([cbb83a6f](cbb83a6f)) * add Open Graph and Twitter meta tags ([af970b8b](af970b8b)), closes [#41](#41) * add pages table to store custom instance pages (eg. legal-notice, cookie policy, etc.) ([9c224a8a](9c224a8a)), closes [#24](#24) * add permanent delete feature for podcasts([dbb4030d](dbb4030d)), closes [#89](#89) * add platform models ([a333d291](a333d291)) * add platforms form in podcast settings ([043f49c7](043f49c7)) * add platforms tables ([ce593441](ce593441)) * add podcast banner field for each podcast + refactor images configuration ([4a8147bf](4a8147bf)) * add premium podcasts to manage subscriptions for premium episodes ([3234500e](3234500e)), closes [#193](#193) * add publish feature for podcasts and set draft by default ([3d363f2e](3d363f2e)), closes [#128](#128) [#220](#220) * add remote_url alternative for transcript and chapters files ([3143c9ad](3143c9ad)) * add replied to post or comment to reply element ([d0f9c601](d0f9c601)) * add schema.org json-ld objects to podcasts, episodes, posts and comments pages ([902f959b](902f959b)) * add task to housekeeping setting for resetting all instance counts ([9303e51b](9303e51b)) * add unique listeners analytics ([3a492581](3a492581)) * add update rss feed feature for podcasts to import their latest episodes ([5eb9dc16](5eb9dc16)), closes [#183](#183) * add user permissions and basic groups to handle authorizations ([d58e5187](d58e5187)), closes [#3](#3) [#18](#18) * add WebSub module for pushing feed updates to open hubs ([10d3f737](10d3f737)) * **admin:** add instance wide dashboard with storage and bandwidth usage ([b1a6c02e](b1a6c02e)), closes [#216](#216) * **admin:** add search form in podcast episodes list ([6be5d128](6be5d128)), closes [#26](#26) * **admin:** make header stick on scroll and show title + action buttons using css only ([d60498c1](d60498c1)) * **admin:** update admin layout for better ux + update brand pine colors ([d86142eb](d86142eb)) * allow cross origin requests on episode comments ([e12f95ac](e12f95ac)) * **analytics-gdpr:** update cached personal data to expire at midnight ([0188b673](0188b673)) * **analytics:** add 'other' group to pie charts in order to display more accurate data ([73acef93](73acef93)) * **analytics:** add charts and data export ([78625c47](78625c47)) * **analytics:** add current date and secret salt to analytics hash for improved privacy ([6f2e7c00](6f2e7c00)) * **analytics:** add service name from rss user-agent ([7202b986](7202b986)) * **analytics:** add weekday and hour bar charts ([8ab31329](8ab31329)) * **api:** add rest api with podcasts read endpoints ([e64001d0](e64001d0)), closes [#210](#210) * apply colour theme to embed player ([9548337a](9548337a)), closes [#201](#201) * **auth:** add auth.enable2FA config to enable two-factor authentication ([7213ed29](7213ed29)) * build hashed static files to renew browser cache ([37c54d24](37c54d24)), closes [#107](#107) * **cache:** add podcast and episode pages to cache + clear them after insert or update ([da0f0472](da0f0472)) * **categories:** create model, entity, migrations and seeds ([f73b042c](f73b042c)) * **clips:** setup clip entities and model + save video clip to have it generated in the background ([2f6fdf90](2f6fdf90)) * **comments:** add comments to episodes + update naming of status to post ([bb4752c3](bb4752c3)) * **comments:** add like / undo like to comment + add comment page ([0c187ef7](0c187ef7)) * **components:** add custom view renderer with ComponentRenderer adapted from bonfire2 ([a95de8ba](a95de8ba)) * create optimized & resized images upon upload ([02e4441f](02e4441f)), closes [#6](#6) * **custom-rss:** add custom xml tag injection in rss feed for ❬channel❭ and ❬item❭ ([6ecdaad9](6ecdaad9)) * **datetime-picker:** set material_green theme to flatpickr ([3ce65410](3ce65410)) * **devcontainer:** add devcontainer settings for dev environment ([69e72667](69e72667)) * display castopod version in admin footer ([9f2574e6](9f2574e6)), closes [#68](#68) * display legal disclaimer and warning on podcast import page ([2f07992e](2f07992e)), closes [#34](#34) * edit + delete podcast and episode ([ac5f0c73](ac5f0c73)) * **embeddable-player:** add embeddable player widget ([141788fa](141788fa)) * enhance admin ui with responsive design and ux improvements ([2d44b457](2d44b457)), closes [#31](#31) [#9](#9) * enhance ui using javascript in admin area ([c0e66d5f](c0e66d5f)) * **episode-unpublish:** remove episode comments upon unpublish ([78acd7f5](78acd7f5)) * **episode:** add form to allow editing episode's publication date to a past date ([d783d16e](d783d16e)), closes [#97](#97) * **episodes:** add create form and view pages for episode ([f3b2c8b8](f3b2c8b8)), closes [#1](#1) * **episodes:** add migrations, model and entity for episodes table ([04448217](04448217)) * **episodes:** replace all audio file URL parameters with base64 encoded data ([e1f65cd3](e1f65cd3)) * **episodes:** replace soft delete with permanent delete ([eb9ff522](eb9ff522)) * **episodes:** schedule episode with future publication_date by using cache expiration time ([4f1e773c](4f1e773c)), closes [#47](#47) * **fediverse:** implement activitypub protocols + update user interface ([2f525c0f](2f525c0f)), closes [#69](#69) [#65](#65) [#85](#85) [#51](#51) [#91](#91) [#92](#92) [#88](#88) * **fonts:** replace Montserrat with Inter for better readablity ([bfa11d00](bfa11d00)) * **GDPR:** add GDPR.yml file to public/.well-known/ ([86bccc3d](86bccc3d)) * **gdpr:** add purpose for granting access to premium content ([47d6d81b](47d6d81b)) * **home:** sort podcasts by recent activity + add dropdown menu to choose between sorting options ([7b89da61](7b89da61)), closes [#164](#164) * **housekeeping:** add clear_cache option to flush redis or files cache ([99bfac0b](99bfac0b)) * **i18n:** add 7 new languages + update german translations ([d021abb5](d021abb5)) * **i18n:** add german language as supported locale + create Language files from english source ([c220b310](c220b310)) * **i18n:** add Norwegian Nynorsk to supported locales ([ced61fc2](ced61fc2)) * **i18n:** add Polish translation ([2d83b44a](2d83b44a)) * **i18n:** add Spanish to supported locales ([e340b54a](e340b54a)) * **i18n:** add support for German and Brazilian Portuguese languages ([c9b9fe4e](c9b9fe4e)) * **i18n:** add support for Simplified Chinese (zh-Hans) and Catalan (ca) locales ([48d14434](48d14434)) * **icons:** add default icons for podcasting, social and funding platforms + remove complex icons ([5bcdfebe](5bcdfebe)), closes [#166](#166) [#167](#167) [#170](#170) * **icons:** add podnews icon to podcasting platforms ([5f423557](5f423557)), closes [#190](#190) * import podcast from an rss feed url ([9a5d5a15](9a5d5a15)), closes [#21](#21) * integrate stylized form components and update podcast edit page ([65367295](65367295)) * make displayed publication time as relative time using @github/time-elements ([230e139e](230e139e)) * make episode description more visible on episode pages ([90533be0](90533be0)), closes [#171](#171) * **map:** display geolocated episodes on a map page ([4357cc25](4357cc25)) * **media:** clean media api + create an entity per media type ([fafaa7e6](fafaa7e6)) * **media:** save audio, images, transcripts and chapters to media for episode and persons ([58e2a00a](58e2a00a)) * **meta-tags:** add activitypub alternate links to podcast, episode, comment and post pages ([bd61752b](bd61752b)) * minor corrections to some tables ([3bf9420b](3bf9420b)) * **monetization:** add Web Monetization support ([96a6026f](96a6026f)) * **nodeinfo2:** add .well-known route for nodeinfo2 containing metadata about the castopod instance ([88fddc81](88fddc81)) * **partner:** add link and image in episode description ([ad07bb93](ad07bb93)) * **person:** add podcastindex.org namespace person tag ([8acd011f](8acd011f)) * **platforms:** add AntennaPod ([53e9cfd6](53e9cfd6)) * **platforms:** add Fediverse and some funding platforms, add link on logo ([afc3d502](afc3d502)) * **platforms:** add helloasso ([16cb993e](16cb993e)) * **platforms:** add missing newpodcastapps.com's platforms ([92dd370e](92dd370e)) * **platforms:** add pod.link ([3d7a2320](3d7a2320)) * **platforms:** add Podcast Index ([ad52b1cc](ad52b1cc)) * **platforms:** add podfriend ([9fdc8d32](9fdc8d32)) * **podcast-form:** add new_feed_url field to set an url when changing domain or host ([e7eec48e](e7eec48e)) * **podcast-form:** update routes and redirect to podcast page ([12ce9057](12ce9057)) * **podcast:** create a podcast using form ([1202ba35](1202ba35)) * **podcasting 2.0:** update podcast:social tag to adhere to latest spec ([a597cf4e](a597cf4e)) * prefill season and episode numbers + set episode number as mandatory for serial podcasts ([07d740b7](07d740b7)), closes [#134](#134) [#136](#136) * **public-ui:** adapt public podcast and episode pages to wireframes ([40a0535f](40a0535f)), closes [#30](#30) [#13](#13) * **pwa:** add service-worker + webmanifest for each podcasts to have them install on devices ([fee2c1c0](fee2c1c0)) * redesign public podcast and episode pages + remove any information clutter for better ux ([93214007](93214007)) * replace form helper functions with components in admin template ([e64548b9](e64548b9)) * replace slug field with interactive permalink component ([578022b8](578022b8)) * restyle episode and person cards + add focus style to interactive elements for a11y ([a505a1de](a505a1de)) * **rss:** add ˂podcast:guid˃ tag for channel ([1fab10eb](1fab10eb)) * **rss:** add podcast-namespace tags for platforms + previousUrl tag ([dbba8dc5](dbba8dc5)), closes [#73](#73) [#75](#75) [#76](#76) [#80](#80) * **rss:** add podcast:comments tag to link to episode comments ([32e8c7c1](32e8c7c1)) * **rss:** add podcast:location tag ([c0a22829](c0a22829)) * **rss:** add rss feed route without the `.xml` extension ([94c0b7c1](94c0b7c1)), closes [#247](#247) * **rss:** add soundbites according to the podcastindex specs ([6b34617d](6b34617d)), closes [#83](#83) * **rss:** add transcript and chapters support ([e769d83a](e769d83a)), closes [#72](#72) [#82](#82) * **rss:** generate rss feed from podcast entity ([c815ecd6](c815ecd6)) * **rss:** update monetization tag so that it meets PodcastIndex requirements ([4c7ecbee](4c7ecbee)) * **select:** enhance select input with choices.js ([910d457c](910d457c)) * set app parameter forceGlobalSecureRequests = true forcing requests to go through https ([d9dff1b8](d9dff1b8)) * set podcast / episode description in the pages description meta tag ([1c4a5044](1c4a5044)), closes [#44](#44) * **settings:** add general config for instance (site name, description and icon) ([5c56f3e6](5c56f3e6)) * **settings:** add theme settings to set an accent color for all public pages ([5c529a83](5c529a83)) * simplify podcast page's layout for better ux ([2c0efc65](2c0efc65)) * **soundbites:** add soundbite list and creation forms with audio-clipper component ([de193171](de193171)) * style file inputs using tailwind's file class ([8208ab67](8208ab67)) * **themes:** add ViewThemes library to set views in root themes folder ([7a276764](7a276764)) * **themes:** set different default banner per theme ([11c916fe](11c916fe)) * **themes:** set generic css variables for colors to enable instance themes ([a746a781](a746a781)) * toggle podcast sidebar on smaller screens ([f0205ec2](f0205ec2)) * **transcript:** parse srt subtitles into json file + add max file size info below audio file input ([00987610](00987610)) * **ui:** create ViewComponents library to enable building class and view files components ([94872f23](94872f23)) * update analytics so to meet IABv2 requirements ([03e23a28](03e23a28)), closes [#10](#10) * update pine colors + create charts components ([a50abc13](a50abc13)) * **users:** add myth-auth to handle users crud + add admin gateway only accessible by login ([c63a0776](c63a0776)), closes [#11](#11) * **ux:** remove admin dashboard and redirect directly to podcast list ([27c48b8f](27c48b8f)) * **video-clip:** add video-clip page with video preview + logs ([42538dd7](42538dd7)) * **video-clip:** generate video clips in the bg using a cron job + add video clip page + tidy up UI ([db0e4272](db0e4272)) * **video-clips:** add dimensions for portrait and squared formats ([3af404da](3af404da)) * **video-clips:** add new themes + add castopod logo as a watermark ([1d1490b0](1d1490b0)) * **video-clips:** add route for scheduled video clips + list video clips with status ([2065ebbe](2065ebbe)) * **video-clips:** allow episodeNumbering text to stand in the indent of episodeTitle paragraph ([71a063da](71a063da)) * **video-clips:** generate a 16:9 video using ffmpeg ([35aa7ea5](35aa7ea5)) * **video-clips:** generate subtitles clip using transcript json to have subtitles accross video ([3ce07e45](3ce07e45)) * **video-clips:** replace hardcoded colors with config's theme colors ([e462abf6](e462abf6)) * **vite:** add vite config to decouple it from CI_ENVIRONMENT ([8721719c](8721719c)) * write id3v2 tags to episode's audio file ([4651d01a](4651d01a)) ### Performance Improvements * **cache:** update CI4 to use cache's deleteMatching method ([54b84f96](54b84f96)) * **cache:** use deleteMatching method to prevent forgetting cached elements in models ([76afc0cf](76afc0cf)) * defer javascript + lazy load images for faster page loads ([f0685e44](f0685e44)) * **docker:** add redis caching service for development ([05ace8cf](05ace8cf)) ### Reverts * **install:** redirect to install in homepage if no database was set ([73f094da](73f094da)) * set deprecated config options back in App config ([433745f1](433745f1)) * **soundbites:** remove soundbite table from episode's public page ([5dc0f196](5dc0f196)) * use basic input file for episodes audio files instead of button for better UX ([d5f22fbb](d5f22fbb)) ### BREAKING CHANGES * **analytics:** analytics_podcasts_by_player table and analytics_podcasts procedure were updated
Loading
Please register or sign in to comment