├── .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 |
33 |
34 | Use the image provided to guess the name of the movie.
35 |
36 |
37 |
38 |
39 |
40 | If you get a guess wrong a new image from the same movie is revealed.
41 |
42 |
43 |
44 |
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 | ]
--------------------------------------------------------------------------------