h( $_SERVER['SERVER_SOFTWARE'] ) ) : '', 'is_ssl' => is_ssl(), 'is_multisite' => is_multisite(), 'is_network_activated' => $this->is_active_for_network(), 'is_wpcom' => defined( 'IS_WPCOM' ) && IS_WPCOM, 'is_wpcom_vip' => ( defined( 'WPCOM_IS_VIP_ENV' ) && WPCOM_IS_VIP_ENV ) || ( function_exists( 'wpcom_is_vip' ) && wpcom_is_vip() ), 'is_wp_cache' => defined( 'WP_CACHE' ) && WP_CACHE, 'is_wp_rest_api_enabled' => $this->is_rest_api_enabled(), 'is_user_logged_in' => is_user_logged_in(), 'sites_count' => $this->get_sites_total(), 'active_plugins' => $this->get_active_plugins(), 'theme_name' => $theme_data->get( 'Name' ), 'theme_version' => $theme_data->get( 'Version' ), 'locale' => get_locale(), 'timezone_offset' => wp_timezone_string(), // WPForms-specific data. 'wpforms_version' => WPFORMS_VERSION, 'wpforms_license_key' => wpforms_get_license_key(), 'wpforms_license_type' => $this->get_license_type(), 'wpforms_license_status' => $this->get_license_status(), 'wpforms_is_pro' => wpforms()->is_pro(), 'wpforms_entries_avg' => $this->get_entries_avg( $forms_total, $entries_total ), 'wpforms_entries_total' => $entries_total, 'wpforms_entries_last_7days' => $this->get_entries_total( '7days' ), 'wpforms_entries_last_30days' => $this->get_entries_total( '30days' ), 'wpforms_forms_total' => $forms_total, 'wpforms_form_fields_count' => $form_fields_count, 'wpforms_form_templates_total' => $form_templates_total, 'wpforms_form_antispam_stat' => $this->get_form_antispam_stat( $forms ), 'wpforms_challenge_stats' => get_option( 'wpforms_challenge', [] ), 'wpforms_lite_installed_date' => $this->get_installed( $activated_dates, 'lite' ), 'wpforms_pro_installed_date' => $this->get_installed( $activated_dates, 'pro' ), 'wpforms_builder_opened_date' => (int) get_option( 'wpforms_builder_opened_date', 0 ), 'wpforms_settings' => $this->get_settings( $forms ), 'wpforms_integration_active' => $this->get_forms_integrations( $forms ), 'wpforms_payments_active' => $this->get_payments_active( $forms ), 'wpforms_product_quantities' => [ 'payment-single' => $this->count_fields_with_setting( $forms, 'payment-single', 'enable_quantity' ), 'payment-select' => $this->count_fields_with_setting( $forms, 'payment-select', 'enable_quantity' ), ], 'wpforms_order_summaries' => $this->count_fields_with_setting( $forms, 'payment-total', 'summary' ), 'wpforms_multiple_confirmations' => count( $this->get_forms_with_multiple_confirmations( $forms ) ), 'wpforms_multiple_notifications' => count( $this->get_forms_with_multiple_notifications( $forms ) ), 'wpforms_ajax_form_submissions' => count( $this->get_ajax_form_submissions( $forms ) ), 'wpforms_notification_count' => wpforms()->obj( 'notifications' )->get_count(), 'wpforms_stats' => $this->get_additional_stats(), 'wpforms_ai' => AIHelpers::is_used(), 'wpforms_ai_killswitch' => AIHelpers::is_disabled(), 'wpforms_disabled_entries_count' => count( $this->get_forms_with_disabled_entries( $forms ) ), ]; $wpconsent_source = (string) get_option( 'wpconsent_source', '' ); $wpconsent_date = (int) get_option( 'wpconsent_date', 0 ); if ( $wpconsent_date && strpos( $wpconsent_source, 'WPForms' ) !== false ) { $data['wpforms_wpconsent_date'] = $wpconsent_date; } if ( ! empty( $first_form_date ) ) { $data['wpforms_forms_first_created'] = $first_form_date; } if ( $data['is_multisite'] ) { $data['url_primary'] = network_site_url(); } return $data; } /** * Get the license type. * * @since 1.6.1 * @since 1.7.2 Clarified the license type. * @since 1.7.9 Return only the license type, not the status. * * @return string */ private function get_license_type(): string { return wpforms()->is_pro() ? wpforms_get_license_type() : 'lite'; } /** * Get the license status. * * @since 1.7.9 * * @return string */ private function get_license_status(): string { if ( ! wpforms()->is_pro() ) { return 'lite'; } $license_type = wpforms_get_license_type(); $license_key = wpforms_get_license_key(); if ( ! $license_type ) { return empty( $license_key ) ? 'no license' : 'not verified'; } if ( wpforms_setting( 'is_expired', false, 'wpforms_license' ) ) { return 'expired'; } if ( wpforms_setting( 'is_disabled', false, 'wpforms_license' ) ) { return 'disabled'; } if ( wpforms_setting( 'is_invalid', false, 'wpforms_license' ) ) { return 'invalid'; } // The correct type is returned in get_license_type(), so we "collapse" them here to a single value. if ( in_array( $license_type, [ 'basic', 'plus', 'pro', 'elite', 'ultimate', 'agency' ], true ) ) { $license_type = 'correct'; } return $license_type; } /** * Get all settings, except those with sensitive data. * * @since 1.6.1 * @since 1.9.3 Added $forms parameter. * * @param array $forms List of forms. * * @return array */ private function get_settings( array $forms ): array { // Remove keys with exact names that we don't need. $settings = array_diff_key( get_option( 'wpforms_settings', [] ), array_flip( [ 'stripe-test-secret-key', 'stripe-test-publishable-key', 'stripe-live-secret-key', 'stripe-live-publishable-key', 'stripe-webhooks-secret-test', 'stripe-webhooks-secret-live', 'stripe-webhooks-id-test', 'stripe-webhooks-id-live', 'square-webhooks-id-sandbox', 'square-webhooks-id-live', 'square-webhooks-secret-sandbox', 'square-webhooks-secret-live', 'authorize_net-test-api-login-id', 'authorize_net-test-transaction-key', 'authorize_net-live-api-login-id', 'authorize_net-live-transaction-key', 'square-location-id-sandbox', 'square-location-id-production', 'geolocation-google-places-api-key', 'geolocation-algolia-places-application-id', 'geolocation-algolia-places-search-only-api-key', 'geolocation-mapbox-search-access-token', 'recaptcha-site-key', 'recaptcha-secret-key', 'recaptcha-fail-msg', 'hcaptcha-site-key', 'hcaptcha-secret-key', 'hcaptcha-fail-msg', 'turnstile-site-key', 'turnstile-secret-key', 'turnstile-fail-msg', 'pdf-ninja-api_key', ] ) ); $data = []; // Remove keys with a vague names that we don't need. foreach ( $settings as $key => $value ) { if ( strpos( $key, 'validation-' ) !== false ) { continue; } $data[ $key ] = $value; } $lite_connect_data = get_option( Integration::get_option_name() ); // If lite connect has been restored, set lite connect data. if ( isset( $lite_connect_data['import']['status'] ) && $lite_connect_data['import']['status'] === 'done' ) { $data['lite_connect'] = [ 'restore_date' => $lite_connect_data['import']['ended_at'], 'restored_entry_count' => Integration::get_entries_count(), ]; } // Add Dropbox Delete Local Files setting usage count. $data['dropbox_delete_local_files_setting_count'] = $this->get_dropbox_delete_local_files_setting_count( $forms ); // Add favorite templates to the settings array. return array_merge( $data, $this->get_favorite_templates() ); } /** * Get the count of forms with Delete Local Files active option for Dropbox. * * @since 1.9.3 * * @param array $forms List of forms. * * @return int */ private function get_dropbox_delete_local_files_setting_count( array $forms ): int { $delete_local_files_count = 0; foreach ( $forms as $form ) { // Check if the Dropbox integration is configured in the form. if ( empty( $form->post_content['providers']['dropbox'] ) ) { continue; } // Delete Local Files option is applied for all connections if applied, // so it's enough to check the first connection only. $connection = current( $form->post_content['providers']['dropbox'] ); if ( ! $connection || ! isset( $connection['delete_local_files'] ) ) { continue; } ++$delete_local_files_count; } return $delete_local_files_count; } /** * Get the list of active plugins. * * @since 1.6.1 * * @return array */ private function get_active_plugins(): array { if ( ! function_exists( 'get_plugins' ) ) { include ABSPATH . '/wp-admin/includes/plugin.php'; } $active = is_multisite() ? array_merge( get_option( 'active_plugins', [] ), array_flip( get_site_option( 'active_sitewide_plugins', [] ) ) ) : get_option( 'active_plugins', [] ); $plugins = array_intersect_key( get_plugins(), array_flip( $active ) ); return array_map( static function ( $plugin ) { if ( isset( $plugin['Version'] ) ) { return $plugin['Version']; } return 'Not Set'; }, $plugins ); } /** * Installed date. * * @since 1.6.1 * * @param array $activated_dates Input array with dates. * @param string $key Input key what you want to get. * * @return mixed */ private function get_installed( array $activated_dates, string $key ) { if ( ! empty( $activated_dates[ $key ] ) ) { return $activated_dates[ $key ]; } return false; } /** * Number of forms with some integrations active. * * @since 1.6.1 * * @param array $forms List of forms. * * @return array List of forms with active integrations count. */ private function get_forms_integrations( array $forms ): array { $integrations = array_map( static function ( $form ) { if ( empty( $form->post_content['providers'] ) ) { return false; } $active_integrations = []; foreach ( $form->post_content['providers'] as $provider_slug => $connections ) { if ( ! empty( $connections ) ) { $active_integrations[] = $provider_slug; } } return $active_integrations; }, $forms ); $integrations = array_filter( $integrations ); if ( count( $integrations ) > 0 ) { $integrations = call_user_func_array( 'array_merge', array_values( $integrations ) ); } return array_count_values( $integrations ); } /** * Number of forms with active payments. * * @since 1.6.1 * * @param array $forms Input forms list. * * @return array List of forms with active payments count. */ private function get_payments_active( array $forms ): array { $payments = array_map( static function ( $form ) { if ( empty( $form->post_content['payments'] ) ) { return false; } $enabled = []; foreach ( $form->post_content['payments'] as $key => $value ) { if ( ! empty( $value['enable'] ) ) { $enabled[] = $key; } } return empty( $enabled ) ? false : $enabled; }, $forms ); $payments = array_filter( $payments ); if ( count( $payments ) > 0 ) { $payments = call_user_func_array( 'array_merge', array_values( $payments ) ); } return array_count_values( $payments ); } /** * Forms with multiple notifications. * * @since 1.6.1 * * @param array $forms List of forms to check. * * @return array List of forms with multiple notifications. */ private function get_forms_with_multiple_notifications( array $forms ): array { return array_filter( $forms, static function ( $form ) { return ! empty( $form->post_content['settings']['notifications'] ) && count( $form->post_content['settings']['notifications'] ) > 1; } ); } /** * Forms with multiple confirmations. * * @since 1.6.1 * * @param array $forms List of forms to check. * * @return array List of forms with multiple confirmations. */ private function get_forms_with_multiple_confirmations( array $forms ): array { return array_filter( $forms, static function ( $form ) { return ! empty( $form->post_content['settings']['confirmations'] ) && count( $form->post_content['settings']['confirmations'] ) > 1; } ); } /** * Forms with ajax submission option enabled. * * @since 1.6.1 * * @param array $forms All forms. * * @return array */ private function get_ajax_form_submissions( array $forms ): array { return array_filter( $forms, static function ( $form ) { return ! empty( $form->post_content['settings']['ajax_submit'] ); } ); } /** * Retrieve forms with disabled entries. * * @since 1.9.8 * * @param array $forms List of forms. * * @return array. */ private function get_forms_with_disabled_entries( array $forms ): array { return array_filter( $forms, static function ( $form ) { return ! empty( $form->post_content['settings']['disable_entries'] ); } ); } /** * Total number of sites. * * @since 1.6.1 * * @return int */ private function get_sites_total(): int { return function_exists( 'get_blog_count' ) ? (int) get_blog_count() : 1; } /** * Total number of entries. * * @since 1.6.1 * * @param string $period Which period should be counted? Possible values: 7days, 30days. * Everything else will mean "all" entries. * * @return int */ private function get_entries_total( string $period = 'all' ): int { if ( ! wpforms()->is_pro() ) { return $this->get_entries_total_lite( $period ); } $args = []; // Limit results to only forms, excluding form templates. $form_ids = wp_list_pluck( $this->get_all_forms(), 'ID' ); if ( ! empty( $form_ids ) ) { $args['form_id'] = $form_ids; } switch ( $period ) { case '7days': $args = [ 'date' => [ gmdate( 'Y-m-d', strtotime( '-7 days' ) ), gmdate( 'Y-m-d' ), ], ]; break; case '30days': $args = [ 'date' => [ gmdate( 'Y-m-d', strtotime( '-30 days' ) ), gmdate( 'Y-m-d' ), ], ]; break; } $entry_obj = wpforms()->obj( 'entry' ); return $entry_obj ? $entry_obj->get_entries( $args, true ) : 0; } /** * Total number of entries in Lite. * * @since 1.9.0 * * @param string $period Which period should be counted? Possible values: 7days, 30days. * Everything else will mean "all" entries. * * @return int */ private function get_entries_total_lite( string $period = 'all' ): int { if ( $period === '7days' || $period === '30days' ) { return 0; } global $wpdb; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $count = $wpdb->get_var( "SELECT SUM(meta_value) FROM $wpdb->postmeta WHERE meta_key = 'wpforms_entries_count';" ); return (int) $count; } /** * Forms field occurrences. * * @since 1.7.9 * * @param array $forms List of forms. * * @return array List of field occurrences in all forms created. */ private function get_form_fields_count( array $forms ): array { // Bail early, in case there are no forms created yet! if ( empty( $forms ) ) { return []; } $fields = array_map( static function ( $form ) { return $form->post_content['fields'] ?? []; }, $forms ); $fields_flatten = array_merge( [], ...$fields ); $field_types = array_column( $fields_flatten, 'type' ); return array_count_values( $field_types ); } /** * Determines whether the plugin is active for the entire network. * * This is a copy of the WP core is_plugin_active_for_network() function. * * @since 1.8.2 * * @return bool */ private function is_active_for_network(): bool { // Bail early, in case we are not in multisite. if ( ! is_multisite() ) { return false; } // Get all active plugins. $plugins = get_site_option( 'active_sitewide_plugins' ); // Bail early, in case the plugin is active for the entire network. if ( isset( $plugins[ plugin_basename( WPFORMS_PLUGIN_FILE ) ] ) ) { return true; } return false; } /** * Average entries count. * * @since 1.6.1 * * @param int $forms Total forms count. * @param int $entries Total entries count. * * @return int */ private function get_entries_avg( int $forms, int $entries ): int { return $forms ? round( $entries / $forms ) : 0; } /** * Get all forms. * * @since 1.6.1 * @since 1.8.9 Added post_type parameter. * * @param string|string[] $post_type Allow to sort result by post_type. By default, it's 'wpforms'. * * @return array */ private function get_all_forms( $post_type = 'wpforms' ): array { $forms = wpforms()->obj( 'form' )->get( '', [ 'post_type' => $post_type ] ); if ( ! is_array( $forms ) ) { return []; } return array_map( static function ( $form ) { $form->post_content = wpforms_decode( $form->post_content ); return $form; }, $forms ); } /** * Get the favorite templates. * * @since 1.7.7 * * @return array */ private function get_favorite_templates(): array { $settings = []; $templates = (array) get_option( Templates::FAVORITE_TEMPLATES_OPTION, [] ); foreach ( $templates as $user_templates ) { foreach ( $user_templates as $template => $v ) { $name = 'fav_templates_' . str_replace( '-', '_', $template ); $settings[ $name ] = empty( $settings[ $name ] ) ? 1 : ++$settings[ $name ]; } } return $settings; } /** * Test if the REST API is accessible. * * The REST API might be inaccessible due to various security measures, * or it might be completely disabled by a plugin. * * @since 1.8.2.2 * * @return bool */ private function is_rest_api_enabled(): bool { // phpcs:disable WPForms.PHP.ValidateHooks.InvalidHookName /** This filter is documented in wp-includes/class-wp-http-streams.php */ $sslverify = apply_filters( 'https_local_ssl_verify', false ); // phpcs:enable WPForms.PHP.ValidateHooks.InvalidHookName $url = rest_url( 'wp/v2/types/post' ); $response = wp_remote_get( $url, [ 'timeout' => 10, 'cookies' => is_user_logged_in() ? wp_unslash( $_COOKIE ) : [], 'sslverify' => $sslverify, 'headers' => [ 'Cache-Control' => 'no-cache', 'X-WP-Nonce' => wp_create_nonce( 'wp_rest' ), ], ] ); // When testing the REST API, an error was encountered, leave early. if ( is_wp_error( $response ) ) { return false; } // When testing the REST API, an unexpected result was returned, leave early. if ( wp_remote_retrieve_response_code( $response ) !== 200 ) { return false; } // The REST API did not behave correctly, leave early. if ( ! wpforms_is_json( wp_remote_retrieve_body( $response ) ) ) { return false; } // We are all set. Confirm the connection. return true; } /** * Retrieves additional statistics. * * @since 1.8.8 * * @return array */ private function get_additional_stats(): array { // Initialize an empty array to store the statistics. $stats = []; return $this->get_admin_pointer_stats( $stats ); } /** * Retrieves statistics for admin pointers. * This function retrieves statistics for admin pointers based on their engagement or dismissal status. * * Note: Pointers can only be engaged (interacted with) or dismissed. * * - If the value is 1 or true, it means the pointer is shown and interacted with (engaged). * - If the value is 0 or false, it means the pointer is dismissed. * - If there is no pointer ID in the stats, it means the user hasn't seen the pointer yet. * * @since 1.8.8 * * @param array $stats An array containing existing statistics. * * @return array */ private function get_admin_pointer_stats( array $stats ): array { $pointers = get_option( 'wpforms_pointers', [] ); // If there are no pointers, return empty statistics. if ( empty( $pointers ) ) { return $stats; } // Pointers can only be interacted with or dismissed. // If there are engagement pointers, process them. if ( isset( $pointers['engagement'] ) ) { foreach ( $pointers['engagement'] as $pointer ) { $stats[ sanitize_key( $pointer ) ] = true; } } // If there are dismiss pointers, process them. if ( isset( $pointers['dismiss'] ) ) { foreach ( $pointers['dismiss'] as $pointer ) { $stats[ sanitize_key( $pointer ) ] = false; } } return $stats; } /** * Retrieves form anti-spam settings statistic. * * @since 1.9.0 * * @param array $forms List of forms and their settings. * * @return array */ private function get_form_antispam_stat( array $forms ): array { // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh $stat = [ 'antispam' => 0, 'antispam_v3' => 0, 'akismet' => 0, 'store_spam_entries' => 0, 'time_limit' => 0, 'country_filter' => 0, 'keyword_filter' => 0, 'captcha' => 0, ]; foreach ( $forms as $form ) { $settings = $form->post_content['settings'] ?? []; // Skip forms with disabled anti-spam settings. if ( empty( $settings['antispam'] ) && empty( $settings['antispam_v3'] ) ) { continue; } // Increment the counters for each form with enabled anti-spam settings. $stat['antispam'] += ! empty( $settings['antispam'] ) ? 1 : 0; // Classic anti-spam enabled. $stat['antispam_v3'] += ! empty( $settings['antispam_v3'] ) ? 1 : 0; // Modern anti-spam enabled. $anti_spam = $settings['anti_spam'] ?? []; // Increment the counter for each enabled anti-spam feature. $stat['akismet'] += ! empty( $anti_spam['akismet'] ) ? 1 : 0; $stat['store_spam_entries'] += ! empty( $settings['store_spam_entries'] ) ? 1 : 0; $stat['time_limit'] += ! empty( $anti_spam['time_limit']['enable'] ) ? 1 : 0; $stat['country_filter'] += ! empty( $anti_spam['country_filter']['enable'] ) ? 1 : 0; $stat['keyword_filter'] += ! empty( $anti_spam['keyword_filter']['enable'] ) ? 1 : 0; $stat['captcha'] += ! empty( $settings['recaptcha'] ) ? 1 : 0; } // Count the list of keywords for the keyword filter. $keyword_filter = wpforms()->obj( 'antispam_keyword_filter' ); $keywords = method_exists( $keyword_filter, 'get_keywords' ) ? $keyword_filter->get_keywords() : []; $stat['keywords'] = count( $keywords ); return $stat; } /** * Count how many field have a specific setting enabled. * * @since 1.9.0.3 * * @param array $forms Published forms. * @param string $field_type Field type. * @param string $field_setting Field setting. * * @return int */ private function count_fields_with_setting( array $forms, string $field_type, string $field_setting ): int { $counter = 0; // Bail early, in case there are no forms. if ( empty( $forms ) ) { return $counter; } // Go through all forms. foreach ( $forms as $form ) { $fields = $form->post_content['fields'] ?? []; if ( empty( $fields ) ) { continue; } // Go through all fields on the form. foreach ( $fields as $field ) { if ( ! empty( $field['type'] ) && $field['type'] === $field_type && ! empty( $field[ $field_setting ] ) ) { ++$counter; } } } return $counter; } } TV Shows Archive - Bienvenue sur - SIMANDOU TV

Explorer Sir Malcolm Murray, American gunslinger Ethan Chandler, scientist Victor Frankenstein, and medium Vanessa Ives unite to combat supernatural threats in Victorian London.

A chronicled look at the criminal exploits of Colombian drug lord Pablo Escobar, as well as the many other drug kingpins who plagued the country through the years.

The missions of the Strategic Homeland Intervention, Enforcement and Logistics Division.

Featured

Will and Grace live together in an apartment in New York City. He's a gay lawyer, she's a straight interior designer. Their best friends are Jack, a gleeful but proud gay man, and Karen, a charismatic, filthy rich, amoral socialite

Featured
, 2013 - 2014

Defiance

In the year 2046, it's a new Earth - with new rules. Over thirty years after various alien races arrived on Earth, the landscape is completely altered, terraformed nearly beyond recognition.

, , 2013 - 2017, 2018 & 2019

Vikings

New Season 5 just flow in. Watch and Debate

Featured
, 2011 - 2012

Awkward

An unpopular 15-year-old gains immediate, yet unwanted, popularity at her high school when the student body mistakes an accident she has for a suicide attempt.

Featured
, 2016 - 2018

Atlanta

Based in Atlanta, Earn and his cousin Alfred are trying to make their way up in the world through the rap scene. Along the way they come face to face with social and economic issues touching on race, relationships, poverty, status, and parenthood

Featured

A modern update finds the famous sleuth and his doctor partner solving crime in 21st century London

Featured

A drug-addicted nurse struggles to find a balance between the demands of her frenetic job at a New York City hospital and an array of personal dramas.

Featured

The adventures of an axe-wielding police officer dedicated to killing the various bad guys he comes across

Featured

Amy Sedaris applies her distinctive, sincere brand of silliness to a mash-up of hospitality, variety, and talk-show formats, showcasing her diverse, necessary homemaking skills.

Featured
, ---- - 2012

Awake

A wealthy young man undergoing heart transplant surgery discovers that the surgical team intend to murder him

Featured
Featured
, 2017 - 2018

Atypical

Newest Episode: S02E05

Sam, an 18-year-old on the autism spectrum, decides it's time to find a girlfriend, a journey that sets Sam's mom on her own life-changing path as her son seeks more independence

Featured
, 2015 - 2016

Another Period

Newest Episode: S02E05

A mockumentary-style period piece comedy that follows members of the wealthy Bellacourt family and their servants in early 20th-century Newport, Rhode Island

Featured
, 2017 - 2018

American Vandal

Newest Episode: S02E05

A true-crime satire that explores the aftermath of a costly high school prank that left twenty-seven faculty cars vandalized with phallic images

, 2008 - 2009

Ashes To Ashes

Newest Episode: S02E05

DCI Gene Hunt swaps the Ford Cortina for an Audi Quattro and joins the London Metropolitan Police to deal with the 'Southern Nancy' criminal scum.

, 2012 - 2013

Arrow

Newest Episode: S02E05

Spoiled billionaire playboy Oliver Queen is missing and presumed dead when his yacht is lost at sea. He returns five years later a changed man, determined to clean up the city as a hooded vigilante armed with a bow.

, 2003 - 2004

Arrested Development

Newest Episode: S02E05

Level-headed son Michael Bluth takes over family affairs after his father is imprisoned. But the rest of his spoiled, dysfunctional family are making his job unbearable.

Ten strangers are invited to an island by a mysterious host, and start to get killed one by one. Could one of them be the killer?

, 2011 - 2012

American Horrer Story

Newest Episode: S02E05

An anthology series centering on different characters and locations, including a house with a murderous past, an insane asylum, a witch coven, a freak show, a hotel, a possessed farmhouse, a cult, and the apocalypse.

, 1997 - 1998

Ally McBeal

Newest Episode: S02E05

Ally McBeal and Billy Thomas were going steady throughout their childhoods. Ally even followed Billy...

Showing all 23 results