├── .babelrc ├── netlify.toml ├── src ├── styles │ └── App.css ├── assets │ ├── fb.png │ ├── view.png │ ├── image.png │ ├── twitter.png │ ├── whatsapp.png │ └── number-five.png ├── index.js ├── components │ ├── Footer.js │ ├── banner.js │ ├── ShareButton.js │ ├── NextGameTimer.js │ ├── ImagesContainer.js │ ├── RulesModal.js │ ├── ShareResults.js │ ├── Stats.js │ ├── Results.js │ └── Game.js ├── hooks │ └── useLocalStorage.js ├── App.js ├── pages │ ├── TimeTravel.js │ └── Home.js └── utils │ └── constants.js ├── public ├── favicon.ico ├── static │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── 5.jpg │ ├── meta-data.json │ └── movies.json ├── icons │ └── android │ │ ├── android-launchericon-144-144.png │ │ └── android-launchericon-512-512.png ├── offline.html ├── manifest.json ├── serviceWorker.js └── index.html ├── .gitignore ├── postcss.config.js ├── .prettierrc ├── .vscode └── settings.json ├── scripts └── create-env.js ├── .eslintrc.js ├── README.md ├── tailwind.config.js └── package.json /.babelrc: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /netlify.toml: -------------------------------------------------------------------------------- 1 | [[redirects]] 2 | from = "/*" 3 | to = "/" 4 | status = 200 -------------------------------------------------------------------------------- /src/styles/App.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | -------------------------------------------------------------------------------- /src/assets/fb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/santoshimz/pattukunte-pattucheera/HEAD/src/assets/fb.png -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/santoshimz/pattukunte-pattucheera/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /public/static/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/santoshimz/pattukunte-pattucheera/HEAD/public/static/1.jpg -------------------------------------------------------------------------------- /public/static/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/santoshimz/pattukunte-pattucheera/HEAD/public/static/2.jpg -------------------------------------------------------------------------------- /public/static/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/santoshimz/pattukunte-pattucheera/HEAD/public/static/3.jpg -------------------------------------------------------------------------------- /public/static/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/santoshimz/pattukunte-pattucheera/HEAD/public/static/4.jpg -------------------------------------------------------------------------------- /public/static/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/santoshimz/pattukunte-pattucheera/HEAD/public/static/5.jpg -------------------------------------------------------------------------------- /src/assets/view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/santoshimz/pattukunte-pattucheera/HEAD/src/assets/view.png -------------------------------------------------------------------------------- /src/assets/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/santoshimz/pattukunte-pattucheera/HEAD/src/assets/image.png -------------------------------------------------------------------------------- /src/assets/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/santoshimz/pattukunte-pattucheera/HEAD/src/assets/twitter.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Local Netlify folder 2 | .netlify 3 | node_modules 4 | build 5 | package-lock.json 6 | .env 7 | .DS_Store -------------------------------------------------------------------------------- /src/assets/whatsapp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/santoshimz/pattukunte-pattucheera/HEAD/src/assets/whatsapp.png -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /public/static/meta-data.json: -------------------------------------------------------------------------------- 1 | { 2 | "movie":"Khushi", 3 | "contributor": "pk", 4 | "twitterId": "mscott5" 5 | } -------------------------------------------------------------------------------- /src/assets/number-five.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/santoshimz/pattukunte-pattucheera/HEAD/src/assets/number-five.png -------------------------------------------------------------------------------- /public/icons/android/android-launchericon-144-144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/santoshimz/pattukunte-pattucheera/HEAD/public/icons/android/android-launchericon-144-144.png -------------------------------------------------------------------------------- /public/icons/android/android-launchericon-512-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/santoshimz/pattukunte-pattucheera/HEAD/public/icons/android/android-launchericon-512-512.png -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom"; 3 | import App from "./App"; 4 | 5 | ReactDOM.render(, document.getElementById("root")); 6 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": true, 3 | "tabWidth": 2, 4 | "printWidth": 100, 5 | "singleQuote": false, 6 | "trailingComma": "none", 7 | "jsxBracketSameLine": true, 8 | "editor.formatOnSave": true 9 | } 10 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.formatOnSave": true, 3 | "eslint.alwaysShowStatus": true, 4 | "eslint.format.enable": true, 5 | "eslint.run": "onSave", 6 | "eslint.workingDirectories": [], 7 | "reactSnippets.settings.prettierEnabled": true, 8 | "html.completion.attributeDefaultValue": "singlequotes" 9 | } -------------------------------------------------------------------------------- /scripts/create-env.js: -------------------------------------------------------------------------------- 1 | if (!process.env.NODE_ENV || process.env.NODE_ENV !== "production") { 2 | const fs = require("fs"); 3 | fs.writeFileSync( 4 | ".env", 5 | "REACT_APP_FormsLink=https://forms.gle/9rDLcRBUpcUb4FR89\nNODE_ENV=development\n REACT_APP_BANNER=\nREACT_APP_CDN_URL=./static\nREACT_APP_S3=./static" 6 | ); 7 | } 8 | -------------------------------------------------------------------------------- /public/offline.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Pattukunte Pattucheera 9 | 10 | 11 | 12 |

13 | Please connect to internet. 14 |

15 | 16 | 17 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Pattukunte Pattucheera", 3 | "short_name": "Pattukunte Pattucheera", 4 | "start_url": "index.html", 5 | "icons": [ 6 | { 7 | "src": "icons/android/android-launchericon-512-512.png", 8 | "sizes": "512x512" 9 | }, 10 | { 11 | "src": "icons/android/android-launchericon-144-144.png", 12 | "sizes": "144x144" 13 | } 14 | ], 15 | "background_color": "#000000", 16 | "display": "standalone", 17 | "theme_color": "#000000" 18 | } -------------------------------------------------------------------------------- /src/components/Footer.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | const Footer = () => { 4 | return ( 5 |
6 | 7 | We are opensource now! Want to contribute questions? Submit images through this{" "} 8 | 9 | forms 10 | {" "} 11 | link 12 | 13 |
14 | ); 15 | }; 16 | 17 | Footer.propTypes = {}; 18 | 19 | export default Footer; 20 | -------------------------------------------------------------------------------- /src/hooks/useLocalStorage.js: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from "react"; 2 | 3 | function getStorageValue(key, defaultValue) { 4 | // getting stored value 5 | if (typeof window !== "undefined") { 6 | const saved = localStorage.getItem(key); 7 | const initial = saved !== null ? JSON.parse(saved) : defaultValue; 8 | return initial; 9 | } 10 | } 11 | 12 | export const useLocalStorage = (key, defaultValue = 1) => { 13 | const [value, setValue] = useState(() => { 14 | return getStorageValue(key, defaultValue); 15 | }); 16 | 17 | useEffect(() => { 18 | // storing input name 19 | localStorage.setItem(key, JSON.stringify(value)); 20 | }, [key, value]); 21 | 22 | return [value, setValue]; 23 | }; 24 | -------------------------------------------------------------------------------- /src/components/banner.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | const Banner = () => { 4 | const [bannerText, setBannerText] = React.useState(process.env.REACT_APP_BANNER); 5 | return ( 6 | bannerText && ( 7 |
8 |
9 | info 10 | 11 |
12 | 13 |
14 | 17 |
18 |
19 | ) 20 | ); 21 | }; 22 | 23 | Banner.propTypes = {}; 24 | 25 | export default Banner; 26 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line no-undef 2 | module.exports = { 3 | env: { 4 | browser: true, 5 | node: true, 6 | es6: true 7 | }, 8 | extends: ["eslint:recommended", "plugin:react/recommended", "plugin:prettier/recommended"], 9 | globals: { 10 | Atomics: "readonly", 11 | SharedArrayBuffer: "readonly" 12 | }, 13 | parser: "@babel/eslint-parser", 14 | parserOptions: { 15 | ecmaFeatures: { 16 | jsx: true 17 | }, 18 | ecmaVersion: 2018, 19 | sourceType: "module" 20 | }, 21 | plugins: ["react"], 22 | rules: { 23 | "react/react-in-jsx-scope": "off", 24 | // to get rid of prettier end of line errors 25 | "prettier/prettier": [ 26 | "error", 27 | { 28 | endOfLine: "auto" 29 | } 30 | ] 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /public/serviceWorker.js: -------------------------------------------------------------------------------- 1 | const CACHE_NAME = "version-1"; 2 | const urlsToCache = ["index.html", "offline.html"]; 3 | 4 | const self = this; 5 | 6 | self.addEventListener("install", (event) => { 7 | event.waitUntil( 8 | caches.open(CACHE_NAME).then((cache) => { 9 | return cache.addAll(urlsToCache); 10 | }) 11 | ); 12 | }); 13 | 14 | self.addEventListener("fetch", (event) => { 15 | event.respondWith( 16 | caches.match(event.request).then(() => { 17 | return fetch(event.request).catch(() => console.log("network request did not go through")); 18 | }) 19 | ); 20 | }); 21 | 22 | self.addEventListener("activate", (event) => { 23 | const cacheWhitelist = []; 24 | cacheWhitelist.push(CACHE_NAME); 25 | 26 | event.waitUntil( 27 | caches.keys().then((cacheNames) => 28 | Promise.all( 29 | cacheNames.map((cacheName) => { 30 | if (!cacheWhitelist.includes(cacheName)) { 31 | return caches.delete(cacheName); 32 | } 33 | }) 34 | ) 35 | ) 36 | ); 37 | }); 38 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## About The Project 2 | 3 | `Pattukunte Pattucheera` is another game inspired from Wordle. But for Tollywood 🎥. 4 | 5 | ### Installation 6 | 7 | 1. Clone the repo 8 | ```sh 9 | git clone https://github.com/santoshimz/pattukunte-pattucheera.git 10 | ``` 11 | 3. Install NPM packages 12 | ```sh 13 | npm install 14 | ``` 15 | 4. Run the application 16 | ```sh 17 | npm start 18 | ``` 19 | 20 | ## Contributing 21 | 22 | Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**. 23 | 24 | If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". If you found any bug, you can raise issue for it with tag as "bug". 25 | 26 | 27 | 1. Clone the Project (`git clone https://github.com/santoshimz/pattukunte-pattucheera.git`) 28 | 2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`) 29 | 3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`) 30 | 4. Push to the Branch (`git push origin feature/AmazingFeature`) 31 | 5. Open a Pull Request 32 | 33 | 34 | 35 | Don't forget to give the project a star! Thanks again! 36 | 37 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | darkMode: "class", 4 | content: ["./src/**/*.{js,jsx,ts,tsx}"], 5 | theme: { 6 | extend: { 7 | keyframes: { 8 | progressAnimation: { 9 | "0%": { width: "0%" } 10 | } 11 | }, 12 | colors: { 13 | "modal-bg-dark": "#1a1b1a", 14 | primary: "#000", 15 | secondary: "#fff", 16 | transparentBg: "#0000004f", 17 | darkComponentBg: "#3d3d3d", 18 | darkComponentText: "#808080" 19 | }, 20 | spacing: { 21 | 90: "22.5rem", 22 | 1.25: "5px", 23 | 2.75: "11px", 24 | 90: "90%", 25 | 85: "85%" 26 | }, 27 | minWidth: { 28 | 10: "2.5rem", 29 | 33: "33.3333%", 30 | 50: "50%", 31 | 68: "68%", 32 | 96: "24rem" 33 | }, 34 | maxWidth: { 35 | 82: "78%" 36 | }, 37 | animation: { 38 | progress: "progressAnimation 1.5s ease-in-out" 39 | }, 40 | zIndex: { 41 | 1: "1" 42 | } 43 | }, 44 | screens: { 45 | sm: "380px", 46 | md: "768px", 47 | lg: "1024px", 48 | xl: "1280px", 49 | "2xl": "1536px" 50 | } 51 | }, 52 | plugins: [] 53 | }; 54 | -------------------------------------------------------------------------------- /src/components/ShareButton.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { composeShareText } from "../utils/constants"; 3 | import PropTypes from "prop-types"; 4 | 5 | const ShareButton = ({ 6 | shareText, 7 | setShareText, 8 | currentIndex, 9 | gameStatus, 10 | dayCount, 11 | isTimeTravelled 12 | }) => { 13 | const copyText = async () => { 14 | window.gtag("event", "share_clicked", { event_category: "share_clicked" }); 15 | if (navigator.share) { 16 | const shareData = { 17 | title: "Pattukunte PattuCheera", 18 | text: composeShareText(gameStatus, dayCount, isTimeTravelled, currentIndex) 19 | }; 20 | try { 21 | await navigator.share(shareData); 22 | } catch (err) { 23 | console.log(err); 24 | } 25 | } else { 26 | let str = composeShareText(gameStatus, dayCount, isTimeTravelled, currentIndex); 27 | navigator.clipboard.writeText(str); 28 | setShareText("COPIED"); 29 | } 30 | }; 31 | return ( 32 | <> 33 | 38 | 39 | ); 40 | }; 41 | 42 | ShareButton.propTypes = { 43 | shareText: PropTypes.string, 44 | setShareText: PropTypes.func, 45 | currentIndex: PropTypes.number, 46 | gameStatus: PropTypes.string, 47 | dayCount: PropTypes.number, 48 | isTimeTravelled: PropTypes.bool 49 | }; 50 | 51 | export default ShareButton; 52 | -------------------------------------------------------------------------------- /src/components/NextGameTimer.js: -------------------------------------------------------------------------------- 1 | import React, { useState, useEffect } from "react"; 2 | import { getDateTimeInUTC, getTimeDifference } from "../utils/constants"; 3 | const NextGameTimer = () => { 4 | const [diff, setDiff] = useState({ days: "--", hours: "--", minutes: "--", seconds: "--" }); 5 | 6 | useEffect(() => { 7 | const interval = setInterval(() => { 8 | const nextGameDate = getNextGameDate(); 9 | const diff = getTimeDifference(nextGameDate, getDateTimeInUTC(new Date())); 10 | if (diff.hours === 0 && diff.minutes === 0 && diff.seconds === 0) { 11 | window.location.reload(); 12 | } 13 | setDiff(diff); 14 | }, 1000); 15 | return () => { 16 | clearInterval(interval); 17 | }; 18 | }, []); 19 | 20 | function getNextGameDate() { 21 | let today = new Date(); 22 | let todayInUTC = new Date(`${today.toISOString().split("T")[0]}T18:30:00.000Z`); 23 | const todayDiff = getTimeDifference(todayInUTC, getDateTimeInUTC(new Date())); 24 | if (todayDiff.hours < 0) { 25 | today.setDate(today.getDate() + 1); 26 | return new Date(`${today.toISOString().split("T")[0]}T18:30:00.000Z`); 27 | } 28 | return todayInUTC; 29 | } 30 | return ( 31 |
32 | Next Movie in 33 |
34 | {diff.hours} hrs : {diff.minutes} mins : 35 | {diff.seconds} secs 36 |
37 |
38 | ); 39 | }; 40 | 41 | NextGameTimer.propTypes = {}; 42 | 43 | export default NextGameTimer; 44 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pattukunte-pattucheera", 3 | "version": "0.0.1", 4 | "private": true, 5 | "dependencies": { 6 | "fuse.js": "^6.6.2", 7 | "lodash": "^4.17.21", 8 | "qs": "6.8.0", 9 | "react": "17.0.2", 10 | "react-dom": "17.0.2", 11 | "react-dom-confetti": "^0.2.0", 12 | "react-instantsearch-dom": "6.26.0", 13 | "react-modal": "^3.15.1", 14 | "react-scripts": "^5.0.1", 15 | "react-select": "^5.3.2", 16 | "serve": "^13.0.2" 17 | }, 18 | "scripts": { 19 | "start": "react-scripts start", 20 | "build": "rm -rf public/static && react-scripts build", 21 | "test": "react-scripts test", 22 | "eject": "react-scripts eject", 23 | "lint": "eslint .", 24 | "lint:fix": "eslint --fix", 25 | "format": "prettier --write './**/*.{js,jsx,ts,tsx,css,md,json}' --config ./.prettierrc", 26 | "postinstall": "node scripts/create-env.js" 27 | }, 28 | "eslintConfig": { 29 | "extends": "react-app" 30 | }, 31 | "browserslist": { 32 | "production": [ 33 | ">0.2%", 34 | "not dead", 35 | "not op_mini all" 36 | ], 37 | "development": [ 38 | "last 1 chrome version", 39 | "last 1 firefox version", 40 | "last 1 safari version" 41 | ] 42 | }, 43 | "devDependencies": { 44 | "@babel/eslint-parser": "^7.18.9", 45 | "autoprefixer": "^10.4.12", 46 | "eslint-config-prettier": "^8.5.0", 47 | "eslint-plugin-prettier": "^4.0.0", 48 | "eslint-plugin-react": "^7.30.0", 49 | "postcss": "^8.4.18", 50 | "prettier": "^2.6.2", 51 | "react-router-dom": "^6.3.0", 52 | "tailwindcss": "^3.1.8" 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/components/ImagesContainer.js: -------------------------------------------------------------------------------- 1 | import range from "lodash/range"; 2 | import React from "react"; 3 | import PropTypes from "prop-types"; 4 | import { GAME_STATUS, isProduction, MAX_ATTEMPTS } from "../utils/constants"; 5 | 6 | const ImagesContainer = ({ 7 | buttonLogic, 8 | setButtonLogic, 9 | currentIndexFromButton, 10 | currentIndexFromStorage, 11 | setCurrentIndexFromButton, 12 | gameStatus, 13 | dayCount 14 | }) => { 15 | //eslint-disable-next-line react/prop-types 16 | 17 | const buildImageUrl = (index) => 18 | `${process.env.REACT_APP_CDN_URL}${ 19 | isProduction() ? "/" + dayCount : "" 20 | }/${index.toString()}.jpg`; 21 | 22 | return ( 23 |
24 | 33 |
34 | {range( 35 | 0, 36 | gameStatus !== GAME_STATUS.COMPLETED ? currentIndexFromStorage : MAX_ATTEMPTS 37 | ).map((index) => { 38 | return ( 39 | 53 | ); 54 | })} 55 |
56 |
57 | ); 58 | }; 59 | 60 | ImagesContainer.propTypes = { 61 | buttonLogic: PropTypes.bool, 62 | setButtonLogic: PropTypes.func, 63 | currentIndexFromButton: PropTypes.number, 64 | currentIndexFromStorage: PropTypes.number, 65 | setCurrentIndexFromButton: PropTypes.func, 66 | gameStatus: PropTypes.string, 67 | dayCount: PropTypes.number 68 | }; 69 | 70 | export default ImagesContainer; 71 | -------------------------------------------------------------------------------- /src/components/RulesModal.js: -------------------------------------------------------------------------------- 1 | import Modal from "react-modal"; 2 | import React from "react"; 3 | import PropTypes from "prop-types"; 4 | import imageIcon from "../assets/image.png"; 5 | import viewIcon from "../assets/view.png"; 6 | import numberFiveIcon from "../assets/number-five.png"; 7 | 8 | const RulesModal = ({ openRulesModal, setOpenRulesModal }) => { 9 | return ( 10 | setOpenRulesModal(false)} 14 | ariaHideApp={false} 15 | style={{ 16 | content: { 17 | position: "absolute", 18 | top: "50%", 19 | right: "50%", 20 | transform: "translate(50%,-50%)" 21 | } 22 | }}> 23 |
24 |

How to Play ?

25 | 28 |
29 |
30 |

31 | 32 | close 33 | 34 | Use the image provided to guess the name of the movie. 35 |

36 |

37 | 38 | close 39 | 40 | If you get a guess wrong a new image from the same movie is revealed. 41 |

42 |

43 | 44 | close 45 | 46 | You have five chances to guess the movie 47 |

48 |
49 |
50 | ); 51 | }; 52 | 53 | RulesModal.propTypes = { 54 | openRulesModal: PropTypes.bool, 55 | setOpenRulesModal: PropTypes.func 56 | }; 57 | 58 | export default RulesModal; 59 | -------------------------------------------------------------------------------- /src/components/ShareResults.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { composeShareText } from "../utils/constants"; 3 | import PropTypes from "prop-types"; 4 | import twitterShare from "../assets/twitter.png"; 5 | import fbShare from "../assets/fb.png"; 6 | import whatsappShare from "../assets/whatsapp.png"; 7 | import NextGameTimer from "./NextGameTimer"; 8 | import ShareButton from "./ShareButton"; 9 | const ShareResults = ({ 10 | shareText, 11 | setShareText, 12 | currentIndex, 13 | gameStatus, 14 | dayCount, 15 | isTimeTravelled 16 | }) => { 17 | const socialShare = (app) => { 18 | switch (app) { 19 | case "twitter": 20 | window.gtag("event", "twitter_share", { event_category: "social_share" }); 21 | window.open( 22 | "https://twitter.com/intent/tweet?text=" + 23 | encodeURIComponent( 24 | composeShareText(gameStatus, dayCount, isTimeTravelled, currentIndex) 25 | ), 26 | "_blank" 27 | ); 28 | break; 29 | case "facebook": 30 | window.gtag("event", "facebook_share", { event_category: "social_share" }); 31 | window.open( 32 | `https://www.facebook.com/sharer/sharer.php?u=https://pattukunte-pattucheera.netlify.app/"e=${encodeURIComponent( 33 | composeShareText(gameStatus, dayCount, isTimeTravelled, currentIndex) 34 | )}`, 35 | "_blank" 36 | ); 37 | break; 38 | case "whatsapp": 39 | window.gtag("event", "whatsapp_share", { event_category: "social_share" }); 40 | window.open( 41 | `https://wa.me?text=${encodeURIComponent( 42 | composeShareText(gameStatus, dayCount, isTimeTravelled, currentIndex) 43 | )}`, 44 | "_blank" 45 | ); 46 | break; 47 | } 48 | }; 49 | 50 | return ( 51 | <> 52 |
53 | {!isTimeTravelled && ( 54 |
55 | 56 |
57 | )} 58 | 66 |
67 |
68 | socialShare("twitter")} 71 | src={twitterShare} 72 | alt="twitter-share" 73 | /> 74 | 75 | socialShare("whatsapp")} 78 | src={whatsappShare} 79 | alt="whatsapp-share" 80 | /> 81 | 82 | socialShare("facebook")} 85 | src={fbShare} 86 | alt="facebook-share" 87 | /> 88 |
89 | 90 | ); 91 | }; 92 | 93 | ShareResults.propTypes = { 94 | shareText: PropTypes.string, 95 | setShareText: PropTypes.func, 96 | currentIndex: PropTypes.number, 97 | gameStatus: PropTypes.string, 98 | dayCount: PropTypes.number, 99 | isTimeTravelled: PropTypes.bool 100 | }; 101 | 102 | export default ShareResults; 103 | -------------------------------------------------------------------------------- /src/components/Stats.js: -------------------------------------------------------------------------------- 1 | import Modal from "react-modal"; 2 | import React from "react"; 3 | import PropTypes from "prop-types"; 4 | import { MAX_ATTEMPTS } from "../utils/constants"; 5 | import { range } from "lodash"; 6 | 7 | const Stats = ({ openStatsModal, setOpenStatsModal, statsObj, guessData }) => { 8 | const { gamesPlayed, gamesWon, currentStreak, maxStreak } = statsObj; 9 | const sum = Object.keys(guessData).reduce((acc, val) => acc + guessData[val], 0); 10 | 11 | const getGraphWidth = (index) => { 12 | const percent = guessData[index + 1] !== 0 ? (guessData[index + 1] / sum) * 100 : 0; 13 | return Math.round(percent); 14 | }; 15 | 16 | const guessBars = Object.keys(guessData).map((key, ind) => getGraphWidth(ind)); 17 | return ( 18 | setOpenStatsModal(false)} 21 | ariaHideApp={false} 22 | className="w-90 md:w-1/3 lg:w-1/4 border-2 dark:border-primary border-gray-300/50 rounded bg-slate-200 dark:bg-primary text-primary dark:text-secondary p-5 text-xl top-[25%]" 23 | style={{ 24 | content: { 25 | position: "absolute", 26 | top: "50%", 27 | right: "50%", 28 | transform: "translate(50%,-50%)" 29 | } 30 | }}> 31 |
32 |

Stats

33 | 36 |
37 |
38 |
39 | 40 | {gamesPlayed} 41 | 42 | Played 43 |
44 |
45 | {gamesWon} 46 | Won 47 |
48 |
49 | 50 | {gamesPlayed > 0 ? ((gamesWon / gamesPlayed) * 100).toFixed(2) : 0} 51 | 52 | Win % 53 |
54 |
55 |
56 |
57 | 58 | {currentStreak ? currentStreak : gamesPlayed === gamesWon && gamesWon === 1 ? 1 : 0} 🔥 59 | 60 | Current Streak 61 |
62 |
63 | 64 | {maxStreak ? maxStreak : gamesPlayed === gamesWon && gamesWon === 1 ? 1 : 0} 💪 65 | 66 | Max Streak 67 |
68 |
69 |

Guess distribution

70 |
71 | {range(0, MAX_ATTEMPTS).map(function (_, index) { 72 | return ( 73 |
74 |
{index + 1}
{" "} 75 |
76 |
83 | {guessBars[index]} % 84 |
85 |
86 | ); 87 | })} 88 |
89 |
90 | ); 91 | }; 92 | 93 | Stats.propTypes = { 94 | openStatsModal: PropTypes.bool, 95 | setOpenStatsModal: PropTypes.func, 96 | statsObj: PropTypes.object, 97 | guessData: PropTypes.object, 98 | shareText: PropTypes.string, 99 | setShareText: PropTypes.func, 100 | currentIndex: PropTypes.number, 101 | gameStatus: PropTypes.string, 102 | dayCount: PropTypes.number, 103 | isTimeTravelled: PropTypes.bool 104 | }; 105 | 106 | export default Stats; 107 | -------------------------------------------------------------------------------- /src/App.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import "./styles/App.css"; 3 | import Home from "./pages/Home"; 4 | import { BrowserRouter, Routes, Route } from "react-router-dom"; 5 | import TimeTravel from "./pages/TimeTravel"; 6 | import Banner from "./components/banner"; 7 | import { missingMovies } from "./utils/constants"; 8 | 9 | const fabBtn = { 10 | // border-radius: 50%; 11 | backgroundImage: `url( 12 | https://d2t2f7d530jwgo.cloudfront.net/bm.gif 13 | )`, 14 | backgroundPosition: "-12px", 15 | cursor: "pointer" 16 | // width: 90px; 17 | // height: 90px; 18 | // position: sticky; 19 | // left: 80%; 20 | // top: 80%; 21 | }; 22 | 23 | const App = () => { 24 | const [moviesList, setMoviesList] = React.useState([]); 25 | const [theme, setTheme] = React.useState( 26 | localStorage.getItem("theme") ? localStorage.getItem("theme") : "dark" 27 | ); 28 | const [showUploadIcon, setShowUploadIcon] = React.useState(false); 29 | React.useEffect(() => { 30 | if (!localStorage.getItem("theme")) { 31 | localStorage.setItem("theme", "dark"); 32 | document.querySelector("html").classList.add("dark"); 33 | } else { 34 | if ( 35 | localStorage.getItem("theme") === "dark" || 36 | (!("theme" in localStorage) && window.matchMedia("(prefers-color-scheme: dark)").matches) 37 | ) { 38 | document.querySelector("html").classList.add(localStorage.getItem("theme")); 39 | } 40 | } 41 | fetch(`${process.env.REACT_APP_S3}/movies.json`) 42 | .then((response) => response.json()) 43 | .then((movies) => { 44 | const moviesSet = new Set(movies); 45 | missingMovies.forEach((mv) => { 46 | if (!moviesSet.has(mv)) { 47 | movies.push(mv); 48 | } 49 | }); 50 | setMoviesList(movies); 51 | }) 52 | .catch((error) => console.log(error)); 53 | }, []); 54 | 55 | return ( 56 | <> 57 |
58 |
59 | {showUploadIcon && ( 60 | <> 61 | 65 | 66 | 67 | 68 |

69 | upload movies 70 |

71 | 72 | )} 73 | {/* { 76 | setShowUploadIcon(!showUploadIcon); 77 | }}> */} 78 |
{ 80 | setShowUploadIcon(!showUploadIcon); 81 | window.gtag("event", "UploadClicked", { event_category: "game-stats" }); 82 | }} 83 | className="w-full h-full rounded-full" 84 | style={fabBtn}>
85 |
86 | {theme === "dark" && ( 87 | 97 | )} 98 | {theme === "light" && ( 99 | 109 | )} 110 | {process.env.REACT_APP_BANNER && } 111 | 112 | 113 | } /> 114 | } /> 115 | 116 | 117 |
118 | 119 | ); 120 | }; 121 | 122 | export default App; 123 | -------------------------------------------------------------------------------- /src/components/Results.js: -------------------------------------------------------------------------------- 1 | import React, { useMemo } from "react"; 2 | import range from "lodash/range"; 3 | import PropTypes from "prop-types"; 4 | import { GAME_STATUS } from "../utils/constants"; 5 | 6 | const Results = ({ 7 | currentGuesses, 8 | gameStatus, 9 | currentIndex, 10 | movie, 11 | contributor, 12 | contributorTwitterId, 13 | gameFinished 14 | }) => { 15 | const allGuesses = currentGuesses !== "" ? currentGuesses.split(",") : []; 16 | const gameSuccess = useMemo(() => gameStatus === GAME_STATUS.COMPLETED, [gameStatus]); 17 | const gameFailed = useMemo(() => gameStatus === GAME_STATUS.FAILED, [gameStatus]); 18 | const gameRunning = useMemo(() => gameStatus === GAME_STATUS.RUNNING, [gameStatus]); 19 | const getTwitterProfile = (twitterId) => { 20 | return ( 21 | window.gtag("event", "checking-contributor", { event_category: "misc" })} 24 | href={"https://twitter.com/" + cleanTwitterId(twitterId)}> 25 | @{cleanTwitterId(twitterId)} 26 | 27 | ); 28 | }; 29 | 30 | const cleanTwitterId = (id) => { 31 | return id.replaceAll("@", ""); 32 | }; 33 | 34 | return ( 35 |
36 |
37 | {gameRunning && ( 38 | 39 | You got{" "} 40 | = 4 43 | ? "text-green-500" 44 | : 6 - currentIndex === 3 45 | ? "text-orange-500" 46 | : 6 - currentIndex < 3 47 | ? "text-red-500" 48 | : null 49 | }`}> 50 | {6 - currentIndex} 51 | {" "} 52 | guesses remaining out of 5. 53 | 54 | )} 55 | {gameSuccess && ( 56 | 57 | You got it - The answer was 58 | {movie} 59 | 60 | )} 61 | {gameFailed && ( 62 | 63 | The answer was 64 | {movie} 65 | 66 | )} 67 |
68 | {range(1, currentIndex).map(() => { 69 | return ( 70 | 71 | 72 | 73 | ); 74 | })} 75 | {gameSuccess && ( 76 | 77 | 78 | 79 | )} 80 | {gameFailed && ( 81 | 82 | 83 | 84 | )} 85 |
86 |
87 | {allGuesses.map((allGuess, index) => { 88 | return ( 89 |
92 | 93 | 94 | 95 | {allGuess} 96 |
97 | ); 98 | })} 99 | {gameSuccess && ( 100 |
101 | 102 | 103 | 104 | {movie} 105 |
106 | )} 107 | {(contributor || contributorTwitterId) && gameFinished && ( 108 | 109 | Contributed by   110 | {!contributorTwitterId ? "@" + contributor : getTwitterProfile(contributorTwitterId)} 111 | 112 | )} 113 |
114 | ); 115 | }; 116 | 117 | Results.propTypes = { 118 | currentGuesses: PropTypes.string, 119 | gameStatus: PropTypes.string, 120 | currentIndex: PropTypes.number, 121 | movie: PropTypes.string, 122 | contributor: PropTypes.string, 123 | contributorTwitterId: PropTypes.string, 124 | gameFinished: PropTypes.bool 125 | }; 126 | 127 | export default Results; 128 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 31 | 32 | 33 | 42 | Pattukunte Pattucheera 43 | 44 | 45 | 46 | 47 | 48 |
49 | 50 | 51 | 61 | 73 | 106 | 107 | 108 | 109 | -------------------------------------------------------------------------------- /src/pages/TimeTravel.js: -------------------------------------------------------------------------------- 1 | import React, { useCallback } from "react"; 2 | import { 3 | getTimeDifference, 4 | getDateTimeInUTC, 5 | getDayCount, 6 | GAME_STATUS, 7 | isProduction 8 | } from "../utils/constants"; 9 | import { useLocalStorage } from "../hooks/useLocalStorage"; 10 | import Game from "../components/Game"; 11 | import ImagesContainer from "../components/ImagesContainer"; 12 | import { useNavigate } from "react-router-dom"; 13 | import PropTypes from "prop-types"; 14 | 15 | const TimeTravel = ({ moviesList }) => { 16 | const [currentIndexFromStorage, setCurrentIndexFromStorage] = useLocalStorage( 17 | "timeTravel-currentIndex", 18 | 1 19 | ); 20 | const [buttonLogic, setButtonLogic] = React.useState(false); 21 | const [currentIndexFromButton, setCurrentIndexFromButton] = 22 | React.useState(currentIndexFromStorage); 23 | const [currentGuesses, setCurrentGuesses] = useLocalStorage("timeTravel-currentGuesses", ""); 24 | const [gameStatus, setGameStatus] = useLocalStorage("timeTravel-gameStatus", GAME_STATUS.RUNNING); 25 | const [day, setDay] = useLocalStorage("timeTravel-day", 1); 26 | const [movie, setMovie] = React.useState(""); 27 | const [contributor, setContributor] = React.useState(""); 28 | const [loading, setLoading] = React.useState(false); 29 | const [shareText, setShareText] = React.useState("SHARE"); 30 | 31 | const [timeTravelDate, setTimeTravelDate] = React.useState(getDayCount(new Date()) - 1); 32 | // eslint-disable-next-line no-unused-vars 33 | const [showLoader, setShowLoader] = React.useState(true); 34 | const [contributorTwitterId, setContributorTwitterId] = React.useState(""); 35 | const yesterday = new Date(new Date().setDate(new Date().getDate() - 1)) 36 | .toISOString() 37 | .split("T")[0]; 38 | const [selectedDate, setSelectedDate] = React.useState(yesterday); 39 | React.useEffect(() => { 40 | const dayCount = timeTravelDate >= 0 ? timeTravelDate : getDayCount() - 1; 41 | if (showLoader) { 42 | setLoading(true); 43 | } 44 | fetch(`${process.env.REACT_APP_CDN_URL}${isProduction() ? "/" + dayCount : ""}/meta-data.json`) 45 | .then((response) => response.json()) 46 | .then((json) => { 47 | setMovie(json.movie); 48 | setContributor(json.contributor); 49 | setContributorTwitterId(json.twitterId); 50 | setTimeout(() => setLoading(false), 500); 51 | }) 52 | .catch((error) => console.log(error)); 53 | if (day !== dayCount) { 54 | setGameStatus(GAME_STATUS.RUNNING); 55 | setDay(dayCount); 56 | setCurrentGuesses(""); 57 | setCurrentIndexFromStorage(1); 58 | setCurrentIndexFromButton(1); 59 | } 60 | }, [timeTravelDate, setCurrentGuesses, setCurrentIndexFromStorage, setDay, setGameStatus]); 61 | 62 | const handleChangeFromDate = (event) => { 63 | window.gtag("event", "time-travelled", { event_category: "game-stats" }); 64 | const selectedDate = event.target.value; 65 | let diff = getTimeDifference( 66 | getDateTimeInUTC(new Date(selectedDate)), 67 | new Date("2022-05-22T18:30:00.000Z") 68 | ); 69 | if (!selectedDate || diff.days > getDayCount() - 1) { 70 | setTimeTravelDate(getDayCount(new Date()) - 1); 71 | setSelectedDate(yesterday); 72 | return; 73 | } 74 | setSelectedDate(selectedDate); 75 | 76 | setTimeTravelDate(diff.days); 77 | }; 78 | 79 | const isTimeTravelled = (day) => { 80 | return day !== null && day !== undefined && day >= 0; 81 | }; 82 | 83 | const navigate = useNavigate(); 84 | const goBack = useCallback(() => navigate("/", { replace: true }), [navigate]); 85 | 86 | return ( 87 |
88 | {/*

Time Travel to past!

*/} 89 | {timeTravelDate >= 0 && ( 90 | <> 91 |
92 | {" "} 93 | 99 |
100 |
101 | You are playing day #{timeTravelDate} game 102 |
103 | 104 | )} 105 |
106 |
107 | 108 | 117 |
118 |
119 |
120 | {showLoader && loading && ( 121 |
122 | 123 |
124 | )} 125 | 126 | {!loading && ( 127 | <> 128 |
129 |

Note: This results will not be included in streak or any other daily game stats

130 |
131 | 140 | 159 | 160 | )} 161 |
162 |
163 | ); 164 | }; 165 | TimeTravel.propTypes = { 166 | moviesList: PropTypes.array 167 | }; 168 | 169 | export default TimeTravel; 170 | -------------------------------------------------------------------------------- /src/utils/constants.js: -------------------------------------------------------------------------------- 1 | export const greenSquare = "🟩"; 2 | 3 | export const redSquare = "🟥"; 4 | 5 | export const graySquare = "⬛"; 6 | 7 | export const blueSquare = "🟦"; 8 | 9 | export const MAX_ATTEMPTS = 5; 10 | 11 | export const getShareText = (attempts, gameStatus, isTimeTravelled = false) => { 12 | let shareText = ""; 13 | if (gameStatus === GAME_STATUS.FAILED) { 14 | shareText = Array(MAX_ATTEMPTS) 15 | .fill(isTimeTravelled ? blueSquare : redSquare) 16 | .join(""); 17 | return shareText; 18 | } 19 | for (let i = 1; i <= MAX_ATTEMPTS; i++) { 20 | if (i < attempts) { 21 | shareText += isTimeTravelled ? blueSquare : redSquare; 22 | } else if (i === attempts) { 23 | shareText += greenSquare; 24 | } else { 25 | shareText += graySquare; 26 | } 27 | } 28 | return shareText; 29 | }; 30 | 31 | export const SITE_URL = "https://pattukunte-pattucheera.netlify.app"; 32 | 33 | export const TIME_TRAVEL_URL = `${SITE_URL}/time-travel`; 34 | 35 | export const GAME_STATUS = { 36 | COMPLETED: "completed", 37 | FAILED: "failed", 38 | RUNNING: "running" 39 | }; 40 | 41 | export function getTimeDifference(date1, date2) { 42 | var diffSeconds = (date1.getTime() - date2.getTime()) / 1000; 43 | const days = Math.floor(diffSeconds / (24 * 60 * 60)); 44 | const hours = Math.floor((diffSeconds % (24 * 60 * 60)) / (60 * 60)); 45 | const minutes = Math.floor((diffSeconds % (60 * 60)) / 60); 46 | const seconds = Math.floor(diffSeconds % 60); 47 | return { days: days, hours: hours, minutes: minutes, seconds: seconds }; 48 | } 49 | 50 | export function getDayCount() { 51 | const diff = getTimeDifference( 52 | getDateTimeInUTC(new Date()), 53 | new Date("2022-05-22T18:30:00.000Z") 54 | ); 55 | return Math.abs(diff.days); 56 | } 57 | export const intialGuessDistribution = new Array(MAX_ATTEMPTS).fill().reduce((acc, _, index) => { 58 | acc[index + 1] = 0; 59 | return acc; 60 | }, {}); 61 | 62 | export const getDateTimeInUTC = (date) => { 63 | return new Date( 64 | Date.UTC( 65 | date.getUTCFullYear(), 66 | date.getUTCMonth(), 67 | date.getUTCDate(), 68 | date.getUTCHours(), 69 | date.getUTCMinutes(), 70 | date.getUTCSeconds() 71 | ) 72 | ); 73 | }; 74 | 75 | export const isProduction = () => { 76 | return process.env.NODE_ENV && process.env.NODE_ENV === "production"; 77 | }; 78 | 79 | export const githubRepoLink = "https://github.com/santoshimz/pattukunte-pattucheera"; 80 | 81 | export const composeShareText = (gameStatus, dayCount, isTimeTravelled, currentIndex) => { 82 | return `Pattukunte Pattucheera Day ${dayCount}${isTimeTravelled ? "(Time Travelled)" : ""}\ 83 | : ${gameStatus === GAME_STATUS.FAILED ? "0" : currentIndex}/5\n\n${getShareText( 84 | currentIndex, 85 | gameStatus, 86 | isTimeTravelled 87 | )}\n\n${SITE_URL}\n#PattukuntePattuCheera`; 88 | }; 89 | 90 | export const isGameDone = (gameStatus) => { 91 | return gameStatus === GAME_STATUS.COMPLETED || gameStatus === GAME_STATUS.FAILED; 92 | }; 93 | 94 | export const missingMovies = [ 95 | "13 B", 96 | "Mangalyam", 97 | "Oke Okkadu", 98 | "Robo", 99 | "RRR", 100 | "Veedokkade", 101 | "Ashokavanam lo Arjuna Kalyanam", 102 | "Shivaji", 103 | "Premikula Roju", 104 | "EESHWAR", 105 | "Nani", 106 | "Mishan Impossible", 107 | "Chandrahas", 108 | "Sarkaru Vaari Paata", 109 | "krishna vrinda vihari", 110 | "Panchathantram", 111 | "Rajendrudu Gajendrudu", 112 | "Seenu Vasanthi Lakshmi", 113 | "Snehitudu", 114 | "Drushyam 2", 115 | "Major", 116 | "Shyam Singha Roy", 117 | "Agniparvatham", 118 | "Nagaram", 119 | "Narasimha Naidu", 120 | "Laddu Babu", 121 | "Bendu Theesta", 122 | "Boys", 123 | "GodFather", 124 | "Kanulu Kanulanu Dochayante", 125 | "Adbhutham", 126 | "Remo", 127 | "Khakee", 128 | "Maine Pyar Kiya", 129 | "Cheli", 130 | "Jai Bhim", 131 | "Roja", 132 | "Aawara", 133 | "KGF: Chapter 2", 134 | "Radhe Shyam", 135 | "Like, Share & Subscribe", 136 | "Most Eligible Bachelor", 137 | "College Don", 138 | "Darbar", 139 | "Happy Birthday", 140 | "Viyyalavari Kayyalu", 141 | "Mallanna", 142 | "Gouravam", 143 | "Raja Rani", 144 | "Konda Polam", 145 | "Gopi Gopika Godavari", 146 | "Naa Peru Shiva", 147 | "Police Story", 148 | "Sardar", 149 | "Uppena", 150 | "Love Life & Pakodi", 151 | "Michael Madana Kama Raju", 152 | "Yuva", 153 | "Bhagyalakshmi Bumper Draw", 154 | "Mahaan", 155 | "Oke Oka Jeevitham", 156 | "Rajakumarudu", 157 | "Veera Simha Reddy", 158 | "Krishna", 159 | "The Legend", 160 | "Aalasyam Amrutam", 161 | "Dhamaka", 162 | "Waltair Veerayya", 163 | "Abbayitho Ammayi", 164 | "Dopidi", 165 | "Writer Padmabhushan", 166 | "Jeans", 167 | "Bangarraju", 168 | "Brahmalokam To Yamalokam Via Bhoolokam", 169 | "Kuberulu", 170 | "Vakeel Saab", 171 | "Bheemla Nayak", 172 | "Dasara", 173 | "Sir", 174 | "Bombay", 175 | "Premikudu", 176 | "Mahanandi", 177 | "Villain", 178 | "Das Ka Dhamki", 179 | "Surya s/o Krishnan", 180 | "Masooda", 181 | "Tulasi", 182 | "Nava Manmadhudu", 183 | "DJ Tillu", 184 | "Nee Manasu Naaku Telusu", 185 | "Gemini", 186 | "Middle Class Melodies", 187 | "Puttintiki Ra Chelli", 188 | "Ninnila Ninnila", 189 | "Virupaksha", 190 | "Ghajini", 191 | "Ante Sundaraniki", 192 | "Romancham", 193 | "Manamantha", 194 | "24", 195 | "Yentavaadu Gaani", 196 | "Thuppaki", 197 | "Phalana Abbayi Phalana Ammayi", 198 | "Urvasivo Rakshasivo", 199 | "Ravanasura", 200 | "V", 201 | "Custody", 202 | "Leo", 203 | "Leo", 204 | "Anandamanandamaye", 205 | "Vinaro Bhagyamu Vishnu Katha", 206 | "Maaro", 207 | "Rowdy boys", 208 | "Satya", 209 | "A Aa", 210 | "Samajavaragamana", 211 | "Mounamelanoyi", 212 | "Naandhi", 213 | "Inkokkadu", 214 | "Farhana", 215 | "Nootokka Jillala Andagadu", 216 | "Thenali", 217 | "Adipurush", 218 | "Amrutha", 219 | "Cheliya", 220 | "Kantara", 221 | "Nayakudu", 222 | "Pareshan", 223 | "Ranga Ranga Vaibhavanga", 224 | "Saradaga Ammaitho", 225 | "Ghatikudu", 226 | "Hostel Boys", 227 | "Taj Mahal", 228 | "Jaago", 229 | "Sravana Masam", 230 | "Nayudu Gari Kutumbam", 231 | "Cheppave Chirugali", 232 | "Guntur Kaaram", 233 | "Raaraju", 234 | "Anni Manchi Sakunamule", 235 | "Brahmachari", 236 | "Janaki Weds SriRam", 237 | "Virata Parvam", 238 | "BRO: The Avatar", 239 | "Tuck Jagadish", 240 | "CoCo Kokila", 241 | "Karthikeya 2", 242 | "Comali", 243 | "Skanda", 244 | "Akhanda", 245 | "Acharya", 246 | "Rangabali", 247 | "Animal", 248 | "Gandeevadhari Arjuna", 249 | "Bhagavanth Kesari", 250 | "Bedurulanka 2012", 251 | "Bhola Shankar", 252 | "Chinna", 253 | "Sakhi", 254 | "King of Kotha", 255 | "Kushi", 256 | "ABCD: Any Body Can Dance", 257 | "Tiger Nageswara Rao", 258 | "Goppinti Alludu", 259 | "MAD", 260 | "Bhamakalapam", 261 | "Agent", 262 | "Rama Rao On Duty", 263 | "Bloody Mary", 264 | "Month Of Madhu", 265 | "Liger - Saala Crossbreed", 266 | "Bimbisara", 267 | "Mangalavaaram", 268 | "Mama Maschindra", 269 | "Keedaa Cola", 270 | "Chikkadu Dorakadu", 271 | "Chandramukhi 2", 272 | "The Road", 273 | "Aadikeshava", 274 | "7th sense", 275 | "Oka Raju Oka Rani", 276 | "Extra - Ordinary Man", 277 | "Ambajipeta Marriage Band", 278 | "Prema Vimanam", 279 | "Trinetram", 280 | "Mangatayaru tiffin center", 281 | "Beast", 282 | "Beeruva", 283 | "Varun Doctor", 284 | "Petta", 285 | "Ayalaan", 286 | "Hi Nanna", 287 | "Hanu-Man", 288 | "Istam", 289 | "NET", 290 | "Babai Hotel", 291 | "Valari", 292 | "Adhirindi", 293 | "Pandem Kodi", 294 | "Hungama", 295 | "Prema Entha Madhuram", 296 | "Eagle", 297 | "Maestro", 298 | "Gaami", 299 | "Geethanjali Malli Vachindi", 300 | "The Family Star", 301 | "Premalu", 302 | "Om Bheem Bush", 303 | "Valari", 304 | "My Dear Donga", 305 | "Sundaram Master", 306 | "Bhoothaddam Bhaskar Narayana", 307 | "Tantra", 308 | "Kajal Karthika", 309 | "Matarani Mounamidi", 310 | "Mix Up", 311 | "Bubblegum", 312 | "Rani Gari Bangala", 313 | "Kota Bommali PS", 314 | "Evandoi Srivaru", 315 | "Love Mouli", 316 | "Salaar: Part 1 – Ceasefire", 317 | "Kavya's Diary", 318 | "Mathu Vadalara 2", 319 | " Mr & Mrs Sailaja Krishnamurthy", 320 | "Narasimha", 321 | "Red", 322 | "35 Chinna Katha Kaadu", 323 | "Maharaja", 324 | "Chakkiligintha", 325 | "Mazaka" 326 | ]; 327 | -------------------------------------------------------------------------------- /src/pages/Home.js: -------------------------------------------------------------------------------- 1 | import React, { useCallback } from "react"; 2 | import "../styles/App.css"; 3 | import { useLocalStorage } from "../hooks/useLocalStorage"; 4 | import PropTypes from "prop-types"; 5 | import { 6 | GAME_STATUS, 7 | getDayCount, 8 | intialGuessDistribution, 9 | isProduction 10 | } from "../utils/constants"; 11 | 12 | import Game from "../components/Game"; 13 | import Stats from "../components/Stats"; 14 | import ImagesContainer from "../components/ImagesContainer"; 15 | import RulesModal from "../components/RulesModal"; 16 | import { useNavigate } from "react-router-dom"; 17 | 18 | const Home = ({ timeTravelDate, moviesList }) => { 19 | const [currentIndexFromStorage, setCurrentIndexFromStorage] = useLocalStorage("currentIndex", 1); 20 | const [buttonLogic, setButtonLogic] = React.useState(false); 21 | const [currentIndexFromButton, setCurrentIndexFromButton] = 22 | React.useState(currentIndexFromStorage); 23 | const [currentGuesses, setCurrentGuesses] = useLocalStorage("currentGuesses", ""); 24 | const [gameStatus, setGameStatus] = useLocalStorage("gameStatus", GAME_STATUS.RUNNING); 25 | const [day, setDay] = useLocalStorage("day", 1); 26 | const [openStatsModal, setOpenStatsModal] = React.useState(false); 27 | const [openRulesModal, setOpenRulesModal] = React.useState(false); 28 | const [movie, setMovie] = React.useState(""); 29 | const [contributor, setContributor] = React.useState(""); 30 | const [contributorTwitterId, setContributorTwitterId] = React.useState(""); 31 | const [guessDistribution, setGuessDistribution] = useLocalStorage( 32 | "guessDistribution", 33 | JSON.stringify(intialGuessDistribution) 34 | ); 35 | // We want to update stats only once. This has to be idempotent 36 | const [updateStats, setUpdateStats] = useLocalStorage("updateStats-latest", false); 37 | const [shareText, setShareText] = React.useState("SHARE"); 38 | // const [isPWAState, setPWAState] = React.useState(false); 39 | const initialStats = { 40 | gamesPlayed: 0, 41 | gamesWon: 0, 42 | currentStreak: 0, 43 | maxStreak: 0 44 | }; 45 | 46 | const [stats, setStats] = useLocalStorage("stats", JSON.stringify(initialStats)); 47 | const [lastPlayedGame, setLastPlayedGame] = useLocalStorage("lastPlayedGame", ""); 48 | const statsObj = React.useMemo(() => { 49 | return typeof stats === "string" ? JSON.parse(stats) : stats; 50 | }, [stats]); 51 | 52 | React.useEffect(() => { 53 | const dayCount = timeTravelDate >= 0 ? timeTravelDate : getDayCount(); 54 | fetch(`${process.env.REACT_APP_CDN_URL}${isProduction() ? "/" + dayCount : ""}/meta-data.json`) 55 | .then((response) => response.json()) 56 | .then((json) => { 57 | setMovie(json.movie); 58 | setContributor(json.contributor); 59 | setContributorTwitterId(json.twitterId); 60 | }) 61 | .catch((error) => console.log(error)); 62 | // We had a bug where movies.json was not updated correctly resulting in people losing their streak. 63 | // This fix will make their current streak same as their max streak 64 | // This will fix the issue for users whose max streak was their current streak 65 | // This will be extra advantageous for people whose max streak is not their current streak 66 | // Probably we should start storing previousStreak 67 | if ((day === 1058 || day === 1059) && gameStatus === GAME_STATUS.FAILED && !updateStats) { 68 | setStats( 69 | JSON.stringify({ 70 | gamesPlayed: statsObj.gamesPlayed, 71 | gamesWon: statsObj.gamesWon + 1, 72 | currentStreak: statsObj.maxStreak + 1, 73 | maxStreak: statsObj.maxStreak + 1 74 | }) 75 | ); 76 | setUpdateStats(true); 77 | } 78 | if (day !== dayCount) { 79 | setGameStatus(GAME_STATUS.RUNNING); 80 | setDay(dayCount); 81 | setCurrentGuesses(""); 82 | setCurrentIndexFromStorage(1); 83 | } 84 | if (window.matchMedia("(display-mode: standalone)").matches) { 85 | // setPWAState(true); 86 | window.gtag("event", "playingUsingPWA", { event_category: "pwaInstall" }); 87 | if (localStorage.getItem("pwaInstall") == null) { 88 | localStorage.setItem("pwaInstall", "installed"); 89 | window.gtag("event", "pwaInstall", { event_category: "pwaInstall" }); 90 | } 91 | document.addEventListener("visibilitychange", function () { 92 | if (document.visibilityState === "visible") { 93 | window.location.reload(); 94 | } 95 | }); 96 | } 97 | }, [timeTravelDate, setCurrentGuesses, setCurrentIndexFromStorage, setDay, setGameStatus]); 98 | 99 | const navigate = useNavigate(); 100 | const gotoArchives = useCallback(() => navigate("/timetravel", { replace: true }), [navigate]); 101 | 102 | return ( 103 |
104 |

105 | Pattukunte Pattucheera 106 |

107 | {/* navbar here */} 108 |
109 | {/* equalizer */} 110 |
111 | 117 | Stats 118 |
119 | {/* Time Travel */} 120 |
121 | 126 | Time Travel 127 |
128 | {/* Instructions */} 129 |
130 | 135 | Instructions 136 |
137 |
138 | 150 | 151 | {/*
152 |
153 |
*/} 154 |
155 |
156 | <> 157 | 166 | 192 | 193 |
194 |
195 | ); 196 | }; 197 | 198 | Home.propTypes = { 199 | searchState: PropTypes.object, 200 | createURL: PropTypes.func, 201 | onSearchStateChange: PropTypes.func, 202 | movie: PropTypes.string, 203 | setMovie: PropTypes.func, 204 | timeTravelDate: PropTypes.number, 205 | showLoader: PropTypes.bool, 206 | moviesList: PropTypes.array 207 | }; 208 | 209 | export default Home; 210 | -------------------------------------------------------------------------------- /src/components/Game.js: -------------------------------------------------------------------------------- 1 | import AsyncSelect from "react-select/async"; 2 | import React, { useMemo } from "react"; 3 | import { GAME_STATUS, MAX_ATTEMPTS, isGameDone } from "../utils/constants"; 4 | import PropTypes from "prop-types"; 5 | import ShareResults from "./ShareResults"; 6 | import Results from "./Results"; 7 | import Fuse from "fuse.js"; 8 | import Confetti from "react-dom-confetti"; 9 | 10 | const config = { 11 | angle: "180", 12 | spread: 300, 13 | startVelocity: "30", 14 | elementCount: 70, 15 | dragFriction: 0.12, 16 | duration: "2000", 17 | stagger: "2", 18 | width: "10px", 19 | height: "10px", 20 | perspective: "900px", 21 | colors: ["#a864fd", "#29cdff", "#78ff44", "#ff718d", "#fdff6a"] 22 | }; 23 | 24 | const Game = ({ 25 | currentIndex, 26 | setCurrentIndex, 27 | setCurrentIndexFromButton, 28 | currentGuesses, 29 | setCurrentGuesses, 30 | gameStatus, 31 | setGameStatus, 32 | setStats, 33 | gameStats, 34 | movie, 35 | guessDistribution, 36 | setGuessDistribution, 37 | day, 38 | setOpenStatsModal, 39 | contributor, 40 | timeTravelled, 41 | contributorTwitterId, 42 | shareText, 43 | setShareText, 44 | lastPlayedGame, 45 | setLastPlayedGame, 46 | moviesList 47 | }) => { 48 | const [inputValue, setValue] = React.useState(""); 49 | const [selectedValue, setSelectedValue] = React.useState(null); 50 | const [isShowConfetti, setIsShowConfetti] = React.useState(null); 51 | const gameFinished = useMemo(() => isGameDone(gameStatus), [gameStatus]); 52 | const statsModalTimeOut = 2000; 53 | const handleInputChange = (value) => { 54 | setValue(value); 55 | }; 56 | const fuzzyOptions = { 57 | isCaseSensitive: false 58 | // includeScore: false, 59 | // shouldSort: true, 60 | // includeMatches: false, 61 | // findAllMatches: false, 62 | // minMatchCharLength: 1, 63 | // location: 0, 64 | // threshold: 0.6, 65 | // distance: 100, 66 | // useExtendedSearch: false, 67 | // ignoreLocation: false, 68 | // ignoreFieldNorm: false, 69 | // fieldNormWeight: 1, 70 | }; 71 | 72 | const fuse = new Fuse(moviesList, fuzzyOptions); 73 | 74 | const setAttemptsInLocalStorage = (attempts) => { 75 | let currentGuessDistribution = JSON.parse(guessDistribution); 76 | currentGuessDistribution[attempts.toString()]++; 77 | setGuessDistribution(JSON.stringify(currentGuessDistribution)); 78 | }; 79 | 80 | const submit = (value) => { 81 | if ( 82 | (selectedValue?.title && !value ? selectedValue.title : value.title).trim().toLowerCase() === 83 | movie.trim().toLowerCase() 84 | ) { 85 | setIsShowConfetti(true); 86 | window.gtag("event", "GameWon", { event_category: "game-stats" }); 87 | setTimeout(() => setOpenStatsModal(true), statsModalTimeOut); 88 | setGameStatus(GAME_STATUS.COMPLETED); 89 | setAttemptsInLocalStorage(currentIndex); 90 | setStats( 91 | JSON.stringify({ 92 | gamesPlayed: gameStats.gamesPlayed + 1, 93 | gamesWon: gameStats.gamesWon + 1, 94 | currentStreak: lastPlayedGame === day - 1 ? gameStats.currentStreak + 1 : 1, 95 | maxStreak: Math.max(gameStats.maxStreak, gameStats.currentStreak + 1) 96 | }) 97 | ); 98 | setLastPlayedGame(day); 99 | } else if (currentIndex === MAX_ATTEMPTS) { 100 | window.gtag("event", "GameFailed", { event_category: "game-stats" }); 101 | setGameStatus(GAME_STATUS.FAILED); 102 | setTimeout(() => setOpenStatsModal(true), statsModalTimeOut); 103 | if (currentGuesses !== "") { 104 | setCurrentGuesses( 105 | currentGuesses + "," + (value?.title ? value?.title : selectedValue.title) 106 | ); 107 | } else { 108 | setCurrentGuesses(value?.title ? value?.title : selectedValue.title); 109 | } 110 | setStats( 111 | JSON.stringify({ 112 | gamesPlayed: gameStats.gamesPlayed + 1, 113 | gamesWon: gameStats.gamesWon, 114 | maxStreak: gameStats.maxStreak, 115 | currentStreak: 0 116 | }) 117 | ); 118 | setLastPlayedGame(day); 119 | setSelectedValue(null); 120 | } else { 121 | setCurrentIndex(currentIndex + 1); 122 | setCurrentIndexFromButton(currentIndex + 1); 123 | if (currentGuesses !== "") { 124 | setCurrentGuesses( 125 | currentGuesses + "," + (value?.title ? value?.title : selectedValue.title) 126 | ); 127 | } else { 128 | setCurrentGuesses(value?.title ? value?.title : selectedValue.title); 129 | } 130 | } 131 | setSelectedValue(null); 132 | }; 133 | 134 | const fetchData = async (inputValue) => { 135 | const vals = fuse.search(inputValue, { limit: 6 }); 136 | return vals.map((val) => ({ title: val.item })); 137 | }; 138 | // custom styles 139 | const customStylesForAsyncSelect = { 140 | menu: (provided) => { 141 | if (!inputValue.length) { 142 | return { 143 | ...provided, 144 | visibility: "hidden" 145 | }; 146 | } 147 | return { 148 | ...provided, 149 | border: "1px solid gray" 150 | }; 151 | } 152 | }; 153 | const customStylesForAsyncSelectDark = { 154 | control: (provided) => { 155 | return { 156 | ...provided, 157 | border: "1px solid #3d3d3d", 158 | background: "#3d3d3d" 159 | }; 160 | }, 161 | menu: (provided) => { 162 | if (!inputValue.length) { 163 | return { 164 | ...provided, 165 | visibility: "hidden" 166 | }; 167 | } 168 | return { 169 | ...provided, 170 | background: "#3d3d3d", 171 | color: "white" 172 | }; 173 | }, 174 | input: (provided) => { 175 | return { 176 | ...provided, 177 | color: "white" 178 | }; 179 | }, 180 | singleValue: (provided) => { 181 | return { 182 | ...provided, 183 | color: "white" 184 | }; 185 | }, 186 | menuList: (provided) => { 187 | return { 188 | ...provided, 189 | color: "#808080" 190 | }; 191 | } 192 | }; 193 | return ( 194 | <> 195 | {!gameFinished && ( 196 |
197 |
198 | 203 |
204 | 205 |
206 |
207 | e.title} 221 | getOptionValue={(e) => e.title} 222 | loadOptions={fetchData} 223 | onInputChange={handleInputChange} 224 | onChange={(value) => { 225 | setSelectedValue(value); 226 | }} 227 | /> 228 |
229 | 230 |
231 | 236 |
237 |
238 |
239 | )} 240 | 249 |
256 | 257 |
258 | 259 | {gameFinished && ( 260 | 268 | )} 269 | 270 | ); 271 | }; 272 | 273 | Game.propTypes = { 274 | currentIndex: PropTypes.number, 275 | setCurrentIndex: PropTypes.func, 276 | currentGuesses: PropTypes.string, 277 | setCurrentGuesses: PropTypes.func, 278 | gameStatus: PropTypes.string, 279 | setGameStatus: PropTypes.func, 280 | setStats: PropTypes.func, 281 | day: PropTypes.number, 282 | gameStats: PropTypes.object, 283 | setCurrentIndexFromButton: PropTypes.func, 284 | movie: PropTypes.string, 285 | guessDistribution: PropTypes.string, 286 | setGuessDistribution: PropTypes.func, 287 | setOpenStatsModal: PropTypes.func, 288 | contributor: PropTypes.string, 289 | timeTravelled: PropTypes.bool, 290 | contributorTwitterId: PropTypes.string, 291 | shareText: PropTypes.string, 292 | setShareText: PropTypes.func, 293 | lastPlayedGame: PropTypes.string, 294 | setLastPlayedGame: PropTypes.func, 295 | moviesList: PropTypes.array 296 | }; 297 | 298 | export default Game; 299 | -------------------------------------------------------------------------------- /public/static/movies.json: -------------------------------------------------------------------------------- 1 | [ 2 | "1 - Nenokkadine", 3 | "100% Love", 4 | "118", 5 | "123", 6 | "143", 7 | "180", 8 | "1st Rank Raju", 9 | "2 Hours Love", 10 | "24 Kisses", 11 | "3", 12 | "365 Days", 13 | "7 Aum Arivu", 14 | "7/G Rainbow Colony", 15 | "7/g Brundhavan Colony", 16 | "9 Nelalu", 17 | "90 ML", 18 | "Nartanasala", 19 | "A Film by Aravind", 20 | "A... Aa", 21 | "Aaruguru Pathivrathalu", 22 | "ABCD: American-Born Confused Desi", 23 | "Aa Naluguru", 24 | "Aa Okkati Adakku", 25 | "Aadavari Matalaku Ardhalu Verule", 26 | "Aadhi Bhagavan", 27 | "Aadi", 28 | "Aadu Magaadra Bujji", 29 | "Aadu Puli Attam", 30 | "Aagadu", 31 | "Aaha Kalyanam", 32 | "Aakali Rajyam", 33 | "Aakhari Poratam", 34 | "Aalavandhan", 35 | "Aapathbandavudu", 36 | "Aata", 37 | "Aatadista", 38 | "Aatagadharaa Siva", 39 | "Aatagallu", 40 | "Aavida Maa Aavide", 41 | "Aaviri", 42 | "Abbaigaru", 43 | "Abhilasha", 44 | "Abhinandana", 45 | "Abhinetri", 46 | "Abhiyum Naanum", 47 | "Achari America Yathra", 48 | "Action", 49 | "Adavi Donga", 50 | "Adavi Ramudu", 51 | "Adavilo Anna", 52 | "Adda", 53 | "Adhinayakudu", 54 | "Adhipathi", 55 | "Adhirindhi Alludu", 56 | "Adhugo", 57 | "Adhurs", 58 | "Aditya 369", 59 | "Agent Sai Srinivasa Athreya", 60 | "Agni Nakshatram", 61 | "Agni", 62 | "Agnyaathavaasi", 63 | "Aha Naa Pellanta", 64 | "Aithe", 65 | "Akasa Veedhilo", 66 | "Akhil", 67 | "Akkada Ammayi Ikkada Abbayi", 68 | "Ala Ela", 69 | "Ala Modalaindi", 70 | "Ala Vaikunthapurramuloo", 71 | "Alavuddinum Athbutha Vilakkum", 72 | "Alex Pandian", 73 | "Alibaba Aradajanu Dongalu", 74 | "All the Best", 75 | "Allari Alludu", 76 | "Allari Bullodu", 77 | "Allari Mogudu", 78 | "Allari Pidugu", 79 | "Allari Police", 80 | "Allari Priyudu", 81 | "Allari Ramudu", 82 | "Allari", 83 | "Alluda Majaaka!", 84 | "Alludu Diddina Kapuram", 85 | "Alludu Seenu", 86 | "Alludugaru", 87 | "Alluri Seetharama Raju", 88 | "Amar Akbar Anthony", 89 | "Amazon Obhijaan", 90 | "Ami Thumi", 91 | "Amma Cheppindi", 92 | "Amma Nanna O Tamila Ammayi", 93 | "Ammayilu Abbayilu", 94 | "Ammammagarillu", 95 | "Ammo Bomma", 96 | "Ammo Okato Tariku", 97 | "Ammoru", 98 | "Amrutha Ramam", 99 | "Amrutham Chandamama Lo", 100 | "Anaamika", 101 | "Anaganaga O Dheerudu", 102 | "Anaganaga Oka Roju", 103 | "Anand", 104 | "Anandam", 105 | "Anando Brahma", 106 | "Anasuya", 107 | "Andala Rakshasi", 108 | "Andala Ramudu", 109 | "Andari Bandhuvaya", 110 | "Andarivaadu", 111 | "Andha Oru Nimidam", 112 | "Andhhagadu", 113 | "Andhrawala", 114 | "Andhrudu", 115 | "Anirudh", 116 | "Anjaan", 117 | "Anjaneyulu", 118 | "Anji", 119 | "Ankuram", 120 | "Anna Thamudu", 121 | "Annai Oru Aalayam", 122 | "Annamayya", 123 | "Annavaram", 124 | "Annayya", 125 | "Antariksham 9000 kmph", 126 | "Anthahpuram", 127 | "Anthaka Mundu Aa Tarvatha", 128 | "Antham", 129 | "Anthuleni Katha", 130 | "Anukokunda Oka Roju", 131 | "Anukshanam", 132 | "Anukunnadi Okkati Ayyindhi Okati", 133 | "Anveshana", 134 | "Appatlo Okadundevadu", 135 | "Appu Chesi Pappu Koodu", 136 | "Appula Appa Rao", 137 | "April 1 Vidudala", 138 | "Aradhana", 139 | "Aravindha Sametha Veera Raghava", 140 | "Arjun Reddy", 141 | "Arjun", 142 | "Arundhati", 143 | "Arya 2", 144 | "Arya", 145 | "Ashok", 146 | "Ashta Chamma", 147 | "Assembly Rowdy", 148 | "Asthram", 149 | "Asura", 150 | "Aswamedham", 151 | "Aswathama", 152 | "Athade Oka Sainyam", 153 | "Athadu", 154 | "Athaku Yamudu Ammayiki Mogudu", 155 | "Athanokkade", 156 | "Atharintiki Daaredi", 157 | "Athidhi", 158 | "Athili Sathibabu LKG", 159 | "Attack", 160 | "Autonagar Surya", 161 | "Avakai Biryani", 162 | "Ave Kallu", 163 | "Avunanna Kadanna", 164 | "Avunu Part 2", 165 | "Avunu Valliddaru Ishtapaddaru", 166 | "Avunu", 167 | "Awe!", 168 | "Ayogya", 169 | "Ayyare", 170 | "Azaad", 171 | "Baachi", 172 | "Baadshah", 173 | "Baahubali 2: The Conclusion", 174 | "Baanam", 175 | "Baava", 176 | "Baba", 177 | "Babai Abbai", 178 | "Babu Baga Busy", 179 | "Babu Bangaram", 180 | "Bachchan", 181 | "Badri", 182 | "Badrinath", 183 | "Bahubali: The Beginning", 184 | "Bairavaa", 185 | "Bala Gopaludu", 186 | "Balachandrudu", 187 | "Baladoor", 188 | "Balakrishnudu", 189 | "Bale Bale Magadivoy", 190 | "Balu", 191 | "Balupu", 192 | "Bama Vijayam", 193 | "Bamma Maata Bangaru Baata", 194 | "Bandipotu", 195 | "Bangaram", 196 | "Bangaru Bullodu", 197 | "Basanti", 198 | "Bava Bava Panneeru", 199 | "Bava Nachadu", 200 | "Bavagaru Bagunnara?", 201 | "Bazaar Rowdy", 202 | "Beach Road Chetan", 203 | "Bendu Apparao RMP", 204 | "Bengal Tiger", 205 | "Betting Bangarraju", 206 | "Bezawada", 207 | "Bhaagamathie", 208 | "Bhadra", 209 | "Bhageeratha", 210 | "Bhai", 211 | "Bhairava Dweepam", 212 | "Bhairava Geetha", 213 | "Bhakta Prahlada", 214 | "Bhale Donga", 215 | "Bhale Dongalu", 216 | "Bhale Manchi Chowka Beram", 217 | "Bhale Manchi Roju", 218 | "Bhale Ramudu", 219 | "Bhanumathi & Ramakrishna", 220 | "Bharani", 221 | "Bharat Ane Nenu", 222 | "Bheemli Kabadi Jattu", 223 | "Bheeshma", 224 | "Bhookailas", 225 | "Bhoot Returns", 226 | "Big Boss", 227 | "Bigil", 228 | "Billa 2", 229 | "Billa Ranga", 230 | "Billa", 231 | "Bindaas", 232 | "Biwi No. 2", 233 | "Black Tiger", 234 | "Blade Babji", 235 | "Bluff Master", 236 | "Bobbili Puli", 237 | "Bobbili Raja", 238 | "Bobbili Simham", 239 | "Bobby", 240 | "Bodyguard", 241 | "Bommana Brothers Chanadana Sisters", 242 | "Bommarillu", 243 | "Boss", 244 | "Boy", 245 | "Brahma Puthrudu", 246 | "Brahma", 247 | "Brahmotsavam", 248 | "Brand Babu", 249 | "Brindaavanam", 250 | "Brindavanam", 251 | "Brochevarevarura", 252 | "Broker", 253 | "Brother of Bommali", 254 | "Bruce Lee: The Fighter", 255 | "Budget Padmanabham", 256 | "Bujjigaadu: Made in Chennai", 257 | "Bumper Offer", 258 | "Bunny", 259 | "Burra katha", 260 | "Business Man", 261 | "C/o Kancharapalem", 262 | "Cameraman Gangatho Rambabu", 263 | "Case No. 666/2013", 264 | "Chaarulatha", 265 | "Chakram", 266 | "Chakravarthy", 267 | "Chal Mohan Ranga", 268 | "Chal Mohana Ranga", 269 | "Challenge", 270 | "Chalo", 271 | "Chanakya Chandragupta", 272 | "Chanakya", 273 | "Chandamama Kathalu", 274 | "Chandamama", 275 | "Chandralekha", 276 | "Chantabbai", 277 | "Chanti", 278 | "Chatrapathi", 279 | "Chekka Chivantha Vaanam", 280 | "Chenna Kesava Reddy", 281 | "Chettaniki Kallu Levu", 282 | "Chettu Kinda Pleader", 283 | "Chi La Sow", 284 | "Chinnabaabu", 285 | "Chinnabbayi", 286 | "Chinnadana Nee Kosam", 287 | "Chintakayala Ravi", 288 | "Chiru Navvuto", 289 | "Chirutha", 290 | "Chitemma Mogudu", 291 | "Chitralahari", 292 | "Chitram Bhalare Vichitram", 293 | "Choodalani Vundi", 294 | "Choopulu Kalasina Subhavela", 295 | "Choosi Choodangaane", 296 | "Chukkallo Chandrudu", 297 | "Chuttalabbayi", 298 | "Cinema Chupista Maava", 299 | "Classmates", 300 | "Collector Garu", 301 | "Columbus", 302 | "Coolie No. 1", 303 | "Courier Boy Kalyan", 304 | "Criminal", 305 | "Current Theega", 306 | "Current", 307 | "D for Dopidi", 308 | "Daana Veera Soora Karna", 309 | "Dabangg 3", 310 | "Daddy", 311 | "Dalapathi", 312 | "Damarukam", 313 | "Danger", 314 | "Darling", 315 | "Daruvu", 316 | "Dear Comrade", 317 | "Desa dimmari", 318 | "Desamuduru", 319 | "Detective Naarada", 320 | "Dev", 321 | "Devadas", 322 | "Devadasu", 323 | "Devatha", 324 | "Devi Putrudu", 325 | "Devi", 326 | "Devudu Chesina Manushulu", 327 | "Devullu", 328 | "Deyyam", 329 | "Dhada", 330 | "Dhairyam", 331 | "Dhammu", 332 | "Dhana 51", 333 | "Dharma Bhai", 334 | "Dharma Chakram", 335 | "Dhee", 336 | "Dhenikaina Ready", 337 | "Dhoni", 338 | "Dhoom:2", 339 | "Dhoom:3", 340 | "Dhruva", 341 | "Dhruvanakshatram", 342 | "Dictator", 343 | "Dil", 344 | "Disco Raja", 345 | "Diya", 346 | "Dohchay", 347 | "Dollar Dreams", 348 | "Don Seenu", 349 | "Don", 350 | "Donga Mogudu", 351 | "Donga Police", 352 | "Donga Ramudu", 353 | "Donga", 354 | "Dongaata", 355 | "Dongala Bandi", 356 | "Dongala Mutha", 357 | "Dongata", 358 | "Dongodu", 359 | "Dookudu", 360 | "Doosukeltha", 361 | "Dora", 362 | "Dorasani", 363 | "Dream", 364 | "Driver Ramudu", 365 | "Drushyam", 366 | "Dubai Seenu", 367 | "Dum Dum Dum", 368 | "Duvvada Jagannadham", 369 | "Dynamite", 370 | "E", 371 | "Edadugula Bandham", 372 | "Edurinti Mogudu Pakkinti Pellam", 373 | "Eduruleni Manishi", 374 | "Ee Abbai Chala Manchodu", 375 | "Ee Nagaraniki Emaindi", 376 | "Ee Rojullo", 377 | "Eedo Rakam Aado Rakam", 378 | "Eega", 379 | "Eeshwar", 380 | "Ek Niranjan", 381 | "Ekkadiki Pothavu Chinnavada", 382 | "Ela Cheppanu", 383 | "Emo Gurram Egaravachu", 384 | "Endrendrum Punnagai", 385 | "Endukante... Premanta", 386 | "Enga Veetu Pillai", 387 | "Ennaku 20 Unakku 18", 388 | "Entha Manchivaadavuraa", 389 | "Erra Buss", 390 | "Evadi Gola Vadide", 391 | "Evadithe Nakenti", 392 | "Evaraina Eppudaina", 393 | "Evaru", 394 | "Evvarikee Cheppoddu", 395 | "Express Raja", 396 | "Ezra", 397 | "F2: Fun and Frustration", 398 | "Falaknuma Das", 399 | "Family Circus", 400 | "Fidaa", 401 | "Fitting Master", 402 | "Gaayam 2", 403 | "Gaayam", 404 | "Gabbar Singh", 405 | "Gaddalakonda Ganesh", 406 | "Gaganam", 407 | "Galipatam", 408 | "Game Over", 409 | "Game", 410 | "Gamyam", 411 | "Gandeevam", 412 | "Ganesh", 413 | "Gang Leader", 414 | "Gangotri", 415 | "Garam", 416 | "Gautamiputra Satakarni", 417 | "Gayatri", 418 | "Geetha Govindam", 419 | "Geethanjali", 420 | "Gentleman", 421 | "George Reddy", 422 | "Gharana Bullodu", 423 | "Gharana Mogudu", 424 | "Gharshana", 425 | "Ghatotkachudu", 426 | "Godavari", 427 | "Gokulamlo Seetha", 428 | "Golimar", 429 | "Golkonda High School", 430 | "Golmaal Govindam", 431 | "Golmaal", 432 | "Goodachari", 433 | "Gopala Gopala", 434 | "Goutham Nanda", 435 | "Govindha Govindha", 436 | "Govindudu Andari Vaadele", 437 | "Gowtham SSC", 438 | "Grahanam", 439 | "Greeku Veerudu", 440 | "Gruha Pravesam", 441 | "Gudachari No.1", 442 | "Gudumba Shankar", 443 | "Gulabi", 444 | "Gulebakavali Katha", 445 | "Guna 369", 446 | "Gundamma Katha", 447 | "Gunde Jaari Gallanthayyinde", 448 | "Gundello Godari", 449 | "Guntur Talkies", 450 | "Gunturodu", 451 | "Guru", 452 | "HIT", 453 | "Hai Hai Nayaka", 454 | "Hanuman Junction", 455 | "Happy Days", 456 | "Happy Wedding", 457 | "Happy", 458 | "Hare Ram", 459 | "Hawaa", 460 | "Heart Attack", 461 | "Hello Brother", 462 | "Hello Guru Prema Kosame", 463 | "Hello", 464 | "Heza", 465 | "Hippi", 466 | "Hitler", 467 | "Homam", 468 | "Hrudaya Kaleyam", 469 | "Hushaaru", 470 | "Hyderabad Blues 2", 471 | "Hyderabad Blues", 472 | "Hyderabad Nawabs", 473 | "Hyper", 474 | "I Love You", 475 | "Ice Cream 2", 476 | "Ice Cream", 477 | "Idam Jagath", 478 | "Idaya Kovil", 479 | "Iddarammayilatho", 480 | "Iddari Lokam Okate", 481 | "Iddaru Mitrulu", 482 | "Idhi Mamulu Prema Katha Kaadu", 483 | "Idi Kathakaadu", 484 | "Idi Ma Prema Katha", 485 | "Idiot", 486 | "Indra", 487 | "Indrudu Chandrudu", 488 | "Inkosari", 489 | "Intinti Bhagavatham", 490 | "Intlo Dayyam Nakemi Bhayam", 491 | "Intlo Illalu Vantaintlo Priyuralu", 492 | "Intlo Ramayya Veedilo Krishnayya", 493 | "Irandam Ulagam", 494 | "Ishq", 495 | "Ism", 496 | "It's My Love Story", 497 | "Itlu Sravani Subramanyam", 498 | "Jaanu", 499 | "Jabardasth", 500 | "Jadoogadu", 501 | "Jaffa", 502 | "Jagadam", 503 | "Jagadeka Veerudu Athiloka Sundari", 504 | "Jagadeka Veeruni Katha", 505 | "Jaguar", 506 | "Jai Bolo Telangana", 507 | "Jai Chiranjeeva", 508 | "Jai Lava Kusa", 509 | "Jai Simha", 510 | "Jaihind 2", 511 | "Jakkanna", 512 | "Jalsa", 513 | "Jamba Lakidi Pamba", 514 | "James Bond", 515 | "Janaki Ramudu", 516 | "Janatha Garage", 517 | "Janda Pai Kapiraju", 518 | "Jappanil Kalyanaraman", 519 | "Jawaan", 520 | "Jay Jay", 521 | "Jaya Janaki Nayaka", 522 | "Jayam Manadera", 523 | "Jayam", 524 | "Jayammu Nischayammu Raa!", 525 | "Jayammu Nischayammuu Raa", 526 | "Jayasurya", 527 | "Jathi Ratnalu", 528 | "Jebu Donga", 529 | "Jersey", 530 | "Jessie", 531 | "Jhummandi Naadam", 532 | "Jil", 533 | "Jodi", 534 | "Johnny", 535 | "Joker", 536 | "Joru", 537 | "Josh", 538 | "Julayi", 539 | "Justice Chowdhary", 540 | "Jyo Achyutananda", 541 | "Jyothi Lakshmi", 542 | "Kaadhal", 543 | "Kaakki Sattai", 544 | "Kaala", 545 | "Kaali", 546 | "Kaamannana Makkalu", 547 | "Kaappaan", 548 | "Kaashmora", 549 | "Kaasi", 550 | "Kaathala Kaathala", 551 | "Kabaddi Kabaddi", 552 | "Kabali", 553 | "Kadapa Redamma", 554 | "Kadaram Kondan", 555 | "Kadhal Desam", 556 | "Kadhal Sadugudu", 557 | "Kadhalil Sodhappuvadhu Yeppadi", 558 | "Kalathur Kannamma", 559 | "Kalidasu", 560 | "Kalisundam Raa", 561 | "Kalki", 562 | "Kalloori", 563 | "Kalusukovalani", 564 | "Kalyan Ram Kathi", 565 | "Kalyana Ramudu", 566 | "Kalyana Vaibhogame", 567 | "Kalyanaraman", 568 | "Kamma Rajyam Lo Kadapa Reddlu", 569 | "Kanchana 2", 570 | "Kanchana 3", 571 | "Kanchana", 572 | "Kanche", 573 | "Kandireega", 574 | "Kanthaswamy", 575 | "Kantri", 576 | "Kanyasulkam", 577 | "Karma", 578 | "Karnan", 579 | "Karthavyam", 580 | "Karthikeya", 581 | "Kashi from Village", 582 | "Kataka", 583 | "Katamarayudu", 584 | "Katha Screenplay Darsakatvam: Appalaraju", 585 | "Katha", 586 | "Kathakali", 587 | "Kathanam", 588 | "Kathi Kanta Rao", 589 | "Kavacham", 590 | "Kedi", 591 | "Kee", 592 | "Keelu Gurram", 593 | "Kerintha", 594 | "Keshava", 595 | "Kevvu Keka", 596 | "Khadgam", 597 | "Khaidi Garu", 598 | "Khaidi No 150", 599 | "Khaidi No. 786", 600 | "Khaidi", 601 | "Khaleja", 602 | "Khatarnak", 603 | "Khushi", 604 | "Ki & Ka", 605 | "Kiccha Huccha", 606 | "Kick 2", 607 | "Kick", 608 | "Killer", 609 | "Killing Veerappan", 610 | "King", 611 | "Kirrak Party", 612 | "Kitakitalu", 613 | "Kittu Unnadu Jagratha", 614 | "Ko antey koti", 615 | "Kobbari Matta", 616 | "Kochadaiiyaan", 617 | "Kodama Simham", 618 | "Koduku Diddina Kapuram", 619 | "Komaram Puli", 620 | "Konchem Ishtam Konchem Kashtam", 621 | "Kondapalli Raja", 622 | "Kondaveeti Donga", 623 | "Kondaveeti Raja", 624 | "Kondaveeti Simham", 625 | "Kondaveeti Simhasanam", 626 | "Kondura (The Sage from the Sea)", 627 | "Kotha Bangaru Lokam", 628 | "Kotha Janta", 629 | "Kotigobba 2", 630 | "Kousalya Krishnamurthy", 631 | "Krishna Aur Kans", 632 | "Krishna Gaadi Veera Prema Gaadha", 633 | "Krishna and His Leela", 634 | "Krishna: The Power of Indrakeeladri", 635 | "Krishnam Vande Jagadgurum", 636 | "Krishnamma Kalipindi Iddarini", 637 | "Krishnarjuna Yudham", 638 | "Krishnarjuna", 639 | "Krishnashtami", 640 | "Krrish 3", 641 | "Kshana Kshanam", 642 | "Kshanam", 643 | "Kshemanga Velli Labhamga Randi", 644 | "Kumari 21F", 645 | "Kunti Puthrudu", 646 | "Kurradu", 647 | "Kurukshetra", 648 | "Kurukshetramu", 649 | "Kuruthipunal", 650 | "Kuselan", 651 | "LIE", 652 | "Ladies Tailor", 653 | "Lakshmi Kalyanam", 654 | "Lakshmi Narasimha", 655 | "Lakshmi Raave Maa Intiki", 656 | "Lakshmi", 657 | "Lakshmi's NTR", 658 | "Lakshyam", 659 | "Lankeshwarudu", 660 | "Lava Kusa", 661 | "Leader", 662 | "Legend", 663 | "Life Before Wedding", 664 | "Life Is Beautiful", 665 | "Lion", 666 | "Little Soldiers", 667 | "Loafer", 668 | "Lorry Driver", 669 | "Loukyam", 670 | "Love Ke Liye Kuch Bhi Karega", 671 | "Love Today", 672 | "Lovely", 673 | "Lover", 674 | "Lovers", 675 | "Luck Unnodu", 676 | "Luv U Alia", 677 | "M Dharmaraju M.A.", 678 | "MCA Middle Class Abbayi", 679 | "MLA", 680 | "MSG 2 the Messenger", 681 | "MSG: The Messenger of God", 682 | "Maa Alludu Verygood", 683 | "Maa Bhoomi", 684 | "Maa Inti Katha", 685 | "Maalai Nerathu Mayakkam", 686 | "Maanagaram", 687 | "Maanavudu Daanavudu", 688 | "Maari 2", 689 | "Maattrraan", 690 | "Maavichiguru", 691 | "Madatha Kaaja", 692 | "Madha", 693 | "Madhumasam", 694 | "Madhuram", 695 | "Magadheera", 696 | "Magalir Mattum", 697 | "Mahanati", 698 | "Mahanubhavudu", 699 | "Maharadhi", 700 | "Maharasan", 701 | "Maharshi", 702 | "Mahathma", 703 | "Maja", 704 | "Majili", 705 | "Majnu", 706 | "Major Chandrakanth", 707 | "Malaikottai", 708 | "Malini 22", 709 | "Mallesham", 710 | "Malli Malli Idhi Rani Roju", 711 | "MalliRaava", 712 | "Malliswari", 713 | "Mama Manchu Alludu Kanchu", 714 | "Manam", 715 | "Manasantha Nuvve", 716 | "Manasuku Nachindhi", 717 | "Manavoori Pandavulu", 718 | "Manchi Donga", 719 | "Mangamma Gari Manavadu", 720 | "Manikarnika: The Queen of Jhansi", 721 | "Manmadhudu 2", 722 | "Manmadhudu", 723 | "Manmatha Leelai", 724 | "Manoharam", 725 | "Mansara", 726 | "Manthrigari Viyyankudu", 727 | "Mantra 2", 728 | "Mantra", 729 | "Manu", 730 | "Marana Mrudangam", 731 | "Mard Ki Zabaan 2", 732 | "Maro Charithra", 733 | "Maro Charitra", 734 | "Maro Monagadu", 735 | "Marshal", 736 | "Maruthu", 737 | "Maryada Ramanna", 738 | "Masala", 739 | "Maska", 740 | "Mass", 741 | "Masss", 742 | "Master", 743 | "Mathangi", 744 | "Mathru Devo Bhava", 745 | "Mathu Vadalara", 746 | "Maya Bazaar", 747 | "Mayabazaar", 748 | "Mayalodu", 749 | "Mayuri", 750 | "Mechanic Alludu", 751 | "Mee Sreyobhilashi", 752 | "Meeku Matrame Chepta", 753 | "Meendum Kokila", 754 | "Meesrti", 755 | "Meghasandesam", 756 | "Mehbooba", 757 | "Mental Madhilo", 758 | "Mesthri", 759 | "Minugurulu", 760 | "Mirapakai", 761 | "Mirchi", 762 | "Missamma", 763 | "Mister", 764 | "Mithai", 765 | "Mithunam", 766 | "Mitrudu", 767 | "Mogudu", 768 | "Money Money More Money", 769 | "Money Money", 770 | "Money", 771 | "Mooga Manasulu", 772 | "Morning Raga", 773 | "Mosagallu", 774 | "Mosagalaku Mosagaadu", 775 | "Mosagallaku Mosagadu", 776 | "Mr Perfect", 777 | "Mr. Majnu", 778 | "Mr. Medhavi", 779 | "Mr. Nookayya", 780 | "Mr. Pellam", 781 | "Mr. Pellikodukku", 782 | "Mr. Theertha", 783 | "Mrugaraaju", 784 | "Muddula Mavayya", 785 | "Muddula Mogudu", 786 | "Mudra", 787 | "Mugamoodi", 788 | "Mugguru Kodukulu", 789 | "Mugguru Monagallu", 790 | "Mugguru", 791 | "Mukunda", 792 | "Munna", 793 | "Murali Krishnudu", 794 | "Murari", 795 | "Mutamestri", 796 | "Muthyala Muggu", 797 | "Muvva Gopaludu", 798 | "NGK", 799 | "NTR Mahanayakudu", 800 | "NTR: Kathanayakudu", 801 | "Naa Alludu", 802 | "Naa Autograph Sweet Memories", 803 | "Naa Bangaaru Talli", 804 | "Naa Ishtam", 805 | "Naa Mogudu Nanke Sontham", 806 | "Naa Nuvve", 807 | "Naa Peru Surya Na Illu India", 808 | "Naaga", 809 | "Naan Sigappu Manithan", 810 | "Naani", 811 | "Naanna Nenu Naa Boyfriends", 812 | "Naayak", 813 | "Nachavule", 814 | "Nadunisi Naaygal", 815 | "Nagarahaavu", 816 | "Nagavalli", 817 | "Nakshatram", 818 | "Nammanna", 819 | "Namo Venkatesa", 820 | "Nampalli Nagu", 821 | "Nanban", 822 | "Nandhi", 823 | "Nandini Nursing Home", 824 | "Nannaku Prematho", 825 | "Nannu Dochukunduvate", 826 | "Nandanavanam 120km", 827 | "Napoleon", 828 | "Narasimha Naidu", 829 | "Narasimhudu", 830 | "Nari Nari Naduma Murari", 831 | "Narthanasala", 832 | "Nayaki", 833 | "Nee Sneham", 834 | "Needi Naadi Oke Katha", 835 | "Neeku Naaku Dash Dash", 836 | "Neeku Nenu Naaku Nuvvu", 837 | "Nee Manasu Naku Telusu", 838 | "Neevevaro", 839 | "Neeya", 840 | "Nela Ticket", 841 | "Nene Raju Nene Manthri", 842 | "Nene Raju Nene Mantri", 843 | "Neninthe", 844 | "Nenu Lenu", 845 | "Nenu Local", 846 | "Nenu Meeku Telusa...?", 847 | "Nenu Naa Rakshasi", 848 | "Nenu Sailaja", 849 | "Nenu", 850 | "Nenunnanu", 851 | "Next Enti?", 852 | "Next Nuvve", 853 | "Nijam", 854 | "Ninaithale Inikkum", 855 | "Ninne Pelladatha", 856 | "Ninne Premistha", 857 | "Ninney Ishta Paddaanu", 858 | "Ninnu Choodalani", 859 | "Ninnu Kori", 860 | "Ninnu Thalachi", 861 | "Ninu Veedani Needanu Nene", 862 | "Nippu", 863 | "Nireekshana", 864 | "Nirmala Convent", 865 | "Nirnayam", 866 | "Not Today", 867 | "Nota", 868 | "Nuvva Nena", 869 | "Nuvve Kavali", 870 | "Nuvve.. Nuvve...", 871 | "Nuvvila", 872 | "Nuvvostanante Nenoddantana", 873 | "Nuvvu Leka Nenu Lenu", 874 | "Nuvvu Naaku Nachchav", 875 | "Nuvvu Nenu", 876 | "Nuvvu Vasthavani", 877 | "O Pitta Katha", 878 | "OK Kanmani", 879 | "Odiyan", 880 | "Officer", 881 | "Oh Baby...", 882 | "Oh My Friend", 883 | "Oka Chinna Viramam", 884 | "Oka Laila Kosam", 885 | "Oka Manasu", 886 | "Oka Oori Katha", 887 | "Oka Radha Iddaru Krishnulu", 888 | "Oka V chitram", 889 | "Okariki Okaru", 890 | "Okka Ammayi Thappa", 891 | "Okka Kshanam", 892 | "Okka Magadu", 893 | "Okkadine", 894 | "Okkadu Migiladu", 895 | "Okkadu", 896 | "Okkadunnadu", 897 | "Om 3D", 898 | "Om Namo Venkatesaya", 899 | "Om Shanti", 900 | "Onamalu", 901 | "Ongole Githa", 902 | "Ontari Poratam", 903 | "Ontari", 904 | "Oohalu Gusagusalade", 905 | "Oopiri", 906 | "Oosaravelli", 907 | "Operation Duryodhana", 908 | "Operation Gold Fish", 909 | "Orange", 910 | "Oru Adaar Love", 911 | "Osey Ramulamma", 912 | "Oxygen", 913 | "Oy!", 914 | "PSV Garuda Vega", 915 | "Paathshala", 916 | "Padaharella Vayasu", 917 | "Padamati Sandhya Ragam", 918 | "Padi Padi Leche Manasu", 919 | "Padmavyuham", 920 | "Pailwan", 921 | "Paisa Vasool", 922 | "Paisa", 923 | "Palasa 1978", 924 | "Palnati Brahmanayudu", 925 | "Pammal K. Sambandam", 926 | "Panchakshari", 927 | "Pandaga Chesko", 928 | "Pandava Vanavasamu", 929 | "Pandavulu Pandavulu Thummeda", 930 | "Panduranga Mahatyam", 931 | "Pandurangadu", 932 | "Panjaa", 933 | "Pantham", 934 | "Paper Boy", 935 | "Papikondalu", 936 | "Parama Veera Chakra", 937 | "Paramanandayya Shishyula Katha", 938 | "Partha", 939 | "Parthal Pasi Theerum", 940 | "Party", 941 | "Parugo Parugu", 942 | "Parugu", 943 | "Pasivadi Pranam", 944 | "Pataas", 945 | "Patel S.I.R", 946 | "Pathala Bhairavi", 947 | "Pavitra Bandham", 948 | "Peda Rayudu", 949 | "Peddannayya", 950 | "Peddarikam", 951 | "Peddinti Alludu", 952 | "Pekata Paparao", 953 | "Pellaina Kothalo", 954 | "Pellam Oorelithe", 955 | "Pelli Chesukundam", 956 | "Pelli Choopulu", 957 | "Pelli Pustakam", 958 | "Pelli Sandadi", 959 | "Penguin", 960 | "Per Sollum Pillai", 961 | "Phoonk 2", 962 | "Pichhodu", 963 | "Pilla Nuvvu Leni Jeevitham", 964 | "Pilla Zamindar", 965 | "Pokiri", 966 | "Police Police", 967 | "Political Rowdy", 968 | "Pooja", 969 | "Poola Rangadu", 970 | "Postman", 971 | "Potugadu", 972 | "Pournami", 973 | "Pourudu", 974 | "Power Unlimited 2", 975 | "Power", 976 | "Praana", 977 | "Praja pratinidhi", 978 | "Prananiki Pranam", 979 | "Prasthanam", 980 | "Prathigna", 981 | "Prathinidhi", 982 | "Prati Roju Pandaage", 983 | "Pravarakyudu", 984 | "Prayanam", 985 | "Prema Ishq Kaadhal", 986 | "Prema Katha Chitram", 987 | "Prema Katha", 988 | "Prema Kavali", 989 | "Prema Panjaram", 990 | "Prema Pipasi", 991 | "Prema Yuddham", 992 | "Prema", 993 | "Premaabhishekam", 994 | "Premam", 995 | "Premante Idera", 996 | "Prematho Raa", 997 | "Preminchukundam Raa", 998 | "Preminche Manasu", 999 | "President Gari Pellam", 1000 | "Pressure Cooker", 1001 | "Prince", 1002 | "Priyamyna Neeku...", 1003 | "Puli", 1004 | "Pulimurugan", 1005 | "Punnami Naagu", 1006 | "Punya Bhoomi Naa Desam", 1007 | "Quick Gun Murugun: Misadventures of an Indian Cowboy", 1008 | "RDX Love", 1009 | "Ra Ra Krishnayya", 1010 | "Ra.One", 1011 | "Raagala 24 Gantallo", 1012 | "Raahu", 1013 | "Raaj", 1014 | "Raaja Paarvai", 1015 | "Raakshasudu", 1016 | "Raam", 1017 | "Rabhasa", 1018 | "Race Gurram", 1019 | "Rachayitha", 1020 | "Rachcha", 1021 | "Radha Gopalam", 1022 | "Radha", 1023 | "Ragada", 1024 | "Raghavendra", 1025 | "Ragile Gundelu", 1026 | "Raja Cheyyi Vesthe", 1027 | "Raja Kumarudu", 1028 | "Raja Raja Chora", 1029 | "Raja The Great", 1030 | "Raja Vaaru Rani Gaaru", 1031 | "Raja Vikramarka", 1032 | "Raja", 1033 | "Rajanna", 1034 | "Rajaratha", 1035 | "Rajdooth", 1036 | "Rajendrudru Gajendrudru", 1037 | "Raju Bhai", 1038 | "Raju Gadu", 1039 | "Raju Gari Gadhi 2", 1040 | "Raju Gari Gadhi 3", 1041 | "Raju Gari Gadhi", 1042 | "Raju Maharaju", 1043 | "Rakhi", 1044 | "Rakhta Charitra 2", 1045 | "Rakhta Charitra", 1046 | "Raksha", 1047 | "Rakshana", 1048 | "Rakshasudu", 1049 | "Rama Chakkani Seetha", 1050 | "Rama Rama Krishna Krishna", 1051 | "Ramayanam", 1052 | "Ramayya Vastavayya", 1053 | "Rambantu", 1054 | "Ramudochhadu", 1055 | "Ramudu Bheemudu", 1056 | "Ranam", 1057 | "Ranarangam", 1058 | "Ranga (S.S.L.C)", 1059 | "Rangasthalam", 1060 | "Rangula Raatnam", 1061 | "Rarandoi Veduka Chudham", 1062 | "Ratchakan", 1063 | "Ravoyi Chandamama", 1064 | "Rayalaseema Love Story", 1065 | "Rayalaseema Ramanna Chowdary", 1066 | "Rayudu", 1067 | "Ready", 1068 | "Rebel", 1069 | "Rechipo", 1070 | "Rendu Rella Aaru", 1071 | "Rey", 1072 | "Ride", 1073 | "Rikshavodu", 1074 | "Ritu", 1075 | "Rogue", 1076 | "Rough", 1077 | "Routine Love Story", 1078 | "Rowdy Alludu", 1079 | "Rowdy Fellow", 1080 | "Rowdy Gari Pellam", 1081 | "Rowdy Inspector", 1082 | "Rowdy Mogudu", 1083 | "Rowdy", 1084 | "Rudhramadevi", 1085 | "Rudra Veena", 1086 | "Rudranetra", 1087 | "Ruler", 1088 | "Run Baby Run", 1089 | "Run Raja Run", 1090 | "Run", 1091 | "Runam", 1092 | "Rx 100", 1093 | "S. P. Parasuram", 1094 | "S/O Satyamurthy", 1095 | "SMS - Siva Manasulo Sruthi", 1096 | "Saahasam Swaasaga Saagipo", 1097 | "Saaho", 1098 | "Saakshyam", 1099 | "Sachein", 1100 | "Sagara Sangamam", 1101 | "Sahasa Veerudu Sagara Kanya", 1102 | "Sahasam", 1103 | "Sainikudu", 1104 | "Sakalakala Vallavan", 1105 | "Sakthi", 1106 | "Saleem", 1107 | "Samanyudu", 1108 | "Samarasimha Reddy", 1109 | "Samba", 1110 | "Sambaram", 1111 | "Sambo Siva Sambho", 1112 | "Sammohanam", 1113 | "Sampoorna Ramayanam", 1114 | "Samrat Ashok", 1115 | "Samsaaram Oka Chadarangam", 1116 | "Samudram", 1117 | "Sandade Sandadi", 1118 | "Sandhippoma", 1119 | "Sankarabharanam", 1120 | "Sankham", 1121 | "Sankranthi", 1122 | "Santosham", 1123 | "Saptapadhi", 1124 | "Saradaga Kasepu", 1125 | "Sardaar Gabbar Singh", 1126 | "Sardar Dharmanna", 1127 | "Sardar Papa Rayudu", 1128 | "Sarileru Neekevvaru", 1129 | "Sarkar", 1130 | "Sarocharu", 1131 | "Saroja", 1132 | "Sarrainodu", 1133 | "Sasirekha Parinayam", 1134 | "Sathruvu", 1135 | "Sathyaa", 1136 | "Sathyam", 1137 | "Satya 2", 1138 | "Satyam", 1139 | "Savaari", 1140 | "Savitri", 1141 | "Savyasachi", 1142 | "Screenplay of an Indian Love Story", 1143 | "Seema Sastry", 1144 | "Seema Simham", 1145 | "Seema Tapakai", 1146 | "Seenu", 1147 | "Seetha Rama Kalyanam", 1148 | "Seetha", 1149 | "Seethamma Andalu Ramayya Sitralu", 1150 | "Seethamma Vakitlo Sirimalle Chettu", 1151 | "Seetharamaiah Gari Manavaralu", 1152 | "Seetharamula Kalyanam Lankalo", 1153 | "Selfie Raja", 1154 | "Settai", 1155 | "Seven", 1156 | "Shadow", 1157 | "Shailaja Reddy Alludu", 1158 | "Shamantakamani", 1159 | "Shankar Dada MBBS", 1160 | "Shankardada Zindabad", 1161 | "Shanti Kranti", 1162 | "Shatamanam Bhavati", 1163 | "Sher", 1164 | "Shirdi Sai", 1165 | "Shiva Shankar", 1166 | "Shiva", 1167 | "Shivam", 1168 | "Shivamani", 1169 | "Shock", 1170 | "Shourya", 1171 | "Show", 1172 | "Siddu from Srikakulam", 1173 | "Sigappu Rojakkal", 1174 | "Silly Fellows", 1175 | "Simha", 1176 | "Simhadri", 1177 | "Sindhooram", 1178 | "Sindhu Bhairavi", 1179 | "Singam 2", 1180 | "Singam 3", 1181 | "Singham123", 1182 | "Sirivennela", 1183 | "Sisindri", 1184 | "Sitaara", 1185 | "Sitaramaraju", 1186 | "Size Zero", 1187 | "Sketch", 1188 | "Sneha Geetham", 1189 | "Sneham Kosam", 1190 | "Snehamante Idera", 1191 | "Snehamera Jeevitham", 1192 | "Snehithuda", 1193 | "Software Sudheer", 1194 | "Soggadi Pellam", 1195 | "Soggadu", 1196 | "Sokkali Mainor", 1197 | "Solo", 1198 | "Sons of Ram", 1199 | "Sontham", 1200 | "Souryam", 1201 | "Sparsha", 1202 | "Speedunnodu", 1203 | "Spyder", 1204 | "Sree", 1205 | "Sri Anjaneyam", 1206 | "Sri Jagadguru Adi Shankara", 1207 | "Sri Kanaka Mahalakshmi Recording Dance Troupe", 1208 | "Sri Krishna Pandaveeyam", 1209 | "Sri Krishnarjuna Vijayam", 1210 | "Sri Krishnarjuna Yudham", 1211 | "Sri Madvirat Veera Brahmendra Swamy Charitra", 1212 | "Sri Manjunatha", 1213 | "Sri Rama Rajyam", 1214 | "Sri Ramadasu", 1215 | "Sri Ramulayya", 1216 | "Sri Shirdi Saibaba Mahathyam", 1217 | "Srimannarayana", 1218 | "Srimanthudu", 1219 | "Srinivasa Kalyanam", 1220 | "Srivaariki Premalekha", 1221 | "Sruthilayalu", 1222 | "Stalin", 1223 | "State Rowdy", 1224 | "Stoovertpuram Police Station", 1225 | "Student No. 1", 1226 | "Style", 1227 | "Subbu", 1228 | "Subedar Joginder Singh", 1229 | "Subha Sankalpam", 1230 | "Subhakankshalu", 1231 | "Subhalagnam", 1232 | "Subhalekha", 1233 | "Subhash Chandra Bose", 1234 | "Subrahmanyapuram", 1235 | "Subramanyam for Sale", 1236 | "Sudigaadu", 1237 | "Sukumarudu", 1238 | "Sultan", 1239 | "Sundara Kanda", 1240 | "Super Duper", 1241 | "Super Police", 1242 | "Super", 1243 | "Superman", 1244 | "Superstar Kidnap", 1245 | "Super Heroes", 1246 | "Supreme Khiladi", 1247 | "Surya IPS", 1248 | "Surya vs. Surya", 1249 | "Suryakantham", 1250 | "Suryam", 1251 | "Suryavamsam", 1252 | "Suswagatham", 1253 | "Swagatam", 1254 | "Swamy Ra Ra", 1255 | "Swargam Narakam", 1256 | "Swarnakamalam", 1257 | "Swathi Kiranam", 1258 | "Swathi Muthyam", 1259 | "Swayam Krushi", 1260 | "Swayamvaram", 1261 | "Sye Raa Narasimha Reddy", 1262 | "Sye", 1263 | "Tadakha", 1264 | "Tagore", 1265 | "Takkari Donga", 1266 | "Takkari", 1267 | "Tandra Paparayudu", 1268 | "Tappu Chesi Pappu Koodu", 1269 | "Taskara", 1270 | "Taxiwaala", 1271 | "Team 5", 1272 | "Teen Maar", 1273 | "Tej I Love U", 1274 | "Temper", 1275 | "Tenali Ramakrishna BA.BL", 1276 | "Tenali Ramakrishna", 1277 | "Terror", 1278 | "Thaanaa Serndha Koottam", 1279 | "Thaandavam", 1280 | "Thakita Thakita", 1281 | "Thalaivaa", 1282 | "Thamizh Padam", 1283 | "Thammudu", 1284 | "Thayillamal Nannilai", 1285 | "The Ghazi Attack", 1286 | "The House Next Door", 1287 | "Theeya Velai Seiyyanum Kumaru", 1288 | "Theri", 1289 | "Thikka", 1290 | "Thimiru", 1291 | "Thipparaa Meesam", 1292 | "Thodarum", 1293 | "Tholi Prema", 1294 | "Thoongaavanam", 1295 | "Thoongathey Tambi Thoongathey", 1296 | "Thulasi", 1297 | "Tiger", 1298 | "Tik Tik Tik", 1299 | "Toofan", 1300 | "Top Hero", 1301 | "Totti Gang", 1302 | "Trinetrudu", 1303 | "Tripura", 1304 | "Two Town Rowdy", 1305 | "U Turn", 1306 | "Ugranarasimham", 1307 | "Ullasanga Utsahanga", 1308 | "Undiporaadhey", 1309 | "Uthama Puthiran", 1310 | "Uttama Villain", 1311 | "Uu Kodathara Ulikki Padathara", 1312 | "Uyarntha Ullam", 1313 | "Uyyala Jampala", 1314 | "Vaana", 1315 | "Valayam", 1316 | "Vamsee", 1317 | "Vamsodharakudu", 1318 | "Vanaja", 1319 | "Vangaveeti", 1320 | "Varasudochhadu", 1321 | "Varasudu", 1322 | "Varsham", 1323 | "Varudu", 1324 | "Vasantham", 1325 | "Vastadu Naa Raju", 1326 | "Vasu", 1327 | "Vedam", 1328 | "Veede", 1329 | "Veedevadandi Babu", 1330 | "Veer - Vivegam", 1331 | "Veera Bhoga Vasantha Rayalu", 1332 | "Veera Prathap", 1333 | "Veera", 1334 | "Veerabhadra", 1335 | "Veeram", 1336 | "Vel", 1337 | "Venkatadri Express", 1338 | "Venky Mama", 1339 | "Venky", 1340 | "Vennela", 1341 | "Veta", 1342 | "Vetagadu", 1343 | "Veyyil", 1344 | "Vicky Dada", 1345 | "Victory", 1346 | "Vijay", 1347 | "Vijayendra Varama", 1348 | "Vijetha", 1349 | "Vikram", 1350 | "Vikramarkudu", 1351 | "Village lo Vinayakudu", 1352 | "Vinara sodara veera kumara", 1353 | "Vinaya Vidheya Rama", 1354 | "Vinayakudu", 1355 | "Vinodam", 1356 | "Visakha Express", 1357 | "Vishnu", 1358 | "Vishwanatha Nayakudu", 1359 | "Vishwaroopam 2", 1360 | "Vismayam", 1361 | "Vivaha Bhojanambu", 1362 | "Voter", 1363 | "Vunnadhi Okate Zindagi", 1364 | "W/o Ram", 1365 | "Wanted", 1366 | "War", 1367 | "Winner", 1368 | "Wish You Happy Breakup", 1369 | "World Famous Lover", 1370 | "Yaan", 1371 | "Yagnam", 1372 | "Yamadonga", 1373 | "Yamagola", 1374 | "Yamajaathakudu", 1375 | "Yamaleela", 1376 | "Yaman", 1377 | "Yamudiki Mogudu", 1378 | "Yatra", 1379 | "Ye Maaya Chesave", 1380 | "Ye Mantram Vesave", 1381 | "Yemaindi Ee Vela", 1382 | "Yennai Arindhaal", 1383 | "Yeto Vellipoyindhi Manasu", 1384 | "Yevade Subramanyam", 1385 | "Yevadu", 1386 | "Yogi", 1387 | "Yudda Bhoomi", 1388 | "Yuddham Sharanam", 1389 | "Yuvakudu", 1390 | "Yuvaraju", 1391 | "Zanjeer", 1392 | "iSmart Shankar", 1393 | "Colour Photo", 1394 | "Drona" 1395 | ] --------------------------------------------------------------------------------