update readme

This commit is contained in:
tapframe 2026-01-07 14:16:18 +05:30
parent 210ae6b0ee
commit a52a2ccc31
7 changed files with 263 additions and 22 deletions

View file

@ -1,16 +1,15 @@
<!-- Improved compatibility of back to top link -->
<a id="readme-top"></a>
<!-- PROJECT SHIELDS -->
[![Contributors][contributors-shield]][contributors-url]
[![Forks][forks-shield]][forks-url]
[![Stargazers][stars-shield]][stars-url]
[![Issues][issues-shield]][issues-url]
[![License][license-shield]][license-url]
<!-- PROJECT LOGO -->
<br />
<div align="center">
<a id="readme-top"></a>
[![Contributors][contributors-shield]][contributors-url]
[![Forks][forks-shield]][forks-url]
[![Stargazers][stars-shield]][stars-url]
[![Issues][issues-shield]][issues-url]
[![License][license-shield]][license-url]
<br />
<br />
<img src="assets/titlelogo.png" alt="Nuvio Logo" width="120" />
<h1 align="center">🎬 Nuvio Media Hub</h1>
<p align="center">
@ -41,7 +40,9 @@
<li><a href="#getting-started">Getting Started</a></li>
<li><a href="#contributing">Contributing</a></li>
<li><a href="#support">Support</a></li>
<li><a href="#support">Support</a></li>
<li><a href="#license">License</a></li>
<li><a href="#legal">Legal</a></li>
<li><a href="#contact">Contact</a></li>
<li><a href="#acknowledgments">Acknowledgments</a></li>
<li><a href="#built-with">Built With</a></li>
@ -139,6 +140,14 @@ Distributed under the GNU GPLv3 License. See `LICENSE` for more information.
<p align="right">(<a href="#readme-top">back to top</a>)</p>
## Legal
For comprehensive legal information, including our full disclaimer, third-party extension policy, and DMCA/Copyright information, please visit our **[Legal & Disclaimer Page](https://tapframe.github.io/NuvioStreaming/#legal)**.
**Disclaimer:** Nuvio functions solely as a client-side interface for browsing metadata and playing media files provided by user-installed extensions. It does not host, store, or distribute any media content.
<p align="right">(<a href="#readme-top">back to top</a>)</p>
## Contact
**Project Links:**

View file

@ -913,6 +913,67 @@
</div>
</section>
<!-- Legal Section -->
<section id="legal" class="privacy-policy">
<div class="container">
<div class="privacy-content">
<button class="privacy-back-btn" onclick="hideAllDetailSections()">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M19 12H5M12 19l-7-7 7-7" />
</svg>
Back
</button>
<h1>Legal & Disclaimer</h1>
<p class="last-updated">Last updated: January 2026</p>
<div class="privacy-section">
<h2>Nature of the Application</h2>
<p>Nuvio is a media player and metadata management application. It acts solely as a client-side
interface for browsing publicly available metadata (movies, TV shows, etc.) and playing media
files
provided by the user or third-party extensions. Nuvio itself does not host, store, distribute,
or
index any media content.</p>
</div>
<div class="privacy-section">
<h2>Third-Party Extensions</h2>
<p>Nuvio uses an extensible architecture that allows users to install third-party plugins
(extensions).
These extensions are developed and maintained by independent developers not affiliated with
Nuvio.
We have no control over, and assume no responsibility for, the content, legality, or
functionality
of any third-party extension.</p>
</div>
<div class="privacy-section">
<h2>User Responsibility</h2>
<p>Users are solely responsible for the extensions they install and the content they access. By
using
this application, you agree to ensure that you have the legal right to access any content you
view
using Nuvio. The developers of Nuvio do not endorse or encourage copyright infringement.</p>
</div>
<div class="privacy-section">
<h2>Copyright & DMCA</h2>
<p>We respect the intellectual property rights of others. Since Nuvio does not host any content, we
cannot remove content from the internet. However, if you believe that the application interface
itself infringes on your rights, please contact us.</p>
</div>
<div class="privacy-section">
<h2>No Warranty</h2>
<p>This software is provided "as is", without warranty of any kind, express or implied. In no event
shall the authors or copyright holders be liable for any claim, damages, or other liability
arising
from the use of this software.</p>
</div>
</div>
</div>
</section>
<footer class="footer">
<div class="container">
<div class="footer-content">
@ -945,9 +1006,12 @@
<img src="https://github.githubassets.com/assets/GitHub-Mark-ea2971cee799.png" alt="GitHub">
GitHub
</a>
<a href="#privacy-policy" class="footer-link" onclick="showPrivacyPolicy()">
<a href="#privacy-policy" class="footer-link" onclick="showSection('privacy-policy')">
Privacy
</a>
<a href="#legal" class="footer-link" onclick="showSection('legal')">
Legal
</a>
</div>
<p class="footer-copyright">© 2025 Nuvio. GNU GPLv3. Free and Open Source.</p>
@ -1035,26 +1099,42 @@
});
});
// Privacy Policy
function showPrivacyPolicy() {
document.querySelectorAll('body > *:not(#privacy-policy)').forEach(el => el.style.display = 'none');
document.getElementById('privacy-policy').style.display = 'block';
// Detail Sections (Privacy, Legal)
const detailSections = ['privacy-policy', 'legal'];
function showSection(sectionId) {
// Hide everything except the requested section
document.querySelectorAll('body > *:not(#' + sectionId + ')').forEach(el => el.style.display = 'none');
document.getElementById(sectionId).style.display = 'block';
window.scrollTo(0, 0);
}
function hidePrivacyPolicy() {
document.getElementById('privacy-policy').style.display = 'none';
document.querySelectorAll('body > *:not(#privacy-policy)').forEach(el => el.style.display = '');
function hideAllDetailSections() {
detailSections.forEach(id => {
const el = document.getElementById(id);
if (el) el.style.display = 'none';
});
// Show main content
document.querySelectorAll('body > *').forEach(el => {
if (!detailSections.includes(el.id)) el.style.display = '';
});
window.scrollTo(0, 0);
}
window.addEventListener('popstate', function () {
if (window.location.hash === '#privacy-policy') showPrivacyPolicy();
else hidePrivacyPolicy();
const hash = window.location.hash.substring(1); // remove #
if (detailSections.includes(hash)) {
showSection(hash);
} else {
hideAllDetailSections();
}
});
document.addEventListener('DOMContentLoaded', function () {
if (window.location.hash === '#privacy-policy') showPrivacyPolicy();
const hash = window.location.hash.substring(1);
if (detailSections.includes(hash)) {
showSection(hash);
}
});
</script>
</body>

View file

@ -643,6 +643,7 @@
"danger_zone": "DANGER ZONE"
},
"items": {
"legal": "Legal & Disclaimer",
"privacy_policy": "Privacy Policy",
"report_issue": "Report Issue",
"version": "Version",
@ -1224,5 +1225,18 @@
"cancel": "Cancel",
"back": "Settings"
}
},
"legal": {
"title": "Legal & Disclaimer",
"intro_title": "Nature of the Application",
"intro_text": "Nuvio is a media player and metadata management application. It acts solely as a client-side interface for browsing publicly available metadata (movies, TV shows, etc.) and playing media files provided by the user or third-party extensions. Nuvio itself does not host, store, distribute, or index any media content.",
"extensions_title": "Third-Party Extensions",
"extensions_text": "Nuvio uses an extensible architecture that allows users to install third-party plugins (extensions). These extensions are developed and maintained by independent developers not affiliated with Nuvio. We have no control over, and assume no responsibility for, the content, legality, or functionality of any third-party extension.",
"user_resp_title": "User Responsibility",
"user_resp_text": "Users are solely responsible for the extensions they install and the content they access. By using this application, you agree to ensure that you have the legal right to access any content you view using Nuvio. The developers of Nuvio do not endorse or encourage copyright infringement.",
"dmca_title": "Copyright & DMCA",
"dmca_text": "We respect the intellectual property rights of others. Since Nuvio does not host any content, we cannot remove content from the internet. However, if you believe that the application interface itself infringes on your rights, please contact us.",
"warranty_title": "No Warranty",
"warranty_text": "This software is provided \"as is\", without warranty of any kind, express or implied. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability arising from the use of this software."
}
}

View file

@ -79,6 +79,7 @@ import {
PlaybackSettingsScreen,
AboutSettingsScreen,
DeveloperSettingsScreen,
LegalScreen,
} from '../screens/settings';
@ -217,6 +218,7 @@ export type RootStackParamList = {
PlaybackSettings: undefined;
AboutSettings: undefined;
DeveloperSettings: undefined;
Legal: undefined;
};
@ -1751,6 +1753,21 @@ const InnerNavigator = ({ initialRouteName }: { initialRouteName?: keyof RootSta
},
}}
/>
<Stack.Screen
name="Legal"
component={LegalScreen}
options={{
animation: Platform.OS === 'android' ? 'slide_from_right' : 'slide_from_right',
animationDuration: Platform.OS === 'android' ? 250 : 300,
presentation: 'card',
gestureEnabled: true,
gestureDirection: 'horizontal',
headerShown: false,
contentStyle: {
backgroundColor: currentTheme.colors.darkBackground,
},
}}
/>
</Stack.Navigator>
</View>
</PaperProvider>

View file

@ -55,6 +55,13 @@ export const AboutSettingsContent: React.FC<AboutSettingsContentProps> = ({
return (
<>
<SettingsCard title={t('settings.sections.information')} isTablet={isTablet}>
<SettingItem
title={t('settings.items.legal')}
icon="file-text"
onPress={() => navigation.navigate('Legal')}
renderControl={() => <ChevronRight />}
isTablet={isTablet}
/>
<SettingItem
title={t('settings.items.privacy_policy')}
icon="lock"

View file

@ -0,0 +1,113 @@
import React from 'react';
import { View, Text, StyleSheet, ScrollView, StatusBar } from 'react-native';
import { useNavigation } from '@react-navigation/native';
import { useTranslation } from 'react-i18next';
import { useTheme } from '../../contexts/ThemeContext';
import ScreenHeader from '../../components/common/ScreenHeader';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
import { RootStackParamList } from '../../navigation/AppNavigator';
import { NavigationProp } from '@react-navigation/native';
const LegalScreen: React.FC = () => {
const { t } = useTranslation();
const { currentTheme } = useTheme();
const navigation = useNavigation<NavigationProp<RootStackParamList>>();
const insets = useSafeAreaInsets();
const sections = [
{
title: t('legal.intro_title'),
text: t('legal.intro_text')
},
{
title: t('legal.extensions_title'),
text: t('legal.extensions_text')
},
{
title: t('legal.user_resp_title'),
text: t('legal.user_resp_text')
},
{
title: t('legal.dmca_title'),
text: t('legal.dmca_text')
},
{
title: t('legal.warranty_title'),
text: t('legal.warranty_text')
}
];
return (
<View style={[styles.container, { backgroundColor: currentTheme.colors.darkBackground }]}>
<StatusBar barStyle="light-content" />
<ScreenHeader
title={t('legal.title')}
showBackButton
onBackPress={() => navigation.goBack()}
/>
<ScrollView
style={styles.scrollView}
contentContainerStyle={[
styles.contentContainer,
{ paddingBottom: insets.bottom + 40 }
]}
showsVerticalScrollIndicator={false}
>
{sections.map((section, index) => (
<View key={index} style={styles.section}>
<Text style={[styles.sectionTitle, { color: currentTheme.colors.highEmphasis }]}>
{section.title}
</Text>
<Text style={[styles.sectionText, { color: currentTheme.colors.mediumEmphasis }]}>
{section.text}
</Text>
</View>
))}
<View style={styles.footer}>
<Text style={[styles.footerText, { color: currentTheme.colors.disabled }]}>
Last updated: January 2026
</Text>
</View>
</ScrollView>
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
},
scrollView: {
flex: 1,
},
contentContainer: {
padding: 24,
gap: 32,
},
section: {
gap: 12,
},
sectionTitle: {
fontSize: 20,
fontWeight: '700',
letterSpacing: 0.3,
},
sectionText: {
fontSize: 16,
lineHeight: 26,
},
footer: {
alignItems: 'center',
marginTop: 16,
paddingVertical: 20,
borderTopWidth: 1,
borderTopColor: 'rgba(255,255,255,0.1)',
},
footerText: {
fontSize: 13,
}
});
export default LegalScreen;

View file

@ -5,6 +5,7 @@ export { default as IntegrationsSettingsScreen } from './IntegrationsSettingsScr
export { default as PlaybackSettingsScreen } from './PlaybackSettingsScreen';
export { default as AboutSettingsScreen } from './AboutSettingsScreen';
export { default as DeveloperSettingsScreen } from './DeveloperSettingsScreen';
export { default as LegalScreen } from './LegalScreen';
// Reusable content component exports (for inline use on tablets)
export { ContentDiscoverySettingsContent } from './ContentDiscoverySettingsScreen';